这几天老大也没安排我什么项目,于是想正好趁着空补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\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输入符格式带空格怎么处理?