程序设计大作业代码及说明书图书销售管理系统.docx
- 文档编号:12476143
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:41
- 大小:39.80KB
程序设计大作业代码及说明书图书销售管理系统.docx
《程序设计大作业代码及说明书图书销售管理系统.docx》由会员分享,可在线阅读,更多相关《程序设计大作业代码及说明书图书销售管理系统.docx(41页珍藏版)》请在冰豆网上搜索。
程序设计大作业代码及说明书图书销售管理系统
程序设计说明书
(图书销售管理系统)
图书销售系统:
程序代码
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
structbook
{
charISBN[50];//ISBN号
charname[50];//图书名称
floatprice;//价格
intstore0;//最初书店中的库存
intstore;//当前存货量
intsale;//销售量
chardiscount;//是否促销
structbook*next;//单链表中指向下一结构体首地址的指针
};
intn;//图书数量,需要在录入时从文件第一行读取
staticstructbook*bklist,bk[100];//图书单链表的首地址,和图书数组
intjudge(chara[])//要考虑到输入非数字的的影响,若输入的是正确的非负整数则返回该数,否则返回-1。
在main函数中,将输入内容转化为字符串
{
inti,b,trns;
if(a[0]=='0'&&a[1]!
='\0')
{
printf("请输入正整数或0。
");
return-1;
}//1:
排出输入内容中第一个字符为'0',之后还有别的内容的情况
for(i=0;a[i]!
='\0';i++)
{
b=a[i];
if((b<48)||(b>57))
{
printf("请输入正整数或0。
\n\n");
return-1;
}//2:
若含数字外的字符,则返回-1,说明用户输入有误
}
trns=atoi(a);//排除了1、2的情况后,将字符串转化为整型数,将该整型数返回
returntrns;
}
voidshow(structbook*k)//用于显示图书的相关信息
{
fprintf(stdout,"%-25s%-10.2f%-5d%-10d%-5c%-30s\n\n",k->ISBN,k->price,k->store,k->sale,k->discount,k->name);
}
voidordershow(constcharorder[])//用于提示用户当前所在的命令操作界面
{
printf("\n\n---------------------------%s--------------------------------\n\n\n",order);
}
voidcolumn(void)//用于显示图书信息表格的表头
{
printf("ISBN号价格库存销售量是否促销书名\n");
}
structbook*create(FILE*p)
{
structbook*mylist,*tempnode,*cursor;inti;
mylist=(structbook*)malloc(sizeof(structbook));
if(mylist==NULL)
{printf("error1");exit
(1);}
mylist->next=NULL;
cursor=mylist;
fscanf(p,"%d",&n);
for(i=0;i { tempnode=(structbook*)malloc(sizeof(structbook)); if(tempnode==NULL) {printf("error1");exit (1);} tempnode->next=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(bk[i].ISBN,tempnode->ISBN);strcpy(bk[i].name,tempnode->name); bk[i].price=tempnode->price; bk[i].store0=tempnode->store0;bk[i].store=tempnode->store; bk[i].sale=tempnode->sale; bk[i].discount=tempnode->discount;//内容录入数组,数组是全局的,无需返回 cursor->next=tempnode; cursor=tempnode; }//创建单链表,对数据进行录入,同时录入数组 cursor=NULL;tempnode=NULL; returnmylist;//返回单链表首地址 } voidfreellist(structbook*head) { structbook*ptr; while(head! =NULL)//遍历链表 { ptr=head; head=head->next;//指向下一节点 ptr->next=NULL; free(ptr);//释放结构体 } } intsearch(char*l) { structbook*booksearch; for(booksearch=bklist->next;booksearch! =NULL;booksearch=booksearch->next) { if(strcmp(l,booksearch->ISBN)==0) { column(); show(booksearch); booksearch=NULL; return0; } } printf("抱歉,没有找到相应的图书。 \n\n"); booksearch=NULL; return1; }//利用单链表进行ISBN查找 voidkeyword(chara[]) { inti,j,k; intlength,lengthi,flag=0,flag1=0,temp,temp0; length=strlen(a);//关键词的长度 flag=0;flag1=0; column(); for(i=0;i { lengthi=strlen(bk[i].name); for(j=0;j+length { for(k=0;k { temp=a[k];temp0=bk[i].name[j+k]; flag+=(temp0-temp)*(temp0-temp); } if(flag==0) { flag1++;show(&bk[i]);break; } elseflag=0; } } if(flag1==0)printf("抱歉,没有找到相应的图书。 \n\n"); }//关键词查找: 查找结果为书名中包含查找内容(作为整体)的相应书籍的全部内容 voidbubblesort(void) { inti; structbook*a,*b,*c; ordershow("销量由高到低排序"); for(i=0;i for(a=bklist;a->next->next! =NULL;a=a->next) { b=a->next;c=b->next->next; if(b->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; }//用单链表进行冒泡排序,打印出按照销量由高到低的排行榜 voidselectsort(structbooka[]) { inti,j,min; structbook*pb[50],*tempb; ordershow("价格由低到高排行"); for(i=0;i pb[i]=&a[i]; for(i=0;i { min=i; for(j=i;j { if(pb[min]->price>pb[j]->price) min=j; } tempb=pb[i];pb[i]=pb[min];pb[min]=tempb; } column(); for(i=0;i show(pb[i]); tempb=NULL; for(i=0;i<49;i++) pb[i]=NULL; }//对图书数组进行选择排序,打印出图书价格由低到高的排行榜 voidinsertsort(structbooka[]) { inti,j; structbook*tempc,*pc[50]; ordershow("库存由低到高排行"); for(i=0;i pc[i]=&a[i]; for(i=1;i { tempc=pc[i]; for(j=i-1;(j>=0)&&(tempc->store pc[j+1]=pc[j]; pc[j+1]=tempc; } column(); for(i=0;i show(pc[i]); tempc=NULL; for(i=0;i<49;i++) pc[i]=NULL; }//对图书数组进行选择排序,打印出图书库存由低到高的排行榜 voidmain() { FILE*p; inti,op,operat,booknum; charISBN0[100],buy[100],back[100],str[100];//从左到右依次为: 查询图书的ISBN码,购买图书的ISBN码,退还图书的ISBN码,接受用户输入的操作命令的字符数组。 void(*oper[2])(structbooka[]);//指向函数的指针,用于控制选择排序和插入排序函数 structbook*bookp;//用于单链表操作的指针 if((p=fopen("图书.txt","r"))==NULL)//打开文件,为了防止中途关闭程序导致文件截为0的情况,首先以可读方式打开 { printf("文件打开失败! \n");return; }//判断文件是否打开成功 bklist=create(p);//创建了一个单链表,对磁盘文件进行存储 rewind(p);//文件指针返回到文件开头,便于之后的操作 ///////////////////////////////初始选择模式///////////////////////////////////////// while (1) { printf("\n你好,欢迎使用图书销售管理系统,请选择您想要进行的操作\n\n图书查询请按1;图书排行请按2;图书购买请按3;退货请按4;\n\n退出程序请按0或者直接按回车键。 \n\n输入数字后以回车键结束\n"); fflush(stdin);gets(str); op=judge(str); if(op==-1) continue;//如果有非数字字符,继续循环,重新输入 if(op==0)//输入0或者直接按回车时,op=0,结束程序 { printf("\n\n感谢您的使用! \n\n\n");break; }//程序出口 if((op! =1)&&(op! =2)&&(op! =3)&&(op! =4)&&(op! =0))//输入整数要为0,1,2,3,4中的一个 { printf("输入操作有误,请输入0-4的某一个数字,以回车键结束\n\n"); 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;i show(&bk[i]); }//输出全部图书信息 elseif(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("输入内容有误\n\n"); }//判断输入是否正确,正确输入后才可以跳出循环。 if(operat==1) { operat=0;continue;//继续查询 } if(operat==0)break;//退出查询 } ///////////////////////////////////排行查询///////////////////////////////// while(op==2) { ordershow("排行查询"); printf("按销量由高到低排序请按1;按价格由低到高排序请按2;按库存量由低到高排序请按3;\n\n结束排行查询请按0或者直接按回车键;输入数字后以回车键结束。 \n\n"); fflush(stdin);gets(str); operat=judge(str); if(operat==-1)continue; if((operat! =1)&&(operat! =2)&&(operat! =3)&&(operat! =0)) { printf("输入操作有误,请输入0-3的某一个整数,输入数字后以回车键结束。 \n\n"); continue; }//输入错误提醒 if(operat==0)break; if(operat==1) { bubblesort();//冒泡排序 } else { oper[0]=selectsort; oper[1]=insertsort;//利用指向函数的指针控制 oper[operat-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的某一个整数,输入数字后以回车键结束。 \n\n"); }//判断输入是否正确,正确输入后才可以跳出此循环。 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;i { if(strcmp(bk[i].ISBN,buy)==0)break; }//判断判断存书的ISBN码中是否与有输入的ISBN码相同的 if(i==n) { printf("您所查找的图书不存在,请重新输入\n\n");continue; }//没有则i=n,重新输入 if(i { column(); show(&bk[i]);//有该图书则将该图书的信息打印在屏幕上 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的数字,以回车键结束\n\n"); continue;//输入错误内容的提示 } elsebreak; } if(operat==0)continue;//返回购买图书的ISBN输入界面 } while (1) { if(bk[i].store==0) { printf("图书已售空,请购买其他排行靠前的图书\n\n");break; }//图书售空提示 if(bk[i].store<4)//图书余量较少的提示 printf("此图书库存不超过3本,请尽快购买\n\n"); printf("请输入您需要购买的数量(请输入正整数,若不购买输入0或者直接按回车键)\n"); fflush(stdin);gets(str); booknum=judge(str); if(booknum==-1)continue;//防止输入了字母或其他符号被强制转化为整型数而引发的错误 if(bk[i].store { printf("此图书库存不足,图书库存%d本\n\n请重新输入购买数量\n",bk[i].store); continue;//图书库存不足的提示 } bk[i].sale+=booknum; bk[i].store-=booknum;//对数组中数据的更改 for(bookp=bklist->next;bookp! =NULL;bookp=bookp->next) { if(strcmp(buy,bookp->ISBN)==0) { bookp->sale+=booknum; bookp->store-=booknum; } }//对单链表中图书数据的更改 printf("已完成操作! \n\n");break; } } //////////////////////////退还图书////////////////////////////////////////////////// while(op==4) { ordershow("退还图书"); printf("请输入您需要退还图书的ISBN号,以回车键结束;结束退还请输入0,以回车结束。 \n"); fflush(stdin);gets(back); if(strcmp(back,"0")==0)break; for(i=0;i { if(strcmp(bk[i].ISBN,back)==0)break; } if(i==n) { printf("您所退还的图书不存在,请重新输入\n\n");continue; } if(i { show(&bk[i]); while (1) { printf("是否需要重新查询? 继续退
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 作业 代码 说明书 图书 销售 管理 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)