diff --git a/学生信息管理系统.cpp b/学生信息管理系统.cpp new file mode 100644 index 0000000..0fe1c5e --- /dev/null +++ b/学生信息管理系统.cpp @@ -0,0 +1,506 @@ +#include +#include +#include +#include + +#define MAX_STUDENTS 100 +#define MAX_NAME_LEN 50 +#define MAX_ID_LEN 20 +#define MAX_MAJOR_LEN 50 +#define MAX_AWARDS_LEN 200 +#define DATA_FILE "students.dat" + +typedef struct { + char id[MAX_ID_LEN]; + char name[MAX_NAME_LEN]; + char gender; // 'M' 或 'F' + int age; + char major[MAX_MAJOR_LEN]; + float gpa; + char awards[MAX_AWARDS_LEN]; +} Student; + +Student students[MAX_STUDENTS]; +int student_count = 0; + +// 函数声明 +void load_data(); +void save_data(); +void add_student(); +void delete_student(); +void update_student(); +void search_student(); +void display_student(Student s); +void list_all_students(); +void sort_students(); +void evaluate_students(); +void statistics(); +void show_menu(); +void clear_input_buffer(); + +int main() { + load_data(); + + while (1) { + show_menu(); + printf("请选择操作(1-9): "); + char choice; + scanf(" %c", &choice); + clear_input_buffer(); + + switch (choice) { + case '1': add_student(); break; + case '2': delete_student(); break; + case '3': update_student(); break; + case '4': search_student(); break; + case '5': list_all_students(); break; + case '6': sort_students(); break; + case '7': evaluate_students(); break; + case '8': statistics(); break; + case '9': + save_data(); + printf("感谢使用,再见!\n"); + exit(0); + default: + printf("无效的选择,请重新输入!\n"); + } + } + + return 0; +} + +void load_data() { + FILE *file = fopen(DATA_FILE, "rb"); + if (file == NULL) { + return; // 文件不存在,无需加载 + } + + student_count = fread(students, sizeof(Student), MAX_STUDENTS, file); + fclose(file); +} + +void save_data() { + FILE *file = fopen(DATA_FILE, "wb"); + if (file == NULL) { + printf("无法保存数据!\n"); + return; + } + + fwrite(students, sizeof(Student), student_count, file); + fclose(file); +} + +void add_student() { + if (student_count >= MAX_STUDENTS) { + printf("学生数量已达上限,无法添加!\n"); + return; + } + + printf("\n--- 添加学生信息 ---\n"); + Student s; + + printf("请输入学号: "); + fgets(s.id, MAX_ID_LEN, stdin); + s.id[strcspn(s.id, "\n")] = '\0'; // 移除换行符 + + // 检查学号是否已存在 + for (int i = 0; i < student_count; i++) { + if (strcmp(students[i].id, s.id) == 0) { + printf("错误: 该学号已存在!\n"); + return; + } + } + + printf("请输入姓名: "); + fgets(s.name, MAX_NAME_LEN, stdin); + s.name[strcspn(s.name, "\n")] = '\0'; + + printf("请输入性别(M/F): "); + scanf(" %c", &s.gender); + clear_input_buffer(); + s.gender = toupper(s.gender); + + printf("请输入年龄: "); + scanf("%d", &s.age); + clear_input_buffer(); + + printf("请输入专业: "); + fgets(s.major, MAX_MAJOR_LEN, stdin); + s.major[strcspn(s.major, "\n")] = '\0'; + + printf("请输入GPA(0-4): "); + scanf("%f", &s.gpa); + clear_input_buffer(); + + printf("请输入获奖情况: "); + fgets(s.awards, MAX_AWARDS_LEN, stdin); + s.awards[strcspn(s.awards, "\n")] = '\0'; + + students[student_count++] = s; + save_data(); + printf("学生信息添加成功!\n"); +} + +void delete_student() { + printf("\n--- 删除学生信息 ---\n"); + char id[MAX_ID_LEN]; + printf("请输入要删除的学生学号: "); + fgets(id, MAX_ID_LEN, stdin); + id[strcspn(id, "\n")] = '\0'; + + for (int i = 0; i < student_count; i++) { + if (strcmp(students[i].id, id) == 0) { + // 将最后一个学生移到当前位置 + if (i < student_count - 1) { + students[i] = students[student_count - 1]; + } + student_count--; + save_data(); + printf("学生信息删除成功!\n"); + return; + } + } + + printf("错误: 未找到该学号的学生!\n"); +} + +void update_student() { + printf("\n--- 修改学生信息 ---\n"); + char id[MAX_ID_LEN]; + printf("请输入要修改的学生学号: "); + fgets(id, MAX_ID_LEN, stdin); + id[strcspn(id, "\n")] = '\0'; + + for (int i = 0; i < student_count; i++) { + if (strcmp(students[i].id, id) == 0) { + printf("当前学生信息:\n"); + display_student(students[i]); + + printf("\n请输入新的信息(留空则保持不变):\n"); + + char input[MAX_NAME_LEN]; + + printf("姓名[%s]: ", students[i].name); + fgets(input, MAX_NAME_LEN, stdin); + input[strcspn(input, "\n")] = '\0'; + if (strlen(input) > 0) { + strcpy(students[i].name, input); + } + + printf("性别[%c]: ", students[i].gender); + char gender; + scanf(" %c", &gender); + clear_input_buffer(); + if (gender != '\n') { + students[i].gender = toupper(gender); + } + + printf("年龄[%d]: ", students[i].age); + fgets(input, MAX_NAME_LEN, stdin); + input[strcspn(input, "\n")] = '\0'; + if (strlen(input) > 0) { + students[i].age = atoi(input); + } + + printf("专业[%s]: ", students[i].major); + fgets(input, MAX_MAJOR_LEN, stdin); + input[strcspn(input, "\n")] = '\0'; + if (strlen(input) > 0) { + strcpy(students[i].major, input); + } + + printf("GPA[%.2f]: ", students[i].gpa); + fgets(input, MAX_NAME_LEN, stdin); + input[strcspn(input, "\n")] = '\0'; + if (strlen(input) > 0) { + students[i].gpa = atof(input); + } + + printf("获奖情况[%s]: ", students[i].awards); + fgets(input, MAX_AWARDS_LEN, stdin); + input[strcspn(input, "\n")] = '\0'; + if (strlen(input) > 0) { + strcpy(students[i].awards, input); + } + + save_data(); + printf("学生信息修改成功!\n"); + return; + } + } + + printf("错误: 未找到该学号的学生!\n"); +} + +void search_student() { + printf("\n--- 查询学生信息 ---\n"); + printf("1. 按学号查询\n"); + printf("2. 按姓名查询\n"); + printf("3. 按专业查询\n"); + printf("请选择查询方式(1-3): "); + + char choice; + scanf(" %c", &choice); + clear_input_buffer(); + + char query[MAX_NAME_LEN]; + int found = 0; + + switch (choice) { + case '1': + printf("请输入学号: "); + fgets(query, MAX_ID_LEN, stdin); + query[strcspn(query, "\n")] = '\0'; + + printf("\n查询结果:\n"); + for (int i = 0; i < student_count; i++) { + if (strcmp(students[i].id, query) == 0) { + display_student(students[i]); + found = 1; + } + } + break; + + case '2': + printf("请输入姓名: "); + fgets(query, MAX_NAME_LEN, stdin); + query[strcspn(query, "\n")] = '\0'; + + printf("\n查询结果:\n"); + for (int i = 0; i < student_count; i++) { + if (strstr(students[i].name, query) != NULL) { + display_student(students[i]); + found = 1; + } + } + break; + + case '3': + printf("请输入专业: "); + fgets(query, MAX_MAJOR_LEN, stdin); + query[strcspn(query, "\n")] = '\0'; + + printf("\n查询结果:\n"); + for (int i = 0; i < student_count; i++) { + if (strstr(students[i].major, query) != NULL) { + display_student(students[i]); + found = 1; + } + } + break; + + default: + printf("无效的选择!\n"); + return; + } + + if (!found) { + printf("未找到符合条件的学生!\n"); + } +} + +void display_student(Student s) { + printf("\n学号: %s\n", s.id); + printf("姓名: %s\n", s.name); + printf("性别: %c\n", s.gender); + printf("年龄: %d\n", s.age); + printf("专业: %s\n", s.major); + printf("GPA: %.2f\n", s.gpa); + printf("获奖情况: %s\n", s.awards); + printf("------------------------------\n"); +} + +void list_all_students() { + printf("\n--- 所有学生信息 ---\n"); + if (student_count == 0) { + printf("没有学生信息!\n"); + return; + } + + for (int i = 0; i < student_count; i++) { + display_student(students[i]); + } +} + +void sort_students() { + printf("\n--- 排序学生信息 ---\n"); + printf("1. 按学号排序\n"); + printf("2. 按姓名排序\n"); + printf("3. 按GPA排序\n"); + printf("4. 按年龄排序\n"); + printf("请选择排序方式(1-4): "); + + char choice; + scanf(" %c", &choice); + clear_input_buffer(); + + // 简单的冒泡排序 + for (int i = 0; i < student_count - 1; i++) { + for (int j = 0; j < student_count - i - 1; j++) { + int swap = 0; + + switch (choice) { + case '1': + if (strcmp(students[j].id, students[j+1].id) > 0) { + swap = 1; + } + break; + + case '2': + if (strcmp(students[j].name, students[j+1].name) > 0) { + swap = 1; + } + break; + + case '3': + if (students[j].gpa < students[j+1].gpa) { + swap = 1; + } + break; + + case '4': + if (students[j].age > students[j+1].age) { + swap = 1; + } + break; + + default: + printf("无效的选择!\n"); + return; + } + + if (swap) { + Student temp = students[j]; + students[j] = students[j+1]; + students[j+1] = temp; + } + } + } + + save_data(); + printf("排序完成!\n"); + list_all_students(); +} + +void evaluate_students() { + printf("\n--- 学生评优评奖 ---\n"); + printf("1. 显示GPA前3名的学生\n"); + printf("2. 显示有获奖记录的学生\n"); + printf("请选择评优方式(1-2): "); + + char choice; + scanf(" %c", &choice); + clear_input_buffer(); + + switch (choice) { + case '1': { + // 先按GPA排序 + for (int i = 0; i < student_count - 1; i++) { + for (int j = 0; j < student_count - i - 1; j++) { + if (students[j].gpa < students[j+1].gpa) { + Student temp = students[j]; + students[j] = students[j+1]; + students[j+1] = temp; + } + } + } + + int limit = student_count < 3 ? student_count : 3; + printf("\nGPA前%d名的学生:\n", limit); + for (int i = 0; i < limit; i++) { + display_student(students[i]); + } + break; + } + + case '2': { + int found = 0; + printf("\n有获奖记录的学生:\n"); + for (int i = 0; i < student_count; i++) { + if (strlen(students[i].awards) > 0) { + display_student(students[i]); + found = 1; + } + } + + if (!found) { + printf("没有学生有获奖记录!\n"); + } + break; + } + + default: + printf("无效的选择!\n"); + } +} + +void statistics() { + printf("\n--- 统计信息 ---\n"); + printf("总学生数: %d\n", student_count); + + if (student_count == 0) { + return; + } + + // 按性别统计 + int male_count = 0, female_count = 0; + for (int i = 0; i < student_count; i++) { + if (toupper(students[i].gender) == 'M') { + male_count++; + } else { + female_count++; + } + } + printf("男生人数: %d, 女生人数: %d\n", male_count, female_count); + + // 平均GPA + float total_gpa = 0; + for (int i = 0; i < student_count; i++) { + total_gpa += students[i].gpa; + } + printf("平均GPA: %.2f\n", total_gpa / student_count); + + // 按专业统计 + printf("\n各专业人数:\n"); + char majors[MAX_STUDENTS][MAX_MAJOR_LEN]; + int counts[MAX_STUDENTS] = {0}; + int major_count = 0; + + for (int i = 0; i < student_count; i++) { + int found = 0; + for (int j = 0; j < major_count; j++) { + if (strcmp(majors[j], students[i].major) == 0) { + counts[j]++; + found = 1; + break; + } + } + + if (!found) { + strcpy(majors[major_count], students[i].major); + counts[major_count] = 1; + major_count++; + } + } + + for (int i = 0; i < major_count; i++) { + printf("%s: %d人\n", majors[i], counts[i]); + } +} + +void show_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("9. 退出系统\n"); +} + +void clear_input_buffer() { + while (getchar() != '\n'); +}