班级成绩管理系统 对一个有N个学生的班级,每个学生有3门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。功能要求: (1)本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。 (2)本系统显示这样的菜单: 系统功能选项: a、 数据导入及显示 b、新记录输入 c、 删除记录 d、成绩查询 e、 成绩修改( 要求先输入密码) f、 成绩排序 (可按单科排序或按平均分排序) b、 成绩保存 c、 成绩统计 1)显示每门课程成绩最高的学生的基本信息 2)显示每门课程的平均成绩 3)显示超过某门课程平均成绩的学生人数 g、 退出系统 注意:需保证学号唯一性 (该题目可用动态链表或数组完成) C语言代码
时间: 2023-06-17 11:09:04 浏览: 267
以下是使用结构体数组完成的班级成绩管理系统的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT 100 // 最大学生数
#define MAX_SUBJECT 3 // 最大科目数
// 学生结构体
struct Student {
char id[10]; // 学号
char name[20]; // 姓名
char subject[MAX_SUBJECT][20]; // 科目名称
int score[MAX_SUBJECT]; // 成绩
};
struct Student students[MAX_STUDENT]; // 学生结构体数组
int student_count = 0; // 学生数
// 函数声明
void import_display_data(); // 数据导入及显示
void add_student(); // 新记录输入
void delete_student(); // 删除记录
void search_score(); // 成绩查询
void modify_score(); // 成绩修改
void sort_score(); // 成绩排序
void save_score(); // 成绩保存
void statistic_score(); // 成绩统计
void print_menu(); // 打印菜单
void print_student(struct Student student); // 打印单个学生信息
int main() {
char choice; // 用户选择的菜单项
do {
print_menu(); // 打印菜单
printf("请输入您的选择:");
scanf(" %c", &choice); // 获取用户选择
switch (choice) {
case 'a':
import_display_data();
break;
case 'b':
add_student();
break;
case 'c':
delete_student();
break;
case 'd':
search_score();
break;
case 'e':
modify_score();
break;
case 'f':
sort_score();
break;
case 'g':
save_score();
break;
case 'h':
statistic_score();
break;
case 'q':
printf("感谢使用本系统!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (choice != 'q'); // 选择q表示退出系统
return 0;
}
// 数据导入及显示
void import_display_data() {
printf("学号\t姓名\t");
for (int i = 0; i < MAX_SUBJECT; i++) {
printf("%s\t", students[0].subject[i]);
}
printf("\n");
for (int i = 0; i < student_count; i++) {
print_student(students[i]);
}
}
// 新记录输入
void add_student() {
struct Student student;
printf("请输入学号:");
scanf("%s", student.id);
// 检查学号是否已存在
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].id, student.id) == 0) {
printf("该学号已存在,请重新输入!\n");
return;
}
}
printf("请输入姓名:");
scanf("%s", student.name);
for (int i = 0; i < MAX_SUBJECT; i++) {
printf("请输入%s的成绩:", student.subject[i]);
scanf("%d", &student.score[i]);
}
students[student_count] = student;
student_count++;
printf("添加成功!\n");
}
// 删除记录
void delete_student() {
char id[10];
printf("请输入要删除的学生学号:");
scanf("%s", id);
int index = -1;
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("该学号不存在!\n");
} else {
for (int i = index; i < student_count - 1; i++) {
students[i] = students[i + 1];
}
student_count--;
printf("删除成功!\n");
}
}
// 成绩查询
void search_score() {
char id[10];
printf("请输入要查询的学生学号:");
scanf("%s", id);
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].id, id) == 0) {
print_student(students[i]);
return;
}
}
printf("该学号不存在!\n");
}
// 成绩修改
void modify_score() {
char id[10], password[20];
printf("请输入要修改成绩的学生学号:");
scanf("%s", id);
int index = -1;
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("该学号不存在!\n");
return;
} else {
printf("请输入管理员密码:");
scanf("%s", password);
if (strcmp(password, "123456") != 0) {
printf("密码错误,无法修改成绩!\n");
return;
} else {
for (int i = 0; i < MAX_SUBJECT; i++) {
printf("请输入%s的新成绩:", students[index].subject[i]);
scanf("%d", &students[index].score[i]);
}
printf("成绩修改成功!\n");
}
}
}
// 成绩排序
void sort_score() {
char choice;
printf("请选择排序方式:\n");
printf("a. 按语文成绩排序\n");
printf("b. 按数学成绩排序\n");
printf("c. 按英语成绩排序\n");
printf("d. 按平均分排序\n");
printf("请输入您的选择:");
scanf(" %c", &choice);
switch (choice) {
case 'a':
// 按语文成绩排序
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
if (students[j].score[0] < students[j + 1].score[0]) {
struct Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按语文成绩排序成功!\n");
break;
case 'b':
// 按数学成绩排序
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
if (students[j].score[1] < students[j + 1].score[1]) {
struct Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按数学成绩排序成功!\n");
break;
case 'c':
// 按英语成绩排序
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
if (students[j].score[2] < students[j + 1].score[2]) {
struct Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按英语成绩排序成功!\n");
break;
case 'd':
// 按平均分排序
for (int i = 0; i < student_count - 1; i++) {
for (int j = 0; j < student_count - i - 1; j++) {
int sum1 = 0, sum2 = 0;
for (int k = 0; k < MAX_SUBJECT; k++) {
sum1 += students[j].score[k];
sum2 += students[j + 1].score[k];
}
if (sum1 / MAX_SUBJECT < sum2 / MAX_SUBJECT) {
struct Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按平均分排序成功!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
// 成绩保存
void save_score() {
FILE* fp = fopen("score.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
fprintf(fp, "学号\t姓名\t");
for (int i = 0; i < MAX_SUBJECT; i++) {
fprintf(fp, "%s\t", students[0].subject[i]);
}
fprintf(fp, "\n");
for (int i = 0; i < student_count; i++) {
fprintf(fp, "%s\t%s\t", students[i].id, students[i].name);
for (int j = 0; j < MAX_SUBJECT; j++) {
fprintf(fp, "%d\t", students[i].score[j]);
}
fprintf(fp, "\n");
}
fclose(fp);
printf("成绩保存成功!\n");
}
// 成绩统计
void statistic_score() {
printf("每门课程成绩最高的学生信息:\n");
for (int i = 0; i < MAX_SUBJECT; i++) {
struct Student max_student = students[0];
for (int j = 1; j < student_count; j++) {
if (students[j].score[i] > max_student.score[i]) {
max_student = students[j];
}
}
printf("%s最高分的学生是:", max_student.subject[i]);
print_student(max_student);
}
printf("每门课程的平均成绩:\n");
for (int i = 0; i < MAX_SUBJECT; i++) {
int sum = 0;
for (int j = 0; j < student_count; j++) {
sum += students[j].score[i];
}
printf("%s平均成绩为:%.2f\n", students[0].subject[i], (float) sum / student_count);
}
printf("超过某门课程平均成绩的学生人数:\n");
for (int i = 0; i < MAX_SUBJECT; i++) {
int sum = 0;
float avg_score = 0;
for (int j = 0; j < student_count; j++) {
avg_score += students[j].score[i];
}
avg_score /= student_count;
for (int j = 0; j < student_count; j++) {
if (students[j].score[i] > avg_score) {
sum++;
}
}
printf("%s超过平均分的学生人数为:%d\n", students[0].subject[i], sum);
}
}
// 打印菜单
void print_menu() {
printf("系统功能选项:\n");
printf("a. 数据导入及显示\n");
printf("b. 新记录输入\n");
printf("c. 删除记录\n");
printf("d. 成绩查询\n");
printf("e. 成绩修改\n");
printf("f. 成绩排序\n");
printf("g. 成绩保存\n");
printf("h. 成绩统计\n");
printf("q. 退出系统\n");
}
// 打印单个学生信息
void print_student(struct Student student) {
printf("%s\t%s\t", student.id, student.name);
for (int i = 0; i < MAX_SUBJECT; i++) {
printf("%d\t", student.score[i]);
}
printf("\n");
}
```
阅读全文