美文网首页
【持续更新】C语言 第六天学习笔记(数组下)

【持续更新】C语言 第六天学习笔记(数组下)

作者: 我是果冻妹纸 | 来源:发表于2016-12-23 15:50 被阅读0次

    五、【理解】冒泡排序

         冒泡排序是指相邻的两个数进行比较,将小数放前面,大数放后面。最终排序结果呈从小到大排列。就像生活中沸腾的水,气泡由小变到大,因此也称为冒泡排序!(有些书籍或者有些人也将冒泡排序称之为从大到小排列,其实核心思想都一样,只要符合核心思想的都叫冒泡排序)
    
    冒泡

    如:有7个数
    70 60 50 40 30 20 10
    现需用冒泡排序将其从小到大排列

    具体思想步骤:先用第1个数跟第2个数比较,发现70比60要大,所以70跟60交换位置,即现在位顺序为:60
    70 50 40 30 20 10 再然后用第2个数跟第3个数进行比较,因为此时第2个数已经变为了70,所以是70与第3个数比较,发现70又比50要大,于是将第2个数与第3个数交换位置,即,现在顺序为:60
    50 70 40 30 20 10,再然后用第3个数与第4个数进行比较,即70与40比较,发现70比40大,所以交换位置,此时顺序为:60 50 40 70 30 20 10,然后再用第4个数与第5个数进行比较,以此类推……

    经过以上推测发现,我们一共需要6轮才能完整排好序,轮数如下:

    第1轮:60 50 40 30 20 10 70 第1轮比较了6次

    第2轮:50 40 30 20 10 60 70 第2轮比较了5次

    第3轮:40 30 20 10 50 60 70 第3轮比较了4次

    第4轮:30 20 10 40 50 60 70 第4轮比较了3次

    第5轮:20 10 30 40 50 60 70 第5轮比较了2次

    第6轮:10 20 30 40 50 60 70 第6轮比较了1次

    此时经过6轮能完整地把一堆数字从小到大按顺序排列。

    经过观察我们可以发现:

    我们一共有7个数字,经过6轮可以完整排序好,那么代表有n个数字,我们就需要经过n-1轮

    那么每轮比较多少次呢?

    我们可以发现,每轮比较的次数 为 总数 - 轮数 (论数是从1开始数)

    因此得到循环

    for(int 轮数= 0; i < 总数 - 1 ; 轮数++){
    
     
    
    //因此轮数在循环中是从0开始的,所以这里还需要-1
    
    for(int 次数 =
    0;  次数 <  总数 - 论述  -  1; 次数++){
     
    if( 数组[次数] > 数组[次数+1] ){
    
    
    //交换两个变量的值
    
    int   temp = 数组[ 次数];
    
    数组[次数] = 数组[次数 + 1];
    
    数组[次数+ 1] 
    =  temp;
    
    }
    
    
    }
    
     
    }
    
    
    所以,上面的7个数字反映成代码为:
    
        //初始化数组
    
       int nums[7] = {70,60,50,40,30,20,10};
      
    
        //计算出数组总长度
    
       int length = sizeof(nums)
    / sizeof(int);
    
        
    
        //外层循环控制轮数
    
       for(int i=0;i<length-1;i++){
    
            //内层循环控制每轮比较的次数
      
      for(int
    j=0;j<length-i-1;j++){
    
                //如果当前位置上的数比下一个位置上的数要大
    
         
          if(nums[j] > nums[j+1]){
    
       
                  //进行两个位置上的数值交换
    
         
              int temp  = nums[j];
    
              nums[j] = nums[j+1];
    
              nums[j+1]  = temp;
    
         
          }
      
      }
    
        }
    
    

    六、【了解】二维数组定义

    思考:某个公司有3个销售小组,每组5个人,现需要把每个小组中每个人的成绩保存起来,怎么做?

    1、什么是二维数组?
    简单来说就是数组里的每一个元素又是一个数组,所以称之为二维数组

    2、二维数组可以理解成什么样?

    二维数组其实可以理解为N行N列的表格

    3、创建二维数组的语法

    数据类型 二维数组名[ 行][ 列 ];

    int arr[3][5];

    表示申明了一个二维数组,这个数组有3行5列。或者说申明了一个长度为3的数组,这个数组里面的每一个元素又是一个长度为5的数组

    4、术语:

    元素:表格中每一个小格子就是二维数组中的一个元素

    下标:二维数组中的每一个元素的下标由两部分组成:所在行,所在列,表示这个元素是第几行第几列的数据

    长度:代表二维数组可以存储数据的个数,二维数组可以存取数据的个数为:行 * 列

    七、【了解】二维数组的初始化

    二维数组的初始化方法与一位数组的类似,都分为两大类:先定义再赋值、定义时初始化。

    1、先定义再赋值:

    int arr[2][3];
    int arr[0][0] = 1;
    int arr[0][1] = 2;
    int arr[0][2] = 3;
    int arr[1][0] = 11;
    int arr[1][1] = 12;
    int arr[1][2] = 13;

    2、定义二维数组时初始化

    1)完全初始化

    int arr[2][3] = { 1,2,3,11,12,13 };

    int arr[2][3] = { {1,2,3},{1,2,3} };

    2)部分初始化 int arr[2][3] = { 1,2,3 };

    其他没有初始化的部分默认值都为0

    3)定义长度时可以省略行

    int arr[][3] = {1,2,3,11,12,13 };

    编译器会自动根据右边输入的个数再除以左边的列数得到行数

    八、【了解】二维数组的取值和遍历

    1、二维数组取元素的值

    int arr[2][3] = { 1,2,3,11,12,13};

    arr[1][2];//代表取第二行第三列的值

    回顾:
    如何打印以下图形?

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

    我们说过,二维数组可以看成一个平面,因此我们也是可以用双层for循环来遍历行、再每一行里遍历列,就达到了遍历二维数组每一个元素的目的。

    2、二维数组的遍历:
    如图

    思考&实现(难):

    计算下面每一个课程的总分、平均分、最高分和最低分

    再计算每一个学生的平均分
    赵钱 孙李 周吴 郑王 冯陈

    C 语言 80 61 59 85 76

    OC 语言 75 65 63 87 77

    iOS开发 92 71 88 90 76

    解决代码:

     int arr[3][5] = {
    
        
      {80, 61,59, 85,76},
    
         
      {75, 65,63, 87,77},
    
         
      {92, 71,88, 90,76}
    
        };
    
      
    
       int max,min,sum;
    
       for(int row=0;row<3;row++){
    
        
      
            //假定最高分和最低分都是第一个人的
    
         
      max = min = sum = arr[row][0];
    
            //遍历每一列,判断出当前这行中哪个分数最大
    
            //哪个分数最小,以及计算出总和
    
         
      for(int   col=1 ; col<5;  col++){
    
        
           
    
     
              //判断是否为更高的分数
    
         
          if(max <  arr[row][col])
    
              max = arr[row][col];
    
              //判断是否为更低的分数
    
    
          if(min >arr[row][col])
    
    
              min = arr[row][col];
    
    
     
              //累加分数
    
        
          sum += arr[row][col];
    
         
      }
    
       
            //根据所在行数打印不同结果
    
         
      switch (row) {
    
     
                  //C语言
    
         
          case 0:
    
        
               
    
                    printf("C语言考试,最高分是:%d 最低分是:%d 总分是:%d \n",max,min,sum);
    
         
              break;
    
     
                  //OC语言
    
         
          case 1:
    
        
               
    
                    printf("OC语言考试,最高分是:%d 最低分是:%d 总分是:%d \n",max,min,sum);
    
         
              break;
    
     
                  //iOS开发
    
         
          case 2:
    
        
               
    
                    printf("iOS开发考试,最高分是:%d 最低分是:%d 总分是:%d \n",max,min,sum);
    
         
              break;
    
         
      }
    
        }
    
        
    
        
    
        //清空总分值
    
        sum =0;
    
        //因为要计算某个学生的平均分,那么只能从列开始遍历
    
       for(int col =0;col<5;col++){
    
        
       
    
            //再遍历这一列里的每一行
    
         
      for(int
    row=0;row<3;row++){
    
        
          sum += arr[row][col];
      }
            //根据总分算出平均分
      int avg = sum /3;
    
            //根据列号来判断是哪一个人的,打印不同结果
    
      switch (col) {
          case 0:
             printf("赵钱的平均分是%d \n",avg);
    
        
              break;
    
       
          case 1:
    
             printf("孙李的平均分是%d \n",avg);
     
              break;
         
          case 2:
     
            printf("周吴的平均分是%d \n",avg);
    
         
              break;
    
              case 3:
    
                  printf("郑王的平均分是%d \n",avg);
    
         
              break;     
          case 4:
                  printf("冯陈的平均分是%d \n",avg);
    
              break;
       
      }
    
        }
    
    
    
    

    相关文章

      网友评论

          本文标题:【持续更新】C语言 第六天学习笔记(数组下)

          本文链接:https://www.haomeiwen.com/subject/wfmkvttx.html