C語言每日一題之No.4

      這幾天老大也沒安排我什麼項目,因而想正好趁着空補C。固然,是利用晚上加班時間,白天正常上班時間仍是學習公司的平臺。 今兒個忽然弱弱的感受到在公司補C是件很低級的事情,哪怕是在加班時間都會被噴,由於你們在關心Linux玩得順溜不順溜的狀況下,我在補C,萬惡的C。想一想也是,這種最最基礎的C語言只能本身擠出時間來補了,在公司最起碼也得學點高端點的,好比Linux,若是做爲一個軟件開發人員,你不會Linux還搞毛線啊?數組

      好吧,工做一天了,今日吐槽完畢,人生因吐槽而舒暢爽快 ,神同樣的存在。此時此刻就是回家以後在電腦跟前老老實實補C了,加油,girl ! ^_^函數

一. 題目:從鍵盤輸入一個n×n的二維數組(n鍵盤輸入),找出此二維數組中各行的最大值,並按從大到小的次序輸出  學習

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

    輸入指針

    4 (n=4)code

    13  34  23  44blog

    45  78  21  30排序

    98  32  11  50element

    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\n",&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:\n"); 32    scanf("%d\n",&num); 33    
34    s_order* order[SIZE]; 35    printf("please input the elements of the arry:\n"); 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\n",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:\n"); 30    scanf("%d",&num); 31    
32    s_order  order[SIZE]={0}; 33    printf("please input the elements of the arry:\n"); 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:\n"); 50      printf("%d\n",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:\n"); 68        printf("%d %d\n",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("每行最大數排序後:\n"); 41   for(i=0;i<n;i++) 42         printf("%-4d在第%2d行\n",b[i],c[i]); 43 
44    return 0; 45 } 46 [/code]

 

十.知識點:

   1.結構體數組的定義

     

   2.結構體的初始化

   3.memcpy 

   4.scanf輸入符格式帶空格怎麼處理?

相關文章
相關標籤/搜索