c语言课程实践报告_第1页
c语言课程实践报告_第2页
c语言课程实践报告_第3页
c语言课程实践报告_第4页
c语言课程实践报告_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 报 告 课 程 名 称: 程序设计实践 专 业 班 级 : 电子信息工程 1204班 学 生 姓 名 : 陈 立 学 号 : 201216020407 任 课 教 师 : 张 苗 学 期 :2012-2013 学年第二学期 2 课程报告任务书 题 目 图书信息管理系统 主要 内容 开发一个图书信息管理系统,图书信息包括:图书编号、书名、作者、出版社、类 别、出版时间、价格等基本信息(也可以根据自己情况进行扩充,比如是否借出、 库存量等) 。使之能提供以下基本功能: (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分 总分成绩 评定 成绩评定教师: 3 1 需求分析 一个简单使用的图书管理系统,要求对图书信息的输入、保存、删除、浏览、查找等功 能,并及时建立和更新书库信息。每本书籍的基本信息包括:图书编号、类别、书名、作者、 出版社、出版时间和价格。 实际上要求我们运用函数、程序结构、文件、数据结构的相关知识完成一个简单的图书 管理系统的设计,使其具有能够浏览图书信息,查询图书信息(按编号、作者、价格) ,对 图书排序(按出版时间、价格) ,权限处理和统计图书信息的功能。 2 概要设计 数据结构并定义全局变量。 struct tushu_node /图书类型 int num; /编号 char leibie10; / 图书分类 char name30; /书名 char author20; /作者 char press20; /出版社 char time20; /出版时间 double price; /价格 ; (2)模块划分 1.int quanxian(); 核查权限模块 此模块在主函数 main()中实现,实现对使用权限的核实,如果无使用权限则程序结束自 动退出。若核实有使用权限,则直接返回主菜单 Inputchoice()模块,方便进行下面的操 作。 2.int inputchioce(); 显示主菜单模块 此模块实现对主菜单的输出和选择功能,此模块包含了如下: (1) luruxinxi(struct tushu_node*head) 录入图书信息模块 此模块分支有子菜单:1. luruxinxi_chuangjian(head) 创建 2. luruxinxi_shanchu(head) 删除 3. luruxinxi_xiugai(head) 修改 4 此三个子菜单是用指针对链表操作,分别进行创建新图书,删除图书,修改图书的先 关信息。 在 1.创建新图书中,用指针*p,*head 对链表的结点依次进行增加图书信息并调 用函数 save()实现存储但不覆盖以前信息的功能。 在 2.删除图书中,先遍历图书信息(调用 liulantushu(struct tushu_node *head)实现)然后输入要删除图书的编号,系统就会调用指针*p,*head 进行对符合图书 编号的结点进行查找,直到 p-numm=num后将需要删除图书前后两本书用链表连接起来, 并用 free(*)将相应的图书信息释放,已达到删除信息的目的。 在 3.修改图书中,又分 7个子菜单,实现对图书的 7项信息进行修改。同样用到 如上所述的遍历,用指针对结点的查找,然后修改相应的信息,如果是数则用 p- num=num实现修改,是字符串则用 strcpy(p-*,*)进行相应的修改。 (2) chaxuntushu(struct tushu_node*head) 查询图书信息的函数的模块 此模块中含有两个子菜单:1. chaxuntushu_num(head) 编号查询 2. chaxuntushu_name(head) 书名查询 在 1.编号查询中,将操作者输入需要查询的图书编号进行用指针*P 进行对图书编 号结点处 num的进行查找。当找到 p-num=num则将相应的图书信息输出到屏幕上。 在 2.书名查询中,将操作者输入需要查询的图书名称进行用指针*P 进行对图书名结 点处 name的进行查找。当找到 strcmp(p-name,name)=0则将相应的图书信息输出到屏幕 上。 (3) liulantushu(struct tushu_node *head) 浏览图书信息的函数的模块 此模块运用指针*P,将它指向头指针,并运用 while(p!=NULL)语句,使指针在链表中 查找,最后依次将指针 P指向的图书相关信息输出到屏幕上来,达到浏览图书的目的。此操 作也称为遍历图书信息,在程序中多处被调用。 (4) tushu_node * paixutushu(struct tushu_node *head) 图书排序的模块 此模块中包含两个子菜单:1. paixutushu_price(head) 价格排序 2. paixutushu_time(head) 时间排序 在 1.价格排序中调用四个指针*p1,*p2,*p3,*p4。分为 head!=NULL,p2!=NULL,以及 多本书共存时的不同状况排序。新建链表并运用指针进行冒泡排序,如若找到最小价格则将 它用 free(*)释放出来,再新建链表,再将指针 p1指向新建链表的标头 head然后进行 对比,再释放,直到 head=NULL结束排序。 (按图书价格由小到大对图书排序) 在 2.时间排序的算法也与上面算法类 似。 (按出版时间时间由小到大对图书排序) 5 (5) tongjitushu_shumu(struct tushu_node *head) 统计图书数目的模块 运用指针*P 对图书信息读取,用 while语句 n+进行统计图书的多少。 (6) void shiyongshuoming() 该系统使用说明模块 直接输出图书系统的具体说明 void save(); 保存链表为文件并覆盖信息模块 建立新的文本文件“1.txt” ,并指对其写入信息。 void save1(); 保存链表为文件但不覆盖信息的模块(只调用一次) 打开文本文件“1.txt”,对其进行追加。 struct tushu_node* wjtolb(); 从文件中读取数据并建立图书信息的链表的模块 建立链表,返回链表头结点 head 程序总体框架 主菜单 获得使用权限 录入图书信息 浏览图书信息 查询图书信息 为图书排序 统计图书数目 使用说明 创建图书信息 删除图书信息 修改图书信息 按编号查询 按书名查询 按价格排序 按出版时间排序 6 指针申请内存单元 P=(struct tushu_node*)malloc(size) Num!=0 P-next=NULL head=NULL head=p tail-next=p 输入图书的相关信息: num、name 插入编号、书名等 真 假 上图为建立图书信息链表,插入图书信息的流程图/下图为图书保存模块流程图 开始 输入预保留图书的相关信息 Head=p1 将指向结点的数据写入文件 “1txt” P1-next=p1 创建图书 P1!=NULL 假 假 3 详细设计 开始 head=tail=NULL Tail=p 返回链表指针 head 输入 num、name、press 等 结束 7 1. /* 主函数 */ int main() int chioce; chioce=quanxian(); /*核查用户是否有使用该管理系统的权限的函数*/ if(chioce=1) /*若取得权限 则返回值为 1 */ system(“cls“); inputchioce(); exit(0); 2. /* 主菜单 */ do printf(“+欢 迎 你+n“); printf(“*+主 菜 单 +*n“); printf(“* 1- 录入图书信息 * * 4- 为图书排序 *n“); printf(“* 2- 查询图书信息 * * 5- 统计图书 *n“); printf(“* 3- 浏览图书信息 * * 6- 帮助 *n“); printf(“* *0- 退出系统* *n“); printf(“*+*n“); printf(“恭喜你获得使用权限,请你选择:n“); scanf(“%d“, switch(mychioce) case 1:luruxinxi(head);break; case 2: chaxuntushu(head);break; case 3: liulantushu(head);break; case 4: head=paixutushu(head);break; case 5: tongjitushu_shumu(head);break; case 6: shiyongshuoming();break; case 0: printf(“ nn 谢谢你的使用!再见 nn“);break; default: system(“cls“);printf(“n 选择有误,请重新选择:n“); 8 inputchioce();break; while(mychioce!=0); 3. /*录入信息的函数*/ struct tushu_node * luruxinxi_chuangjian(struct tushu_node*head); /*创建图书信息的函数*/ struct tushu_node * luruxinxi_shanchu(struct tushu_node*head); /*删除图书信息的函数*/ struct tushu_node * luruxinxi_xiugai(struct tushu_node*head); /*修改图书信息的函数*/ int k; printf(“|+录入信息+|n“); printf(“| 1- 创建或添加图书信息 * * 2- 删除图书信息 |n“); printf(“|3- 修改图书信息 * * 0- 还回主菜单 |n“); printf(“请你再次选择具体操作:“); scanf (“%d“, switch(k) case 1:luruxinxi_chuangjian(head);break; case 2:luruxinxi_shanchu(head);break; case 3:luruxinxi_xiugai(head);break; case 0:inputchioce();break; default:system(“cls“);printf(“选择有误,默认返回主菜单,请重新选择:n“); inputchioce();break; 3.1 /*创建图书信息的函数*/ if(num!=0) scanf(“%s%s%s%s%s%lf“,leibie,name,author,press,time, while(num!=0) p=(struct tushu_node*)malloc(size); p-num=num; strcpy(p-leibie,leibie); 9 strcpy(p-name,name); strcpy(p-author,author); strcpy(p-press,press); strcpy(p-time,time); p-price=price; p-next=NULL; if(head=NULL) head=p; else tail-next=p; tail=p; printf(“请继续输入图书的 编号 类别 书名 作者 出版社 出版时间 价格 (以“0”结束输入): n“); scanf(“%d“, if(num!=0) scanf(“%s%s%s%s%s%lf“,leibie,name,author,press,time, if(num=0) /* 若判断数字为 0,则退出 */ system(“cls“);save1(head); /*保存录入的信息*/ inputchioce(); 3.2 /*删除图书信息的函数*/ struct tushu_node *ptr1,*ptr2; liulantushu(head); /*删除前 调用浏览图书的函数 进行遍历操作*/ while(head!=NULL head=head-next; free(ptr2); if(head=NULL) return NULL; ptr1=head; ptr2=head-next; 10 while(ptr2!=NULL) if(ptr2-num=numm) ptr1-next=ptr2-next; free(ptr2); else ptr1=ptr2; ptr2=ptr1-next; save(head); 3.3 /*修改图书信息的函数*/ liulantushu(head); /*修改图书信息之前的遍历操作*/ printf(“n输入需要修改的图书的编号:“); scanf(“%d“, printf(“nn“); printf(“*1-修改图书编号 * * *5-修改图书出版社 n“); printf(“*2-修改图书类别 * * *6-修改图书出版时间n“); printf(“*3-修改图书书名 * * *7-修改图书价格 n“); printf(“*4-修改图书作者 * * n“); printf(“nn“); if(head!=NULL scanf(“%d“, switch(t) case 1:printf(“ 请输入图书%d 的新编号:n“,numm); scanf(“%d“, head-num=num; break; case 2:printf(“ 请输入图书%d 的新类别:n“,numm); scanf(“%s“,leibie); strcpy(head-leibie,leibie); 11 break; case 3:printf(“ 请输入图书%d 的新书名:n“,numm); scanf(“%s“,name); strcpy(head-name,name); break; case 4: printf(“ 请输入图书%d 的新作者:n“,numm); scanf(“%s“,author); strcpy(head-author,author); break; case 5: printf(“ 请输入图书%d 的新出版社:n“,numm); scanf(“%s“,press); strcpy(head-press,press); break; case 6: printf(“ 请输入图书%d 的新出版时间:n“,numm); scanf(“%s“,time); strcpy(head-time,time); break; case 7: printf(“ 请输入图书%d 的新价格:n“,numm); scanf(“%lf“, head-price=price; break; default: system(“cls“); printf(“选择有误,默认返回主菜单,请重新选择:n“); inputchioce(); break; save(head); /*将修改后的信息进行保存*/ 4. /*浏览图书信息的函数*/ 12 struct tushu_node *p; p=head; if(head=NULL) printf(“书库为空n“); else printf(“nn编号 类别 书名 作者 出版社 出版时间 价格n“); while(p!=NULL) printf(“%dt%st%st%st%st%st%.2fn“,p-num,p-leibie,p-name,p- author,p-press,p-time,p-price); p=p-next; 5. /* 查询图书信息 */ void chaxuntushu_num(struct tushu_node*h); /*按编号查询图书*/ void chaxuntushu_name(struct tushu_node*h); /*按书名查询图书*/ int k; printf(“|+ 查询图书信息+|n“); printf(“| 1- 按编号查询图书信息 * * 2- 按书名查询图书信息 |n“); printf(“| 0- 还回主菜单 * |n“); printf(“请你再次选择具体操作:“); scanf (“%d“, switch(k) case 1: chaxuntushu_num(head);break; case 2: chaxuntushu_name(head);break; case 0: inputchioce();break; default: system(“cls“); printf(“选择有误,默认返回主菜单,请重新选择:n“); inputchioce();break; 13 5.1 /*按编号查询图书*/ 和 /*按书名查询图书*/ 类似的指针算法 int found,num; struct tushu_node *p; found=0; p=h; printf(“请输入需要查找的图书的编号:“); scanf( “%d“, printf(“n“); while(p!=NULL) if(p-num=num) printf(“n编号 类别 书名 作者 出版社 出版时间 价格n“); printf(“%dt%st%st%st%st%st%.2fn“,p-num,p-leibie,p-name,p- author,p-press,p-time,p-price); found=1; /*如果要查询的图书为头节点内的图书 输出后将标记 found变为 1*/ p=p-next; if(found=0) /* 若不为头节点 found 不变 继续往后面查找 */ printf(“编号为%d 的图书未找到!n“,num); wanmei(); /* 判断是否继续的函数*/ 6. /*为图书排序*/ int k; struct tushu_node * paixutushu_price(struct tushu_node *head); /* 为图书按价格排序的函数 */ struct tushu_node * paixutushu_time(struct tushu_node *head); /* 为图书按出版时间排序的函数 */ printf(“|+为图书按规则排序+|n“); printf(“|1- 按价格为图书排序 * * 2- 按出版时间为图书排序|n“); printf(“|0- 还回主菜单 * |n“); printf(“请你再次选择具体操作:“); scanf(“%d“, 14 switch(k) case 1: head=paixutushu_price(head);break; case 2: head=paixutushu_time(head);break; case 0: inputchioce();break; default: system(“cls“); printf(“选择有误,默认返回主菜单,请重新选择: n“); inputchioce();break; return head; 6.1 /*为图书按价格排序的函数*/和/*为图书按出版时间排序的函数*/ 算法相似 struct tushu_node *p1,*p2,*p3,*p4; if(head!=NULL) printf(“n编号 类别 书名 作者 出版社 出版时间 价格n“); while(head!=NULL) p1=head; p2=head-next; while(p2!=NULL) if(strcmp(p1-time,p2-time)next; else p1=p2; p2=p2-next; while(head!=NULL head=head-next; printf(“%dt%st%st%st%st%st%.2fn“,p4-num,p4-leibie,p4-name,p4- author,p4-press,p4-time,p4-price); free(p4); if(head!=NULL) p3=head; p4=head-next; 15 while(p4!=NULL) if(strcmp(p4-time,p1-time)=0) printf(“%dt%st%st%st%st%st%.2fn“,p4-num,p4-leibie,p4- name,p4-author,p4-press,p4-time,p4-price); p3-next=p4-next; free(p4); p4=p3-next; else p3=p4; p4=p4-next; head=wjtolb(head); else printf(“暂无图书n“); wanmei(); 7. /* 统计图书*/ if(head=NULL) printf(“书库为空n“); else while(p!=NULL) p=p-next; n+; printf(“共有%d 本图书“,n); wanmei(); /*判断是否继续的函数*/ 8. /*将链表保存为文件的函数 不覆盖以前的信息 */ if(fpp=fopen(“1.txt“,“a“)=NULL ) printf(“File open error!n“); exit(0); 16 while(p1!=NULL) fprintf(fpp,“%d%s%s%s%s%s%lfn“,p1-num,p1-leibie,p1-name,p1-author,p1- press,p1-time,p1-price); p1=p1-next; if(fclose(fpp) printf(“Can not close the file!n“); exit(0); 9. /* 判断是否继续的函数*/ int x=-1; printf(“nn是否继续操作?继续则返回主菜单 请选择(继续-1/退出-0)“); scanf(“%d“, if(x=1) system(“cls“);inputchioce(); if(x=0) printf(“nn谢谢你的使用! 再见n“);exit(0); if(x!=1 printf(“选择有误,默认返回主菜单,请重新选择:n“); inputchioce(); 17 4 调试分析 最初调试时,出现如下问题: 1. 打开浏览图书的时候,最后输入的一本图书总会在屏幕上出现两次输出。 针对这种情况,后来将原来“打开文件依次读到屏幕上关闭文件”改为了运用 全局定义的头指针 struct tushu_node*head,让*P 直接指向链表的头,然后用 while(p 指 向的链表头头不为空)来依次将图书信息读出,以此解决图书的浏览(遍历)问题。但是遍 历图书后不能插入判断是否继续的函数使系统变得更加的个性化(在修

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论