[C++系列] C语言基础 day07 多维数组
in C/C++ with 0 comment

[C++系列] C语言基础 day07 多维数组

in C/C++ with 0 comment

#练习

编写程序产生一张彩票(彩票里包含7个1到36之间的随机数)产生完彩票之后把彩票里的所有数字都显示在屏幕上。

思路: 知识点:随机数,循环,输入输出

/*
 * 彩票练习
 * */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int arr[7] = {0}, arr1[7] = {0}, num = 0, num1 = 0, tmp = 0, cnt = 0;
    srand(time(0));
    /*for (num = 0;num <= 6;num++) {
        arr[num] = rand() % 36 + 1;
    }*/
    do {
        tmp = rand() % 36 + 1;
        //用新数字和下标为0到cnt - 1之间
        //的每个存储区内容做对比
        for (num = 0;num <= cnt - 1;num++) {
            if (arr[num] == tmp) {
                break;
            }
        }
        if (num == cnt) {
            //新数字能使用
            arr[cnt] = tmp;
            cnt++;
        }
    } while (cnt < 7);
    for (num = 0;num <= 6;num++) {
        printf("%d ", arr[num]);
    }
    printf("\n");
    for (num = 0;num <= 6;num++) {
        printf("请输入一个数字:");
        scanf("%d", &arr1[num]);
    }
    cnt = 0;
    for (num = 0;num <= 6;num++) {
        //循环变量num代表arr数组的下标
        for (num1 = 0;num1 <= 6;num1++) {
            //循环变量num1代表arr1数组的下标
            if (arr[num] == arr1[num1]) {
                cnt++;
                break;
            }
        }
    }
    printf("买对的数字个数是%d\n", cnt);
    return 0;
}

#数组

数组名称可以代表数组里第一个存储区的地址(不能代表存储区)。
对数组名称进行sizeof计算结果是数组里所有存储区一共包含的字节个数。

演示代码

/*
 * 数组名称演示
 * */
#include <stdio.h>
int main() {
    int arr[5] = {0};
    printf("arr是%p,&arr[0]是%p\n", arr, &arr[0]);
    printf("sizeof(arr)是%d\n", sizeof(arr));
    return 0;
}

C99规范里可以使用变长数组。

声明变长数组的时候使用变量表示数组里存储区的个数。
如果程序多次运行,则每次运行的时候变长数组里包含的存储区个数可能不同,但是在程序一次运行过程中变长数组里的存储区个数不能改变。
变长数组是不能初始化的。

变长数组演示代码:

/*
 * 变长数组演示
 * */
#include <stdio.h>
int main() {
    int size = 0;
    printf("请输入存储区个数:");
    scanf("%d", &size);
    int arr[size];   //变长数组
    printf("sizeof(arr)是%d\n", sizeof(arr));
    return 0;
}

变长数组练习

/*
 * 变长数组练习
 * */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int size = 0, num = 0;
    srand(time(0));
    printf("请输入数字个数:");
    scanf("%d", &size);
    int arr[size];
    for (num = 0;num <= size - 1;num++) {
        arr[num] = rand() % 36 + 1;
    }
    for (num = 0;num <= size - 1;num++) {
        printf("%d ", arr[num]);
    }
    printf("\n");
    return 0;
}

#练习

编写程序产生一张彩票,彩票里包含若干个1到36之间的随机数(随机数的个数由用户在程序运行的时候决定)
产生完彩票之后把彩票的所有数字显示在屏幕上。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
    int arr[7] = {0}, arr1[7] = {0}, num = 0, num1 = 0, tmp = 0, cnt = 0,num2=0;
    srand(time(0));
    printf("请输入一个数字:");
    scanf('%d',num2);
    do {
        tmp = rand() % 36 + 1;
        //用新数字和下标为0到cnt - 1之间
        //的每个存储区内容做对比
        for (num = 0;num <= cnt - 1;num++) {
            if (arr[num] == tmp) {
                break;
            }
        }
        if (num == cnt) {
            //新数字能使用
            arr[cnt] = tmp;
            cnt++;
        }
    } while (cnt < num2);
    for (num = 0;num <= 6;num++) {
        printf("%d ", arr[num]);
    }
    printf("\n");
    for (num = 0;num <= 6;num++) {
        printf("请输入一个数字:");
        scanf("%d", &arr1[num]);
    }
    cnt = 0;
    for (num = 0;num <= 6;num++) {
        //循环变量num代表arr数组的下标
        for (num1 = 0;num1 <= 6;num1++) {
            //循环变量num1代表arr1数组的下标
            if (arr[num] == arr1[num1]) {
                cnt++;
                break;
            }
        }
    }
    printf("买对的数字个数是%d\n", cnt);
    return 0;
}
## `#`练习 
在屏幕上输出下列:
11112
40002
40002
40002
43333
要求使用二维数组

include <stdio.h>

int main() {

int arr[5][5] = {0};
int num = 0, row = 0, col = 0;
/*for (num = 0;num <= 3;num++) {
    arr[0][num] = 1;
}
for (num = 0;num <= 3;num++) {
    arr[num][4] = 2;
}
for (num = 1;num <= 4;num++) {
    arr[4][num] = 3;
}
for (num = 1;num <= 4;num++) {
    arr[num][0] = 4;
}*/
for (row = 0;row <= 4;row++) {
    for (col = 0;col <= 4;col++) {
        if (!row && col <= 3) {
            arr[row][col] = 1;
        }
        else if (row <= 3 && col == 4) {
            arr[row][col] = 2;
        }
        else if (row == 4 && col >= 1) {
            arr[row][col] = 3;
        }
        else if (row >= 1 && !col) {
            arr[row][col] = 4;
        }
    }
}
for (row = 0;row <= 4;row++) {
    for (col = 0;col <= 4;col++) {
        printf("%d", arr[row][col]);
    }
    printf("\n");
}
return 0;

}

include <stdio.h>

int main() {

int arr[5][5] = {0};
int row = 0, col = 0;
for (row = 0;row <= 4;row++) {
    for (col = 0;col <= 4;col++) {
        if (row == col) {
            arr[row][col] = 1;
        }
        else if (row + col == 4) {
            arr[row][col] = 2;
        }
        else if (row == 2) {
            arr[row][col] = 3;
        }
        else if (col == 2) {
            arr[row][col] = 4;
        }
    }
}
arr[2][2] = 0;
for (row = 0;row <= 4;row++) {
    for (col = 0;col <= 4;col++) {
        printf("%d", arr[row][col]);
    }
    printf("\n");
}
return 0;

}

## `#`多维数组

多维数组可以表示存储区的分组情况。
一维数组不能表示存储区的分组情况。
最常见的多维数组是二维数组,它只能表示存储区的一次分组情况。
声明二维数组的时候需要提供两个整数,前面的整数表示分组个数后面的整数表示每个分组里的存储区个数。
二维数组名称后加两个下标可以用来表示二维数组里的某个存储区。前一个下表用来表示分组编号(组下标),
后一个下标用来表示分组里的存储区编号(组内下标)。
组下标的有效范围从0开始到分组个数减一为止,组内下标的有效范围从0开始到组内存储区个数减一为止。
可以采用双层循环依次处理二维数组里的每个存储区。
可以把二维数组当作一维数组进行初始化。
可以把二位数组当作一维数组进行初始化。
可以在对二维数组进行初始化的时候把初始化数据进行分组,每组初始化数据用来初始化一组存储区。
在对二维数组进行初始化的时候如果可以根据初始化数据个数计算出分组个数就可以省略二维数组神明里的分组个数。
二维数组名称也可以代表数组里第一个存储区的地址(不可以被赋值)。
可以对二维数组名称进行sizeof运算,结果是二维数组里的所有存储区的总大小。
二维数组名称后可以只提供一个下标,这个下标当作组下标使用,这个写法表示下标对应组里里最前面的那个存储区的地址。
数组里包含组下标对应的组里所有的存储区,
#### 二维数组的演示:

include <stdio.h>

int main() {

int arr[][2] = {{1, 2}, {3}, {5}};   //二维数组声明
int row = 0, col = 0, num = 1;
//arr[1][1] = 10;
/*for (row = 0;row <= 2;row++) {
    for (col = 0;col <= 1;col++) {
        arr[row][col] = num;
        num++;
    }
}*/
for (row = 0;row <= 2;row++) {
    for (col = 0;col <= 1;col++) {
        printf("%d ", arr[row][col]);
    }
    printf("\n");
}
return 0;

}




## `#`预习
1,二维数组的联系
Responses