用c语言写出对一个有N个学生的班级,每个学生有3门课程,分别为语文,数学,语言。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。功能要求: (1)本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。 (2)本系统显示这样的菜单: 系统功能选项: a、 数据导入及显示 b、新记录输入 c、 删除记录 d、成绩查询 e、 成绩修改( 要求先输入密码) f、 成绩排序 (可按单科排序或按平均分排序) b、 成绩保存 c、 成绩统计 1)显示每门课程成绩最高的学生的基本信息 2)显示每门课程的平均成绩 3)显示超过某门课程平均成绩的学生人数 g、 退出系统 注意:需保证学号唯一性 (该题目用数组完成)
时间: 2024-01-12 19:05:12 浏览: 64
好的,我可以为你提供一个班级成绩管理系统的示例代码。代码主要实现了上述9个功能,具体实现细节可以参考代码注释。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100 // 最多学生数量
#define MAX_NAME_LEN 20 // 最长姓名长度
#define MAX_PASSWORD_LEN 20 // 最长密码长度
// 学生信息结构体
struct student {
int id; // 学号
char name[MAX_NAME_LEN]; // 姓名
int score[3]; // 3门课程的成绩
};
// 学生信息数组
struct student students[MAX_STUDENTS];
// 学生数量
int num_students = 0;
// 密码
char password[MAX_PASSWORD_LEN] = "123456"; // 默认密码为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 show_students() {
int i, j;
printf("学号\t姓名\t语文\t数学\t英语\n");
for (i = 0; i < num_students; i++) {
printf("%d\t%s\t", students[i].id, students[i].name);
for (j = 0; j < 3; j++) {
printf("%d\t", students[i].score[j]);
}
printf("\n");
}
}
// 导入学生信息
void import_students() {
FILE *fp;
fp = fopen("students.txt", "r");
if (fp == NULL) {
printf("无法打开文件\n");
return;
}
while (fscanf(fp, "%d %s %d %d %d", &students[num_students].id, students[num_students].name, &students[num_students].score[0], &students[num_students].score[1], &students[num_students].score[2]) == 5) {
num_students++;
}
fclose(fp);
}
// 保存学生信息
void save_students() {
FILE *fp;
int i, j;
fp = fopen("students.txt", "w");
if (fp == NULL) {
printf("无法打开文件\n");
return;
}
for (i = 0; i < num_students; i++) {
fprintf(fp, "%d %s", students[i].id, students[i].name);
for (j = 0; j < 3; j++) {
fprintf(fp, " %d", students[i].score[j]);
}
fprintf(fp, "\n");
}
fclose(fp);
}
// 新记录输入
void add_student() {
int id, i, j;
char name[MAX_NAME_LEN];
printf("请输入学号:");
scanf("%d", &id);
for (i = 0; i < num_students; i++) {
if (students[i].id == id) {
printf("该学号已存在\n");
return;
}
}
printf("请输入姓名:");
scanf("%s", name);
strcpy(students[num_students].name, name);
students[num_students].id = id;
for (j = 0; j < 3; j++) {
printf("请输入%s成绩:", (j == 0 ? "语文" : (j == 1 ? "数学" : "英语")));
scanf("%d", &students[num_students].score[j]);
}
num_students++;
}
// 删除记录
void delete_student() {
int id, i, j;
printf("请输入要删除的学号:");
scanf("%d", &id);
for (i = 0; i < num_students; i++) {
if (students[i].id == id) {
for (j = i; j < num_students - 1; j++) {
students[j] = students[j + 1];
}
num_students--;
printf("删除成功\n");
return;
}
}
printf("该学号不存在\n");
}
// 成绩查询
void query_score() {
int id, i, j;
printf("请输入要查询成绩的学号:");
scanf("%d", &id);
for (i = 0; i < num_students; i++) {
if (students[i].id == id) {
printf("学号\t姓名\t语文\t数学\t英语\n");
printf("%d\t%s\t", students[i].id, students[i].name);
for (j = 0; j < 3; j++) {
printf("%d\t", students[i].score[j]);
}
printf("\n");
return;
}
}
printf("该学号不存在\n");
}
// 成绩修改
void modify_score() {
int id, i, j;
char input_password[MAX_PASSWORD_LEN];
printf("请输入密码:");
scanf("%s", input_password);
if (strcmp(input_password, password) != 0) {
printf("密码错误\n");
return;
}
printf("请输入要修改成绩的学号:");
scanf("%d", &id);
for (i = 0; i < num_students; i++) {
if (students[i].id == id) {
for (j = 0; j < 3; j++) {
printf("请输入%s成绩:", (j == 0 ? "语文" : (j == 1 ? "数学" : "英语")));
scanf("%d", &students[i].score[j]);
}
printf("修改成功\n");
return;
}
}
printf("该学号不存在\n");
}
// 按照单科成绩排序
void sort_by_score(int subject) {
int i, j, max_idx, temp;
struct student max_student;
for (i = 0; i < num_students - 1; i++) {
max_idx = i;
for (j = i + 1; j < num_students; j++) {
if (students[j].score[subject] > students[max_idx].score[subject]) {
max_idx = j;
}
}
if (max_idx != i) {
max_student = students[max_idx];
students[max_idx] = students[i];
students[i] = max_student;
}
}
}
// 按照平均分排序
void sort_by_avg_score() {
int i, j, max_idx;
float max_avg_score, avg_score;
struct student max_student;
for (i = 0; i < num_students - 1; i++) {
max_idx = i;
max_avg_score = (students[i].score[0] + students[i].score[1] + students[i].score[2]) / 3.0;
for (j = i + 1; j < num_students; j++) {
avg_score = (students[j].score[0] + students[j].score[1] + students[j].score[2]) / 3.0;
if (avg_score > max_avg_score) {
max_idx = j;
max_avg_score = avg_score;
}
}
if (max_idx != i) {
max_student = students[max_idx];
students[max_idx] = students[i];
students[i] = max_student;
}
}
}
// 成绩排序
void sort_score() {
int choice;
printf("请选择排序方式(1-按语文成绩,2-按数学成绩,3-按英语成绩,4-按平均分):");
scanf("%d", &choice);
switch (choice) {
case 1:
sort_by_score(0);
break;
case 2:
sort_by_score(1);
break;
case 3:
sort_by_score(2);
break;
case 4:
sort_by_avg_score();
break;
default:
printf("无效的选择\n");
break;
}
}
// 统计成绩
void statistics() {
int i, j;
float avg_score;
int count;
printf("每门课程成绩最高的学生的基本信息:\n");
printf("科目\t学号\t姓名\t成绩\n");
for (j = 0; j < 3; j++) {
int max_score = -1;
int max_idx = -1;
for (i = 0; i < num_students; i++) {
if (students[i].score[j] > max_score) {
max_score = students[i].score[j];
max_idx = i;
}
}
printf("%s\t%d\t%s\t%d\n", (j == 0 ? "语文" : (j == 1 ? "数学" : "英语")), students[max_idx].id, students[max_idx].name, max_score);
}
printf("每门课程的平均成绩:\n");
printf("科目\t平均成绩\n");
for (j = 0; j < 3; j++) {
avg_score = 0;
for (i = 0; i < num_students; i++) {
avg_score += students[i].score[j];
}
avg_score /= num_students;
printf("%s\t%.2f\n", (j == 0 ? "语文" : (j == 1 ? "数学" : "英语")), avg_score);
}
printf("超过某门课程平均成绩的学生人数:\n");
for (j = 0; j < 3; j++) {
avg_score = 0;
for (i = 0; i < num_students; i++) {
avg_score += students[i].score[j];
}
avg_score /= num_students;
count = 0;
for (i = 0; i < num_students; i++) {
if (students[i].score[j] > avg_score) {
count++;
}
}
printf("%s\t%d\n", (j == 0 ? "语文" : (j == 1 ? "数学" : "英语")), count);
}
}
int main() {
int choice;
import_students(); // 导入学生信息
while (1) {
show_menu(); // 显示菜单
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
show_students(); // 显示学生信息
break;
case 2:
add_student(); // 新记录输入
break;
case 3:
delete_student(); // 删除记录
break;
case 4:
query_score(); // 成绩查询
break;
case 5:
modify_score(); // 成绩修改
break;
case 6:
sort_score(); // 成绩排序
break;
case 7:
save_students(); // 成绩保存
break;
case 8:
statistics(); // 成绩统计
break;
case 9:
printf("退出系统\n");
return 0;
default:
printf("无效的选择\n");
break;
}
}
return 0;
}
```
注意事项:
- 该代码中使用了文件操作,需要确保当前目录下有名为`students.txt`的文件,并且文件格式为:每行一个学生的信息,格式为`学号 姓名 语文成绩 数学成绩 英语成绩`。例如:`1 张三 80 90 70`。
- 该代码中默认密码为`123456`,可以在代码中修改。
阅读全文