学生管理系统
👍😂💯 项目代码
代码可能存在细节上的错误,希望大家可以指导意见。
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_STUDENTS 100typedef struct {int id;char name[50];float score1;float score2;float score3;float average;
} Student;Student students[MAX_STUDENTS];
int num_students = 0;void display_menu() {printf("**********************************************\n");printf(" 学生管理系统\n");printf("**********************************************\n");printf(" \n");printf(" 1.增加一位学生信息 2.删除一位同学信息 \n");printf(" 3.按学号查询学生 4.按姓名查询学生 \n");printf(" 5.修改学生信息 6.按姓名排序 \n");printf(" 7.按平均分排序 8.装入学生信息 \n");printf(" 9.保存学生信息 0.显示全部同学的信息 \n");printf(" \n");printf("按q或者Q退出系统 \n");printf("**********************************************\n");printf("请选择操作:");
}void add_student() {Student new_student;printf("输入学生的学号(-1 结束): ");scanf("%d", &new_student.id);if (new_student.id == -1) {return;}printf("输入学生的姓名: ");scanf("%s", new_student.name);printf("输入学生的高数成绩: ");scanf("%f", &new_student.score1);printf("输入学生的C语言成绩: ");scanf("%f", &new_student.score2);printf("输入学生的英语成绩: ");scanf("%f", &new_student.score3);new_student.average = (new_student.score1 + new_student.score2 + new_student.score3) / 3.0;students[num_students++] = new_student;printf("学生信息添加成功\n");
}void delete_student() {int student_id;int i;printf("输入学生的学号: ");scanf("%d", &student_id);int index = -1;for (i = 0; i < num_students; i++) {if (students[i].id == student_id) {index = i;break;}}if (index == -1) {printf("学号不存在\n");return;}for (i = index; i < num_students - 1; i++) {students[i] = students[i + 1];}num_students--;printf("删除学生信息成功\n");
}void search_by_id() {int student_id;int i;printf("输入学生的学号: ");scanf("%d", &student_id);int index = -1;for (i = 0; i < num_students; i++) {if (students[i].id == student_id) {index = i;break;}}if (index == -1) {printf("学号不存在\n");return;}printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",students[index].id, students[index].name, students[index].score1,students[index].score2, students[index].score3, students[index].average);
}void search_by_name() {int found = 0;char student_name[50];int i;printf("输入学生的姓名: ");scanf("%s", student_name);printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");for (i = 0; i < num_students; i++) {if (strcmp(students[i].name, student_name) == 0) {printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",students[i].id, students[i].name, students[i].score1,students[i].score2, students[i].score3, students[i].average);found = 1;}}if (!found) { printf("学生不存在\n"); }
}void update_student() {int student_id;int index = -1;int i;printf("输入学生的学号: ");scanf("%d", &student_id);for (i = 0; i < num_students; i++) {if (students[i].id == student_id) {index = i;break;}}if (index == -1) {printf("学号不存在\n");return;}printf("输入学生的姓名: ");scanf("%s", students[index].name);printf("输入学生的课程1成绩: ");scanf("%f", &students[index].score1);printf("输入学生的课程2成绩: ");scanf("%f", &students[index].score2);printf("输入学生的课程3成绩: ");scanf("%f", &students[index].score3);students[index].average = (students[index].score1 + students[index].score2 + students[index].score3) / 3.0;printf("学生信息更新成功\n");
}void sort_by_name() {int i, j;for (i = 0; i < num_students - 1; i++) {for (j = 0; j < num_students - 1 - i; j++) {if (strcmp(students[j].name, students[j + 1].name) > 0) {Student temp = students[j];students[j] = students[j + 1];students[j + 1] = temp;}}}printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");for (i = 0; i < num_students; i++) {printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",students[i].id, students[i].name, students[i].score1,students[i].score2, students[i].score3, students[i].average);}
}void sort_by_average() {int i, j;for (i = 0; i < num_students - 1; i++) {for (j = 0; j < num_students - 1 - i; j++) {if (students[j].average < students[j + 1].average) {Student temp = students[j];students[j] = students[j + 1];students[j + 1] = temp;}}}printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");for (i = 0; i < num_students; i++) {printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",students[i].id, students[i].name, students[i].score1,students[i].score2, students[i].score3, students[i].average);}
}void load_students() {FILE *file = fopen("student_info.bin", "rb");if (file == NULL) {printf("无法打开文件\n");return;}fread(&num_students, sizeof(int), 1, file);fread(students, sizeof(Student), num_students, file);fclose(file);
}void save_students() {FILE *file = fopen("student_info.bin", "wb");if (file == NULL) {return;}fwrite(&num_students, sizeof(int), 1, file);fwrite(students, sizeof(Student), num_students, file);fclose(file);printf("学生信息保存成功\n");
}void display_students() {int i;printf("学号\t姓名\t课程1\t课程2\t课程3\t平均分\n");for (i = 0; i < num_students; i++) {printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n", students[i].id, students[i].name, students[i].score1,students[i].score2, students[i].score3, students[i].average);}
}int main() {load_students();while (1) {display_menu();char choice;scanf(" %c", &choice);switch (choice) {case '1':add_student();break;case '2':delete_student();break;case '3':search_by_id();break;case '4':search_by_name();break;case '5':update_student();break;case '6':sort_by_name();break;case '7':sort_by_average();break;case '8':load_students();break;case '9':save_students();break;case '0':display_students();break;case 'q':case 'Q':printf("再见!\n");exit(0);default:printf("输入错误,请重新输入!\n");break;}}return 0;
}
项目运行展示
这段代码是一个简单的学生管理系统,它使用 C 语言编写,主要用于存储、管理和展示学生的基本信息及成绩。下面是对项目结构、逻辑结构和项目背景的详细描述:
项目结构
-
头文件和宏定义:
#define _CRT_SECURE_NO_WARNINGS 1
:这是为了防止在 Visual Studio 等编译器中出现关于不安全函数的警告。#include
指令用于引入标准库,如stdio.h
、stdlib.h
和string.h
,这些库提供了输入输出、内存操作和字符串处理等功能。
-
数据结构定义:
Student
结构体定义了学生的信息,包括学号、姓名、三门课程的成绩和平均分。
-
全局变量:
students
数组用于存储所有学生的信息。num_students
变量用于跟踪当前存储的学生数量。
-
功能函数:
display_menu()
:显示系统菜单。add_student()
:添加学生信息。delete_student()
:删除学生信息。search_by_id()
和search_by_name()
:分别通过学号和姓名查询学生信息。update_student()
:更新学生信息。sort_by_name()
和sort_by_average()
:分别按姓名和平均分对学生进行排序。load_students()
和save_students()
:从文件加载和保存学生信息。display_students()
:显示所有学生信息。
-
主函数
main()
:- 初始化学生信息数组。
- 进入一个无限循环,显示菜单并根据用户输入执行相应的操作。
- 提供退出选项。
逻辑结构
-
初始化:
- 在
main()
函数开始时,调用load_students()
从文件加载已有的学生信息。
- 在
-
用户交互:
- 通过
display_menu()
函数显示操作选项。 - 用户输入选择后,通过
switch
语句执行相应的功能函数。
- 通过
-
数据处理:
- 每个功能函数都对
students
数组和num_students
变量进行操作,以实现增加、删除、查询、更新、排序和显示学生信息的功能。
- 每个功能函数都对
-
数据持久化:
load_students()
和save_students()
函数通过二进制文件student_info.bin
实现数据的持久化存储。