




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计说明书(图书销售管理系统)图书销售系统:程序代码#include stdio.h#include stdlib.h#includestring.hstruct bookchar ISBN50; /ISBN号char name50; /图书名称float price; /价格int store0; /最初书店中的库存int store; /当前存货量int sale; /销售量char discount; /是否促销struct book *next; /单链表中指向下一结构体首地址的指针;int n; /图书数量,需要在录入时从文件第一行读取static struct book *bklist,bk100; /图书单链表的首地址,和图书数组int judge(char a) / 要考虑到输入非数字的的影响,若输入的是正确的非负整数则返回该数,否则返回-1。在main函数中,将输入内容转化为字符串 int i,b,trns;if(a0=0&a1!=0) printf(请输入正整数或0。); return -1; /1:排出输入内容中第一个字符为0,之后还有别的内容的情况for (i=0;ai!=0;i+) b=ai; if (b57) printf(请输入正整数或0。nn); return -1; /2:若含数字外的字符,则返回-1,说明用户输入有误 trns=atoi(a); /排除了1、2的情况后,将字符串转化为整型数,将该整型数返回return trns;void show(struct book *k) /用于显示图书的相关信息 fprintf(stdout,%-25s%-10.2f%-5d%-10d%-5c%-30snn,k-ISBN,k-price,k-store,k-sale,k-discount,k-name);void ordershow(const char order) /用于提示用户当前所在的命令操作界面printf(nn-%s-nnn,order);void column(void) /用于显示图书信息表格的表头 printf( ISBN号 价格 库存 销售量 是否促销 书名n);struct book *create(FILE *p)struct book *mylist,*tempnode,*cursor;int i;mylist=(struct book *)malloc(sizeof(struct book);if (mylist=NULL)printf(error1);exit(1);mylist-next=NULL;cursor=mylist;fscanf(p,%d,&n);for(i=0;inext=NULL; fscanf(p,%s %f %d %d %c,tempnode-ISBN,&(tempnode-price),&(tempnode-store0),&(tempnode-store),&(tempnode-discount); fgets(tempnode-name,30,p); tempnode-sale=tempnode-store0-tempnode-store; strcpy(bki.ISBN,tempnode-ISBN);strcpy(,tempnode-name); bki.price=tempnode-price; bki.store0=tempnode-store0;bki.store=tempnode-store; bki.sale=tempnode-sale; bki.discount=tempnode-discount; /内容录入数组,数组是全局的,无需返回 cursor-next=tempnode; cursor=tempnode; /创建单链表,对数据进行录入,同时录入数组cursor=NULL;tempnode=NULL;return mylist; /返回单链表首地址void freellist(struct book *head) struct book *ptr; while (head!=NULL) / 遍历链表 ptr=head; head = head-next; / 指向下一节点 ptr-next=NULL; free(ptr); / 释放结构体 int search(char *l) struct book *booksearch; for(booksearch=bklist-next;booksearch!=NULL;booksearch=booksearch-next) if(strcmp(l,booksearch-ISBN)=0) column();show(booksearch);booksearch=NULL; return 0; printf(抱歉,没有找到相应的图书。nn); booksearch=NULL; return 1; /利用单链表进行ISBN查找void keyword(char a)int i,j,k;int length,lengthi,flag=0,flag1=0,temp,temp0; length=strlen(a); /关键词的长度 flag=0;flag1=0;column(); for(i=0;in;i+) lengthi=strlen();for(j=0;j+lengthlengthi;j+) for(k=0;klength;k+) temp=ak;temp0=j+k; flag+=(temp0-temp)*(temp0-temp); if(flag=0) flag1+;show(&bki);break; else flag=0; if(flag1=0)printf(抱歉,没有找到相应的图书。nn); /关键词查找:查找结果为书名中包含查找内容(作为整体)的相应书籍的全部内容void bubblesort(void) int i; struct book *a,*b,*c; ordershow(销量由高到低排序); for(i=0;inext-next!=NULL;a=a-next) b=a-next;c=b-next-next; if (b-salenext-sale) a-next=b-next; a-next-next=b; b-next=c; column();for(c=bklist-next;c!=NULL;c=c-next) show(c); c=NULL;b=NULL;a=NULL; /用单链表进行冒泡排序,打印出按照销量由高到低的排行榜void selectsort(struct book a)int i,j,min;struct book *pb50,*tempb;ordershow(价格由低到高排行);for (i=0;in;i+) pbi=&ai;for(i=0;in;i+)min=i; for(j=i;jpricepbj-price) min=j; tempb=pbi;pbi=pbmin;pbmin=tempb; column();for (i=0;in;i+) show(pbi);tempb=NULL;for(i=0;i49;i+)pbi=NULL; /对图书数组进行选择排序,打印出图书价格由低到高的排行榜void insertsort(struct book a)int i,j;struct book *tempc,*pc50;ordershow(库存由低到高排行);for (i=0;in;i+) pci=&ai;for (i=1;i=0)&(tempc-storestore);j-) pcj+1=pcj; pcj+1=tempc; column();for (i=0;in;i+) show(pci);tempc=NULL;for(i=0;i49;i+)pci=NULL; /对图书数组进行选择排序,打印出图书库存由低到高的排行榜void main()FILE *p;int i,op,operat,booknum;char ISBN0100,buy100,back100,str100; /从左到右依次为:查询图书的ISBN码,购买图书的ISBN码,退还图书的ISBN码,接受用户输入的操作命令的字符数组。void (*oper2)(struct book a); /指向函数的指针,用于控制选择排序和插入排序函数struct book *bookp; /用于单链表操作的指针 if(p=fopen(图书.txt,r)=NULL) /打开文件,为了防止中途关闭程序导致文件截为0的情况,首先以可读方式打开 printf(文件打开失败!n);return; /判断文件是否打开成功 bklist=create(p); /创建了一个单链表,对磁盘文件进行存储 rewind(p); /文件指针返回到文件开头,便于之后的操作/初始选择模式/while(1) printf(n你好,欢迎使用图书销售管理系统,请选择您想要进行的操作nn图书查询请按1;图书排行请按2;图书购买请按3;退货请按4;nn退出程序请按0或者直接按回车键。nn输入数字后以回车键结束n); fflush(stdin);gets(str); op=judge(str); if(op=-1) continue; /如果有非数字字符,继续循环,重新输入 if(op=0) /输入0或者直接按回车时,op=0,结束程序 printf(nn感谢您的使用!nnn);break; /程序出口 if(op!=1)&(op!=2)&(op!=3)&(op!=4)&(op!=0) /输入整数要为0,1,2,3,4中的一个 printf(输入操作有误,请输入0-4的某一个数字,以回车键结束nn); continue; /用于处理用户输入中可能出现的错误,这一部分可以实现的是:当用户只有输入0,1,2,3,4中的一个数字再回车或者直接回车时,才可以跳出循环/图书查询/ while(op=1) ordershow(图书查询); printf(请输入图书的ISBN号(若查询所有图书信息请按0,若使用关键词查找请按1)n输入完成后以回车键结束。n); fflush(stdin);gets(ISBN0); /进行图书查询的操作 if(strcmp(ISBN0,0)=0) ordershow(所有图书信息);column();for(i=0;in;i+) show(&bki); /输出全部图书信息 else if(strcmp(ISBN0,1)=0) ordershow(关键词查询); printf(请输入关键词:(直接按回车键可查询所有图书)n); fflush(stdin);gets(str); keyword(str); /进行关键词查询 /输入0或1时,程序认为是进行全部图书查询或关键词查询 else ordershow(ISBN查找);search(ISBN0); /ISBN查询 while(1) printf(继续查询请按1;结束查询请按0或者直接按回车键。输入数字后以回车键结束。n); fflush(stdin);gets(str); operat=judge(str); if(operat-1)=0)|(operat=0)break; printf(输入内容有误nn); /判断输入是否正确,正确输入后才可以跳出循环。 if(operat=1) operat=0;continue; /继续查询 if(operat=0)break; /退出查询 /排行查询/ while(op=2) ordershow(排行查询); printf(按销量由高到低排序请按1;按价格由低到高排序请按2;按库存量由低到高排序请按3;nn结束排行查询请按0或者直接按回车键;输入数字后以回车键结束。nn); fflush(stdin);gets(str); operat=judge(str); if(operat=-1)continue; if(operat!=1)&(operat!=2)&(operat!=3)&(operat!=0) printf(输入操作有误,请输入0-3的某一个整数,输入数字后以回车键结束。nn); continue; /输入错误提醒 if(operat=0)break; if(operat=1) bubblesort(); /冒泡排序 else oper0=selectsort; oper1=insertsort; /利用指向函数的指针控制 operoperat-2(bk); while(1) printf(继续排行查询请按1;结束排行查询请按0或者直接按回车键。输入数字后以回车键结束n);fflush(stdin);gets(str);operat=judge(str);if(operat=-1)continue; if(operat-1)=0)|(operat=0)break; printf(输入内容有误,请输入0-1的某一个整数,输入数字后以回车键结束。nn); /判断输入是否正确,正确输入后才可以跳出此循环。 if(operat=1)continue; /继续查询排行榜 if(operat=0)break; /结束查询排行榜 /购买图书/ while (op=3) ordershow(购买图书); printf(请输入您需要购买图书的ISBN号,以回车键结束;结束购买请输入0,以回车结束。n); fflush(stdin);gets(buy); if(strcmp(buy,0)=0)break; for(i=0;in;i+) if (strcmp(bki.ISBN,buy)=0)break; /判断判断存书的ISBN码中是否与有输入的ISBN码相同的 if(i=n) printf(您所查找的图书不存在,请重新输入nn);continue; /没有则i=n,重新输入 if(in) column(); show(&bki); /有该图书则将该图书的信息打印在屏幕上 while(1) printf(继续购买请输入1,返回上一界面请输入0或者直接按回车键,以回车键结束n); fflush(stdin);gets(str); operat=judge(str); if(operat=-1)continue; if(operat!=1&operat!=0) printf(请输入0-1的数字,以回车键结束nn); continue; /输入错误内容的提示 else break; if(operat=0)continue; /返回购买图书的ISBN输入界面 while(1) if(bki.store=0) printf(图书已售空,请购买其他排行靠前的图书nn);break; /图书售空提示 if(bki.store4) /图书余量较少的提示 printf(此图书库存不超过3本,请尽快购买nn);printf(请输入您需要购买的数量(请输入正整数,若不购买输入0或者直接按回车键)n); fflush(stdin); gets(str); booknum=judge(str);if(booknum=-1)continue; /防止输入了字母或其他符号被强制转化为整型数而引发的错误 if(bki.storenext;bookp!=NULL;bookp=bookp-next) if(strcmp(buy,bookp-ISBN)=0) bookp-sale+=booknum; bookp-store-=booknum; /对单链表中图书数据的更改 printf(已完成操作!nn);break; /退还图书/ while (op=4) ordershow(退还图书); printf(请输入您需要退还图书的ISBN号,以回车键结束;结束退还请输入0,以回车结束。n); fflush(stdin);gets(back); if(strcmp(back,0)=0)break; for(i=0;in;i+) if (strcmp(bki.ISBN,back)=0)break; if(i=n) printf(您所退还的图书不存在,请重新输入nn);continue; if(in) show(&bki); while(1) printf(是否需要重新查询?继续退还请输入1,返回上一界面请输入0或者直接按回车键,以回车键结束n); fflush(stdin);gets(str); operat=judge(str); if(operat=-1)continue; if(operat!=1&operat!=0) printf(请输入0-1中的某一整数,以回车键结束nn); continue; else break; if(operat=0)continue; while(1) printf(请输入您需要退还的数量(请输入正整数,若不退还输入0或者直接按回车键,以回车键结束)n); fflush(stdin); gets(str); booknum=judge(str); if(booknum=-1)continue; /退还图书的以上程序与购买图书的对应程序相似,故不详述 if(bki.sale-booknumnext;bookp!=NULL;bookp=bookp-next) if(strcmp(back,bookp-ISBN)=0) bookp-sale-=booknum; bookp-store+=booknum; /更改数组和单链表中的相应数据 printf(已完成操作!nn);break; /从这里跳出循环,开始保存数据fclose(p);p=NULL; /关闭文件。由于最初文件是以可读方式打开的,不能更改内容if(p=fopen(图书.txt,w)=NULL) printf(文件打开失败!n);return; /以可写的方式打开文件fprintf(p,%dn,n); /首先在第一行录入图书数量for(i=0;in;i+)fprintf(p,%s %.2f %d %d %c%s,bki.ISBN,bki.price,bki.store0,bki.store,bki.discount,);rewind(p); /录入每一本图书的相关信息,将指针指向文件开头fclose(p);p=NULL; /关闭文件,文件指针指空 freellist(bklist); /将单链表的指针赋空并释放单链表中的内存oper0=NULL;oper1=NULL; /将指向函数的指针赋空一、概述本程序为图书销售管理系统,实现图书的查找、排序、购买、退货等功能,并将数据存入磁盘文件中保存。本程序为Win32 开发的控制台应用程序,在Visual Stdio 2012下完成。本程序的特点是功能完整、界面友好(请在运行程序时将窗口宽度调节到至少160)、防错误功能较完善。二、程序设计思路本图书销售管理系统主要完成的功能有:1、图书查询1.1 ISBN查询 1.2 关键词查询 1.3 所有图书信息查询2、排行查询2.1 销量排行 2.2 库存排行 2.3 价格排行3、图书购买3.1 ISBN检索图书 3.2 购买图书的信息显示和购买确认 3.3 购买数据存入4、图书退还4.1 购买图书的信息显示和购买确认 4.2 购买数据存入为实现这些功能,本程序一共编写了11个函数分别实现上述功能。如下:函数名功能judge判断输入内容是否为0或者正整数;是则返回该正整数,否则返回-1show显示图书所有信息ordershow对界面进行分栏;使界面清晰友好;提示用户当前所在的操作界面column显示图书信息的表头栏create创建储存图书信息的单链表,同时将图书信息储存在另一结构体数组中freellist释放单链表的内存,指针赋空search利用单链表进行ISBN查找图书;找到则输出图书信息,否则给出提示keyword关键词查询:显示书名完整包含关键词的图书信息bubblesort利用单链表进行冒泡排序,使销量由高到低排序显示selectsort利用数组进行选择排序,使价格由低到高排行显示insertsort利用数组进行插入排序,使库存由低到高排行显示将程序进行模块化处理是十分有益的。模块化后,程序显得更加清晰;出错后可以分块解决;便于多次实现同一功能。本程序对磁盘数据的读取和储存是利用了链表和结构体数组的。在创建链表的同时对全局的数组变量赋值。在实现功能时,部分功能是对链表进行操作,部分功能时对数组进行操作。在购买和退还操作时,链表和数组内数据的更改是同时的。最后读取数组内的信息进入文件,保存到磁盘中实现这一系统,除了对功能的实现和对数据的读取、更改、储存外,对错误的提醒和隐患的避免也是十分重要的。本系统中有对文件打开错误的提醒,对动态空间的释放和指针的赋空。本程序中对操作内容正误的判断是这样进行的:为了避免用户输入内容中存在空格引起错误,本程序使用while循环,利用fflush(sdtin);gets(char a);对所有数据进行读取的。这样消除了缓冲区的回车,并将用户输入的一行所有内容读入(用scanf就会在出现空格之后停止),并用judge函数进行判断。将0或正整数正确输出,并将含有其他任何无关字符的输入视为错误,输出-1(但是当直接回车时,judge函数会输出0)。这样就可以实现只对用户的正确内容进行读取后退出循环;对错误内容给出提示,并利用while循环返回上一操作界面。由于不同的功能的实现需要排除用户可能输入的不同错误,所以main函数中的大量内容对用户输入内容的正确读入和错误提醒。此外,本程序在开始打开文件”图书.txt”时,是以可读方式打开的。以防止原始数据由于程序的意外关闭而丢失。在程序末尾,在关闭文件后重新以可写方式打开文件,并对数据重新读入。这样可以防止大量图书信息丢失。当然,本程序还有一些缺陷。由于所开的字符串数组的大小限制,用户输入内容不能超过100个字符,否则程序出现错误。此外,若在程序运行中途关闭程序,则购买和退还图书的信息会全部丢失。改进的方式是将程序的读取放在每一次购买和退货操作之后进行。三、变量说明变量意义FILE *p指向磁盘文件的指针struct book *bookpmain函数中用于单链表操作的指针int n图书种类数struct book *bklist储存图书信息的单链表首地址struct book bk100储存图书信息的数组int op主操作变量(控制进入某一主要功能)int operat次操作变量(控制主要功能下的次要功能)int booknumber购买或者退还的图书数量int i计数使用char ISBN0100查询图书的ISBN号char buy100购买图书的ISBN号char back100退还图书的ISBN号char str100临时储存用户输入信息的字符数组void (*oper2)(struct book a)排序操作时使用的指向函数的指针数组四、流程图见文件”程序流程图.jpg”,由于流程图较大,放于word中难以清晰显示,造成不便请见谅。五、测试数据加粗黑体为输入的测试数据,宋体为程序显示内容,方正姚体为本人添加的注释。以下是程序测试内容和相应的注释:你好,欢迎使用图书销售管理系统,请选择您想要进行的操作图书查询请按1;图书排行请按2;图书购买请按3;退货请按4;退出程序请按0或者直接按回车键。输入数字后以回车键结束123 23 /输入错误信息请输入正整数或0。你好,欢迎使用图书销售管理系统,请选择您想要进行的操作图书查询请按1;图书排行请按2;图书购买请按3;退货请按4;退出程序请按0或者直接按回车键。输入数字后以回车键结束1-图书查询-请输入图书的ISBN号(若查询所有图书信息请按0,若使用关键词查找请按1)输入完成后以回车键结束。1 123 /直接用scanf就会进入关键词查找,而本程序在输入后可以识别错误-ISBN查找-抱歉,没有找到相应的图书。继续查询请按1;结束查询请按0或者直接按回车键。输入数字后以回车键结束。w 23d2d23 11 /输入错误请输入正整数或0。输入内容有误继续查询请按1;结束查询请按0或者直接按回车键。输入数字后以回车键结束。1-图书查询-请输入图书的ISBN号(若查询所有图书信息请按0,若使用关键词查找请按1)输入完成后以回车键结束。0 /查询所有图书-所有图书信息- ISBN号 价格
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 离婚协议书模板:离婚后财产分割与子女抚养权确定
- 离婚协议书695:离婚调解与财产分割专业定制协议
- 文化创意园区租赁意向金及创意项目孵化协议
- 离异家庭子女教育基金人寿保险合同修订与理赔协议
- 离婚协议书中的知识产权归属及保护措施
- 高端离婚房产分割与财产分配策略合同范本
- 2025成都市家具买卖合同范本
- 私人教育贷款合同范本:学生贷款及还款责任协议
- 夫妻共同债务处理及个人财产分割协议书范本
- 离婚协议简易范本:共同财产分割与债务清算协议
- 2025广东珠海市下半年市直机关事业单位招聘合同制职员37人考试参考试题及答案解析
- 软件开发驻场合同协议
- 矿山承包法律合同范本
- 音乐培训机构招生
- 时文语法填空-电影篇 《731》 《长安的荔枝》 《戏台》
- 浙江省浙南名校联盟2025-2026学年高二上学期开学返校联考英语试卷(含音频)
- 高中美术 《设计》艺术与技术的结合——产品设计 1 课件
- 贵阳市征地统一年产值和征地区片价补偿标准
- 小学数学德育纲要
- 230w光束灯中文说明书
- 关于鼓励员工考取各类资格证书的管理办法
评论
0/150
提交评论