1004 成绩排名
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 struct stu{//定义一个数据结构来保存学生信息 6 char Name[11];//注意这里和下面一行,应该是11,10个字符还要加上结束符 7 char Num[11]; 8 int Grade; 9 }; 10 11 int main(void) 12 { 13 int n,i,k=0,j=0,Maxi=0,Mini=0;//k和j用来记录第几个相对于上一个较大/小,最后就相当于是记录第几个是最大/小 14 scanf("%d",&n); 15 struct stu ss[n];//重命名结构体为一个结构体数组,表示学生数 16 for(i=0;i<n;++i)//for循环输入 17 { 18 scanf("%s%s%d",&ss[i].Name,&ss[i].Num,&ss[i].Grade); 19 } 20 Maxi=ss[0].Grade;//定义最大最小值为第一个 21 Mini=ss[0].Grade; 22 for(i=0;i<n-1;++i)//这里是n-1,因为下面写i+1,i最多取到n-2,i+1就是n-1,这样做是为了跳过ss[0].Grade,因为我定义的最大最小值是那么多(当然你也可以,直接小于n,下面写i,因为这里面并没有相等情况的处理 23 { 24 if(Maxi < ss[i+1].Grade) 25 { 26 Maxi=ss[i+1].Grade;//谁大就让谁等于Maxi 27 k=i+1;//记录下这是第几个学生 28 } 29 } 30 for(i=0;i<n-1;++i) 31 { 32 if(Mini > ss[i+1].Grade) 33 { 34 Mini=ss[i+1].Grade;//同上 35 j=i+1; 36 } 37 } 38 printf("%s %s\n%s %s",ss[k].Name,ss[k].Num,ss[j].Name,ss[j].Num);//输出结果 39 return 0; 40 }
在第18排代码那里,在Ubuntu16.04LTS中,用g++运行,出现警告char*....char*[10],需要在是、那两个字符串后面添上[10]才能没有警告,而在pat提交中如果有[10]会显示答案错误。有点迷。
刚开始我是用二维数组的方法做出来的。刚刚依照上面的方法改了下,对了,哈哈嗝!
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main(void) 6 { 7 int n,i,k=0,m=0,j=0,maxi=0,mini=0;//跟上面类似就不多解释 8 scanf("%d",&n); 9 char name[n][11],num[n][11];//n表示学生数后面储存字符串,这种定义方法C99允许,或许有些编译器会报错,需要改一下标准 10 int grade[n]; 11 for(i=0;i<n;i++)//循环输入 12 { 13 scanf("%s%s%d",&name[i],&num[i],&grade[i]); 14 } 15 maxi=grade[0];//假设最大/小值是第一个 16 mini=grade[0]; 17 for(i=0;i<n;++i) 18 { 19 if(maxi<grade[i]) 20 { 21 maxi=grade[i];//谁大,让maxi等于它 22 m=i;//记录下这是第几个 23 } 24 } 25 for(i=0;i<n;i++) 26 { 27 if(mini>grade[i])//与上面类似 28 { 29 mini=grade[i]; 30 j=i; 31 } 32 } 33 printf("%s %s\n%s %s",name[m],num[m],name[j],num[j]); 34 return 0; 35 }

浙公网安备 33010602011771号