一、 二维数组

有两个下标的数组称为二维数组 

二维数组的定义:
类型 数组名[常量表达式1] [常量表达式2] = {值1,值2...};
                   第一维的长度 ;第二维的长度

例如: int a[2][3] = {7,6,3,2,8,5};

二维数组的元素也称为双下标变量。
数组名[下标1][下标2]


⼆二维数组定义时,可以不指定第⼀一维的⻓长度,但必须
给定第⼆二维。

例如:
int a[ ][3] = {1 , 2 , 3 , 4 , 5};
元素个数不⾜时,会自动补齐。

⽤用于存放字符变量的数组称为字符数组。
字符数组属于⼀一维数组,元素类型是char。

二、字符串数组;
字符数组的定义:

char c[10] = {‘i’ , ‘P’ , ‘h’ , ‘o’ , ‘n’ , ‘e’};
 或者 char c[10] = “iPhone” ;



字符串数组:存放字符串的数组。
定义字符串数组:

char 数组名[常量表达式1][常量表达式2] = {值1, 值2, ...};
例如: char strings[3][10] = {“iPhone” , “Android” , “win8” };  该数组包含三个字符串。

字符串数组本质上是二维字符数组
字符串数组元素访问:
 1、访问某个字符串:数组名[第一维下标]
 

2、访问某个字符 :数组名[第一维下标][第二维下标]

注意事项:

字符串数组实为 字符型 二维数组。
每个字符串长度 不可超过第二维长度-1。 

每个字符串用数组名加一维下标表示。 例如a[0]  //代表第一个字符串。

三、 多维数组

数组下标在2个以上时,该数组称为多维数组。 例如:

int a[2][4][3] = {0};

表⽰整型的 三维数组,2层4行3列。 元素个数为 2*4*3 = 24个。


三维数组遍历:

for(int i = 0; i < 层数; i++){
 
                 for(int j = 0; j < 行数; j++){
                                 for(int k = 0; k < 列数; k++){
                          a[ i ][ j ][ k ] = xxx;
                  }
            }
 }

总结;

有两个下标的数组称为二维数组,通过双循环为其赋值。
元素类型为char的二维数组是字符串数组。注意每个字符串的长度不能超过第二个维度的长度-1。
通过 数组名[第一维下标] 操作字符串,通过数组名[第一维下标][第二维下标] 操作单个字符。
对于多维数组,多一个[常量表达式]就多一个维度,几维就对应几层循环。

********************************************************************************************************************************

// 回想一维数组定义方式
 //类型修饰符 数组名[元素个数] = {初始值....}
 // int array[5] = {1,3,2,9,4}

 //创建一个二维数组

 //二维数组的定义:
 //类型修饰符 数组名[包含几个小数组][每个小数组有几个元素] = {初始值}
 //初始值如何写?可以写n个一维数组的初始值
 // int array[3][4] ={{1 , 2, 3, 4},
 // {5, 6, 7, 8},
 // {9, 10, 11, 12}};
 // 一维数值可以省略元素个数,二维数组只能省略第一维.


 //第二种初始值写法
 // int array[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
 //
 // printf("%d\n",arry[1][2]);
 // printf("(%d %d)\n",arc4random() % 5,arc4random() %8 );

 // int array[3][4] = {0};
 // // 第一重循环,遍历小数组
 // for (int i = 0; i < 3; i++) {
 // // 第二重循环,遍历小数组的元素
 // for (int j = 0; j < 4; j++) {
 // // 给每个元素赋值,随机范围0~49
 // array[i][j] = arc4random() % 50;
 // //输出每个元素.
 // printf("%2d ",array[i][j]);
 // }
 // // 在这相当于是小数组遍历完毕,添加换行符.
 // printf("\n");
 // }
 //
 // //练习
 //
 // printf("行列交换后为:\n");
 // int dest[4][3] = {0}, max = 0, row = 0, col = 0;
 // //遍历数组
 // for (int i = 0; i < 4; i++) {
 // for (int j = 0; j < 3; j++) {
 // dest[i][j] = array[j][i];
 // printf("%2d ",dest[i][j]);
 // }
 // printf("\n");
 // }
 // //
 // for (int i = 0; i < 4; i++) {
 // for (int j = 0; j < 3; j++) {
 // max = max > dest[i][j] ? max : dest[i][j];
 // if (dest[i][j] == max ) {
 // row = i;
 // col = j;
 //
 // }
 //
 // }
 // }
 //
 // printf("max = %d,行为i = %d,列为j = %d",max,row,col);
 // 定义两个变量保存最大值所在的位置
 // int maxRow = 0, maxCol = 0;
 // for (int i = 0; i < 4; i++) {
 // for (int j = 0; j < 3; j++) {
 //
 // if (dest[i][j] > dest[maxRow][maxCol] ) {
 // maxRow = i;
 // maxCol = j;
 //
 // }
 //
 // }
 // }
 // 测试元素个数补齐
 // int arry[][3] = {1, 2, 3};

 // 定义字符串数组
 // char strings[几个字符串][每个字符串空间的大小] = {初始值列表};
 // char strings[4][50] = {"iOS", "Cocos2D-X", "Android", "Unity3D"};
 // strings[0]就是第一数组的首地址
 // 可以理解为恒等于&strings[0][0]
 //循环输出字符串数组
 // for (int i = 0; i < 4; i++) {
 // printf("%s\n",strings[i]);
 // }
 //
 // printf("%s",&strings[0][0]);
 // char strings[4][50] = {"iOS", "Cocos2D-X", "Android", "Unity3D"};
 // // 如果打印单个字符,需要用%c
 // printf("%c\n",strings[2][2]);
 // printf("%s\n",&strings[1][5]);
 // 定义一个变量用来存贮最长的长度
 // int maxLength = 0;
 // // 遍历字符串数组;
 // for (int i = 0; i < 4; i++) {
 // //进行判断
 // if (strlen(strings[i]) > strlen(strings[maxLength])) {
 //
 // maxLength = i;
 // }
 // }
 //
 // printf("最长单词的长度是%d\n", maxLength);
 //
 // for (int i = 0; i < 4 - 1; i++) {
 // for (int j = 0; j < 4 - 1 - i; j++) {
 // //条件判断
 // if(strcmp(strings[j],strings[j + 1]) > 0) {
 // // 交换字符串
 // //字符串不能直接赋值,需要用字符串拷贝函数strcpy
 // char temp [50] = {0};
 // strcpy(temp, strings[j]);
 // strcpy(strings[j], strings[j + 1]);
 // strcpy(strings[j + 1], temp);
 //
 //
 // }
 // }
 // }
 // for (int i = 0; i < 4; i++) {
 // printf("%s\n",strings[i]);
 // }


 //选择排序
 // 例如: int a[2][3][4] = {0};
 // printf("排序前:\n");
 // int array[10] = {0};
 // // 随机10个20~40的元素并打印
 // for (int i = 0; i < 10; i++) {
 // array[i] = arc4random() % (40 - 20 + 1) + 20;
 // printf("%d ", array[i]);
 // }
 // printf("\n");
 // // 一共10个元素选择10 - 1次最小值即可
 // for(int i = 0;i < 10 - 1;i++){
 // // min最小的元素所在的位置
 // int min = i;
 // // 判断最小的元素所在的位置
 // for(int j = i + 1; j < 10; j++){
 // if( array[min] > array[j]){
 // min = j;
 // }
 // }
 // // 如果最小的元素不在第i位的时候交换
 // if (min != i) {
 // int temp = array[min];
 // array[min] = array[i];
 // array[i] = temp;
 // }
 // }
 // printf("排序后:\n");
 // // 打印排序后的数组
 // for (int i = 0; i < 10; i++) {
 // printf("%d ", array[i]);
 // }
 // printf("\n");
 //
 // }

*******************************************************************************************************************************




1、(**)有一个3 行4 列的二维数组,要求编程找出最大的元素,并输出所在的行和列。
2、(**)输入6 个字符串,并对它们按从小到大的顺序排序后输出。

3、(****)找出一个二维数组中的“鞍点”,即该位置上的元素在该行中最大,在该列中最小(也可能没有“鞍点”),打印有关信息。(提示:注意特殊情况:没鞍点或多个鞍点)

4、(**)随机生成一个三维数组,编程求深度的平均值,保存在一个二维数组中(相当于一个模仿从上面看)。

答案: 

//1、(**)有一个 3 行 4 列的二维数组,要求编程找出最大的元素,并输出 所在的行和列。


//4、(**)随机生成一个三维数组,编程求深度的平均值,保存在一个二维数 组中(相当于一个模仿从上面看)。

// int f[3][4] = {0}; 
    
 // int max = 0; 
    
 // int min = 51; 
    
 // int sum = 0; 
    
 // int fsum[4] = {0}; 
    
 // for (int i = 0 ; i < 3; i++) { 
    
 // //内层循环 用来找出没一行的最大值 
    
 // for (int j = 0 ; j < 4; j++) { 
    
 // f[i][j] = arc4random()%21 + 30; 
    
 // //如果数组的当前值比定义的最大值要大,则把最大值改为数组当前值 
    
 // if (max < f[i][j]) { 
    
 // max = f[i][j]; 
    
 // } 
    
 // //如果数组的当前值比定义的最小值要小,则把最小值改为数组当前值 
    
 // if(min > f[i][j]){ 
    
 // min = f[i][j]; 
    
 // } 
    
 // //sum用来求2维数组的总和 
    
 // sum += f[i][j]; 
    
 // //fsum用来计算数组每一行的和 
    
 // fsum[i] += f[i][j]; 
    
 // printf("f[%d][%d] = %d ", i, j, f[i][j]); 
    
 // } 
    
 // printf("\nfsum[%d] = %d\n", i, fsum[i]); 
    
 // } 
    
 // 
    
 // printf("\nsum = %d", sum); 
    
 // 
    
 // for (int i = 0 ; i < 3; i++) { 
    
 // for (int j = 0 ; j < 4; j++) { 
    
 // if (max == f[i][j]) { 
    
 // printf("\nmax: f[%d][%d] = %d", i, j, max); 
    
 // } 
    
 // if (min == f[i][j]) { 
    
 // printf("\nmin: f[%d][%d] = %d", i, j, min); 
    
 // } 
    
 // 
    
 // } 
    
 // } 
    

 //2、(**)输入 6 个字符串,并对它们按从小到大的顺序排序后输出。 
    

 // char strings[][20] = {"wangziyu", "duhaoran", "haoyun", "niuzhiquan", "yangguo", "xiaolongnv", "linghuchog", "guojing", "xiaofeng", "guomeimei", "zhoubotong", "cuiyayun"}; 
    
 // int size = sizeof(strings)/sizeof(strings[0]); 
    
 // unsigned long maxlenth = strlen(strings[0]); 
    
 // unsigned long minlenth = strlen(strings[0]); 
    
 // for (int i = 0; i < size; i++) { 
    
 // maxlenth = maxlenth > strlen(strings[i]) ? maxlenth : strlen(strings[i]); 
    
 // minlenth = minlenth < strlen(strings[i]) ? minlenth: strlen(strings[i]); 
    
 // printf("%s \n", strings[i]); 
    
 // } 
    
 // 
    
 // 
    
 // for (int i = 0; i < size; i++){ 
    
 // //求最长的字符串 并输出其长度 
    
 // if (maxlenth == strlen(strings[i])) { 
    
 // printf("%s %lu\n", strings[i], maxlenth); 
    
 // } 
    
 // //求最短的字符串 并输出其长度 
    
 // if (minlenth == strlen(strings[i])) { 
    
 // printf("%s %lu\n", strings[i], minlenth); 
    
 // } 
    
 // } 
    
 // for (int i = 0; i < size-1; i++) { 
    
 // for (int j = 0; j < size - i - 1; j++) { 
    
 // //比较字符串的大小 如果前面的字符串大 则交换位置 
    
 // if (strcmp(strings[j], strings[j+1]) > 0) { 
    
 // char temp[20] = {0}; 
    
 // strcpy(temp, strings[j]); 
    
 // strcpy(strings[j], strings[j+1]); 
    
 // strcpy(strings[j+1], temp); 
    
 // } 
    
 // } 
    
 // } 
    
 // 
    
 // for (int i = 0; i < size; i++){ 
    
 // printf("%s\n", strings[i]); 
    
 // } 
    



 //3、(****)找出一个二维数组中的“鞍点”,即该位置上的元素在该行中 最大,在该列中最小(也可能没有“鞍点”),打印有关信息。(提示:注意特 殊情况:没鞍点或多个鞍点) 
    

 // int arr[N][M] = {0}; 
    
 // for (int i = 0; i < N; i++) { 
    
 // for (int j = 0; j < M; j++) { 
    
 // arr[i][j] = arc4random()%99 + 1; 
    
 // printf("%-2d ", arr[i][j]); 
    
 // } 
    
 // printf("\n"); 
    
 // } 
    
 // BOOL flag = 1; 
    
 // int count = 0; 
    
 // for (int i = 0; i < N; i++) { 
    
 // for (int j = 0; j < M; j++) { 
    
 // //把数组当前的数和整行比较,如果不是最大值跳出当前循环,并把标记置为0 
    
 // for (int k = 0; k < M; k++) { 
    
 // if (arr[i][j] < arr[i][k]){ 
    
 // flag = 0; 
    
 // break; 
    
 // } 
    
 // } 
    
 // 
    
 // if (flag) { 
    
 // //把数组当前的数和整列进行比较,如果不是最小的跳出当前循环,并把标记置为0 
    
 // for (int x = 0; x < N; x++) { 
    
 // if (arr[i][j] > arr[x][j]) { 
    
 // flag = 0; 
    
 // break; 
    
 // } 
    
 // } 
    
 // } 
    
 // 
    
 // //如果标记不为零,说明数组当前数据为行最大值,列最小值.是鞍点 打印出来 
    
 // if (flag) { 
    
 // printf("arr[%d][%d] = %d是鞍点 ", i, j, arr[i][j]); 
    
 // count++; 
    
 // } 
    
 // flag = 1; 
    
 // } 
    
 // } 
    
 // if (count == 0) { 
    
 // printf("没有鞍点!!"); 
    
 // }



// int arry[3][3][3] = {0};
 // float avg[3][3] ={0};
 // // 设三维数组随机产生0~30的数.
 // for (int i = 0; i < 3 ; i++) {
 // for (int j = 0; j < 3; j++) {
 // for (int k = 0; k < 3; k++) {
 // arry[i][j][k] = arc4random() % 31;
 // printf("%2d ",arry[i][j][k]);
 // }
 // printf("\n");
 // }
 // printf("\n");
 // }
 // for (int i = 0; i < 3 ; i++) {
 // for (int j = 0; j < 3; j++) {
 // for (int n = 0; n < 3; n++) {
 // 
 // avg[i][j] += arry[n][i][j];
 // 
 // }
 // avg[i][j] /= 3;
 // printf("%.2f ",avg[i][j]);
 // }
 // printf("\n");
 // }