当前位置: 代码迷 >> 综合 >> 学生信息管理系统---信息包括学号,姓名,年龄,性别,出生年月,地址,电话,E-mail。功能:信息录入(信息用文件保存),信息浏览,查询,排序,删除和修改
  详细解决方案

学生信息管理系统---信息包括学号,姓名,年龄,性别,出生年月,地址,电话,E-mail。功能:信息录入(信息用文件保存),信息浏览,查询,排序,删除和修改

热度:24   发布时间:2024-02-28 10:38:56.0
首先是对整体函数所需要的功能进行子函数的分类,让信息的输入,处理,输出,都可以进行模块化的设计

文 件 名 : 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.日    期   : 2020714日作    者   : 飘小叶修改内容   : 创建文件******************************************************************************/#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);
}
  相关解决方案