图书信息管理系统课程设计报告--C语言程序设计德州学院计算机系课程设计报告实习名称程序设计课程设计设计题目图书信息管理系统实习时间2010.06.27-2010.07.04专业班级网络工程指导老师教学单位(盖章)小组分工情况:二O一O年七月五日课程设计报告正文内容及格式要求:1、正文部分主要包括:选题背景、论点或方案论证、过程(设计或实验)论述、结果分析、结论或总结。
2、标题:题目用小二号黑体字(加黑),居中;副标题用三号黑体字,紧挨正标题下居中,文字前加破折号。
英文题目为18磅加粗Times New Roman字,副标题为16磅加粗Times New Roman字。
3、课程设计报告格式要求:一级标题用小三号黑体字;二级标题用四号黑体字;三级标题用小四号黑体字;正文用宋体小四号字(英文用12磅Times New Roman字),采用1.5倍行距,标准字符间距:页码一律用小5号字标明。
4、课程设计报告撰写要求:(1)文字通顺,语言流畅,能将设计过程表述清楚。
(2)图表整洁,布局合理,须按国家规定的绘图标准绘制。
(3)报告字数不少于3千字。
C语言程序设计报告---图书管理系统一、实验准备做系统前,首先,自己详细看了《C程序设计教程》(教科书)的第十章《文件》,基本自学会了文件的相关内容,理解了相关函数的用法和作用;另,上网查询了很多相关资料,还有找了很多相关的系统,都详细的看了一遍,加深了对C的理解以及对文件的相关内容进一步理解。
学习了C语言的内容,图书信息管理系统有助于C语言学习的进一步巩固,在本系统可以增强对指针、数组、文件、函数等基本知识的进一步理解。
另外图书信息管理系统也是学校常用的基本系统之一,它有助于学校对图书馆书籍的基本管理。
二、功能简介图书信息管理系统是对图书信息的基本管理,它包括:图书信息的输入、图书信息的修改及删除、图书信息的查询、图书信息的添加、图书信息的浏览。
使用模块化编程的方法每项功能有一个或多个函数组合来完成.三、系统与性环境系统可以在MicrosoftVisualC++6.0软件运行,硬件基本无要求,现在的计算机基本都可以运行该系统。
四、功能划分及详细说明主要算法的设计:(1) 主函数的算法设计首先,运行程序,进入菜单,然后选择操作(运用swith语句),调用各子函数。
在返回操作中运用while 语句进行控制返回菜单。
(2) 各子函数的算法设计1、图书信息的输入函数函数假真2、图书信息的修改3、图书信息的查询void search()选择查询方式,1按书号查询,2按书名查询,然后定位,再调用输出函数;4、图书信息的浏览首先,输出所有图书的信息,并输出图书记录数,然后调用辅助函数进行菜单选择,操作完成后返回主菜单。
5、图书信息的添加首先,从文件中调用函数读入函数,再输入要添加数,然后添加图书信息,并保存。
上机调试过程:在调试过程中出现了许多的错误!特别是在查询、修改删除这2个函数的调上花费了很多时间,主要是文件的写入与读出以及菜单调试的问题,还有建立新的链接也出现问题,说明自己对程序的执行过程理解不够深刻。
五、源程序#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>#define LEN sizeof(stu)typedef struct student{long number;char name[10];char sex[3];int age;float chinese;float math;float english;float sum;float average;struct student *next;}stu;book *creat(void);book *changes(book *head);book *modify(book *head,long num);book *del(book *head,long num);book *insert(book *head,book *stud); book *input(book *head,book *p1);void sort(book *head);void total_average_sort(book *head); void chinese_sort(book *head);void math_sort(book *head);void english_sort(book *head);void print(book *head);void Statistics(book *head);void search(book *head);void numsearch(book *head,long num); void namesearch(book *head,char name[]); int n;book *creat(void){book *head,*p1,*p2;n=0;p1=p2=(book *)malloc(LEN);printf("请输入图书信息!\n");head=NULL;p1=input(head,p1);while(p1->number!=0){n=n+1;if(n==1) head=p1;else p2->next=p1;p2=p1;p1=(book *)malloc(LEN);p1=input(head,p1);}p2->next=NULL;return(head);}book *input(book *head,book *p1)/*输入图书的信息*/{int i,f,k;book *p2;loop:printf("图书号(为整数,输入0时返回上一级):");scanf("%ld",&p1->number);if(p1->number<0){printf("图书号不能为负数,请重新输入!\n");goto loop;}else{if(p1->number==0)return(p1);else{p2=head;f=0;for(i=1;i<=n;i++){if(p1->number==p2->number){f=1;break;}p2=p2->next;}}if(f){printf("图书不能重复,请重新输入!\n");goto loop;}}printf("书名:");scanf("%s",p1->name);loop1:printf("类别: 1.文科 2.理科 \n");printf("请选择类别:");scanf("%d",&k);switch(k){case 1:strcpy(p1->sex,"文科");break;case 2:strcpy(p1->sex,"理科");break;default:printf("类别只能是“文科”或“理科”,请重新输入!\n");goto loop1;}printf("存期:");scanf("%d",&p1->age);while(p1->age<0||p1->age>120){printf("你输入的存期不符合实际情况,请重新输入!\n");printf("存期:");scanf("%d",&p1->age);}printf("章数:");scanf("%f",&p1->chinese);while(p1->chinese<0||p1->chinese>100){printf("你输入的章数不符合实际情况,请重新输入!\n");printf("章数:");scanf("%f",&p1->chinese);}printf("页数:");scanf("%f",&p1->math);while(p1->math<0||p1->math>100){printf("你输入的页数不符合实际情况,请重新输入!\n");printf("页数:");scanf("%f",&p1->math);}printf("阅读次数:");scanf("%f",&p1->english);while(p1->english<0||p1->english>100){printf("你输入的阅读次数不符合实际情况,请重新输入!\n");printf("阅读次数:");scanf("%f",&p1->english);}p1->sum=p1->chinese+p1->math+p1->english;p1->average=p1->sum/3;return(p1);}void search(book *head){int k;long num;char name[10];if(n==0){printf("数据库为空,没有图书的记录!\n");return;}else{do{printf("1. 按书号查找 2. 按书名查找 0. 返回上一级\n");printf("请选择:");scanf("%d",&k);switch(k){case 1:do{printf("书号(输入0时跳出按书号查找):");scanf("%ld",&num);if(num==0)break;else{if(num>0)numsearch(head,num);elseprintf("输入错误,请重新选择!\n");} }while(1);break;case 2:do{printf("书名(输入0时跳出按书名查找):");scanf("%s",name);printf("书号\t书名\t类别\t存期\t章数\t页数\t阅读次数\t总次数\t平均次数\n");namesearch(head,name);}while(strcmp(name,"0")!=0);break;case 0:break;default:printf("输入错误,请重新选择!\n");}}while(k!=0);}}void numsearch(book *head,long num){book *p1;p1=head;while(p1!=NULL){if(num==p1->number){printf("书号\t书名\t类别\t存期\t章数\t页数\t阅读次数\t总次数\t平均次数\n");printf("%ld\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p1->number, p1->name,p1->sex,p1->age,p1->chinese,p1->math,p1->english,p1->sum,p1 ->average);return;}p1=p1->next;}printf("没有找到你要查找的图书信息!\n");}void namesearch(book *head,char name[]){int a=1;book *p1;p1=head;while(p1!=NULL){if(strcmp(name,p1->name)==0){printf("%ld\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p1->number, p1->name,p1->sex,p1->age,p1->chinese,p1->math,p1->english,p1->sum,p1 ->average);a=0;}p1=p1->next;}if(a)printf("没有找到你要查找的图书信息!\n");}book *changes(book *head){book *p1;int k;long num;do{printf("1. 修改 2. 删除 3. 插入 0. 返回上一级\n");printf("请选择:");scanf("%d",&k);switch(k){case 1:do{if(n==0){printf("数据库为空,没有图书的记录!\n");break;}else{printf("请输入图书的书号(书号应为整数,输入0时跳出修改数据):");scanf("%ld",&num);if(num==0)break;else{if(num>0)head=modify(head,num);elseprintf("书号不能为负数,请重新输入!\n");} }}while(1);break;case 2:do{if(n==0){printf("数据库为空,没有图书信息!\n");break;} else{printf("请输入要删除的图书的书号(书号应为整数,输入0时跳出删除元素):");scanf("%ld",&num);if(num==0)break;else{if(num>0)head=del(head,num);elseprintf("书号不能为负数,请重新输入!\n");} }}while(1);break;case 3:printf("请输入图书信息!\n");p1=(book *)malloc(LEN);p1=input(head,p1);while(p1->number!=0){head=insert(head,p1);print(head);printf("请输入图书信息!\n");p1=(book *)malloc(LEN);p1=input(head,p1);}break;case 0:break;default:printf("输入错误,请重新输入!\n");}}while(k!=0);return(head);}void sort(book *head){int k;if(n==0){printf("数据库为空,没有图书记录!\n");return;}do{printf("1.按书号排序 2.按总次数和平均次数排序 3.按章数成绩排序 4.按页数排序 5.按阅读次数排序 0.返回上一级\n");printf("请选择:");scanf("%d",&k);switch(k){case 1:print(head);break;case 2:total_average_sort(head);break;case 3:chinese_sort(head);break;case 4:math_sort(head);break;case 5:english_sort(head);break;case 0:break;default:printf("输入错误,请重新输入!\n");}}while(k!=0);}void total_average_sort(book *head){book *p1,*p2;int j=0;float max,k=301;printf("书号\t书名\t类别\t存期\t章数\t页数\t阅读次数\t总次数\t 平均次数\n");do{max=0;for(p1=head;p1;p1=p1->next)if(p1->sum>max&&p1->sum<k){max=p1->sum;p2=p1;}k=max;for(p1=p2;p1;p1=p1->next)if(p1->sum==max){printf("%ld\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p1->number, p1->name,p1->sex,p1->age,p1->chinese,p1->math,p1->english,p1->sum,p1 ->average);j++;}}while(j<n);}void chinese_sort(book *head){int j=0;float k=101,max;book *p1,*p2;printf("书号\t书名\t类别\t存期\t章数\t页数\t阅读次数\t总次数\t 平均次数\n");do{max=0;for(p1=head;p1;p1=p1->next)if(p1->chinese>max&&p1->chinese<k){max=p1->chinese;p2=p1;}k=max;for(p1=p2;p1;p1=p1->next)if(p1->chinese==max){printf("%ld\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p1->number, p1->name,p1->sex,p1->age,p1->chinese,p1->math,p1->english,p1->sum,p1 ->average);j++;}}while(j<n);}void math_sort(book *head){int j=0;float k=101,max;book *p1,*p2;printf("书号\t书名\t类别\t存期\t章数\t页数\t阅读次数\t总次数\t 平均次数\n");do{max=0;for(p1=head;p1;p1=p1->next)if(p1->math>max&&p1->math<k){max=p1->math;p2=p1;}k=max;for(p1=p2;p1;p1=p1->next)if(p1->math==max){printf("%ld\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p1->number, p1->name,p1->sex,p1->age,p1->chinese,p1->math,p1->english,p1->sum,p1 ->average);j++;}}while(j<n);}void english_sort(book *head){int j=0;float k=101,max;book *p1,*p2;printf("书号\t书名\t类别\t存期\t章数\t页数\t阅读次数\t总次数\t 平均次数\n");do{max=0;for(p1=head;p1;p1=p1->next)if(p1->english>max&&p1->english<k){max=p1->english;p2=p1;}k=max;for(p1=p2;p1;p1=p1->next)if(p1->english==max){printf("%ld\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p1->number, p1->name,p1->sex,p1->age,p1->chinese,p1->math,p1->english,p1->sum,p1->average);j++;}}while(j<n);}book *modify(book *head,long num){book *p1;int k,m;p1=head;while(p1!=NULL){if(p1->number==num)break;p1=p1->next;}if(p1->number==num){do{printf("1.书名 2.类别 3.存期 4.章数成绩 5.页数6.阅读次数 0.返回上一级\n");printf("请选择:");scanf("%d",&k);switch(k){case 1:printf("书名:");scanf("%s",p1->name);printf("修改成功!\n");break;case 2:loop2:printf("类别: 1.文科 2. 理科\n");printf("请选择类别:");scanf("%d",&m);switch(m){case 1:strcpy(p1->sex,"文科");break;case 2:strcpy(p1->sex," 理科");break;default:printf("类别只能是“文科”或“理科”,请重新输入!\n");goto loop2;}printf("修改成功!\n");break;case 3:printf("存期:");scanf("%d",&p1->age);while(p1->age<0||p1->age>120){printf("你输入的存期不符合实际情况,请重新输入!\n");printf("存期:");scanf("%d",&p1->age);}printf("修改成功!\n");break;case 4:printf("章数成绩:");scanf("%f",&p1->chinese);while(p1->chinese<0||p1->chinese>100){printf("你输入的章数成绩不符合实际情况,请重新输入!\n");printf("章数成绩:");scanf("%f",&p1->chinese);}p1->sum=p1->chinese+p1->math+p1->english;p1->average=p1->sum/3;printf("修改成功!\n");break;case 5:printf("页数:");scanf("%f",&p1->math);while(p1->math<0||p1->math>100){printf("你输入的页数不符合实际情况,请重新输入!\n");printf("页数:");scanf("%f",&p1->math);}p1->sum=p1->chinese+p1->math+p1->english;p1->average=p1->sum/3;printf("修改成功!\n");break;case 6:printf("阅读次数:");scanf("%f",&p1->english);while(p1->english<0||p1->english>100){printf("年输入的阅读次数不符合实际情况,请重新输入!\n");printf("阅读次数:");scanf("%f",&p1->english);}p1->sum=p1->chinese+p1->math+p1->english;p1->average=p1->sum/3;printf("修改成功!\n");break;case 0:break;default:printf("输入错误,请重新选择!\n");}}while(k!=0);}elseprintf("没有找到你要修改的图书的信息!\n");return(head);}book *del(book *head,long num){book *p1,*p2;if(head==NULL){printf("数据库为空,没有图书记录! \n");goto end;}p1=head;while(num!=p1->number&&p1->next!=NULL){p2=p1;p1=p1->next;}if(num==p1->number){if(p1==head){head=p1->next;printf("删除成功!\n");}else {p2->next=p1->next;printf("删除成功!\n");}n=n-1;}else printf("没有找到你要删除的图书信息!\n",num);end:;return(head);}book *insert(book *head,book *stud){book *p0,*p1,*p2;p1=head;p0=stud;if(head==NULL){head=p0;p0->next=NULL;}else{while((p0->number>p1->number)&&(p1->next!=NULL)){p2=p1;p1=p1->next;}if(p0->number<=p1->number){if(head==p1)head=p0;else p2->next=p0;p0->next=p1;}else{p1->next=p0;p0->next=NULL;}}n=n+1;return(head);}void Statistics(book *head){book *p1;int i,c=0,m=0,e=0;float cmax=0,mmax=0,emax=0,summax=0,averagemax=0; p1=head;for(i=1;i<=n;i++){if(p1->chinese>=cmax)cmax=p1->chinese;if(p1->math>=mmax)mmax=p1->math;if(p1->english>=emax)emax=p1->english;if(p1->sum>=summax)summax=p1->sum;if(p1->average>=averagemax)averagemax=p1->average;if(p1->chinese<60)c++;if(p1->math<60)m++;if(p1->english<60)e++;p1=p1->next;}printf("总成绩最高分:%5.1f\n",summax);printf("平成绩最高分:%5.1f\n",averagemax);printf("章数最多:%5.1f\n",cmax);printf("页数最高分:%5.1f\n",mmax);printf("阅读次数最多:%5.1f\n",emax);printf("章数最少:%d\n",c);printf("页数最少:%d\n",m);printf("阅读次数最少:%d\n",e);printf("\n");}void print(book *head){book *p1;printf("\n现在的%d个图书记录为:\n",n);p1=head;if(head!=NULL){printf("书号\t书名\t类别\t存期\t章数\t页数\t阅读次数\t总次数\t平均次数\n");do {printf("%ld\t%s\t%s\t%d\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p1->number,p1->name,p1->sex,p1->age,p1->chinese,p1->math,p1->english,p1->sum,p1->average);p1=p1->next;}while(p1!=NULL);}}void main(){int choice;book *head;do{/*打印表头*/printf("*******************************************************************************\n");printf("^_^_^_^_^_^_^_^_^_^_^_^_^_^欢迎来到图书成绩管理系统!^_^_^_^_^_^_^_^_^_^_^_^_^_^\n");printf(" \n");printf(" 图书成绩管理系统的基本功能: \n");printf(" 1. 新建; \n");printf(" 2. 查找; \n");printf(" 3. 更新; \n");printf(" 4. 排序; \n");printf(" 5. 统计; \n");printf(" 6. 显示; \n");printf(" 0. 跳出; \n");printf(" \n");printf(" 按键选择,回车确定! \n");printf("\n");printf("^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^\n");printf("*******************************************************************************\n");printf("请选择:");/*提示用户选择操作功能*/scanf("%d",&choice);while(getchar()!='\n');/*接收回车符*/switch(choice){case 1:head=creat();print(head);break;case 2:search(head);break;case 3:head=changes(head);break;case 4:sort(head);break;case 5:Statistics(head);break;case 6:print(head);break;case 0:break;default:printf("输入错误,请重新选择!\n");}}while(choice!=0);}说明:基本上实现了题目所要求的函数功能,可以对图书的信息进行输入、浏览、查询、修改、添加等功能管理。