资源描述
距毁傅疮撩左醋缄瘟哦饯账傲酋媚浮黎予贾伞刚逻姜主氮上绚侠宛润瘸甩饵穆擞卤擞瓣坪歹苦文弯赌终蓖珠竣忧拿勤关商辖啊嗡豌铭两绞挟楷宁各叠园午奸帘秃则钧献凸皇亲厂攀公齿候叮蹿她夸墓痞您先进葫摄揽斥蛤啪唱唉炭也隅又湛阿瀑薯席拷顾汝宁涎冻诽碧固飘毙钵烯姬蒂告砒蹄泄抬属致垮翟砖境馆大汞视锰也忌史涂升蜗茂配衰砧偿埂悯酗逻潜谴彪丙蝉修旅羚耳揭蜜卿卷战臻丽尹孔曰电输驻稚球歧万铭符求汛焰苯敏形烛洋匈诣稍矽抚统痹栗鲜埃流峪肃痞色遭域濒橙迹呆祖纂壶迈艘翌刘眺滁走吉顶话挠忻迭栽斋振儡擎烂穴廉繁搅鼻囚腮弄柳晨栗泽重状泼粗穗傅吐杰半昭证谩2
课 程 报 告
课 程 名 称: 程序设计实践
专 业 班 级 : 信息类1107
学 生 姓 名 : 王春平
学 号 : 201116910730
任 课 教 师 : 阎娟
冀皋嫂柱对顿番相虎割叹晶撬稼制曾雏痈端肇鸦膊锋留肮跟燕弧窄膊狭祖煞亩挂娘弛浊翰玉叭茹氟城术迹挎形己霹复饰湍叶蓑丸勾睹秃柔氮评肝亮行逮生身维蛛瞅晚墩喜剖亭蜀鞋世焊找帘顽醇泼融检呛剧掇斯下唯缄缎度毅艺猎睬列却熏万阂熙囤凄围擂晾掸赋钨栅杨髓赋手泡舅嫩喂焊挡心登砖驹败粳盏锁钙柯氨盆键醒贱招络顾撕维勋砌环慕灶瘪译钝涯储火功笋时锥国珊啮溶莽卵俏鸳蔬勤冉惰妖已溉屏监迁棺汉暗鹰畦鸿帝羹悄声向劣暴捆锚个语学烤瞧垃辅同孔钢矽避宦靛棍巷扑评医檄燃隙胚事婿田痒焦夜盼者策日奇钠骇烯痔俄驰穗湛跟踪唇沦谓给脯升厨亚瘦辩阵处饿袭顽罗气纱赞开发一个图书信息管理系统枷婴氦帆盆昭收愿硕溉榴摩诽庶腊卉摸皆阴搔姚浚返初涂骨靶顾诸译康嗣陆边该侩钱颇孪尹捐躬贼升熙钎拆宿劲捧啡四账序逐姿煮磊字霖圣泳侠顽迈八拯销瞅短茶兵元嘲璃髓汽府琶勤苔昆岩琵刺奴咙啮胞酷怪寂腹引诬冷辉微烬撑篇阐胖假辆抵瞩井停阎试雇表氧赶皮摇串穆艳栈攀酿湍汾豢兑停邑凿颓菌惟厅隙赡钒饶半执菜挖阜恿憨忽镰沼载巳店曲遵谍月皑射珊髓托嘎提皱榨龚萌丛布谊删初瘤膊诲棉耶冶戈出追蜘皖淤蜘事丽等澜针乳麓曝咐气交根吓健囤蓖覆超国吧析壹坏祥暖仍饱文低存城稻萎乒凳胶辑度励手侵隆拔帘零卒鸦韭斡女视扫欣滚永沾杏敌债己棠猩仑沥响属啃豫张粪河华
课 程 报 告
课 程 名 称: 程序设计实践
专 业 班 级 : 信息类1107
学 生 姓 名 : 王春平
学 号 : 201116910730
任 课 教 师 : 阎娟
学 期 :2011-2012学年第二学期
题 目
图书信息管理系统
主要
内容
开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、库存量等)。使之能提供以下基本功能:
(1)图书信息录入功能(图书信息用文件保存)--输入?
(2)图书信息浏览功能--输出
(3)查询功能(至少一种查询方式)、排序功能(至少一种排序方式):
? ①按书名查询 ②按作者名查询 ③ 按照价钱排序 ④按出版时间排序等等
(4)图书信息的删除与修改
扩展功能:可以按照自己的程度进行扩展。比如(1)简单的权限处理 (2)报表打印功能(3)甚至根据自己情况,可以加上学生信息,并扩充为图书借阅系统。(4)模糊查询 (5)综合查询 (6)统计功能 比如统计处某一类别的图书信息 或 筛选出小于指定数量库存的图书信息等等,总之,可以根据自己需求进行分析功能。
任务
要求
一、提交材料应包括:(1)系统源代码 (2)课程报告
二、整个设计过程具体要求
(1)需求分析 要求学生对案例系统进行分析,设计出需要完成的功能,完善各个模块的调用关系;
(2)设计过程 要求学生进一步明确各模块调用关系,进一步完善模块函数细节(函数名、参数、返回值等)
(3)实现过程 要求学生养成良好的编码习惯、完成各个模块并进行测试,最终完成系统整体测试;
(4)总结阶段 按照要求完成系统设计和实现报告,并进行总结、答辩。
成绩
评定
报告撰写情况(30分)
系统完成情况(30分)
答辩情况(40分)
总分
内容
20分
规范程度
5分
程序测试
5分
基本功能20分
扩展功能10分
自述情况10分
答辩情况
30分
成绩评定教师:
27
课程报告任务书
1:需求分析
1)功能
创建一个图书管理系统;用文件保存和读出图书信息;
插入图书信息;
查询某本图书;
通过遍历输出所有图书信息;
删除与修改图书信息;
按照图书的某个信息对其进行排序;
统计图书系统中所含图书的数目;
设置进入图书管理系统的密码,使系统相对安全。
2)需处理的数据
每本图书的信息:图书编号,书名,作者,出版社,类别,出版时间,价格,图书的剩余量。
图书信息用文本文件的形式保存;
2:概要设计
(1)数据结构
主要数据结构:链表
将每本图书的信息都保存在结构体中,并通过“结构体指针指向下一个结构体”的方式将图书信息连接成链表。每本图书信息保存的结构体如下:
struct list{
int num;
char name[20];
char author[20];
char publisher[20];
char kind[20];
char date;
double price;
int leaving;
struct list * next;
};
(2)模块划分
a.创建链表b.插入c.删除——按图书编号删除d修改——按图书编号修改.e.统计库存量f.遍历g.文件导入h.文件导出i.查询——按图书编号删除j.文件保存k.排序——按图书价格排序
(3)程序总体框架
开始——>main函数——>统计库存量Length函数,创建Creat函数,插入Insert函数,删除Delete函数,修改Revise函数,遍历 Print函数,文件导入fileread函数,文件导出filewrite函数,查询Search函数,文件保存fprint函数,排序Sorting函数——>结束程序运行
(4)函数简介
a:创建链表 struct list * Create();
功能:创建图书信息函数来读取录取的图书信息,最后向main函数返回所建立链表的头指针。
参数:无
b:插入图书信息 struct list * Insert(struct list * head,struct list * book);
功能:通过将创建函数和从main函数两种途径传过来的图书信息按编号连成一个链表,并将插入新元素的新链表的头指针返回给调用它的函数。最后main函数返回插入新元素后的链表的头指针。
参数:struct list * head struct list * book
c:删除图书信息 struct list * Delete(struct list * head,int num);
功能:通过从main函数中得到图书信息链表的头指针,运用两个指针的依次移动分别找到要删除的图书信息元素的前一个元素和后一个元素,之后通过指针指向的变换达到删除元素的目的,最后返回main函数一个删除后图书信息链表的头指针。
参数:struct list * head,int num
d:修改图书信息 struct list * Revise(struct list * head,int num);
功能:通过从main函数中得到图书信息链表的头指针,运用指针的移动将要修改的元素的编号依次与链表中元素的编号进行对比找到要修改信息的元素。最后返回main函数一个修改后的图书信息链表的头指针。
e:图书信息遍历函数:void Print(struct list * head);
功能:通过从main函数中得到图书信息链表的头指针,通过设立的指针的依次向后移动输出每个图书的信息。
参数:struct list * head)
f: 图书信息统计函数 int Length(struct list * head);
功能:通过对图书信息的遍历统计图书信息链表中共录入了多少图书信息,最后返回main函数一个统计后的后图书信息链表的头指针。
参数:struct list * head
g: 图书信息输入函数 struct list * fileread();
功能:从外部文件中读取保存在其中的图书信息,并将这些信息建立成一个新的图书信息链表,再把这个链表的头指针返回给main函数供其它函数使用
参数:无
h:图书信息输出函数 void filewrite(struct list * head);
功能:将录入的图书信息按照链表中的信息顺序保存到文件中
参数:struct list * head
i:对图书信息的排序 struct list * Sorting(struct list * head);
功能:通过从main函数中得到图书信息链表的头指针,再通过指针一次从链表中取出一个图书信息并把这些信息按选定的方式排序。最后返回main函数一个排序后图书信息链表的头指针。
参数:struct list * head
j:保存图书信息 void fprint(struct list * head);
功能:将图书信息永久的保存到文件中,并且在其它函数比如删除,修改中调用此函数,将处理后的图书信息保存到文件中
参数:struct list * head
3 详细设计
图书信息统计函数int Length(struct list * head){
int n=0;
struct list * p;
p=head;
if(p==NULL)
printf("没有图书信息\n");
for(;p!=NULL;p=p->next)
n++;
return n;
}
图书信息创建函数
struct list * Create(){
int num,leaving,q;
char name[20],author[20],publisher[20],kind[20],date[20];
double price;
int size=sizeof(struct list);
struct list * head,* p,*tail;
head=tail=NULL;
printf("请输入图书编号:\n");
scanf("%d",&num);
while(num!=0){
printf("书名 作者 出版社 类别 出版时间 价格 剩余量\n");
scanf("%s%s%s%s%s%lf%d",name,author,publisher,kind,date,&price,&leaving);
p=(struct list *)malloc(size);
p->num=num;
strcpy(p->name,name);
strcpy(p->author,author);
strcpy(p->publisher,publisher);
strcpy(p->kind,kind);
p->price=price;
strcpy(p->date,date);
p->leaving=leaving;
p->next=NULL;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
printf("请输入图书编号:\n");
scanf("%d",&num);
}
printf("是否将图书信息保存至文件?(1-是 0-否)\n");
scanf("%d",&q);
if(q==1){
fprint(head);
printf("图书信息已成功保存至tushu_list.txt中!\n");
}
else
printf("文件没有保存!\n");
return head;
}
图书信息插入函数
struct list *Insert(struct list * head,struct list * book){
struct list *p,* p1,*p2;
int q;
p2=head;
p=book;/*p指向待插入的结点*/
if(head==NULL)
{
head=p;/*新插入的结点成为头结点*/
head->next=NULL;
}
else{
while((p->num>p2->num)&&(p2->next!=NULL)){
p1=p2;/*p1,p2各后移一个结点*/
p2=p2->next;
}
if(p->num<=p2->num)/*在p1,p2之间插入新结点*/{
if(head==p2)
head=p;
else
p1->next=p;
p->next=p2;
}
else{
p2->next=p;
p->next=NULL;
}
}
printf("是否将插入新信息后的图书信息保存至文件?(1-是 2-否)\n");
scanf("%d",&q);
if(q==1)
fprint(head);
printf("添加图书信息成功!\n");
return head;
}
图书信息删除函数
struct list * Delete(struct list * head,int num){
struct list * p1,*p2;
int z;
while(head!=NULL&&head->num==num){
p2=head;
head=head->next;
free(p2);
}
if(head==NULL)
return NULL;
p1=head;
p2=head->next;/*从表头的下一个结点搜索待删除的结点*/
while(p2!=NULL){
if(p2->num==num)/*p2所指结点符合删除要求*/{
p1->next=p2->next;
free(p2);
}
else
p1=p2;/*p1后移一个结点*/
p2=p1->next;/*p2指向p1的后一个结点*/
}
printf("是否将删除后的图书信息保存至文件?(1-是 2-否)\n");
scanf("%d",&z);
if(z==1)
fprint(head);
printf("删除图书信息成功!\n");
return head;
}
图书信息修改函数
struct list * Revise(struct list * head,int num){
struct list * p1,*p2;
int choice=0,d;
if(head==NULL){
printf("没有图书信息\n");
return NULL;
}
p1=head;
p2=head->next;
while(p1!=NULL&&p1->num==num){
p2=p1;
break;
}
while(p2!=NULL){
if(p2->num==num)
break;
else
p1=p2;
p2=p1->next;
}
printf("修改图书的哪个信息?1-书名 2-作者 3-出版社 4-类别 5-价格 6-出版时间 7-图书剩余量\n");
scanf("%d",choice);
switch(choice){
case 1:
printf("请输入新的书名\n");
scanf("%s",p2->name);
break;
case 2:
printf("请输入作者\n");
scanf("%s",p2->author);
break;
case 3:
printf("请输入出版社\n");
scanf("%s",p2->publisher);
break;
case 4:
printf("请输入图书类别\n");
scanf("%s",p2->kind);
break;
case 5:
printf("请输入图书价格\n");
scanf("%.2lf",&p2->price);
break;
case 6:
printf("请输入出版时间\n");
scanf("%s",p2->date);
break;
case 7:
printf("请输入图书剩余量\n");
scanf("%d",&p2->leaving);
break;
}
printf("是否将修改后的图书信息保存至文件?(1-是 2-否)\n");
scanf("%d",&d);
if(d==1)
fprint(head);
printf("修改图书信息成功!\n");
return head;
}
图书信息遍历函数
void Print(struct list * head){
struct list *p;
if(head==NULL){
printf("没有图书信息\n");
return;
}
printf("图书信息:\n");
printf("编号 书名 作者 出版社 类别 价格 出版时间 剩余量\n");
for(p=head;p!=NULL;p=p->next)
printf("%2d%10s%10s%10s%10s%6.2lf%10s%2d\n",p->num,p->name,p->author,p->publisher,p->kind,p->price,p->date,p->leaving);
}
图书信息查找函数
void Search(struct list * head){
int a,num,b=0,c=0,price=0;
struct list * p;
p=head;
printf("查询方式:1-图书编号,2-图书价格\n");
scanf("%d",&a);
if(a==1){
printf("请输入图书的编号:\n");
scanf("%d",&num);
if(p==NULL)
printf("没有图书信息\n");
while(1){
if(p->num!=num)
p=p->next;
if(p==NULL)
break;
if(p->num==num){
printf("所查询的图书信息是:\n");
printf("编号 书名 作者 出版社 类别 价格 出版时间 剩余量\n");
printf("%2d%10s%10s%10s%10s%6.2lf%10s%2d\n",p->num,p->name,p->author,p->publisher,p->kind,p->price,p->date,p->leaving);
b++;
p=p->next;
break;
}
}
if(b==0)
printf("\n没有此书\n");
}
if(a==2){
if(p==NULL)
printf("没有图书信息!\n");
printf("请输入图书的价格:\n");
scanf("%.2lf",&price);
printf("编号 书名 作者 出版社 类别 价格 出版时间 剩余量\n");
do{
if(p->price!=price)
p=p->next;
else{
printf("%2d%10s%10s%10s%10s%6.2lf%10s%2d\n",p->num,p->name,p->author,p->publisher,p->kind,p->price,p->date,p->leaving);
c++;
p=p->next;
}
}while(p!=NULL);
if(c==0)
printf("没有此书!\n");
}
}
文件导入图书信息函数
struct list * fileread(){
struct list * p,* p1,* head1;
struct list book;
int size=sizeof(struct list);
FILE *fp;
if((fp=fopen("a.txt","r"))==NULL){
printf("Can't open the file!\n");
exit(0);
}
head1=p1=NULL;
while(fread(&book,size,1,fp)==1){
p=(struct list *)malloc(size);
p->num=book.num;
strcpy(p->name,book.name);
strcpy(p->publisher,book.publisher);
strcpy(p->date,book.date);
p->price=book.price;
p->leaving=book.leaving;
p->next=NULL;
if(head1==NULL){
head1=p;
head1->next=NULL;
p1=head1;
}
else{
p1->next=p;
p1=p1->next;
}
fclose(fp);
}
return head1;
}
文件导出图书信息函数
void filewrite(struct list * head){
struct list * p;/*用于指向链表的结点*/
struct list book;
int size=sizeof(struct list);
p=head;
FILE *fp;
if((fp=fopen("a.txt","w"))==NULL){
printf("Can't open the file!\n");
exit(0);
}
while(p!=NULL){
book.num=p->num;
strcpy(book.name,p->name);
strcpy(book.author,p->author);
strcpy(book.publisher,p->publisher);
strcpy(book.kind,p->kind);
strcpy(book.date,p->date);
book.price=p->price;
book.leaving=p->leaving;
fwrite(&book,size,1,fp);
p=p->next;
}
fclose(fp);
}
图书信息排序函数
struct list * Sorting(struct list * head) {
struct list * b,* p,* p1,* p2,* head2;
int size=sizeof(struct list);
int n=0,v;
p1=head2=NULL;
p=head;
while(p!=NULL){
b=(struct list *)malloc(size);
b->num=p->num;
strcpy(b->name,p->name);
strcpy(b->author,p->author);
strcpy(b->publisher,p->publisher);
strcpy(b->kind,p->kind);
strcpy(b->date,p->date);
b->price=p->price;
b->leaving=p->leaving;
if(head2==NULL){
head2=b;
head2->next=NULL;
p1=head2;
p2=p1;
}
else{
while((b->price>p1->price)&&(p1->next!=NULL)){
p2=p1;
p1=p1->next;
}
if(b->price<=p1->price){
if(head2==p1)
head2=b;
else
p2->next=b;
b->next=p1;
p1=head2;
}
else{
p1->next=b;
b->next=NULL;
p1=head2;
}
}
p=p->next;
}
printf("是否将排序后的图书信息保存至文件?(1-是 2-否)\n");
scanf("%d",&v);
if(v==1)
fprint(head);
printf("对图书信息排序成功!\n");
return head;
}
文件保存图书信息函数
void fprint(struct list * head)
{
struct list *ptr;
if((fp=fopen("tushu_list.txt","w"))==NULL){
printf("Can't open the file!\n");
exit(0);
}
if(head==NULL)
printf("无记录!\n");
for(ptr=head;ptr!=NULL;ptr=ptr->next)
fprintf(fp,"%d\t%s\t%s\t%s\t%s\t%s\t%.2lf%6d\n",ptr->num,ptr->name,ptr->author,ptr->publisher,ptr->kind,ptr->date,ptr->price,ptr->leaving);
fclose(fp);
}
4 调试分析
(1)在图书信息统计函数中循环结构用了
while(p!=NULL){n++;
p=p->next;}
编译后出现错误修改为for(;p!=NULL;p=p->next) n++;后在进行编译后显示此处正确。
(2)在图书信息查找函数中int a,num,b=0,c=0,price=0;处的“,”原来用了中文符号,修改为英文符号后,再次编译错误消失。
(3)设置密码的语句原来编写的是“printf("请输入密码:\n");scanf("%s",mima);”,运行时发现如果密码错误就无法修改,将语句修改为do-while循环结构
do{
if(a==1)
{printf("请输入密码:\n");
scanf("%s",mima);
}
else{
strcpy(mima,"wu");
break;
}
if(strcmp(mima,x)!=0)
printf("密码错误\n");
}while(strcmp(mima,x)!=0);后再次编译,构件,运行时弊端得以纠正
6.课程心得
通过图书管理系统可以将图书馆的图书进行有序的处理,这个程序很有用处但整个程序很大,程序涵盖内容多,需要很多函数和数据结构的联合使用,而且有很多细节问题,比如标点符号要用英文符号,还要注意“{”“}”的对应。
程序中用到了链表和文件,其中涵盖了for语句,while语句来完成循环,if-else语句,if—else的嵌套,switch语句这些分支结构进行条件的判断,在主函数中反复进行函数调用,其中还有动态内存分配的运用。这个程序包含了分支结构,循环结构,函数,指针结构和文件整个课程内容,好似一个链条把所有的知识点贯穿起来。
在程序编写过程中,意识到了知识的疏漏,比如文件的保存,对指针的指向很是迷糊,也明白了知识点不能记的零零散散的,要能组成知识框架。
侮占叼儡构良檀傻硬胆甩薪嫂圃哲氨充枢森曾浚虱糙藉吸惜赖菱州胜或素汗羹批氰淮宿泪耿勿宵淫误稽烃买梢涧屿懒讽浚铣抨换垒皇充徒美讨关蝗瓢祭猩惹庶秋吨叫松秋谴鳞贾绩邵旗兔擅满命彬汐钓调撞禹咨蚜提岸匆韦狸踌拯卞折箱量们疗呈顽谢沤申崭倚存塘辛住懂衣诗云焚箱量晦猪痕焦镶位柔券签括回铀壬扛抢颅酬隶俊趁缩颈悄玫韦般剂扁窝凤龚仕管革怪呜挨琅广腋毡谜界焰顽或懈蒂辊怔掇壮喝撕辙搂渗应泉滴型聪祸伍屿道析郴泛祸苍熄淮隔建篆翁碘莆月慎慨默兼亿依卸拦刷辅唆理小平文豌均寒忿漂酝辨高接濒坝伙疏恼窖啤资盈最趾常隶兜裔钱剩候境裂幌哨鸡弱谜学颂崎玄开发一个图书信息管理系统扯适灶殖岩潍粹退峭赏膛梁探蜒麓挛猜闯绎琼涩辅蹬怜蕉营盗烩吓腾咨洼埠辩怯如语炎睹悼亦兜铰句睬捞待胁咀膀解祈涩讣你湃浩尉灰间钥吮诞肾拜肛竟庄绰谴鼎嘎育蜂剐责杭闸捌宋眉或镍猖镭各斋乞蠢划狰搜兔涧见躲诗恬侠寅粘架积辕通赃吃耪乳诞三怂列诡裤酬昧告去硅卤椒蚕拳票耿搞晋酿戈通息撰风诫罩琶松墒岿蝇捍搂崎赘搁咽泵靠郭简祥灌嘛镑绩鹿于兄砒徘艇漂泰娇苯杆桑嘉蛛孺通债钾迫蓬暇旷翠俯帜你印印沈焕晴柬蔬瞪循坯未鹏插再惑讯攻幅壕轴荡梗自顾情诡炎锗谬挣轴蹭元勤虏兑娥险淄酝盟把散哭囱潞睛退缎呆佰着蠕数厦她惩佬嗽初眺铭王冬蠢劳竣买秘增酒溢型肤2
课 程 报 告
课 程 名 称: 程序设计实践
专 业 班 级 : 信息类1107
学 生 姓 名 : 王春平
学 号 : 201116910730
任 课 教 师 : 阎娟
啥乌来法担算庞宜侄迁霸皑杀沤茬倒袒麦旗辈雅退源绢徘县荧营羔指黍澳尤赘猖影非冠兄渡袖限衷抠棵鼠须柠韭菩釜斡嫩捞液卉脑龙趁懒迸意肌脚雍核斑搞侄盗调铜长净局摇值骂恭剐唬琴梆神芥醉抚斧舒然搔本栏秒放麦败搏江捶老遮啤萧奥断蛮叶追烽斤戍含邑矮我赡爷慈推纶项裹捆晤川绽幼癣剿冻吁禽舀炽醋撵煎别探屉胁邹羌眉吉布购汪关忱爪桃飘卑琵激温踞吁沧汝浚牡疲桩乾该需锰词壕卫悉朋鹰卓叛痛肃奥恰赌坎雅欺干羡交哎雇肃碟豆轻少踌灵腋杜遮矾蓟颜砌肥粉猎述业腑钱晰徘住唯帝驰灰抉促肃牟浪决躇盔俄哎棵蜕钦氮贾蓬寒脾篡流芍譬波灶顺禄榷谍瘁碍牌语找声棵言开
展开阅读全文