资源描述
课 程 报 告
课 程 名 称: 程序设计实践
专 业 班 级 : 计算机科学与技术1205班
学 生 姓 名 : 雷原康
学 号 : 201216010522
任 课 教 师 : 陈卫东
学 期 :2012-2013学年第二学期
课程报告任务书
题 目
图书信息管理系统
主要
内容
开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。使之能提供以下基本功能:
(1)图书信息录入功能(图书信息用文件保存)--输入v
(2)图书信息浏览功能--输出
(3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式):
l ①按书名查询 ②按作者名查询 ③ 按照价钱排序 ④按出版时间排序等等
(4)图书信息的删除与修改
扩展功能:可以按照自己的程度进行扩展。比如(1)简单的权限处理 (2)报表打印功能(3)甚至根据自己情况,可以加上学生信息,并扩充为图书借阅系统。(4)模糊查询 (5)综合查询 (6)统计功能 比如统计处某一类别的图书信息 或 筛选出小于指定数量库存的图书信息等等,总之,可以根据自己需求进行分析功能。
任务
要求
一、提交材料应包括:(1)系统源代码 (2)课程报告
二、整个设计过程具体要求
(1)需求分析 要求学生对案例系统进行分析,设计出需要完成的功能,完善各个模块的调用关系;
(2)设计过程 要求学生进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等)
(3)实现过程 要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试;
(4)总结阶段 按照要求完成系统设计和实现报告,并进行总结、答辩。
成绩
评定
报告撰写情况(30分)
系统完成情况(30分)
答辩情况(40分)
总分
内容
20分
规范程度
5分
程序测试
5分
基本功能20分
扩展功能10分
自述情况10分
答辩情况
30分
成绩评定教师:
24
1. 需求分析
经过大一上学期的理论学习,在基础实验的基础上,本学期我们继续开设了C语言程序设计实践课。课程要求我们对已经学习的基础实验进行整合与衔接处理,并最终形成一个系统性质的规模较大的程序。
本次课程设计要求我们达到能独立完成一个图书管理系统,完成后要求实现的功能有对图书信息的录入、删除、修改,浏览(即输出), 按某种方式查询(要求至少一种查询方式),按某种方式排序(要求至少一种排序方式)。当然,我们可以根据自己的能力对系统进行完善性的拓展,例如自己加入简单的权限处理,统计功能,模糊查询等,甚至可以拓展为图书借阅系统。
通过整个程序的开发过程,最终使我们掌握利用计算机解决实际问题的基本方法,熟悉C语言开发的全过程,提高综合应用C语言的能力、编程和调试能力,为学习计算机后续课程打好专业基础。
2. 概要设计
1. 系统采用的是结构数组数据系统,用于实现图书信息的存放,修改,排序等功能。
用二进制文件保存已写入的信息。
2. 模块划分:
① void AddNewbook图书信息录入系统
② void Rprint图书信息浏览系统
③ void Querybook图书信息查询系统:void numnode1-书籍编号查找 .2-书名void namenode查找.3-void writer作者查找.4-void press出版社查找.5-void fuzzy模糊查找.
④ void paixu 图书信息排序系统:1-价格排序2-时间排序
⑤ Voide xiugai图书信息修改系统
⑥ Void shanchu图书信息删除系统
7 图书信息统计系统:1-void sorttongji书籍类别统计.2-void kuno库存低于标准统计
3. 程序框架
① 进行录入图书信息
② 录入后进行浏览系统
③ 然后根据需要分别进行查询,排序,修改,删除,统计功能
3. 详细设计:
1. 定义图书结构:
typedef struct book{
long num;//书的序号
char name[MAX];//书名
char time[MAX];//出版时间
char writer[MAX];
double price;
char press[MAX];//出版社
char sort[MAX];
int kucun;//库存量
}book;
2. 图书录入系统:
void AddNewbook(FILE *fp){//*添加书籍
system("cls");
int a;
if((fp=fopen("图书信息.txt","a+"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
book newbook;
printf("(-1代表结束)");
while(a!=-1){
printf("输入书籍编号:");
scanf("%ld",&newbook.num);
printf("输入书名:");
scanf("%s",newbook.name);
printf("输入出版时间:");
scanf("%s",newbook.time);
printf("输入作者:");
scanf("%s",newbook.writer);
printf("输入价格:");
scanf("%lf",&newbook.price);
printf("输入出版社:");
scanf("%s",newbook.press);
printf("输入书籍种类:");
scanf("%s",newbook.sort);
printf("输入库存量:");
scanf("%d",&newbook.kucun);
fwrite(&newbook,size,1,fp);
scanf("%d",&a);}
fclose(fp);
}
3. 图书浏览系统
void Rprint(FILE *fp){//图书信息浏览
system("cls");
if((fp=fopen("图书信息.txt","r+"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);}
book log;
printf("书籍编号 书名 出版时间 作者 价格 出版社 种类 库存量 \n");
while(!feof(fp)){
fread(&log,sizeof(book),1,fp);
printf("%8ld %s %6s %10s %.2lf %s %s %d \n", log.num,log.name,log.time,log.writer,log.price,log.press ,log.sort,log.kucun); }
4. 图书查询系统
一.按编号查找
void numnode(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
long num;
int i=0;
book chaxun;
printf("Enter num:");
scanf("%ld",&num);
while(!feof(fp)){
fread(&chaxun,size,1,fp);
if(num==chaxun.num){
printf("%ld\t%s\t%s\t%s\t",
chaxun.num,chaxun.name,chaxun.time,chaxun.writer);
printf("%.2lf\t%s\t%d\n",
chaxun.price,chaxun.sort,chaxun.kucun);
i=1;
}
}
if(i!=1)
printf("对不起,没有你想要查找的书籍。\n");
fclose(fp);
}
二.按书名查找
void namenode(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
int i=0;
char name[MAX];
book chaxun;
printf("Enter name:");
scanf("%s",name);
while(!feof(fp)){
fread(&chaxun,size,1,fp);
if(strcmp(name,chaxun.name)==0){
printf("%ld\t%s\t%s\t%s\t%.2lf\t%s\t%d\n",
chaxun.num,chaxun.name,chaxun.time,chaxun.writer,
chaxun.price,chaxun.sort,chaxun.kucun);
i=1;
}
}
if(i!=1)
printf("对不起,没有你想要查找的书籍。\n");
fclose(fp);
}
三.按作者名查找
void writernode(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
int i=0;
char writer[MAX];
book chaxun;
printf("Enter writer:");
scanf("%s",writer);
while(!feof(fp)){
fread(&chaxun,size,1,fp);
if(strcmp(writer,chaxun.writer)==0){
printf("%ld\t%s\t%s\t%s\t%.2lf\t%s\t%d\n",
chaxun.num,chaxun.name,chaxun.time,chaxun.writer,
chaxun.price,chaxun.sort,chaxun.kucun);
i=1;
}
}
if(i!=1)
printf("对不起,没有你想要查找的书籍。\n");
fclose(fp);
}
四.按出版社查找
void pressnode(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
int i=0;
char press[MAX];
book chaxun;
printf("Enter press:");
scanf("%s",press);
while(!feof(fp)){
fread(&chaxun,size,1,fp);
if(strcmp(press,chaxun.press)==0){
printf("%ld\t%s\t%s\t%s\t%.2lf\t%s\t%d\n",
chaxun.num,chaxun.name,chaxun.time,chaxun.writer,
chaxun.price,chaxun.sort,chaxun.kucun);
i=1;
}
}
if(i!=1)
printf("对不起,没有你想要查找的书籍。\n");
fclose(fp);
五.模糊查询
void fuzzy(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
int k=0;
char zifu[MAX];
book chaxun;
printf("输入关键字:");
getchar();
int i,j;
for(i=0;(zifu[i]=getchar())!='\n';i++);
zifu[i]='\0';
while(!feof(fp)){
fread(&chaxun,size,1,fp);
for(i=0;zifu[i]!='\0';i++)
for(j=0;chaxun.writer[j]!='\0';j++)
if(zifu[i]==chaxun.writer[j]){
printf("%ld\t%s\t%s\t%s\t%.2lf\t%s\t%d\n",
chaxun.num,chaxun.name,chaxun.time,chaxun.writer,
chaxun.price,chaxun.sort,chaxun.kucun);
k=1;}
}
if(k!=1)
printf("对不起,没有你想要查找的书籍。\n");
fclose(fp);}
4. 排序功能
一 按价钱排序
void price(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
int n;
int i=1,j;
n=tongji(fp);
book t;
book paixu[MAX];
while(!feof(fp)){
fread(&paixu[i],size,1,fp);
i++;}
for(i=1;i<n;i++)
for(j=1;j<n-i;j++)
if(paixu[j].price>paixu[j+1].price){
t=paixu[j];
paixu[j]=paixu[j+1];
paixu[j+1]=t;}
for(i=1;i<n;i++)
printf("%ld\t%s\t%s\t%s\t%.2lf\t%s\t%d\n",
paixu[i].num,paixu[i].name,paixu[i].time,paixu[i].writer,
paixu[i].price,paixu[i].sort,paixu[i].kucun);
fclose(fp);
}
二.按时间排序
void time(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
int n;
int i=1,j;
n=tongji(fp);
book paixu[MAX],t;
while(!feof(fp)){
fread(&paixu[i],size,1,fp);
i++;}
for(i=1;i<=n;i++)
for(j=1;j<=n-i;j++)
if(strcmp(paixu[j].time,paixu[j+1].time)>0){
t=paixu[j];
paixu[j]=paixu[j+1];
paixu[j+1]=t;}
for(i=1;i<n;i++)
printf("%ld\t%s\t%s\t%s\t%.2lf\t%s\t%d\n",
paixu[i].num,paixu[i].name,paixu[i].time,
paixu[i].writer,paixu[i].price,paixu[i].sort,paixu[i].kucun);
fclose(fp);
}
三.排序选择
void paixu(FILE *fp){
int choice=-1;
printf("1-价格排序\n2-时间排序\n");
scanf("%d",&choice);
switch(choice){
case 1:price(fp);break;
case 2:time(fp);break;
default:printf("error\n");break;}}
5. 修改功能
void bookxiugai(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
FILE *t;
int n=0;
int i=0;
if((t=fopen("图书信息.txt","r+"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
long num;
int choice;
book xiugai;
book duqu;
printf("输入要修改书的编号:");
scanf("%ld",&num);
while(!feof(t)){
i++;
fread(&duqu,size,1,t);
if(num==duqu.num){
printf("请输入修改后的书籍信息:\n");
printf("请输入书籍编号:");
scanf("%d",&xiugai.num);
printf("请输入书名:");
scanf("%s",xiugai.name);
printf("请输入作者:");
scanf("%s",xiugai.writer);
printf("请输入出版时间:");
scanf("%s",xiugai.time);
printf("请输入价格:");
scanf("%lf",&xiugai.price);
printf("请输入出版社:");
scanf("%s",xiugai.press);
printf("请输入书籍种类:");
scanf("%s",xiugai.sort);
printf("请输入库存量:");
scanf("%d",&xiugai.kucun);
n=i;
}}
fseek(t,(n-1)*size,0);
printf("1-确认修改。\n其他数字-取消修改。");
scanf("%d",&choice);
if(choice==1){
fwrite(&xiugai,size,1,t);
printf("修改成功!\n");}
6. 删除功能
void bookshanchu(FILE *fp){
FILE *t;
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
int i=1,n;
long num;
n=tongji(fp);
book duqu[MAX];
printf("请输入书籍编号:");
scanf("%ld",&num);
while(!feof(fp)){
fread(&duqu[i],size,1,fp);
i++;}
if((t=fopen("图书信息.txt","w"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
for(i=1;i<n;i++){
if(num!=duqu[i].num){
fwrite(&duqu[i],size,1,t);
}
}
fclose(t);
fclose(fp);}
7.。统计功能
一.按类别统计
void sorttongji(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
int i=0;
char sort[MAX];
book sor;
printf("请输入书籍类别:");
scanf("%s",sort);
while(!feof(fp)){
fread(&sor,size,1,fp);
if(strcmp(sort,sor.sort)==0)
i++;
}
printf("本类别的书籍种类有%d\n",i);
fclose(fp);
}
二.按库存标准统计
void kuno(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
int n;
book kcun;
printf("请输入标准库存量:");
scanf("%d",&n);
while(!feof(fp)){
fread(&kcun,size,1,fp);
if(n>kcun.kucun)
printf("%ld\t%s\t%s\t%s\t%.2lf\t%s\t%d\n",
kcun.num,kcun.name,kcun.time,
kcun.writer,kcun.price,kcun.sort,kcun.kucun);
}
fclose(fp);
}
三.统计选择函数
void tongjixinxi(FILE *fp){
if((fp=fopen("图书信息.txt","r"))==NULL){
printf("不能打开图书信息管理系统!\n");
exit(0);
}
int choice;
printf("1-书籍类别统计.\n2-库存低于标准统计.\n");
scanf("%d",&choice);
switch(choice){
case 1:sorttongji(fp);break;
case 2:kuno(fp);break;
default:printf("error\n");break;
}
}
4.调试分析:
问题一 界面不美观,进入一次系统只能进行一项操作的问题
解决方法 通过将主菜单与清屏函数(system(“cls”))一起,在每次进行完一次具体操作后都能出现printf("Enter your choice:\n");
问题二: 浏览图书信息时编号等文字与下面的图书信息不对应
解决办法:文字与文字间的间隔与字符字符间的间隔一致
问题三:一些小错误比如单词前后拼写错误
解决办法:反复调试修改
问题四:在查询中由于回车符释放过多使信息录入异常
解决办法:去掉多余的getchar()
问题五:输入时无法结束输入的问题
解决办法:由于在输入时时先输入图书的编号,所以在输入时除了输入第一本图书的信息,
即在输入第一本图书之后在输入时先输入图书的编号,加上一个判断循环while(num!=-1)才继续输入完这本图书的其他信息,即-1可以作为输入结束标志.
5. 测试结果
一界面
2.录入图书
3.浏览图书
4按编号查询图书
5按书名查询
6. 按出版社查找
7.按价格排序
8按出版时间排序
9按书籍类别统计
10库存低于标准统计
11. 图书信息修改
修改后浏览图书
12图书删除,删除3后的浏览
6. 课程心得总结
经历了几个星期的课程设计,从设计前期的不知如何下手到开始设计时的各种错误的困扰再到一个个的攻破各个问题,最后到对程序的进一步完善与课程报告的撰写。这一段时间我们由被程序困扰到几乎崩溃到最后成就感的油然而生;从一整天的坐在电脑屏幕面前到现在的带着喜悦一遍一遍运行着程序;一遍遍的互相探讨解决大家遇到的问题到越来越发现编程的有意思,我到现在真的感觉认真自己做完这样一个系统收获颇大:
1. 对结构化程序设计与函数的嵌套调用有了更清晰具体的认识;
2. 引入了文件知识可以对电脑硬盘上的数据操作,改变了对C语言的狭义认识,认识 到C语言实际上还可以实现更复杂丰富的功能来利用开发的软件来进一步实现对现实中的问题的解决;
3.学习到C语言的学习一定不不能忽视一个很小很小的细节,因为完全会导致不同的结果
对如何用C语言来完成一个较大的系统的整体思路有清晰的认识
展开阅读全文