学生信息管理系统
功能显示:
(1)添加信息:可添加学号、姓名、性别、语文、数学、英语、总分、平均成绩等。
(2)显示信息:显示所有添加的信息。
(3)查找信息:学号查找、姓名查找。
(4)修改信息:学号修改、姓名修改。
(5)删除信息:学号删除、姓名删除。
(6)排序信息:1.升序排序。2.降序排序。两者都可排序总分、语文、数学、英语、名字。
(7)保存信息:将添加的信息保存到文件中。
(8)退出系统:退出操作。
展示部分功能如下图:
源码如下:
menu.h
#pragma once
#include<stdio.h>
void Main_Menu();//菜单显示
void Check_Menu();//查询菜单
void Modify_Menu();//修改菜单
void Delete_Menu();//删除菜单
void Sort_Menu();//排序菜单
void Sort_Way_Menu();//排序选择
menu.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"menu.h"
void Main_Menu()//菜单显示
{
printf("-------------------------------------\n");
printf("--------------菜单显示---------------\n");
printf("------|1.添加信息 2.显示信息|-------\n");
printf("------|3.查找信息 4.修改信息|-------\n");
printf("------|5.删除信息 6.排序信息|-------\n");
printf("------|7.保存信息 0.退出 |-------\n");
printf("-------------------------------------\n");
printf("请输入你的选择:> ");
}
void Check_Menu()//查询菜单
{
printf("-------------------------------------\n");
printf("--------------查找菜单---------------\n");
printf("------|1.学号查找 2.姓名查找|-------\n");
printf("-------------------------------------\n");
printf("请输入你的选择:> ");
}
void Modify_Menu()//修改菜单
{
printf("-------------------------------------\n");
printf("--------------修改菜单---------------\n");
printf("------|1.学号修改 2.姓名修改|-------\n");
printf("-------------------------------------\n");
printf("请输入你的选择:> ");
}
void Delete_Menu()//删除菜单
{
printf("-------------------------------------\n");
printf("--------------修改菜单---------------\n");
printf("------|1.学号删除 2.姓名删除|-------\n");
printf("-------------------------------------\n");
printf("请输入你的选择:> ");
}
void Sort_Way_Menu()//排序选择
{
printf("-------------------------------------\n");
printf("--------------排序选择---------------\n");
printf("----------|1.升序 2.降序|-----------\n");
printf("-------------------------------------\n");
printf("请输入你的选择:> ");
}
void Sort_Menu()//排序菜单
{
printf("-------------------------------------\n");
printf("--------------排序菜单---------------\n");
printf("----------|1.总分 2.语文|-----------\n");
printf("----------|3.数学 4.英语|-----------\n");
printf("----------|5.名字字母排序|-----------\n");
printf("-------------------------------------\n");
printf("请输入你的选择:> ");
}
sort.h
#pragma once
#include"student.h"
void Bubble_Sort_Ascending_Data(void* base, int num, int width, int (*cmpar)(const void* e1, const void* e2));//升序排序函数
void Bubble_Sort_Descending_Data(void* base, int num, int width, int (*cmpar)(const void* e1, const void* e2));//降序排序函数
void Sort_Ascending_Sum_Score(STUDENT* Pstruct);//按总成绩进行升序排序
void Sort_Descending_Sum_Score(STUDENT* Pstruct);//按总成绩进行降序排序
void Sort_Ascending_Name(STUDENT* Pstruct);//按名字进行升序排序
void Sort_Descending_Name(STUDENT* Pstruct);//按名字进行降序排序
void Sort_Ascending_Chinese_Score(STUDENT* Pstruct);//按语文成绩进行升序排序
void Sort_Descending_Chinese_Score(STUDENT* Pstruct);//按语文成绩进行降序序排序
void Sort_Ascending_Math_Score(STUDENT* Pstruct);//按数学成绩进行升序排序
void Sort_Descending_Math_Score(STUDENT* Pstruct);//按数学成绩进行降序排序
void Sort_Ascending_English_Score(STUDENT* Pstruct);//按英语成绩进行排序
void Sort_Descending_English_Score(STUDENT* Pstruct);//按英语成绩进行排序
sort.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"sort.h"
int Compare_Sum_Score(const void* e1, const void* e2)//比较总成绩
{
return ((*(DATA*)e1).sum) - ((*(DATA*)e2).sum);
}
int Compare_Chinese_Score(const void* e1, const void* e2)//比较语文成绩
{
return ((*(DATA*)e1).Chinese) - ((*(DATA*)e2).Chinese);
}
int Compare_Math_Score(const void* e1, const void* e2)//比较数学成绩
{
return ((*(DATA*)e1).Math) - ((*(DATA*)e2).Math);
}
int Compare_English_Score(const void* e1, const void* e2)//比较英语成绩
{
return ((*(DATA*)e1).English) - ((*(DATA*)e2).English);
}
int Compare_Name(const void* e1, const void* e2)//比较两个字符串
{
return strcmp((*(DATA*)e1).name, (*(DATA*)e2).name);
}
void Swp(char* e1, char* e2, int width)//交换数据,一个字节一个字节的交换
{
int i = 0;
for (i = 0; i < width; i++)
{
char temp = *e1;
*e1 = *e2;
*e2 = temp;
e1++;
e2++;
}
}
void Bubble_Sort_Ascending_Data(void* base, int num, int width, int (*cmpar)(const void* e1, const void* e2))//升序排序函数
{
int i = 0;
int j = 0;
for (i = 0; i < num-1; i++)//趟数
{
for (j = 0; j < num - i - 1;j++)//一趟比较的次数
{
if ((*cmpar)((char*)base + width * j, (char*)base + width * (j + 1))>0)//判断
{
Swp((char*)base + width * j, (char*)base + width * (j + 1), width);
}
}
}
}
void Bubble_Sort_Descending_Data(void* base, int num, int width, int (*cmpar)(const void* e1, const void* e2))//降序排序函数
{
int i = 0;
int j = 0;
for (i = 0; i < num - 1; i++)//趟数
{
for (j = 0; j < num - i - 1;j++)//一趟比较的次数
{
if ((*cmpar)((char*)base + width * j, (char*)base + width * (j + 1)) < 0)
{
Swp((char*)base + width * j, (char*)base + width * (j + 1), width);
}
}
}
}
void Sort_Ascending_Sum_Score(STUDENT* Pstruct)//按总成绩进行升序排序
{
Bubble_Sort_Ascending_Data(Pstruct->data, Pstruct->size, sizeof(DATA), Compare_Sum_Score);
Show_Data(Pstruct);
}
void Sort_Descending_Sum_Score(STUDENT* Pstruct)//按总成绩进行降序排序
{
Bubble_Sort_Descending_Data(Pstruct->data, Pstruct->size, sizeof(DATA), Compare_Sum_Score);
Show_Data(Pstruct);
}
void Sort_Ascending_Chinese_Score(STUDENT* Pstruct)//按语文成绩进行升序排序
{
Bubble_Sort_Ascending_Data(Pstruct->data, Pstruct->size, sizeof(DATA), Compare_Chinese_Score);
Show_Data(Pstruct);
}
void Sort_Descending_Chinese_Score(STUDENT* Pstruct)//按语文成绩进行降序序排序
{
Bubble_Sort_Descending_Data(Pstruct->data, Pstruct->size, sizeof(DATA), Compare_Chinese_Score);
Show_Data(Pstruct);
}
void Sort_Ascending_Math_Score(STUDENT* Pstruct)//按数学成绩进行升序排序
{
Bubble_Sort_Ascending_Data(Pstruct->data, Pstruct->size, sizeof(DATA), Compare_Math_Score);
Show_Data(Pstruct);
}
void Sort_Descending_Math_Score(STUDENT* Pstruct)//按数学成绩进行降序排序
{
Bubble_Sort_Descending_Data(Pstruct->data, Pstruct->size, sizeof(DATA), Compare_Math_Score);
Show_Data(Pstruct);
}
void Sort_Ascending_English_Score(STUDENT* Pstruct)//按英语成绩进行排序
{
Bubble_Sort_Ascending_Data(Pstruct->data, Pstruct->size, sizeof(DATA), Compare_English_Score);
Show_Data(Pstruct);
}
void Sort_Descending_English_Score(STUDENT* Pstruct)//按英语成绩进行排序
{
Bubble_Sort_Descending_Data(Pstruct->data, Pstruct->size, sizeof(DATA), Compare_English_Score);
Show_Data(Pstruct);
}
void Sort_Ascending_Name(STUDENT* Pstruct)//按名字进行升序排序
{
Bubble_Sort_Ascending_Data(Pstruct->data, Pstruct->size, sizeof(DATA), Compare_Name);
Show_Data(Pstruct);
}
void Sort_Descending_Name(STUDENT* Pstruct)//按名字进行降序排序
{
Bubble_Sort_Descending_Data(Pstruct->data, Pstruct->size, sizeof(DATA), Compare_Name);
Show_Data(Pstruct);
}
student.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define CapacityInit 3
#define MAX_num 20
#define MAX_name 20
#define MAX_sex 10
enum option //枚举
{
EXIT,
ADD,
SHOW,
SEARCH,
MODIFY,
DELETE,
SORT,
SAVE
};
typedef struct DATA
{
char num[MAX_num];//学号
char name[MAX_name];//姓名
char sex[MAX_sex];//性别
int Chinese;//语文
int Math;//数学
int English;//英语
int sum;//总分
int Average;//平均成绩
}DATA;
typedef struct STUDENT
{
DATA* data;
int capacity;//当前最大容量
int size;//当前元素个数
}STUDENT;
void Init_Student(STUDENT* Pstruct);//初始化系统
void Input_Data(STUDENT* Pstruct);//输入信息
void Show_Data(STUDENT* Pstruct);//显示信息
void Check_Data(STUDENT* Pstruct);//查找信息
void Modify_Data(STUDENT* Pstruct);//修改信息
void Delete_Data(STUDENT* Pstruct);//删除信息
void Sort_All_Data(STUDENT* Pstruct);//排序
void Destroy_Student(STUDENT* Pstruct);//销毁开辟的内存,防止内存泄露
void Save_Student(STUDENT* Pstruct);//保存文件
void Load_Student(STUDENT* Pstruct);//加载文件中的信息到系统中
void Check_Capacity(STUDENT* Pstruct);//检查系统容量
void Check_Num_Data(STUDENT* Pstruct);//按学号查找信息
void Check_Name_Data(STUDENT* Pstruct);//按名字查找信息
void Modify_Num_Data(STUDENT* Pstruct);//按学号修改
void Modify_Name_Data(STUDENT* Pstruct);//按名字修改
void Delete_Num_Data(STUDENT* Pstruct);//按学号删除
void Delete_Name_Data(STUDENT* Pstruct);//按名字删除
void Sort_Ascending_Data(STUDENT* Pstruct);//升序排序
void Sort_Descending_Data(STUDENT* Pstruct);//降序排序
student.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"student.h"
#include"sort.h"
#include"menu.h"
void Init_Student(STUDENT* Pstruct)//初始化系统
{
Pstruct->data = (DATA*)calloc(CapacityInit, sizeof(DATA));
if (Pstruct == NULL)//检查是否开辟成功
{
//开辟失败直接结束程序
return;
}
Pstruct->size = 0;
Pstruct->capacity = CapacityInit;
//把文件中已经存放的文件中的信息加载到系统中
Load_Student(Pstruct);
}
void Check_Capacity(STUDENT* Pstruct)//检查系统容量
{
if (Pstruct->size == Pstruct->capacity)
{
DATA* ptr = (DATA*)realloc(Pstruct->data, (Pstruct->capacity + 2) * sizeof(DATA));
if (ptr != NULL)
{
Pstruct->data = ptr;
Pstruct->capacity += 2;
printf("增容成功\n");
}
else
{
printf("增容失败\n");
return;
}
}
}
void Input_Data(STUDENT* Pstruct)//输入信息
{
int i = 0;
//检查当前系统容量
Check_Capacity(Pstruct);
//添加数据
printf("请输入你的学号:> ");
scanf("%s", Pstruct->data[Pstruct->size].num);
for (i = 0; i < Pstruct->size; i++)
{
if (strcmp(Pstruct->data[Pstruct->size].num, Pstruct->data[i].num) == 0)
{
printf("该学号已存在\n");
return;
}
}
printf("请输入你的姓名:> ");
scanf("%s", Pstruct->data[Pstruct->size].name);
printf("请输入你的性别:> ");
scanf("%s", Pstruct->data[Pstruct->size].sex);
printf("请输入你的语文成绩:> ");
scanf("%d", &(Pstruct->data[Pstruct->size].Chinese));
printf("请输入你的数学成绩:> ");
scanf("%d", &(Pstruct->data[Pstruct->size].Math));
printf("请输入你的英语成绩:> ");
scanf("%d", &(Pstruct->data[Pstruct->size].English));
Pstruct->data[Pstruct->size].sum = Pstruct->data[Pstruct->size].Chinese + Pstruct->data[Pstruct->size].Math + Pstruct->data[Pstruct->size].English;
Pstruct->data[Pstruct->size].Average = (Pstruct->data[Pstruct->size].Chinese + Pstruct->data[Pstruct->size].Math + Pstruct->data[Pstruct->size].English) / 3;
Pstruct->size++;
printf("添加成功\n");
}
void Show_Data(STUDENT* Pstruct)//显示信息
{
if (Pstruct->size == 0)
{
printf("系统为空\n");
return;
}
int i = 0;
printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "学号", "姓名", "性别", "语文", "数学", "英语", "总分","平均成绩");
for (i = 0; i < Pstruct->size; i++)
{
printf("%-10s\t%-10s\t%-10s\t%-10d\t%-10d\t%-10d\t%-10d\t%-10d\n",
Pstruct->data[i].num,
Pstruct->data[i].name,
Pstruct->data[i].sex,
Pstruct->data[i].Chinese,
Pstruct->data[i].Math,
Pstruct->data[i].English,
Pstruct->data[i].sum,
Pstruct->data[i].Average);
}
}
void Check_Num_Data(STUDENT* Pstruct)//按学号查找信息
{
int i = 0;
char num[MAX_num] = { 0 };
printf("请输入学号:> ");
scanf("%s", num);
for (i = 0; i < Pstruct->size; i++)
{
if (strcmp(num, Pstruct->data[i].num) == 0)
{
printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "学号", "姓名", "性别", "语文", "数学", "英语", "总分", "平均成绩");
printf("%-10s\t%-10s\t%-10s\t%-10d\t%-10d\t%-10d\t%-10d\t%-10d\n",
Pstruct->data[i].num,
Pstruct->data[i].name,
Pstruct->data[i].sex,
Pstruct->data[i].Chinese,
Pstruct->data[i].Math,
Pstruct->data[i].English,
Pstruct->data[i].sum,
Pstruct->data[i].Average);
break;
}
}
if (i == Pstruct->size)
{
printf("系统无此学号\n");
}
}
void Check_Name_Data(STUDENT* Pstruct)//按名字查找信息
{
int i = 0;
char name[MAX_name] = { 0 };
printf("请输入姓名:> ");
scanf("%s", name);
for (i = 0; i < Pstruct->size; i++)
{
if (strcmp(name, Pstruct->data[i].name) == 0)
{
printf("%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\t%-10s\n", "学号", "姓名", "性别", "语文", "数学", "英语", "总分", "平均成绩");
printf("%-10s\t%-10s\t%-10s\t%-10d\t%-10d\t%-10d\t%-10d\t%-10d\n",
Pstruct->data[i].num,
Pstruct->data[i].name,
Pstruct->data[i].sex,
Pstruct->data[i].Chinese,
Pstruct->data[i].Math,
Pstruct->data[i].English,
Pstruct->data[i].sum,
Pstruct->data[i].Average);
break;
}
}
if (i == Pstruct->size)
{
printf("系统无此姓名\n");
}
}
void Check_Data(STUDENT* Pstruct)//查找信息
{
if (Pstruct->size == 0)
{
printf("系统为空\n");
return;
}
int choice = 0;
Check_Menu();
scanf("%d", &choice);
switch (choice)
{
case 1:
Check_Num_Data(Pstruct);
break;
case 2:
Check_Name_Data(Pstruct);
break;
}
}
void Modify_Num_Data(STUDENT* Pstruct)//按学号修改
{
int i = 0;
char num[MAX_num] = { 0 };
printf("请输入学号:> ");
scanf("%s", num);
for (i = 0; i < Pstruct->size; i++)
{
if (strcmp(num, Pstruct->data[i].num) == 0)
{
printf("请输入你的学号:> ");
scanf("%s", Pstruct->data[i].num);
printf("请输入你的姓名:> ");
scanf("%s", Pstruct->data[i].name);
printf("请输入你的性别:> ");
scanf("%s", Pstruct->data[i].sex);
printf("请输入你的语文成绩:> ");
scanf("%d", &(Pstruct->data[i].Chinese));
printf("请输入你的数学成绩:> ");
scanf("%d", &(Pstruct->data[i].Math));
printf("请输入你的英语成绩:> ");
scanf("%d", &(Pstruct->data[i].English));
Pstruct->data[i].sum = Pstruct->data[i].Chinese + Pstruct->data[i].Math + Pstruct->data[i].English;
Pstruct->data[i].Average = (Pstruct->data[i].Chinese + Pstruct->data[i].Math + Pstruct->data[i].English) / 3;
printf("修改成功\n");
break;
}
}
if (i == Pstruct->size)
{
printf("系统无此学号\n");
}
}
void Modify_Name_Data(STUDENT* Pstruct)//按名字修改
{
int i = 0;
char name[MAX_name] = { 0 };
printf("请输入姓名:> ");
scanf("%s", name);
for (i = 0; i < Pstruct->size; i++)
{
if (strcmp(name, Pstruct->data[i].name) == 0)
{
printf("请输入你的学号:> ");
scanf("%s", Pstruct->data[i].num);
printf("请输入你的姓名:> ");
scanf("%s", Pstruct->data[i].name);
printf("请输入你的性别:> ");
scanf("%s", Pstruct->data[i].sex);
printf("请输入你的语文成绩:> ");
scanf("%d", &(Pstruct->data[i].Chinese));
printf("请输入你的数学成绩:> ");
scanf("%d", &(Pstruct->data[i].Math));
printf("请输入你的英语成绩:> ");
scanf("%d", &(Pstruct->data[i].English));
Pstruct->data[i].sum = Pstruct->data[i].Chinese + Pstruct->data[i].Math + Pstruct->data[i].English;
Pstruct->data[i].Average = (Pstruct->data[i].Chinese + Pstruct->data[i].Math + Pstruct->data[i].English) / 3;
printf("修改成功\n");
break;
}
}
if (i == Pstruct->size)
{
printf("系统无此姓名\n");
}
}
void Modify_Data(STUDENT* Pstruct)//修改信息
{
if (Pstruct->size == 0)
{
printf("系统为空\n");
return;
}
int choice = 0;
Modify_Menu();//修改菜单
scanf("%d", &choice);
switch (choice)
{
case 1:
Modify_Num_Data(Pstruct);
break;
case 2:
Modify_Name_Data(Pstruct);
break;
}
}
void Delete_Num_Data(STUDENT* Pstruct)//按学号删除
{
int i = 0;
int j = 0;
char num[MAX_num] = { 0 };
printf("请输入学号:> ");
scanf("%s", num);
for(i=0;i<Pstruct->size;i++)
{
if (strcmp(num, Pstruct->data[i].num) == 0)
{
for (j = i; j < Pstruct->size; j++)
{
Pstruct->data[j] = Pstruct->data[j + 1];
}
Pstruct->size--;
printf("删除成功\n");
break;
}
}
if (i == Pstruct->size+1)
{
printf("系统无此学号\n");
}
}
void Delete_Name_Data(STUDENT* Pstruct)//按名字删除
{
int i = 0;
int j = 0;
char name[MAX_name] = { 0 };
printf("请输入姓名:> ");
scanf("%s", name);
for (i = 0; i < Pstruct->size; i++)
{
if (strcmp(name, Pstruct->data[i].name) == 0)
{
for (j = i; j < Pstruct->size; j++)
{
Pstruct->data[j] = Pstruct->data[j + 1];
}
Pstruct->size--;
printf("删除成功\n");
break;
}
}
if (i == Pstruct->size + 1)
{
printf("系统无此姓名\n");
}
}
void Delete_Data(STUDENT* Pstruct)//删除信息
{
if (Pstruct->size == 0)
{
printf("系统为空\n");
return;
}
int choice = 0;
Delete_Menu();
scanf("%d", &choice);
switch (choice)
{
case 1:
Delete_Num_Data(Pstruct);
break;
case 2:
Delete_Name_Data(Pstruct);
break;
}
}
void Sort_All_Data(STUDENT* Pstruct)//排序
{
if (Pstruct->size == 0)
{
printf("系统为空\n");
return;
}
int choice = 0;
Sort_Way_Menu();
scanf("%d", &choice);
switch (choice)
{
case 1:
Sort_Ascending_Data(Pstruct);
break;
case 2:
Sort_Descending_Data(Pstruct);
break;
}
}
void Sort_Ascending_Data(STUDENT* Pstruct)
{
int choice = 0;
Sort_Menu();
scanf("%d", &choice);
switch (choice)
{
case 1:
Sort_Ascending_Sum_Score(Pstruct);
break;
case 2:
Sort_Ascending_Chinese_Score(Pstruct);
break;
case 3:
Sort_Ascending_Math_Score(Pstruct);
break;
case 4:
Sort_Ascending_English_Score(Pstruct);
break;
case 5:
Sort_Ascending_Name(Pstruct);
break;
default:
printf("输入错误\n");
break;
}
}
void Sort_Descending_Data(STUDENT* Pstruct)
{
int choice = 0;
Sort_Menu();
scanf("%d", &choice);
switch (choice)
{
case 1:
Sort_Descending_Sum_Score(Pstruct);
break;
case 2:
Sort_Descending_Chinese_Score(Pstruct);
break;
case 3:
Sort_Descending_Math_Score(Pstruct);
break;
case 4:
Sort_Descending_English_Score(Pstruct);
break;
case 5:
Sort_Descending_Name(Pstruct);
break;
default:
printf("输入错误\n");
break;
}
}
void Destroy_Student(STUDENT* Pstruct)//销毁开辟的内存,防止内存泄露
{
free(Pstruct->data);
Pstruct->data = NULL;
}
void Save_Student(STUDENT* Pstruct)//保存文件
{
FILE* pfwrite = fopen("student.txt", "wb");
if (pfwrite == NULL)//检查打开文件是否失败
{
printf("SaveContact%s\n", strerror(errno));
return;
}
//打开成功,写通讯录中的数据到文件中
int i = 0;
for (i = 0; i < Pstruct->size; i++)
{
fwrite(&(Pstruct->data[i]), sizeof(DATA), 1, pfwrite);
}
printf("保存成功\n");
fclose(pfwrite);
pfwrite = NULL;
}
void Load_Student(STUDENT* Pstruct)//加载文件中的信息到系统中
{
DATA temp = { 0 };
FILE* pfRead = fopen("student.txt", "rb");
if (pfRead == NULL)
{
printf("LoadContact%s\n", strerror(errno));
return;
}
//读取文件,放到通讯录中
while (fread(&temp, sizeof(DATA), 1, pfRead))
{
Check_Capacity(Pstruct);
Pstruct->data[Pstruct->size] = temp;
Pstruct->size++;
}
fclose(pfRead);
pfRead = NULL;
}
main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"student.h"
#include"menu.h"
int main()
{
int choice = 0;
STUDENT student;
Init_Student(&student);
do
{
Main_Menu();
scanf("%d", &choice);
switch (choice)
{
case ADD:
Input_Data(&student);
break;
case SHOW:
Show_Data(&student);
break;
case SEARCH:
Check_Data(&student);
break;
case MODIFY:
Modify_Data(&student);
break;
case DELETE:
Delete_Data(&student);
break;
case SORT:
Sort_All_Data(&student);
break;
case SAVE:
Save_Student(&student);
break;
case EXIT:
Save_Student(&student);
//释放动态开辟的内存
Destroy_Student(&student);
printf("退出系统\n");
break;
default:
printf("输入错误\n");
break;
}
} while (choice);
return 0;
}