這幾天老大也沒安排我什麼項目,因而想正好趁着空補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輸入符格式帶空格怎麼處理?