程序设计与问题求解下实验答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验数组、结构体和函数综合编程练习
1.学生成绩统计
从键盘输入一个班(全班最多不超过30 人)学生某门课的成绩,当输入成绩为
负值时,输入结束,分别实现下列功能:
(1)统计不及格人数并打印不及格学生名单;
(2)统计成绩在全班平均分及平均分之上的学生人数,并打印这些学生的名单;(3)统计各分数段的学生人数及所占的百分比。
注:将成绩分为六个分数段,60 分以下为第0 段,60~69 为第1 段,70~79 为第2 段,80~89 为第3 段,90~99为第4 段,100 分为第5 段。
编程要求:
1. 较好的用户输入输出提示信息
2. 使用子函数来实现上述各个功能,并且要使用结构体数组来实现,该结构体中包括学生学号和成绩
3. 最好不要使用全局变量
#include
#define ARR_SIZE 30
typedef struct tagStudent
{
long num;//学生学号
float score;//学生分数
}Student;
int ReadScore(Student stu[]);
int GetFail(Student stu[], int n);
float GetAver(Student stu[], int n);
int GetAboveAver(Student stu[], int n);
void GetDetail(Student stu[], int n);
main()
{
int n, fail, aboveAver;
Student stu[ARR_SIZE];
printf("Please enter num and score until score<0:\n");
n = ReadScore(stu);
printf("Total students:%d\n", n);
fail = GetFail(stu, n);
printf("Fail students = %d\n",fail);
aboveAver = GetAboveAver(stu, n);
printf("Above aver students = %d\n", aboveAver);
GetDetail(stu, n);
}
/* 函数功能:从键盘输入一个班学生某门课的成绩及其学号当输入成绩为负值时,输入结束
函数参数:存放学生信息的Student 结构体数组
函数返回值:学生总数
*/
int ReadScore(Student stu[])
{
int i = 0;
scanf("%ld%f", &stu[i].num, &stu[i].score);
while (stu[i].score >= 0)
{
i++;
scanf("%ld%f", &stu[i].num, &stu[i].score);
}
return i;
}
/* 函数功能:统计不及格人数并打印不及格学生名单
函数参数:存放学生信息的Student 结构体数组
整型变量n,存放学生总数
函数返回值:不及格人数
*/
int GetFail(Student stu[], int n)
{
int i, count;
printf("Fail:\nnumber--score\n");
count = 0;
for (i=0; i { if (stu[i].score < 60) { printf("%ld------%.0f\n", stu[i].num, stu[i].score); count++; } } return count; } /* 函数功能:计算全班平均分 函数参数:存放学生信息的Student 结构体数组 整型变量n,存放学生总数 函数返回值:平均分 */ float GetAver(Student stu[], int n) { int i; float sum = 0; for (i=0; i { sum = sum + stu[i].score; } return sum/n; } /* 函数功能:统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单函数参数:存放学生信息的Student 结构体数组 整型变量n,存放学生总数 函数返回值:成绩在全班平均分及平均分之上的学生人数 */ int GetAboveAver(Student stu[], int n) { int i, count; float aver; aver = GetAver(stu, n); printf("aver = %f\n", aver); printf("Above aver:\nnumber--score\n"); count = 0; for (i=0; i { if (stu[i].score >= aver) { printf("%ld------%.0f\n", stu[i].num, stu[i].score); count++; } } return count; } /* 函数功能:统计各分数段的学生人数及所占的百分比 函数参数:存放学生信息的Student 结构体数组 整型变量n,存放学生总数 函数返回值:无 */ void GetDetail(Student stu[], int n) { int i, j, stuLevel[6]; for (i=0; i<6; i++) { stuLevel[i]=0; } for (i=0; i { if (stu[i].score < 60) { j = 0; } else { j = ((int)stu[i].score - 50) / 10; } stuLevel[j]++; } for (i=0; i<6; i++) { if (i == 0) { printf("< 60 %d %.2f%%\n", stuLevel[i], (float)stuLevel[i]/(float)n*100); }