图书管理系统 Prepared on 22 November 2020C语言程序设计图书管理系统学生:专业:电子信息科学与技术学号:指导老师:设计要求课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的、必不可少的一个教学环节。
通常,课程设计中的问题比平时的习题复杂得多,也更接近实际。
课程设计着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变“活”,起到深化理解和灵活掌握教学内容的目的。
题目:图书销售管理系统设计图书信息包括:序号、书名、作者、出版单位、价格。
试设计一图书销售管理系统,使之能提供以下功能:1、系统以菜单方式工作2、图书信息录入功能(图书信息用文件保存)--输入3、图书信息的删除与修改功能4、图书信息浏览功能--输出5、查询功能--算法:按书名/作者查询6、排序功能--算法按书名排序按价格排序1、独立完成2、需随程序设计与实现完成一份描述该过程的报告,供考核时参考。
考核方式:上机面试。
在完成程序和文档后,根据题目要求和同学自行完成的文档,可能考核设计思路、代码分析、修改代码、增加功能、跟踪调试等各方面。
设计思路1.主目录2.录入3.图书查询目录4.排序查询序号排序查询:价格排序查询:5.自定义查询6.全部查询7.修改8.删除9.替换9.购买设计思路1.录入:INSERT()函数,因为录入的数据最后要保存进文件中,以供查询、购买等功能的使用,所以在文件已开始if判断语句打开文件a,打开文件也就定义了指针的位置。
其次输入信息,写代码时我发现,如果使用scanf()函数,每次在输入一个整形或字符时,总会因为敲了一个回车而提前进入下一行代码,影响正常输入。
于是,我在前面加了一个ch=getchar();以接收回车符。
当输入完信息后,使用fwrite();函数将之前已经赋值的结构体变量存入a文件,并用fclose ();关闭文件,防止文件内容被篡改。
在最后加一个switch分支语句以判断是否循环退出,当输入字符‘y’后,自动重复调用INSERT();,否则调用MAINMENU()退到主目录。
2.按功能查询:在按序号(价格)查询时,首先依然是打开之前已经写入要查询内容的文件,然后通过输入要查询的字符串或整形变量与文件内容比较,如果一致则打印输出此数组的其他结构体成员。
具体的比较我使用的是字符串比较函数strcmp(char a[20],char b[20]);或利用if(“int a==int b”)判断整形变量的相等。
如果相等则输出结构体变量的其他成员,否则进入下一循环。
这里的循环用for()实现,有几个变量就比较几次(包括和自己比较)。
3.排序:对于排序,有很多种方法,这里我用的是比较简单的冒泡法。
冒泡法的原理:首先做一个内循环,将数组的第一个值与后面的值分别比较,如果前者小于后者(降序)则交换两值的位置。
然后是外循环,由for实现第二、第三个值分别与其后面的值比较。
最后循环结束后得到交换赋值后的结构体变量,并打印输出。
一般的,外层循环的次数是字符数的n-1次,内循环每次循环是起始比较值后面剩下的字符数。
同样的,字符串我用strcmp(char a[20],char b[20]),整型变量用‘==’。
4.修改:修改功能其实是查询函数SEARCH();和录入函数INSERT();的使用。
首先还是打开文件,然后,利用scanf();接收要修改的数组的任意一个变量,用strcmp();和‘==’比较是否相符,同样这里要使用for()让输入的变量于每一个数组的相同的类型变量进行比较。
若符合则开始进入录入函数给选择的结构体变量分别赋值。
5.删除:如果是全部删除,则给每一个录入的变量赋空值即可。
若是单项删除,首先查询要删除数组的其中一个结构体变量(同修改),如果符合,则赋空值即可。
我用的是复制覆盖的方法,即后从要删除的数组后一个数组开始,分别向前移动一位,这里可以用strcpy(char a[20],char b[20]);字符串复制函数,在这里b把值赋给a,但不改变b的值。
6.购买:购买功能是前面所有功能的综合。
先输入要购买的书的一个关键变量,然后与录入的图书信息比较,如果相符则打印出来。
此时也可以在定义一个结构体变量,用来存放购买图书所要使用的信息。
源代码:#include<>#include<>#include<>#include<>void MAINMENU();void INSERT();void WRITEINFILE();void READFROMFILE(); void SEARCHLIST();void SORTLIST();void LISTBYBNO();void LISTBYPRICE();void SORTBYBNO();void SORTBYNAME();void DIYSEARCH();void SCAN();void SEARCHBYBNO();void SEARCHBYNAME(); void MODIFY();void DELETELIST();void DELETEALL();void DELETEBYBNO();void ENCHANGELIST(); void ENCHANGEBYBNO(); void ENCHANGEBYNAME(); void BUYLIST();void BUY();void EXIT();#define N 1000struct BOOK{int bno;char name[20];char edition[20];char author[20];float price;int storage;}book[N];FILE *fp;char filename[20];上面是头文件~下面是主程序~#include""int i;void main(){int k=0;while(k==0){system("cls");MAINMENU();}}void MAINMENU(){char choice; /*进入系统主目录*/system("cls");printf("*****************************图书管理系统********************************\n");printf(" A.图书录入\n");printf(" B.图书查询\n");printf(" C.修改\n");printf(" D.图书购买\n");printf(" E.退出\n\n\n\n");printf(" 请选择需要的服务:");choice=getchar();switch(choice){case 'a': INSERT();break;case 'b': SEARCHLIST();break;case 'c': MODIFY();break;case 'd': BUYLIST();break;case 'e': EXIT();break;}void EXIT(){char ch;printf("\n\n\t确认退出(Y/N):");ch=getchar();scanf("%c",&ch);switch(ch){case 'y':fclose(fp);exit(0);case 'n':MAINMENU();}}void SEARCHLIST(){system("cls");char choice;printf("******************图书查询********************\n");printf("******************A. 排序查询****************\n");printf("******************B. 自定义查询**************\n");printf("******************C. 查询全部****************\n");printf("******************D. 返回主菜单**************\n");printf("请输入查询的方式:");choice=getchar();scanf("%c",&choice);switch(choice){case 'a':SORTLIST();break;case 'b':DIYSEARCH();break;case 'c':SCAN();break;case 'd':MAINMENU();break;}}void SCAN(){system("cls");if((fp=fopen("a","r"))==NULL)printf("无法打开文件!\n");return;}printf("*****************************图书信息*****************************\n");for(i=0;i<3;i++){fread(&book[i],sizeof(struct BOOK),1,fp);printf("序号:%4d\n",book[i].bno);printf("书名:%4s\n",&book[i].name);printf("作者:%4s\n",&book[i].author);printf("出版社:%3s\n",&book[i].edition);printf("价格:%4f\n",book[i].price);printf("库存量:%3d\n\n",book[i].storage);}printf("按任意键返回查询主菜单!");getch();fclose(fp);}void SORTLIST(){char choice;system("cls");printf("*****************a.按序号排序*********************\n");printf("*****************B.按价格排序*********************\n");printf("*****************C.返回查询菜单*******************\n");printf("请选择查看的方式:");choice=getchar();scanf("%c",&choice);switch(choice){case 'a':SORTBYBNO();break;case 'b':SORTBYNAME();break;case 'c':SEARCHLIST();break;}}void DIYSEARCH(){system("cls");char choice;printf("******************A. 按序号查询****************\n");printf("******************B. 按书名查询****************\n");printf("******************C. 返回查询菜单**************\n");printf("请选择查询的方式:");choice=getchar();scanf("%c",&choice);switch(choice){case 'a':SEARCHBYBNO();break;case 'b':SEARCHBYNAME();break;case 'c':MAINMENU();break;}}void INSERT(){system("cls");char ch,ch1;if((fp=fopen("a","ab+"))==NULL){printf("无法打开文件!\n");return;}ch=getchar();printf("请输入要录入的序号:");scanf("%d",&book[i].bno);ch=getchar();printf("请输入要录入的书名:");scanf("%s",book[i].name);ch=getchar();printf("请输入要录入的作者:");scanf("%s",book[i].author);ch=getchar();printf("请输入要录入的出版社:");scanf("%s",book[i].edition);ch=getchar();printf("请输入要录入的价格:");scanf("%f",&book[i].price);ch=getchar();printf("请输入要录入的库存量:");scanf("%d",&book[i].storage);fwrite(&book[i],sizeof(struct BOOK),1,fp);fclose(fp);printf("\n是否继续录入信息(Y/N)");ch1=getchar();scanf("%c",&ch1);switch(ch1){case 'y':INSERT();break;case 'n':MAINMENU();break;}}void MODIFY(){char ch;system("cls");printf("**************************修改***************************\n");printf("************************A.删除*************************\n");printf("************************B.替换*************************\n");printf("************************C.返回主目录*******************\n\n\n");printf("请选择要使用的功能:");ch=getchar();scanf("%c",&ch);switch(ch){case 'a':DELETELIST();break;case 'b':ENCHANGELIST();break;case 'c':MAINMENU();break;}}void BUYLIST(){char ch;system("cls");printf("**************************商城***************************\n");printf("************************A.购买***************************\n");printf("************************B.返回主目录*********************\n\n\n");printf("请选择要使用的功能:");ch=getchar();scanf("%c",&ch);switch(ch){case 'a':BUY();break;case 'b':MAINMENU();break;}}void BUY(){float totalprice=0;int quantity=0;char ch;int bno,time;char company[20];if((fp=fopen("a","rb"))==NULL){printf("无法打开文件!\n");return;}if((fp=fopen("a","wb"))==NULL){printf("无法打开文件!\n");return;}system("cls");printf("请输入要购买的图书序号:");ch=getchar();scanf("%d",&bno);for(i=0;i<3;i++){if(bno==book[i].bno){printf("请输入要购买的图书数量:");ch=getchar();scanf("%d",&quantity);fread(&book[i],sizeof(struct BOOK),1,fp);book[i].storage=book[i].storage-quantity;totalprice=quantity*book[i].price;printf("请输入购买单位:\n");ch=getchar();scanf("%s",&company);printf("请输入购买时间:\n");ch=getchar();scanf("%d",&time);system(“cls”);printf("*************************************山东大学威海分校出版社购书清单***************************************\n");printf("\t购书单位:%1s 购书时间:%1d\n",&company,time);printf("----------------------------------------------------------------------------------------------------------\n");printf("----------------------------------------------------------------------------------------------------------\n");printf(" 序号书名作者单价购买量\n");printf("%5d%10s%10s%12f%10d\n",book[i].bno,book[i].name,book[i].author,book[i]. price,quantity);printf("----------------------------------------------------------------------------------------------------------\n");printf("\t总价:%4f 剩余库存量:%3d\n",totalprice,book[i].storage);fwrite(&book[i],sizeof(struct BOOK),1,fp);fclose(fp);getch();}}}void DELETELIST(){char ch;system("cls");printf("***************************删除***************************\n");printf("************************A.全部删除*************************\n");printf("************************B.按序号删除*************************\n");printf("************************C.返回修改目录*******************\n\n\n");printf("请选择要使用的功能:");ch=getchar();scanf("%c",&ch);switch(ch){case 'a':DELETEALL();break;case 'b':DELETEBYBNO();break;case 'c':MODIFY();break;}}void DELETEALL(){char ch;system("cls");printf("是否删除全部的图书信息(y/n)");ch=getchar();scanf("%c",&ch);if(ch='y'){if((fp=fopen("a","wb"))==NULL){printf("无法打开文件!\n");return;}for(i=0;i<3;i++){book[i].bno=NULL;memset( book[i].name, 0, sizeof(char)*20 );memset( book[i].author, 0, sizeof(char)*20 );memset( book[i].edition, 0, sizeof(char)*20 );book[i].price=NULL;book[i].storage=NULL;no,&book[i].name,&book[i].author,&book[i].edition,&book[i].price);fwrite(&book[i],sizeof(struct BOOK),1,fp);}}fclose(fp);}void DELETEBYBNO(){int bno,j;system("cls");if((fp=fopen("a","w"))==NULL){printf("无法打开文件!\n");return;}printf("请输入序号:");scanf("%d",&bno);for(i=0;i<3;i++){if(book[i].bno==bno){for(j=0;j<3;j++){book[i].bno=book[i+1].bno;strcpy(book[j].name,book[j+1].name);strcpy(book[j].author,book[j+1].author);strcpy(book[j].edition,book[j+1].edition);book[j].price=book[j+1].price;book[j].storage=book[j+1].storage;}break;}}fwrite(&book[i],sizeof(struct BOOK),1,fp);fclose(fp);printf("删除成功!按任意键返回主菜单!");getch();}void ENCHANGELIST(){char ch;system("cls");printf("**************************替换***************************\n");printf("************************A.通过序号替换*************************\n");printf("************************B.通过书名替换*************************\n");printf("************************C.返回修改菜单*******************\n\n\n");printf("请选择要使用的功能:");ch=getchar();scanf("%c",&ch);switch(ch){case 'a':ENCHANGEBYBNO();break;case 'b':ENCHANGEBYNAME();break;case 'c':MODIFY();break;}}void ENCHANGEBYBNO(){int bno;char ch;int midstorage;char midname[20];char midauthor[20];char midedition[20];float midprice;system("cls");if((fp=fopen("a","w"))==NULL){printf("无法打开文件!\n");return;}printf("请输入序号:");scanf("%d",&bno);for(i=0;i<3;i++){if(book[i].bno==bno){ch=getchar();printf("请输入要修改的书名:");scanf("%s",midname);strcpy(book[i].name,midname);ch=getchar();printf("请输入要修改的作者:");scanf("%s",midauthor);strcpy(book[i].author,midauthor);ch=getchar();printf("请输入要修改的出版社:");scanf("%s",midedition);strcpy(book[i].edition,midedition);ch=getchar();printf("请输入要修改的价格:");scanf("%f",&midprice);book[i].price=midprice;ch=getchar();printf("请输入要修改的库存量:");scanf("%d",&midstorage);book[i].storage=midstorage;}fwrite(&book[i],sizeof(struct BOOK),1,fp);}fclose(fp);printf("修改成功!按任意键返回主菜单!");getch();}void ENCHANGEBYNAME(){char name[20];char ch;int midbno;int midstorage;char midauthor[20];char midedition[20];float midprice;system("cls");if((fp=fopen("a","w"))==NULL){printf("无法打开文件!\n");return;}printf("请输入书名:");scanf("%s",name);for(i=0;i<3;i++){if(strcmp(book[i].name,name)==0){ch=getchar();printf("请输入要修改的序号:");scanf("%d",&midbno);book[i].bno=midbno;ch=getchar();printf("请输入要修改的作者:");scanf("%s",midauthor);strcpy(book[i].author,midauthor);ch=getchar();printf("请输入要修改的出版社:");scanf("%s",midedition);strcpy(book[i].edition,midedition);ch=getchar();printf("请输入要修改的价格:");scanf("%f",&midprice);book[i].price=midprice;ch=getchar();printf("请输入要修改的库存量:");scanf("%d",&midstorage);book[i].storage=midstorage;}fwrite(&book[i],sizeof(struct BOOK),1,fp);}fclose(fp);printf("修改成功!按任意键返回主菜单!");getch();}void SORTBYBNO(){if((fp=fopen("a","rb+"))==NULL){printf("无法打开文件!\n");return;}system("cls");int midstorage;int midbno;int j;int i;char midname[20];char midauthor[20];char midedition[20];float midprice;for(j=0;j<3;j++)for(i=0;i<3-j;i++)if(book[i].bno<book[i+1].bno){fread(&book[i],sizeof(struct BOOK),1,fp);midbno=book[i].bno;book[i].bno=book[i+1].bno;book[i+1].bno=midbno;strcpy(midname,book[i].name);strcpy(book[i].name,book[i+1].name);strcpy(book[i+1].name,midname);strcpy(midauthor,book[i].author);strcpy(book[i].author,book[i+1].author);strcpy(book[i+1].author,midauthor);strcpy(midedition,book[i].edition);strcpy(book[i].edition,book[i+1].edition);strcpy(book[i+1].edition,midedition);midprice=book[i].price;book[i].price=book[i+1].price;book[i+1].price=midprice;midstorage=book[i].storage;book[i].storage=book[i+1].storage;book[i+1].storage=midstorage;}for(i=0;i<3;i++){printf("序号:%4d\n",book[i].bno);printf("书名:%4s\n",&book[i].name);printf("作者:%4s\n",&book[i].author);printf("出版社:%3s\n",&book[i].edition);printf("价格:%4f\n",book[i].price);printf("库存量:%3d\n\n",book[i].storage);}printf("按任意键返回主菜单");getch();}void SORTBYNAME(){system("cls");char ch;int midstorage;int j;int i;int midbno;char midname[20];char midauthor[20];char midedition[20];float midprice;if((fp=fopen("a","r"))==NULL){printf("无法打开文件!\n");return;}for(j=0;j<3;j++)for(i=0;i<3-j;i++)if(book[i].price<book[i+1].price){fread(&book[i],sizeof(struct BOOK),1,fp);midbno=book[i].bno;book[i].bno=book[i+1].bno;book[i+1].bno=midbno;strcpy(midname,book[i].name);strcpy(book[i].name,book[i+1].name);strcpy(book[i+1].name,midname);strcpy(midauthor,book[i].author);strcpy(book[i].author,book[i+1].author);strcpy(book[i+1].author,midauthor);strcpy(midedition,book[i].edition);strcpy(book[i].edition,book[i+1].edition);strcpy(book[i+1].edition,midedition);midprice=book[i].price;book[i].price=book[i+1].price;book[i+1].price=midprice;midstorage=book[i].storage;book[i].storage=book[i+1].storage;book[i+1].storage=midstorage;}for(i=0;i<3;i++){printf("价格:%4f\n",book[i].price);printf("序号:%4d\n",book[i].bno);printf("书名:%4s\n",&book[i].name);printf("作者:%4s\n",&book[i].author);printf("出版社:%3s\n",&book[i].edition);printf("库存量:%3d\n\n",book[i].storage);}ch=getchar();printf("按任意键返回主菜单");getch();}void SEARCHBYBNO(){if((fp=fopen("a","r"))==NULL){printf("无法打开文件!\n");return;}system("cls");int bno;printf("请输入要查询的序号:");scanf("%d",&bno);for(i=0;i<3;i++){fread(&book[i],sizeof(struct BOOK),1,fp);if(book[i].bno==bno){printf("序号:%4d\n",book[i].bno);printf("书名:%4s\n",book[i].name);printf("出版社:%3s\n",book[i].edition);printf("作者:%4s\n",book[i].author);printf("单价:%4f\n",book[i].price);printf("库存量:%3d\n\n",book[i].storage);}}printf("按任意键返回!");getch();}void SEARCHBYNAME(){system("cls");if((fp=fopen("a","r"))==NULL){printf("无法打开文件!\n");return;}char name[20];int i;printf("请输入要查询的姓名:");scanf("%s",name);for(i=0;i<3;i++){fread(&book[i],sizeof(struct BOOK),1,fp);if(strcmp(book[i].name,name)==0){printf("序号:%4d\n",book[i].bno);printf("书名:%4s\n",book[i].name);printf("出版社:%3s\n",book[i].edition);printf("作者:%4s\n",book[i].author);printf("单价:%4f\n",book[i].price);printf("库存量:%3d\n\n",book[i].storage);}}printf("按任意键返回!");getch();}。