"点击上方“蓝色字”,关注我们哦(*^▽^*)!"
NO.1
篇幅较长,请空闲时观看
前言这个项目是大一暑假完成,纯C语言编写,界面比较美观,由于当时还是一个初学者,有什么问题希望大家可以批评指正。(源码会在第二篇文章末尾给出)
这个项目有些瑕疵,但基本功能都已实现,在此分享一下我的思路。
全部内容我会分为两部分: 第一部分主要写每个功能界面以及它们之间的逻辑关系。 第二部分主要写 单链表和文件读写 的实现。 正文先看看作品效果
流程图如下
首先是一个菜单选择界面,其中包括登录,找回密码和退出系统。
源码如下
//主界面
void menu(){
printf("\t\t\t----------------------------------------\n");
printf("\t\t\t|\t欢迎来到三千学生管理系统\t|\n");
printf("\t\t\t----------------------------------------\n");
printf("\t\t\t|\t1.登陆\t\t\t\t|\n");
printf("\t\t\t|\t2.找回密码\t\t\t|\n");
printf("\t\t\t|\t3.退出系统\t\t\t|\n");
printf("\t\t\t----------------------------------------\n");
printf("\t\t\t请选择功能(1-3)(按回车键确认):");
//获取选择
int choice = 0;
scanf("%d",&choice);
//清除缓冲区
char ch;
while((ch = getchar()) != '\n' && ch != EOF);
switch(choice)//判断选择
{
case 1:
{
system("cls");//刷新界面
login();//调用login()函数进行登录
break;
}
case 2:
{
system("cls");
rebackPassword();//调用rebackPassword()函数找回密码
break;
}
case 3:
{
printf("\n\t\t\t");
exit(0);//退出系统
}
default:
{
//当输入不是指定选项时
printf("\n\t\t\t输入错误!请重新输入!\n\t\t\t");
system("pause");//暂停程序
system("cls");//刷新界面
menu();//重新调用本函数
break;
}
}
}
选择其中一项都会跳转到其他界面。本文只写登录和登录成功后。登录失败以及找回密码都有对应措施,在文中不再介绍。
进入登录界面后,输入密码:123,即可登录成功。
源码如下
//登录界面
void login(){
int i = 0;
char Password[]="123";//登录密码
char tempPass[10]="0";//从输入端获取的密码
printf("\t\t\t---------------登陆系统---------------\n\n");
printf("\t\t\t\t管理员账号:三千\n");
for(i=1;i<=3;i++)
{
printf("\t\t\t\t管理员密码:");
//获取你所输入的密码
scanf("%s",tempPass);
//清除缓冲区
char ch;
while((ch = getchar()) != '\n' && ch != EOF);
//判断登录密码和获取的密码是否相同
//strcmp()用于字符串比较,两字符串相同时返回0
if(!strcmp(Password,tempPass))
{
printf("\n\t\t\t\t登陆成功!");
printf("\n\t\t\t\t");
system("pause");//程序暂停
system("cls");//刷新界面
function();//调用fuction()函数进入功能界面
}else
{
//密码错误达到三次
if(3 == i)
{
printf("\n\t\t\t\t密码输入错误3次!请重新选择!\n\n");
printf("\t\t\t\t");
system("pause");
}else
{
printf("\n\t\t\t\t密码输入错误%d次!请重新输入!\n",i);
}
}
}
if(4 == i)
{
system("cls");
//登录密码失败后进入登录分界面
login_Second();/
}
}
//登录分界面,解决密码输入错误超过三次后
void login_Second(){
printf("\t\t\t-------------------------------------\n");
printf("\t\t\t|\t 1.找回密码\t\t |\n");
printf("\t\t\t|\t 2.重新登录\t\t |\n");
printf("\t\t\t|\t 3.退出系统\t\t |\n");
printf("\t\t\t-------------------------------------\n");
printf("\t\t\t\t 请选择(1-3):");
//获取选择
int choice = 0;
scanf("%d",&choice);
//清除缓冲区
char ch;
while((ch = getchar()) != '\n' && ch != EOF);
switch(choice)
{
case 1:
{
system("cls");//刷新界面
rebackPassword();//调用rebackPassword()函数找回密码
break;
}
case 2:
{
system("cls");
login();//调用login()函数进行登录
break;
}
case 3:
{
printf("\n\t\t\t\t");
exit(0);//退出系统
}
default:
{
printf("\n\t\t\t\t输入错误!请重新输入!\n\t\t\t\t");
system("pause");//暂停程序
system("cls");//刷新界面
login_Second();//重新调用本函数
break;
}
}
}
登录成功后进入功能选择界面。
其中包括八个功能:增,删,改,查,统计,排序,返回,退出。
源码如下
//功能界面
void function(){
printf("\t\t\t-----------------------------------------\n");
printf("\t\t\t|\t欢迎使用三千学生管理系统\t|\n");
printf("\t\t\t-----------------------------------------\n");
printf("\t\t\t|\t1.添加学生信息\t\t\t|\n");
printf("\t\t\t|\t2.统计学生信息\t\t\t|\n");
printf("\t\t\t|\t3.查找学生信息\t\t\t|\n");
printf("\t\t\t|\t4.修改学生信息\t\t\t|\n");
printf("\t\t\t|\t5.删除学生信息\t\t\t|\n");
printf("\t\t\t|\t6.排序学生信息\t\t\t|\n");
printf("\t\t\t|\t7.返回上一级\t\t\t|\n");
printf("\t\t\t|\t8.退出程序\t\t\t|\n");
printf("\t\t\t-----------------------------------------\n");
printf("\t\t\t请选择功能(1-8):");
//存储临时数据
struct student tempData={"0","0","0",0,0.0,0.0,0.0};
//获取选择
int choice = 0;
scanf("%d",&choice);
//清除缓冲区
char ch;
while((ch = getchar()) != '\n' && ch != EOF);
switch(choice)
{
case 1:
{
//调用addStudent()函数添加学生信息
addStudent(tempData);
printf("\n\t\t\t\t");
system("pause");//暂停程序
system("cls");//刷新界面
break;
}
case 2:
{
printf("\n\t\t\t--------------统计学生信息--------------\n");
//调用printList()函数打印所有学生信息
printList(List);
printf("\n\t\t\t\t");
system("pause");
system("cls");
break;
}
case 3:
{
//调用searchStudent()函数查找学生信息
searchStudent(tempData);
printf("\n\t\t\t\t");
system("pause");
system("cls");
break;
}
case 4:
{
//调用modifyStudent()函数修改学生信息
modifyStudent(tempData);
printf("\n\t\t\t\t");
system("pause");
system("cls");
break;
}
case 5:
{
//调用deleteStudent()函数删除学生信息
deleteStudent(tempData);
printf("\n\t\t\t\t");
system("pause");
system("cls");
break;
}
case 6:
{
//调用sortStudent()函数排序学生信息
sortStudent();
printf("\n\t\t\t\t");
system("pause");
system("cls");
break;
}
case 7:
{
system("cls");
menu();//返回主界面
break;
}
case 8:
{
printf("\n\t\t\t\t");
exit(0);//退出系统
}
default:
{
printf("\n\t\t\t\t输入错误!请重新输入!\n");
printf("\n\t\t\t\t");
system("pause");//暂停程序
system("cls");//刷新界面
break;
}
}
function();//重新调用本函数
}
每一个功能的实现背后都有链表和文件在运行工作。(我将链表和文件读写的实现专门写在另一个.h文件中,在第二篇文章中将会写到。)
接下来开始一一讲解程序的功能(功能效果图不再展示)
功能一:添加学生信息
调用addStudent()函数将学生信息添加到链表中,并最终存储在文件中。
//添加学生信息
void addStudent(struct student tempData){
printf("\n\t\t\t--------------添加学生信息--------------\n");
printf("\t\t\t\t学号:");
scanf("%s",tempData.id);//获取学生学号
char ch;
while((ch = getchar()) != '\n' && ch != EOF);//清除缓冲区
printf("\t\t\t\t姓名:");
scanf("%s",tempData.name);//获取学生姓名
while((ch = getchar()) != '\n' && ch != EOF);
printf("\t\t\t\t性别:");
scanf("%s",tempData.gender);//获取学生性别
while((ch = getchar()) != '\n' && ch != EOF);
printf("\t\t\t\t年龄:");
scanf("%d",&tempData.age);//获取学生年龄
while((ch = getchar()) != '\n' && ch != EOF);
printf("\t\t\t\t数学:");
scanf("%f",&tempData.math);//获取学生数学成绩
while((ch = getchar()) != '\n' && ch != EOF);
printf("\t\t\t\t英语成绩:");
scanf("%f",&tempData.english);//获取学生英语成绩
while((ch = getchar()) != '\n' && ch != EOF);
tempData.sumscore=tempData.math+tempData.english;//计算学生总成绩
printf("\t\t\t\t总成绩为:%.1f\n",tempData.sumscore);//打印学生总成绩
insertnode(List,tempData);//向链表中插入学生信息
saveToFile("student.txt",List);//将链表中的学生信息保存到文件student.txt
printf("\n\t\t\t\t添加成功!\n");
}
功能二:统计学生信息
调用printList()函数将链表中的全部学生信息打印到界面上。
...
case 2:
{
printf("\n\t\t\t--------------统计学生信息--------------\n");
//调用printList()函数打印所有学生信息
printList(List);
printf("\n\t\t\t\t");
system("pause");
system("cls");
break;
}
...
//打印学生信息,打印函数,位于另一个.h文件中
void printList(struct Node *StudentListhead){
struct Node *pmove=StudentListhead->next;
//按格式打印
printf("\t学号\t\t姓名\t性别\t年龄\t高数成绩\t英语成绩\t成绩总和\n");
while(pmove)//pmove为NULL时,退出循环
{
//格式化输出打印
printf("\t%-10s\t%-4s\t%-6s\t%-3d\t%.1f\t\t%.1f\t\t%.1f\n",pmove->data.id,pmove->data.name,pmove->data.gender,pmove->data.age,pmove->data.math,pmove->data.english,pmove->data.sumscore);
//pmove指向下一个结点,以此遍历链表
pmove=pmove->next;
}
printf("\n");
}
功能三:查找学生信息
方式:1.按学号查找
2.按姓名查找(缺陷:若有重名者,只能查找其中一个)
输入要查找学生的学号或姓名,与链表中的学生信息进行对比。若存在,则打印该学生信息;反之则打印“查无此人!”
//查找学生信息
void searchStudent(struct student tempData){
printf("\n\t\t\t---------------查找学生信息--------------\n\n");
printf("\t\t\t\t1.按学号查找\t\t\t\t\n");
printf("\t\t\t\t2.按姓名查找\t\t\t\t\n");
printf("\t\t\t\t请选择功能:");
//获取选择
int choice = 0;
scanf("%d",&choice);
//清除缓冲区
char ch;
while((ch = getchar()) != '\n' && ch != EOF);
switch(choice)
{
case 1:
{
printf("\n\t\t\t请输入要查找的学生的学号:");
scanf("%s",tempData.id);//获取学生学号
while((ch= getchar()) != '\n' && ch != EOF);//清除缓冲区
//searchnode_byid()返回值为结点指针或NULL
//返回NULL,说明未查到
if(searchnode_byid(List,tempData.id) == NULL)
{
//若链表中不存在该学号
printf("\n\t\t\t\t查无此人!\n");
} else
{
//打印查找的学生信息
printsearch(searchnode_byid(List,tempData.id));
}
break;
}
case 2:
{
printf("\n\t\t\t请输入要查找的学生的姓名:");
scanf("%s",tempData.name);//获取学生姓名
while((ch = getchar()) != '\n' && ch != EOF);//清除缓冲区
//searchnode_byname()返回值为结点指针或NULL
//返回NULL,说明未查到
if(searchnode_byname(List,tempData.name) == NULL)
{
//若链表中不存在该姓名
printf("\n\t\t\t\t查无此人!\n");
}else
{
//打印查找的学生信息
printsearch(searchnode_byname(List,tempData.name));
}
break;
}
default:
{
printf("\n\t\t\t\t输入错误!请重新输入!\n");
break;
}
}
}
功能四:修改学生信息
方式:1.按学号查找修改
2.按姓名查找修改(缺陷:若有重名者,只能查找其中一个)
调用modifyStudent()函数将在链表中查找到学生信息进行修改,再重新保存到文件中。
//修改学生信息
void modifyStudent(struct student tempData){
printf("\n\t\t\t--------修改学生信息--------\t\t\t\t\n");
//先调用printList()函数打印全部学生信息
printList(List);
printf("\t\t\t\t1.按学号修改\t\t\t\t\n");
printf("\t\t\t\t2.按姓名修改\t\t\t\t\n");
printf("\t\t\t\t请选择功能:");
//获取选择
int choice = 0;
scanf("%d",&choice);
//清除缓冲区
char ch;
while((ch = getchar()) != '\n' && ch != EOF);
switch(choice)
{
case 1:
{
printf("\n\t\t\t请输入要修改的学生的学号:");
scanf("%s",tempData.id);//获取学生的学号
while((ch = getchar()) != '\n' && ch != EOF);
if(searchnode_byid(List,tempData.id) == NULL)
{
//若链表中不存在该学号
printf("\n\t\t\t\t查无此人!\n");
}else
{
//修改学生信息的分函数
modifyStudent_Second(tempData);
}
break;
}
case 2:
{
printf("\n\t\t\t\t请输入要修改的学生的姓名:");
scanf("%s",tempData.name);//获取学生姓名
while((ch = getchar()) != '\n' && ch != EOF);
if(searchnode_byname(List,tempData.name)==NULL)
{
//若链表中不存在该姓名
printf("\n\t\t\t\t查无此人!\n");
}else
{
modifyStudent_Second(tempData);
}
break;
}
default:
{
printf("\t\t\t\t输入错误!请重新输入!\n");
function();//进入功能界面
break;
}
}
}
void modifyStudent_Second(struct student tempData){
//重新定义一个指针并指向要修改的学生的信息的结点
struct Node *curnode=searchnode_byid(List,tempData.id);
//调用printsearch()函数打印要修改学生的信息
printsearch(searchnode_byid(List,tempData.id));
printf("\n");
printf("\t\t\t\t1.学号\t\t\t\t\n");
printf("\t\t\t\t2.姓名\t\t\t\t\n");
printf("\t\t\t\t3.性别\t\t\t\t\n");
printf("\t\t\t\t4.年龄\t\t\t\t\n");
printf("\t\t\t\t5.高数成绩\t\t\t\t\n");
printf("\t\t\t\t6.英语成绩\t\t\t\t\n");
printf("\t\t\t\t请选择要修改的内容:");
//获取选择
int choice = 0;
scanf("%d",&choice);
//清除缓冲区
char ch;
while((ch = getchar()) != '\n' && ch != EOF);
switch(choice)
{
case 1:
{
printf("\n\t\t\t\t修改前的学号:%s\n",curnode->data.id);
printf("\t\t\t\t请输入修改后的学号:");
scanf("%s",curnode->data.id);
while((ch = getchar()) != '\n' && ch != EOF);
//将修改后的信息保存到文件
saveToFile("student.txt",List);
printf("\n\t\t\t\t修改成功!\n");
break;
}
case 2:
{
printf("\n\t\t\t\t修改前的姓名:%s\n",curnode->data.name);
printf("\t\t\t\t请输入修改后的姓名:");
scanf("%s",curnode->data.name);
while((ch = getchar()) != '\n' && ch != EOF);
saveToFile("student.txt",List);
printf("\n\t\t\t\t修改成功!\n");
break;
}
case 3:
{
printf("\n\t\t\t\t修改前的性别:%s\n",curnode->data.gender);
printf("\t\t\t\t请输入修改后的性别:");
scanf("%s",curnode->data.gender);
while((ch= getchar()) != '\n' && ch != EOF);
saveToFile("student.txt",List);
printf("\n\t\t\t\t修改成功!\n");
break;
}
case 4:
{
printf("\n\t\t\t\t修改前的年龄:%d\n",curnode->data.age);
printf("\t\t\t\t请输入修改后的年龄:");
scanf("%d",&curnode->data.age);
while((ch = getchar()) != '\n' && ch != EOF);
saveToFile("student.txt",List);
printf("\n\t\t\t\t修改成功!\n");
break;
}
case 5:
{
printf("\n\t\t\t\t修改前的高数成绩:%.1f\n",curnode->data.math);
printf("\t\t\t\t请输入修改后的高数成绩:");
scanf("%f",&curnode->data.math);
while((ch = getchar()) != '\n' && ch != EOF);
//计算总成绩
curnode->data.sumscore=curnode->data.math+curnode->data.english;
saveToFile("student.txt",List);
printf("\n\t\t\t\t修改成功!\n");
break;
}
case 6:
{
printf("\n\t\t\t\t修改前的英语成绩:%.1f\n",curnode->data.english);
printf("\t\t\t\t请输入修改后的英语成绩:");
scanf("%f",&curnode->data.english);
while((ch = getchar()) != '\n' && ch != EOF);
curnode->data.sumscore=curnode->data.math+curnode->data.english;
saveToFile("student.txt",List);
printf("\n\t\t\t\t修改成功!\n");
break;
}
default:
{
printf("\n\t\t\t\t输入错误!请重新输入!\n");
break;
}
}
}
功能五:删除学生信息
方式:1.按学号查找删除
2.按姓名查找删除(缺陷:若有重名者,只能查找其中一个)
调用deleteStudent()函数将在链表中查找到的学生信息进行删除,再重新保存到文件。
//删除学生信息
void deleteStudent(struct student tempData){
printf("\n\t\t\t--------------删除学生信息---------------\n");
//调用printList()函数打印全部学生信息
printList(List);
printf("\t\t\t\t1.按学号删除\t\t\t\t\n");
printf("\t\t\t\t2.按姓名删除\t\t\t\t\n");
printf("\t\t\t\t请选择功能:");
//获取选择
int choice = 0;
scanf("%d",&choice);
//清除缓冲区
char ch;
while((ch = getchar()) != '\n' && ch != EOF);
switch(choice)
{
case 1:
{
printf("\n\t\t\t请输入要删除的学生的学号:");
scanf("%s",tempData.id);
while((ch = getchar()) != '\n' && ch != EOF);
//从链表中删除学生信息
Deletenode_byid(List,tempData.id);
//将剩余信息保存到文件
saveToFile("student.txt",List);
break;
}
case 2:
{
printf("\n\t\t\t请输入要删除的学生的姓名:");
scanf("%s",tempData.name);
while((ch = getchar()) != '\n' && ch != EOF);
Deletenode_byname(List,tempData.name);
saveToFile("student.txt",List);
break;
}
default:
{
printf("\n\t\t\t\t输入错误!请重新输入!\n");
break;
}
}
}
功能六:排序学生信息
方式:1.根据学号排序(从低到高)
2.根据数学成绩排序(从高到低)
3.根据英语成绩排序(从高到低)
4.根据总成绩排序(从高到低)
调用sortStudent()函数按照所选项将链表中的学生信息排序,并打印到界面上。
//排序
void sortStudent(){
printf("\n\t\t\t---------------排序学生信息--------------\n");
printf("\t\t\t\t1.根据学号排序(从低到高)\n");
printf("\t\t\t\t2.根据数学成绩排序(从高到低)\n");
printf("\t\t\t\t3.根据英语成绩排序(从高到低)\n");
printf("\t\t\t\t4.根据总成绩排序(从高到低)\n");
printf("\t\t\t\t请选择功能(1-4):");
//获取选择
int choice = 0;
scanf("%d",&choice);
//清除缓冲区
char ch;
while((ch = getchar()) != '\n' && ch != EOF);
switch(choice)
{
case 1:
{
//按学号从低到高排序链表
sortList_byid(List);
//将排序后的信息保存到文件
saveToFile("student.txt",List);
//打印链表中的信息
printList(List);
break;
}
case 2:
{
//按数学成绩从高到低排序链表
sortList_bymath(List);
printList(List);
break;
}
case 3:
{
//按英语成绩从高到低排序链表
sortList_byenglish(List);
printList(List);
break;
}
case 4:
{
//按总成绩从高到低排序链表
sortList_bysumscore(List);
printList(List);
break;
}
default:
{
printf("\n\t\t\t\t输入错误!请重新输入!\n");
break;
}
}
}
功能七:返回上一级
调用menu()函数返回主界面
void function(){
...
case 7:
{
system("cls");
menu();//返回主界面
break;
}
...
}
功能八:退出程序
void function(){
...
case 8:
{
printf("\n\t\t\t\t");
exit(0);//退出系统
}
...
}
最后main()函数
//主函数
int main(){
//设置控制台标题,颜色,尺寸
system("title 学生信息管理系统");
system("color F0");
system("mode con cols=90 lines=30");
//创造一个链表,存储学生信息
List=creatList();
//读取student.txt文件信息到链表中
//student.txt用于存放链表中的学生信息
readFromFile("student.txt",List);
//进入主界面
menu();
return 0;
}
以上便是程序的界面部分,相对不难,但仍有些不足,希望对你有所帮助。
作者:瑾年辰良一位热爱生活的快乐青年
"即见君子,云胡不喜?"