题目:
有n个学生,每个学生的数据包括学号(num)、姓名(name[20])、性别(sex)、年龄(age),
以及三门课程的成绩(score[3])。要求:在main()函数中输入这些学生的这些数据,
然后设计一个函数count()来计算每个学生的总分和平均分,
最后,打印出所有数据信息(包含原来输入的学生原始数据信息和求解出来的新信息)如果假定成绩最好和最差的人的个数不一定唯一,
程序应该如何修改才能完成求出所有最好和最差者,
以及输出它们。
思路:
首先这里需要输入的学生的数据类型这么多,可以考虑使用结构体struct,然后再主函数里面
利用结构体,输入学生的基本信息。再创建一个count 函数,通过传地址和传值两种方式将我们的结构体内的数据通过count进行处理,
然后再对结构体数组的数据,通过averag值的大小,把结构体数组内的数据经进行从小打大进行排列处理,所以
最大的数,必然是最后一个,那么只要和最后一个average平均数相等的,都是最大值,
同样的道理,那么排列后的结构体数组,第一个必然时最小值,那么此时只要,结构体数组里面有一个数与最小值相等,
则可以求出最小值与最大值的方法(当然你也可以用其他的方法),然后再输出最大值与最小值的同学信息即可!
实现代码:
#include<stdio.h> #include<string.h> #define N 100 struct student { int sno; char name[20]; char sex[4]; int age; int score[3]; int sum; float average; }; void count(struct student *,int ); void count(struct student *st,int num ) { int i,j; struct student temp; float max=0,min=0; for(i=0;i<num;i++) { st[i].sum=st[i].score[0]+st[i].score[1]+st[i].score[2]; st[i].average=st[i].sum/3.0; } printf("\n\t学号\t 姓名 \t性别\t语文\t英语\t高数\t总分\t平均分\n"); for(i=0;i<num;i++) { printf("\t%d %s %s\t%d\t%d\t%d\t%d\t%f\n",st[i].sno,st[i].name,st[i].sex,st[i].score[0],st[i].score[1],st[i].score[2],st[i].sum,st[i].average); } for(i=0;i<num-1;i++) { for(j=i+1;j<num;j++) { if(st[i].average>st[j].average) { temp=st[i]; st[i]=st[j]; st[j]=temp; } } } printf("\n\t学号\t 姓名 \t性别\t语文\t英语\t高数\t总分\t平均分\n"); for(i=0;i<num;i++) { printf("\t%d %s %s\t%d\t%d\t%d\t%d\t%f\n",st[i].sno,st[i].name,st[i].sex,st[i].score[0],st[i].score[1],st[i].score[2],st[i].sum,st[i].average); } int max_size=0; int min_size=0; for(i=0;i<num;i++) { if(st[num-1].average==st[i].average) { ++max_size; } if(st[0].average==st[i].average) { ++min_size; } } printf("Max_size=%d\n",max_size); printf("Min_size=%d\n",min_size); for(i=0;i<num;i++) { if(st[i].average==st[num-1].average) { printf("\n\t学号\t 姓名 \t性别\t语文\t英语\t高数\t总分\t平均分\n"); printf("\t%d %s %s\t%d\t%d\t%d\t%d\t%f\n",st[i].sno,st[i].name,st[i].sex,st[i].score[0],st[i].score[1],st[i].score[2],st[i].sum,st[i].average); } if(st[i].average==st[0].average) { printf("\n\t学号\t 姓名 \t性别\t语文\t英语\t高数\t总分\t平均分\n"); printf("\t%d %s %s\t%d\t%d\t%d\t%d\t%f\n",st[i].sno,st[i].name,st[i].sex,st[i].score[0],st[i].score[1],st[i].score[2],st[i].sum,st[i].average); } } getch(); return; } int main() { int i; struct student st[N]; int num1;//需要输入的学生人数 printf("请输入录入人数:\n"); scanf("%d",&num1); if(N<num1) { num1=N; printf("最大人数为N=100!\n"); } for(i=0;i<num1;i++) { printf("姓名:");scanf("%s",st[i].name); printf("学号:");scanf("%d",&st[i].sno);getchar(); printf("性别:");scanf("%s",&st[i].sex); printf("语文成绩:");scanf("%3d",&st[i].score[0]); printf("英语四级成绩:");scanf("%3d",&st[i].score[1]); printf("高数成绩:");scanf("%3d",&st[i].score[2]); } count(st,num1); return 0; }