用c语言写出对一个有N个学生的班级,每个学生有3门课程,分别为语文,数学,语言。该系统实现对班级成绩的录入、显示,统计等操作的管理。功能要求: (1)本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。 (2)本系统显示这样的菜单: 系统功能选项: a、 数据导入及显示 b、新记录输入 c、 成绩统计 1)显示每门课程成绩最高的学生的基本信息 2)显示每门课程的平均成绩 3)显示超过某门课程平均成绩的学生人数 g、 退出系统 注意:需保证学号唯一性 (该题目用或数组完成)
时间: 2024-03-18 11:42:13 浏览: 63
好的,以下是用 C 语言实现该系统的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_N 100
struct student {
int id;
char name[20];
float chinese;
float math;
float english;
};
struct student_class {
int n;
struct student students[MAX_N];
};
void print_menu() {
printf("系统功能选项:\n");
printf("a、数据导入及显示\n");
printf("b、新记录输入\n");
printf("c、成绩统计\n");
printf("1)显示每门课程成绩最高的学生的基本信息\n");
printf("2)显示每门课程的平均成绩\n");
printf("3)显示超过某门课程平均成绩的学生人数\n");
printf("g、退出系统\n");
}
void print_student(struct student s) {
printf("%d\t%s\t%.2f\t%.2f\t%.2f\n",
s.id, s.name, s.chinese, s.math, s.english);
}
void print_class(struct student_class cls) {
printf("学号\t姓名\t语文\t数学\t英语\n");
for (int i = 0; i < cls.n; i++) {
print_student(cls.students[i]);
}
}
int find_student(struct student_class cls, int id) {
for (int i = 0; i < cls.n; i++) {
if (cls.students[i].id == id) {
return i;
}
}
return -1;
}
void add_student(struct student_class *cls) {
if (cls->n >= MAX_N) {
printf("班级人数已满,无法添加新学生!\n");
return;
}
struct student s;
printf("请输入学生信息:\n");
printf("学号:");
scanf("%d", &s.id);
if (find_student(*cls, s.id) >= 0) {
printf("学号已存在,请重新输入!\n");
return;
}
printf("姓名:");
scanf("%s", s.name);
printf("语文成绩:");
scanf("%f", &s.chinese);
printf("数学成绩:");
scanf("%f", &s.math);
printf("英语成绩:");
scanf("%f", &s.english);
cls->students[cls->n] = s;
cls->n++;
printf("添加成功!\n");
}
struct student *get_top_student(struct student_class cls, float *max_score) {
struct student *top = NULL;
*max_score = -1;
for (int i = 0; i < cls.n; i++) {
if (cls.students[i].chinese > *max_score) {
top = &cls.students[i];
*max_score = cls.students[i].chinese;
}
if (cls.students[i].math > *max_score) {
top = &cls.students[i];
*max_score = cls.students[i].math;
}
if (cls.students[i].english > *max_score) {
top = &cls.students[i];
*max_score = cls.students[i].english;
}
}
return top;
}
float get_avg_score(struct student_class cls, int subject) {
float sum = 0;
for (int i = 0; i < cls.n; i++) {
switch (subject) {
case 1:
sum += cls.students[i].chinese;
break;
case 2:
sum += cls.students[i].math;
break;
case 3:
sum += cls.students[i].english;
break;
}
}
return sum / cls.n;
}
int count_above_avg(struct student_class cls, int subject) {
float avg_score = get_avg_score(cls, subject);
int count = 0;
for (int i = 0; i < cls.n; i++) {
switch (subject) {
case 1:
if (cls.students[i].chinese > avg_score) {
count++;
}
break;
case 2:
if (cls.students[i].math > avg_score) {
count++;
}
break;
case 3:
if (cls.students[i].english > avg_score) {
count++;
}
break;
}
}
return count;
}
int main() {
struct student_class cls = {0};
while (1) {
print_menu();
char choice;
printf("请输入选项:");
scanf(" %c", &choice);
switch (choice) {
case 'a':
print_class(cls);
break;
case 'b':
add_student(&cls);
break;
case 'c':
printf("请选择统计方式:\n");
printf("1)显示每门课程成绩最高的学生的基本信息\n");
printf("2)显示每门课程的平均成绩\n");
printf("3)显示超过某门课程平均成绩的学生人数\n");
printf("请输入选项:");
int sub_choice;
scanf("%d", &sub_choice);
switch (sub_choice) {
case 1:
printf("语文成绩最高的学生:\n");
float max_score;
print_student(*get_top_student(cls, &max_score));
printf("数学成绩最高的学生:\n");
get_top_student(cls, &max_score);
print_student(*get_top_student(cls, &max_score));
printf("英语成绩最高的学生:\n");
get_top_student(cls, &max_score);
print_student(*get_top_student(cls, &max_score));
break;
case 2:
printf("语文平均成绩:%.2f\n", get_avg_score(cls, 1));
printf("数学平均成绩:%.2f\n", get_avg_score(cls, 2));
printf("英语平均成绩:%.2f\n", get_avg_score(cls, 3));
break;
case 3:
printf("请输入课程编号(1-语文,2-数学,3-英语):");
int subject;
scanf("%d", &subject);
printf("超过平均成绩的学生人数:%d\n",
count_above_avg(cls, subject));
break;
default:
printf("无效选项!\n");
}
break;
case 'g':
printf("谢谢使用,再见!\n");
return 0;
default:
printf("无效选项!\n");
}
}
}
```
注意事项:
1. 为了保证学号的唯一性,添加学生时需要检查学号是否已存在。
2. `get_top_student()` 函数用于获取成绩最高的学生,调用时需要传入一个指向最高成绩的指针,函数会在执行过程中更新该指针指向的值。
3. `get_avg_score()` 函数用于计算平均成绩,调用时需要传入一个表示课程编号的参数(1-语文,2-数学,3-英语)。
4. `count_above_avg()` 函数用于计算超过平均成绩的学生人数,调用时同样需要传入一个表示课程编号的参数。
阅读全文