图书馆管理系统C语言程序设计
- 格式:doc
- 大小:101.00 KB
- 文档页数:28
HUNANUNIVERSITYC语言程序训练1)2)3)4)5)6)7)8)9)10)在来实现:【总体设计】源代码为//rkou.c程序的入口#include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include"head.h"#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){inti=setup();switch(i){case0:while(n<50){conects(n);}default:eros(i);}}2.{intzn;//intbh;//};{};{intbh,o;//};//structbookbb[100];structinformationad[100];structshowss[100];inti,j,k,s;intn=0;intx;FILE*fp;//以下函数主要功能:方便窗口与用户之间交换信息intregst();voidpassword(char*a,intb,intj);//登陆时的输入函数voidexamine(int*a,intb); //保证键入的数据是数字voidchangepaw(inta,intb); //修改密码用到的提示函数voidinputs0(); //输出图书类别以供用户选择voidinputs1(inta,intb,intc,intd,inte); //方便用户输入图书各项信息(如书名,编号) voidinputs2(inta,intb,intc); //方便用户输入管理员的信息(如账号姓名) voidinputs3(inta,intb,intc); //方便用户输入读者的信息(如账号姓名) voideros(inti);//错误显示函数,操作一旦出错,则会出现相应的错误信息voidconects(intj); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存intsetup();//数据初始化函数intxzc(charno[12],charkey1[10],charkey2[10],charname[10]);//读者注册函数//pic()函数voidpic0();voidpic1();voidpic2();voidpic3();voidpic4();voidpic5();voidpic6();voidpic7();voidpic8();voidpic9();voidpic10();voidpic11();voidpic12();voidpic13();voidpic14();voidpic15();voidpic16();voidpic17();voidpic18();voidpic19();voidpic20();voidpic47();voidpicc();3.用户输入以及界面反馈用到的功能函数源代码为intregst(){charnum[12],paw1[10],paw2[10],name[10];inti;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n"); password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);returni;}{charc;inti=0;{if(c==8)if(i>0)i--;}elseif(i<j)a[i]=c;i++;}if(i==j)}}a[i]='\0';}printf("请输入数字!!\n");}rewind(stdin);if(b)system("cls");}voidchangepaw(inta,intb){inti;charc1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){i=mp(aa.no,c1,c2,c3,b);if(i){eros(i);n=27;}elsen=26;}elseif(i)}elsen=43;}}{inti=1;switch(i)}}}voidinputs1(inta,intb,intc,intd,inte){inti;switch(a){case1:printf("请输入图书编号:\n");examine(&bk.bh,1); default:;}switch(b){case1:printf("请输入图书名称:\n");gets(); default:;}switch(c){case1:printf("请输入图书的作者:\n");gets(bk.writer); default:;}switch(d){case1:printf("请输入该图书的库存:\n");examine(&bk.zn,1); default:;}system("cls");switch(e){case1:printf("请选择图书类别:\n");inputs0();default:;}}{switch(a)default:;}switch(b)default:;}switch(c)default:;}}{switch(a)default:;}switch(b)default:;}switch(c){case1:printf("请输入姓名:\n");gets();default:;}system("cls");}voideros(inti)//错误函数{switch(i){case-1:printf("error1!初始化失败\n\n");break;case-2:printf("error2!账号不存在\n\n");break; case-3:printf("error3!账号不存在\n\n");break;case-4:printf("error4!密码错误\n\n");break;case-5:printf("error5!输入的密码不一致\n\n");break; case-6:printf("error6!编号不存在\n\n");break;case-7:printf("error7!书名不能为空\n\n");break;case-8:printf("error8!作者名字不能为空\n\n");break; case-9:printf("error9!无此图书编号的记录\n\n");break; case-10:printf("error10!无此账号的记录\n\n");break; case-11:printf("error11!原始密码输入错误\n\n");break;default:;}}{switch(j)case9:pic9();break;case10:pic10();break;case11:pic11();break;case12:pic12();break;case13:pic13();break;case14:pic14();break;case15:pic15();break;case16:pic16();break;case17:pic17();break;case18:pic18();break;case19:pic19();break;case20:pic20();break;case21:pic21();break;case22:pic22();break;case23:pic23();break;case24:pic24();break;case25:pic25();break;case26:pic26();break;case27:pic27();break;case29:pic29();break;case30:pic30();break;default:;}}4.//intsetup()//数据初始化函数{FILE*fp;fp=fopen("reader.txt","r");//对文档以只读的方式进行操作if(fp==NULL){return-1;//当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s%s%s",stu[i].name,stu[i].no,stu[i].key);//将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r");//对文档以只读的方式进行操作if(fp==NULL){return-1;//}else{j=0;{j++;}j=j-1;}fclose(fp);{return-1;//}else{k=0;{将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r");//对文档以只读的方式进行操作if(fp==NULL){{s=0;while(!feof(fp)){fscanf(fp,"%s%s%d%s%s%d",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o);//将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return0;//}{intx=0;{{return-21;break;}{{i=i+1;return-16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return0;}else{return-5;}intexam(charno[10],charkey[10],intn)//密码账号检验函数{intx;if(n==0)//对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no))//判断该账号是否存在{}{return-3;}}}if(n==1)//{{return0;break;}else{return-4;break;}}return-3;}}}}intzj(structbookb)//管理员增加图书信息函数{intx;for(x=0;x<=k;x++){if(bb[x].bh==b.bh)//判断所增加的图书编号是否已存在{return-13;break;}break;}if(x==k)k=k;elsek=k+1;return-16;else{}fclose(fp);return0;}}}intsc(intbh)//管理员删除图书信息函数{intx;for(x=0;x<=k;x++){if(bb[x].jn!=0)return-22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1];//删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+");//将删除后的所有图书信息重新写入文档if(fp==NULL)return-16;else{{}}fclose(fp);return0;break;}}}{intx;if(n==0)//{{{{fp=fopen("reader.txt","w+");//将修改后的信息保存在文件里面if(fp==NULL)return-16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);else{return-5;}}elsereturn-11;}}}if(n==1)//{{{{{return-16;else{}fclose(fp);return0;}else{return-5;}}elsereturn-11;}}}}intxg(structbookb)//管理员修改图书信息函数if(strlen()==0)//判断所输入的要修改的图书名字是否为空{return-7;}else{if(strlen(b.writer)==0)//判断所输入的要修改的图书作者是否为空{return-8;}else{{{return-16;else{{}}fclose(fp);return0;}}}}}voidcopy(intbh)//按编图书编号将图书信息暂时保存在另外一个结构体里面{intx;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}voidcopy2(charno[12])//按管理员账号将管理员信息暂时保存在另外一个结构体里面{intx;for(x=0;x<=j;x++){{}}}{intx;{{}}}{intx,y,z;{{{if(strlen(ss[0].name1)==0)//判断文件里面的第一行信息是否存在{for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){--bb[x].zn;//修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer); strcpy(ss[0].name2,bb[x].name); ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){{return-19;else{ss[y].o=2;}break;}else{if(y==s){s++;{{strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer); ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}fp=fopen("book.txt","w+");//将借书后的图书信息写入文件if(fp==NULL)return-16;else{for(y=0;y<=k;y++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn); }}fclose(fp);return-16;else{{}}fclose(fp);return0;}elsereturn-20;}}}{intx,p;{{for(p=0;p<=k;p++){if(bb[p].bh==bh)//修改还书后的图书信息{++bb[p].zn;--bb[p].jn;}}ss[x].o=1;fp=fopen("book.txt","w+");//将还书后的所有图书信息重新写入文件return-16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classic,bb[p].writer,bb[p].zn,bb[p].jn); }}fclose(fp);fp=fopen("show.txt","w+");//将还书后的所有借书记录重新写入文件if(fp==NULL)return-16;else{{}}fclose(fp);return0;}else{return-12;}}elseif(x==s)return-18;}}{intx,flag;do//{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}while(flag==0);fp=fopen("book.txt","w+");//将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn); fclose(fp);}5.登陆界面所有函数源代码为//picture.hvoidpica(){printf("\n}voidpicb(){printf("\n}printf("1.switch(x)default:;}}{inti;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){case1:inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){eros(i);n=3;elsen=2;break;case2:inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){eros(i);n=30;}elsen=29;break;case3:n=0;break;default:;}}pica();printf("1.printf("5.switch(x)default:;}}{printf("1.switch(x)default:;}}voidpic4()//管理员添加图书界面{pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){case1:inputs1(1,1,1,1,1);n=5;break;case2:n=2;break;default:;}}voidpic5()//添加图书确认界面{inti;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn); printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");switch(x)if(i)}default:;}}{printf("printf("1.switch(x)default:;}}{printf("1.switch(x){case1:n=4;break;case2:n=2;break;default:;}}voidpic8()//修改图书界面{pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){case1:n=9;break;case2:n=2;break;default:;}}voidpic9()//输入编号以选择修改相应的图书{inti;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("1.switch(x)if(i)}else{n=10;}break;}}{pica();printf("printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n"); printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){case1:inputs1(0,1,0,0,0);n=12;break;case2:inputs1(0,0,1,0,0);n=12;break;case3:inputs1(0,0,0,1,0);n=12;break;case4:inputs1(0,0,0,0,1);n=12;break;case5:inputs1(0,1,1,1,1);n=12;break;case6:n=9;break;default:;}}voidpic11()//获取相应的图书失败提示界面{printf("1.重新输入图书编号\n2.返回图书管理界面\n"); examine(&x,1);switch(x){case1:n=9;break;case2:n=8;break;default:;}}{inti;pica();printf("printf("1.switch(x)if(i)}default:;}}{printf("printf("1.返回继续修改图书\n2.返回管理图书界面\n"); examine(&x,1);switch(x){case1:n=8;break;case2:n=2;break;default:;}}voidpic14()//修改图书失败提示界面{printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){case1:n=10;break;case2:n=8;break;default:;}}voidpic15()//删除图书选择界面{pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");switch(x)default:;}}{inti;pica();;printf("gck23();printf("1.switch(x)if(i)}else{};break;case2:system("cls");n=2;break;default:system("cls");;}}voidpic17()//删除图书确认界面{inti;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){case1:i=sc(bk.bh);if(i){eros(i);n=20;}elsen=19;break;case2:n=2;break;default:;}}{printf("1.switch(x)default:;}}{printf("printf("1.switch(x)default:;}}{printf("1.switch(x){case1:n=16;break;case2:n=15;break;default:;}}voidpic21()//管理员查看借阅记录界面{inti;pica();printf("1.查看指定编号的图书借阅记录\n2.查看指定读者的借阅记录\n3.查看所有图书借阅记录\n4.查看在馆图书的详细信息\n");printf("5.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){case1:inputs1(1,0,0,0,0);i=rck1(bk.bh);if(i){eros(i);n=23;}else{pica();printf("}break;if(i)}else{pica();printf("}break;default:;}}{printf("------------------------------------------------------------------------\n\n"); printf("1.返回查看其它借阅记录\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){case1:n=21;break;case2:n=2;break;default:;}}voidpic23()//查看借阅记录失败界面{printf("1.返回查看记录界面\n2.返回图书管理界面\n"); examine(&x,1);switch(x){case1:n=21;break;case2:n=2;break;default:;}}voidpic24()//图书信息显示界面{pica();printf("gck23();printf("1.switch(x)default:;}}{pica();printf("1.switch(x)default:;}}voidpic26()//修改密码成功提示界面{printf("修改密码操作成功!!!\n");printf("1.返回管理图书界面\n");examine(&x,1);switch(x){case1:n=2;break;default:;}}voidpic27()//修改密码失败提示界面{printf("1.再试一次\n2.返回图书管理界面\n");examine(&x,1);switch(x){case1:n=25;break;case2:n=2;break;default:;}}voidpic29()//读者主页{copy3(rr.no);picb();printf("1.printf("5.switch(x)default:;}}{printf("1.switch(x)default:;}}{inti;picb();printf("1.按编号查询书目\n2.按书名查询书目\n3.按作者查询书目\n4.按类别查询书目\n5.返回我的主页\n\n"); printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){case1:inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){eros(i);n=33;elsen=34;break;case2:inputs1(0,1,0,0,0);i=sm1();if(i){eros(i);n=33;}else{picb();sm2();n=32;}break;case3:inputs1(0,0,1,0,0);if(i)}else}break;default:;}}{ inti;printf("1.{{eros(i);n=36;}elsen=34;break;case2:system("cls");n=31;break;default:system("cls");}}voidpic33()//查询书目失败界面{printf("1.返回重新查询\n2.返回我的主页\n");switch(x){case1:n=31;break;case2:n=29;break;default:;}}voidpic34()//借书确认界面{inti;picb();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("1.if(i)}elsedefault:;}}{printf("printf("1.switch(x)default:;}}voidpic36()//借书失败提示界面{printf("1.返回重新查询\n2.返回我的主页\n"); examine(&x,1);switch(x){case1:n=31;break;case2:n=29;break;default:;}}{inti;picb();printf("1.输入还书的编号\n2.返回我的主页\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){case1:inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){eros(i);n=39;}elseif(i)}elsen=38;}break;default:;}}{printf("printf("1.switch(x)default:;}}{printf("1.switch(x){case1:n=37;break;case2:n=29;break;default:;}}voidpic40()//读者的借阅记录界面{picb();printf("以下是您尚未归还的所有书目:\n\n");printf("------------------------------------------------------------------------\n\n"); printf("1.返回我的主页\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){case1:n=29;break;default:;}}voidpic41()//读者浏览在馆图书信息的界面{picb();printf("gck23();printf("1.switch(x)default:;}}{picb();printf("1.switch(x)default:;}}{printf("printf("1.examine(&x,1);switch(x){case1:n=42;break;case2:n=29;break;default:;}}voidpic44()//修改密码失败提示界面{printf("1.我要再试一次\n2.返回我的主页\n");switch(x){case1:n=42;break;case2:n=29;break;default:;}}voidpic45()//新读者注册界面{inti;printf("\t\t\t新用户注册\n\n");printf("------------------------------------------------------------------------\n\n");printf("1.我要注册\n2.返回系统登录界面\n\n");switch(x)if(i)}default:;}}{printf("printf("1.switch(x)default:;}}{switch(x){case1:n=45;break;case2:n=0;break;default:;}}6.按要求读取文件的数据并显示到屏幕上源代码为intbh1(intbh)//判断该编号的图书信息是否存在函数{intx;for(x=0;x<=k;x++){if(bh==bb[x].bh){return0;}if(x==k&&bh!=bb[x].bh){return-6;}}}{intx;{{printf("}}}{intx;{{return0;break;}return-14;}}voidsm2(charname[50])//按照图书名字显示图书信息函数{intx;printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n"); for(x=0;x<=k;x++){if(!strcmp(name,bb[x].name))printf("%-24s%-8d%-16s%-8s%-8d%-8d\n",bb[x].name,bb[x].bh,bb[x].writer,bb[x].classic,bb[x].zn,bb[x].jn); }}printf("\n");}intzz1(charwriter[20])//判断是否存在该作者的图书信息函数{intx;for(x=0;x<=k;x++){if(!strcmp(writer,bb[x].writer)){return0;break;}return-15;}}{intx;printf("{{}}}{intx;printf("{{printf("%-24s%-8d%-16s%-8s%-8d%-8d\n",bb[x].name,bb[x].bh,bb[x].writer,bb[x].classic,bb[x].zn,bb[x].jn); }}printf("\n");}intrck1(intbh)//判断该编号的图书的借书记录是否存在{intx;if(ss[x].bh==bh){return0;}else{if(x==s)return-9;}}}{intx;printf("{{}}}{intx;printf("{{}}}intgck21(charno[12])//判断该账号读者的借书记录是否存在{intx;for(x=0;x<=s;x++){if(!strcmp(ss[x].no,no)){return0;}if(x==s)return-10;}}}voidgck22(charno[12])//按读者显示借书情况2{intx;printf("借书人\t借者账号\t图书编号\t书名\t\t\t作者\n");for(x=0;x<=s;x++){{}}}{intx;printf("{}}1.2.3.4.5.读者登陆界面【心得体会】1.通过这次实训课的训练,我组成员收获了许多新的知识,也锻炼了自己各方面的能力,坚实地打牢了专业知识基础,极大得方便了以后的学习生活。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include"head.h"#include"fuc.h"显示一系列功能选项输入n ,n 为1,2或3根据n 的值调用各功能模块函数结束开始n 图书馆管理系统读者注册、登陆及密码修改修改图书信息 删除图书信息管理员登陆 查找图书信息 浏览图书信息#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还) };//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名)void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic5();void pic6();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n");password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n');printf("请输入数字!!\n");}rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);{ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n");examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1);default: ;}switch(b){ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1);default: ;}system("cls");{ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break;case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break;case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密码输入错误\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;;case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 12: pic12();break;case 13: pic13();break;case 14: pic14();break;case 15: pic15();break;case 16: pic16();break;case 17: pic17();break;case 18: pic18();break;case 19: pic19();break;case 20: pic20();break;case 21: pic21();break;case 22: pic22();break;case 23: pic23();break;case 24: pic24();break;case 25: pic25();break;case 26: pic26();break;case 27: pic27();break;case 29: pic29();break;case 30: pic30();break;case 31: pic31();break;case 32: pic32();break;case 34: pic34();break;case 35: pic35();break;case 36: pic36();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}elsewhile(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++)if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在{for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息{bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件if(fp==NULL)return -16;else{for(y=0;y<=k;y++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);}}fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classic,bb[p].writer,bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss[p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() //删除图书确认界面{ int i;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=sc(bk.bh);if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() //获取特定编号图书失败界面{ printf("1.返回重新输入图书编号\n2.返回选择不同类别的图书\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic19() //删除图书成功提示界面{ printf("删除图书操作成功!!!\n");printf("1.返回选择其他的图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=15;break;case 2: n=2;break;default: ;}}void pic20() // 删除图书失败提示界面{ printf("1.返回重新输入图书编号\n2.返回重新选择类别\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}。
图书馆管理系统C语言程序设计-CAL-FENGHAI.-(YICAI)-Company One1HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include"head.h"#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号 int bh,o; //图书编号,借阅状况(未还,已还)};//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号) void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名)void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic5();void pic6();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n");password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n'); printf("请输入数字!!\n"); }rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n"); examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1); default: ;}switch(b){ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1); default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break;case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break;case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密碼輸入錯誤\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;;case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break; default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 12: pic12();break;case 13: pic13();break;case 14: pic14();break;case 15: pic15();break;case 16: pic16();break;case 17: pic17();break;case 18: pic18();break;case 19: pic19();break;case 20: pic20();break;case 21: pic21();break;case 22: pic22();break;case 23: pic23();break;case 24: pic24();break;case 25: pic25();break;case 26: pic26();break;case 27: pic27();break;case 29: pic29();break;case 30: pic30();break;case 31: pic31();break;case 32: pic32();break;case 33: pic33();break;case 34: pic34();break;case 35: pic35();break;case 36: pic36();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,bb[k].zn,bb[k].jn); }fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn); }}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key); }fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key); }fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里 if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn); }}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在{for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息{bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件if(fp==NULL)return -16;else{for(y=0;y<=k;y++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn); }}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);} }fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classic,bb[p].writer,bb[p].zn,bb[p].jn); }}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss[p].name2,ss[p].writer,ss[p].o); }}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn); fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n"); printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n"); printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n"); printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() //删除图书确认界面{ int i;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n"); printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n"); examine(&x,1);switch(x){ case 1: i=sc(bk.bh);if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() //获取特定编号图书失败界面{ printf("1.返回重新输入图书编号\n2.返回选择不同类别的图书\n"); examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic19() //删除图书成功提示界面{ printf("删除图书操作成功!!!\n");printf("1.返回选择其他的图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=15;break;case 2: n=2;break;default: ;}}void pic20() // 删除图书失败提示界面{ printf("1.返回重新输入图书编号\n2.返回重新选择类别\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic21() //管理员查看借阅记录界面。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>显示一系列功能选项输入n ,n 为1,2或3根据n 的值调用各功能模块函数结束开始n 图书馆管理系统读者注册、登陆及密码修改 修改图书信息 删除图书信息 管理员登陆 查找图书信息 浏览图书信息#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还) };//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号)void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名)void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为{ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n");password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n');printf("请输入数字!!\n");}rewind(stdin);if(b) system("cls");}char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n");examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1);default: ;{ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1);default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break;case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break;case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密码输入错误\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;;case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 12: pic12();break;case 13: pic13();break;case 15: pic15();break;case 16: pic16();break;case 17: pic17();break;case 18: pic18();break;case 19: pic19();break;case 20: pic20();break;case 21: pic21();break;case 22: pic22();break;case 23: pic23();break;case 24: pic24();break;case 25: pic25();break;case 26: pic26();break;case 27: pic27();break;case 29: pic29();break;case 30: pic30();break;case 31: pic31();break;case 32: pic32();break;case 33: pic33();break;case 34: pic34();break;case 35: pic35();break;case 36: pic36();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL)return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在{for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息{bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件if(fp==NULL)return -16;else{for(y=0;y<=k;y++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);}}fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classic,bb[p].writer,bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss[p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() //删除图书确认界面{ int i;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=sc(bk.bh);if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() //获取特定编号图书失败界面{ printf("1.返回重新输入图书编号\n2.返回选择不同类别的图书\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic19() //删除图书成功提示界面{ printf("删除图书操作成功!!!\n");printf("1.返回选择其他的图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=15;break;case 2: n=2;break;default: ;。
C语言程序设计图书馆管理系统一、分析过程首先此程序需要实现输入、增加、删除、查询、输出的五大功能,则首先需要设置一个菜单键,让用户可以选择不同的功能,完成不同的操作,然后编写不同的函数实现不同的功能,在这个过程中注意要人性化,让用户方便,直观的进行操作。
二、算法三、函数模块介绍1录入模块:本模块主要执行信息的录入功能2浏览模块:本模块主要是执行把已有信息输出浏览功能3查询模块:本模块主要是按照图书名查找图书的相关信息4删除模块:主要是执行删除图书信息的功能5退出模块:方便用户离开四、源程序#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>struct books_list{char author[20]; /*作者名*/char bookname[20]; /*书名*/char publisher[20]; /*出版单位*/char pbtime[15]; /*出版时间*/char loginnum[10]; /*登陆号*/float price; /*价格*/char classfy[10]; /*分类号*/struct books_list * next; /*链表的指针域*/};struct books_list * Create_Books_Doc(); /*新建链表*/ void InsertDoc(struct books_list * head); /*插入*/void DeleteDoc(struct books_list * head , int num);/*删除*/ void Print_Book_Doc(struct books_list * head);/*浏览*/void search_book(struct books_list * head); /*查询*/void save(struct books_list * head);/*保存数据至文件*//*新建链表头节点*/struct books_list * Create_Books_Doc(){struct books_list * head;head=(struct books_list *)malloc(sizeof(struct books_list)); /*分配头节点空间*/head->next=NULL; /*头节点指针域初始化,定为空*/return head;}/*保存数据至文件*/void save(struct books_list * head){struct books_list *p;FILE *fp;p=head;fp=fopen("data.txt","w+"); /*以写方式新建并打开 data.txt文件*/fprintf(fp,"┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━┳━━━━┓\n"); /*向文件输出表格*/fprintf(fp,"┃登录号┃书名┃作者┃出版单位┃出版时间┃分类号┃价格┃\n");fprintf(fp,"┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━╋━━━━┫\n");/*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/while(p->next!= NULL){p=p->next;fprintf(fp,"┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-12.12s┃%-6.6s┃%.2f ┃\n",p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->pric e);}fprintf(fp,"┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━┻━━━━┛\n");fclose(fp);printf(" 已将图书数据保存到 data.txt 文件\n");}/*插入*/void InsertDoc(struct books_list *head){/*定义结构体指针变量 s指向开辟的新结点首地址 p为中间变量*/struct books_list *s, *p;char flag='Y'; /*定义flag,方便用户选择重复输入*/p=head;/*遍历到尾结点,p指向尾结点*/while(p->next!= NULL){p=p->next;}/*开辟新空间,存入数据,添加进链表*/while(flag=='Y'||flag=='y'){s=(struct books_list *)malloc(sizeof(struct books_list)); printf("\n 请输入图书登陆号:");fflush(stdin);scanf("%s",s->loginnum);printf("\n 请输入图书书名:");fflush(stdin);scanf("%s",s->bookname);printf("\n 请输入图书作者名:");fflush(stdin);scanf("%s",s->author);printf("\n 请输入图书出版社:");fflush(stdin);scanf("%s",s->publisher);printf("\n 请输入图书出版时间:");fflush(stdin);scanf("%s",s->pbtime);printf("\n 请输入图书分类号:");fflush(stdin);scanf("%s",s->classfy);printf("\n 请输入图书价格:");fflush(stdin);scanf("%f",&s->price);printf("\n");p->next=s; /*将新增加的节点添加进链表*/p=s; /*p指向尾节点,向后移*/s->next=NULL;printf(" ━━━━添加成功!━━━━"); printf("\n 继续添加?(Y/N):"); fflush(stdin);scanf("%c",&flag);printf("\n");if(flag=='N'||flag=='n'){break;}else if(flag=='Y'||flag=='y'){continue;}}save(head); /*保存数据至文件*/return;}/*查询操作*/void search_book(struct books_list *head){struct books_list * p;char temp[20];p=head;if(head==NULL || head->next==NULL) /*判断数据库是否为空*/ {printf(" ━━━━图书库为空!━━━━\n");}else{printf("请输入您要查找的书名: ");fflush(stdin);scanf("%s",temp);/*指针从头节点开始移动,遍历至尾结点,查找书目信息*/while(p->next!= NULL){p=p->next;if(strcmp(p->bookname,temp)==0){printf("\n图书已找到!\n");printf("\n");printf("登录号: %s\t\n",p->loginnum);printf("书名: %s\t\n",p->bookname);printf("作者名: %s\t\n",p->author);printf("出版单位: %s\t\n",p->publisher); printf("出版时间: %s\t\n",p->pbtime);printf("分类号: %s\t\n",p->classfy);printf("价格: %.2f\t\n",p->price);}if(p->next==NULL){printf("\n查询完毕!\n");}}}return;}/*浏览操作*/void Print_Book_Doc(struct books_list * head) {struct books_list * p;if(head==NULL || head->next==NULL) /*判断数据库是否为空*/{printf("\n ━━━━没有图书记录! ━━━━\n\n");return;}p=head;printf("┏━━━┳━━━━━┳━━━━━┳━━━━━┳━━━━━━┳━━━┳━━━━┓\n");printf("┃登录号┃书名┃作者┃出版单位┃出版时间┃分类号┃价格┃\n");printf("┣━━━╋━━━━━╋━━━━━╋━━━━━╋━━━━━━╋━━━╋━━━━┫\n");/*指针从头节点开始移动,遍历至尾结点,依次输出图书信息*/while(p->next!= NULL){p=p->next;printf("┃%-6.6s┃%-10.10s┃%-10.10s┃%-10.10s┃%-12.12s┃%-6.6s┃%.2f ┃\n",p->loginnum,p->bookname,p->author,p->publisher,p->pbtime,p->classfy,p->pric e); /*循环输出表格*/}printf("┗━━━┻━━━━━┻━━━━━┻━━━━━┻━━━━━━┻━━━┻━━━━┛\n");printf("\n");}/*删除操作*/void DeleteDoc(struct books_list * head){struct books_list *s,*p; /*s为中间变量,p为遍历时使用的指针*/ char temp[20];int panduan; /*此变量用于判断是否找到了书目*/panduan=0;p=s=head;printf(" [请输入您要删除的书名]:");scanf("%s",temp);/*遍历到尾结点*/while(p!= NULL){if(strcmp(p->bookname,temp)==0){panduan++;break;}p=p->next;}if(panduan==1){for(;s->next!=p;) /*找到所需删除卡号结点的上一个结点*/{s=s->next;}s->next=p->next; /*将后一节点地址赋值给前一节点的指针域*/free(p);printf("\n ━━━━删除成功! ━━━━\n"); }else /*未找到相应书目*/{printf(" 您输入的书目不存在,请确认后输入!\n"); }return;}int main(){struct books_list * head;char choice;head=NULL;for(;;) /*实现反复输入选择*/{printf(" ┏━┓━━━━━━━━━━━━━━━━━━━┏━┓\n"); printf(" ┃┃ tony 图书馆管理系统┃┃\n"); printf(" ┃┗━━━━━━━━━━━━━━━━━━━┛┃\n"); printf(" ┃ [1]图书信息录入┃\n"); printf(" ┃┃\n"); printf(" ┃ [2]图书信息浏览┃\n"); printf(" ┃┃\n"); printf(" ┃ [3]图书信息查询┃\n"); printf(" ┃┃\n"); printf(" ┃ [4]图书信息删除┃\n"); printf(" ┃┃\n"); printf(" ┃ [5]退出系统┃\n"); printf(" ┃┃\n"); printf(" ┃┃\n"); printf(" ┗━━━━━━━━━━━━━━━━━━━━━━━┛\n"); printf(" 请选择:");fflush(stdin);scanf("%c",&choice);if(choice=='1'){if(head==NULL){head=Create_Books_Doc(); }InsertDoc(head);}else if(choice=='2'){Print_Book_Doc(head);}else if(choice=='3'){search_book(head);}else if(choice=='4'){DeleteDoc(head);}else if(choice=='5'){printf("\n");printf(" ━━━━━━━━感谢使用图书管理系统━━━━━━━━\n");break;}else{printf(" ━━━━输入错误,请重新输入!━━━━\n");}}return 0;}。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include"head.h"#include"fuc.h" 显示一系列功能选项输入n ,n 为1,2或3根据n 的值调用各功能模块函数结束开始n 图书馆管理系统读者注册、登陆及密码修改修改图书信息 删除图书信息管理员登陆 查找图书信息 浏览图书信息#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还) };//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号)void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名)void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic5();void pic6();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n");password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n');printf("请输入数字!!\n");}rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n");examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1);default: ;}switch(b){ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1);default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break;case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break;case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密码输入错误\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;;case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 12: pic12();break;case 13: pic13();break;case 14: pic14();break;case 15: pic15();break;case 16: pic16();break;case 17: pic17();break;case 18: pic18();break;case 19: pic19();break;case 20: pic20();break;case 21: pic21();break;case 22: pic22();break;case 23: pic23();break;case 24: pic24();break;case 25: pic25();break;case 26: pic26();break;case 27: pic27();break;case 29: pic29();break;case 30: pic30();break;case 31: pic31();break;case 32: pic32();break;case 33: pic33();break;case 34: pic34();break;case 35: pic35();break;case 36: pic36();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp))fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}else}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在{for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{{if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息{bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件if(fp==NULL)return -16;else{for(y=0;y<=k;y++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);}}fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classic,bb[p].writer,bb[p].zn,bb[p].jn);}}fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss[p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n"); }void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n"); }void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() //删除图书确认界面{ int i;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=sc(bk.bh);if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() //获取特定编号图书失败界面{ printf("1.返回重新输入图书编号\n2.返回选择不同类别的图书\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic19() //删除图书成功提示界面{ printf("删除图书操作成功!!!\n");printf("1.返回选择其他的图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=15;break;case 2: n=2;break;default: ;}}void pic20() // 删除图书失败提示界面{ printf("1.返回重新输入图书编号\n2.返回重新选择类别\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic21() //管理员查看借阅记录界面{ int i;pica();printf("1.查看指定编号的图书借阅记录\n2.查看指定读者的借阅记录\n3.查看所有图书借阅记录\n4.查看在馆图书的详细信息\n");printf("5.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,0,0,0,0);i=rck1(bk.bh);if(i){ eros(i);n=23;}else{ pica();printf("编号为%d的图书的借出情况:\n\n",bk.bh);rck2(bk.bh);n=22;}。
图书馆管理系统C语言程序设计HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include"head.h"#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还)};//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号)void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名)void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ;//数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic5(); void pic6(); void pic7(); void pic8(); void pic9(); void pic10(); void pic11(); void pic12(); void pic13(); void pic14(); void pic15(); void pic16(); void pic17(); void pic18(); void pic19(); void pic20(); void pic21(); void pic22(); void pic23(); void pic24(); void pic25(); void pic26();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n"); password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n"); password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n'); printf("请输入数字!!\n"); }rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b); if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n"); examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1); default: ;}{ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1); default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11);default: ;}{ case 1: printf("请输入密码:\n"); password(aa.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break;case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break;case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密码输入错误\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break; case -14: printf("error14 !搜索不到此书的相关信息\n\n");break; case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;;case -20: printf("error20 !抱歉,图书已经借完了\n\n");break; case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 13: pic13();break; case 14: pic14();break; case 15: pic15();break; case 16: pic16();break; case 17: pic17();break; case 18: pic18();break; case 19: pic19();break; case 20: pic20();break; case 21: pic21();break; case 22: pic22();break; case 23: pic23();break; case 24: pic24();break; case 25: pic25();break; case 26: pic26();break; case 27: pic27();break; case 29: pic29();break; case 30: pic30();break; case 31: pic31();break; case 32: pic32();break; case 33: pic33();break; case 34: pic34();break; case 35: pic35();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key); }fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,bb[k].zn,bb[k].j n);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].j n);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致 {strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面 if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里 strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].j n);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在 {for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息 {bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件if(fp==NULL)return -16;else{for(y=0;y<=k;y++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].j n);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);} }fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classic,bb[p].writer,bb[p].zn,bb[p].j n);}}fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss[p].name2,ss[p].writer,ss[p].o); }}fclose(fp);return 0;}else{return -12;}}elseif(x==s)}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件 for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].j n);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n"); examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n"); examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;。
c语言课程设计图书管理系统一、教学目标本课程的教学目标是使学生掌握C语言基础知识,学会使用C语言进行程序设计,能够运用C语言实现图书管理系统的功能。
具体分为以下三个部分:1.知识目标:学生需要掌握C语言的基本语法、数据类型、运算符、控制结构、函数等基础知识,理解图书管理系统的业务流程和需求。
2.技能目标:学生能够运用C语言编写程序,实现图书管理系统的各个功能模块,如图书信息的添加、删除、修改和查询等。
3.情感态度价值观目标:培养学生对计算机编程的兴趣和热情,增强学生的自主学习能力和团队协作精神,使学生在解决实际问题时能够积极思考、勇于尝试。
二、教学内容本课程的教学内容分为五个部分:1.C语言基础知识:包括基本语法、数据类型、运算符、控制结构等。
2.函数与模块化编程:学习函数的定义、声明和调用,掌握模块化编程的方法和技巧。
3.图书管理系统需求分析:了解图书管理系统的业务流程,明确系统需求。
4.图书管理系统功能实现:使用C语言编写程序,实现图书管理系统的各个功能模块。
5.程序调试与优化:学习使用调试工具,掌握调试和优化程序的方法。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:教师讲解C语言基本语法和概念,引导学生掌握知识要点。
2.案例分析法:分析实际编程案例,让学生学会将理论知识应用于实际问题。
3.实验法:学生动手编写程序,实现图书管理系统的功能,培养实际操作能力。
4.讨论法:分组讨论问题,培养学生的团队协作能力和解决问题的能力。
四、教学资源本课程所需教学资源包括:1.教材:《C程序设计语言》或《C语言入门教程》等。
2.参考书:《C语言编程实例解析》、《C语言常用算法解析》等。
3.多媒体资料:教学PPT、视频教程、编程案例等。
4.实验设备:计算机、编程环境(如Visual Studio、Code::Blocks等)。
5.在线资源:编程论坛、博客、教程等。
五、教学评估本课程的评估方式包括以下几个方面:1.平时表现:评估学生在课堂上的参与程度、提问回答情况、团队合作表现等,占总评的30%。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】图书馆管理系统读者注册、登陆及密码修改修改图书信息删除图书信息管理员登陆查找图书信息浏览图书信息【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用开始显示一系列功能选项n输入n,n为1,2或3根据n的值调用各功能模块函数结束源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include"head.h"#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还)};//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号) void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名) void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic5();void pic6();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n");password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n');printf("请输入数字!!\n");}rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n");examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1);default: ;}switch(b){ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1);default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break;case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break;case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密碼輸入錯誤\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;;case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 12: pic12();break;case 13: pic13();break;case 14: pic14();break;case 15: pic15();break;case 16: pic16();break;case 17: pic17();break;case 18: pic18();break;case 19: pic19();break;case 20: pic20();break;case 21: pic21();break;case 22: pic22();break;case 23: pic23();break;case 24: pic24();break;case 25: pic25();break;case 26: pic26();break;case 27: pic27();break;case 29: pic29();break;case 30: pic30();break;case 31: pic31();break;case 32: pic32();break;case 33: pic33();break;case 34: pic34();break;case 35: pic35();break;case 36: pic36();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer, bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer, bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer, bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在{for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息{bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件if(fp==NULL)return -16;else{for(y=0;y<=k;y++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer, bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y]. writer,ss[y].o);}}fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classic,bb[p].writer, bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss[p].name2,ss[p]. writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer, bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() //删除图书确认界面{ int i;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=sc(bk.bh);if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() //获取特定编号图书失败界面{ printf("1.返回重新输入图书编号\n2.返回选择不同类别的图书\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;。
c语言课程设计图书馆管理系统一、教学目标本课程的教学目标是使学生掌握C语言编程基础,能够运用C语言设计简单的图书馆管理系统。
具体分为三个维度:1.知识目标:学生需要掌握C语言的基本语法、数据类型、运算符、控制结构、函数等编程基础。
2.技能目标:学生能够运用C语言进行程序设计,具备编写、调试和运行C语言程序的能力。
3.情感态度价值观目标:培养学生对计算机科学的兴趣,提高学生解决问题的能力,培养学生的创新精神和团队合作意识。
二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构、函数等编程基础,以及图书馆管理系统的项目实践。
具体安排如下:1.第一章:C语言概述,介绍C语言的历史、特点和基本语法。
2.第二章:数据类型和运算符,学习基本数据类型、字符串、运算符及其优先级。
3.第三章:控制结构,学习条件语句、循环语句和跳转语句。
4.第四章:函数,学习函数的定义、声明和调用,以及常用标准库函数。
5.第五章:数组和字符串,学习一维数组、多维数组、字符串的基本操作。
6.第六章:指针,学习指针的概念、运算和应用。
7.第七章:结构体和文件,学习结构体的定义和应用,以及文件的读写操作。
8.第八章:图书馆管理系统项目实践,运用所学知识设计并实现一个简单的图书馆管理系统。
三、教学方法本课程采用多种教学方法相结合的方式,包括:1.讲授法:讲解C语言的基本语法、数据类型、运算符、控制结构、函数等编程基础。
2.案例分析法:通过分析典型的图书馆管理场景,引导学生运用C语言进行程序设计。
3.实验法:让学生动手编写、调试和运行C语言程序,提高学生的实践能力。
4.小组讨论法:分组进行项目实践,培养学生的团队合作意识和问题解决能力。
四、教学资源1.教材:《C程序设计语言》(K&R)或《C语言 Primer》(第五版)。
2.参考书:《C语言编程思想》、《C语言深度探索》。
3.多媒体资料:课件、教学视频、在线教程。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include"head.h"#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还)};//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号) void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名) void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic5();void pic6();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n");password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n'); printf("请输入数字!!\n"); }rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n");examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1);default: ;}switch(b){ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1); default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break; case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break; case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密碼輸入錯誤\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;; case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 12: pic12();break;case 13: pic13();break;case 14: pic14();break;case 15: pic15();break;case 16: pic16();break;case 17: pic17();break;case 18: pic18();break;case 19: pic19();break;case 20: pic20();break;case 21: pic21();break;case 22: pic22();break;case 23: pic23();break;case 24: pic24();break;case 25: pic25();break;case 26: pic26();break;case 27: pic27();break;case 29: pic29();break;case 30: pic30();break;case 31: pic31();break;case 32: pic32();break;case 33: pic33();break;case 34: pic34();break;case 35: pic35();break;case 36: pic36();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classi c,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面 if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里 strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在 {for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息 {bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件 if(fp==NULL)return -16;else{for(y=0;y<=k;y++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);} }fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件 if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classi c,bb[p].writer,bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件 if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss [p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.z n,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() //删除图书确认界面{ int i;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=sc(bk.bh);if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() //获取特定编号图书失败界面{ printf("1.返回重新输入图书编号\n2.返回选择不同类别的图书\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic19() //删除图书成功提示界面{ printf("删除图书操作成功!!!\n");printf("1.返回选择其他的图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=15;break;case 2: n=2;break;default: ;}}void pic20() // 删除图书失败提示界面{ printf("1.返回重新输入图书编号\n2.返回重新选择类别\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic21() //管理员查看借阅记录界面。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include"head.h"#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还)};//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号) void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名) void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic5();void pic6();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n");password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n'); printf("请输入数字!!\n"); }rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n");examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1);default: ;}switch(b){ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1); default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break; case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break; case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密碼輸入錯誤\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;; case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 12: pic12();break;case 13: pic13();break;case 14: pic14();break;case 15: pic15();break;case 16: pic16();break;case 17: pic17();break;case 18: pic18();break;case 19: pic19();break;case 20: pic20();break;case 21: pic21();break;case 22: pic22();break;case 23: pic23();break;case 24: pic24();break;case 25: pic25();break;case 26: pic26();break;case 27: pic27();break;case 29: pic29();break;case 30: pic30();break;case 31: pic31();break;case 32: pic32();break;case 33: pic33();break;case 34: pic34();break;case 35: pic35();break;case 36: pic36();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classi c,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面 if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里 strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在 {for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息 {bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件 if(fp==NULL)return -16;else{for(y=0;y<=k;y++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);} }fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件 if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classi c,bb[p].writer,bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件 if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss [p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.z n,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() //删除图书确认界面{ int i;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=sc(bk.bh);if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() //获取特定编号图书失败界面{ printf("1.返回重新输入图书编号\n2.返回选择不同类别的图书\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic19() //删除图书成功提示界面{ printf("删除图书操作成功!!!\n");printf("1.返回选择其他的图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=15;break;case 2: n=2;break;default: ;}}void pic20() // 删除图书失败提示界面{ printf("1.返回重新输入图书编号\n2.返回重新选择类别\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic21() //管理员查看借阅记录界面。
图书管理系统/*图书数据由编号、书名、出版社、单价和图书状态(库存用0表示或借出用读者编号表示),读者数据由编号、姓名和电话号码构成。
实现功能包括:(1)添加图书的记录(2)图书管理(借书和还书)(3)对图书数据排序(按单价的降序)(4)删除图书记录(5)修改图书记录(6)添加读者记录(7)输出图书信息表和读者信息表*#include <stdio.h>#include <string.h>#include <stdlib.h>#include <windows.h>/*函数的声明*/void bookname();void writername();void booknumber();void press();void bookdate();void Bfind(); //查询主菜单void Bdevise(); //修改函数void Badd(); //添加函数void Bdelete(); //删除函数void Bdisplay(); //显示所以已保存的图书信息函数void Bclean(); //清除所有图书信息函数void lendbook(); // 借书函数void returnbook(); //还书函数void lendorreturnbook();//借书或还书主菜单函数void appealkey();//用户密码申诉函数void devisepeoplekey();//修改用户密码函数void accountapply(); //用户申请账户函数void addpeopleaccount(); //管理员之添加用户帐号函数void addmanageaccount(); //管理员之添加管理员账号函数void addaccount(); //管理员之账户添加主菜单函数void devisepeopleaccount();//管理员之修改用户账号函数void devisemanageaccount();//管理员之修改管理员帐号函数void deviseaccount();//管理员之修改账号主菜单函数void deletepeopleaccount();//管理员之删除用户账号函数void deletemanageaccount();//管理员之删除管理员账号函数void deleteaccount();//管理员之删除账号主菜单函数void displayallpeopleaccounts();//显示所有用户信息函数void displayallmanageaccounts();//显示所有管理员信息函数void displayallaccountsmessage();//显示所有账号信息主菜单函数void highaddpeopleaccount(); //高级管理员添加用户账户函数void highaddmanageaccount(); //高级管理员添加管理员账户函数void highaddaccount(); //高级管理员之添加账户主菜单函数void booksmanage();//图书操作主菜单函数void accountsmanage();//管理员账号操作主菜单函数void highaccountsmanage();//高级管理员账号操作主菜单函数void menu1(); //用户之查询主菜单void menu2(); //管理员之查询主菜单void menu3(); //高级管理员之查询主菜单/*定义书的类型*/struct book{int bookstock; //库存量char bookname[20]; //书名char bookwriter[20]; //作者char booknumber[20]; //书号char press[20]; //出版社char bookdate[20]; //出版日期char price[20]; //出版价格int turefalse; //判断图书是否被借阅}books[20];/*定义用户类型*/struct peopleaccount{char pname[20];char pkey[20];}peopleaccounts[20];/*定义管理员类型*/struct manageaccount{char mname[20];char mkey[20];}manageaccounts[20];/*定义借书卡类型*/struct card{char cardnumber[20]; //借书卡号和用户信息一起写入yonghu.txt文件中的}cards[20];/*定义文件指针变量*/FILE *fp1; //fp1打开用户信息文件FILE *fp2; //fp2打开管理员信息文件FILE *fp3; //fp3打开图书信息文件FILE *fp4; //打开借还书记录的文件FILE *fpa; //fpa是临时文件指针/*改变输出的字体颜色*/void color(const unsigned short color1){if(color1>=0&&color1<=15)SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color1);/*仅限改变0-15的颜色;如果在0-15那么实现他的颜色因为如果超过15后面的改变的是文本背景色。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h> 显示一系列功能选项输入n ,n 为1,2或3根据n 的值调用各功能模块函数结束开始n 图书馆管理系统读者注册、登陆及密码修改 修改图书信息 删除图书信息 管理员登陆 查找图书信息 浏览图书信息#include"head.h"#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还)};//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号)void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名)void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic5();void pic6();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n"); password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n"); password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n');printf("请输入数字!!\n"); }rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n"); examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1); default: ;}switch(b){ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer); default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1);default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break; case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break;case -9: printf("error9 !无此图书编号的记录\n\n");break; case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密码输入错误\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break; case -16: printf("error16 !打不开文件,保存失败\n\n");break; case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break; case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;;case -20: printf("error20 !抱歉,图书已经借完了\n\n");break; case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break; case 1: pic1();break; case 2: pic2();break; case 3: pic3();break; case 4: pic4();break; case 5: pic5();break; case 6: pic6();break; case 7: pic7();break; case 8: pic8();break; case 9: pic9();break; case 10: pic10();break; case 11: pic11();break; case 12: pic12();break; case 13: pic13();break; case 14: pic14();break; case 15: pic15();break; case 16: pic16();break; case 17: pic17();break; case 18: pic18();break; case 19: pic19();break;case 21: pic21();break; case 22: pic22();break; case 23: pic23();break; case 24: pic24();break; case 25: pic25();break; case 26: pic26();break; case 27: pic27();break; case 29: pic29();break; case 30: pic30();break; case 31: pic31();break; case 32: pic32();break; case 33: pic33();break; case 34: pic34();break; case 35: pic35();break; case 36: pic36();break; case 37: pic37();break; case 38: pic38();break; case 39: pic39();break; case 40: pic40();break; case 41: pic41();break; case 42: pic42();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key); }fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[ k].classic,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[ x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确 { if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key); }fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确 {if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[ x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在{for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息{bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer); ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件if(fp==NULL)return -16;else{for(y=0;y<=k;y++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);} }fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[ p].classic,bb[p].writer,bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss [p].bh,ss[p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[ x].classic,bb[x].writer,bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n"); printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.cla ssic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n"); examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include"head.h"#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还)};//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号) void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名) void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic5();void pic6();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n");password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n'); printf("请输入数字!!\n"); }rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n");examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1);default: ;}switch(b){ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1); default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break; case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break; case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密碼輸入錯誤\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;; case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 12: pic12();break;case 13: pic13();break;case 14: pic14();break;case 15: pic15();break;case 16: pic16();break;case 17: pic17();break;case 18: pic18();break;case 19: pic19();break;case 20: pic20();break;case 21: pic21();break;case 22: pic22();break;case 23: pic23();break;case 24: pic24();break;case 25: pic25();break;case 26: pic26();break;case 27: pic27();break;case 29: pic29();break;case 30: pic30();break;case 31: pic31();break;case 32: pic32();break;case 33: pic33();break;case 34: pic34();break;case 35: pic35();break;case 36: pic36();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classi c,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面 if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里 strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在 {for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息 {bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件 if(fp==NULL)return -16;else{for(y=0;y<=k;y++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);} }fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件 if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classi c,bb[p].writer,bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件 if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss [p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.z n,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() //删除图书确认界面{ int i;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=sc(bk.bh);if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() //获取特定编号图书失败界面{ printf("1.返回重新输入图书编号\n2.返回选择不同类别的图书\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic19() //删除图书成功提示界面{ printf("删除图书操作成功!!!\n");printf("1.返回选择其他的图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=15;break;case 2: n=2;break;default: ;}}void pic20() // 删除图书失败提示界面{ printf("1.返回重新输入图书编号\n2.返回重新选择类别\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic21() //管理员查看借阅记录界面。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>显示一系列功能选项输入n ,n 为1,2或3根据n 的值调用各功能模块函数结束开始n 图书馆管理系统读者注册、登陆及密码修改 修改图书信息 删除图书信息 管理员登陆 查找图书信息 浏览图书信息#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还) };//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号)void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名)void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为{ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n");password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n');printf("请输入数字!!\n");}rewind(stdin);if(b) system("cls");}char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n");examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1);default: ;{ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1);default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break;case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break;case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密码输入错误\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;;case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 12: pic12();break;case 13: pic13();break;case 15: pic15();break;case 16: pic16();break;case 17: pic17();break;case 18: pic18();break;case 19: pic19();break;case 20: pic20();break;case 21: pic21();break;case 22: pic22();break;case 23: pic23();break;case 24: pic24();break;case 25: pic25();break;case 26: pic26();break;case 27: pic27();break;case 29: pic29();break;case 30: pic30();break;case 31: pic31();break;case 32: pic32();break;case 33: pic33();break;case 34: pic34();break;case 35: pic35();break;case 36: pic36();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL)return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在{for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息{bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件if(fp==NULL)return -16;else{for(y=0;y<=k;y++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);}}fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classic,bb[p].writer,bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss[p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() //删除图书确认界面{ int i;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=sc(bk.bh);if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() //获取特定编号图书失败界面{ printf("1.返回重新输入图书编号\n2.返回选择不同类别的图书\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic19() //删除图书成功提示界面{ printf("删除图书操作成功!!!\n");printf("1.返回选择其他的图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=15;break;case 2: n=2;break;default: ;。
图书管理系统C语言1. 简介图书管理系统是一种用于管理图书馆藏书和借阅记录的软件系统。
它通常包括图书的录入、借阅、归还、查询等功能,能够提高图书馆的工作效率和服务质量。
本文将使用C语言编写一个简单的图书管理系统,实现基本的图书信息录入、修改、查询、借阅、归还等功能。
2. 功能实现2.1 数据结构我们首先需要定义合适的数据结构来存储图书信息和借阅记录。
以下是一个简单的数据结构示例:struct Book {int id; // 图书编号char title[100]; // 图书标题char author[50]; // 图书作者char category[50]; // 图书分类int isBorrowed; // 图书是否已借阅,0表示未借阅,1表示已借阅char borrowerName[100]; // 借阅者姓名// 可根据需求扩展其他字段};struct BorrowRecord {int bookId; // 图书编号char borrowerName[100]; // 借阅者姓名char borrowDate[20]; // 借阅日期char returnDate[20]; // 归还日期// 可根据需求扩展其他字段};2.2 图书信息录入和修改我们可以通过实现相应的函数来实现图书信息的录入和修改。
以下是一个简单的示例:void addBook(struct Book *library, int *count) {// 输入图书信息,将其存入library数组中,同时更新count}void updateBook(struct Book *library, int count, int bookId) { // 根据图书编号bookId,更新library数组中对应图书的信息}2.3 图书查询我们可以根据图书的不同字段来实现不同的查询功能,比如根据图书标题、作者、分类等进行模糊查询,或根据图书编号进行精确查询。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】图书馆管理系统读者注册、登陆及密码修改修改图书信息删除图书信息管理员登陆查找图书信息浏览图书信息【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用开始显示一系列功能选项n输入n,n为1,2或3根据n的值调用各功能模块函数结束源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include"head.h"#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还)};//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号) void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名) void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic5();void pic6();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n");password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n");password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n'); printf("请输入数字!!\n"); }rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n");examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1);default: ;}switch(b){ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer);default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1); default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break; case -6: printf("error6 !编号不存在\n\n");break;case -7: printf("error7 !书名不能为空\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break; case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密碼輸入錯誤\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;; case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 2: pic2();break;case 3: pic3();break;case 4: pic4();break;case 5: pic5();break;case 6: pic6();break;case 7: pic7();break;case 8: pic8();break;case 9: pic9();break;case 10: pic10();break;case 11: pic11();break;case 12: pic12();break;case 13: pic13();break;case 14: pic14();break;case 15: pic15();break;case 16: pic16();break;case 17: pic17();break;case 18: pic18();break;case 19: pic19();break;case 20: pic20();break;case 21: pic21();break;case 22: pic22();break;case 23: pic23();break;case 24: pic24();break;case 25: pic25();break;case 26: pic26();break;case 27: pic27();break;case 29: pic29();break;case 30: pic30();break;case 31: pic31();break;case 32: pic32();break;case 33: pic33();break;case 34: pic34();break;case 35: pic35();break;case 36: pic36();break;case 37: pic37();break;case 38: pic38();break;case 39: pic39();break;case 40: pic40();break;case 41: pic41();break;case 42: pic42();break;case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break;case 47: pic47();break;default: ;}}4.文件操作各种函数源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;while(!feof(fp)){fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;}s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{for(x=0;x<=i;x++){if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].classi c,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}k--;fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面 if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空{return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里 strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在 {for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息 {bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件 if(fp==NULL)return -16;else{for(y=0;y<=k;y++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);} }fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件 if(fp==NULL)return -16;else{for(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].classi c,bb[p].writer,bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件 if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,ss [p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].classi c,bb[x].writer,bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("------------------------------------------------------------------------\n\n");}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("------------------------------------------------------------------------\n\n");printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面{ copy2(aa.no);pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.z n,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk.zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() //删除图书确认界面{ int i;pica();printf("编号为%d的图书信息:\n\n",bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.删除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=sc(bk.bh);if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() //获取特定编号图书失败界面{ printf("1.返回重新输入图书编号\n2.返回选择不同类别的图书\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic19() //删除图书成功提示界面{ printf("删除图书操作成功!!!\n");printf("1.返回选择其他的图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=15;break;case 2: n=2;break;default: ;}}void pic20() // 删除图书失败提示界面{ printf("1.返回重新输入图书编号\n2.返回重新选择类别\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic21() //管理员查看借阅记录界面。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为//rkou.c 程序的入口#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#include"head.h"#include"fuc.h"#include"picture.h"#include"jiangzhuo1.h"#include"output.h"main(){ int i=setup();switch (i){ case 0: while(n<50){ conects(n);}default: eros(i);}system("pause");}2.程序中全局变量声明定义,以及所有函数声明源代码为struct book //图书结构体声明{ char name[50],classic[10],writer[20]; //书名,类别,作者int jn; //借出数量int zn; //在馆数量int bh; //图书编号};struct information //管理员和读者结构体声明{ char name[10],no[12],key[10]; //姓名,账号,密码};struct show //图书借阅记录的结构体声明{char name1[10],name2[50],writer[20],no[12]; //书名,读者姓名,书的作者,读者账号int bh,o; //图书编号,借阅状况(未还,已还) };//以下为用到的全局变量struct book bk;struct information aa,rr;struct information stu[100];struct book bb[100];struct information ad[100];struct show ss[100];int i,j,k,s;int n=0;int x;FILE *fp;//以下函数主要功能:方便窗口与用户之间交换信息int regst();void password(char *a,int b,int j); //登陆时的输入函数void examine(int *a,int b); //保证键入的数据是数字void changepaw(int a,int b); //修改密码用到的提示函数void inputs0(); //输出图书类别以供用户选择void inputs1(int a,int b,int c,int d,int e); //方便用户输入图书各项信息(如书名,编号)void inputs2(int a,int b,int c); //方便用户输入管理员的信息(如账号姓名)void inputs3(int a,int b,int c); //方便用户输入读者的信息(如账号姓名)void eros(int i) ; //错误显示函数,操作一旦出错,则会出现相应的错误信息void conects(int j); //连接函数,选择界面//一下函数主要用于改变文件的内容并保存int setup() ; //数据初始化函数int xzc(char no[12],char key1[10],char key2[10],char name[10]); //读者注册函数int exam(char no[10],char key[10],int n); //密码账号检验函数int mp(char no[12],char key1[10],char key2[10],char key3[10],int n); //密码修改函数void paixu(); //对图书按照编号从小到大的顺序进行排列int sc(int bh); //管理员删除图书信息函数int zj(struct book bb); //管理员增加图书信息函数int xg(struct book bb); //管理员修改图书信息函数int js(int bh,char no[12]); //借书函数int hs(int bh,char no[12]); //还书函数int bh1(int bh); //判断该编号的图书信息是否存在函数void bh2(int bh); //按照图书编号显示图书信息函数int sm1(char name[50]); //判断是否存在该名字的图书信息函数void sm2(char name[50]); //按照图书名字显示图书信息函数int zz1(char writer[20]); //判断是否存在该作者的图书信息函数void zz2(char writer[20]); //按照图书作者显示图书信息函数void lb(char classic[10]); //按类别显示图书信息int rck1(int bh); //判断该编号的图书的借书记录是否存在void rck2(int bh); //按编号显示图书借书情况int gck21(char no[12]); //判断该账号读者的借书记录是否存在void gck22(char no[12]); //按读者显示借书情况2void gck12(); //显示全部借书情况void gck23(); //管理员查看所有书的信息void copy(int bh); // 按编图书编号将图书信息暂时保存在另外一个结构体里面void copy2(char no[12]); //按管理员账号将管理员信息暂时保存在另外一个结构体里面void copy3(char no[12]); //按读者账号将读者信息暂时保存在另外一个结构体里面//pic() 函数:每个函数表示一个界面,conects函数将它们连接起来void pic0();void pic1();void pic2();void pic3();void pic4();void pic5();void pic6();void pic7();void pic8();void pic9();void pic10();void pic11();void pic12();void pic13();void pic14();void pic15();void pic16();void pic17();void pic18();void pic19();void pic20();void pic21();void pic22();void pic23();void pic24();void pic25();void pic26();void pic27();void pic29();void pic30();void pic31();void pic32();void pic33();void pic34();void pic35();void pic36();void pic37();void pic38();void pic39();void pic40();void pic41();void pic42();void pic43();void pic44();void pic45();void pic46();void pic47();void picc();3.用户输入以及界面反馈用到的功能函数源代码为int regst(){ char num[12],paw1[10],paw2[10],name[10];int i;printf("请输入账号\n(11字符以内,不能含有中文字符):\n"); password(num,0,11);printf("输入您的密码\n(9字符以内,不能含有中文字符):\n"); password(paw1,1,9);printf("请再次输入密码:\n");password(paw2,1,9);printf("输入您的姓名:\n");gets(name);system("cls");i=xzc(num,paw1,paw2,name);return i;}void password(char *a,int b,int j){ char c;int i=0;while((c=getch())!='\r'){ if(c==8){ printf("\b \b");if(i>0)i--;}else if(i<j){ if(b) printf("*");else printf("%c",c);a[i]=c;i++;}if(i==j){ printf("\a");}}a[i]='\0';printf("\n");}void examine(int *a,int b){ while(!scanf("%d",a)){ while(getchar()!='\n'); printf("请输入数字!!\n"); }rewind(stdin);if(b) system("cls");}void changepaw(int a,int b){ int i;char c1[10],c2[10],c3[10];printf("请输入原密码\n");password(c1,1,9);printf("请输入新密码\n");password(c2,1,9);printf("请再次输入新密码\n");password(c3,1,9);system("cls");if(b){ i=mp(aa.no,c1,c2,c3,b);if(i){ eros(i);n=27;}else n=26;}else{ i=mp(rr.no,c1,c2,c3,b);if(i){ eros(i);n=44;}else n=43;}}void inputs0(){ int i=1;while(i==1){ printf("1.A类\n2.B类\n3.C类\n4.D类\n5.E类\n6.F类\n"); examine(&i,1);switch(i){ case 1: strcpy(bk.classic,"A类");i=0;break;case 2: strcpy(bk.classic,"B类");i=0;break;case 3: strcpy(bk.classic,"C类");i=0;break;case 4: strcpy(bk.classic,"D类");i=0;break;case 5: strcpy(bk.classic,"E类");i=0;break;case 6: strcpy(bk.classic,"F类");i=0;break;default: i=1;}}}void inputs1(int a,int b,int c,int d,int e){ int i;switch(a){ case 1: printf("请输入图书编号:\n");examine(&bk.bh,1); default: ;}switch(b){ case 1: printf("请输入图书名称:\n");gets();default: ;}switch(c){ case 1: printf("请输入图书的作者:\n");gets(bk.writer); default: ;}switch(d){ case 1: printf("请输入该图书的库存:\n");examine(&bk.zn,1); default: ;}system("cls");switch(e){ case 1: printf("请选择图书类别:\n");inputs0();default: ;}}void inputs2(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(aa.no,0,11);default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(aa.key,1,9);default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void inputs3(int a,int b,int c){ switch(a){ case 1: printf("请输入账号:\n");password(rr.no,0,11); default: ;}switch(b){ case 1: printf("请输入密码:\n"); password(rr.key,1,9); default: ;}switch(c){ case 1: printf("请输入姓名:\n");gets();default: ;}system("cls");}void eros(int i) //错误函数{ switch (i){ case -1: printf("error1 !初始化失败\n\n");break;case -2: printf("error2 !账号不存在\n\n");break;case -3: printf("error3 !账号不存在\n\n");break;case -4: printf("error4 !密码错误\n\n");break;case -5: printf("error5 !输入的密码不一致\n\n");break; case -6: printf("error6 !编号不存在\n\n");break;case -8: printf("error8 !作者名字不能为空\n\n");break;case -9: printf("error9 !无此图书编号的记录\n\n");break;case -10: printf("error10 !无此账号的记录\n\n");break;case -11: printf("error11 !原始密碼輸入錯誤\n\n");break;case -12: printf("error12 !您已经归还此书\n\n");break;case -13: printf("error13 !您所增加的图书编号已存在\n\n");break;case -14: printf("error14 !搜索不到此书的相关信息\n\n");break;case -15: printf("error15 !搜索不到该作者的信息\n\n");break;case -16: printf("error16 !打不开文件,保存失败\n\n");break;case -17: printf("error17 !该图书信息已存在\n\n");break;case -18: printf("error18 !您没有借过这本书\n\n");break;case -19: printf("error19 !您已经借阅了这本书,不能再借\n\n");break;; case -20: printf("error20 !抱歉,图书已经借完了\n\n");break;case -21: printf("error21 !账号已存在\n\n") ; break;case -22: printf("error22 !还有图书未还,不能删除该条信息\n\n");break;default : ;}}void conects(int j){ switch(j){ case 0: pic0();break;case 1: pic1();break;case 5: pic5();break; case 6: pic6();break; case 7: pic7();break; case 8: pic8();break; case 9: pic9();break; case 10: pic10();break; case 11: pic11();break; case 12: pic12();break; case 13: pic13();break; case 14: pic14();break; case 15: pic15();break; case 16: pic16();break; case 17: pic17();break; case 18: pic18();break; case 19: pic19();break; case 20: pic20();break; case 21: pic21();break; case 22: pic22();break; case 23: pic23();break; case 24: pic24();break; case 25: pic25();break;case 30: pic30();break; case 31: pic31();break; case 32: pic32();break; case 33: pic33();break; case 34: pic34();break; case 35: pic35();break; case 36: pic36();break; case 37: pic37();break; case 38: pic38();break; case 39: pic39();break; case 40: pic40();break; case 41: pic41();break; case 42: pic42();break; case 43: pic43();break;case 44: pic44();break;case 45: pic45();break;case 46: pic46();break; case 47: pic47();break; default: ;}}源代码为// jiangzhuo1.h 文件操作各种函数int setup() //数据初始化函数{FILE *fp;fp=fopen("reader.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{i=0;while(!feof(fp)){fscanf(fp,"%s %s %s",stu[i].name,stu[i].no,stu[i].key); //将文档里面的数据格式化读取到结构体数组里面i++;}i=i-1;}fclose(fp);fp=fopen("ad.txt","r"); //对文档以只读的方式进行操作{return -1; //当文件打不开时返回-1}else{j=0;while(!feof(fp)){fscanf(fp,"%s %s %s",ad[j].name,ad[j].no,ad[j].key); //将文档里面的数据格式化读取到结构体数组里面j++;}j=j-1;}fclose(fp);fp=fopen("book.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{k=0;{fscanf(fp,"%d %s %s %s %d %d ",&bb[k].bh,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn); //将文档里面的数据格式化读取到结构体数组里面k++;}k=k-1;}fclose(fp);fp=fopen("show.txt","r"); //对文档以只读的方式进行操作if(fp==NULL){return -1; //当文件打不开时返回-1}else{s=0;while(!feof(fp)){fscanf(fp," %s %s %d %s %s %d ",ss[s].name1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); //将文档里面的数据格式化读取到结构体数组里面s++;s=s-1;}fclose(fp);return 0; //当操作全部正确时返回0}int xzc(char no[12],char key1[10],char key2[10],char name[10]) //读者注册函数{ int x=0;for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //判断读者输入的账号与结构体里面的账号是否相同{return -21;break;}if(x==i && strcmp(no,stu[x].no))//判断读者输入的账号与结构体里面的账号是否相同{if(!strcmp(key1,key2)) //判断读者两次输入的密码是否一致{i=i+1;strcpy(stu[i].name,name);strcpy(stu[i].no,no);fp=fopen("reader.txt","a"); //对文件以写的方式将注册的信息保存到文件里面if(fp==NULL)return -16;else{fprintf(fp,"%s\t\t%s\t\t%s\n",stu[i].name,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) //密码账号检验函数{ int x;if(n==0) //对读者的密码和账号信息进行检验{{if(!strcmp(no,stu[x].no)) //判断该账号是否存在{if(!strcmp(key,stu[x].key)) //当账号存在时判断与之相应的密码是否相同{return 0;break;}else{return -4;break;}}if(x==i && strcmp(no,stu[x].no)){return -3;}}}if(n==1) //对管理员的密码账号信息进行检验{{if(!strcmp(no,ad[x].no)) //判断该账号是否存在{if(!strcmp(key,ad[x].key)) //判断与之相应的密码是否存在{return 0;break;}else{return -4;break;}}if(x==j && strcmp(no,ad[x].no)){return -3;}}}}int zj(struct book b) //管理员增加图书信息函数{ int x;for(x=0;x<=k;x++){ if(bb[x].bh==b.bh) //判断所增加的图书编号是否已存在{return -13;break;}if(!strcmp(,bb[x].name)&&!strcmp(b.writer,bb[x].writer)) //判断所增加的图书是否存在{ return -17;break;}if(x==k){ if(strlen(bb[0].name)==0) //判断文档的第一行是否为空k=k;elsek=k+1;bb[k].bh=b.bh; //将所增加的图书信息添加到结构体里面strcpy(bb[k].name,);strcpy(bb[k].classic,b.classic);strcpy(bb[k].writer,b.writer);bb[k].zn=b.zn;bb[k].jn=b.jn;fp=fopen("book.txt","a"); //将增加的图书信息追加到文件里面if(fp==NULL)return -16;{fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[k].bh,bb[k].name,bb[k].class ic,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) //管理员删除图书信息函数{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断所删除图书的编号是否存在{if(bb[x].jn!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1]; //删除图书信息后将该图书信息后面的图书信息依次前移}fp=fopen("book.txt","w+"); //将删除后的所有图书信息重新写入文档if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].class ic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) //密码修改函数{ int x;if(n==0) //读者密码修改{for(x=0;x<=i;x++){if(!strcmp(no,stu[x].no)) //定位读者账号位置{if(!strcmp(stu[x].key,key1)) //判断输入的原密码是否正确{ if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(stu[x].key,key3);fp=fopen("reader.txt","w+"); //将修改后的信息保存在文件里面if(fp==NULL)return -16;else{for(x=0;x<=i;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",stu[x].name,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) //管理员密码修改{for(x=0;x<=j;x++){if(!strcmp(no,ad[x].no)) //定位管理员账号位置{if(!strcmp(key1,ad[x].key)) //判断输入的原密码是否正确{if(!strcmp(key2,key3)) //判断两次输入的新密码是否一致{strcpy(ad[x].key,key3);fp=fopen("ad.txt","w+"); //将修改后的信息保存在文件里面 if(fp==NULL)return -16;else{for(x=0;x<=j;x++)fprintf(fp,"%s\t\t%s\t\t%s\n",ad[x].name,ad[x].no,ad[x].key); }fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) //管理员修改图书信息函数{ int x;if(strlen()==0) //判断所输入的要修改的图书名字是否为空 {return -7;}else{if(strlen(b.writer)==0) //判断所输入的要修改的图书作者是否为空{return -8;}else{for(x=0;x<=k;x++){if((bb[x].bh==b.bh)) //定位要修改的图书编号位置{strcpy(bb[x].name,); //将修改后的信息保存在结构体里 strcpy(bb[x].classic,b.classic);strcpy(bb[x].writer,b.writer);bb[x].zn=b.zn;bb[x].jn=b.jn;fp=fopen("book.txt","w+"); //将修改后的所有信息保存在文件里if(fp==NULL)return -16;else{for(x=0;x<=k;x++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].class ic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;}}}}}void copy(int bh) // 按编图书编号将图书信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=k;x++){if(bb[x].bh==bh){strcpy(,bb[x].name);strcpy(bk.classic,bb[x].classic);strcpy(bk.writer,bb[x].writer);bk.zn=bb[x].zn;bk.jn=bb[x].jn;bk.bh=bb[x].bh;}}}void copy2(char no[12]) //按管理员账号将管理员信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=j;x++){if(!strcmp(ad[x].no,no)){strcpy(,ad[x].name);strcpy(aa.key,ad[x].key);}}}void copy3(char no[12]) //按读者账号将读者信息暂时保存在另外一个结构体里面{ int x;for(x=0;x<=i;x++){if(!strcmp(stu[x].no,no)){strcpy(,stu[x].name);strcpy(rr.key,stu[x].key);}}}int js(int bh,char no[12]) //借书函数{ int x,y,z;for(x=0;x<=k;x++){if(bb[x].bh==bh) //判断借书编号是否存在{if(bb[x].zn>0) //判断在馆数是否为0{if(strlen(ss[0].name1)==0) //判断文件里面的第一行信息是否存在 {for(y=0;y<=i;y++){if(!strcmp(stu[y].no,no)){ --bb[x].zn; //修改借书后的信息++bb[x].jn;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); //将借书后的信息保存在结构体数组里面strcpy(ss[0].no,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) //定位与输入的编号和账号一致的借书记录{if(ss[y].o==2) //判断是否已借过该书return -19;else{--bb[x].zn; //修改借书后的信息++bb[x].jn;ss[y].o=2;}break;}else{if(y==s){for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) //定位读者信息 {bb[x].zn--; //修改借书后的信息bb[x].jn++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("book.txt","w+"); //将借书后的图书信息写入文件 if(fp==NULL)return -16;elsefor(y=0;y<=k;y++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[y].bh,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将借书记录写入文件if(fp==NULL)return -16;else{for(y=0;y<=s;y++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[y].name1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);} }fclose(fp);return 0;}return -20;}}}int hs(int bh,char no[12]) //还书函数{ int x,p;for(x=0;x<=s;x++){if(ss[x].bh==bh && !strcmp(ss[x].no,no)) //判断其借书记录是否存在{ if(ss[x].o==2) //判断该书是否被借过{ for(p=0;p<=k;p++){if(bb[p].bh==bh) //修改还书后的图书信息{ ++bb[p].zn;--bb[p].jn;}}ss[x].o=1;fp=fopen("book.txt","w+"); //将还书后的所有图书信息重新写入文件if(fp==NULL)return -16;elsefor(p=0;p<=k;p++){fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[p].bh,bb[p].name,bb[p].class ic,bb[p].writer,bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("show.txt","w+"); //将还书后的所有借书记录重新写入文件if(fp==NULL)return -16;else{for(p=0;p<=s;p++){fprintf(fp,"%-20s\t%s\t%d\t%-30s\t%-10s\t%d\n",ss[p].name1,ss[p].no,ss[p].bh,s s[p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;else{return -12;}}elseif(x==s)return -18;}}void paixu() //对图书按照编号从小到大的顺序进行排列{ int x,flag;struct book a;do //用冒泡法排序{flag=1;for(x=0;x<=k-1;x++){if(bb[x].bh>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;}}}while(flag==0);fp=fopen("book.txt","w+"); //将排序后的信息重新写入文件for(x=0;x<=k;x++)fprintf(fp,"%d\t%-30s\t%-30s\t%-10s\t%d\t%d\n",bb[x].bh,bb[x].name,bb[x].class ic,bb[x].writer,bb[x].zn,bb[x].jn);fclose(fp);}5.登陆界面所有函数源代码为// picture.h 登陆界面所有函数void pica(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:管理员\n",aa.no,);printf("------------------------------------------------------------------------\n\n");}void picb(){ printf("\n登陆用户:%-16s登陆者:%-16s权限:读者\n",rr.no,);printf("----------------------------------------------------------------------}void pic0() //登陆界面{ printf("\n\t\t\t欢迎登陆湖南大学图书管理系统\n");printf("------------------------------------------------------------------------\n\n");printf("1.登陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() //管理员登陆界面{ int i;printf("\n\t\t\t\t登陆\n");printf("----------------------------------------------------------------------printf("1.管理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam(aa.no,aa.key,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam(rr.no,rr.key,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() //管理员管理界面pica();printf("1.增加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 3: n=15;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() //管理员登陆错误提示{ printf("1.返回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() //管理员添加图书界面{ pica();printf("1.录入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() //添加图书确认界面{ int i;pica();printf("你输入的图书信息为:\n\n");printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n");printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk. zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.录入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() //添加图书成功提示界面{ printf("添加图书成功!!\n");printf("1.返回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic7() // 添加图书失败提示界面{ printf("1.重新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() //修改图书界面{ pica();printf("1.进行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() //输入编号以选择修改相应的图书{ int i;pica();printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() //按需求修改图书界面{ pica();printf("编号为%d的图书信息:\n\n",bk.bh);copy(bk.bh);bh2(bk.bh);printf("------------------------------------------------------------------------\n\n");printf("1.修改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() //获取相应的图书失败提示界面{ printf("1.重新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() //修改图书信息确认界面{ int i;pica();printf("你要修改的图书信息为:\n\n");bh2(bk.bh);printf("%-24s%-8d%-16s%-8s%-8d%-8d\n\n",,bk.bh,bk.writer,bk.classic,bk. zn,bk.jn);printf("------------------------------------------------------------------------\n\n");printf("1.确认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() //修改图书提示成功界面{ printf("修改图书成功!!\n");printf("1.返回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() //修改图书失败提示界面{ printf("1.重新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() //删除图书选择界面{ pica();printf("1.进行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() //输入相应编号删除图书{ int i;pica();;printf("以下是在馆所有图书信息:\n\n");gck23();printf("------------------------------------------------------------------------\n\n");printf("1.输入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1(bk.bh);if(i){ eros(i);n=18;}else{n=17;system("cls");。
HUNAN UNIVERSITYC语言程序训练报告【设计目的】图书信息包括:读者登录号、管理员登录号、图书编号、作者名、种类、出版社、图书库存、图书借出数目等.图书信息管理系统,使之能提供以下功能:1)系统以菜单方式工作2)读者注册功能3)读者登录功能4)读者借书还书功能5)查询读者借阅记录6)查询在管图书信息功能7)修改密码功能8)管理员登录功能9)增加、修改、删除图书功能10)查看图书信息功能【设计思路】根据题目要求,应当把图书信息用结构体形式输入,应该提供以下结构体和文件的输入等操作:在程序中需要实现图书信息录入,浏览,查询,删除和修改等功能的操作,所以需要建立相应的模块来实现:另外还需提供选择菜单实现功能,在运行时达到所要求的目的;管理员和读者登录界面及各自功能应有不同的实现。
【总体设计】【详细设计】1.主函数主函数设计要求简洁,只提供部分提示语和函数的调用源代码为序中全局变量声明定义,以及所有函数声明源代码为struct book 件操作各种函数源代码为ame,stu[i].no,stu[i].key); ame,ad[j].no,ad[j].key); h,bb[k].name,bb[k].classic,bb[k].writer,&bb[k].zn,&bb[k].jn);ame1,ss[s].no,&ss[s].bh,ss[s].name2,ss[s].writer,&ss[s].o); o)) o))ame,name); strcpy(stu[i].no,no);strcpy(stu[i].key,key1);fp=fopen("","a"); ame,stu[i].no,stu[i].key);}fclose(fp);return 0;}else{return -5;}}}}int exam(char no[10],char key[10],int n) o)) ey)) o)){return -3;}}}if(n==1) o)) ey)) o)){return -3;}}}}int zj(struct book b) h== ame)&&!strcmp,bb[x].writer)) ame)==0) h=; ame,;strcpy(bb[k].classic,;strcpy(bb[k].writer,;bb[k].zn=;bb[k].jn=;fp=fopen("","a");h,bb[k].name,bb[k].classic,bb[k].writer,bb[k].zn,bb[k].jn);}fclose(fp);return 0;}}}int sc(int bh) h==bh) n!=0)return -22;for(x=x;x<=k-1;x++){bb[x]=bb[x+1];h,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn);}}fclose(fp);return 0;break;}}}int mp(char no[12],char key1[10],char key2[10],char key3[10],int n) o)) ey,key1)) ey,key3);fp=fopen("","w+"); ame,stu[x].no,stu[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}if(n==1) o)) ey)) ey,key3);fp=fopen("","w+"); ame,ad[x].no,ad[x].key);}fclose(fp);return 0;}else{return -5;}}elsereturn -11;}}}}int xg(struct book b) h==) ame,; lassic,;strcpy(bb[x].writer,;bb[x].zn=;bb[x].jn=;fp=fopen("","w+");h,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn); }}fclose(fp);return 0;}}}}}void copy(int bh) h==bh){strcpy,bb[x].name);strcpy,bb[x].classic);strcpy,bb[x].writer);=bb[x].zn;=bb[x].jn;=bb[x].bh;}}}void copy2(char no[12]) o,no)){strcpy,ad[x].name);strcpy,ad[x].key);}}}void copy3(char no[12]) o,no)){strcpy,stu[x].name);strcpy,stu[x].key);}}}int js(int bh,char no[12]) h==bh) n>0) ame1)==0) o,no)){ --bb[x].zn; n;ss[0].o=2;strcpy(ss[0].name1,stu[y].name); o,no);strcpy(ss[0].writer,bb[x].writer);strcpy(ss[0].name2,bb[x].name);ss[0].bh=bh;}}}else{for(y=0;y<=s;y++){if((ss[y].bh==bh )&&!strcmp(ss[y].no,no)) ==2) n; n; ss[y].o=2;}break;}else{if(y==s){s++;for(z=0;z<=i;z++){if(!strcmp(stu[z].no,no)) n--; n++;strcpy(ss[s].name1,stu[z].name);strcpy(ss[s].name2,bb[x].name);strcpy(ss[s].no,no);strcpy(ss[s].writer,bb[x].writer);ss[s].bh=bb[x].bh;ss[s].o=2;}}break;}}}}fp=fopen("","w+");h,bb[y].name,bb[y].classic,bb[y].writer,bb[y].zn,bb[y].jn);}}fclose(fp);fp=fopen("","w+");ame1,ss[y].no,ss[y].bh,ss[y].name2,ss[y].writer,ss[y].o);} }fclose(fp);return 0;}elsereturn -20;}}}int hs(int bh,char no[12]) h==bh && !strcmp(ss[x].no,no)) ==2) h==bh) n;--bb[p].jn;}}ss[x].o=1;fp=fopen("","w+");h,bb[p].name,bb[p].classic,bb[p].writer,bb[p].zn,bb[p].jn);}}fclose(fp);fp=fopen("","w+");ame1,ss[p].no,ss[p].bh,ss[p].name2,ss[p].writer,ss[p].o);}}fclose(fp);return 0;}else{return -12;}}elseif(x==s)return -18;}}void paixu() h>bb[x+1].bh){a=bb[x+1];bb[x+1]=bb[x];bb[x]=a;flag=0;}}}while(flag==0);fp=fopen("","w+");h,bb[x].name,bb[x].classic,bb[x].writer,bb[x].zn,bb[x].jn); fclose(fp);}5.登陆界面所有函数源代码为陆\n2.读者注册\n3.退出系统\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=45;break;case 3: n=50;break;default:;}}void pic1() 理员登陆\n2.读者登陆\n3.返回系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs2(1,1,0);i=exam,,1);if(i){ eros(i);n=3;}else n=2;break;case 2: inputs3(1,1,0);i=exam,,0);if(i){ eros(i);n=30;}else n=29;break;case 3: n=0;break;default: ;}}void pic2() 加图书\n2.修改图书\n3.删除图书\n4.查看图书信息\n");printf("5.修改密码\n6.返回到系统登陆界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=8;break;case 4: n=21;break;case 5: n=25;break;case 6: n=0;break;default: ;}}void pic3() 回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic4() 入新的图书信息\n2.返回上一层\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,1,1,1,1);n=5; break;case 2: n=2;break;default: ;}}void pic5() 入以上信息\n2.返回重新输入图书信息\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=zj(bk);if(i){ eros(i);n=7;}else n=6;break;case 2: n=4;break;default: ;}}void pic6() 回继续添加图书\n2.返回管理图书界面\n");examine(&x,1);switch(x)case 2: n=2;break;default: ;}}void pic7() 新输入图书信息\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=4;break;case 2: n=2;break;default: ;}}void pic8() 行修改图书操作\n2.返回管理图书界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=2;break;default: ;}}void pic9() 入编号修改图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1;if(i){ eros(i);n=11;}else{ n=10;}break;case 2: system("cls");n=2;break;default: system("cls");}}void pic10() 改书名\n2.修改作者名字\n3.修改图书在馆的数量\n4.修改图书所属的类别\n");printf("5.修改图书所有信息\n6.返回上一层选择其他编号的书\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(0,1,0,0,0);n=12;break;case 2: inputs1(0,0,1,0,0);n=12;break;case 3: inputs1(0,0,0,1,0);n=12;break;case 4: inputs1(0,0,0,0,1);n=12;break;case 5: inputs1(0,1,1,1,1);n=12;break;case 6: n=9;break;default: ;}}void pic11() 新输入图书编号\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=9;break;case 2: n=8;break;default: ;}}void pic12() 认修改此图书\n2.返回选择修改其他信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=xg(bk);if(i){ eros(i);n=14;}else n=13;break;case 2: n=10;break;case 3: n=8;break;default: ;}}void pic13() 回继续修改图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=8;break;case 2: n=2;break;default: ;}}void pic14() 新输入图书修改信息\n2.图书管理界面\n");examine(&x,1);switch(x){ case 1: n=10;break;case 2: n=8;break;default: ;}}void pic15() 行删除图书操作\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=16; break;case 2: n=2;break;default: ;}}void pic16() 入编号删除图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1;if(i){ eros(i);n=18;}else{n=17;system("cls");};break;case 2: system("cls");n=2;break;default: system("cls"); ;}}void pic17() 除该图书\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=sc;if(i){ eros(i);n=20;}else n=19;break;case 2: n=2;break;default: ;}}void pic18() 回重新输入图书编号\n2.返回选择不同类别的图书\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic19() 回选择其他的图书\n2.返回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=15;break;case 2: n=2;break;default: ;}}void pic20() 回重新输入图书编号\n2.返回重新选择类别\n");examine(&x,1);switch(x){ case 1: n=16;break;case 2: n=15;break;default: ;}}void pic21() 看指定编号的图书借阅记录\n2.查看指定读者的借阅记录\n3.查看所有图书借阅记录\n4.查看在馆图书的详细信息\n");printf("5.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");switch(x){ case 1: inputs1(1,0,0,0,0);i=rck1;if(i){ eros(i);n=23;}else{ pica();printf("编号为%d的图书的借出情况:\n\n",;rck2;n=22;}break;case 2: inputs3(1,0,0);i=gck21;if(i){ eros(i);n=23;}else{ pica();printf("账号为%s的读者借书情况:\n\n",;gck22; n=22;}break;case 3: pica();printf("以下为所有在借图书的信息:\n\n");gck12();n=22;break;case 4: n=24;break;case 5: n=2;break;default: ;}}void pic22() 回查看其它借阅记录\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=21;break;case 2: n=2;break;default : ;}}void pic23() 回查看记录界面\n2.返回图书管理界面\n");switch(x){ case 1: n=21;break;case 2: n=2;break;default: ;}}void pic24() 编号对图书进行排序\n2.返回查看其它信息\n3.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: ;system("cls");paixu();n=24;break;case 2: n=21;break;case 3: n=2;break;default : ;}}void pic25() 改我的密码\n2.返回图书管理界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: changepaw(1,1);break;case 2: n=2;break;default: ;}}void pic26() 回管理图书界面\n");examine(&x,1);switch(x){ case 1: n=2;break;default: ;}}void pic27() 试一次\n2.返回图书管理界面\n");examine(&x,1);switch(x){ case 1: n=25;break;case 2: n=2;break;default: ;}}void pic29() 要借书\n2.我要还书\n3.查看我的借阅记录\n4.查看在馆图书信息\n"); printf("5.修改我的密码\n6.返回管理系统界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=31;break;case 2: n=37;break;case 3: n=40;break;case 4: n=41;break;case 5: n=42;break;case 6: n=0;break;default: ;}}void pic30() 回重新输入\n2.返回系统登陆界面\n");examine(&x,1);switch(x){ case 1: n=1;break;case 2: n=0;break;default: ;}}void pic31() 编号查询书目\n2.按书名查询书目\n3.按作者查询书目\n4.按类别查询书目\n5.返回我的主页\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1;if(i){ eros(i);n=33;}else n=34;break;case 2: inputs1(0,1,0,0,0);i=sm1;if(i){ eros(i);n=33;}else{ picb();sm2;n=32;}break;case 3: inputs1(0,0,1,0,0);i=zz1;if(i){ eros(i);n=33;}else{ picb();zz2;n=32;}break;case 4: inputs1(0,0,0,0,1);picb();lb;n=32;break;case 5: n=29;break;default: ;}}void pic32() 入编号借书\n2.返回选择其他查询方法\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,0);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1;if(i){ eros(i);n=36;}else n=34;break;case 2: system("cls");n=31;break;default: system("cls");}}void pic33() 回重新查询\n2.返回我的主页\n");examine(&x,1);switch(x){ case 1: n=31;break;case 2: n=29;break;default: ;}}void pic34() 定借阅此书借书\n2.返回重新选择查询方法\n3.返回我的主页\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=js,;if(i){ eros(i);n=36;}else n=35;break;case 2: ;n=31;break;case 3: ;n=29;break;default: ;}}void pic35() 回再次借阅其他书目\n2.返回我的主页\n");examine(&x,1);switch(x){ case 1: n=31;break;case 2: n=29;break;default: ;}}void pic36() 回重新查询\n2.返回我的主页\n");examine(&x,1);switch(x){ case 1: n=31;break;case 2: n=29;break;default: ;}}void pic37() 入还书的编号\n2.返回我的主页\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: inputs1(1,0,0,0,0);i=bh1;if(i){ eros(i);n=39;}else{ i=hs,;if(i){ eros(i);n=39;}else n=38;}break;case 2: n=29;break;default: ;}}void pic38() 还要还书\n2.返回我的主页\n");examine(&x,1);switch(x){ case 1: n=37;break;case 2: n=29;break;default: ;}}void pic39() 回重新输入编号\n2.返回我的主页\n");examine(&x,1);switch(x){ case 1: n=37;break;case 2: n=29;break;default: ;}}void pic40() 回我的主页\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=29;break;default: ;}}void pic41() 回我的主页\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: n=29;break;default: ;}}void pic42() 要修改我的密码\n2.返回我的主页\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: changepaw(0,0);break;case 2: n=29;break;default: ;}}void pic43() 还要修改密码\n2.返回我的主页\n");examine(&x,1);switch(x){ case 1: n=42;break;case 2: n=29;break;default: ;}}void pic44() 要再试一次\n2.返回我的主页\n");examine(&x,1);switch(x){ case 1: n=42;break;case 2: n=29;break;default: ;}}void pic45() 要注册\n2.返回系统登录界面\n\n");printf("------------------------------------------------------------------------\n\n");examine(&x,1);switch(x){ case 1: i=regst();if(i){ eros(i);n=47;}else n=46;break;case 2: n=0;break;default: ;}}void pic46() 回系统登录界面\n");examine(&x,1);switch(x){ case 1: n=0;break;default: ;}}void pic47() 试一次\n2.返回系统登录界面\n");examine(&x,1);switch(x){ case 1: n=45;break;case 2: n=0;break;default: ;}}6.按要求读取文件的数据并显示到屏幕上源代码为h){return 0;}if(x==k && bh!=bb[x].bh){return -6;}}}void bh2(int bh) h){printf("书名\t\t\t编号\t作者\t\t种类\t在馆数\t借出数\n"); printf("%-24s%-8d%-16s%-8s%-8d%-8d\n",bb[x].name,bb[x].bh,bb[x].writer,bb[x].classic,bb[x].zn,bb[x].jn);}}printf("\n");}int sm1(char name[50]) ame)){return 0;break;}if(x==k && strcmp(name,bb[x].name))return -14;}}void sm2(char name[50]) ame)){printf("%-24s%-8d%-16s%-8s%-8d%-8d\n",bb[x].name,bb[x].bh,bb[x].writer,bb[x].cl assic,bb[x].zn,bb[x].jn);}}printf("\n");}int zz1(char writer[20]) riter)){return 0;break;}if(x==k && strcmp(writer,bb[x].writer))return -15;}}void zz2(char writer[20]) riter)){printf("%-24s%-8d%-16s%-8s%-8d%-8d\n",bb[x].name,bb[x].bh,bb[x].writer,bb[x].cl assic,bb[x].zn,bb[x].jn);}}printf("\n");}void lb(char classic[10]) lassic)){printf("%-24s%-8d%-16s%-8s%-8d%-8d\n",bb[x].name,bb[x].bh,bb[x].writer,bb[x].cl assic,bb[x].zn,bb[x].jn);}}printf("\n");}int rck1(int bh) h==bh){return 0;}else{if(x==s)return -9;}}}void rck2(int bh) h==bh&&ss[x].o==2){printf("%-8s%-16s%-16d%-24s%-8s\n",ss[x].name1,ss[x].no,ss[x].bh,ss[x].name2,ss [x].writer);}}printf("\n");}void gck12() ==2){printf("%-8s%-16s%-16d%-24s%-8s\n",ss[x].name1,ss[x].no,ss[x].bh,ss[x].name2,ss [x].writer);}}printf("\n");}int gck21(char no[12]) o,no)){return 0;}else{if(x==s)return -10;}}}void gck22(char no[12]) o,no)&&ss[x].o==2){printf("%-8s%-16s%-16d%-24s%-8s\n",ss[x].name1,ss[x].no,ss[x].bh,ss[x].name2,ss[x].writer);}}printf("\n");}void gck23()ame,bb[x].bh,bb[x].writer,bb[x].classic,bb[x].zn,bb[x].jn); }}程序运行结果如下图所示1.主界面为2.进入登陆界面3.管理员登陆4.读者注册界面5.读者登陆界面【心得体会】1.通过这次实训课的训练,我组成员收获了许多新的知识,也锻炼了自己各方面的能力,坚实地打牢了专业知识基础,极大得方便了以后的学习生活。