• C语言每日一题之No.4


          这几天老大也没安排我什么项目,于是想正好趁着空补C。当然,是利用晚上加班时间,白天正常上班时间还是学习公司的平台。 今儿个突然弱弱的感觉到在公司补C是件很低级的事情,哪怕是在加班时间都会被喷,因为大家在关心Linux玩得顺溜不顺溜的情况下,我在补C,万恶的C。想想也是,这种最最基础的C语言只能自己挤出时间来补了,在公司最起码也得学点高端点的,比如Linux,如果作为一个软件开发人员,你不会Linux还搞毛线啊?

          好吧,工作一天了,今日吐槽完毕,人生因吐槽而舒畅爽快 ,神一样的存在。此时此刻就是回家之后在电脑跟前老老实实补C了,加油,girl ! ^_^

    一. 题目:从键盘输入一个n×n的二维数组(n键盘输入),找出此二维数组中各行的最大值,并按从大到小的次序输出  

        各行的最大值及此值所在的行号。如:

        输入

        4 (n=4)

        13  34  23  44

        45  78  21  30

        98  32  11  50

        5  66  88  22  (n×n)

        输出

        98   3(最大98,在第3行)

        88   4

        78   2

        44    1

        45  

    二.思路:定义一个二维数组,其大小由输入决定

                依次输入二维数组的每个元素

                循环比较一维数组得出每行最大值并记录该行(定义一个结构体存储最大值和改行)

                将各个最大值和行数进行排序输出

    三.程序:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5    int size;
     6    scanf("%d
    ",&size);
     7 
     8    int arry[size][size]={0};
     9     
    10    return 0;
    11 
    12 }

       就先程序到此为止,碰到了问题:

       1.数组的大小不可以是变量,怎么解决这个由输入来决定数组大小?

       2.多维数组如何初始化?

    解答:

        1.数组声明时的大小确实必须是常亮,但实际几维取决于数组里的元素,也就是说可以通过控制输入元素来控维数

        2.多维数组初始化按格式 {    { }, 

                                              { },

                                              { },

                                                .

                                                .

                                                .

                                        }

    好吧,继续程序:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 #define SIZE 80
     5 
     6 //最大值函数
     7 int max_func(int x,int y)
     8 {
     9    int max = 0;
    10    max = x > y ? x:y;
    11 
    12    return max;
    13 
    14 }
    15 
    16 
    17 
    18 
    19 int main(void)
    20 {
    21    
    22    int num = 0;
    23    int max = 0;
    24    int arry[SIZE][SIZE]={0};
    25    typedef struct 
    26  {
    27      int max;
    28      int line;
    29    }s_order,s_order*;//定义结构体用来存储行和该行最大值
    30    
    31    printf("Please input the size of the arry:
    ");
    32    scanf("%d
    ",&num);
    33    
    34    s_order*  order[SIZE];
    35    printf("please input the elements of the arry:
    ");
    36    for(int i=0;i<num;i++)
    37  {   
    38        scanf("%d   ",&max);//max保存每行第一个元素       
    39        for(int j=1;j<num;j++)
    40   {
    41            scanf("%d   ",&arry[i][j]) ;
    42            max=max_func(max,arry[i][j]);
    43   }
    44 //将比较出来的每行最大值存在s_order结构体的max元素中,且该行保存在line元素中 45 order[i].max = max; 46 order[i].line = i; 47 } 48 49 s_order* temp[SIZE]; 50 for(i=0;i<num;i++) 51 { 52 //把s_order结构体中的max元素单独拿来排序 53 if( order[i].max< order[i+1].max) 54 { 55 temp = order[i]; 56 order[i] = order[i+1]; 57 order[i+1] = temp; 58 } 59 //如果要换顺序,连同整个结构体数组都换掉,这样就可以达到最大值和行数同步了 60 } 61 62 for(i=0;i<num;i++) 63 printf("%d %d ",order[i].max,order[i].line); 64 return 0; 65 66 }

     四.编译运行:

        在结构体定义那里报错:missing ';' before '*'。

        1.然后想了想,为嘛一定要s_order*呢?以为下面要用到结构体数组order[SIZE],所以就一定要定义成

          结构体指针类型吗?不能直接就用结构体类型吗?

        2.上面竟然用了数组整体赋值,temp是数组啊亲,真是碉堡了,不长记性吧同时,还有一个很奇怪的地

          方,既然交换时不能使用数组整体复制,那就不要把temp定义成数组就好啦。再说了,temp是用来交换

          的中间值,它干嘛要定义成数组?

           

         3.为什么输完矩阵后,按回车没有继续往下走呢?

           那是因为你在scanf(“%d    ”)的%d后面不该加那么多空格。

    五.分析问题:

        1.去掉结构体指针,将结构体数组定义成结构体类型

          

        2.交换数组那里改成用memcpy的方法

          

        3. 将scanf那里("%d    ")里的空格符去掉

    六.改进

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 #define SIZE 80
     5 
     6 //最大值函数
     7 int max_func(int x,int y)
     8 {
     9    int max = 0;
    10    max = x > y ? x:y;
    11 
    12    return max;
    13 
    14 }
    15 
    16 
    17 int main(void)
    18 {
    19    
    20    int num = 0;
    21    int max = 0;
    22    int arry[SIZE][SIZE]={0};
    23    typedef struct 
    24    {
    25      int max;
    26      int line;
    27    }s_order;//定义结构体用来存储行和该行最大值
    28    
    29    printf("Please input the size of the arry:
    ");
    30    scanf("%d",&num);
    31    
    32    s_order  order[SIZE]={0};
    33    printf("please input the elements of the arry:
    ");
    34    for(int i=0;i<num;i++)
    35    {   
    36        scanf("%d",&max);//max保存每行第一个元素       
    37        for(int j=1;j<num;j++)
    38        {
    39            scanf("%d",&arry[i][j]) ;
    40            max=max_func(max,arry[i][j]);
    41            //将比较出来的每行最大值存在s_order结构体的max元素中,且该行保存在line元素中
    42        }
    43        order[i].max = max;
    44        order[i].line = i;
    45    }
    46    
    47    for(i=0;i<num;i++)
    48    {
    49      printf("the max num of every line is:
    ");
    50      printf("%d
    ",order[i].max);
    51    }
    52    s_order  temp={0};//结构体怎么初始化?
    53    for(i=0;i<num-1;i++)
    54    {
    55      //把s_order结构体中的max元素单独拿来排序
    56      if( order[i].max< order[i+1].max)
    57      {
    58        memcpy(&temp,&order[i],sizeof(order));
    59        memcpy(&order[i],&order[i+1],sizeof(order));
    60        memcpy(&order[i+1],&temp,sizeof(order));
    61      }
    62      //如果要换顺序,连同整个结构体都换掉,这样就可以达到最大值和行数同步了
    63    }
    64 
    65    for(i=0;i<num;i++)
    66    {
    67        printf("the order of the max is:
    ");
    68        printf("%d    %d
    ",order[i].max,order[i].line);
    69    }
    70    return 0;
    71 
    72 }

    七.运行结果:

     很显然,前面各行最大值以及对应的行都已经顺利得出,就是比较各行最大值时出了问题。

    八.问题分析

        就程序而言,将得出的各行最大值排序时,就直接两两相邻比较肯定是无法排序成功的,应该是冒泡法的思维。同时,还有个很奇怪的地方:temp不是已经不是数组了吗?那就不存在数组整体复制啦,为何还要通过memcpy来规避?明明之前的交换法就可以用啊!可是到底memcpy是怎样呈现出以上结果的呢?

     1  s_order  temp={0,0};//结构体怎么初始化?
     2    int len = 0;
     3    //运用冒泡法思维来对各行最大值进行排序
     4    for(i=0;i<num;i++)
     5    {
     6      //把s_order结构体中的max元素单独拿来排序
     7      for(int j=0;j<num-1-len;j++)
     8      {
     9       if( order[j].max< order[j+1].max)
    10       {
    11        temp = order[j];
    12        order[j] = order[j+1];
    13        order[j+1] = temp;
    14       }
    15      //如果要换顺序,连同整个结构体都换掉,这样就可以达到最大值和行数同步了
    16      }
    17      len++;
    18     }

    运行结果:

        

    九.贴出网上的解答版本

     3 #include <stdio.h>
     4 #include <string.h>
     5 int main(void)
     6 {
     7  int a[80][80],b[80],c[80];
     8     //定义b数组保存各行最大值,c数组保存各行行号 
     9  int n,i,j,k=0,l=0,index,max,temp; 
    10  scanf("%d",&n);
    11
    12   printf("请输入%d阶矩阵:",n);
    13   for(i=0;i<n;i++)
    14      for(j=0;j<n;j++)
    15          scanf("%d",&a[i][j]);
    16   for(i=0;i<n;i++)
    17   {
    18       max=a[i][0];
    19       for(j=1;j<n;j++)
    20           if(a[i][j]>max) max=a[i][j];
    21       b[k++]=max; 
    22        //记录此行的最大值 
    23       c[l++]=i+1;
    24       //记录这时的行号 
    25   }
    26   for(i=0;i<n-1;i++)//选择排序 
    27   {
    28       index=i;
    29       for(j=i+1;j<n;j++)
    30           if(b[j]>b[index]) index=j;
    31       if(index==i) continue;
    32       temp=b[index];
    33       b[index]=b[i];
    34       b[i]=temp;
    35       temp=c[index];
    36         //交换最大值时别忘了交换相应的行号 
    37       c[index]=c[i];
    38       c[i]=temp;
    39   }
    40   printf("每行最大数排序后:
    ");
    41   for(i=0;i<n;i++)
    42         printf("%-4d在第%2d行
    ",b[i],c[i]);
    43 
    44    return 0;
    45 }
    46 [/code]

     

    十.知识点:

       1.结构体数组的定义

         

       2.结构体的初始化

       3.memcpy 

       4.scanf输入符格式带空格怎么处理?

     

               

       

        

        

     

  • 相关阅读:
    学习进度条
    0302我的感想
    1217实验四 递归下降语法分析程序设计
    1118 实验三 有限自动机的构造与识别
    1112我的访问与评论日记
    1014 我的C语言文法定义与C程序推导过程
    0917词法分析
    命令解释程序的编写
    构建之法前三章读后感
    复利计算4.0
  • 原文地址:https://www.cnblogs.com/TTTTT/p/3714861.html
Copyright © 2020-2023  润新知