C语言 图书销售管理系统.docx
《C语言 图书销售管理系统.docx》由会员分享,可在线阅读,更多相关《C语言 图书销售管理系统.docx(26页珍藏版)》请在冰豆网上搜索。
C语言图书销售管理系统
图书销售管理系统设计
一、设计要求
1.图书信息包括:
序号、书名、作者、出版单位、价格。
2.系统以菜单方式工作。
3.图书信息录入功能(图书信息用文件保存)--输入。
4.图书信息的删除与修改功能。
5.图书信息浏览功能--输出。
6.查询功能--算法:
(按书名/作者查询)。
7.排序功能--算法:
(按书名排序/按价格排序)。
8.图书购买功能:
统计选购图书的总价,给出清单,屏幕输出参考以下的实际购书单。
二、总体设计思路
1.主要功能:
系统主要包括八个功能模块。
1)图书信息的录入:
将所要录入的图书信息包括序号、书名、作者、出版社、价格等录入一个文本文件中。
每录入一本书,系统提示是否继续,若不继续,则返回主界面。
2)图书信息的查询:
将所有图书信息包括序号、书名、出版社、作者、价格等显示在屏幕上,最后返回主界面。
3)图书信息的查询:
通过输入图书名称或作者完成图书信息的查找,并在屏幕上显示,返回主界面。
4)图书信息的修改:
通过输入序号,判断此图书是否存在,若不存在则提示用户重新输入图书序号,若存在则要求输入要修改图书的序号,对该图书重新录入信息。
录入后,提示是否继续,如不继续,则返回主界面。
5)图书信息的删除:
通过输入序号,判断此图书是否存在,若存在,则提示用户是否显示删除后的信息,若不存在则提示用户重新输入图书序号,删除完毕后,返回主界面。
6)图书信息的排序:
通过输入书名或价格,提示用户输入想要使用的排序方式,排序后的信息显示在屏幕上,返回主界面。
7)图书的购买:
通过输入要购买的图书序号,计算出总本书和总价格并连同其他购买信息一并显示在屏幕上。
8)退出系统:
返回主页面。
2.总体思路框图
图1.总体思路框图
三、主要参数和函数
1.全局变量
1)定义一个存放图书信息的结构体structbook,并定义此类型的变量structbooklist[N],用来表示图书数组。
structbook/*定义结构体类型*/
{
intnum;/*序号为整型*/
charname[40];/*书名为字符串*/
charauthor[20];/*作者为字符串*/
charpublish[50];/*出版社为字符串*/
floatprice;/*价格为浮点型*/
};
structbooklist[N];/*定义structbook类型的变量listN个*/
2)intCount=0,定义全局变量,用来表示图书的个数,初始值为0。
2.主要函数
1)主函数main(),控制整个系统的执行流程,使系统菜单可以循环执行。
根据图书馆信息管理系统的要求,可设计一个主函数,及定义多个用户自定义函数。
通过将switch语句与break语句联合使用来实现多分支选择结构程序的设计。
case1至case7分别实现不同的功能,并能返回主界面;case0直接返回主界面。
程序代码:
voidmain()
{
intchoice1;
printf("*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\n");
printf("*欢迎进入图书销售管理系统*\n");
printf("*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*\n");
do
{
printf("##################################################");/*显示菜单*/
printf("功能选项:
\n");
printf("1:
图书信息录入\n");
printf("2:
图书信息浏览\n");
printf("3:
图书信息查询\n");
printf("4:
图书信息修改\n");
printf("5:
图书信息删除\n");
printf("6:
图书信息排序\n");
printf("7:
图书的购买\n");
printf("0:
退出系统\n");
printf("###############################################################");
printf("\t请选择操作:
");
scanf("%d",&choice1);
switch(choice1)/*菜单选择*/
{
case1:
input();break;
case2:
show_bookinformation(list);break;
case3:
check_bookinformation(list);break;
case4:
modify_bookinformation(list);break;
case5:
delete_bookinformation(list);break;
case6:
reorder_bookinformation(list);break;
case7:
buytotal(list);break;
case0:
break;}
}while(choice1!
=0);
printf("谢谢!
欢迎下次使用使用!
\n");}
2)打开数据文件函数open(),把文件的信息打开到一个结构体数组中。
定义指向文件的指针读取数据,若指针指向NULL,则显示“无法操作,无文件信息”,要调用fopen、fclose和fread函数。
程序代码:
voidopen()
{inti;
FILE*fp;
if((fp=fopen("book.txt","rb+"))==NULL)
{printf("无法操作,无文件信息\n");
exit(0);}
for(i=0;i{if(fread(&list[i],sizeof(structbook),1,fp)==0)
{printf("数据输出失败\n");
exit(0);}}fclose(fp);}
3)信息录入文件函数read(),函数类型为void。
定义指向文件的指针读取数据,把输入的图书信息保存到文件中,若指针指向NULL,则输出无法操作。
利用for循环保存信息到指定文件。
程序代码:
voidread()
{inti;
FILE*fp;
if((fp=fopen("book.txt","wr+"))==NULL)
{printf("\n不能打开文件\n");
exit(0);}
for(i=0;iif(fwrite(&list[i],sizeof(structbook),1,fp)!
=1)
printf("文件写入错误\n");
fclose(fp);}
4)信息录入系统函数input(),提供录入图书信息功能。
在for循环下,一次提示用户输入图书序号、书名、作者、出版社以及价格。
每循环一次,提示用户是否继续,当选“1”时继续输入图书信息,选“2”时返回主界面;每循环一次Count自增1。
程序代码:
voidinput()
{inti,k,j,t;
for(j=0;list[j].num!
=0;j++)
t=j+1;
for(i=t;i{printf("\t请输入您的图书序号:
");
scanf("\t%d",&list[i].num);
printf("\t请输入书名:
");
scanf("\t%s",list[i].name);
printf("\t请输入作者:
");
scanf("\t%s",list[i].author);
printf("\t请输入出版社:
");
scanf("\t%s",list[i].publish);
printf("\t请输入价格:
");
scanf("\t%f",&list[i].price);
fflush(stdin);
printf("\t\n是否继续录入?
(1.是2.否)");
scanf("%d",&k);
if(k==2)break;
}Count=i+1;
read();}
5)删除图书信息函数delete_bookinformation(structbooklist[]),提供对图书信息的删除功能。
此函数运行时利用open函数打开数据文件,读取信息;利用for循环,当输入序号与循环中的某一对应数据相同时,将后一个赋值给前一个从而把要删除的图书信息删除掉。
如果i=0,则直接输出“图书销售系统没有你要输出的图书信息”。
删除后会显示“删除成功”,同时Count自减1;最后还要执行read函数,重新记录图书信息。
程序代码:
voiddelete_bookinformation(structbooklist[])
{intj,k,d,i=0;
open();
printf("请输入要删除的图书的序号:
\n");
scanf("%d",&d);
for(j=0;list[j].num!
=0;j++)
{if(list[j].num==d)
{for(k=j;list[k].num!
=0;k++)
list[k]=list[k+1];
i++;}}
if(i==0)
printf("图书销售系统没有你输入的图书序号,请重新选择输入\n");
else
Count=Count-1;
read();
printf("删除成功\n");}
6)修改图书信息函数modify_bookinformation(structbooklist[]),提供对图书信息的修改功能。
首先提示用户输入要修改的图书序号,利用for循环找到要修改的list[],系统提示用户依次输入修改后的图书序号、图书名、作者、出版社、价格。
如果输入的序号a为0,则提示“未发现您要找的书!
”。
程序代码:
voidmodify_bookinformation(structbooklist[])
{
intj,k=0,number;
open();
printf("\t请输入您要修改的图书的序号:
");
scanf("%d",&number);
for(j=0;list[j].num!
=0;j++)
if(list[j].num==number)
{
printf("\n\t请输入您修改后的图书信息:
\n\n");
printf("\t请输入您要修改的图书的序号:
");
scanf("%d",&list[j].num);
printf("\t请输入您修改后的书名:
");
scanf("%s",list[j].name);
printf("\t请输入您修改后的作者名:
");
scanf("%s",list[j].author);
printf("\t请输入您修改后的出版社:
");
scanf("%s",list[j].publish);
printf("\t请输入您修改后的书的价格:
");
scanf("%f",&list[j].price);
read();
printf("\n修改成功!
");
k++;}if(k==0)
printf("\n\n\t找不到需要修改的图书!
!
");}
7)图书信息输出函数show_bookinformation(structbooklist[]),提供图书信息输出功能,浏览图书信息。
通过printf()语句将所有的图书信息包括包括编号、书名、出版社、作者、价格等信息显示在屏幕上。
运用for语句加printf()实现图书信息的循环输出显示。
程序代码:
voidshow_bookinformation(structbooklist[])
{
inti;
open();
printf("\n********************图书信息显示************************\n");
printf("图书序号\t图书名\t作者名\t出版社\t图书价格\n");
for(i=0;list[i].num!
=0;i++)
{
printf("%d\t\t%s\t%s\t%s\t%6.2f\n",list[i].num,list[i].name,list[i].author,list[i].publish,list[i].price);
}
}
8)图书信息查询函数check_bookinformation(structbooklist[]),提供用户根据图书书名或作者查询图书信息功能。
通过printf()语句将所有的图书信息包括包括编号、书名、出版社、作者、价格等信息显示在屏幕上。
运用for语句加printf()实现图书信息的循环输出显示。
通过将switch语句与break语句联合使用来实现多分支选择结构。
若选“1”实现按书名查询;若选“2”实现按作者查询。
两者代码类似,都利用字符串操作,最后依次显示查询后的结果。
程序代码:
voidcheck_bookinformation(structbooklist[])/*查询图书信息*/
{intj,i,t,k=0;
charc[20],d[20];
printf("请输入查询方式:
\n1.按书名查询2按作者查询:
\n");
scanf("%d",&t);
if(t==1)
{open();
printf("请输入要查询的书名号:
\n");
scanf("%s",c);
printf("\n*******你想要查询的图书信息(按作者名)*********\n");
for(j=0;list[j].num!
=0;j++)
if(strcmp(c,list[j].name)==0)
{printf("图书序号\t图书名\t作者名\t出版社\t图书价格\n");
printf("%d\t\t%s\t%s\t%s\t%6.2f\n",list[j].num,list[j].name,list[j].author,list[j].publish,list[j].price);
k++;}
if(k==0)
printf("\n不存在你要查询的图书信息\n");}
if(t==2)
{open();
printf("请输入要查询的作者名:
\n");
scanf("%s",d);
for(i=0;list[i].num!
=0;i++)
if(strcmp(d,list[i].author)==0)
{printf("图书序号\t图书名\t作者名\t出版社\t图书价格\n");
printf("%d\t\t%s\t%s\t%s\t%6.2f\n",list[i].num,list[i].name,list[i].author,list[i].publish,list[i].price);
k++;}
if(k==0)
printf("\n不存在你要查询的图书信息\n");}}
9)图书信息排序函数reorder_bookinformation(structbooklist[]),提供对图书信息按书名和价格排序功能。
排序共有两种可选择的方式,按书名排序和按价格排序。
利用switch和break实现功能的选择。
按书名排序:
利用选择排序法和strcmp、strcpy函数在for循环下依次重新循环赋值,按字母的先后顺序依次排序。
如果定义的指针fp指向NULL则显示“can’topenthefile!
”,再利用for循环向屏幕输出排序后的全部图书信息,最后要返回主界面。
按价格排序:
价格按大小排序。
利用冒泡排序法,在for循环下依次重新循环赋值,再利用for循环向屏幕输出排序后的全部图书信息,最后返回主界面。
程序代码:
voidreorder_bookinformation(structbooklist[])
{inti,j,a,k;
structbookt;
FILE*fp;
chartemp[40];
open();
printf("\n请选择排序方式\n1---书名(按字母顺序)\n2---价格(按从高到低)\n");
scanf("%d",&a);
switch(a)
{case1:
for(i=0;i{k=i;
for(j=i+1;jif(strcmp(list[k].name,list[j].name)>0)k=j;
if(k!
=i)
{strcpy(temp,list[i].name);
strcpy(list[i].name,list[k].name);
strcpy(list[k].name,temp);}}
if((fp=fopen("book.txt","w"))==NULL)
{printf("can'topenthefile!
\n");
exit(0);}
printf("新序列为:
\n");
for(j=0;j{printf("图书序号\t图书名\t作者名\t出版社\t图书价格\n");
printf("%d\t\t%s\t%s\t%s\t%6.2f\n",list[j].num,list[j].name,list[j].author,list[j].publish,list[j].price);}
read();
break;
case2:
for(k=0;list[k].num!
=0;k++)
for(j=0;list[j].num!
=0;j++)
if(list[j].price{t=list[j];list[j]=list[j+1];list[j+1]=t;}
for(j=0;list[j].num!
=0;j++)
{printf("图书序号\t图书名\t作者名\t出版社\t图书价格\n");
printf("%d\t\t%s\t%s\t%s\t%6.2f\n",list[j].num,list[j].name,list[j].author,list[j].publish,list[j].price);
k++;}
read();
break;}
10)图书购买清单函数buytotal(structbooklist[]),提供统计选购图书的总价,给出清单的功能。
用户输入所购图书的序号,输入“0”时结束,系统利用for循环,当输入序号与系统内所存序号相同时,价格相加赋新值,书本数同时计数。
最后打印出想要的清单。
程序代码:
voidbuytotal(structbooklist[])
{intk,m,n,q,r,t=0;
floatsum=0;
chare[50],f[50],l[50],o[50],p[50];
printf("\n***************************************************\n");
printf("\n人民邮电出版社样书清单\n");
printf("\n***************************************************\n");
printf("请输入所购各图书的序号(输入0结束):
\n");
scanf("%d",&q);
do
{for(r=0;r{if(q==list[r].num)
{sum=sum+list[r].price;
t++;}
}
scanf("%d",&q);
}while(q!
=0);
printf("合计发书:
%d\n",r);
printf("收书单位:
");
scanf("%s",e);
printf("发书依据:
");
scanf("%s",f);
printf("价格:
%.2f\n",sum);
printf("邮政编码:
");
scanf("%d",&k);
printf("收货地址:
");
scanf("%s",l);
printf("联系电话:
");
scanf("%d",&m);
printf("制单日期:
");
scanf("%d",&n);
printf("货运公司:
");
scanf("%s",o);
printf("验书人:
");
scanf("%s",p);}
四、程序调试及整体实现
1.主菜单运行界面
连接,检错完毕后,运行程序,开始进入主菜单。
结果显示如下:
图5.主菜单界面
2.图书信息录入界面
在主菜单上选择“1”,根据提示录入图书信息。
屏幕显示如下:
图6.图书信息录入界面
3.图书信息浏览界面
在主菜单上选择“2”,显示以下全部图书信息并回到主界面。
图7.图书信息浏览界面
4.图书查询界面
在主菜单上选择“3”,然后根据提示选择查询方式。
选择“1”时,若图书名存在,则显示以下全部图书信息并回到主界面。
图8.按书名图书查询界面
选择“2”时,若图书作者存在,则显示以下全部图书信息并回到主界面。
图9.按作者图书查询界面
5.图书信息修改界面
在主界面上选择“4”,若图书序号存在,根据提示输入修改信息,显示以下结果:
图10.图书信息修改界面
在主菜单上选择“2”,显示修改后的信息。
6.图书信息删除界面
在主菜单上选择“5”,然后根据提示选择删除的图书序号。
若图书序号存在,则删除选择结果如下:
图11.图书信息删除界面
在主菜单上选择“2”,显示删除后的信息。
下图为删除后的信息:
图12.删除后结果
7.图书信息排序主界面
在主菜单上选择“6”,然后根据提示选择排序方式。
选择“1”时,按书名排序(根据英文字母排序)。
显示结果为:
图13.按书名排序结果
选择“2”,按价格排序(价格由高到低)。
排序结果如下:
图14.按价格排序结果
8.购书清单界面
在主菜单上选择“7”进入购书界面,选择想购书的序号最后输入“0”回车,即可显示购书数量和总价,根据提示输入相关信息完成清单。
购书清单如下:
图15.购书清单示例
五、体会总结
通过这次课程设计,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,我也发现我的好多不足之处,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,所以后在学习过程中,我会更加注视实践操作。
在课程设计过程中,收获知识,提高能力的同时,我也懂得怎么样去制定、实现计划,课程设计是培养学生综合运用所学知识发现提出分析和解决实际问题锻