本实验要求大家使用《程序设计基础》课程中所学的C语言的基础知识,实现一个“学生档案管理程序”,具体程序设计方法不论,基本功能要求如下:
- 学生档案记录录入:录入学生的学号、姓名、性别、年龄和总绩点,以记录形式保存在文件末尾。注意:录入第一个学生的记录时要创建文件,录入其他学生的记录时只需要打开已经创建的文件就可以
- 学生档案记录修改:允许用户选择并从文件中读取要修改的学生记录,修改指定的记录后,能将改记录写回文件中原来的位置
- 学生档案记录删除:允许用户选择要删除的学生记录,告诉用户准备删除哪个记录,获得用户确认后从文件中删除这个记录。注意:删除一个记录后,后面的记录都得往前挪!
- 学生记录排序:对保存在文件中的记录按学号排序,排序后的记录仍写回原来的文件
- 其他功能:其他您以为适当的功能,比如按姓名、绩点排序,统计平均年龄和绩点,按姓名、年龄查找并显示学生档案资料
程序设计提示:
- 设计文件数据结构:设计文件的存储结构,将每个学生的学号、姓名、性别、年龄和总绩点保存为一个记录,以便进行随机存取。例如:学号12个字节,姓名8个字节,性别2个字节,年龄2个字节,总绩点3个字节,记起来一个学生的记录总共需要27个字节,记录的长度就是27个字节
- 根据所要保存的学生档案记录内容(学号、姓名、性别、年龄和总绩点),设计结构体数据类型,结合结构体数组的运用实现文件记录的读写访问
- 将以上各功能都设计成独立的函数,在main函数中显示一个菜单,让用户选择要执行的功能,然后转而执行相应的函数
-
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STUDENTS 100 // 学生结构体 typedef struct { char student_id[13]; char name[10]; char gender[3]; int age; float gpa; } Student; // 函数声明 void showMenu(); void addStudentRecord(); void modifyStudentRecord(); void deleteStudentRecord(); void sortStudentRecords(); void displayStudentRecords(); void searchStudent(); // 全局变量 Student students[MAX_STUDENTS]; int numStudents = 0; int main() { int choice; // 加载文件中的学生记录到内存 FILE *file = fopen("students.txt", "rb"); if (file != NULL) { while (fread(&students[numStudents], sizeof(Student), 1, file) == 1) { numStudents++; } fclose(file); } do { showMenu(); printf("请选择功能:"); scanf("%d", &choice); switch (choice) { case 1: addStudentRecord(); break; case 2: modifyStudentRecord(); break; case 3: deleteStudentRecord(); break; case 4: sortStudentRecords(); break; case 5: displayStudentRecords(); break; case 6: searchStudent(); break; case 0: printf("谢谢使用,再见!\n"); break; default: printf("无效选择,请重新输入。\n"); break; } } while (choice != 0); // 将学生记录保存到文件 file = fopen("students.txt", "wb"); if (file != NULL) { fwrite(students, sizeof(Student), numStudents, file); fclose(file); } return 0; } // 显示菜单 void showMenu() { printf("\n------------------------\n"); printf("学生档案管理程序\n"); printf("------------------------\n"); printf("1. 录入学生档案\n"); printf("2. 修改学生档案\n"); printf("3. 删除学生档案\n"); printf("4. 学生档案排序\n"); printf("5. 显示学生档案\n"); printf("6. 搜索学生档案\n"); printf("0. 退出\n"); printf("------------------------\n"); } // 录入学生档案记录 void addStudentRecord() { if (numStudents >= MAX_STUDENTS) { printf("学生档案已满,无法录入更多记录。\n"); return; } Student newStudent; printf("请输入学生学号:"); scanf("%s", newStudent.student_id); printf("请输入学生姓名:"); scanf("%s", newStudent.name); printf("请输入学生性别:"); scanf("%s", newStudent.gender); printf("请输入学生年龄:"); scanf("%d", &newStudent.age); printf("请输入学生总绩点:"); scanf("%f", &newStudent.gpa); students[numStudents] = newStudent; numStudents++; printf("学生档案记录已添加。\n"); } // 修改学生档案记录 void modifyStudentRecord() { char studentId[13]; int i; printf("请输入要修改的学生学号:"); scanf("%s", studentId); for (i = 0; i < numStudents; i++) { if (strcmp(students[i].student_id, studentId) == 0) { printf("请输入学生新姓名:"); scanf("%s", students[i].name); printf("请输入学生新性别:"); scanf("%s", students[i].gender); printf("请输入学生新年龄:"); scanf("%d", &students[i].age); printf("请输入学生新总绩点:"); scanf("%f", &students[i].gpa); printf("学生档案记录已修改。\n"); return; } } printf("找不到学号为%s的学生记录。\n", studentId); } // 删除学生档案记录 void deleteStudentRecord() { char studentId[13]; int i, j; printf("请输入要删除的学生学号:"); scanf("%s", studentId); for (i = 0; i < numStudents; i++) { if (strcmp(students[i].student_id, studentId) == 0) { printf("确定要删除以下学生档案记录吗?\n"); printf("学号:%s\n", students[i].student_id); printf("姓名:%s\n", students[i].name); printf("性别:%s\n", students[i].gender); printf("年龄:%d\n", students[i].age); printf("总绩点:%f\n", students[i].gpa); printf("确认删除请按1,取消请按0:"); int confirm; scanf("%d", &confirm); if (confirm == 1) { for (j = i; j < numStudents - 1; j++) { students[j] = students[j + 1]; } numStudents--; printf("学生档案记录已删除。\n"); } else { printf("删除操作已取消。\n"); } return; } } printf("找不到学号为%s的学生记录。\n", studentId); } // 学生档案记录排序 void sortStudentRecords() { int i, j; Student temp; for (i = 0; i < numStudents - 1; i++) { for (j = 0; j < numStudents - i - 1; j++) { if (strcmp(students[j].student_id, students[j + 1].student_id) > 0) { temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; } } } printf("学生档案记录已排序。\n"); } // 显示学生档案记录 void displayStudentRecords() { int i; printf("学生档案记录:\n"); for (i = 0; i < numStudents; i++) { printf("学号:%s\n", students[i].student_id); printf("姓名:%s\n", students[i].name); printf("性别:%s\n", students[i].gender); printf("年龄:%d\n", students[i].age); printf("总绩点:%f\n", students[i].gpa); printf("--------------------\n"); } printf("共计%d条学生档案记录。\n", numStudents); } // 搜索学生档案记录 void searchStudent() { char searchName[10]; int i, count = 0; printf("请输入要搜索的学生姓名:"); scanf("%s", searchName); printf("搜索结果:\n"); for (i = 0; i < numStudents; i++) { if (strcmp(students[i].name, searchName) == 0) { printf("学号:%s\n", students[i].student_id); printf("姓名:%s\n", students[i].name); printf("性别:%s\n", students[i].gender); printf("年龄:%d\n", students[i].age); printf("总绩点:%f\n", students[i].gpa); printf("--------------------\n"); count++; } } if (count == 0) { printf("找不到姓名为%s的学生记录。\n", searchName); } else { printf("共计%d条学生档案记录。\n", count); } }
该文章仅记录学习的过程。