#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_STUDENT 100
#define FILENAME "student.dat"
#define SUBJECT_COUNT 5
typedef struct {
char id[12];
char name[20];
char gender[4];
int age;
float scores[SUBJECT_COUNT];
float total;
float avg;
} Student;
Student students[MAX_STUDENT];
int count = 0;
const char *subjects[] = {"语文", "数学", "英语", "物理", "化学"};
void save_data();
void load_data();
void add_student();
void input_score();
void query_student();
void sort_students();
void show_failed();
void show_statistics();
void modify_student();
void delete_student();
void display_menu();
void clear_input();
void print_student(int index);
int find_student_by_id(const char *id);
int find_student_by_name(const char *name);
void swap_students(Student *a, Student *b);
int main() {
load_data();
int choice;
while(1) {
display_menu();
printf("请输入选项:");
while(scanf("%d", &choice) != 1) {
clear_input();
printf("输入错误,请重新输入:");
}
switch(choice) {
case 1: add_student(); break;
case 2: input_score(); break;
case 3: query_student(); break;
case 4: sort_students(); break;
case 5: show_failed(); break;
case 6: show_statistics(); break;
case 7: modify_student(); break;
case 8: delete_student(); break;
case 0: save_data(); exit(0);
default: printf("无效选项!\n");
}
}
return 0;
}
void clear_input() {
while(getchar() != '\n');
}
void save_data() {
FILE *fp = fopen(FILENAME, "wb");
if(fp) {
fwrite(&count, sizeof(int), 1, fp);
fwrite(students, sizeof(Student), count, fp);
fclose(fp);
printf("\n数据已保存!\n");
} else {
printf("文件保存失败!\n");
}
}
void load_data() {
FILE *fp = fopen(FILENAME, "rb");
if(fp) {
fread(&count, sizeof(int), 1, fp);
fread(students, sizeof(Student), count, fp);
fclose(fp);
printf("数据加载成功!\n");
}
}
void add_student() {
if(count >= MAX_STUDENT) {
printf("学生数量已达上限!\n");
return;
}
Student s;
printf("\n--- 添加学生信息 ---\n");
while(1) {
printf("学号(11位数字):");
scanf("%11s", s.id);
clear_input();
int valid = 1;
for(int i=0; i<strlen(s.id); i++) {
if(!isdigit(s.id[i])) {
valid = 0;
break;
}
}
if(strlen(s.id)!=11 || !valid) {
printf("学号格式错误!\n");
continue;
}
if(find_student_by_id(s.id) != -1) {
printf("该学号已存在!\n");
} else {
break;
}
}
printf("姓名:");
scanf("%19s", s.name);
clear_input();
while(1) {
printf("性别(男/女):");
scanf("%3s", s.gender);
clear_input();
if(strcmp(s.gender, "男")==0 || strcmp(s.gender, "女")==0) break;
printf("输入错误!\n");
}
while(1) {
printf("年龄:");
if(scanf("%d", &s.age) == 1 && s.age>0 && s.age<150) break;
clear_input();
printf("年龄无效!\n");
}
memset(s.scores, 0, sizeof(s.scores));
s.total = 0;
s.avg = 0;
students[count++] = s;
printf("添加成功!\n");
}
void input_score() {
char id[12];
printf("\n--- 录入成绩 ---\n");
printf("请输入学号:");
scanf("%11s", id);
clear_input();
int index = find_student_by_id(id);
if(index == -1) {
printf("未找到该学生!\n");
return;
}
printf("正在为 %s 录入成绩:\n", students[index].name);
students[index].total = 0;
for(int j=0; j<SUBJECT_COUNT; j++) {
while(1) {
printf("%s成绩:", subjects[j]);
if(scanf("%f", &students[index].scores[j]) == 1 &&
students[index].scores[j] >=0 && students[index].scores[j] <=100) {
break;
}
clear_input();
printf("成绩应在0-100之间!\n");
}
students[index].total += students[index].scores[j];
}
students[index].avg = students[index].total / SUBJECT_COUNT;
printf("成绩录入成功!\n");
}
void query_student() {
if(count == 0) {
printf("当前没有学生记录!\n");
return;
}
int choice;
printf("\n--- 查询学生 ---\n");
printf("1. 按学号查询\n");
printf("2. 按姓名查询\n");
printf("请选择查询方式:");
scanf("%d", &choice);
clear_input();
if(choice == 1) {
char id[12];
printf("请输入学号:");
scanf("%11s", id);
clear_input();
int index = find_student_by_id(id);
if(index != -1) {
print_student(index);
} else {
printf("未找到该学生!\n");
}
} else if(choice == 2) {
char name[20];
printf("请输入姓名:");
scanf("%19s", name);
clear_input();
int found = 0;
for(int i=0; i<count; i++) {
if(strstr(students[i].name, name) != NULL) {
print_student(i);
found = 1;
}
}
if(!found) {
printf("未找到匹配的学生!\n");
}
} else {
printf("无效选择!\n");
}
}
void sort_students() {
if(count == 0) {
printf("当前没有学生记录!\n");
return;
}
for(int i=0; i<count-1; i++) {
for(int j=0; j<count-i-1; j++) {
if(students[j].total < students[j+1].total) {
swap_students(&students[j], &students[j+1]);
}
}
}
printf("\n--- 成绩排序结果 ---\n");
for(int i=0; i<count; i++) {
printf("%2d. %s(学号:%s) 总分:%.1f\n",
i+1, students[i].name, students[i].id, students[i].total);
}
}
void show_failed() {
if(count == 0) {
printf("当前没有学生记录!\n");
return;
}
printf("\n--- 不及格学生列表 ---\n");
int found = 0;
for(int i=0; i<count; i++) {
if(students[i].total < 60) {
print_student(i);
found = 1;
}
}
if(!found) {
printf("没有不及格的学生!\n");
}
}
void show_statistics() {
if(count == 0) {
printf("当前没有学生记录!\n");
return;
}
float total_sum = 0;
float max_total = students[0].total;
float min_total = students[0].total;
for(int i=0; i<count; i++) {
total_sum += students[i].total;
if(students[i].total > max_total) max_total = students[i].total;
if(students[i].total < min_total) min_total = students[i].total;
}
printf("\n--- 班级成绩统计 ---\n");
printf("总人数:%d人\n", count);
printf("平均分:%.2f\n", total_sum / count);
printf("最高分:%.2f\n", max_total);
printf("最低分:%.2f\n", min_total);
}
void modify_student() {
char id[12];
printf("\n--- 修改学生信息 ---\n");
printf("请输入要修改的学号:");
scanf("%11s", id);
clear_input();
int index = find_student_by_id(id);
if(index == -1) {
printf("未找到该学生!\n");
return;
}
printf("原姓名:%s,新姓名:", students[index].name);
scanf("%19s", students[index].name);
clear_input();
while(1) {
printf("原性别:%s,新性别(男/女):", students[index].gender);
scanf("%3s", students[index].gender);
clear_input();
if(strcmp(students[index].gender, "男")==0 || strcmp(students[index].gender, "女")==0) break;
printf("输入错误!\n");
}
while(1) {
printf("原年龄:%d,新年龄:", students[index].age);
if(scanf("%d", &students[index].age) == 1 && students[index].age>0 && students[index].age<150) break;
clear_input();
printf("年龄无效!\n");
}
printf("修改成功!\n");
}
void delete_student() {
char id[12];
printf("\n--- 删除学生信息 ---\n");
printf("请输入要删除的学号:");
scanf("%11s", id);
clear_input();
int index = find_student_by_id(id);
if(index == -1) {
printf("未找到该学生!\n");
return;
}
for(int i=index; i<count-1; i++) {
students[i] = students[i+1];
}
count--;
printf("删除成功!\n");
}
void display_menu() {
printf("\n========= 学生成绩管理系统 =========\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("0. 退出系统\n");
printf("====================================\n");
}
void print_student(int index) {
printf("\n=== 学生详细信息 ===\n");
printf("学号:%s\n", students[index].id);
printf("姓名:%s\n", students[index].name);
printf("性别:%s\n", students[index].gender);
printf("年龄:%d\n", students[index].age);
for(int i=0; i<SUBJECT_COUNT; i++) {
printf("%s:%.1f\t", subjects[i], students[index].scores[i]);
}
printf("\n总分:%.1f\t平均分:%.1f\n", students[index].total, students[index].avg);
}
int find_student_by_id(const char *id) {
for(int i=0; i<count; i++) {
if(strcmp(students[i].id, id) == 0) {
return i;
}
}
return -1;
}
void swap_students(Student *a, Student *b) {
Student temp = *a;
*a = *b;
*b = temp;
}