
用C语言编写一个简单的图书管理小程序
2019-03-12 17:01:43
微信公开课小程序热门讨论「用C语言编写一个简单的图书管理小程序#」最新回复-includestdio.h#includestring.h#includeconio.h#includestdlib.h#includectype.h#defineSTACK_INIT_SIZE10#defineOK1#defineTRUE1#defineFALSE0#defineERROR0structstudent/*定义学生类型,用于存放借出的书籍*/{intcarnum;charlendbook[10];}student[1000];structemploy/*定义职工类型*/{intemploynum;charemployname[15];intemployage;charemploysex[2];charemployleve[10];longintemploytage;}employ[50];structbook/*定义书的类型*/{intbooknum;charbookname[10];charbookcreat[10];intturefalse;/*用于借书和还书模块判断一本书是否借出的条件*/}book[1000];structcar/*借书卡的数据类型*/{intcarnum;charstudentname[10];intstudentclass;}car[100];huanbook()/*还书函数*/{FILE*fp,*fp2;/*定义两个文件指针,fp2用于修改数据时设立临时文件用,防止数据遭破坏*/inti,n;intcarnum;charlendbook[10];printf(请你输入你的卡号\n);scanf(%d,&carnum);fp=fopen(car.txt,r);/*读取卡号记录*/for(i=0;fread(&car[i],sizeof(structcar),1,fp)!=0;i++)/*for循环判断卡号是否存在*/{if(car[i].carnum==carnum)/*卡号存在,进入下一循环*/{n=i;fclose(fp);printf(请输入你要还的书的名字\n);scanf(%s,lendbook);fp=fopen(record.txt,r);for(i=0;fread(&student[i],sizeof(structstudent),1,fp)!=0;i++)/*判断是否借阅了输入的书*/{if(strcmp(student[i].lendbook,lendbook)==0)/*借阅了该书,进入下一循环,否则出错显示*/{fclose(fp);fp=fopen(record.txt,r);fp2=fopen(bookl.txt,w);for(i=0;fread(&student[i],sizeof(structstudent),1,fp)!=0;i++){if(strcmp(student[i].lendbook,lendbook)==0){continue;/*删除还掉的书的借书记录*/}fwrite(&student[i],sizeof(structstudent),1,fp2);/*写入原来没还的书的记录*/}fclose(fp);fclose(fp2);fp=fopen(record.txt,w);fp2=fopen(bookl.txt,r);for(i=0;fread(&student[i],sizeof(structstudent),1,fp2)!=0;i++){fwrite(&student[i],sizeof(structstudent),1,fp);/*将借书记录信息写回*/}fclose(fp);fclose(fp2);fopen(bookl.txt,w);/*清临时文件的记录*/fclose(fp2);fp=fopen(book.txt,r);fp2=fopen(bookl.txt,w);for(i=0;fread(&book[i],sizeof(structbook),1,fp)!=0;i++)/*将书的记录写入临时文件,防止因为修改信息破坏以前的记录*/{if(i==n){book[i].turefalse=1;fwrite(&book[i],sizeof(structbook),1,fp2);/*将还的书的原来状态设为无人借阅的*/continue;}fwrite(&book[i],sizeof(structbook),1,fp2);}fclose(fp);fclose(fp2);fp=fopen(book.txt,w);fp2=fopen(bookl.txt,r);for(i=0;fread(&book[i],sizeof(structbook),1,fp2)!=0;i++){fwrite(&book[i],sizeof(structbook),1,fp);/*将临时文件写回*/}fclose(fp);fclose(fp2);fopen(bookl.txt,w);/*清临时文件*/fclose(fp2);printf(还书完毕,按任意键返回\n);getch();return1;}}printf(你没有借这样的书,任意键返回\n);/*出错提示*/fclose(fp);getch();return0;}}printf(系统没这样的卡,和管理员联系,按任意键返回\n);/*出错提示*/fclose(fp);getch();}findbook(){FILE*fp;charbookname[10];intture,i;fp=fopen(book.txt,r);printf(请输入你要查找的书名\n);scanf(%s,bookname);for(i=0;fread(&book[i],sizeof(structbook),1,fp)!=0;i++){if(strcmp(bookname,book[i].bookname)==0){if(book[i].turefalse==1){printf(这本书的详细资料是:%d%s%s此书现在无人借阅\n按任意键返回\n,book[i].booknum,book[i].bookname,book[i].bookcreat);}else{printf(这本书已经有人借出\n);fclose(fp);return0;}fclose(fp);returnFALSE;}}printf(没有你要查询的书籍\n);fclose(fp);returnFALSE;}findbook1(){FILE*fp;charbookcreat[10];intture,i;fp=fopen(book.txt,r);printf(请输入你要查找的作者名\n);scanf(%s,bookcreat);for(i=0;fread(&book[i],sizeof(structbook),1,fp)!=0;i++){if(strcmp(bookcreat,book[i].bookcreat)==0){if(book[i].turefalse==1){printf(这本书的详细资料是:%d%s%s此书现在无人借阅\n按任意键返回\n,book[i].booknum,book[i].bookname,book[i].bookcreat);}else{printf(这本书已经有人借出\n);fclose(fp);return0;}fclose(fp);returnFALSE;}}printf(没有你要查询的书籍\n);fclose(fp);returnFALSE;}lendcount(){FILE*fp;inti,n=0;fp=fopen(record.txt,r);for(i=0;fread(&student[i],sizeof(structstudent),1,fp)!=0;i++){printf(卡号:%d借出的书籍:%s\n,student[i].carnum,student[i].lendbook);n=n+1;}fclose(fp);printf(目前共有%d本书借出\n,n);printf(按任意键\n);getch();returnn;}chabook(){charch5;do{printf(欢迎进入图书查询系统!\n);printf(1:按书名查找\n);printf(2:按作者查找\n);printf(0:返回\n);printf(请输入02,其他输入非法!\n);scanf(%s,&ch5);switch(ch5){case1:findbook();getch();break;case2:findbook1();getch();break;case0:break;default:printf(无此操作\n);getch();break;}}while(ch5!=0);returnFALSE;}lendbook(){FILE*fp,*fp2;inti,n;intcarnum;printf(请你输入你的卡号\n);scanf(%d,&carnum);fp=fopen(car.txt,r);for(i=0;fread(&car[i],sizeof(structcar),1,fp)!=0;i++){if(car[i].carnum==carnum){n=i;fclose(fp);printf(请输入你要借阅的书的名字\n);scanf(%s,student[n].lendbook);fp=fopen(book.txt,r);for(i=0;fread(&book[i],sizeof(structbook),1,fp)!=0;i++){if(strcmp(book[i].bookname,student[n].lendbook)==0){if(book[i].turefalse==0){printf(对不起,此书有人借出,请借其他书\n);fclose(fp);getch();return;}elsefclose(fp);fp=fopen(record.txt,a+);student[n].carnum=carnum;fwrite(&student[n],sizeof(structstudent),1,fp);fclose(fp);fp=fopen(book.txt,r);fp2=fopen(bookl.txt,w);for(i=0;fread(&book[i],sizeof(structbook),1,fp)!=0;i++){if(strcmp(book[i].bookname,student[n].lendbook)==0){book[i].turefalse=0;fwrite(&book[i],sizeof(structbook),1,fp2);continue;}fwrite(&book[i],sizeof(structbook),1,fp2);}fclose(fp);fclose(fp2);fp=fopen(book.txt,w);fp2=fopen(bookl.txt,r);for(i=0;fread(&book[i],sizeof(structbook),1,fp2)!=0;i++){fwrite(&book[i],sizeof(structbook),1,fp);}fclose(fp);fclose(fp2);fopen(bookl.txt,w);fclose(fp2);printf(借书完毕,按任意键返回\n);getch();return;}}printf(不存在这样的书,任意键返回\n);fclose(fp);getch();return;}}printf(你的卡号不存在,请申请新卡,按任意键返回\n);fclose(fp);getch();}carcount(){FILE*fp;inti,n=0;fp=fopen(car.txt,r);for(i=0;fread(&car[i],sizeof(structcar),1,fp)!=0;i++){printf(第%d张卡卡号:%d姓名:%s班级:%d\n,i+1,car[i].carnum,car[i].studentname,car[i].studentclass);n=n+1;}fclose(fp);printf(目前共有%d本书\n,n);printf(按任意键\n);getch();}delcar(){FILE*fp,*fp2;inti;intcarnum;charchoice;fp=fopen(car.txt,r);fp2=fopen(bookl.txt,w);printf(请输入你要删除的卡号\n);printf(如果你输入的卡号存在,系统自动删除该信息!如果不存在,系统不做任何改动\n);scanf(%d,&carnum);for(i=0;fread(&car[i],sizeof(structcar),1,fp)!=0;i++){if(car[i].carnum!=carnum){fwrite(&car[i],sizeof(structcar),1,fp2);}}fclose(fp);fclose(fp2);printf(是否真的要删除该卡?删除后该书籍的所有信息将无法恢复《Y/N》\n);scanf(%s,&choice);if(choice==y||choice==Y){fp=fopen(car.txt,w);fp2=fopen(bookl.txt,r);for(i=0;fread(&car[i],sizeof(structcar),1,fp2)!=0;i++){fwrite(&car[i],sizeof(structcar),1,fp);}fclose(fp);fclose(fp2);fp2=fopen(bookl.txt,w);fclose(fp2);printf(按任意键返回\n);getch();return;}else{printf(按任意键返回\n);getch();return;}}addcar(){FILE*fp;inti=0;fp=fopen(car.txt,a+);printf(请你输入卡号\n);scanf(%d,&car[i].carnum);printf(请你输入学生姓名\n);scanf(%s,car[i].studentname);printf(请你输入班级\n);scanf(%d,&car[i].studentclass);fwrite(&car[i],sizeof(structcar),1,fp);fclose(fp);printf(输入完毕,任意键返回\n);getch();}
绝对正品的程序 我当时C语言自己做的课程设计!!!#includestdio.h/*标准输入输出函数库*/#includestdlib.h /*标准函数库*/#includestring.h /*字符串函数库*/#includeconio.h/*屏幕操作函数库*/#defineHEADER1 ----------------------------LIBRARY------------------------------n#defineHEADER2 |number | name | jiage | fenlei|n#defineHEADER3 |---------------|---------------|---------------|---------------|n#defineFORMAT | %-10s |%-15s| d 元|%-13s类|n#defineDATA p-data.num,p-data.name,p-data.jiage,p-data.fenlei#defineEND ---------------------------------------------------------------nintsaveflag=0;structbook /*标记为student*/{charnum[10]; /*编号*/charname[15]; /*书名*/intjiage; /*价格*/charfenlei[15];};typedefstructnode{structbookdata;structnode*next;}Node,*Link;voidmenu() /*主菜单*/{system(cls); cprintf( 图书管理系统 n);cprintf( ********************怀化学院图书馆欢迎你*********************n);cprintf( * 1输入记录 2删除记录*n);cprintf( * 3查询记录 4修改记录*n);cprintf( * 5插入记录 6统计记录*n);cprintf( * 7排序记录 8保存记录*n);cprintf( * 9显示记录 0退出记录*n);cprintf( *************************************************************n);}voidprintheader()/*格式化输出表头*/{ printf(HEADER1); printf(HEADER2); printf(HEADER3);}voidprintdata(Node*pp)/*格式化输出表中数据*/{Node*p;p=pp;printf(FORMAT,DATA);}voidWrong() /*输出按键错误信息*/{printf(nnnnn***********输入错误,请重新再输**********n);getchar();}voidNofind() /*输出未查找此书的信息*/{printf(n对不起,没有找到你要的书本信息n);}voidDisp(Linkl) /*显示单链表l中存储的书记录,内容为student结构中定义的内容*/{Node*p;p=l-next;/*l存储的是单链表中头结点的指针,该头结点没有存储书信息,指针域指向的后继结点才有书信息*/if(!p) /*p==NULL,NUll在stdlib中定义为0*/{ printf(n没有书本的记录n); getchar(); return;}printf(nn);printheader();/*输出表格头部*/while(p)/*逐条输出链表中存储的书信息*/{ printdata(p); p=p-next; /*移动直下一个结点*/ printf(HEADER3);}getch();}voidstringinput(char*t,intlens,char*notice){ charn[255]; printf(notice); /*显示提示信息*/ scanf(%s,n); /*输入字符串*/ strcpy(t,n);/*将输入的字符串拷贝到字符串t中*/}/*************************************************************作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数:findmess[]保存要查找的具体内容;nameornum[]保存按什么查找; 在单链表l中查找;**************************************************************/Node*Locate(Linkl,charfindmess[],charnameornum[]){Node*r;if(strcmp(nameornum,num)==0)/*按编号查询*/{ r=l-next; while(r) { if(strcmp(r-data.num,findmess)==0)/*若找到findmess值的编号*/returnr; r=r-next; }}elseif(strcmp(nameornum,name)==0) /*按书名查询*/{ r=l-next; while(r) { if(strcmp(r-data.name,findmess)==0)/*若找到findmess值的书名*/returnr; r=r-next; }}return0;/*若未找到,返回一个空指针*/}/*输入价格*/intjiageinput(char*notice){ intt; printf(notice); /*显示提示信息*/ scanf(%d,&t); /*输入价格*/returnt;}/*增加书记录*/voidAdd(Linkl){Node*p,*r,*s; /*实现添加操作的临时的结构体指针变量*/charch,flag=0,num[10];r=l;s=l-next;system(cls);Disp(l);/*先打印出已有的书信息*/while(r-next!=NULL) r=r-next;/*将指针移至于链表最末尾,准备添加记录*/while(1)/*一次可输入多条记录,直至输入编号为0的记录结点添加操作*/{while(1)/*输入编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/{ stringinput(num,10,inputnumber(按“0”返回到主菜单):);/*格式化输入编号并检验*/ flag=0; if(strcmp(num,0)==0)/*输入为0,则退出添加操作,返回主界面*/ {return;} s=l-next;while(s)/*查询该编号是否已经存在,若存在则要求重新输入一个未被占用的编号*/{ if(strcmp(s-data.num,num)==0) {flag=1;break;} s=s-next;} if(flag==1)/*提示用户是否重新输入*/ { getchar();printf(=====Thenumber%sisnotexisting,tryagain?(y/n):,num);scanf(%c,&ch);if(ch==y||ch==Y) continue;else return; } else {break;} }p=(Node*)malloc(sizeof(Node));/*申请内存空间*/ if(!p) { printf(nallocatememoryfailure);/*如没有申请到,打印提示信息*/ return; /*返回主界面*/ } strcpy(p-data.num,num);/*将字符串num拷贝到p-data.num中*/ stringinput(p-data.name,15,Name:); p-data.jiage=jiageinput(jiage:);/*输入并检验价格,*/ stringinput(p-data.fenlei,15,fenlei:); /*输入并类别,*/ p-next=NULL;/*表明这是链表的尾部结点*/ r-next=p; /*将新建的结点加入链表尾部中*/ r=p;saveflag=1; } return;}voidQur(Linkl)/*按书号或书名,查询书记录*/{intselect;/*1:按书名查,其他:返回主界面(菜单)*/charsearchinput[20];/*保存用户输入的查询内容*/Node*p;if(!l-next)/*若链表为空*/{ system(cls); printf(n没有书本信息!n); getchar(); return;}system(cls);printf(n按书名查询n);printf(请你输入[1]:);scanf(%d,&select);if(select==1)/*按书名查询*/{ stringinput(searchinput,15,inputtheexistingbookname:); p=Locate(l,searchinput,name); if(p) { printheader(); printdata(p); printf(END); printf(按任意键返回); getchar(); } else Nofind(); getchar();}else Wrong(); getchar(); }/*删除书记录:先找到保存该书记录的节点,然后删除该节点*/voidDel(Linkl){intsel;Node*p,*r;charfindmess[20];if(!l-next){system(cls); printf(n没有书本的信息!n); getchar(); return;}system(cls);Disp(l);printf(n选择[1]为按编号删除 选择[2]为按书名删除n);printf(pleasechoice[1,2]:);scanf(%d,&sel);if(sel==1){ stringinput(findmess,10,请输入编号:); p=Locate(l,findmess,num); if(p) /*p!=NULL*/ { r=l; while(r-next!=p)r=r-next; r-next=p-next;/*将p所指节点从链表中去除*/ free(p);/*释放内存空间*/ printf(n删除成功!n); getchar(); saveflag=1; } else Nofind(); getchar();}elseif(sel==2)/*先按书名查询到该记录所在的节点*/{ stringinput(findmess,15,请输入书名:); p=Locate(l,findmess,name); if(p) { r=l; while(r-next!=p)r=r-next; r-next=p-next; free(p); printf(n删除成功!n); getchar(); saveflag=1; } else Nofind(); getchar();}else Wrong(); getchar();}/*修改学生记录。先按输入的编号查询到该记录,然后提示用户修改编号之外的值,编号不能修改*/voidModify(Linkl){Node*p;charfindmess[20];if(!l-next){system(cls); printf(n没有书本信息!n); getchar(); return;}system(cls);printf(修改书本记录);Disp(l);stringinput(findmess,10,请输入编号:);/*输入并检验该编号*/p=Locate(l,findmess,num);/*查询到该节点*/if(p)/*若p!=NULL,表明已经找到该节点*/{ printf(Number:%s,n,p-data.num); printf(Name:%s,,p-data.name); stringinput(p-data.name,15,inputnewname:); printf(jiage:%d,,p-data.jiage); p-data.jiage=jiageinput(jiage:); printf(fenlei:%d,,p-data.fenlei); stringinput(p-data.fenlei,15,fenlei:); printf(n修改成功!n); Disp(l); saveflag=1;}else Nofind(); getchar();}/*插入记录:按编号查询到要插入的节点的位置,然后在该编号之后插入一个新节点。*/voidInsert(Linkl){ Linkp,v,newinfo;/*p指向插入位置,newinfo指新插入记录*/ charch,num[10],s[10]; /*s[]保存插入点位置之前的编号,num[]保存输入的新记录的编号*/ intflag=0; v=l-next; system(cls); Disp(l); while(1) {stringinput(s,10,请输入要插入的位置的前个编号:); flag=0;v=l-next; while(v)/*查询该编号是否存在,flag=1表示该编号存在*/ { if(strcmp(v-data.num,s)==0) {flag=1;break;} v=v-next; } if(flag==1)break;/*若编号存在,则进行插入之前的新记录的输入操作*/ else { getchar();printf(n=====Thenumber%sisnotexisting,tryagain?(y/n):,s);scanf(%c,&ch);if(ch==y||ch==Y) {continue;}else {return;} } } /*以下新记录的输入操作与Add()相同*/ stringinput(num,10,请输入新书本的编号:); v=l-next; while(v) { if(strcmp(v-data.num,num)==0) {printf(=====Sorry,thenewnumber:%sisexisting!n,num);printheader();printdata(v);printf(n);getchar();return; } v=v-next; }newinfo=(Node*)malloc(sizeof(Node)); if(!newinfo) { printf(nallocatememoryfailure);/*如没有申请到,打印提示信息*/ return; /*返回主界面*/ } strcpy(newinfo-data.num,num); stringinput(newinfo-data.name,15,Name:); newinfo-data.jiage=jiageinput(jiage:); stringinput(newinfo-data.fenlei,15,fenlei:); newinfo-next=NULL; saveflag=1;/*在main()有对该全局变量的判断,若为1,则进行存盘操作*/ /*将指针赋值给p,因为l中的头节点的下一个节点才实际保存着书的记录*/ p=l-next; while(1) { if(strcmp(p-data.num,s)==0)/*在链表中插入一个节点*/ {newinfo-next=p-next;p-next=newinfo;break;} p=p-next;} Disp(l); printf(nn); getchar();}/*统计图书的数量和一共的价钱*/voidTongji(Linkl){//Node*pm,*pe,*pc,*pt;/*用于指向价格最高的节点*/Node*r=l-next;intc1,c2,c3,s1,s2,s3;c1=0;c2=0;c3=0;s1=0;s2=0;s3=0;if(!r){system(cls); printf(n没有书本记录!n); getchar(); return;}system(cls);Disp(l);//pm=pe=pc=pt=r;while(r){if(strcmp(r-data.fenlei,gongke)==0){ s1+=r-data.jiage; c1++; r=r-next;}elseif(strcmp(r-data.fenlei,like)==0){ s2+=r-data.jiage; c2++; r=r-next;}elseif(strcmp(r-data.fenlei,wenke)==0){ s3+=r-data.jiage; c3++; r=r-next;}}printf(n----------theTongJiresult-----------n);printf(gongke的册数:d总价格为:dn,c1,s1);printf(like 的册数:d总价格为:dn,c2,s2);printf(wenke 的册数:d总价格为:dn,c3,s3);printf(----------------------------------------n);printf(nn按任意键结束);getchar();}/*利用插入排序法实现单链表的按价格的降序排序,从高到低*/voidSort(Linkl){Linkll;Node*p,*rr,*s;inti=0;if(l-next==NULL){system(cls); printf(n没有书本记录!n); getchar(); return;}ll=(Node*)malloc(sizeof(Node));/*用于创建新的节点*/if(!ll) { printf(n没有申请到空间);/*如没有申请到,打印提示信息*/ return; /*返回主界面*/ }ll-next=NULL;system(cls);Disp(l); /*显示排序前的所有学生记录*/p=l-next;while(p)/*p!=NULL*/{ s=(Node*)malloc(sizeof(Node));/*新建节点用于保存从原链表中取出的节点信息*/ if(!s)/*s==NULL*/ { printf(n没有申请到空间);/*如没有申请到,打印提示信息*/ return; /*返回主界面*/ } s-data=p-data;/*填数据域*/ s-next=NULL;/*指针域为空*/ rr=ll; /*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/ while(rr-next!=NULL&&rr-next-data.jiage=p-data.jiage) {rr=rr-next;}/*指针移至总分比p所指的节点的总分小的节点位置*/ if(rr-next==NULL)/*若新链表ll中的所有节点的总分值都比p-data.total大时,就将p所指节点加入链表尾部*/ rr-next=s; else/*否则将该节点插入至第一个总分字段比它小的节点的前面*/ { s-next=rr-next; rr-next=s; } p=p-next;/*原链表中的指针下移一个节点*/} l-next=ll-next;/*ll中存储是的已排序的链表的头指针*/ Disp(l);saveflag=1;printf(n排序成功!n);}/*数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘*/voidSave(Linkl){FILE*fp;Node*p;intcount=0;fp=fopen(c:student,wb);/*以只写方式打开二进制文件*/if(fp==NULL)/*打开文件失败*/{ printf(n打开文件失败!n); getchar(); return;}p=l-next;while(p){ if(fwrite(p,sizeof(Node),1,fp)==1)/*每次写一条记录或一个节点信息至文件*/ {p=p-next; count++; } else { break; }}if(count0){ getchar(); printf(nnnnn=====savefilecomplete,totalsavedsrecordnumberis:%dn,count); getchar(); saveflag=0;}else{system(cls);printf(链表为空,没有记录保存!n);getchar();}fclose(fp);/*关闭此文件*/}voidmain(){ Linkl; /*定义链表*/ FILE*fp;/*文件指针*/ intselect; /*保存选择结果变量*/ charch; /*保存(y,Y,n,N)*/ intcount=0;/*保存文件中的记录条数(或结点个数)*/ Node*p,*r; /*定义记录指针变量*/l=(Node*)malloc(sizeof(Node)); if(!l) { printf(n没有申请到空间);/*如没有申请到,打印提示信息*/ return; /*返回主界面*/ } l-next=NULL; r=l; fp=fopen(C:student,ab+);/*以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*/ if(fp==NULL) {printf(n无法打开文件!n);exit(0); }while(!feof(fp)){ p=(Node*)malloc(sizeof(Node)); if(!p) { printf(没有申请到空间!n);/*没有申请成功*/ exit(0);/*退出*/ } if(fread(p,sizeof(Node),1,fp)==1)/*一次从文件中读取一条书成绩记录*/ { p-next=NULL; r-next=p; r=p;/*r指针向后移一个位置*/ count++; }}fclose(fp);/*关闭文件*/printf(n=====openfilesucess,thetotalrecordsnumberis:%d.n,count);//getchar();menu();while(1){ system(cls); menu(); p=r; printf(nPleaseEnteryourchoice(0~9):);/*显示提示信息*/ scanf(%d,&select); if(select==0) { if(saveflag==1)/*若对链表的数据有修改且未进行存盘操作,则此标志为1*/ {getchar(); printf(n=====Whethersavethemodifiedrecordtofile?(y/n):); scanf(%c,&ch); if(ch==y||ch==Y)Save(l); } printf(感谢你的使用!); getchar(); break; } switch(select) { case1:Add(l);break; /*增加书记录*/ case2:Del(l);break;/*删除书记录*/ case3:Qur(l);break;/*查询书记录*/ case4:Modify(l);break;/*修改书记录*/ case5:Insert(l);break;/*插入书记录*/ case6:Tongji(l);getchar();break;/*统计书记录*/ case7:Sort(l);break;/*排序书记录*/ case8:Save(l);break;/*保存书记录*/ case9:system(cls);Disp(l);break; /*显示书记录*/ default:Wrong();getchar();break;/*按键有误,必须为数值0-9*/ }}} 更多有关「用C语言编写一个简单的图书管理小程序#」的疑问请扫码关注微信公开课+小程序!
绝对正品的程序 我当时C语言自己做的课程设计!!!#includestdio.h/*标准输入输出函数库*/#includestdlib.h /*标准函数库*/#includestring.h /*字符串函数库*/#includeconio.h/*屏幕操作函数库*/#defineHEADER1 ----------------------------LIBRARY------------------------------n#defineHEADER2 |number | name | jiage | fenlei|n#defineHEADER3 |---------------|---------------|---------------|---------------|n#defineFORMAT | %-10s |%-15s| d 元|%-13s类|n#defineDATA p-data.num,p-data.name,p-data.jiage,p-data.fenlei#defineEND ---------------------------------------------------------------nintsaveflag=0;structbook /*标记为student*/{charnum[10]; /*编号*/charname[15]; /*书名*/intjiage; /*价格*/charfenlei[15];};typedefstructnode{structbookdata;structnode*next;}Node,*Link;voidmenu() /*主菜单*/{system(cls); cprintf( 图书管理系统 n);cprintf( ********************怀化学院图书馆欢迎你*********************n);cprintf( * 1输入记录 2删除记录*n);cprintf( * 3查询记录 4修改记录*n);cprintf( * 5插入记录 6统计记录*n);cprintf( * 7排序记录 8保存记录*n);cprintf( * 9显示记录 0退出记录*n);cprintf( *************************************************************n);}voidprintheader()/*格式化输出表头*/{ printf(HEADER1); printf(HEADER2); printf(HEADER3);}voidprintdata(Node*pp)/*格式化输出表中数据*/{Node*p;p=pp;printf(FORMAT,DATA);}voidWrong() /*输出按键错误信息*/{printf(nnnnn***********输入错误,请重新再输**********n);getchar();}voidNofind() /*输出未查找此书的信息*/{printf(n对不起,没有找到你要的书本信息n);}voidDisp(Linkl) /*显示单链表l中存储的书记录,内容为student结构中定义的内容*/{Node*p;p=l-next;/*l存储的是单链表中头结点的指针,该头结点没有存储书信息,指针域指向的后继结点才有书信息*/if(!p) /*p==NULL,NUll在stdlib中定义为0*/{ printf(n没有书本的记录n); getchar(); return;}printf(nn);printheader();/*输出表格头部*/while(p)/*逐条输出链表中存储的书信息*/{ printdata(p); p=p-next; /*移动直下一个结点*/ printf(HEADER3);}getch();}voidstringinput(char*t,intlens,char*notice){ charn[255]; printf(notice); /*显示提示信息*/ scanf(%s,n); /*输入字符串*/ strcpy(t,n);/*将输入的字符串拷贝到字符串t中*/}/*************************************************************作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数:findmess[]保存要查找的具体内容;nameornum[]保存按什么查找; 在单链表l中查找;**************************************************************/Node*Locate(Linkl,charfindmess[],charnameornum[]){Node*r;if(strcmp(nameornum,num)==0)/*按编号查询*/{ r=l-next; while(r) { if(strcmp(r-data.num,findmess)==0)/*若找到findmess值的编号*/returnr; r=r-next; }}elseif(strcmp(nameornum,name)==0) /*按书名查询*/{ r=l-next; while(r) { if(strcmp(r-data.name,findmess)==0)/*若找到findmess值的书名*/returnr; r=r-next; }}return0;/*若未找到,返回一个空指针*/}/*输入价格*/intjiageinput(char*notice){ intt; printf(notice); /*显示提示信息*/ scanf(%d,&t); /*输入价格*/returnt;}/*增加书记录*/voidAdd(Linkl){Node*p,*r,*s; /*实现添加操作的临时的结构体指针变量*/charch,flag=0,num[10];r=l;s=l-next;system(cls);Disp(l);/*先打印出已有的书信息*/while(r-next!=NULL) r=r-next;/*将指针移至于链表最末尾,准备添加记录*/while(1)/*一次可输入多条记录,直至输入编号为0的记录结点添加操作*/{while(1)/*输入编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/{ stringinput(num,10,inputnumber(按“0”返回到主菜单):);/*格式化输入编号并检验*/ flag=0; if(strcmp(num,0)==0)/*输入为0,则退出添加操作,返回主界面*/ {return;} s=l-next;while(s)/*查询该编号是否已经存在,若存在则要求重新输入一个未被占用的编号*/{ if(strcmp(s-data.num,num)==0) {flag=1;break;} s=s-next;} if(flag==1)/*提示用户是否重新输入*/ { getchar();printf(=====Thenumber%sisnotexisting,tryagain?(y/n):,num);scanf(%c,&ch);if(ch==y||ch==Y) continue;else return; } else {break;} }p=(Node*)malloc(sizeof(Node));/*申请内存空间*/ if(!p) { printf(nallocatememoryfailure);/*如没有申请到,打印提示信息*/ return; /*返回主界面*/ } strcpy(p-data.num,num);/*将字符串num拷贝到p-data.num中*/ stringinput(p-data.name,15,Name:); p-data.jiage=jiageinput(jiage:);/*输入并检验价格,*/ stringinput(p-data.fenlei,15,fenlei:); /*输入并类别,*/ p-next=NULL;/*表明这是链表的尾部结点*/ r-next=p; /*将新建的结点加入链表尾部中*/ r=p;saveflag=1; } return;}voidQur(Linkl)/*按书号或书名,查询书记录*/{intselect;/*1:按书名查,其他:返回主界面(菜单)*/charsearchinput[20];/*保存用户输入的查询内容*/Node*p;if(!l-next)/*若链表为空*/{ system(cls); printf(n没有书本信息!n); getchar(); return;}system(cls);printf(n按书名查询n);printf(请你输入[1]:);scanf(%d,&select);if(select==1)/*按书名查询*/{ stringinput(searchinput,15,inputtheexistingbookname:); p=Locate(l,searchinput,name); if(p) { printheader(); printdata(p); printf(END); printf(按任意键返回); getchar(); } else Nofind(); getchar();}else Wrong(); getchar(); }/*删除书记录:先找到保存该书记录的节点,然后删除该节点*/voidDel(Linkl){intsel;Node*p,*r;charfindmess[20];if(!l-next){system(cls); printf(n没有书本的信息!n); getchar(); return;}system(cls);Disp(l);printf(n选择[1]为按编号删除 选择[2]为按书名删除n);printf(pleasechoice[1,2]:);scanf(%d,&sel);if(sel==1){ stringinput(findmess,10,请输入编号:); p=Locate(l,findmess,num); if(p) /*p!=NULL*/ { r=l; while(r-next!=p)r=r-next; r-next=p-next;/*将p所指节点从链表中去除*/ free(p);/*释放内存空间*/ printf(n删除成功!n); getchar(); saveflag=1; } else Nofind(); getchar();}elseif(sel==2)/*先按书名查询到该记录所在的节点*/{ stringinput(findmess,15,请输入书名:); p=Locate(l,findmess,name); if(p) { r=l; while(r-next!=p)r=r-next; r-next=p-next; free(p); printf(n删除成功!n); getchar(); saveflag=1; } else Nofind(); getchar();}else Wrong(); getchar();}/*修改学生记录。先按输入的编号查询到该记录,然后提示用户修改编号之外的值,编号不能修改*/voidModify(Linkl){Node*p;charfindmess[20];if(!l-next){system(cls); printf(n没有书本信息!n); getchar(); return;}system(cls);printf(修改书本记录);Disp(l);stringinput(findmess,10,请输入编号:);/*输入并检验该编号*/p=Locate(l,findmess,num);/*查询到该节点*/if(p)/*若p!=NULL,表明已经找到该节点*/{ printf(Number:%s,n,p-data.num); printf(Name:%s,,p-data.name); stringinput(p-data.name,15,inputnewname:); printf(jiage:%d,,p-data.jiage); p-data.jiage=jiageinput(jiage:); printf(fenlei:%d,,p-data.fenlei); stringinput(p-data.fenlei,15,fenlei:); printf(n修改成功!n); Disp(l); saveflag=1;}else Nofind(); getchar();}/*插入记录:按编号查询到要插入的节点的位置,然后在该编号之后插入一个新节点。*/voidInsert(Linkl){ Linkp,v,newinfo;/*p指向插入位置,newinfo指新插入记录*/ charch,num[10],s[10]; /*s[]保存插入点位置之前的编号,num[]保存输入的新记录的编号*/ intflag=0; v=l-next; system(cls); Disp(l); while(1) {stringinput(s,10,请输入要插入的位置的前个编号:); flag=0;v=l-next; while(v)/*查询该编号是否存在,flag=1表示该编号存在*/ { if(strcmp(v-data.num,s)==0) {flag=1;break;} v=v-next; } if(flag==1)break;/*若编号存在,则进行插入之前的新记录的输入操作*/ else { getchar();printf(n=====Thenumber%sisnotexisting,tryagain?(y/n):,s);scanf(%c,&ch);if(ch==y||ch==Y) {continue;}else {return;} } } /*以下新记录的输入操作与Add()相同*/ stringinput(num,10,请输入新书本的编号:); v=l-next; while(v) { if(strcmp(v-data.num,num)==0) {printf(=====Sorry,thenewnumber:%sisexisting!n,num);printheader();printdata(v);printf(n);getchar();return; } v=v-next; }newinfo=(Node*)malloc(sizeof(Node)); if(!newinfo) { printf(nallocatememoryfailure);/*如没有申请到,打印提示信息*/ return; /*返回主界面*/ } strcpy(newinfo-data.num,num); stringinput(newinfo-data.name,15,Name:); newinfo-data.jiage=jiageinput(jiage:); stringinput(newinfo-data.fenlei,15,fenlei:); newinfo-next=NULL; saveflag=1;/*在main()有对该全局变量的判断,若为1,则进行存盘操作*/ /*将指针赋值给p,因为l中的头节点的下一个节点才实际保存着书的记录*/ p=l-next; while(1) { if(strcmp(p-data.num,s)==0)/*在链表中插入一个节点*/ {newinfo-next=p-next;p-next=newinfo;break;} p=p-next;} Disp(l); printf(nn); getchar();}/*统计图书的数量和一共的价钱*/voidTongji(Linkl){//Node*pm,*pe,*pc,*pt;/*用于指向价格最高的节点*/Node*r=l-next;intc1,c2,c3,s1,s2,s3;c1=0;c2=0;c3=0;s1=0;s2=0;s3=0;if(!r){system(cls); printf(n没有书本记录!n); getchar(); return;}system(cls);Disp(l);//pm=pe=pc=pt=r;while(r){if(strcmp(r-data.fenlei,gongke)==0){ s1+=r-data.jiage; c1++; r=r-next;}elseif(strcmp(r-data.fenlei,like)==0){ s2+=r-data.jiage; c2++; r=r-next;}elseif(strcmp(r-data.fenlei,wenke)==0){ s3+=r-data.jiage; c3++; r=r-next;}}printf(n----------theTongJiresult-----------n);printf(gongke的册数:d总价格为:dn,c1,s1);printf(like 的册数:d总价格为:dn,c2,s2);printf(wenke 的册数:d总价格为:dn,c3,s3);printf(----------------------------------------n);printf(nn按任意键结束);getchar();}/*利用插入排序法实现单链表的按价格的降序排序,从高到低*/voidSort(Linkl){Linkll;Node*p,*rr,*s;inti=0;if(l-next==NULL){system(cls); printf(n没有书本记录!n); getchar(); return;}ll=(Node*)malloc(sizeof(Node));/*用于创建新的节点*/if(!ll) { printf(n没有申请到空间);/*如没有申请到,打印提示信息*/ return; /*返回主界面*/ }ll-next=NULL;system(cls);Disp(l); /*显示排序前的所有学生记录*/p=l-next;while(p)/*p!=NULL*/{ s=(Node*)malloc(sizeof(Node));/*新建节点用于保存从原链表中取出的节点信息*/ if(!s)/*s==NULL*/ { printf(n没有申请到空间);/*如没有申请到,打印提示信息*/ return; /*返回主界面*/ } s-data=p-data;/*填数据域*/ s-next=NULL;/*指针域为空*/ rr=ll; /*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/ while(rr-next!=NULL&&rr-next-data.jiage=p-data.jiage) {rr=rr-next;}/*指针移至总分比p所指的节点的总分小的节点位置*/ if(rr-next==NULL)/*若新链表ll中的所有节点的总分值都比p-data.total大时,就将p所指节点加入链表尾部*/ rr-next=s; else/*否则将该节点插入至第一个总分字段比它小的节点的前面*/ { s-next=rr-next; rr-next=s; } p=p-next;/*原链表中的指针下移一个节点*/} l-next=ll-next;/*ll中存储是的已排序的链表的头指针*/ Disp(l);saveflag=1;printf(n排序成功!n);}/*数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘*/voidSave(Linkl){FILE*fp;Node*p;intcount=0;fp=fopen(c:student,wb);/*以只写方式打开二进制文件*/if(fp==NULL)/*打开文件失败*/{ printf(n打开文件失败!n); getchar(); return;}p=l-next;while(p){ if(fwrite(p,sizeof(Node),1,fp)==1)/*每次写一条记录或一个节点信息至文件*/ {p=p-next; count++; } else { break; }}if(count0){ getchar(); printf(nnnnn=====savefilecomplete,totalsavedsrecordnumberis:%dn,count); getchar(); saveflag=0;}else{system(cls);printf(链表为空,没有记录保存!n);getchar();}fclose(fp);/*关闭此文件*/}voidmain(){ Linkl; /*定义链表*/ FILE*fp;/*文件指针*/ intselect; /*保存选择结果变量*/ charch; /*保存(y,Y,n,N)*/ intcount=0;/*保存文件中的记录条数(或结点个数)*/ Node*p,*r; /*定义记录指针变量*/l=(Node*)malloc(sizeof(Node)); if(!l) { printf(n没有申请到空间);/*如没有申请到,打印提示信息*/ return; /*返回主界面*/ } l-next=NULL; r=l; fp=fopen(C:student,ab+);/*以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*/ if(fp==NULL) {printf(n无法打开文件!n);exit(0); }while(!feof(fp)){ p=(Node*)malloc(sizeof(Node)); if(!p) { printf(没有申请到空间!n);/*没有申请成功*/ exit(0);/*退出*/ } if(fread(p,sizeof(Node),1,fp)==1)/*一次从文件中读取一条书成绩记录*/ { p-next=NULL; r-next=p; r=p;/*r指针向后移一个位置*/ count++; }}fclose(fp);/*关闭文件*/printf(n=====openfilesucess,thetotalrecordsnumberis:%d.n,count);//getchar();menu();while(1){ system(cls); menu(); p=r; printf(nPleaseEnteryourchoice(0~9):);/*显示提示信息*/ scanf(%d,&select); if(select==0) { if(saveflag==1)/*若对链表的数据有修改且未进行存盘操作,则此标志为1*/ {getchar(); printf(n=====Whethersavethemodifiedrecordtofile?(y/n):); scanf(%c,&ch); if(ch==y||ch==Y)Save(l); } printf(感谢你的使用!); getchar(); break; } switch(select) { case1:Add(l);break; /*增加书记录*/ case2:Del(l);break;/*删除书记录*/ case3:Qur(l);break;/*查询书记录*/ case4:Modify(l);break;/*修改书记录*/ case5:Insert(l);break;/*插入书记录*/ case6:Tongji(l);getchar();break;/*统计书记录*/ case7:Sort(l);break;/*排序书记录*/ case8:Save(l);break;/*保存书记录*/ case9:system(cls);Disp(l);break; /*显示书记录*/ default:Wrong();getchar();break;/*按键有误,必须为数值0-9*/ }}} 更多有关「用C语言编写一个简单的图书管理小程序#」的疑问请扫码关注微信公开课+小程序!
标签:微信公开课,小程序

「用C语言编写一个简单的图书管理小程序」热议话题订阅
方法1:微信扫描微信公开课小程序码即可订阅热议话题「用C语言编写一个简单的图书管理小程序」
方法2:微信搜索微信公开课小程序名称进入,即可订阅热议话题「用C语言编写一个简单的图书管理小程序」
方法3:微信网页访问即速商店,长按识别微信公开课小程序码即可订阅热议话题「用C语言编写一个简单的图书管理小程序」
微信公开课小程序热议话题「用C语言编写一个简单的图书管理小程序」由微信公开课原创摘录于微信小程序商店shop.jisuapp.cn,转载请注明出处。
微信公开课热议话题「用C语言编写一个简单的图书管理小程序」由微信公开课开发者向微信用户提供,并对本服务内容、数据资料及其运营行为等真实性、合法性及有效性承担全部责任。
微信公开课小程序
更新时间:2019-03-12 17:01:43
>
__methodCallerx27;ofundefined
>-404011cloudfunctionexecutionerror
>,请补充选择商家自营-预付卡销售-发行方类目,并在基础信息处申请该类目,通过
>:host在模拟器中显示无效
>:请在小程序服务页面上架正式(非测试)内容或商品后重新提交审核
>.net 微信小程序 上传图片
>'setTimeout'的问题
>‘三朵里熙SPA主题减压空间’为什么搜索关键词‘三朵里‘搜不到
>‘扫普通链接二维码打开小程序‘中设置为体验版,扫码打开是线上版本
>“cloudfunctions**indexjs”gitignore
>“NO ULINK DEVICE FOUND”是怎么回事
>“万马掌上校园”的类目审核
>“上线了”公司开发的微信小程序怎么样?
>“产品是否一定需要条形码”
>