资源描述
- .
?程序设计根底(C)?课程设计报告
图书信息管理系统
学 生 姓 名:朱斌
学 号: 201211354
班 级: 电力工程与管理1201班
指 导 老 师:邓伟华
日 期:2013.07.05
交通大学新能源与动力工程学院
C语言课程设计报告
一、设计目标1
二、总体设计2
三、详细设计2
五、分析及结论9
六、参考文献11
七、附录11
源程序清单11
一、设计目标
图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。
设计的图书信息管理系统,应当具备能提供以下功能:
1、系统以菜单方式工作
2、图书信息录入功能--输入
3、图书信息浏览功能--输出
4、图书信息查询功能--算法〔查询方式:1按书名查询.2.按作者名查询〕
5、图书信息的删除与修改
二、总体设计
1.程序设计组成框图
图书信息管理系统
系统登录模块
菜单项选择择模块
图书信息录入模块
图书信息浏览模块
图书信息查询模块
图书信息修改模块
设计:
朱斌
设计:
周勇
设计:
闫鹏
设计:
X旭东
设计:
杨国峥
设计:
王文模
2.程序流程图
`
三、详细设计
1、系统登录模块〔f1()〕——本函数由 朱斌 设计1〕函数的功能: 验证管理员信息,进入菜单功能界面
2〕函数的入口: 从main()的switch()构造中进入,即choice的值为1时进入函数,然后提示用户通过键盘对输入管理员账户及密码。
3)函数调用关系:被主函数调用。由switch()开关构造中进入,并在文中无返回值的空值void函数。
4)函数的出口: 当验证失败,提示重新输入。当验证成功,通过“ENTER〞键,跳出switch()开关函数,进入菜单功能模块,继续执行选择构造。
程序流程图:
图书登录系统界面
2.菜单功能选择模块〔f2()〕——本函数由 周 勇 设计
1〕函数功能:主要作用是提示用户操作,表达模块化思想,主要是显示出菜单让用户选择要进展的任务。
2〕函数入口:从主函数 void中的 adm_servelist()进入函数,这是直接被主函数void()调用的。
3〕函数调用关系:被主函数调用。并在文中无返回值的空值void函数。
4〕函数的出口:执行完所有的printf()函数后自动退出该函数。
图书管理系统
添加图书
删除图书
信息浏览
信息查询
修改图书
创立图书
退出管理系统
开场
输入n,判断是否0—6?
输入n,调用各个模块的函数
完毕
Y
N
主函数的流程图
菜单界面
3.修改与删除模块〔f3()〕——本函数由 王文模 设计
图书删除
1〕函数功能:利用while循环和 if 语句和scanf getchar search change del 函数,完成对图书信息〔分类名 出版单位 出版时间 价格〕的修改和删除
2) 函数入口:从主函数main()中的system("cls"); /*清屏命令*/menu(); /*菜单函数提示用户怎样选择*/进入函数,这是直接被主函数main()调用的。
3) 调用关系:void change(int x)是改变图书信息,它里面又调用了 book_search();
4) 函数出口:执行完所有的printf()函数后自动退出该函数。
程序框架图
图书修改
该模块实现按照用户需求,将需要修改的图书名输入,进展for循环查找是否有此书,假设无,那么显示未找到,退出,假设有,那么显示输入新的图书信息,开场输入修改的信息,进展for循环开场录入,替换原文件信息完毕显示“修改成功〞
图书修改界面
图书删除界面
4.图书信息浏览〔f4()〕——本函数由 旭东 设计
1) 函数的功能: 显示图书的信息〔编号·价格·作者·出版单位·出版时间·类别〕2〕函数的入口: 从主函数main()中的system("cls"); /*清屏命令*/menu(); /*菜单函数提示用户怎样选择04信息浏览/进入函数,这是直接被主函数main()调用的。
3〕函数调用关系:被主函数调用。并在文中无返回值的空值void函数。
4〕函数的出口:执行完所有的printf()函数后自动退出该函数。
框架图
图书浏览流程图
图书浏览
5.图书查询——本函数由国峥设计
1〕函数的功能: 按着书名查询与作者名查询,输出排序结果。
2〕函数的入口: 程序从main()的while()开关构造中进入,即choice的值为4时进入该函数,开场进入该函数,进入函数后,首先翻开文件,然后利用“printf〔〕〞选择按书名查询与作者名查询,假设flag=1或flag=2那么有此书。假设flag=0那么无此书,并退出查询。
3〕函数调用关系:被主函数调用。由while()开关构造中进入,并在文中无返回值的空值void函数。
4〕函数的出口: 当输出查询结果用printf()标准输出到屏幕上,然后完毕该函数,而执行主函数main()中“break;〞跳出while()开关函数,继续执行if选择构造。
图书信息查询
按书名查询〔1〕
EXIT(0)
按作者名查询〔2〕
04信息查询
输入a,判断a是否为0~2?
a=0,退出回到主菜单
a=1,那么调用search-by-name按书名
查询
输入书名,假设有此书那么输出此书信息,假设没有,那么输出file open error!!
没有,那么输出file open error!!
a=2,那么调用search-by-writer按
作者名查询
输入作者名,假设有此书那么输出此书
信息假设没有,那么输出file open error
按图书名查询
按作者名查询
6.输入模块——本函数由 闫 鹏 设计
1) 函数的功能:利用for循环语句和scanf、gets、getchar函数完成对构造数组的输入,存放图书信息〔图书编号、图书名、作者名、、类别、出版时间、价格〕。
2) 函数的入口:从主函数main()中的system("cls"); /*清屏命令*/menu(); /*菜单函数提示用户怎样选择*/进入函数,这是直接被主函数main()调用的。
3) 函数调用关系:被主函数调用。并在文中无返回值的空值void函数。
4) 函数的出口::执行完所有的printf()函数后自动退出该函数。
程序框架图:
录入数据
请输入图书编号
请输入图书名
请输入作者名
请输入
请输入类别
请输入出版时间
请输入价格
图书信息输入
四、调试与测试
调试方法:翻开Microsoft Visual C++ 6.0,先将各个功能函数的的容清空,只保存主函数main(),然后编译检验main()函数中是否有错,如果没有错误,再连接、运行。确认main()函数一切无误后,然后参加功能函数menu()函数与f1()函数,由于menu()函数比拟简单,所以与f1()函数一起进展调试,f1()函数中主要注意读取文件,与写入文件,这都是二进制的形式。假设menu()函数与f1()函数编译、连接、运行没问题,继续参加f2()函数,就这样的方法依次检查调试f3()函数、f4()函数。当所有的功能函数都加上且正确无误时,就可以进入下一个环节—程序的测试。
测试方法:运行程序,然后进入销售管理系统的界面,在这里需要做的就是把自己当成一个公司的程序使用者,来对该程序进展使用,看该程序有哪些方面用着不够爽,把这些问题依次整理出来,再对源程序进展修改,在这个过程中也需要对程序进展调试,不过不必将各个功能函数的的容清空再进展如上述的调试方法,而是,改一部份运行一次,看是否有无。
如f1()函数有误,那么先修改f1()函数,一块一块的进展修改,就是遵循C语言的模块化设计原理,假设所有的都改正来了,且运行无误,那就大功告成了。
在调试中遇到的问题:在调试过程中,我们遇到诸多小问题,但都在我们共同讨论后解决了。
1、问题:标点符号在输入的时候,使用的是中文输入法,这种错误一般都难以发现,让修改的时候找不到目标。
解决方法:用“替换〞。如果程序中的error很多,不管error是什么,先将标点替换成英文的标点。
2、问题:调试时,有的时候编译后没什么问题,就是在点击连接link时出现了错误。而且,这种错误让我们不知道怎么修改。但是我们的程序确实正确。
解决方法:将源程序保存〔save〕,然后关掉Microsoft Visual C++ 6.0,重新启动Microsoft Visual C++ 6.0,
五、分析及结论
A、在设计中我们实现了设计目标的所有容
即:1、系统以菜单方式工作
2、图书信息录入功能--输入
3、图书信息浏览功能--输出
4、图书信息查询功能--算法〔查询方式:1按书名查询.2.按作者名查询〕
5、图书信息的删除与修改
B、其中遇到了以下问题:
不能清晰的建立设计模块,不会修改出现的错误等等。
解决方案:向同学寻求帮助,向他们学习,最终通过自己努力建立了模块。不可防止地程序中肯定依然存在者某些问题在应用中不断提高自己的能力,攻克遇到的困难。
C、该程序的缺乏:函数较复杂,界面不美观。
D、实践心得
经过一个多星期的编译原理课程设计,在我们一组的共同的努力下,顺利完成该课程设计。
通过该课程设计,掌握了编译程序工作的根本过程及其各阶段的根本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程及其相关的技术,对课本上的知识也有了更深的理解。教师常说,课本上的知识是机械的,外表的,要学会去运用,要举一反三。现在终于深刻的了解了这句话。经过这次的课程设计,发现书本上很深奥的知识变的更为简单,同样,对C程序原理也了有更深的理解。知道和理解了该理论在计算机中是怎样执行的, 对该理论在实践中的应用有深刻的理解 。通过该课程设计,把死板的课本知识变得生动有趣,激发了学习的积极性。能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。
课程设计中程序比拟复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。除了课堂外,课程设计是最能学到东西的,最考验人的。在做课程设计的这段时间,时刻都感到自己学的知识有多么的贫瘠。经过这次课程设计,让我们对C++这门语言有了更深的认识,操作能力有了提高要想是写出的代码能运行,需要耐心细心,毅力以及充分的体力。只有经过屡次编辑,屡次编译,再屡次运行,才能编写出更好的程序,有时候需要屡次的更正才能到达所要的运行结果。在编写本程序时,在网上寻找的参考程序起到了很大的启发与参考作用。
六、参考文献
1、?C语言程序设计.谭浩强版?
2、?C语言上机指导?
3、?Microsoft Visual C++ 6.0指南?
4、附:在编写本程序时,在网上寻找的参考程序起到了很大的启发与参考作用。
七、附录
源程序清单
源程序清单
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct book{//声明BOOK类的所有变量
int num;
char bname[50];
char wname[20];
char press[50];
char sort[50];
int time;
float price;
struct book *next;
};
struct book *creatbook();//创立链表
struct book *addbook(struct book *head);//添加图书
int yanzheng(struct book *head,int m);//验证新添加的图书编码是否已存在
void deletebook(struct book *head);//删除图书
void fprint(struct book *head);//将链表写入文件
struct book *load();//从文件中读取信息并建成链表
void print_book(struct book *head);//将链表信息输出
void chaxun(struct book *head);//查询图书信息
void wname_chaxun(struct book *head);//按作者名查询图书
void bname_chaxun(struct book *head);//按图书名查询图书
void xiugai(struct book *head);//修改图书信息
int main()——本代码由小 组 设计
{
int choice,n,x,y=1,c,c1=317;//choice 选择进入哪项功能:对图书的增删改查
char a,d,b[10],b1[10]="317";
struct book *head=NULL;//声明一个新的book类
while(y)//实现 登录 退出系统 这两个选项 在输入口令错误时产生的循环
{
system("cls");//清屏
printf("|=========================================|\n");
printf("| 欢送进入 |\n");
printf("| 交通大学图书管理系统 |\n");
printf("|========================================|\n");
printf("|| 请输入选项(0--1) ||\n");
printf("|========================================|\n");
printf("| 1-用户登录 |\n");
printf("| 0-退出系统 |\n");
printf("|=======================================|\n\n");
printf(" 请输入您的选择:");
scanf("%d",&n);//读取选项 0/1
printf("\n");
getchar();//从stdio流中读字符
switch(n){//进入选择
case 0:
y=0;
break;
case 1:
printf(" 请输入您的用户名:");
gets(b);//获取输入的字符 将字符赋值为b
printf("\n");
printf(" 请输入您的密码:");
scanf("%d",&c);
printf("\n");
if(strcmp(b,b1)!=0||c!=c1){//strcmp比拟功能 b1 c1 之前赋值为317 317 只要刚输入的b 与 c 存在不等于317
printf(" 验证失败,请重新输入!\n");
scanf("%c",&d);
getchar();
system("cls");
}
else{
printf(" 验证通过!请按Enter键进入!\n");
scanf("%c",&d);
getchar();
x=1;
while(x){
system("cls");——本代码由 朱 斌 设计
printf(" ----------------------------\n");
printf(" 交通大学图书信息管理系统 \n");
printf(" ----------------------------\n");
printf("***********************************\n");
printf("|| 请输入选项(0--6) ||\n");
printf("***********************************\n");
printf("|| 1-添加图书 2-删除图书 ||\n\n");
printf("|| 3-信息浏览 4-信息查询 ||\n\n");
printf("|| 5-修改图书 6-创立图书 ||\n\n");
printf("|| 0-退出系统 ||\n");
printf("******************************************\n");
printf("请输入所选择的序号:");
scanf("%d",&choice);
getchar();
system("cls");
switch(choice)//选择进入哪项功能:对图书的增删改查
{
case 0:
x=0;break;
case 1:
head=load();//链头尾节点一致一样 即文件为空
if(head==NULL){
printf("文件为空,请先录入数据!\n");
getchar();
break;
}
else{
head=addbook(head);//链表的表头与新参加的容一样 即添加成功
printf("添加成功!\n");
printf("是否将新信息保存到文件?(y/n)\n");
scanf("%c",&a);
getchar();
switch(a){
case 'n':
break;
case 'y':
fprint(head);
printf("保存成功!\n");
getchar();
break;
}
break;
}
case 2:
head=load();//链头尾节点一致 即文件为空
if(head==NULL){
printf("文件为空,请先录入数据!\n");
getchar();
break;
}
else{
deletebook(head);//执行删除
getchar();
break;
}
break;
case 3:
head=load();
if(head==NULL){//链头尾节点一致 即文件为空
printf("文件为空,请先录入数据!\n");
getchar();
break;
}
else{
print_book(head);//执行浏览
getchar();
break;
}
case 4:
head=load();
if(head==NULL){//链头尾节点一致 即文件为空
printf("文件为空,请先录入数据!\n");
getchar();
break;
}
else{
chaxun(head);//执行查询
getchar();
}
break;
case 5:
head=load();
if(head==NULL){//链头尾节点一致 即文件为空
printf("文件为空,请先录入数据!\n");
getchar();
break;
}
else{
xiugai(head);//执行修改
getchar();
break;
}
break;
case 6:
printf("注意:输入图书编码为0时完毕!\n");
head=creatbook();//找到一样信息 询问是否替换
printf("是否将输入的信息保存到文件以覆盖文件中已存在的信息?(y/n)\n");
getchar();
scanf("%c",&a);
getchar();
switch(a){
case 'n':
break;
case 'y':
fprint(head);//将链表写入文件
printf("保存成功!\n");
getchar();
break;
}
break;
default:
printf("您的输入有误,请重新输入!\n");
getchar();
break;
}
}
}
break;
default:
printf(" 您的输入有误! 请重新输入!\n");
getchar();
break;
}
}
}——本代码由 周 勇和王文模 设计
//录入数据并形成链表
struct book *creatbook()
{
struct book *head,*tail,*p;//声明数据链表
int num,time,n;
char bname[50],wname[20],press[50],sort[50];
float price;
int size=sizeof(struct book);
head=tail=NULL;
printf("请输入图书编号:");
scanf("%d",&num);
printf("请输入图书名:");
scanf("%s",bname);
getchar();
printf("请输入作者名:");
scanf("%s",wname);
getchar();
printf("请输入:");
scanf("%s",press);
getchar();
printf("请输入类别:");
scanf("%s",sort);
getchar();
printf("请输入出版时间:");
scanf("%d",&time);
getchar(); 从键盘中输入一个值
printf("请输入价格:");
scanf("%f",&price);
getchar();
while(1){
p=(struct book *)malloc(size);
p->num=num;
strcpy(p->bname,bname);//赋值 把后者复制给前者
strcpy(p->wname,wname);//赋值 把后者复制给前者
strcpy(p->press,press);//赋值 把后者复制给前者
strcpy(p->sort,sort);//赋值 把后者复制给前者
p->time=time;
p->price=price;
p->next=NULL;
if(head==NULL)
head=p;
else
tail->next=p;//赋值 将地址付给下一个 形成链
tail=p;
do{
printf("请输入图书编号:");
scanf("%d",&num);
n=yanzheng(head,num);//验证添加的图书编号是否已存在
if(n==0)
break;
else
printf("您输入的编号已存在,请重新输入!\n");
}while(1);
if(num==0)
break;
else
{
printf("请输入图书名:");
scanf("%s",bname);
getchar();
printf("请输入作者名:");
scanf("%s",wname);
getchar();
printf("请输入:");
scanf("%s",press);
getchar();
printf("请输入类别:");
scanf("%s",sort);
getchar();
printf("请输入出版时间:");
scanf("%d",&time);
getchar();
printf("请输入价格:");
scanf("%f",&price);
getchar();
}
}
return head;
}
int yanzheng(struct book *head,int m)
{
struct book *p;
p=head;
while(p!=NULL){
if(p->num==m)
break;
p=p->next;
}
if(p==NULL)
return 0;
else
return 1;
}
//将新链表写入文件中
void fprint(struct book *head)
{
FILE *fp;
char ch='1';
struct book *p1;
if((fp=fopen("f1.txt","w"))==NULL){//字符IO流
printf("File open error!\n");
exit(0);
}
fputc(ch,fp);//将字符ch写到文件指针fp所指向的文件的当前写指针的位置
for(p1=head;p1;p1=p1->next){//依次写入
fprintf(fp,"%d %s %s %s %s %d %f\n",p1->num,p1->bname,p1->wname,p1->press,p1->sort,p1->time,p1->price);
}
fclose(fp);//关闭 释放存
}——本代码由 闫 鹏 设计
//从文件中读取图书信息
struct book *load()
{
FILE *fp;
char ch;
struct book *head,*tail,*p1;
head=tail=NULL;//链表初始化
if((fp=fopen("f1.txt","r"))==NULL){
printf("File open error!\n");
exit(0);
}
ch=fgetc(fp);//意为从文件指针fp指向的文件中读取一个字符 读取一个字节后 光标位置后移一个字节
if(ch=='1')
{
while(!feof(fp)){//检测fp流上的文件完毕符
p1=(struct book *)malloc(sizeof(struct book));
fscanf(fp,"%d%s%s%s%s%d%f\n",&p1->num,p1->bname,p1->wname,p1->press,p1->sort,&p1->time,&p1->price);
if(head==NULL)
head=p1;
else
tail->next=p1;
tail=p1;
}
tail->next=NULL;
fclose(fp);
return head;
}
else
return NULL;
}
//将整个链表的信息输出
void print_book(struct book *head)
{
struct book *ptr;
if(head==NULL){
printf("\n没有信息!\n");
return;
}
printf(" 图书信息列表如下\n");
printf("====================================================\n");
printf(" 编号 图书名 作者名 类别 出版时间 价格\n");
for(ptr=head;ptr;ptr=ptr->next)//依次输出
printf(" %d %s %s %s %s %d %.2f\n",ptr->num,ptr->bname,ptr->wname,ptr->press,ptr->sort,ptr->time,ptr->price);
printf("==================================================\n");
}——本代码由 旭东 设计
//删除图书信息
void deletebook(struct book *head)
{
int a;
char b,ch='1';
struct book *p1,*p2;
FILE *fp;
printf("请输入要删除的图书编号:");
scanf("%d",&a);
p1=head;
if(p1->num==a&&p1->next==NULL){//当文件中只有一组数据
printf("是否清空文件!(y/n)\n");
getchar();
scanf("%c",&b);
getchar();
switch(b){
case 'n':
break;
case 'y':
if((fp=fopen("f1.txt","w"))==NULL){//重新写入
printf("File open error!\n");
exit(0);
}
fclose(fp);
printf("文件已清空!\n");
}
}
else{
while(p1->num!=a&&p1->next!=NULL){//当文件中不只有一组数据
p2=p1;
p1=p1->next;
}
if(p1->next==NULL){
if(p1->num==a){
p2->next=NULL;
printf("是否确定从文件中彻底删除该图书?(y/n)\n");
getchar();
scanf("%c",&b);
switch(b){
case 'n':
break;
case 'y':
fprint(head);
printf("删除成功!\n");
getchar();
break;
}
}
else{
printf("没有找到要删除的数据!\n");
getchar();
}
}
else if(p1==head){
head=p1->next;
printf("是否确定从文件中彻底删除该图书?(y/n)\n"
展开阅读全文