C5_二维数组,字符串数组,多维数组

一、 二维数组

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

二维数组的定义:
类型 数组名[常量表达式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 列的二维数组,要求编程找出最大的元素,并输出 所在的行和列。

// 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("没有鞍点!!");
// }



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

// 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");
// }


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值