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

 

posted @ 2015-03-20 17:53  我死在了编程的路上  阅读(176)  评论(0编辑  收藏  举报