iOS开发之c语言基础Lesson-04-05 数组(Arrary) 课程补充及面试试题
/////////////////多维数组///////
//每多一个维度,就意味着需要一个更大的容器,来装载之前的维度
//二维数组:是特殊的一维数组,内部包含多个一维数组
//***数组总结***
//1.遍历二维数组时,使用双层for循环, 外层循环控制行数, 内层循环控制列数.当遍历三维数组时, 使用三层for循环, 最外层控制层数, 次外层控制行数, 内层控制列数.
//2.访问数组中的元素;
// 2.1.访问一维数组, 数组名[下标],
// 2.2.访问二维数组, 数组名[行标][列标].
// 2.3.访问三维数组, 数组名[层标][行标][列标].
//3.数组的元素个数;
// 3.1.一维数组, 定义数组时指定的数组元素个数
// 3.2.二维数组, 行数 * 列数
// 3.3.三维数组, 层数 * 行数 * 列数
//4.维度可否省略
// 4.1.一维数组, 可以省略, 根据赋初值的个数,动态计算数组元素个数
// 4.2.二维数组, 行可以省略, 列不可以省略 , 系统会根据列数, 自动算出行数
//定义一个 3 行 3 列的二维数组, 本质上定义了一个包含3个一维数组,并且每个一维数组包含三个元素 // int a[3][3] = { // 1, 2, 3, // 4, 5, 6, // 7, 8, 9}; // for (int i = 0; i < 3; i++) { // 外层循环 控制行数(对应二维数组中的一个一维数组),遍历除对应的一维数组 // for (int j = 0; j < 3; j++) { //内层循环 控制列数,遍历出一维数组中的每个元素 // printf("%d ", a[i][j]); // } // printf("\n"); // } // int a[3][4] = { // 29, 18, 20, 25, // 29, 29, 17, 14, // 24, 23, 17, 18}; // // int sum = 0; // //1. 为二维数组中赋值 // for (int i = 0; i < 3; i++) { // for (int j = 0; j < 4; j++) { // a[i][j] = arc4random() % (30 - 10 + 1) + 10; // printf("%d ", a[i][j]); // } // printf("\n"); // // } // //2. 求和,平均值 // for (int i = 0; i < 3; i++) { // for (int j = 0; j < 4; j++) { // sum += a[i][j]; // } // } // printf("和☺ = %d, 平均值 = %.2f \n", sum, sum * 1.0 / 12); // // //求二维数组中, 所有元素的最大值, 以及最大值的位置,行和列标 // int max = 0; // int maxRow = 0; // int maxLine = 0; // int r[5] = {0}; //假如,有5个相同的最大值 // int l[5] ={0}; // int m = 1, n = 1; // r[0],给了遇到的第一个最大值 // for (int i = 0; i < 3; i++) { // for (int j = 0; j < 4; j++) { // if(a[i][j] > max) // { // max = a[i][j]; // maxRow = i; // maxLine = j; // r[0] = maxRow + 1; //加1, 是为了打印的时候, 好做不等于0的判断, 让所有没有存数据的数, 不打印 // l[0] = maxLine + 1; // }else if (a[i][j] == max) // { // // r[m++] = i + 1; // l[n++] = j + 1; // // } // } // } // for (int i = 0; i < 5; i++) { // if(r[i] != 0 && l[i] != 0) // printf("最大值%d个: %d, 行标: %d, 列标: %d \n",i + 1, max, r[i] - 1, l[i] - 1);//减1, 对应上面的加1 // } // // //求所有最大值,还有另一种方法, 先求出最大值, 然后拿最大值, 与二维数组中的每一个去匹配, 匹配到了,打印位置, 即可 // for (int i = 0; i < 3; i++) { // for (int j = 0; j < 4; j++) { // if(a[i][j] == max) // { // printf("共%d个: %d, 行标: %d, 列标: %d \n",i + 1, max, i, j); // // } // } // } //////////////技能拓展//////////////// // 0.将一个二维数组的行和列交换,存储到另外一个数组中去。 // int a[3][3] = {0}; // int b[3][3] = {0}; // //给数组a赋值 // for (int i = 0; i < 3; i++) { // for (int j = 0; j < 3; j++) { // a[i][j] = arc4random() % (50 - 20 + 1)+ 20; // printf("%d ", a[i][j]); // b[j][i] = a[i][j]; // } // printf("\n"); // } // printf("行列交换后的数组\n"); // for (int i = 0; i < 3; i++) { // for (int j = 0 ; j < 3; j++) { // printf("%d ", b[i][j]); // } // printf("\n"); // } // 1.将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。 //Method one: 先将两个数组中的元素,放到第三个数组中,在对第三个数组进行升序排序(本题不使用) //Method two: 归并排序 , 将两个数组中的元素,放入第三个数组中是, 已经保证第三个数组是一个有序的序列(本题使用) // int a[5] = {1, 2, 3, 8, 10}; // int b[5] = {4, 5, 7, 9, 12}; // int c[10] = {0}; // // //随机数组, 在进行冒泡排序 // /* 以下内容, 是随机生成两个数组, 进行冒泡排序, // 为了方便, 直接初始化的时候, 就写好两个有序的数组 // for (int i = 0; i < 5; i++) { // a[i] = arc4random() % (50 - 20 + 1) + 20; // b[i] = arc4random() % (50 - 20 + 1) + 20; // printf("%d ", a[i]); //打印原始a数组 // } // printf("\n"); // for (int i = 0; i < 5; i++) { //打印原始b数组 // printf("%d ", b[i]); // } // for (int i = 0; i < 5 - 1; i++) { //将a和b排序 // for (int j = 0; j < 5 - 1 -i;j++) { // if (a[j] > a[j + 1]) { //将a数组升序排序 // int temp = a[j]; // a[j] = a[j + 1]; // a[j + 1] = temp; // } // if (b[j] > b[j + 1]) { //将b数组升序排序 // int temp = b[j]; // b[j] = b[j + 1]; // b[j + 1] = temp; // } // } // } // printf("\n排序后的a和b数组:\n"); // for (int i = 0; i < 5; i++) { //排序后的a数组 // printf("%d ", a[i]); // } // printf("\n"); // for (int i = 0; i < 5; i++) { // printf("%d ", b[i]); // } // */ // // printf("\na和b组合成的c数组:\n"); // int k = 0, i = 0, j = 0; // while (i < 5 && j < 5) { // if(a[i] < b[j]) //将小的数放到c中 // c[k++] = a[i++]; // else // c[k++] = b[j++]; // } // // //如果其中一个数组元素全部放到c数组里, 我们只需将两一个数组的剩下的元素,不做比较, 直接放到c里面 // while (i < 5) { // c[k++] = a[i++]; // } // while (j < 5){ // c[k++] = b[j++]; // } // // for (int i = 0; i < 10; i++) { // printf("%d ", c[i]); // } // //2.耶稣有13个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:13人围坐一圈,从第一个开始报号:1,2,3,1,2,3...。凡是报到“3”就退出圈子,最后留在圈子内的人就是出卖耶稣的叛徒。请找出它原来的序号。 提示:使用数组中13个元素来表示13个人. // int man[13] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; // int call = 0; // int manCount = 13; //人数初始 13人 // for (int i = 0; manCount > 1;i++) { //人数大于1, 才会继续报号 // if(i == 13)i = 0; //13人围一圈, 所以当i等于 13 的时候, 需要从 0 开始 // if(man[i] != 0) call++; // if(call == 3) // { // man[i] = 0; //喊到 3 的人, 将他对应的数设置为 0 // call = 0; //将喊数,重置为0 // manCount--; //kill一个人 // } // } // // /////while循环 // // int i = 0; //记录当前报数人的位置 // // while (manCount > 1) { //人数大于1, 才会继续报号 // // // // if(man[i] != 0) call++; //不等于0, 说明还没有报道 3 // // if(call == 3) // // { // // man[i] = 0; //喊到 3 的人, 将他对应的数设置为 0 // // call = 0; //将喊数,重置为0 // // manCount--; //kill一个人 // // } // // i++; // // if(i == 13)i = 0; // // } // for (int i = 0; i < 13; i++) { // if(man[i] != 0){ // printf("出卖耶稣的叛徒的序号是 %d 号", i + 1); // } // } // 3.(***)模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A、B、C、D表示,当选某候选人时,直接输入其编号(编号由计算机随机产生),// 若输入的不是A、B、C、D对应的编号,则视为无效票,选举结束后按得票数从高到低输出候选人编号和所得票数。 // int man = 0; //参加选举的人数 // int poll[4] = {0}; //存放票数 // int num[4] = {0}; //存放随机编号 // char candidate[4] = {'A', 'B', 'C', 'D'}; // printf("候选人名单:\n"); // for (int i = 0; i < 4; i++) { //随机产出编号, 对应候选人 // num[i] = arc4random() % (200 - 100 + 1) + 100; // printf("%c的编号:%d \n",candidate[i], num[i]); // } // printf("请管理员输入参加选举人数:"); // scanf("%d", &man); // while (man) { // printf("\n请输入候选人对应的编号:"); // int inputNum = 0; // bool isUse = NO; //判断是否是有效票 // scanf("%d", &inputNum); // for (int i = 0; i < 4; i++) { // if(inputNum == num[i]){ //如果输入的编号, 存在 // printf("投票成功~~\n"); // poll[i]++; // isUse = YES; // break; // } // } // if (!isUse) { // printf("无效票~!~\n"); // } // man--; // } // // for (int i = 0; i < 4 - 1; i++) { // for (int j = 0; j < 4 - 1 - i; j++) { // if(poll[j] < poll[j + 1]){ //冒泡排序票数 // int temp = poll[j]; // poll[j] = poll[j + 1]; // poll[j + 1] = temp; // // //为了将候选人, 以及编号, 同票数, 一一对应, // //也需要将候选人以及编号, 同票数做同样的排序 // char ctemp = candidate[j]; // candidate[j] = candidate[j + 1]; // candidate[j + 1] = ctemp; // // int ntemp = num[j]; // num[j] = num[j + 1]; // num[j + 1] =ntemp; // } // // } // } // // for (int i = 0 ;i < 4 ;i++) { // printf("%d 号候选人 %c 获得 %d 票 \n", num[i], candidate[i], poll[i]); // } ///////////******课堂方法**********////////////// // printf("请管理员输入参加选举人数:"); // scanf("%d", &man); // //开始模拟投票 // for (int i = 0; i < man; i++) { // int ran = arc4random() % (68 - 65 + 1) + 65; // poll[ran - 65]++; // } // for (int i = 0; i < 4 - 1; i++) { // for (int j = 0; j <4 - 1 - i; j++) { // if (poll[j] < poll[j + 1]) { // int temp = poll[j]; // poll[j] = poll[j + 1]; // poll[j + 1] = temp; // //为了将候选人, 以及编号, 同票数, 一一对应, // //也需要将候选人以及编号, 同票数做同样的排序 // // char ctemp = candidate[j]; // candidate[j] = candidate[j + 1]; // candidate[j + 1] = ctemp; // } // } // } // for (int i = 0 ;i < 4 ;i++) { // printf("候选人 %c 获得 %d 票 \n", candidate[i], poll[i]); // } // 4、找出一个二维数组中的“鞍点”,即该位置上的元素在该行中最大,在该列中最小(也可能没鞍点),打印出有关信息。 int a[3][4] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { //a[i][j] = arc4random() % (70 - 20 + 1) + 20; printf("%d ", a[i][j]); } printf("\n"); } int maxRow = 0; int maxR[3] = {0}; int minLine = 70; int minL[4] = {0}; for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++){ if(a[i][j] > maxRow){ maxRow = a[i][j]; } } maxR[i] = maxRow; //存放一行中最大值 maxRow = 0; } for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { if(a[j][i] < minLine){ minLine = a[j][i]; } } minL[i] = minLine; //存放一列中最小值 minLine = 70; } bool isNO = NO; //不存在按点 int num = 0; //记录鞍点的个数 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { if(maxR[i] == minL[j]){ num++; printf("第 %d 个鞍点 %d 位置:(%d 行, %d 列)\n",num, maxR[i], i + 1, j + 1); isNO = YES; } } } if (!isNO) { printf("该二维数组不存在鞍点\n"); } printf("\n\n"); // // double start ,finish; // start = (double)clock(); // // finish = (double)clock(); // printf("%.2f", finish - start); // // ////////////////*****课堂答案********////////////// // int count = 0;//记录按点个数 // for (int i = 0; i < 3; i++) { // for (int j = 0; j < 4; j++) { // //判断元素是不是按点 // //1.判断是否是本行中最大的 // int max = a[i][j]; // BOOL isMax = YES; //假设是本行中最大的 // // for (int col = 0; col < 4; col++) { //代表列 // if(a[i][col] > max){ // isMax = NO; //发现本行中比当前值大,说明该数不是本行中最大 // break; // } // } // if (isMax == NO) { // continue; // } // //2.判断是否是本咧中最小 // int min = a[i][j]; // BOOL isMin = YES; // //验证是否是本咧中最小的 // for (int row = 0; row < 3; row++) { // if(a[row][j] < min){ // isMin = NO; // break; // } // } // if (isMin == NO) { // continue; // } // //如果执行到这里, 说明是按点 // printf("%d, %d \n", i, j ); // count++; // } // } // printf("%d\n" , count); // //////////////////*****字符串数组*******//////////////// //字符串数组, 存储多个字符串 //本质:包含多个一维的字符数组, 每一个字符数组村粗一个字符串 //列数应该大于等于, 最长字符串长度 + 1 // char str[3][8] = {"iPhone", "Android" ,"WP"}; // // //访问字符串数组中的第二个字符串 // printf("%s \n", str[1]); // printf("%c \n", str[1][1]); // // //将iPhone,替换成Ashen // strcpy(str[0], "Ashen"); // printf("%s ",str[0] ); // ////输出最长字符串的长度 // char name[4][10] = {"HuiPeng", "BaiYaChao" ,"HeHang", "ZhenZhen"}; // // int len = 0; // for (int i = 0; i < 4; i++) { // if(strlen(name[i]) > len){ // len = (int)strlen(name[i]); //强制将unsigned long int 转成 int // } // } // printf("最长字符串:%d \n", len); // //对字符串数组进行排序 // for (int i = 0 ; i < 4; i++) { // for (int j = 0; j < 4 - 1 - i; j++) { // if(strcmp(name[j], name[j + 1])){ // char temp[10] = " "; // strcpy(temp, name[j]); // strcpy(name[j], name[j + 1]); // strcpy(name[j + 1], temp); // } // } // } // for (int i = 0; i< 4; i++) { // printf("%s ", name[i]); // }