编写一个c语言程序:对一个有N个学生的班级,每个学生有3门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。功能要求: (1)本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。 (2)本系统显示这样的菜单: 系统功能选项: a、 数据导入及显示 b、新记录输入 c、 删除记录 d、成绩查询 e、 成绩修改( 要求先输入密码) f、 成绩排序 (可按单科排序或按平均分排序) b、 成绩保存 c、 成绩统计 1)显示每门课程成绩最高的学生的基本信息 2)显示每门课程的平均成绩 3)显示超过某门课程平均成绩的学生人数 g、 退出系统
时间: 2023-06-27 19:05:33 浏览: 90
一个使用C语言设计的学生成绩管理系统完全可以用于期末作业实现
5星 · 资源好评率100%
以下是一个简单的C语言实现,实现上述功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 最大学生数
#define COURSE_NUM 3 // 课程数
// 学生结构体
typedef struct student {
char id[20]; // 学号
char name[20]; // 姓名
float courses[COURSE_NUM]; // 3门课程成绩
float avg; // 平均分
} Student;
// 学生数组
Student students[MAX_STUDENT_NUM];
// 当前学生数
int student_num = 0;
// 密码
char password[] = "123456";
// 显示菜单
void show_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("i、 退出系统\n");
}
// 数据导入及显示
void import_display_data() {
printf("请输入学生数:");
scanf("%d", &student_num);
for (int i = 0; i < student_num; i++) {
printf("请输入第%d个学生信息:\n", i+1);
printf("学号:");
scanf("%s", students[i].id);
printf("姓名:");
scanf("%s", students[i].name);
for (int j = 0; j < COURSE_NUM; j++) {
printf("课程%d:", j+1);
scanf("%f", &students[i].courses[j]);
students[i].avg += students[i].courses[j];
}
students[i].avg /= COURSE_NUM;
}
// 显示学生信息
printf("\n学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");
for (int i = 0; i < student_num; i++) {
printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", students[i].id, students[i].name, students[i].courses[0], students[i].courses[1], students[i].courses[2], students[i].avg);
}
}
// 新记录输入
void input_new_record() {
if (student_num == MAX_STUDENT_NUM) {
printf("班级已满,无法添加新记录!\n");
return;
}
printf("请输入学生信息:\n");
printf("学号:");
scanf("%s", students[student_num].id);
printf("姓名:");
scanf("%s", students[student_num].name);
for (int j = 0; j < COURSE_NUM; j++) {
printf("课程%d:", j+1);
scanf("%f", &students[student_num].courses[j]);
students[student_num].avg += students[student_num].courses[j];
}
students[student_num].avg /= COURSE_NUM;
student_num++;
printf("添加成功!\n");
}
// 删除记录
void delete_record() {
char id[20];
int index = -1;
printf("请输入要删除的学生学号:");
scanf("%s", id);
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("未找到该学生记录!\n");
return;
}
for (int i = index; i < student_num - 1; i++) {
students[i] = students[i+1];
}
student_num--;
printf("删除成功!\n");
}
// 成绩查询
void query_score() {
char id[20];
int index = -1;
printf("请输入要查询的学生学号:");
scanf("%s", id);
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("未找到该学生记录!\n");
return;
}
printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");
printf("%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", students[index].id, students[index].name, students[index].courses[0], students[index].courses[1], students[index].courses[2], students[index].avg);
}
// 成绩修改
void modify_score() {
char id[20];
int index = -1;
char input_password[20];
printf("请输入要修改的学生学号:");
scanf("%s", id);
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
if (index == -1) {
printf("未找到该学生记录!\n");
return;
}
printf("请输入密码:");
scanf("%s", input_password);
if (strcmp(input_password, password) != 0) {
printf("密码错误,无法修改成绩!\n");
return;
}
printf("请输入新成绩:\n");
for (int j = 0; j < COURSE_NUM; j++) {
printf("课程%d:", j+1);
scanf("%f", &students[index].courses[j]);
students[index].avg += students[index].courses[j];
}
students[index].avg /= COURSE_NUM;
printf("修改成功!\n");
}
// 按平均分排序
int cmp_by_avg(const void* a, const void* b) {
Student *p1 = (Student*)a;
Student *p2 = (Student*)b;
if (p1->avg < p2->avg) {
return 1;
} else if (p1->avg > p2->avg) {
return -1;
} else {
return 0;
}
}
// 按单科成绩排序
int cmp_by_course(const void* a, const void* b) {
Student *p1 = (Student*)a;
Student *p2 = (Student*)b;
if (p1->courses[0] < p2->courses[0]) {
return 1;
} else if (p1->courses[0] > p2->courses[0]) {
return -1;
} else {
return 0;
}
}
// 成绩排序
void sort_score() {
char c;
printf("请选择排序方式(a、按平均分排序;b、按课程1成绩排序):");
scanf("%s", &c);
switch (c) {
case 'a':
qsort(students, student_num, sizeof(Student), cmp_by_avg);
printf("按平均分排序成功!\n");
break;
case 'b':
qsort(students, student_num, sizeof(Student), cmp_by_course);
printf("按课程1成绩排序成功!\n");
break;
default:
printf("无效的选项!\n");
break;
}
}
// 成绩保存
void save_score() {
FILE *fp;
char filename[20];
printf("请输入保存文件名:");
scanf("%s", filename);
fp = fopen(filename, "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return;
}
fprintf(fp, "学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");
for (int i = 0; i < student_num; i++) {
fprintf(fp, "%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", students[i].id, students[i].name, students[i].courses[0], students[i].courses[1], students[i].courses[2], students[i].avg);
}
fclose(fp);
printf("保存成功!\n");
}
// 成绩统计
void stat_score() {
float course_avg[COURSE_NUM] = {0};
float max_score[COURSE_NUM] = {0};
int max_index[COURSE_NUM] = {-1};
int over_avg_num[COURSE_NUM] = {0};
// 计算每门课程的平均分和最高分
for (int i = 0; i < student_num; i++) {
for (int j = 0; j < COURSE_NUM; j++) {
course_avg[j] += students[i].courses[j];
if (students[i].courses[j] > max_score[j]) {
max_score[j] = students[i].courses[j];
max_index[j] = i;
}
}
}
for (int j = 0; j < COURSE_NUM; j++) {
course_avg[j] /= student_num;
}
// 计算超过平均分的学生人数
for (int i = 0; i < student_num; i++) {
for (int j = 0; j < COURSE_NUM; j++) {
if (students[i].courses[j] > course_avg[j]) {
over_avg_num[j]++;
}
}
}
// 显示每门课程成绩最高的学生的基本信息
printf("每门课程成绩最高的学生信息:\n");
printf("课程\t学号\t姓名\t成绩\n");
for (int j = 0; j < COURSE_NUM; j++) {
printf("%d\t%s\t%s\t%.2f\n", j+1, students[max_index[j]].id, students[max_index[j]].name, max_score[j]);
}
// 显示每门课程的平均成绩
printf("每门课程的平均成绩:\n");
printf("课程\t平均分\n");
for (int j = 0; j < COURSE_NUM; j++) {
printf("%d\t%.2f\n", j+1, course_avg[j]);
}
// 显示超过某门课程平均成绩的学生人数
printf("超过某门课程平均成绩的学生人数:\n");
printf("课程\t人数\n");
for (int j = 0; j < COURSE_NUM; j++) {
printf("%d\t%d\n", j+1, over_avg_num[j]);
}
}
int main() {
char c;
while (1) {
show_menu();
printf("请输入选项:");
scanf("%s", &c);
switch (c) {
case 'a':
import_display_data();
break;
case 'b':
input_new_record();
break;
case 'c':
delete_record();
break;
case 'd':
query_score();
break;
case 'e':
modify_score();
break;
case 'f':
sort_score();
break;
case 'g':
save_score();
break;
case 'h':
stat_score();
break;
case 'i':
printf("已退出系统!\n");
return 0;
default:
printf("无效的选项!\n");
break;
}
printf("\n");
}
return 0;
}
```
注意,上述代码仅作参考,实际应用中可能需要进行更多的错误处理和优化。
阅读全文