题目:
输入多个学生的学号、姓名和成绩,然后输出成绩最高的哪个学生的姓名和学号
输入描述:
输入包含多组样例。
每组样例包含一个整数N,代表有N个学生。
接下来N行依次输入每个学生的学号、姓名和成绩。
若N = 0,则表示输入结束,这个样例不需要被处理。
输出描述:
对于每组用例,你应当输出这组样例N个学生中成绩最高的学生的姓名和学号,每个输出占一行。
样例输入:
2
1000 mingming 89
1001 lingling 90
3
1090 huanghuang 88
1076 zhouzhou 76
1003 xiaohong 87
0
样例输出:
1001 lingling
1090 huanghuang
代码实现:(编译环境:CLion)
#include<stdio.h>
#include<stdlib.h>
struct student{
int No;
char name[100][100];
int score;
}t[100];
void line(int *N)
{
int j,max=0,n=0;
for(j=0;j<(*N);j++) {
scanf("%d", &t[j].No);
scanf("%s", t[j].name[j]);
scanf("%d", &t[j].score);
}
for (j = 0; j < (*N); j++) {
if(t[j].score>=max)
{
n=j;
max=t[j].score;
}
}
printf("%d %s",t[n].No,t[n].name[n]);
printf("\n");
}
int main()
{
int i;
int *N;
N=malloc(100*sizeof(int));
for(i=0;;i++)
{
scanf("%d",N);
if((*N)==0)
{
printf("\n");
break;
}
line(N);
N++;
}
return 0;
}
注意:在开始写这个代码时没有用到malloc或者calloc函数,但运行过程中出了问题,编译器给出信号“Segmentation fault”,可能原因是程序包含了非法的内存访问,数组越界,指针漂移,调用系统禁用的系统函数等,数组空间足够应该不存在数组越界问题,所以我认为问题出在指针,因此直接利用calloc给N分配内存空间,但是情况并没有改变。于是我尝试将代码复制到Dev C++上运行,系统报错“[Warning] array 't' assumed to have one element”,说明问题出在开始的结构体数组t[]上,定义一个大小,t[100],问题得以解决。在CLion上不会报错,系统允许运行,但是仍然不会完美运行,比如程序在输入0后仍然不会立马结束,而Dev C++则直接不允许运行。这个错误源于我的大意,对于结构体数组的初始化很简单,与数组的初始化类似,也可以不指定结构体数组t的元素个数,但要直接给数组赋值而不能像我开始一样定义了却还没赋值,例如:
struct teacher
{
long num;
cahr name[20];
int age;
char sex;
char depart[30];
}t[]={{2018001,"zhang san",35,'M',"computer Department"},
{2018002,"Li Si",45,'M',"computer Department"},
{2018003,"Wang Ling",30,'F',"computer Department"}};