1、程序设计说明书(图书销售管理系统)图书销售系统:程序代码#include “stdio.h“#include “stdlib.h“#include“string.h“struct bookchar ISBN50; /ISBN 号char name50; /图书名称float price; /价格int store0; /最初书店中的库存int store; /当前存货量int sale; /销售量char discount; /是否促销struct book *next; /单链表中指向下一结构体首地址的指针;int n; /图书数量,需要在录入时从文件第一行读取static struct b
2、ook *bklist,bk100; /图书单链表的首地址,和图书数组int judge(char a) / 要考虑到输入非数字的的影响,若输入的是正确的非负整数则返回该数,否则返回-1。在 main 函数中,将输入内容转化为字符串int i,b,trns;if(a0=0return -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 的情况后,将字符串转
3、化为整型数,将该整型数返回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 号 价格 库存 销售量 是
4、否促销 书名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“,for(i=0;inext=NULL;fscanf(p,“%s %f %d %d %c“,tempnode-ISBN,fgets(tempnode-name,30,p
5、);tempnode-sale=tempnode-store0-tempnode-store;strcpy(bki.ISBN,tempnode-ISBN);strcpy(bki.name,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; /创
6、建单链表,对数据进行录入,同时录入数组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;
7、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()
8、;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(“价格由低到
9、高排行“);for (i=0;ipricepbj-price)min=j;tempb=pbi;pbi=pbmin;pbmin=tempb;column();for (i=0;i=0)j-)pcj+1=pcj;pcj+1=tempc;column();for (i=0;inext;bookp!=NULL;bookp=bookp-next)if(strcmp(buy,bookp-ISBN)=0)bookp-sale+=booknum;bookp-store-=booknum; /对单链表中图书数据的更改printf(“已完成操作! nn“);break;/退还图书 /while (op=4)ord
10、ershow(“退还图书“);printf(“请输入您需要退还图书的 ISBN 号,以回车键结束;结束退还请输入 0,以回车结束。n“);fflush(stdin);gets(back);if(strcmp(back,“0“)=0)break;for(i=0;inext;bookp!=NULL;bookp=bookp-next)if(strcmp(back,bookp-ISBN)=0)bookp-sale-=booknum;bookp-store+=booknum; /更改数组和单链表中的相应数据printf(“已完成操作! nn“);break; /从这里跳出循环,开始保存数据fclose(
11、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,bki.name);rewind(p); /录入每一本图书的相关信息,将指针指向文件开头fclose(p);p=NULL;
12、 /关闭文件,文件指针指空freellist(bklist); /将单链表的指针赋空并释放单链表中的内存oper0=NULL;oper1=NULL; /将指向函数的指针赋空一、概述本程序为图书销售管理系统,实现图书的查找、排序、购买、退货等功能,并将数据存入磁盘文件中保存。本程序为 Win32 开发的控制台应用程序,在 Visual Stdio 2012 下完成。本程序的特点是功能完整、界面友好(请在运行程序时将窗口宽度调节到至少 160) 、防错误功能较完善。二、程序设计思路本图书销售管理系统主要完成的功能有:1、图书查询1.1 ISBN 查询 1.2 关键词查询 1.3 所有图书信息查询2
13、、排行查询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 创建储存图书信息的单链表,同时将图书信息储存在另一结构体数
14、组中freellist 释放单链表的内存,指针赋空search 利用单链表进行 ISBN 查找图书;找到则输出图书信息,否则给出提示keyword 关键词查询:显示书名完整包含关键词的图书信息bubblesort 利用单链表进行冒泡排序,使销量由高到低排序显示selectsort 利用数组进行选择排序,使价格由低到高排行显示insertsort 利用数组进行插入排序,使库存由低到高排行显示将程序进行模块化处理是十分有益的。模块化后,程序显得更加清晰;出错后可以分块解决;便于多次实现同一功能。本程序对磁盘数据的读取和储存是利用了链表和结构体数组的。在创建链表的同时对全局的数组变量赋值。在实现功能
15、时,部分功能是对链表进行操作,部分功能时对数组进行操作。在购买和退还操作时,链表和数组内数据的更改是同时的。最后读取数组内的信息进入文件,保存到磁盘中实现这一系统,除了对功能的实现和对数据的读取、更改、储存外,对错误的提醒和隐患的避免也是十分重要的。本系统中有对文件打开错误的提醒,对动态空间的释放和指针的赋空。本程序中对操作内容正误的判断是这样进行的:为了避免用户输入内容中存在空格引起错误,本程序使用 while 循环,利用 fflush(sdtin);gets(char a);对所有数据进行读取的。这样消除了缓冲区的回车,并将用户输入的一行所有内容读入(用 scanf 就会在出现空格之后停止
16、) ,并用 judge 函数进行判断。将 0 或正整数正确输出,并将含有其他任何无关字符的输入视为错误,输出-1 (但是当直接回车时, judge 函数会输出 0) 。这样就可以实现只对用户的正确内容进行读取后退出循环;对错误内容给出提示,并利用 while 循环返回上一操作界面。由于不同的功能的实现需要排除用户可能输入的不同错误,所以main 函数中的大量内容对用户输入内容的正确读入和错误提醒。此外,本程序在开始打开文件”图书.txt” 时,是以可读方式打开的。以防止原始数据由于程序的意外关闭而丢失。在程序末尾,在关闭文件后重新以可写方式打开文件,并对数据重新读入。这样可以防止大量图书信息丢
17、失。当然,本程序还有一些缺陷。由于所开的字符串数组的大小限制,用户输入内容不能超过 100 个字符,否则程序出现错误。此外,若在程序运行中途关闭程序,则购买和退还图书的信息会全部丢失。改进的方式是将程序的读取放在每一次购买和退货操作之后进行。三、变量说明变量 意义FILE *p 指向磁盘文件的指针struct book *bookp main 函数中用于单链表操作的指针int n 图书种类数struct book *bklist 储存图书信息的单链表首地址struct book bk100 储存图书信息的数组int op 主操作变量(控制进入某一主要功能)int operat 次操作变量(控制
18、主要功能下的次要功能)int booknumber 购买或者退还的图书数量int i 计数使用char ISBN0100 查询图书的 ISBN 号char buy100 购买图书的 ISBN 号char back100 退还图书的 ISBN 号char str100 临时储存用户输入信息的字符数组void (*oper2)(struct book a) 排序操作时使用的指向函数的指针数组四、流程图见文件”程序流程图.jpg” ,由于流程图较大,放于 word 中难以清晰显示,造成不便请见谅。五、测试数据加粗黑体为输入的测试数据,宋体为程序显示内容,方正姚体为本人添加的注释。以下是程序测试内容和
19、相应的注释:你好,欢迎使用图书销售管理系统,请选择您想要进行的操作图书查询请按 1;图书排行请按 2;图书购买请按 3;退货请按 4;退出程序请按 0 或者直接按回车键。输入数字后以回车键结束123 23 /输入错误信息请输入正整数或 0。你好,欢迎使用图书销售管理系统,请选择您想要进行的操作图书查询请按 1;图书排行请按 2;图书购买请按 3;退货请按 4;退出程序请按 0 或者直接按回车键。输入数字后以回车键结束1-图书查询-请输入图书的 ISBN 号(若查询所有图书信息请按 0,若使用关键词查找请按 1)输入完成后以回车键结束。1 123 /直接用 scanf 就会进入关键词查找,而本程
20、序在输入后可以识别错误-ISBN 查找 -抱歉,没有找到相应的图书。继续查询请按 1;结束查询请按 0 或者直接按回车键。输入数字后以回车键结束。w 23d2d23 11 /输入错误请输入正整数或 0。输入内容有误继续查询请按 1;结束查询请按 0 或者直接按回车键。输入数字后以回车键结束。1-图书查询-请输入图书的 ISBN 号(若查询所有图书信息请按 0,若使用关键词查找请按 1)输入完成后以回车键结束。0 /查询所有图书-所有图书信息-ISBN 号 价格 库存 销售量 是否促销 书名978-7-302-16568-2 29.80 98 2 Y 简明物理化学978-7-04-024384-
21、0 17.39 35 5 N 计算机文化基础720-8-02-364615-0 15.00 0 50 N 邓小平传711-3-01-061004-5 14.00 47 0 Y 科学革命的结构978-7-302-16434-2 39.80 2 8 N 大学化学978-7-04-02111-0 18.39 39 1 N 程序设计基础720-8-02-12345-0 17.00 4 46 N 毛泽东传711-3-01-061224-5 24.00 12 10 Y 科学革命978-7-302-16128-2 39.80 5 95 N 物理化学978-7-04-022224-0 17.39 31 9 N
22、 计算机继续查询请按 1;结束查询请按 0 或者直接按回车键。输入数字后以回车键结束。1 2ww /输入错误请输入正整数或 0。输入内容有误继续查询请按 1;结束查询请按 0 或者直接按回车键。输入数字后以回车键结束。1-图书查询-请输入图书的 ISBN 号(若查询所有图书信息请按 0,若使用关键词查找请按 1)输入完成后以回车键结束。711-3-01-061224-5 /ISBN 查询-ISBN 查找 -ISBN 号 价格 库存 销售量 是否促销 书名711-3-01-061224-5 24.00 12 10 Y 科学革命继续查询请按 1;结束查询请按 0 或者直接按回车键。输入数字后以回车
23、键结束。wsn 1 /输入错误请输入正整数或 0。输入内容有误继续查询请按 1;结束查询请按 0 或者直接按回车键。输入数字后以回车键结束。1-图书查询-请输入图书的 ISBN 号(若查询所有图书信息请按 0,若使用关键词查找请按 1)输入完成后以回车键结束。1-关键词查询-请输入关键词:(直接按回车键可查询所有图书)传 /以“传”作为关键词查询ISBN 号 价格 库存 销售量 是否促销 书名720-8-02-364615-0 15.00 0 50 N 邓小平传720-8-02-12345-0 17.00 4 46 N 毛泽东传/得到上述包含“传”的两本书继续查询请按 1;结束查询请按 0 或
24、者直接按回车键。输入数字后以回车键结束。1-图书查询-请输入图书的 ISBN 号(若查询所有图书信息请按 0,若使用关键词查找请按 1)输入完成后以回车键结束。1-关键词查询-请输入关键词:(直接按回车键可查询所有图书)明物 /只要是输入字符串包含在书名中的书都符合要求ISBN 号 价格 库存 销售量 是否促销 书名978-7-302-16568-2 29.80 98 2 Y 简明物理化学继续查询请按 1;结束查询请按 0 或者直接按回车键。输入数字后以回车键结束。1-图书查询-请输入图书的 ISBN 号(若查询所有图书信息请按 0,若使用关键词查找请按 1)输入完成后以回车键结束。1-关键词
25、查询-请输入关键词:(直接按回车键可查询所有图书)是 h2iwyh 1 /输入没有的关键词ISBN 号 价格 库存 销售量 是否促销 书名抱歉,没有找到相应的图书。继续查询请按 1;结束查询请按 0 或者直接按回车键。输入数字后以回车键结束。0 /退出查询你好,欢迎使用图书销售管理系统,请选择您想要进行的操作图书查询请按 1;图书排行请按 2;图书购买请按 3;退货请按 4;退出程序请按 0 或者直接按回车键。输入数字后以回车键结束2 /进入排行-排行查询-按销量由高到低排序请按 1;按价格由低到高排序请按 2;按库存量由低到高排序请按 3;结束排行查询请按 0 或者直接按回车键;输入数字后以
26、回车键结束。1 2 3 0 /输入错误请输入正整数或 0。-排行查询-按销量由高到低排序请按 1;按价格由低到高排序请按 2;按库存量由低到高排序请按 3;结束排行查询请按 0 或者直接按回车键;输入数字后以回车键结束。1 /销量排行-销量由高到低排序-ISBN 号 价格 库存 销售量 是否促销 书名978-7-302-16128-2 39.80 5 95 N 物理化学720-8-02-364615-0 15.00 0 50 N 邓小平传720-8-02-12345-0 17.00 4 46 N 毛泽东传711-3-01-061224-5 24.00 12 10 Y 科学革命978-7-04-
27、022224-0 17.39 31 9 N 计算机978-7-302-16434-2 39.80 2 8 N 大学化学978-7-04-024384-0 17.39 35 5 N 计算机文化基础978-7-302-16568-2 29.80 98 2 Y 简明物理化学978-7-04-02111-0 18.39 39 1 N 程序设计基础711-3-01-061004-5 14.00 47 0 Y 科学革命的结构继续排行查询请按 1;结束排行查询请按 0 或者直接按回车键。输入数字后以回车键结束1 2wqs /输入错误请输入正整数或 0。继续排行查询请按 1;结束排行查询请按 0 或者直接按回
28、车键。输入数字后以回车键结束1 -排行查询-按销量由高到低排序请按 1;按价格由低到高排序请按 2;按库存量由低到高排序请按 3;结束排行查询请按 0 或者直接按回车键;输入数字后以回车键结束。2 /价格排行-价格由低到高排行-ISBN 号 价格 库存 销售量 是否促销 书名711-3-01-061004-5 14.00 47 0 Y 科学革命的结构720-8-02-364615-0 15.00 0 50 N 邓小平传720-8-02-12345-0 17.00 4 46 N 毛泽东传978-7-04-024384-0 17.39 35 5 N 计算机文化基础978-7-04-022224-0
29、 17.39 31 9 N 计算机978-7-04-02111-0 18.39 39 1 N 程序设计基础711-3-01-061224-5 24.00 12 10 Y 科学革命978-7-302-16568-2 29.80 98 2 Y 简明物理化学978-7-302-16128-2 39.80 5 95 N 物理化学978-7-302-16434-2 39.80 2 8 N 大学化学继续排行查询请按 1;结束排行查询请按 0 或者直接按回车键。输入数字后以回车键结束1-排行查询-按销量由高到低排序请按 1;按价格由低到高排序请按 2;按库存量由低到高排序请按 3;结束排行查询请按 0 或者
30、直接按回车键;输入数字后以回车键结束。3 /库存排行-库存由低到高排行-ISBN 号 价格 库存 销售量 是否促销 书名720-8-02-364615-0 15.00 0 50 N 邓小平传978-7-302-16434-2 39.80 2 8 N 大学化学720-8-02-12345-0 17.00 4 46 N 毛泽东传978-7-302-16128-2 39.80 5 95 N 物理化学711-3-01-061224-5 24.00 12 10 Y 科学革命978-7-04-022224-0 17.39 31 9 N 计算机978-7-04-024384-0 17.39 35 5 N 计
31、算机文化基础978-7-04-02111-0 18.39 39 1 N 程序设计基础711-3-01-061004-5 14.00 47 0 Y 科学革命的结构978-7-302-16568-2 29.80 98 2 Y 简明物理化学继续排行查询请按 1;结束排行查询请按 0 或者直接按回车键。输入数字后以回车键结束0你好,欢迎使用图书销售管理系统,请选择您想要进行的操作图书查询请按 1;图书排行请按 2;图书购买请按 3;退货请按 4;退出程序请按 0 或者直接按回车键。输入数字后以回车键结束3 /购买图书-购买图书-请输入您需要购买图书的 ISBN 号(可通过查询获得),以回车键结束;结束
32、购买请输入 0,以回车结束。978-7-04-024384rrr /输入没有的 ISBN您所查找的图书不存在,请重新输入-购买图书-请输入您需要购买图书的 ISBN 号(可通过查询获得),以回车键结束;结束购买请输入 0,以回车结束。978-7-04-024384 /输入没有的 ISBN您所查找的图书不存在,请重新输入-购买图书-请输入您需要购买图书的 ISBN 号(可通过查询获得),以回车键结束;结束购买请输入 0,以回车结束。978-7-04-024384-0ISBN 号 价格 库存 销售量 是否促销 书名978-7-04-024384-0 17.39 35 5 N 计算机文化基础继续购买
33、请输入 1,返回上一界面请输入 0 或者直接按回车键,以回车键结束2 312 /错误输入请输入正整数或 0。继续购买请输入 1,返回上一界面请输入 0 或者直接按回车键,以回车键结束1请输入您需要购买的数量(请输入正整数,若不购买输入 0 或者直接按回车键)500 /购买数量过多此图书库存不足,图书库存 35 本 /提示可以购买的数量请重新输入购买数量请输入您需要购买的数量(请输入正整数,若不购买输入 0 或者直接按回车键)5ewd /输入错误请输入正整数或 0。请输入您需要购买的数量(请输入正整数,若不购买输入 0 或者直接按回车键)5 /正确输入已完成操作! /信息存入数组和单链表中-购买
34、图书-请输入您需要购买图书的 ISBN 号(可通过查询获得),以回车键结束;结束购买请输入 0,以回车结束。978-7-04-024384-0ISBN 号 价格 库存 销售量 是否促销 书名978-7-04-024384-0 17.39 30 10 N 计算机文化基础/购买信息已存入继续购买请输入 1,返回上一界面请输入 0 或者直接按回车键,以回车键结束0-购买图书-请输入您需要购买图书的 ISBN 号(可通过查询获得),以回车键结束;结束购买请输入 0,以回车结束。978-7-302-16434-2ISBN 号 价格 库存 销售量 是否促销 书名978-7-302-16434-2 39.8
35、0 2 8 N 大学化学继续购买请输入 1,返回上一界面请输入 0 或者直接按回车键,以回车键结束1此图书库存不超过 3 本,请尽快购买 /库存较少提醒请输入您需要购买的数量(请输入正整数,若不购买输入 0 或者直接按回车键)2已完成操作!-购买图书-请输入您需要购买图书的 ISBN 号(可通过查询获得),以回车键结束;结束购买请输入 0,以回车结束。0 /结束购买你好,欢迎使用图书销售管理系统,请选择您想要进行的操作图书查询请按 1;图书排行请按 2;图书购买请按 3;退货请按 4;退出程序请按 0 或者直接按回车键。输入数字后以回车键结束4 /退还图书-退还图书-请输入您需要退还图书的 I
36、SBN 号,以回车键结束;结束退还请输入 0,以回车结束。www eee /错误输入您所退还的图书不存在,请重新输入-退还图书-请输入您需要退还图书的 ISBN 号,以回车键结束;结束退还请输入 0,以回车结束。978-7-302-16434-2978-7-302-16434-2 39.80 0 10 N 大学化学是否需要重新查询?继续退还请输入 1,返回上一界面请输入 0 或者直接按回车键,以回车键结束1w12 /错误输入请输入正整数或 0。是否需要重新查询?继续退还请输入 1,返回上一界面请输入 0 或者直接按回车键,以回车键结束1请输入您需要退还的数量(请输入正整数,若不退还输入 0 或
37、者直接按回车键,以回车键结束)13 退还数量超过销售量,输入错误退货数量应在 0 和 10 之间,请仔细检查数量。 /给出错误提示,给出退书量范围请输入您需要退还的数量(请输入正整数,若不退还输入 0 或者直接按回车键,以回车键结束)12es /输入错误请输入正整数或 0。请输入您需要退还的数量(请输入正整数,若不退还输入 0 或者直接按回车键,以回车键结束)1 /输入正确已完成操作! /退书信息保存在数组和单链表中-退还图书-请输入您需要退还图书的 ISBN 号,以回车键结束;结束退还请输入 0,以回车结束。978-7-302-16434-2 /可以看到已经退还978-7-302-16434-2 39.80 1 9 N 大学化学是否需要重新查询?继续退还请输入 1,返回上一界面请输入 0