首先是对整体函数所需要的功能进行子函数的分类,让信息的输入,处理,输出,都可以进行模块化的设计
文 件 名 : main.c
版 本 号 : 初稿
作 者 : 飘小叶
生成日期 : 2020年7月14日
最近修改 :
功能描述 : 学生信息管理系统
函数列表 :
-
1. Add_Information 添加学生信息
-
2. Change_Information 修改学生信息
-
3. Delete_Information 删除学生信息
-
4. Head 学生信息管理系统字符图标
-
5. Init 学生信息管理系统初始化字符图标
-
6. isLogin 判断是否登录成功
-
7. Students_Information 学生信息
-
8. Login 登录系统
-
9. main 主函数
-
10. MainMenu 主菜单界面
-
11. MenuSelect 菜单选择
-
12. Quit 退出程序或重新进入主菜单
-
13. Search_Information 查询学生信息
-
14. Show_Information 显示所有学生信息
-
15. Sort_Information 对学生信息进行排序
-
16. StuManage 学生信息管理系统 管理端字符图标
-
17. Swap 交换两个学生信息
-
18. ReadData 读取D:\\下的飘小叶.txt文件
-
19. SaveData 将链表中的数据存储在D:\\下的飘小叶.txt文件
设置头文件,宏定义账号:飘小叶,密码2220193789,设置枚举类型,结构体类型,文件操作时所需要的结点,以及各类的子函数声明。
修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 创建文件******************************************************************************/#include<stdio.h>
#include<conio.h>
#include<Windows.h>
#define MANAGER_NAME "飘小叶" //账号
#define MANAGER_PASSWORD "2220193789" //密码typedef enum Menu
{
Exit,Lessons,Show,Add,Sort,Change,Delete,Search
}MENU;typedef struct Student //类型首字母大写以和变量区分
{
int iIndex[50]; //学号 char cName[50]; //姓名int iOlder[50]; //年龄char cSex[5]; //性别char cDatebirth[20]; //出生年月char cAddress[50]; //地址int iPhone[20]; //电话char cMailbox[30]; //邮箱(E-mail)struct Student *pNext;
}STU,*PSTU; PSTU pHead = NULL; //学生信息头结点
PSTU pNew = NULL; //待添加学生信息
size_t iCount = 0; //学生总数
char UserName[10]; //用户名(账号)
char UserWord[10]; //密码void Init(); //学生信息初始化
void MainMenu(); //主菜单界面
void StuManage(); //管理系统 管理端 字符图标
void Head(); //管理系统字符图标
void Login(); //登入系统
int isLogin(); //判断是否登入成功int MenuSelect(); //菜单选择
void ReadData(); //读取数据
void SaveData(); //保存数据
void Quit(); //退出程序或重新进入主菜单
void Students_Information();
void Show_Information();
void Add_Information();
void Sort_Information();
void Change_Information();
void Delete_Information();
void Search_Information();
void Swap(PSTU stu1,PSTU stu2);
设置主菜单界面,用Switch将其连接起来,首要原因就是Switch相比于近似作用的If来说的话,他的执行效率更高,并且在面向整个菜单界面的时候,分支化操作会使整个界面看起来更加的简洁,易懂。读到这里可能会用到后面几个函数的作用,Head()他就是个表头,起到美化界面的作用,Quit()就如整个注释里面写的那样,他就是一个退出并返回的作用,其次System(“cls”)冻屏函数,可以让屏幕停止在功能区所在的地方,便于下一步的操作和观察。
/*****************************************************************************函 数 名 : MainMenu功能描述 : 主菜单界面输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月4日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void MainMenu()
{
if (isLogin()){
//登录成功switch (MenuSelect()) //菜单选择{
case Exit: //退出程序system("cls");Head(); //管理系统字符图标Quit(); //退出或返回主菜单break;case Lessons: //学生信息system("cls");Students_Information();Quit();break;case Show: //显示所有学生信息system("cls");Show_Information();Quit();break;case Add: //添加学生信息system("cls");Add_Information();Quit();break;case Sort: //对学生信息进行排序system("cls");Sort_Information();Show_Information();Quit();break;case Change: //修改学生信息system("cls");Change_Information();Quit();break;case Delete: //删除学生信息system("cls");Delete_Information();Quit();break;case Search: //查询学生信息system("cls");Search_Information();Quit();break;}}
}
Init(),就如同他的名字一样,他的作用就是初始化数据,首次登入的话需要将节点置空,初始化整个链表的数据,StuManage()和上面提到过的Head()是类似的作用,也是为了美化界面,而Login()就使用了前面提到过的宏定义账号密码的认定。
/*****************************************************************************函 数 名 : Init功能描述 : 学生信息管理系统初始化字符图标输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Init()
{
/****************初始化数据****************/pHead = (PSTU)malloc(sizeof(STU));pHead->pNext = NULL;SetConsoleTitle("学生信息管理系统(管理员)");ReadData();/****************载入界面*****************/printf("欢迎使用本系统!\n");int i;printf("\n\n\n\n\n\n\n\n\t\t\t\t\t");char heihei[] = {
"即将进入****大学学生信息管理系统..." };for (i = 0; i < strlen(heihei); i++){
printf("%c", heihei[i]);Sleep(10);}system("cls");StuManage();system("cls");Login();
}
Head()和StuManage()的图像化操作,由几个简单的输出流语句构成。
//学生信息管理系统字符图标
void Head()
{
printf("\n");printf("\t\t\t\t\t╭ ? % ╮ ╭ ```╮ \n");printf("\t\t\t\t\t(@^o^@) 学生信息管理系统 (⌒:⌒)\n");printf("\t\t\t\t\t(~):(~) (~)v(~) \n");printf("\n\n\n");
}//学生信息管理系统 管理端字符图标
void StuManage()
{
printf("\n");printf("\t\t\t\t\t╭ ? % ╮ ╭ ```╮ \n");printf("\t\t\t\t\t(@^o^@) 学生信息管理系统 管理端(⌒:⌒)\n");printf("\t\t\t\t\t(~):(~) (~)v(~) \n");printf("\n\n\n");
}
登入系统函数,UserName和UseWord是刚开始进行的宏定义,其内的Sleep函数以毫秒为单位,将该函数的进程滞留一段时间进行演示,登陆成功的话,初始化才算是全部完成。
/*****************************************************************************函 数 名 : Login功能描述 : 登录系统输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Login()
{
StuManage();char xing[] = {
"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " };for (int i = 0; i<strlen(xing); i++){
printf("%c", xing[i]);Sleep(10); //让该函数滞留10ms}printf("\n\n\t\t\t\t\t\t请输入您的账号密码:\n\n\n\n\t\t\t\t\t\t账号:");gets(UserName); //账号 飘小叶printf("\n\n\t\t\t\t\t\t密码:");gets(UserWord); //密码 2220193789
}/*****************************************************************************函 数 名 : isLogin功能描述 : 判断是否登录成功输入参数 : 无输出参数 : 无返 回 值 : int调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
int isLogin()
{
int times = 0; //密码输入次数while (!(strcmp(UserName, MANAGER_NAME) == 0 && strcmp(UserWord, MANAGER_PASSWORD) == 0)){
times++; //密码输入错误 times++if (times > 3){
printf("\n\n\n\n\t\t\t\t账号或密码输入错误累计达到%d次,系统将于3秒后关闭", times);Sleep(1000); //让该函数滞留1s(1000ms)system("cls");char shutdown[] = {
"系统将于%d秒后关闭..." };for (int i = 0; i < 3; i++){
printf(shutdown, 3 - i);Sleep(1000);system("cls");}exit(0);}printf("\n\n\n\n\t\t\t\t账号或密码输入错误,你还有%d次登录机会,按任意键重新登录...", 4 - times);getch();system("cls");Login();}return 1;
}
菜单选择界面,直观的让用户选出自己想要的功能,其内的c-‘0’是字符类型转整型的一种方法,用另一种说法来说的话,这个界面就是MainMenu的直观显示,二者的功能可以划=。
/*****************************************************************************函 数 名 : MenuSelect功能描述 : 菜单选择输入参数 : 无输出参数 : 无返 回 值 : int调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
int MenuSelect()
{
char c;do{
system("cls");Head();printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");printf("\t\t\t\t │ 学生信息管理系统 │\n");printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");printf("\t\t\t\t │ │\n");printf("\t\t\t\t │ 1. 学生信息 2. 显示信息 │\n");printf("\t\t\t\t │ │\n");printf("\t\t\t\t │ 3. 信息录入 4. 信息排名 │\n");printf("\t\t\t\t │ │\n");printf("\t\t\t\t │ 5. 修改信息 6. 删除信息 │\n");printf("\t\t\t\t │ │\n");printf("\t\t\t\t │ 7. 查询数据 0. 退出程序 │\n");printf("\t\t\t\t │ │\n");printf("\t\t\t\t └────────────────────────────────────────────┘\n");printf("\t\t\t\t\t\t 请您选择(0-7):");c = getche();} while (c < '0' || c > '7');return c - '0';
}
头插法读取和保存文件信息
/***************************************************************************** 函 数 名 : ReadData 功能描述 : 读取文件信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 :修改历史: 1.日期 : 2020年7月14日作者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void ReadData()
{
FILE* fRead = fopen("D:\\stuInformation.txt", "rb");if (fRead == NULL){
SaveData(); //文件不存在就创建文件return;}rewind(fRead); //将文件内部指针移回文件开头while (1){
pNew = (PSTU)malloc(sizeof(STU)); //申请一块内存fread(pNew, sizeof(STU), 1, fRead); //1 表示读取一个STU字节大小单元if (feof(fRead)) break; //文件末尾退出//头插法插入数据pNew->pNext = pHead->pNext; pHead->pNext = pNew;pNew = NULL;iCount++;}Sort_Information();fclose(fRead);
}/***************************************************************************** 函 数 名 : SaveData 功能描述 : 写入文件信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 :修改历史 : 1.日期 : 2020年7月14日作者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void SaveData()
{
FILE* fWrite = fopen("D:\\飘小叶_2220193789.txt", "wb");if (fWrite == NULL){
system("cls");printf("保存失败...\n");Quit();}PSTU pCurrent = pHead; //指向第一个节点 如果链表为 NULL //pCurrent为 NULLwhile (pCurrent->pNext != NULL) //遍历所有学生信息 {
fwrite(pCurrent->pNext, sizeof(STU), 1, fWrite);pCurrent = pCurrent->pNext; //指向下一个节点}pCurrent = NULL;fclose(fWrite);
}
同样的Students_Information的图形化界面
/*****************************************************************************函 数 名 : Students_Information功能描述 : 课程信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Students_Information()
{
Head();printf("\t\t\t╔════════════╦════════════╦════════════╦════════════╦════════════╗\n");printf("\t\t\t║ 学号 ║ 姓名 ║ 年龄 ║ 性别 ║ 出生年月 ║║地址 ║║电话 ║║邮箱 ║\n");printf("\t\t\t╚════════════╝════════════╝════════════╝════════════╝════════════╝\n");
}
退出及进入主程序子函数,_exit(0)作为子函数内部退出程序的一种方法与进行主函数退出return 0发挥着近似的作用。
/*****************************************************************************函 数 名 : Quit功能描述 : 退出程序或重新进入主菜单输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Quit()
{
char ch;printf("\n\t ");for (int i = 0; i < 50; i++){
printf("* ");Sleep(10);}printf("\n\n\t\t\t\t要返回登录界面按任意键\t\t退出并保存数据请按Esc键\n");ch = getch();if (ch == 0x1b) //esc键按下{
SaveData();_exit(0);}//重新进入主菜单MainMenu();
}
通过保存的链表进行遍历来显示所有学生的信息,先以结构体类型来设置新的结点来指向头结点,顺序遍历输出学生信息。
/*****************************************************************************函 数 名 : Show_Information功能描述 : 显示所有学生信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Show_Information()
{
Head();PSTU pCurrent = pHead->pNext; //指向第一个节点 如果链表为 NULL pCurrent为 NULLint index = 1;printf("\t\t\t**********************本名单共有 %d 名学生*********************\n\n\n", iCount);printf("\t\t\t ║序号 ║ ║ 学号 ║ 姓名 ║ 年龄 ║ 性别 ║ 出生年月 ║║ 地址 ║║ 电话 ║║ 邮箱 ║\n");while (pCurrent != NULL) //遍历输出所有教师{
printf("\t\t\t %d\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t%s\n", index, pCurrent->iIndex, pCurrent->cName, pCurrent->iOlder,pCurrent->cSex,pCurrent->cDatebirth, pCurrent->cAddress, pCurrent->iPhone, pCurrent->cMailbox);pCurrent = pCurrent->pNext; //指向下一个节点index++; //下标加加}pCurrent = NULL;printf("\n\n\n");
}
因为该学生结构体数组内部的参数都是数组,所以在输入的时候就不需要再使用取地址符,并且
只需要初始化头结点,并不需要设置新的结点去接收他。
/*****************************************************************************函 数 名 : Add_Information功能描述 : 添加学生信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Add_Information()
{
for (int in = 1; in <= 3; in++){
Sleep(100);printf(".");}system("CLS");Head();/************添加学生信息***********/pNew = (PSTU)malloc(sizeof(STU));printf("\t\t\t\t\t\t添加学生信息:\n\n\n\n\t\t\t\t\t\t学号:");scanf("%s", pNew->iIndex);printf("\n\t\t\t\t\t\t姓名:");scanf("%s", pNew->cName);printf("\n\t\t\t\t\t\t年龄:");scanf("%s",pNew->iOlder);printf("\n\t\t\t\t\t\t性别:");scanf("%s",pNew->cSex);printf("\n\t\t\t\t\t\t出生年月:");scanf("%s", pNew->cDatebirth);printf("\n\t\t\t\t\t\t地址:");scanf("%s",pNew->cAddress);printf("\n\t\t\t\t\t\t电话:");scanf("%s",pNew->iPhone);printf("\n\t\t\t\t\t\t邮箱(E-mail):");scanf("%s",pNew->cMailbox);pNew->pNext = pHead->pNext;pHead->pNext = pNew;pNew = NULL;iCount++;
}
设置两个新结点进行接收数据并充当中转站,用冒泡法将以学号为排序标准的学生信息进行排序。
/*****************************************************************************函 数 名 : Sort_Information功能描述 : 对学生信息进行排序输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Sort_Information()
{
if (iCount < 2) //一个学生不需要排序{
return; }//从大到小排序 冒泡排序(利用学号进行排序)PSTU pCurrent,pTemp;STU Temp;for (pCurrent = pHead->pNext; pCurrent != NULL; pCurrent = pCurrent->pNext){
for (pTemp = pCurrent->pNext; pTemp != NULL; pTemp = pTemp->pNext){
if (pCurrent->iIndex < pTemp->iIndex){
Swap(&Temp, pCurrent);Swap(pCurrent, pTemp);Swap(pTemp, &Temp);}}}
}
/*****************************************************************************函 数 名 : Change_Information功能描述 : 修改学生信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Change_Information()
{
Head();char ID[10];char operate;printf("\t\t\t\t\t\t修改学生信息:\n\n\n");printf("\t\t\t\t\t\t请输入学生学号:");scanf("%s", ID);//遍历学生信息PSTU pCurrent = pHead; //指向头结点while (pCurrent-> pNext != NULL) //遍历所有学生{
if (strcmp(pCurrent->pNext ->iIndex, ID) == 0){
printf("\n\n\n\t\t\t\t\t要修改的学生信息...\n\n");printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->pNext->iIndex,pCurrent->pNext->cName, pCurrent->pNext->iOlder, pCurrent->pNext->cSex, pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox);printf("\n\n\n\t\t\t\t\t是否修改该学生信息(y/Enter):");operate = getch();if (operate == 'y' || operate == 'Y' || operate == 13) //13是回车键Enter的ASCII值{
printf("\n\n\t\t\t\t\t重新输入学生信息:\n\n\t\t\t\t\t\t学号:"); //默认只可修改数据(可选项) scanf("%s", pCurrent->pNext->iIndex);printf("\n\t\t\t\t\t\t姓名:");scanf("%s", pCurrent->pNext->cName);printf("\n\t\t\t\t\t\t年龄:");scanf("%s", &pCurrent->pNext->iOlder);printf("\n\t\t\t\t\t\t性别:");scanf("%s", &pCurrent->pNext->cSex);printf("\n\t\t\t\t\t\t出生年月:");scanf("%s", &pCurrent->pNext->cDatebirth);printf("\n\t\t\t\t\t\t地址:");scanf("%s",&pNew->pNext->cAddress);printf("\n\t\t\t\t\t\t电话:");scanf("%s",&pNew->pNext->iPhone);printf("\n\t\t\t\t\t\t邮箱(E-mail):");scanf("%s",&pNew->pNext->cMailbox);printf("\n\n\n\t\t\t\t\t修改成功...\n\n");pCurrent = NULL;return;}else {
printf("\n\n\n\t\t\t\t\t修改失败...\n\n");return;}return;}pCurrent = pCurrent->pNext; //指向下一个节点}pCurrent = NULL;printf("\n\n\n\n\t\t\t\t\t 没有找到要查询的学生信息......\n\n");
}
/*****************************************************************************函 数 名 : Delete_Information功能描述 : 删除学生信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Delete_Information()
{
Head();char ID[10];char operate;printf("\t\t\t\t\t\t删除学生信息:\n\n\n");printf("\t\t\t\t\t\t请输入学生学号:");scanf("%s", ID);//遍历学生信息PSTU pCurrent = pHead; //指向头结点 while (pCurrent->pNext != NULL) //遍历输出所有学生{
if (strcmp(pCurrent->pNext->iIndex, ID) == 0){
//信息库里面有要删除的学生信息printf("\n\n\n\t\t\t\t\t要删除的学生信息...\n\n");printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t \t%s\n",pCurrent->pNext->iIndex, pCurrent->pNext->cName, pCurrent->pNext->iOlder, pCurrent->pNext->cSex, pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox);printf("\n\n\n\t\t\t\t\t是否删除该学生信息(y/Enter):");operate = getch();if (operate == 'y' || operate == 'Y' || operate == 13) //13是回车键Enter的ASCII值{
//删除学生信息PSTU pTemp = pCurrent->pNext; //定义PSTU指针 pTemp 指向要删除的节点pCurrent->pNext = pTemp->pNext; free(pTemp);iCount--;printf("\n\n\n\t\t\t\t\t删除成功...\n\n");return;}else{
printf("\n\n\n\t\t\t\t\t删除失败...\n\n");return;}}pCurrent = pCurrent->pNext; //指向下一个节点}printf("\n\n\n\n\t\t\t\t\t 没有找到要删除的学生信息......\n\n");
}/*****************************************************************************函 数 名 : Search_Information功能描述 : 查询学生信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Search_Information()
{
Head();char ID[10];printf("\t\t\t\t\t\t查询学生信息:\n\n\n");printf("\t\t\t\t\t\t请输入学生学号:");scanf("%s", ID);//遍历学生信息PSTU pCurrent = pHead->pNext; //指向第一个节点 如果链表为 NULL pCurrent为 NULLwhile (pCurrent != NULL) //遍历所有学生{
if (strcmp(pCurrent->iIndex, ID) == 0){
printf("\n\n\n\t\t\t\t\t要查询的学生信息...\n\n");printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->iIndex,pCurrent->cName, pCurrent->iOlder, pCurrent->cSex, pCurrent->cDatebirth,pCurrent->cAddress,pCurrent->iPhone,pCurrent->cMailbox);return;}pCurrent = pCurrent->pNext; //指向下一个节点}pCurrent = NULL;printf("\n\n\n\n\t\t\t\t\t 没有找到要查询的学生信息......\n\n");
}/*****************************************************************************函 数 名 : Swap功能描述 : 交换两个学生信息(即插入功能)输入参数 : PSTU stu1 PSTU stu2 输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Swap(PSTU stu1, PSTU stu2)
{
strcpy(stu1->cName, stu2->cName);strcpy(stu1->iIndex, stu2->iIndex);strcpy(stu1->iOlder,stu2->iOlder);strcpy(stu1->cSex,stu2->cSex);strcpy(stu1->cDatebirth,stu2->cDatebirth);strcpy(stu1->cAddress,stu2->cAddress);strcpy(stu1->iPhone,stu2->iPhone);strcpy(stu1->cMailbox,stu2->cMailbox);
}
全局代码
/************************************************************************************************************************************************************文 件 名 : main.c版 本 号 : 初稿作 者 : 飘小叶生成日期 : 2020年7月14日最近修改 :功能描述 : 学生信息管理系统函数列表 : * * 1. Add_Information 添加学生信息 * 2. Change_Information 修改学生信息 * 3. Delete_Information 删除学生信息 * 4. Head 学生信息管理系统字符图标 * 5. Init 学生信息管理系统初始化字符图标 * 6. isLogin 判断是否登录成功 * 7. Lessons_Information 课程信息 * 8. Login 登录系统 * 9. main 主函数 * 10. MainMenu 主菜单界面 * 11. MenuSelect 菜单选择 * 12. Quit 退出程序或重新进入主菜单 * 13. Search_Information 查询学生信息 * 14. Show_Information 显示所有学生信息 * 15. Sort_Information 对学生信息进行排序 * 16. StuManage 学生信息管理系统 管理端字符图标 * 17. Swap 交换两个教师信息 * 18. ReadData 读取D:\\下的票小叶.txt文件 * 19. SaveData 将链表中的数据存储在D:\\下的飘小叶.txt文件 *修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 创建文件******************************************************************************/#include<stdio.h>
#include<conio.h>
#include<Windows.h>
#define MANAGER_NAME "飘小叶" //账号
#define MANAGER_PASSWORD "2220193789" //密码typedef enum Menu
{
Exit,Lessons,Show,Add,Sort,Change,Delete,Search
}MENU;typedef struct Student //类型首字母大写以和变量区分
{
int iIndex[50]; //学号 char cName[50]; //姓名int iOlder[50]; //年龄char cSex[5]; //性别char cDatebirth[20]; //出生年月char cAddress[50]; //地址int iPhone[20]; //电话char cMailbox[30]; //邮箱(E-mail)struct Student *pNext;
}STU,*PSTU; PSTU pHead = NULL; //学生信息头结点
PSTU pNew = NULL; //待添加学生信息
size_t iCount = 0; //学生总数
char UserName[10]; //用户名(账号)
char UserWord[10]; //密码void Init(); //学生信息初始化
void MainMenu(); //主菜单界面
void StuManage(); //管理系统 管理端 字符图标
void Head(); //管理系统字符图标
void Login(); //登入系统
int isLogin(); //判断是否登入成功int MenuSelect(); //菜单选择
void ReadData(); //读取数据
void SaveData(); //保存数据
void Quit(); //退出程序或重新进入主菜单
void Students_Information();
void Show_Information();
void Add_Information();
void Sort_Information();
void Change_Information();
void Delete_Information();
void Search_Information();
void Swap(PSTU stu1,PSTU stu2);
int main()
{
Init();MainMenu();return 0;
}/*****************************************************************************函 数 名 : MainMenu功能描述 : 主菜单界面输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月4日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void MainMenu()
{
if (isLogin()){
//登录成功switch (MenuSelect()) //菜单选择{
case Exit: //退出程序system("cls");Head(); //管理系统字符图标Quit(); //退出或返回主菜单break;case Lessons: //学生信息system("cls");Students_Information();Quit();break;case Show: //显示所有学生信息system("cls");Show_Information();Quit();break;case Add: //添加学生信息system("cls");Add_Information();Quit();break;case Sort: //对学生信息进行排序system("cls");Sort_Information();Show_Information();Quit();break;case Change: //修改学生信息system("cls");Change_Information();Quit();break;case Delete: //删除学生信息system("cls");Delete_Information();Quit();break;case Search: //查询学生信息system("cls");Search_Information();Quit();break;}}
}/*****************************************************************************函 数 名 : Init功能描述 : 学生信息管理系统初始化字符图标输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Init()
{
/****************初始化数据****************/pHead = (PSTU)malloc(sizeof(STU));pHead->pNext = NULL;SetConsoleTitle("学生信息管理系统(管理员)");ReadData();/****************载入界面*****************/printf("欢迎使用本系统!\n");int i;printf("\n\n\n\n\n\n\n\n\t\t\t\t\t");char heihei[] = {
"即将进入****大学学生信息管理系统..." };for (i = 0; i < strlen(heihei); i++){
printf("%c", heihei[i]);Sleep(10);}system("cls");StuManage();system("cls");Login();
}//学生信息管理系统字符图标
void Head()
{
printf("\n");printf("\t\t\t\t\t╭ ? % ╮ ╭ ```╮ \n");printf("\t\t\t\t\t(@^o^@) 学生信息管理系统 (⌒:⌒)\n");printf("\t\t\t\t\t(~):(~) (~)v(~) \n");printf("\n\n\n");
}//学生信息管理系统 管理端字符图标
void StuManage()
{
printf("\n");printf("\t\t\t\t\t╭ ? % ╮ ╭ ```╮ \n");printf("\t\t\t\t\t(@^o^@) 学生信息管理系统 管理端(⌒:⌒)\n");printf("\t\t\t\t\t(~):(~) (~)v(~) \n");printf("\n\n\n");
}/*****************************************************************************函 数 名 : Login功能描述 : 登录系统输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Login()
{
StuManage();char xing[] = {
"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * " };for (int i = 0; i<strlen(xing); i++){
printf("%c", xing[i]);Sleep(10);}printf("\n\n\t\t\t\t\t\t请输入您的账号密码:\n\n\n\n\t\t\t\t\t\t账号:");gets(UserName); //账号 飘小叶printf("\n\n\t\t\t\t\t\t密码:");gets(UserWord); //密码 2220193789
}/*****************************************************************************函 数 名 : isLogin功能描述 : 判断是否登录成功输入参数 : 无输出参数 : 无返 回 值 : int调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
int isLogin()
{
int times = 0; //密码输入次数while (!(strcmp(UserName, MANAGER_NAME) == 0 && strcmp(UserWord, MANAGER_PASSWORD) == 0)){
times++; //密码输入错误 times++if (times > 3){
printf("\n\n\n\n\t\t\t\t账号或密码输入错误累计达到%d次,系统将于3秒后关闭", times);Sleep(1000);system("cls");char shutdown[] = {
"系统将于%d秒后关闭..." };for (int i = 0; i < 3; i++){
printf(shutdown, 3 - i);Sleep(1000);system("cls");}exit(0);}printf("\n\n\n\n\t\t\t\t账号或密码输入错误,你还有%d次登录机会,按任意键重新登录...", 4 - times);getch();system("cls");Login();}return 1;
}/*****************************************************************************函 数 名 : MenuSelect功能描述 : 菜单选择输入参数 : 无输出参数 : 无返 回 值 : int调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
int MenuSelect()
{
char c;do{
system("cls");Head();printf("\t\t\t\t ╭═════════════════════════════════○●○●═══╮\n");printf("\t\t\t\t │ 学生信息管理系统 │\n");printf("\t\t\t\t ╰═══○●○●═════════════════════════════════╯\n");printf("\t\t\t\t ┌───────────────────────────────────────────-┐\n");printf("\t\t\t\t │ │\n");printf("\t\t\t\t │ 1. 学生信息 2. 显示信息 │\n");printf("\t\t\t\t │ │\n");printf("\t\t\t\t │ 3. 信息录入 4. 信息排名 │\n");printf("\t\t\t\t │ │\n");printf("\t\t\t\t │ 5. 修改信息 6. 删除信息 │\n");printf("\t\t\t\t │ │\n");printf("\t\t\t\t │ 7. 查询数据 0. 退出程序 │\n");printf("\t\t\t\t │ │\n");printf("\t\t\t\t └────────────────────────────────────────────┘\n");printf("\t\t\t\t\t\t 请您选择(0-7):");c = getche();} while (c < '0' || c > '7');return c - '0';
}/***************************************************************************** 函 数 名 : ReadData 功能描述 : 读取文件信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 :修改历史: 1.日期 : 2020年7月14日作者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void ReadData()
{
FILE* fRead = fopen("D:\\stuInformation.txt", "rb");if (fRead == NULL){
SaveData(); //文件不存在就创建文件return;}rewind(fRead); //将文件内部指针移回文件开头while (1){
pNew = (PSTU)malloc(sizeof(STU)); //申请一块内存fread(pNew, sizeof(STU), 1, fRead); //1 表示读取一个STU字节大小单元if (feof(fRead)) break; //文件末尾退出//头插法插入数据pNew->pNext = pHead->pNext; pHead->pNext = pNew;pNew = NULL;iCount++;}Sort_Information();fclose(fRead);
}/***************************************************************************** 函 数 名 : SaveData 功能描述 : 写入文件信息 输入参数 : 无 输出参数 : 无 返 回 值 : void 调用函数 : 被调函数 :修改历史 : 1.日期 : 2020年7月14日作者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void SaveData()
{
FILE* fWrite = fopen("D:\\飘小叶_2220193789.txt", "wb");if (fWrite == NULL){
system("cls");printf("保存失败...\n");Quit();}PSTU pCurrent = pHead; //指向第一个节点 如果链表为 NULL //pCurrent为 NULLwhile (pCurrent->pNext != NULL) //遍历所有学生信息 {
fwrite(pCurrent->pNext, sizeof(STU), 1, fWrite);pCurrent = pCurrent->pNext; //指向下一个节点}pCurrent = NULL;fclose(fWrite);
}/*****************************************************************************函 数 名 : Students_Information功能描述 : 课程信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Students_Information()
{
Head();printf("\t\t\t╔════════════╦════════════╦════════════╦════════════╦════════════╗\n");printf("\t\t\t║ 学号 ║ 姓名 ║ 年龄 ║ 性别 ║ 出生年月 ║║地址 ║║电话 ║║邮箱 ║\n");printf("\t\t\t╚════════════╝════════════╝════════════╝════════════╝════════════╝\n");
}/*****************************************************************************函 数 名 : Quit功能描述 : 退出程序或重新进入主菜单输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Quit()
{
char ch;printf("\n\t ");for (int i = 0; i < 50; i++){
printf("* ");Sleep(10);}printf("\n\n\t\t\t\t要返回登录界面按任意键\t\t退出并保存数据请按Esc键\n");ch = getch();if (ch == 0x1b) //esc键按下{
SaveData();_exit(0);}//重新进入主菜单MainMenu();
}/*****************************************************************************函 数 名 : Show_Information功能描述 : 显示所有学生信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Show_Information()
{
Head();PSTU pCurrent = pHead->pNext; //指向第一个节点 如果链表为 NULL pCurrent为 NULLint index = 1;printf("\t\t\t**********************本名单共有 %d 名学生*********************\n\n\n", iCount);printf("\t\t\t ║序号 ║ ║ 学号 ║ 姓名 ║ 年龄 ║ 性别 ║ 出生年月 ║║ 地址 ║║ 电话 ║║ 邮箱 ║\n");while (pCurrent != NULL) //遍历输出所有教师{
printf("\t\t\t %d\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t%s\n", index, pCurrent->iIndex, pCurrent->cName, pCurrent->iOlder,pCurrent->cSex,pCurrent->cDatebirth, pCurrent->cAddress, pCurrent->iPhone, pCurrent->cMailbox);pCurrent = pCurrent->pNext; //指向下一个节点index++; //下标加加}pCurrent = NULL;printf("\n\n\n");
}/*****************************************************************************函 数 名 : Add_Information功能描述 : 添加学生信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Add_Information()
{
for (int in = 1; in <= 3; in++){
Sleep(100);printf(".");}system("CLS");Head();/************添加学生信息***********/pNew = (PSTU)malloc(sizeof(STU));printf("\t\t\t\t\t\t添加学生信息:\n\n\n\n\t\t\t\t\t\t学号:");scanf("%s", pNew->iIndex);printf("\n\t\t\t\t\t\t姓名:");scanf("%s", pNew->cName);printf("\n\t\t\t\t\t\t年龄:");scanf("%s",pNew->iOlder);printf("\n\t\t\t\t\t\t性别:");scanf("%s",pNew->cSex);printf("\n\t\t\t\t\t\t出生年月:");scanf("%s", pNew->cDatebirth);printf("\n\t\t\t\t\t\t地址:");scanf("%s",pNew->cAddress);printf("\n\t\t\t\t\t\t电话:");scanf("%s",pNew->iPhone);printf("\n\t\t\t\t\t\t邮箱(E-mail):");scanf("%s",pNew->cMailbox);pNew->pNext = pHead->pNext;pHead->pNext = pNew;pNew = NULL;iCount++;
}/*****************************************************************************函 数 名 : Sort_Information功能描述 : 对学生信息进行排序输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Sort_Information()
{
if (iCount < 2) //一个学生不需要排序{
return; }//从大到小排序 冒泡排序(利用教学效果综合评分进行排序)PSTU pCurrent,pTemp;STU Temp;for (pCurrent = pHead->pNext; pCurrent != NULL; pCurrent = pCurrent->pNext){
for (pTemp = pCurrent->pNext; pTemp != NULL; pTemp = pTemp->pNext){
if (pCurrent->iIndex < pTemp->iIndex){
Swap(&Temp, pCurrent);Swap(pCurrent, pTemp);Swap(pTemp, &Temp);}}}
}/*****************************************************************************函 数 名 : Change_Information功能描述 : 修改学生信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Change_Information()
{
Head();char ID[10];char operate;printf("\t\t\t\t\t\t修改学生信息:\n\n\n");printf("\t\t\t\t\t\t请输入学生学号:");scanf("%s", ID);//遍历学生信息PSTU pCurrent = pHead; //指向头结点while (pCurrent-> pNext != NULL) //遍历所有学生{
if (strcmp(pCurrent->pNext ->iIndex, ID) == 0){
printf("\n\n\n\t\t\t\t\t要修改的学生信息...\n\n");printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->pNext->iIndex,pCurrent->pNext->cName, pCurrent->pNext->iOlder, pCurrent->pNext->cSex, pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox);printf("\n\n\n\t\t\t\t\t是否修改该学生信息(y/Enter):");operate = getch();if (operate == 'y' || operate == 'Y' || operate == 13) //13是回车键Enter的ASCII值{
printf("\n\n\t\t\t\t\t重新输入学生信息:\n\n\t\t\t\t\t\t学号:"); //默认只可修改数据(可选项) scanf("%s", pCurrent->pNext->iIndex);printf("\n\t\t\t\t\t\t姓名:");scanf("%s", pCurrent->pNext->cName);printf("\n\t\t\t\t\t\t年龄:");scanf("%s", &pCurrent->pNext->iOlder);printf("\n\t\t\t\t\t\t性别:");scanf("%s", &pCurrent->pNext->cSex);printf("\n\t\t\t\t\t\t出生年月:");scanf("%s", &pCurrent->pNext->cDatebirth);printf("\n\t\t\t\t\t\t地址:");scanf("%s",&pNew->pNext->cAddress);printf("\n\t\t\t\t\t\t电话:");scanf("%s",&pNew->pNext->iPhone);printf("\n\t\t\t\t\t\t邮箱(E-mail):");scanf("%s",&pNew->pNext->cMailbox);printf("\n\n\n\t\t\t\t\t修改成功...\n\n");pCurrent = NULL;return;}else {
printf("\n\n\n\t\t\t\t\t修改失败...\n\n");return;}return;}pCurrent = pCurrent->pNext; //指向下一个节点}pCurrent = NULL;printf("\n\n\n\n\t\t\t\t\t 没有找到要查询的学生信息......\n\n");
}/*****************************************************************************函 数 名 : Delete_Information功能描述 : 删除学生信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Delete_Information()
{
Head();char ID[10];char operate;printf("\t\t\t\t\t\t删除学生信息:\n\n\n");printf("\t\t\t\t\t\t请输入学生学号:");scanf("%s", ID);//遍历学生信息PSTU pCurrent = pHead; //指向头结点 while (pCurrent->pNext != NULL) //遍历输出所有学生{
if (strcmp(pCurrent->pNext->iIndex, ID) == 0){
//信息库里面有要删除的学生信息printf("\n\n\n\t\t\t\t\t要删除的学生信息...\n\n");printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t \t%s\n",pCurrent->pNext->iIndex, pCurrent->pNext->cName, pCurrent->pNext->iOlder, pCurrent->pNext->cSex, pCurrent->pNext->cDatebirth,pCurrent->pNext->cAddress,pCurrent->pNext->iPhone,pCurrent->pNext->cMailbox);printf("\n\n\n\t\t\t\t\t是否删除该学生信息(y/Enter):");operate = getch();if (operate == 'y' || operate == 'Y' || operate == 13) //13是回车键Enter的ASCII值{
//删除学生信息PSTU pTemp = pCurrent->pNext; //定义PSTU指针 pTemp 指向要删除的节点pCurrent->pNext = pTemp->pNext; free(pTemp);iCount--;printf("\n\n\n\t\t\t\t\t删除成功...\n\n");return;}else{
printf("\n\n\n\t\t\t\t\t删除失败...\n\n");return;}}pCurrent = pCurrent->pNext; //指向下一个节点}printf("\n\n\n\n\t\t\t\t\t 没有找到要删除的学生信息......\n\n");
}/*****************************************************************************函 数 名 : Search_Information功能描述 : 查询学生信息输入参数 : 无输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Search_Information()
{
Head();char ID[10];printf("\t\t\t\t\t\t查询学生信息:\n\n\n");printf("\t\t\t\t\t\t请输入学生学号:");scanf("%s", ID);//遍历学生信息PSTU pCurrent = pHead->pNext; //指向第一个节点 如果链表为 NULL pCurrent为 NULLwhile (pCurrent != NULL) //遍历所有学生{
if (strcmp(pCurrent->iIndex, ID) == 0){
printf("\n\n\n\t\t\t\t\t要查询的学生信息...\n\n");printf("\n\n\t\t\t\t\t学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\t邮箱(E-mail)\n\n");printf("\t\t\t\t\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\t%s\n", pCurrent->iIndex,pCurrent->cName, pCurrent->iOlder, pCurrent->cSex, pCurrent->cDatebirth,pCurrent->cAddress,pCurrent->iPhone,pCurrent->cMailbox);return;}pCurrent = pCurrent->pNext; //指向下一个节点}pCurrent = NULL;printf("\n\n\n\n\t\t\t\t\t 没有找到要查询的学生信息......\n\n");
}/*****************************************************************************函 数 名 : Swap功能描述 : 交换两个学生信息(即插入功能)输入参数 : PSTU stu1 PSTU stu2 输出参数 : 无返 回 值 : void调用函数 : 被调函数 : 修改历史 :1.日 期 : 2020年7月14日作 者 : 飘小叶修改内容 : 新生成函数*****************************************************************************/
void Swap(PSTU stu1, PSTU stu2)
{
strcpy(stu1->cName, stu2->cName);strcpy(stu1->iIndex, stu2->iIndex);strcpy(stu1->iOlder,stu2->iOlder);strcpy(stu1->cSex,stu2->cSex);strcpy(stu1->cDatebirth,stu2->cDatebirth);strcpy(stu1->cAddress,stu2->cAddress);strcpy(stu1->iPhone,stu2->iPhone);strcpy(stu1->cMailbox,stu2->cMailbox);
}