学生管理系统
👍😂💯 项目代码
代码可能存在细节上的错误,希望大家可以指导意见。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100
typedef 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
实现数据的持久化存储。