用C语言实现某班最多不超过30人(具体人数由键盘输入)参加期末考试,最多不超过6门(具体 门数由键盘输入)。请使用模块化程序设计方法编程实现如下菜单驱动的学生成绩管理系统:(1)输入每个学生的学号、姓名和各科考试成绩; (2)计算每门课程的总分和平均分; (3)计算每个学生的总分和平均分; (4)按每个学生的总分由高到低排出名次表; (5)按每个学生的总分由低到高排出名次表; (6)按学号由小到大排出成绩表; (7)按学号查询学生排名及其考试成绩;(8)按姓名查询学生排名及其考试成绩;(9)按优秀(90~100、良好(80~89)、中等(70~79)、及格(60~69)、不及格(0~59) 5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;(10)输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分。
时间: 2023-12-22 21:05:12 浏览: 182
为了实现以上功能,我们可以将程序分为以下几个模块:
1.输入每个学生的学号、姓名和各科考试成绩
2.计算每门课程的总分和平均分
3.计算每个学生的总分和平均分
4.按每个学生的总分由高到低排出名次表
5.按每个学生的总分由低到高排出名次表
6.按学号由小到大排出成绩表
7.按学号查询学生排名及其考试成绩
8.按姓名查询学生排名及其考试成绩
9.按优秀、良好、中等、及格、不及格5个类别,对每门课程分别统计每个类别的人数以及所占的百分比
10.输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分
接下来我们逐个模块进行实现。
1.输入每个学生的学号、姓名和各科考试成绩
```c
#include <stdio.h>
#define MAX_STUDENT 30
#define MAX_SUBJECT 6
struct student {
int id;
char name[20];
float score[MAX_SUBJECT];
};
void input_student(struct student *stu, int n)
{
int i, j;
for (i = 0; i < n; i++) {
printf("请输入第%d个学生的学号:", i + 1);
scanf("%d", &stu[i].id);
printf("请输入第%d个学生的姓名:", i + 1);
scanf("%s", stu[i].name);
for (j = 0; j < MAX_SUBJECT; j++) {
printf("请输入第%d个学生的第%d门课程成绩:", i + 1, j + 1);
scanf("%f", &stu[i].score[j]);
}
}
}
```
2.计算每门课程的总分和平均分
```c
void calc_subject(struct student *stu, int n)
{
int i, j;
float sum[MAX_SUBJECT], avg[MAX_SUBJECT];
for (j = 0; j < MAX_SUBJECT; j++) {
sum[j] = 0;
for (i = 0; i < n; i++) {
sum[j] += stu[i].score[j];
}
avg[j] = sum[j] / n;
printf("第%d门课程的总分为%.2f,平均分为%.2f\n", j + 1, sum[j], avg[j]);
}
}
```
3.计算每个学生的总分和平均分
```c
void calc_student(struct student *stu, int n)
{
int i, j;
float sum, avg;
for (i = 0; i < n; i++) {
sum = 0;
for (j = 0; j < MAX_SUBJECT; j++) {
sum += stu[i].score[j];
}
avg = sum / MAX_SUBJECT;
printf("学号:%d,姓名:%s,总分为:%.2f,平均分为:%.2f\n", stu[i].id, stu[i].name, sum, avg);
}
}
```
4.按每个学生的总分由高到低排出名次表
```c
void sort_student_desc(struct student *stu, int n)
{
int i, j;
struct student tmp;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (stu[j].score > stu[i].score) {
tmp = stu[i];
stu[i] = stu[j];
stu[j] = tmp;
}
}
}
printf("按总分由高到低排出名次表:\n");
for (i = 0; i < n; i++) {
printf("第%d名:学号:%d,姓名:%s,总分为:%.2f\n", i + 1, stu[i].id, stu[i].name, stu[i].score);
}
}
```
5.按每个学生的总分由低到高排出名次表
```c
void sort_student_asc(struct student *stu, int n)
{
int i, j;
struct student tmp;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (stu[j].score < stu[i].score) {
tmp = stu[i];
stu[i] = stu[j];
stu[j] = tmp;
}
}
}
printf("按总分由低到高排出名次表:\n");
for (i = 0; i < n; i++) {
printf("第%d名:学号:%d,姓名:%s,总分为:%.2f\n", i + 1, stu[i].id, stu[i].name, stu[i].score);
}
}
```
6.按学号由小到大排出成绩表
```c
void sort_student_id(struct student *stu, int n)
{
int i, j;
struct student tmp;
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if (stu[j].id < stu[i].id) {
tmp = stu[i];
stu[i] = stu[j];
stu[j] = tmp;
}
}
}
printf("按学号由小到大排出成绩表:\n");
for (i = 0; i < n; i++) {
printf("学号:%d,姓名:%s,各科成绩:", stu[i].id, stu[i].name);
for (j = 0; j < MAX_SUBJECT; j++) {
printf("%.2f ", stu[i].score[j]);
}
printf("\n");
}
}
```
7.按学号查询学生排名及其考试成绩
```c
void search_student_id(struct student *stu, int n)
{
int i, id;
printf("请输入要查询的学生学号:");
scanf("%d", &id);
for (i = 0; i < n; i++) {
if (stu[i].id == id) {
printf("学号:%d,姓名:%s,总分为:%.2f,排名为第%d名,各科成绩为:", stu[i].id, stu[i].name, stu[i].score, i + 1);
for (j = 0; j < MAX_SUBJECT; j++) {
printf("%.2f ", stu[i].score[j]);
}
printf("\n");
break;
}
}
if (i == n) {
printf("未找到该学生!\n");
}
}
```
8.按姓名查询学生排名及其考试成绩
```c
void search_student_name(struct student *stu, int n)
{
int i, j;
char name[20];
printf("请输入要查询的学生姓名:");
scanf("%s", name);
for (i = 0; i < n; i++) {
if (strcmp(stu[i].name, name) == 0) {
printf("学号:%d,姓名:%s,总分为:%.2f,排名为第%d名,各科成绩为:", stu[i].id, stu[i].name, stu[i].score, i + 1);
for (j = 0; j < MAX_SUBJECT; j++) {
printf("%.2f ", stu[i].score[j]);
}
printf("\n");
break;
}
}
if (i == n) {
printf("未找到该学生!\n");
}
}
```
9.按优秀、良好、中等、及格、不及格5个类别,对每门课程分别统计每个类别的人数以及所占的百分比
```c
void stat_score(struct student *stu, int n)
{
int i, j;
int excellent[MAX_SUBJECT] = {0}, good[MAX_SUBJECT] = {0}, medium[MAX_SUBJECT] = {0}, pass[MAX_SUBJECT] = {0}, fail[MAX_SUBJECT] = {0};
float percent;
for (j = 0; j < MAX_SUBJECT; j++) {
for (i = 0; i < n; i++) {
if (stu[i].score[j] >= 90) {
excellent[j]++;
} else if (stu[i].score[j] >= 80) {
good[j]++;
} else if (stu[i].score[j] >= 70) {
medium[j]++;
} else if (stu[i].score[j] >= 60) {
pass[j]++;
} else {
fail[j]++;
}
}
percent = (float)(excellent[j] + good[j] + medium[j] + pass[j] + fail[j]) / n * 100;
printf("第%d门课程:优秀:%d人,良好:%d人,中等:%d人,及格:%d人,不及格:%d人,占比:%.2f%%\n", j + 1, excellent[j], good[j], medium[j], pass[j], fail[j], percent);
}
}
```
10.输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分
```c
void output_student(struct student *stu, int n)
{
int i, j;
float sum[MAX_SUBJECT], avg[MAX_SUBJECT];
printf("学号\t姓名");
for (j = 0; j < MAX_SUBJECT; j++) {
printf("\t科目%d", j + 1);
}
printf("\t总分\t平均分\n");
for (i = 0; i < n; i++) {
sum[i] = 0;
printf("%d\t%s", stu[i].id, stu[i].name);
for (j = 0; j < MAX_SUBJECT; j++) {
printf("\t%.2f", stu[i].score[j]);
sum[i] += stu[i].score[j];
}
avg[i] = sum[i] / MAX_SUBJECT;
printf("\t%.2f\t%.2f\n", sum[i], avg[i]);
}
for (j = 0; j < MAX_SUBJECT; j++) {
sum[j] = 0;
for (i = 0; i < n; i++) {
sum[j] += stu[i].score[j];
}
avg[j] = sum[j] / n;
printf("科目%d总分为:%.2f,平均分为:%.2f\n", j + 1, sum[j], avg[j]);
}
}
```
最后,我们将以上模块整合到一个完整的程序中,并在主函数中通过菜单驱动方式调用不同的模块即可实现学生成绩管理系统。
阅读全文