程序设计大作业代码及说明书图书销售管理系统.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;ifor(a=bklist;a->next->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;
}//用单链表进行冒泡排序,打印出按照销量由高到低的排行榜
voidselectsort(structbooka[])
{
inti,j,min;
structbook*pb[50],*tempb;
ordershow("价格由低到高排行");
for(i=0;ipb[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;ishow(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;ipc[i]=&a[i];
for(i=1;i{
tempc=pc[i];
for(j=i-1;(j>=0)&&(tempc->storestore);j--)
pc[j+1]=pc[j];
pc[j+1]=tempc;
}
column();
for(i=0;ishow(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;ishow(&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("是否需要重新查询?
继续退