某班有M人(具体人数由键盘输入)参加期末考试,有N门课程(具体课程数由键盘输入)用C语言编程实现包括以下功能的菜单驱动的学生成绩管理系统。 录入每个学生的学号、姓名和各科成绩;分别计算每门课程及每个学生的总分和平均分;按照总分进行升序或者降序排序;按照学号升序排序;插入学生一条记录;按照姓名查找,并删除一条记录;查找并显示一条信息;输出每个学生的学号、姓名、各科成绩、总分和分均分;将学生记录写入到文件;从文件中读出学生记录。用dev-c++写程序
时间: 2024-03-10 10:48:22 浏览: 36
好的,下面是该程序的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
#define MAX_M 100
typedef struct {
int id;
char name[20];
int score[MAX_N];
int total_score;
double average_score;
} Student;
int n, m;
Student students[MAX_M];
void input_students() {
printf("请输入学生信息:\n");
for (int i = 0; i < m; i++) {
printf("请输入第%d个学生的学号:", i + 1);
scanf("%d", &students[i].id);
printf("请输入第%d个学生的姓名:", i + 1);
scanf("%s", students[i].name);
for (int j = 0; j < n; j++) {
printf("请输入第%d个学生的第%d门成绩:", i + 1, j + 1);
scanf("%d", &students[i].score[j]);
students[i].total_score += students[i].score[j];
}
students[i].average_score = (double) students[i].total_score / n;
}
}
void calculate_scores() {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int score = students[i].score[j];
int total_score = students[i].total_score;
double average_score = students[i].average_score;
int count = m;
for (int k = 0; k < m; k++) {
if (students[k].score[j] == 0) {
count--;
}
}
double average = (double) (total_score - score) / (n - 1) * count / m;
students[i].average_score = average;
}
}
}
void sort_by_total_score(int is_descending) {
for (int i = 0; i < m - 1; i++) {
for (int j = 0; j < m - i - 1; j++) {
int s1 = students[j].total_score;
int s2 = students[j + 1].total_score;
if ((is_descending && s1 < s2) || (!is_descending && s1 > s2)) {
Student tmp = students[j];
students[j] = students[j + 1];
students[j + 1] = tmp;
}
}
}
}
void sort_by_id() {
for (int i = 0; i < m - 1; i++) {
for (int j = 0; j < m - i - 1; j++) {
int id1 = students[j].id;
int id2 = students[j + 1].id;
if (id1 > id2) {
Student tmp = students[j];
students[j] = students[j + 1];
students[j + 1] = tmp;
}
}
}
}
void insert_student() {
printf("请输入要插入的学生信息:\n");
printf("请输入学生的学号:");
scanf("%d", &students[m].id);
printf("请输入学生的姓名:");
scanf("%s", students[m].name);
for (int j = 0; j < n; j++) {
printf("请输入学生的第%d门成绩:", j + 1);
scanf("%d", &students[m].score[j]);
students[m].total_score += students[m].score[j];
}
students[m].average_score = (double) students[m].total_score / n;
m++;
}
void delete_student() {
char name[20];
printf("请输入要删除的学生姓名:");
scanf("%s", name);
for (int i = 0; i < m; i++) {
if (strcmp(name, students[i].name) == 0) {
for (int j = i; j < m - 1; j++) {
students[j] = students[j + 1];
}
m--;
printf("删除成功!\n");
return;
}
}
printf("未找到该学生!\n");
}
void search_student() {
char name[20];
printf("请输入要查找的学生姓名:");
scanf("%s", name);
for (int i = 0; i < m; i++) {
if (strcmp(name, students[i].name) == 0) {
printf("学号:%d\n", students[i].id);
printf("姓名:%s\n", students[i].name);
for (int j = 0; j < n; j++) {
printf("第%d门成绩:%d\n", j + 1, students[i].score[j]);
}
printf("总分:%d\n", students[i].total_score);
printf("平均分:%.2f\n", students[i].average_score);
return;
}
}
printf("未找到该学生!\n");
}
void output_students() {
for (int i = 0; i < m; i++) {
printf("学号:%d\n", students[i].id);
printf("姓名:%s\n", students[i].name);
for (int j = 0; j < n; j++) {
printf("第%d门成绩:%d\n", j + 1, students[i].score[j]);
}
printf("总分:%d\n", students[i].total_score);
printf("平均分:%.2f\n", students[i].average_score);
}
}
void write_students_to_file() {
FILE *fp = fopen("students.txt", "w");
if (fp == NULL) {
printf("打开文件失败!\n");
return;
}
for (int i = 0; i < m; i++) {
fprintf(fp, "%d\t%s", students[i].id, students[i].name);
for (int j = 0; j < n; j++) {
fprintf(fp, "\t%d", students[i].score[j]);
}
fprintf(fp, "\t%d\t%.2f\n", students[i].total_score, students[i].average_score);
}
fclose(fp);
printf("学生记录已写入文件!\n");
}
void read_students_from_file() {
FILE *fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("打开文件失败!\n");
return;
}
int count = 0;
while (!feof(fp)) {
fscanf(fp, "%d\t%s", &students[count].id, students[count].name);
for (int j = 0; j < n; j++) {
fscanf(fp, "\t%d", &students[count].score[j]);
students[count].total_score += students[count].score[j];
}
students[count].average_score = (double) students[count].total_score / n;
count++;
}
m = count;
fclose(fp);
printf("学生记录已从文件中读入!\n");
}
void print_menu() {
printf("*************************\n");
printf("* 学生成绩管理系统 *\n");
printf("*************************\n");
printf("* 1. 录入学生信息 *\n");
printf("* 2. 计算各门课程及学生总分和平均分 *\n");
printf("* 3. 按照总分进行升序排序 *\n");
printf("* 4. 按照总分进行降序排序 *\n");
printf("* 5. 按照学号进行升序排序 *\n");
printf("* 6. 插入学生记录 *\n");
printf("* 7. 按照姓名查找并删除一条记录 *\n");
printf("* 8. 查找并显示一条信息 *\n");
printf("* 9. 输出每个学生的学号、姓名、各科成绩、总分和平均分 *\n");
printf("* 10. 将学生记录写入到文件 *\n");
printf("* 11. 从文件中读出学生记录 *\n");
printf("* 0. 退出程序 *\n");
printf("*************************\n");
}
int main() {
int choice;
while (1) {
print_menu();
printf("请输入您的选择:");
scanf("%d", &choice);
switch (choice) {
case 0:
printf("程序已退出!\n");
return 0;
case 1:
input_students();
break;
case 2:
calculate_scores();
printf("计算完成!\n");
break;
case 3:
sort_by_total_score(0);
printf("按总分升序排序完成!\n");
break;
case 4:
sort_by_total_score(1);
printf("按总分降序排序完成!\n");
break;
case 5:
sort_by_id();
printf("按学号升序排序完成!\n");
break;
case 6:
insert_student();
break;
case 7:
delete_student();
break;
case 8:
search_student();
break;
case 9:
output_students();
break;
case 10:
write_students_to_file();
break;
case 11:
read_students_from_file();
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
return 0;
}
```
注意,该程序实现了菜单驱动,用户可以根据需要选择不同的功能进行操作。你可以根据需要自行修改和完善该程序。