资源描述
课 程 设 计 报 告
课程名称 C语言程序设计
课题名称 库存信息数据库管理系统设计
专 业 测控技术与仪器
班 级 测控1201
学 号 201201200125
姓 名 郭稳
指导教师 何宏肖伟平
2012年 12 月 20 日
湖南工程学院
课 程 设 计 任 务 书
课程名称 C语言程序设计
课 题 库存信息数据库管理系统设计
专业班级 测控技术与仪器
学生姓名 郭稳
学 号 201201200125
指导老师 何宏 肖伟平
审 批
任务书下达日期 2012 年 12 月 20 日
任务完成日期 2013年 1 月 6 日
一、设计内容与设计要求
1.设计内容:
数据库管理系统设计
涉及的知识点:
①掌握并熟练运用C语言的基本数据类型与各种表达式,程序的流程控制语句;
②掌握函数的定义,函数的返回值,函数的调用,函数的形式参数和实际参数之间的关系;掌握变量的作用域与生存期,了解函数的作用域。
③掌握并熟练运用库函数的应用。
④掌握数组的基本概念。熟练掌握一维数组、二维数组的应用、掌握字符数组
与字符串的关系以及字符串的简单处理。
⑤掌握结构的概念,结构类型的定义,结构变量的定义和初始化,结构成员的表示,结构的赋值含义,结构与指针、函数的关系。
题目具体要求:
数据库管理系统设计
题目:库存信息管理系统
从文件读取数据,提供新增、删除、修改和显示等功能,并将修改后的数据写入一个新的文件。
库存表单如下:
编号: int 4bytes
库存物品名称: char 20bytes
库存物品数量: int 2bytes
库存物品单价: int 4bytes
库存物品总额: int 4bytes
系统功能模块如下:
(1) 建立库存表单;
(2) 菜单实现以下功能:
①计算库存物品总额;
②显示库存表单信息;
③新增一个库存表单;
④库存物品出库(领出物品)(按库存物品编号);
⑤查询一个库存物品状态(按库存物品编号)。
⑥将修改后的库存物品表单存于一个新文件中。
2.设计要求:
1) 要求每个学生必须独立思考,认真并按时完成本课程设计所包含的所有内容;
2) 要求学生必须按照课程设计报告的完整格式说明设计内容,设计任务分析过程和算法,给出程序流程图和全部源程序;
3) 设计报告的完整格式应包括以下部分的内容:
① 设计总体思路;
② 程序及各个模块说明;
③ 总体模块框图;
④ 各个程序模块说明;
⑤ 程序流程图;
⑥ 程序清单;
⑦ 课程设计总结与体会(不少于400字)。
4) 上机时要求必到,设计完成,必须演示程序,答辩并提交设计报告。
5) 总评成绩由三部分组成:报告占20%,平时占20%,课程设计题目各占30%。
二、进度安排
星 期
1~ 2 节
3~ 4 节
5~ 6 节
7~ 8 节
晚上
17周星期一
布置任务,题目讲解
17周星期四
上机编程
17周星期六
上机编程
18周星期三
上机编程
19周星期四
上机编程、答辩
目 录
一、课题的主要功能 3
二、课题的功能模块的划分 5
I.文件读取模块 6
II.显示模块 6
III.求和模块 6
IV.追加模块 6
V.查询模块 6
VI.修改模块 6
VII.排序模块 6
VIII.删除模块 6
IX.文件存储模块 7
X.退出功能 7
三、主要功能的实现 7
I.文件读取模块 7
II.显示模块 8
III.求和模块 8
IV.追加模块 10
V.查询模块 11
VI.修改模块 12
VII.排序模块 13
VIII.删除模块 14
IX.文件存储模块 15
四、程序调试 16
I.文件读取 17
II.显示 18
III.求和 19
IV.追加 20
V.查询 21
VI.修改 23
VII.排序 24
VIII.删除 25
IX.文件存储 27
X.退出 28
五、总结 29
六、附件 30
一、课题的主要功能
总体功能设计:
库存信息管理系统的每个表单存放了库存物品的编号、库存物品的名称、库存物品的数量、库存物品的单价、库存物品的总额的数据库。每个表单都信息定义在一个结构体变量中。其结构如下:
库存物品的编号
库存物品的名称
库存物品的数量
库存物品的单价
库存物品的总额
no
name
num
price
sum
struct Sto
{int no;
char name[20];
int num;
int price;
int sum;
};
系统通过文件读取模块、显示模块、求和模块、追加模块、查询模块、修改模块、排序模块、删除模块、存储模块来实现库存信息管理系统的文件读取功能、显示功能、求和功能、追加功能、查询功能、排序功能、删除功能、存储功能。主函数采用菜单模式便于用户操作,而各个功能的调用通过主函数中的switch语句来实现。
switch(choice)
{
case 1:Read();break; 读取程序
case 2:Disp();break; 显示模块
case 3:Count();break; 求和模块
case 4:Append();break; 追加模块
case 5:Query();break; 查询模块
case 6:Modify();break; 修改模块
case 7:Sort();break; 排序模块
case 8:Delete();break; 删除模块
case 9:Save();break;存储模块
case 0:exit(0);退出
}
二、课题的功能模块的划分
主函数:
开始
结束
读数模块
显示模块
退出模块
求和模块
追加模块
查询模块
修改模块
排序模块
删除模块
保存模块
主函数
选择不同的模块
I.文件读取模块
通过设计一个模块,来实现库存信息的文件读取,免去用户重复输入数据的工作。
II.显示模块
通过设计一个模块,来实现库存信息的显示。以便于浏览库存的信息。
III.求和模块
通过设计一个模块,来实现库存总额计算。
IV.追加模块
通过设计一个模块,当要加入新的表单的信息的时候,来实现新库存表单信息的加入。
V.查询模块
通过设计一个模块,这个模块可以按库存表单的编号来查询该表单所有的信息。并且当成功查询到表单信息时,提示用户是否对该表单信息进行修改的功能;
VI.修改模块
通过设计一个模块,当某库存表单的信息发生变化的时候,可以通过修改模块来进行修改。当系统运行修改模块时,系统自动调用排序和显示模块将所有库存表单按库存编号排好顺序显示出来。使用户十分方便的找到要修改的数据。
VII.排序模块
通过设计一个模块,来实现数据库的信息按库存表单编号的升序排列。并显示所有信息,使浏览者一目了然。
VIII.删除模块
通过设计一个模块,当输入一个库存表单的编号时候,可以通过这个模块,将输入表单编号的所有信息从数据库中删除出去。以后,这个库存表单的信息将不再会出现再数据库中。
IX.文件存储模块
通过设计一个模块,将编辑好的库存表单信息存储到新文件中。
X.退出功能
该功能直接在菜单switch语句中实现。用户随时可以再菜单提示下选择此项功能退出系统。
三、主要功能的实现
I.文件读取模块
设置一个文件指针fp(如fp=fopen("d:\\x.txt","r")), fp是可找到存放库存文件信息的结构变量,然后通过fp提供的信息找到该文件,实施对文件的读取操作。在读取文件时,判断文件是否成功打开(fp==NULL?),当条件成立提示文件读取失败,结束该模块的运行,返回主菜单;否则进行文件读取,这里用一个while循环语句实现,一直读取至文件末尾,文件读取完毕后,提示文件读取成功,并关闭文件,结束该模块的运行,返回主菜单。
流程图:
否
fp=fopen("d:\\x.txt","r");
fp==NULL?
是
读取数据
文件读取成功!
开始
结束
文件读取失败!
II.显示模块
用一个for循环语句实现对每个表单的输出,并加上相应的格式输出做为边框,美化输出界面。
III.求和模块
使用for循环语句来实现库存总额计算,s[i].sum=s[i].num*s[i].price。
并定义一个total整型变量进行所有表单sum域的累加。total的累加结果就是所有库存总额。并加上一些格式输出美化输出界面。
流程图:
否
i<size?
是
total+=s[i].sum;
开始
结束
s[i].sum=s[i].num*s[i].price;
IV.追加模块
首先提示用户输入要追加表单的编号,再将输入的编号进行数据对比查询数据库中是否已存在该编号,若已经存在就提示错误信息,显示下一级菜单(是否继续追加)这些使用goto语句实现;否则就直接输入追加表单的相关信息。
开始
输入要追加的编号
判断是否存在该库存编号?
否
输入追加的数据
提示编号输入错误
是否重新继续输入编号
0.退出
1.继续
是
结束
V.查询模块
通过设计一个模块,这个模块可以按库存表单的编号来查询该表单所有的信息。并且当成功查询到表单信息时,提示用户是否对该表单信息进行修改的功能;
流程图:
提示用户没有找到数据。
输入您要查询的数据
开始
是否找到该数据?
输出库存信息
提示是否进行修改
是
否
0.不修改
1.修改
修改内容
结束
VI.修改模块
当系统运行修改模块时,系统自动调用排序和显示模块将所有库存表单按库存编号排好顺序显示出来。使用户十分方便的找到要修改的数据。然后提示用户输入将要修改的库存编号,判断该编号在数据库中是否存在,若不存在继续输入表单的其他详细信息;否则提示输入有误,出现二级菜单,选择是否重新输入库存编号。
流程图:
开始
输出所有库存表单信息,便于查看要修改数据
判断是否存在该库存编号?
否
输入修改的库存数据
是否重新输入编号
0.退出
1.继续
是
结束
输入要修改的库存编号
提示编号输入错误
VII.排序模块
程序运用冒泡排序方法(从第一个数开始依次对相邻两数进行比较,如次序对则不进行任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比较后,最大数已放在最后,第二遍只需考虑(N-1)个数,以此类推直到第(N-1)遍后就可以完成排序。)对所有库存表单编号进行升序排列,并通过调用Disp函数输出排序后的数据。
流程图:
开始
按库存编号排序
调用Disp()函数
结束
VIII.删除模块
流程图:
输入您要删除的表单编号
开始
是否有该数据?
删除并提示成功删除的该库存信息,
是
否
结束
提示用户没有找到要删除的数据。
按编号顺序输出所有库存表单,便于找到要删除的表单数据。
1.继续删除
1.继续删除
0.退出
0.退出
IX.文件存储模块
通过设计一个模块,将编辑好的库存表单信息存储到新文件中。
流程图:
否
存储数据
flag==0?
是
文件保存成功!
开始
结束
文件保存失败!
flag=fclose(fp)
四、程序调试
进入系统
I.文件读取
主菜单选择1:
如果数据文件存在时,则显示:
否则显示:
II.显示
主菜单选择2:
III.求和
主菜单选择3:
IV.追加
主菜单选择4:
系统会提示用户输入将要追加的库存编号;如果输入的编号在数据库中已经存在,则会出现下一级菜单(下图1);
图1
(选择1,重新进入追加模块;选择0,则回到主菜单;若用户输入的不是0或1, 则会不断提示该级菜单)
如果没有相同的编号则出现提示用户输入库存详细信息(下图2);
图2
V.查询
主菜单选择5:
系统提示用户输入要查找的编号:
当成功查找到数据,出现二级菜单,用户可以选择是否进行修改。(选择1,修改库存详细内容;选择2,回到主菜单。)如输入:5(下图1所示);
图1
如果输入的是库存中不存在的编号
如:18 则会出现(下图2所示)
图2
VI.修改
主菜单选择6:
首先将库存的所有表单有序输出(便于找到数据修改);提示用户输入要修改数据的表单:
当输入的数据编号是库存中不存在的编号,会提示错误,并出现二级菜单(选择1,重新进入修改模块;选择0,则回到主菜单;若用户输入的不是0或1, 则会不断提示该级菜单)
(如下图1);
图1
VII.排序
主菜单选择7:
按编号升序排序方式输出库存表单:
VIII.删除
主菜单选择8:
首先将库存的所有表单有序输出(便于找到删除数据);提示用户输入要删除数据的表单编号:
当成功删除数据时,提示删除成功。出现二级菜单,用户可以选择是否继续删除。(选择1,程序重新回到删除模块;选择2,回到主菜单。)
如输入:9(如下图1所示)
图1
当未找到删除数据时,提示错误信息。出现二级菜单,用户可以选择是否继续删除。(选择1,程序重新回到删除模块;选择2,回到主菜单。)
如输入:144(如下图2所示)
图2
IX.文件存储
主菜单选择9:
文件成功保存后:
保存出现意外:
X.退出
主菜单选择0:
五、总结
通过这周的课程设计,通过实践来理解和巩固理论知识,使我对C语言程序设计有了一个更加深入的认识,对于我来说,我感觉自己是很幸运的,看着周围的同学学习C语言的过程,初学者的他们,让我回想起我刚刚学习PASCAL语言的经历。想起自己那时,因为对计算机的兴趣,一无所知自己就去书城买了一本编程书看了看,那时刚看还是很有韵味,看着看着,一方面很多知识都不是高中所涉及的,另外一个最重要的方面就是自己没有电脑,缺少实践的过程。其实C语言和PASCAL语言这两种语言语法有点点不同而已。所以我对自己的评价就是进入大学学习C语言之前,我算得上是懂得点点皮毛的。
从刚开始的初略了解到有了比较深入的认识,能够比较灵活的运用。C语言是一门比较灵活、有趣而且实践性非常强的课程,单从理论课上是难以领略到它的精髓,我们只有从它的实践运用中,才能体会到了学习C语言的乐趣和好处,才能体会到了学习计算机的乐趣。在学习的过程中问题是常常有的,这些我都不畏惧,重要的是我学会了分析问题,解决问题这才是我最大的收获,我也渐渐喜欢这种感觉,喜欢这种处理问题的感觉。
C语言的学习更是为我们以后学习的微机原理以及单片机原理奠定了基础。我们的专业是测控技术,主要是跟电子仪器产品打交道,后面用到C语言的地方还有许多,所以说,学好C语言,为我们以后专业知识的学习有很大好处。在学习C语言中更使我体会到了学习计算机技术的乐趣,我将更加努力多学,学好计算机技术。
六、附件
源代码:
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "stdlib.h"
int size=0;/*全局变量*/
struct Sto
{int no;
char name[20];
int num;
int price;
int sum;
};
struct Sto s[100];
void Read()
{
int i=0;
FILE *fp;
fp=fopen("d:\\x.txt","r");
if(fp==NULL)
{ printf("\a\n");
printf("\t\t#############################################\n");
printf("\t\t## ##\n");
printf("\t\t## 文件读取失败! ##\n");
printf("\t\t## ##\n");
printf("\t\t#############################################\n\n\n\n");
}else
{
printf("\t\t#############################################\n");
printf("\t\t## ##\n");
printf("\t\t## 文件读取成功! ##\n");
printf("\t\t## ##\n");
printf("\t\t#############################################\n");
while( fscanf(fp,"%d\n%s\n%d\n%d\n",&s[i].no,s[i].name,&s[i].num,&s[i].price)!=EOF)
i++;
fclose(fp);
size=i;
}
}/*文件读取数据*/
void Disp()
{int i;
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * *\n");
printf(" * 编号 名称 数量 价格 总额 *\n");
for(i=0;i<size;i++)
printf(" * %-12d%-20s%-12d%-12d%-12d*\n",s[i].no,s[i].name,s[i].num,s[i].price,s[i].sum);
printf(" * *\n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
}/*显示*/
void Count()
{int i,total=0;
for(i=0;i<size;i++)
{s[i].sum=s[i].num*s[i].price;
total+=s[i].sum;
}
Disp();
printf(" * 表单库存总额:%-22d *\n",total);
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\n\n\n");
}/*计算库存物品总额*/
void Sort()
{int i,j;
struct Sto t;
for(i=0;i<size;i++)
for(j=i;j<size;j++)
if(s[i].no>s[j].no){t=s[i];s[i]=s[j];s[j]=t;}
printf("按编号排序的表单:\n");
Disp();
}/*排序(采用的是冒泡排序)*/
void Append()
{int i, no,flag=0,c;//flag用于标志是否添加相同了的编号
A1:
printf("新增编号:");
scanf("%d",&no);
for(i=0;i<size;i++)
if(no==s[i].no)
{flag=1;
break;
};
if(flag==0)//没有相同的编号,直接修改
{
s[size].no=no;
printf("请输入名称:");
scanf("%s",s[size].name);
printf("请输入数量和价格:");
scanf("%d%d",&s[size].num,&s[size].price);
s[i].sum=s[size].num*s[size].price;
size++;}
else//有相同的编号,发出警报,提示错误,重新输入修改的编号
{printf("\a\n");
printf("\t\t#############################################\n");
printf("\t\t## ##\n");
printf("\t\t## 您输入的数据编号已存在,请重新输入编号:##\n");
printf("\t\t## ##\n");
printf("\t\t#############################################\n\n\n\n");
flag=0;
A2: printf("\t\t#############################################\n");
printf("\t\t## ##\n");
printf("\t\t## 是否继续追加其它库存?(1.继续 0.退出) ##\n");
printf("\t\t## ##\n");
printf("\t\t#############################################\n\n\n\n");
scanf("%d",&c);
if(c==1)goto A1;
else if(c==0) ;
else goto A2;
}
}/*新增库存表单*/
void Modify()
{int no,c,flag=0,i;
//flag 找到修改的数据标志。
M1:
printf("已有的表单:\n");
Sort();
printf("\n\n");//给用户显示已经有了的排序数据,便于找到用户要修改的表单。
printf("\t\t#############################################\n");
printf("\t\t## ##\n");
printf("\t\t## 请输入您要修改的数据的编号 ##\n");
printf("\t\t## ##\n");
printf("\t\t#############################################\n\n\n\n");
scanf("%d",&no);
for(i=0;i<size;i++)
if(no==s[i].no)//当找到数据
{
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * 这 是 要 修 改 编 号 的 内 容 *\n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * *\n");
printf(" * 编号 名称 数量 价格 总额 *\n");
printf(" * %-12d%-20s%-12d%-12d%-12d*\n",s[i].no,s[i].name,s[i].num,s[i].price,s[i].sum);
printf(" * *\n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\n\n\n");
printf("请输入新的名称:");
scanf("%s",s[i].name);
printf("请输入新的数量和价格:");
scanf("%d%d",&s[i].num,&s[i].price);
s[i].sum=s[i].num*s[i].price;
flag=1;
break;
};
if(flag==0)//当没有找到数据,发出警报,提示。
{
printf("\a\n");
printf("\t\t#############################################\n");
printf("\t\t## ##\n");
printf("\t\t## 对不起!没找到要修改的数据 ##\n");
printf("\t\t## ##\n");
printf("\t\t#############################################\n\n\n\n");
M2: printf("\t\t#############################################\n");
printf("\t\t## ##\n");
printf("\t\t## 是否修改其他编号?(1.修改 0.不修改) ##\n");
printf("\t\t## ##\n");
printf("\t\t#############################################\n\n\n\n");
flag=0;
scanf("%d",&c);
if(c==1)goto M1;
else if(c==0) ;
else goto M2;
}
}/*修改信息*/
void Query()
{int i,c,no,flag=0;//flag数据查询结果的标志
printf("\t\t#############################################\n");
printf("\t\t## ##\n");
printf("\t\t## 请输入您要查询的数据的编号: ##\n");
printf("\t\t## ##\n");
printf("\t\t#############################################\n\n\n\n");
scanf("%d",&no);
for(i=0;i<size;i++)
if(no==s[i].no)
{
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * 成 功 找 到 数 据 ! *\n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * *\n");
printf(" * 编号 名称 数量 价格 总额 *\n");
printf(" * %-12d%-20s%-12d%-12d%-12d*\n",s[i].no,s[i].name,s[i].num,s[i].price,s[i].sum);
printf(" * *\n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\n\n\n");
Q1: printf("\t\t#############################################\n");
printf("\t\t## ##\n");
printf("\t\t## 是否对其修改?(1.修改 0.不修改) ##\n");
printf("\t\t## ##\n");
printf("\t\t#############################################\n\n\n\n");
scanf("%d",&c);
if(c==1)
{
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * 这 是 要 修 改 编 号 的 内 容 *\n");
printf(" * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf(" * *\n");
pri
展开阅读全文