我的上一个博客里面,是大概把这个课程设计的一些思路给讲了一下。
但是大家是不是期待我的密码登录呢?
哈哈哈,其实我也就是写了一个默认密码123456.
如果大家想要有独自的密码的话,这里我提供一个思路,那就是我们可以在结构体里面多加一个密码变量就行啦。
话不多说,我们直接上登录密码相关代码的实现:
int a=123456;//默认密码123456
int login() //我们可以给一个默认的密码;
{
printf("t**********请输入登录系统密码**********n");
while(1)
{
scanf("%d", &key);
if(key==a)
{
printf("t*****密码正确*****n");
return 1;//当密码正确时,我们返回1,进入系统
}
printf("t*****密码错误,请重新输入*****n");
}//while(login()!=1);//当返回值不是1时,就重新输入密码
system("cls");//此处清屏作用;
}
下面就是控制台的输出(也就是演示结果):
那么接下来我就接上我昨天说的,把完整的代码给你们吧,然后演示界面我也会一并给出,大家可以做个参考:
#include#include #include #include #include #define N 66//此处直接用宏定义定义学生人数 int key; struct date//出生年月的结构体变量 { int year; int month; int day; }; struct Student { long int num;//学号 char name[20];//姓名 char sex[3];//性别 struct date birthday; int age; //年龄 char bz[50];//备注 struct Student *pNext;//首先我们创造一个节点,表示每一个学生, //此处指向下一个节点的指针 }ss[N]; void menu()//菜单界面 //int main () { //int c; printf("t********欢迎进入登录班级档案管理系统********n"); printf("t|***********1.学生基本信息录入*************|n"); printf("t|***********2.学生基本信息显示*************|n"); printf("t|***********3.学生基本信息保存*************|n"); printf("t|***********4.学生基本信息删除*************|n"); printf("t|***********5.学生基本信息修改*************|n"); printf("t|***********6.学生基本信息查询*************|n"); printf("t|*********** 7.退出系统 *************|n"); printf("t|*********请输入您要执行的功能(0~7)********|n"); } int a=123456;//默认密码123456 int login() //我们可以给一个默认的密码; { printf("t**********请输入登录系统密码**********n"); while(1) { scanf("%d", &key); if(key==a) { printf("t*****密码正确*****n"); return 1;//当密码正确时,我们返回1,进入系统 } printf("t*****密码错误,请重新输入*****n"); }//while(login()!=1);//当返回值不是1时,就重新输入密码 system("cls");//此处清屏作用; } struct date* DATA; struct Student* pEnd, *pNew; struct Student* pHead=NULL; int iCount;//全局变量来表示链表长度 struct Student* Create()//我们创建一个链表,来录入信息 { iCount=0;//初始化链表长度; pEnd=pNew=(struct Student*)malloc(sizeof(struct Student)); // printf("请输入学生信息:n"); scanf("%ld", &pNew->num); scanf("%s", &pNew->name); scanf("%s", &pNew->sex); scanf("%d", &pNew->birthday.year); scanf("%d", &pNew->birthday.month); scanf("%d", &pNew->birthday.day); scanf("%s", &pNew->bz); while(1)//如果学号为零,就停止输入; { iCount++;//iCount自增,表示链表中节点增加,同时也表示,学生的人数; if(iCount==1) { pNew->pNext=pHead;//使得头指针为空; pEnd=pNew;//跟踪加入新的节点 ; pHead=pNew;//头指针指向首节点 ; } else { pNew->pNext=NULL;//新节点的指针头为空 pEnd->pNext=pNew;//原来的尾节点指向新的节点 pEnd=pNew; //pEnd指向新的节点 } pNew=(struct Student*)malloc(sizeof(struct Student));//在此分配节点内存空间 scanf("%ld", &pNew->num); scanf("%s", &pNew->name); scanf("%s", &pNew->sex); scanf("%d", &pNew->birthday.year); scanf("%d", &pNew->birthday.month); scanf("%d", &pNew->birthday.day); //scanf("%d", &pNew->age=2022-pNew->birthday.year); scanf("%s", &pNew->bz); //printf("%d",pNew->num); if(pNew->num==0) { printf("录入成功!n"); return pHead; } } free(pNew);//释放没有用到的空间; return pHead; } void Print(struct Student* pHead)//我们现在用链表输出数据; { struct Student *pTemp;//这是我们创建的临时在循环所需要的指针; int ilndex=1;//表示链表中节点的序号 printf("*****the List has %d members:*****n", iCount);//消息提示 printf("n"); //pTemp=pHead;//我们定义的指针得到首节点的地址 for(pTemp=pHead;pTemp;pTemp=pTemp->pNext) { printf("the NO %d member is :n", ilndex); printf(" 学号:%5ld", pTemp->num); printf(" 姓名:%5s", pTemp->name); printf(" 性别:%5s", pTemp->sex); printf(" 年:%5d", pTemp->birthday.year); printf(" 月:%5d", pTemp->birthday.month); printf(" 日:%5d", pTemp->birthday.day); printf(" 年龄:%5d", pTemp->age=(2022-pTemp->birthday.year)); printf(" 备注:%5s", pTemp->bz); printf("n"); ilndex++; } } void save1(struct Student* pHead)//n就相当于我们学生的人数,与N相关联 {//保存基本信息函数; FILE *fp; struct Student *ptr;//此处我们定义一个新的指针,去遍历输入内容保存文件里面 if((fp=fopen("keshe.txt", "w+"))==NULL)//以只写的方式打开课设文件 { printf("file cannot open!"); exit(0); } for(ptr=pHead;ptr;ptr=ptr->pNext) { fprintf(fp," 学号:%5ld", ptr->num); fprintf(fp," 姓名:%5s", ptr->name); fprintf(fp," 性别:%5s", ptr->sex); fprintf(fp," 年:%5d 月:%5d 日:%5d", ptr->birthday.year,ptr->birthday.month,ptr->birthday.day); fprintf(fp," 年龄:%5d", ptr->age=(2022-ptr->birthday.year)); fprintf(fp," 备注:%5s", ptr->bz); fprintf(fp,"n"); } fclose(fp); } void search();//我们定义查询函数,这是总的查询函数,做个函数声明 void find1()//按学号查询; { int isprime=0;//此变量用来查询是否查找成功 long int xhcx; printf("请输入你要查询的学号:n"); scanf("%ld", &xhcx); struct Student *ptr1; for(ptr1=pHead;ptr1;ptr1=ptr1->pNext) { if(xhcx==ptr1->num) { printf("恭喜你,确有此人!n"); printf("学号:%ld,姓名:%s,年龄:%d,备注:%sn", ptr1->num,ptr1->name,ptr1->age,ptr1->bz); isprime=1; break; } } if(isprime==0) { printf("查询无果!n"); } } void find2()//按姓名查询; { int isprime1=0; char xmcx[20]; printf("请输入你要查询的姓名:n"); scanf("%s", &xmcx); struct Student *ptr2; for(ptr2=pHead;ptr2;ptr2=ptr2->pNext) { if(strcmp(xmcx,ptr2->name)==0) { printf("恭喜你,确有此人!n"); printf("学号:%ld,姓名:%s,年龄:%d,备注:%sn", ptr2->num,ptr2->name,ptr2->age,ptr2->bz); isprime1=1; break; } } if(isprime1==0) { printf("查询无果!n"); } } void find3()//按性别查询; { int isprime2=0; char xbcx[3]; printf("请输入你要查询的性别:n"); scanf("%s", &xbcx); struct Student *ptr3; for(ptr3=pHead;ptr3;ptr3=ptr3->pNext) { if(strcmp(xbcx,ptr3->sex)==0)//我们性别还没搞好; { printf("恭喜你,确有此人!n"); printf("学号:%ld,姓名:%s,年龄:%d,备注:%sn", ptr3->num,ptr3->name,ptr3->age,ptr3->bz); isprime2=1; } } if(isprime2==0) { printf("查询无果!n"); } } void find4()//按年龄查询; { struct Student *ptr4; int isprime3=0; int nlcx; printf("请输入你要查询的年龄:n"); scanf("%d", &nlcx); for(ptr4=pHead;ptr4;ptr4=ptr4->pNext) { if(nlcx==ptr4->age) { printf("恭喜你,确有此人!n"); printf("学号:%ld,姓名:%s,年龄:%d,备注:%sn", ptr4->num,ptr4->name,ptr4->age,ptr4->bz); isprime3=1; } } if(isprime3==0) { printf("查询无果!n"); } } void search() {//查询信息函数 struct Student* pHead; printf("t*****请输入你要查询的方式*****n"); printf("t***1.按学号查询***n"); printf("t***2.按姓名查询***n"); printf("t***3.按性别查询***n"); printf("t***4.按年龄查询***n"); int m; do { scanf("%d", &m); switch(m) { case 1:find1();break; case 2:find2();break; case 3:find3();break; case 4:find4();break; default: printf("输入错误,请重新输入!n");break; } }while(m!=0); } void Delete(struct Student *pHead, int ilndex)//ilndex表示要删除的学号; {//学生基本信息删除函数 struct Student* pTemp; pTemp=pHead; for(pTemp; ;pTemp=pTemp->pNext) { if(pTemp->pNext->num==ilndex&&pTemp->pNext->pNext==NULL) { pTemp->pNext=NULL; break; }//这个判断是为了删除尾节点; if(pTemp->pNext->num==ilndex) { pTemp->pNext=pTemp->pNext->pNext; break; }//这个是为了删除中间的信息; } } void modify() {//修改信息函数 int xgxx, isprime1=1; struct Student *xg;//我们定义一个修改的指针 xg=pHead;//赋给它头指针; printf("t***请输入你要修改哪项信息***n"); printf("t***1.修改学号***n"); printf("t***2.修改姓名***n"); //printf("t***3.修改性别***n"); printf("t***3.修改年龄***n"); do { scanf("%d", &xgxx); switch(xgxx) { case 1: long int xh1; printf("t***请输入你要修改的学号***n"); scanf("%ld", &xh1); for(xg; xg ;xg=xg->pNext) { if(xg->num==xh1) { printf("t***请输入你修改后的学号***n"); long int xh2; scanf("%ld", &xh2); xg->num=xh2; printf("t***修改成功!***n"); break; } } isprime1=0; break; case 2: char xm1[20]; printf("t***请输入你要修改的姓名***n"); scanf("%s", &xm1); for(xg; xg ;xg=xg->pNext) { if(strcmp(xg->name,xm1)==0) { printf("t***请输入你修改后的姓名***n"); char xm2[20]; scanf("%s", &xm2); strcpy(xg->name,xm2); printf("t***修改成功!***n"); break; } } isprime1=0; break; //case 3:find3();break; case 3:int nl1; printf("***t请输入你要修改的年龄***n"); scanf("%d", &nl1); for(xg; xg ;xg=xg->pNext) { if(xg->age==nl1) { printf("t***请输入你修改后的年龄***n"); long int nl2; scanf("%ld", &nl2); xg->age=nl2; printf("t***修改成功!***n"); break; } } isprime1=0; break; default: printf("输入错误,请重新输入!n");break; } }while(isprime1!=0); } long int xh;//这是我们定义的一个全局变量,主要就是我们删除时,我们是学号删除。 main() { struct Student *pHead;//定义头节点 int hh; if(login()==0) { return 0; } menu(); FILE *fp2; if((fp2=fopen("keshe.txt", "r+"))==NULL) { printf("***文件打开失败!***n"); exit(0); } while(1) { scanf("%d", &hh); switch(hh) { case 1:printf("请输入学生信息:n"); pHead=Create();//创建节点 //printf("读取中...n");//插进去完全就是为了逼格高一点 //Sleep(1000); break; case 2:Print(pHead);break;//输出链表; case 3:save1(pHead); break;//保存信息函数; case 4:printf("请输入你要删除学生的学号:n");scanf("%ld", &xh);Delete(pHead,xh);break; case 5:modify();break;//修改信息函数 case 6:search();break; //查询信息函数,里面嵌套四个小函数。 case 7:printf("t***安全退出系统,欢迎下次使用!***n");break; default:printf("*****输入错误,请重新输入你要选择的服务*****n");break; } Sleep(3000); system("cls"); menu(); } }
以上就是完整的整个课设的代码了。有一些小小的bug。这个只能靠各位自己解决啦。我只能写到这种程度了。
那么演示的第一张我已经放在了登录密码那里了,就在上面哈。
①.学生基本信息的录入
先输入1,进入功能1.这里我们就可以开始输入学生的基本信息了。
这里其实大家也可以看出来我的一个小毛病。那就是我们录入的时候我们啥时候结束呢?
这个时候,我奇怪的想法开始作祟了。我直接来个循环,遇到0就给我结束,哈哈哈!亲测有效。
②.学生基本信息的输出(显示):这里输入2就好了。(因为我用了闪屏功能(这纯纯装个逼))
③.学生基本信息的保存:这里也是输入一个3就好了。这里会保存到文件里面,所以大家一定要找得到你的文件在哪里。哈哈哈!
④.学生基本信息的删除:这里输入4,然后会有提示信息:跟着提示输入就好啦!
温馨提示:因为我这里是有bug的,不能删除第一个,不能删除第一个,不能删除第一个,(重要的事情说三遍)。切记切记!!!
这里我们已经把学号为2的人删掉了,也就是李四啦!为了检验我们是否删除成功,我们在显示一边学生的基本信息(只需要输入2 就好啦!):
这里也能看出,没有错误。
⑤.学生基本信息的修改:这里输入5,然后跟着提示输入就好啦!有好几种呢!这里就演示一种。
修改成功了之后,我们也要为了检查一下是否真的修改成功了,我们这是也是只需要输入2就可以查看学生信息了。
第一个学生的学号变成了5,说明我们修改成功了 。
⑥.学生基本信息的查询:按下6,然后跟着提示做就好啦!
差点忘记说六怎么结束了:
我们只需要输入0,然后它会显示驶入错误,别动它就好啦!他三秒之后就会清屏的。
⑦.我就不多说了吧,一个小小的退出系统啦!(很简单的)
最后,这个班级档案管理系统,到这里也已经算是较完善了。如果有什么不好的地方,也欢迎大家指正呀!



