一级实践课题报告
软 件 学 院
一级实践环节报告
课题名称: 图书管理系统 专 业: 软件工程 .NET方向 班 级: rB软件N111 学 号: [1**********]8 学生姓名: 指导教师:
2012年02 月20 日
目 录
第1章 概述 . .......................................................................................................................... 1
1.1设计题目:图书信息管理系统 . ............................................................................... 1 1.2目的: . ....................................................................................................................... 1 1.3 系统功能简介: . ...................................................................................................... 1 1.4 课程设计时间安排 . .................................................................................................. 2 第2章 任务与实现 . .............................................................................................................. 3
1. 题目要求 . ...................................................................................................................... 3 2. 设计思路 . ...................................................................................................................... 3
2.2.1 系统菜单流程图 . ............................................................................................ 4 2.2.2 各模块的功能和实现 . .................................................................................... 5 2.2.3实现 . ................................................................................................................. 5
3. 函数模块代码 . ..................................................................................................................... 10
3.1 头文件 . ............................................................................................................. 10 3.2 主函数 . ............................................................................................................. 11 3.3 注册函数 . ......................................................................................................... 12 3.4 登陆函数 . ......................................................................................................... 13 3.5 录入函数 . ....................................................................................................... 14 3.6 查询函数 . ......................................................................................................... 15 3.7 删除函数 . ......................................................................................................... 17 3.8 排序函数 . ......................................................................................................... 19 3.9 修改函数 . ......................................................................................................... 20
第3章 总结 . ........................................................................................................................ 21 参考文献: . ............................................................................................................................ 22
第1章 概述
1.1设计题目:图书信息管理系统 1.2目的:
软件工程专业所开设的C 课程设计(一级课题)是教学实践环节中一项重要内容,进行此课程设计的旨在:提高和加强学生的计算机应用与软件开发能力,使学生由初学者向专业的程序员过渡。
培养学生独立分析问题、解决问题、查阅资料以及自学能力,以适应计算机产业日新月异发展的形势。
学习和掌握C 程序设计方法以及上机调试技巧,为今后学习其它专业课程
打好基础。
本次课程设计是以学生独立思考解决问题为主,教师指导为辅,结合上机操作,完成指定的任务,作出设计报告。
编译器使用 Visual C++ 6.0
1.3 系统功能简介:
系统以菜单方式工作
1)图书信息录入(文件保存图书信息)
图书信息包括:登录号、书名、作者名、出版单位、出版时间间、价格 2)输出图书信息、浏览图书信息 3)查询图书信息 4)根据书号查找图书信息 5)根据图书价格将信息进行排序 6)删除图书信息
7)进入系统需要使用用户名和密码
1.4 课程设计时间安排
课程设计时间为一周,分为4个阶段完成:
1、 分析设计阶段。在老师的指导下自主学习和钻研问题,明确设计要求,找出现实方法。按照需求分析、总体设计、详细设计几个步骤进行。这一阶段1天完成;
2、 编码调试阶段。根据设计分析方案编写C 语言代码,然后调试该代码,实现课题要求的功能。这一阶段在2-3天完成;
3、 总结报告阶段。总结设计工作,写出课程设计说明书,包括需求分析、总体设计、详细设计、编码、测试的步骤和内容。这一阶段在4-7天完成;
4、 考核阶段。
第2章 任务与实现
1. 题目要求
要求:图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。试设计一图书信息管理系统,系统以菜单方式工作,使之能提供以下功能:
● 图书信息录入功能(图书信息用文件保存) ● 图书信息浏览功能
● 查询和排序功能,按书名查询和按作者名查询或价格等查询 ● 图书信息的删除与修改 ● 统计功能
2. 设计思路
1、首先进行需求分析,搞清楚系统功能和任务;
2、然后在总体设计中确定模块结构、划分功能模块,将软件功能需求分配
给所划分的最单元模块。确定模块间的联系,确定数据结构、文件结构、数据库模式,确定测试方法与策略;
3、在详细设计中,为每个模块确定采用的算法,选择适当的工具表达算法
的过程(流程图)来描述模块的详细过程。确定每一模块采用的数据结构和模块接口的细节,包括对系统外部的接口和用户界面,对系统内部其他模块的接口;
4、根据分析编写C 语言代码。
2.2.1 系统菜单流程图
图1. 系统的总体流程图
2.2.2 各模块的功能和实现
1. 注册模块:通过用户输入用户名和密码来建立进入系统的口令,并存储到数据库中。通过自己定义的 void enroll()函数来实现。
2. 登录模块:通过输入用户名和密码来进入系统,用户名与密码与数据库中的信息比较。通过int login()函数实现。
3. 菜单模块:显示图书管理系统的主菜单,供用户选择所需的功能,通过主函数来实现。
4. 输入模块:输入书号、书名以及其它的一些图书的相关信息,通过自己定义的void typein()函数来实现。
5. 浏览模块:浏览所有图书的相关信息,通过自己定义的void view ()函数来实现。
6. 删除模块:删除需要删除的图书的所有信息,通过自己定义的void del()函数来实现。
7. 按图书号查询模块:可以按图书号来查询图书的相关信息,通过自己定义的void view()函数来实现。
8. 修改模块:可以修改需要修改的图书的相关信息,通过自己定义的void edit ()函数 来实现。
9. 退出系统模块:退出图书信息管理系统,通过exit(0)函数来实现。
2.2.3实现
1. 运行程序,进入图书管理系统登录系统,如图1所示。
图1. 登录界面 说明:用户可以选择1. 登录 2.注册 实现不同的功能
1)输入“2”进入注册,如图2所示。
图2. 注册界面
说明:注册需要输入用户名和密码,密码需要二次确认 2)输入“1”登录系统,如图3所示。
图3. 登陆界面
说明:用户名和密码必须相同可进入系统
2. 系统主菜单,如图4所示。
图4. 系统主菜单
说明:主菜单有6种功能,用户可根据需要进行选择 1)输入“1”进入图书信息录入,如图5所示。
图5. 信息录入
说明:信息录入需要输入全部的图书信息
2). 输入“N ”返回主菜单,(界面同图4) 3). 输入“2”进入信息查询,如图6所示。
图6. 查询菜单
说明:用户根据查询方式进行选择
a) .输入“1”按书名查询, 如图7所示。
图7. 按书名查询
说明:必须输入的书名必须完整 b). 输入“2”按作者查询,如同8所示
图8. 按作者查询
说明:必须输入完整的用户名
C ). 输入“3”浏览所以图书,如图9所示
图9. 浏览图书
说明:浏览功能将所有图书显示出来,并统计图数量
4). 输入“3”进入删除菜单,如图10所示
图10. 删除菜单
说明:用户可根据需求进行选择
a ). 输入“1”按书号删除,如图11所示
图11. 删除图书
说明:删除图书信息,请先确认是否是应删除的图书
5). 输入“4”对图书按价格排序,如图12,13所示
图12. 图书排序
说明:此功能只能根据图书的价格进行排序
14. 输入“5”对图书信息修改,如图13所示
图13. 信息修改
图14. 修改结果查询
说明:此功能将对书号所对应的图书信息进行修改
3. 函数模块代码
3.1 头文件
#include
#include
#include
#include
struct Book
{
int ID;
int price;//价格
char name[64];//书名
char author[10];//作者
char publish[20];//出版单位
struct Book * next;
};
struct Admin
{
char user[20];
char pass[20];
};
void typein();
void view();
void edit();
void del();
void exit();
int login();
void enroll();
void sortord();
#include"BookSystemHead.h"
int main()
{ int menu;//菜单序号
int log;//登录菜单号
int bol;//登录返回值
while(true)
{printf(" \n\n\n*********************************图书管理系统********************************* ");
printf("\n\n\t\t\t1.登录\t\t2.注册\n");
printf("\n\n****************************************************************************** ");printf("\n\n请输入相关序号:");
scanf("%d",&log);
system("cls");
switch(log)
{case 1 :bol=login();system("cls");break;
case 2 :enroll();printf("\n按任意键返回...");getch();system("cls"); break;
default:printf ("输入错误\n");
switch(bol)
{case 0:printf("密码正确\n");goto Login;
case 1:printf("警告:账户数据库丢失!!!");goto END;
case 2:printf("密码错误\n");
Login: while(true)
{printf(" \n\n\n*********************************图书管理系统********************************* ");
printf("\n\n1.信息录入 2. 信息查询 3. 信息删除 4. 图书排序 5. 信息修改
6. 退出系统");
printf("\n\n****************************************************************************** ");
printf("\n\n请输入相关序号:");
scanf("%d",&menu);
system("cls");
switch(menu)
{
case 1 :typein(); printf("\n按任意键返回...");getch();system("cls");break;
case 2 :view();printf("\n按任意键返回...");getch();system("cls"); break;
case 3 :del();printf("\n按任意键返回...");getch();system("cls"); break;
case 4 :sortord();printf("\n按任意键返回...");getch();system("cls"); break; case 5 :edit(); printf("\n按任意键返回...");getch();system("cls");break;
case 6 :exit();printf("\n按任意键返回...");getch();system("cls");break;
default:printf ("输入错误\n");
END: return 0;
#include"BookSystemHead.h"
void enroll()
{
FILE *fp;
char user[20];//用户名
char password[20];//密码
char pass_repeat[20];//重新输入密码
struct Admin admin;//新用户
while(true)
{printf("输入用户名:");
scanf("%s",user);
printf("输入密码:");
for(int i=0;password[i]=getch();i++) //密码不在屏幕回显
{ if(password[i]=='\r')break; //以回车结束
}
password[i]='\0';
printf("\n");
printf("确认密码:");
for(i=0;pass_repeat[i]=getch();i++)
{ if(pass_repeat[i]=='\r')break;
}
pass_repeat[i]='\0';//结尾加上“\0”
if(strcmp(password,pass_repeat)==0)//判断两次输入的密码是否相同
{if((fp=fopen("adminData.txt","ab++"))==NULL)
{printf("警告:账户数据库丢失!!!");
return;
}//检查数据库是否存在
else fp=fopen("adminData.txt","wb");
strcpy(admin.user,user);//用户名复制到数据结构
strcpy(admin.pass,password);// 密码复制到数据结构
fwrite(&admin,sizeof(Admin),1,fp);//写入数据库
fclose(fp);
break;
}
else
{system("cls"); //清屏函数
printf("两次输入密码不符\n");
}
}
}
#include"BookSystemHead.h"
void enroll()
{FILE *fp;
char user[20];//用户名
char password[20];//密码
char pass_repeat[20];//重新输入密码
struct Admin admin;//新用户
while(true)
{printf("输入用户名:");
scanf("%s",user);
printf("输入密码:");
for(int i=0;password[i]=getch();i++) //密码不在屏幕回显
{ if(password[i]=='\r')break; //以回车结束
}
password[i]='\0';
printf("\n");
printf("确认密码:");
for(i=0;pass_repeat[i]=getch();i++)
{ if(pass_repeat[i]=='\r')break;
}
pass_repeat[i]='\0';//结尾加上“\0”
if(strcmp(password,pass_repeat)==0)//判断两次输入的密码是否相同
{if((fp=fopen("adminData.txt","ab++"))==NULL)
{
printf("警告:账户数据库丢失!!!");
return;
}//检查数据库是否存在
else fp=fopen("adminData.txt","wb");
strcpy(admin.user,user);//用户名复制到数据结构
strcpy(admin.pass,password);// 密码复制到数据结构
fwrite(&admin,sizeof(Admin),1,fp);//写入数据库
fclose(fp);
break;
}
else
{system("cls"); //清屏函数
printf("两次输入密码不符\n");
}
}
}
#include"BookSystemHead.h"
void typein()
{FILE *fp;
char jud;
Book book,book1;
do
{
if ((fp=fopen("BookData.txt","ab++"))==NULL)//若存在以追加
if ((fp=fopen("BookData.txt","wb+"))==NULL)//否则以写模
{printf("\t\t不能建立文件\n");
return;
}
printf("\n\n\t\t\t\t信息录入\n\n\n");
printf("\t\t书名\t作者\t出版单位\t价格\t数量\n");
printf("输入序号:");
scanf("%d",&book.ID);
printf("输入书名:");
scanf("%s",&book.name);
printf("输入作者:");
scanf("%s",&book.author);
printf("输入出版单位:");
scanf("%s",&book.publish);
fflush(stdin); // 清除缓存区
printf("输入价格:");
scanf("%d",&book.price);
while (!feof(fp))//检查文件是否到结尾
{ fread(&book1,sizeof(Book),1,fp);//读取数据库中文件
if (book.ID==book1.ID)
{ printf("输入有误");
break;
}
}
if(!feof(fp))
printf("输入有误");
else fwrite(&book,sizeof(Book),1,fp);
fclose(fp);
fflush(stdin); //清除缓存区
printf("是否继续录入(N/Y):");
scanf("%c",&jud);
}while(jud=='Y'||jud=='y');
}
#include"BookSystemHead.h"
void view()//查询函数
{char name[20];//书名
char author[10];//作者
int choose_num;//选择序号
int count=0;
FILE *fp;//
Book book;
if((fp=fopen("BookData.txt","rb"))==NULL)
{printf("警告:数据库丢失\n");
return;
}
printf("\n查询方式\n\t1.书名\t2.作者\t3.浏览\n");
fseek(fp,0,SEEK_END);//文件指针移动到文件末尾
if(ftell(fp)>0)//若文件不空
{printf("\n输入查询方式:");
scanf("%d",&choose_num);
switch(choose_num)
{
case 1 :
printf("输入书名:");
scanf("%s",&name);
rewind(fp);
while(true)//查找
{fread(&book,sizeof(Book),1,fp);
if(feof(fp)||strcmp(book.name,name)==0)
{
break;
}
}
if (!feof(fp))//显示记录
{printf("\t序号\t书名\t\t作者\t\t出版单位\t\t价格\n");
printf("\t%d\t%s\t%s\t\t%s\t\t%d\n",book.ID,book.name,book.author,book.publish,book.price }
else
{
printf("此书暂无记录");
break;
}break;
case 2:
printf("输入作者:");
scanf("%s",&author);
rewind(fp);
while(true)//查找
{fread(&book,sizeof(Book),1,fp);
if(feof(fp)||strcmp(book.author,author)==0)
break;
}
if (!feof(fp))//显示记录
{printf("\t序号\t书名\t\t作者\t\t出版单位\t\t价格\n");
printf("\t%d\t%s\t%s\t\t%s\t\t%d\n",book.ID,book.name,book.author,book.publish,book.price) }
else
{printf("此作者暂无记录");
break;
}break;
case 3:
rewind(fp);//将文件内部的位置指针重新指向文件开头
printf("\t序号\t书名\t\t作者\t\t出版单位\t\t价格\n");
while(true)
{fread(&book,sizeof(Book),1,fp);//从文件中读取数据
if(feof(fp))
{break;//文件结束,终止循环
}
printf("\t%d\t%s\t%s\t\t%s\t\t%d\n",book.ID,book.name,book.author,book.publish,book.price count++;
}
printf("
\n\n****************************************************************************** ");
printf("\n\n\t\t共有图书量:%d\n",count);
printf("
\n\n************************************************************************** break;
default :printf("输入有误\n");
}
}
else
{
printf("没有录入任何信息\n");
}
3.7 删除函数
#include"BookSystemHead.h"
void del()
{
FILE *fp;
struct Book book[512];//数据结构
int choose_num;//选择序号
int ID;//输入序号
int n;//数组下标
if ((fp=fopen("BookData.txt","rb"))==NULL)
{
printf("读取失败\n");
return;
}
fp=fopen("BookData.txt","rb");
printf("\n删除方式 1. 按书号删除\t2.全部删除\n\n\n");
fseek(fp,0,SEEK_END);//文件指针移动到文件末尾
if(ftell(fp)>0)//若不为空
{
printf("输入删除方式:");
scanf("%d",&choose_num);
switch(choose_num)
{
case 1:
rewind(fp);
for (n=0;!feof(fp) && fread(&book[n],sizeof(Book),1,fp);n++);//n为记录个数 {
printf("要删除的书号:");
scanf("%d",&ID);
for (int i=0;i
if (i>=n)
{
printf("没有%d书号的书",ID);
return;
fclose(fp);
}//没有此图书
if(n>1)
{
for (int j=i;j
{book[i]=book[i+1];
}
fp=fopen("BookData.txt","wb"); for (i=0;i
#include"BookSystemHead.h"
void sortord()//排序函数
{struct Book book[100],tbook;
int n=0;//图书数据结构下标
int i=0;//价格下标
int j;//交换变量
FILE *fp;
if((fp=fopen("BookData.txt","rb"))=NULL)
{printf(" 读取数据库失败");
return;
}
fp=fopen("BookData.txt","rb");
rewind(fp);
fseek(fp,0,SEEK_END);//文件指针移动到文件末尾
if(ftell(fp)>0)//若不为空
{ rewind(fp);//指向数据流开始
for (n=0;!feof(fp) && fread(&book[n],sizeof(Book),1,fp);n++)//从数据库中读取数据 n=n-1;
for(j=0;j
{for(i=0;i
{if(book[i].price>book[i+1].price)
{tbook=book[i];
book[i]=book[i+1];
book[i+1]=tbook;
}
}
}//利用冒泡法对数据排序(以价格排序)
printf("\n\n\t\t\t图书排序\n\n\n\n");
printf("\t序号\t书名\t\t作者\t\t出版单位\t\t价格\n");
for(i=0;i
printf("\t%d\t%s\t%s\t\t%s\t\t%d\n",book[i].ID,book[i].name,book[i].author,book[i].publish,book[i].price);
}//输出全部数据
}
else printf("数据库为空\n");
fclose(fp);
}
#include"BookSystemHead.h"
void edit()//修改函数
{FILE *fp;
Book book,nbook;
int ID;
if ((fp=fopen("BookData.txt","rb+"))==NULL)
{printf("\t\t读取失败");
return;
}//检查是否有数据库
fseek(fp,0,SEEK_END);//文件指针移动到文件末尾
if(ftell(fp)>0)//若数据库不为空
{rewind(fp);//指向文件头
printf("要修改的书号:");
scanf("%d",&ID);
for (int i=0;!feof(fp)&&fread(&book,sizeof(Book),1,fp)==1;i++)//查找输入的书号 {
if (book.ID==ID) break;
if (feof(fp))
{printf("没有%d书号的书",ID);
return;
}
}
printf("输入书名");
scanf("%s",&nbook.name);
printf("输入作者");
scanf("%s",&nbook.author);
printf("输入出版单位");
scanf("%s",&nbook.publish);
printf("输入价格");
scanf("%d",&nbook.price);
nbook.ID=book.ID;
fseek(fp,-(long)sizeof(Book),SEEK_CUR);//从当前位置向前偏移一个链接 fwrite(&nbook,sizeof(Book),1,fp);//写如数据库
fclose(fp);
}
else {
printf("无该记录");//数据库为空
fclose(fp);//关闭文件
}
}
第3章 总结
通过这次课程设计,增加了我们对软件技术的了解,虽然还不明确软件技术包含的具体内容,但从学习C 语言这门课程开始,已发现程序设计的好处,它对我们数学的学习也有很大的帮助。在学习C 语言的过程中也学到和巩固了许多计算机应用基础知识,对计算机的机体也有了一个较为详细的了解。在具体操作中对这学期所学的C 语言的理论知识得到巩固加强,达到实训的目的,也发现自己的不足之处,为我们以后的计算机语言学习奠定了基础,同时体会到C 语言具有的语句简洁,使用灵活,执行效率高等特点。发现上机操作的重要作用,特别是对数组和循环有了深刻的理解。通过实际操作,学会 C语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。 由于本课题中的许多知识点都没有学过都要靠自己到课外的资料中去查找。在用的时候难免出现这样那样的错误。如开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。解决的这个问题的办法是调整。一个系统的菜单和提示信息非常重要。如果没有这些用户根本不知道怎么用你设计的这个系统。在设计的调试过程中也无法顺利的完成调试工作。有了一个清晰简单的菜单和一些提示信息这后,调试过程完成的非常顺利。
回顾起此次课程设计,至今我们仍感慨颇多,的确,从拿到题目到完成整个编程,从理论到实践,在这些日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识本次课程设计结束了,对于我们的影响很大。我们通过这次实践学到了许多知识。学到了设计一个简单的系统。要注意哪些方面。也使我们知道自己哪些方面做得还不够。
但我们总结出了一点点的经验如下:
①要对系统的功能和要求做出详细的分析,并合理分解任务。
②把分解出来的子任务,做给一个相对独立的模块。
③在设计一个模块之前,要简单构想一下总界面的显视情况。
④针对构想出来的界面进行程序的编写。
参考文献:
【1】 谭浩强著,C 程序设计(第三版),北京:清华大学出版社,2005
【2】 谭浩强编著,C 程序设计解题与上机指导(第三版)。北京:清华大学出版社,2005
【3】 谭浩强著,C 程序设计教材,北京:清华大学出版社,2007
【4】 谭浩强著,C 语言程序设计(第二版),北京:清华大学出版社,2008
【5】 谭浩强编著,C++程序设计,北京:清华大学出版,2004
【6】 C 编写组,常用C 语言用法速查手册。北京:清华大学出版,2004
【7】 Brian W.Kernighan & Dennis M. Richie. The C programming Language(Second Editition).北京:机械工业出版社,2007
【8】 H M Peitel,P J Deitel. C How to {rogram. Second Edition.蒋才鹏.C 程序设计教程。北京:机械工业出版社,2000
【9】 Herbert Schildt 著。王曦若,李沛译。ANSI C 语言大全(第二版)。北京:学苑出版社,1994
【10】 Herbert Schildt著。戴建鹏译,C 语言大全(第二版)。北京:电子工业出版社,1994
【11】 Stephen Gkochan 著。 Programming in ANSI C.Hagden Books Indianapolis :Indiana ,U.S.A,1994