资源描述
重庆科技学院《C语言程序设计》课程设计报告
第1章 设计题目的内容、任务及具体要求
1.1 设计题目的内容
明确课程设计的目的,能根据课程设计的要求,查阅相关文献,为完成设计准备必要的知识; 提高学生用高级语言进行程序设计的能力,重点提高用C语言进行文件操作和绘图应用的编程技术水平;初步了解软件开发的一般方法和步骤; 提高撰写技术文档的能力.
1.2 设计题目的任务
主要利用c语言的文件操作能力设计开发一个小型的管理信息系统。至少具备如下功能:个人消费记录登记,消费信息查询和分类统计。操作界面要符合用户的一般习惯,图形或文本界面皆可
1.3设计具体的要求
可以对记录的信息进行添加,修改;能对历史记录进行查询与删除;要求功能界面设计美观,清晰,方便操作.
1).进一步掌握运用C进行程序设计的能力;
2).进一步理解和运用面向过程程序设计的思想和方法;
3).初步掌握开发一个小型实用系统的基本方法;
4).学会调试一个较长程序的基本方法;
5).学会利用互联网查找相关的知识并学习;
第2章 总体设计思路
2.1数据录入模块设计
本模块的设计主要包括三个函数,mainmenu(……), Record (……), Recordxinxi(……)函数 。
mainmenu(……)函数主要是对录入数据时录入时录入方法的选择操作。函数在屏幕上显示选择主菜单,以供操作者进行录入选择。
Record (……)函数的主要实现程序的初始建库,把数据写如到文件中。其主要过程是一二进制写入文件打开文件,然后调用Recordxinxi(……)函数,将需要录入的数据从键盘输入到计算机内,然后写入到文件。
2.2查询模块设计
本模块主要设计Seekxinxi(……)函数、print(……)函数。
Seekxinxi(……)函数主要是程序查询菜单的显示、输出你要查询的信息。查询菜单包括输入日期查询、输入名称查询、输入消费类别查询、查询所有历史记录信息。他首先在屏幕显示查询选择菜单,然后利用一个switch()选择语句来根据输入的信息以读的方式打开文件,进行读取。如果找到相应的信息,将该信息通过调用print函数将该信息输入到屏幕上,若没找到则显示当前无记录。
Print()函数是将信息输出到屏幕上。
2.3信息删除模块设计
本模块的设计是Deletexinxi(……)函数 ,它主要的功能是删除已有的信息、显示要删除的信息。
Deletexinxi(……)函数先以录入信息的日期进行历史记录的查找,然后再根据自己要删除的文件输入记录信息的名称,即可将已有的信息删除掉。要是输入有错,屏幕就会显示无次信息,输入有错。要是输入的名称文件存在,屏幕将显示你是否确定删除此条记录,这样就达到删除的功能。
2.4数据显示模块设计
本模块主要包括print()函数,主要用与输入数据的浏览,将录入文件中的数据输出到屏幕上,其过程是以读的方式打开文件,然后进行读取,将读到的结果显示在屏幕上。若文件中无记录,则显示无此信息,输入有错。
2.5修改已有信息模块设计
本模块主要是Revisexinxi(……)函数,主要是先根据信息记录日期查找出历史信息记录,然后在历史信息记录中找出要修改的文件,输入消费名称,若输入有错,屏幕会出现无此信息输入有错的提示。若输入的名称正确,此时屏幕会出现提示,是否确定修改此条记录。这样即达到修改的目的。此函数的编写和信息的删除函数差不多,但要把已经修改的信息保持到文件中才能达到修改的目的。
2.6总体框价图
输入编号
0) 退出
输入记录日期
信息录入
信息修改
信息删除
信息查询
信息保持
信息读取
录入具体信息
输入修改信息
确认修改
输入记录日期
输入名称删除
确认删除
选查询项目
输日期
输名称
输类别
查所有
输入保存名称
输读取名称
图2.6.1总体框架图
第3章 各功能模块流程图
信息录入模块
3.1 主函数模块
开始
0) 结束
选择
输出信息
信息录入模块
信息修改模块
信息删除模块
信息查询模块
信息保持模块
信息读取模块
图3.1 总体程序模块运行流程图
3.2 调用函数流程图
3.2.1信息的删除
变量和过程
在删除过程中,定义了变量I,j,op,和两个数组char name[].char date[]。在删除过程中先是通过输入日期进行历史纪录查找,然后再通过查找结果输入名称进行删除。
关键代码分析:
该段代码为:
int Deletexinxi() //信息删除函数
{
char date[50],name[30],op;
int i,j;
system("color 5d");
printf("***********************************************************************\n");
printf("请输入要删除的历史记录信息\n");
printf(" 信息记录日期:");
scanf("%s",date);
for(i=0;i<zd;i++)
{
if(strcmp(date,JiLu[i].date)==0)
print(i);
}
printf("请在以上选择要删除的纪录\n");
printf(" 消费名称:");
scanf("%s",name);
for(i=0;i<zd;i++)
{
if( strcmp(name,JiLu[i].name)==0)
{
printf(" 下面的记录将要被删除\n");
print(i);
printf(" 是否确定要删除这条记录(y/n)? ");
printf("\n");
op=getchar();
if(op=='Y' || op=='y')
{
for(j=i;j<totalnum-1;j++)
JiLu[j]=JiLu[j+1];
totalnum-=1;
}
printf(" 信息已删除!!!\n\n ");
return 1;
}
}
printf(" 无此信息,输入错误 !!!\n");
return 0;
}
该删除程序主要通过for循环语句,对输入的内容进行判断,删除是只需在历史查找出来的纪录中输入要删除的名称,在通过函数strcmp()进行判断信息是否输入正确,让后再提示是否进行删除操作。
信息删除模块图
图3.2信息删除模块流程图
3.2.2信息查询模块图
功能:该模块可以查询历史消费记录,查询过程有通过日期查询,通过名称查询,通过类别查询,还可以查询所有历史记录。
关键代码分析:
void Seekxinxi() //信息查询函数
{
int i;
char opercode,info[20];
system("color 12");
printf(" 个人消费信息查询\n\n\n");
printf(" 1.输入日期查询 2.输入名称查询 \n\n ");
printf(" 3.输入消费类别查询 4.查询所有历史记录\n\n");
opercode=getchar();
switch(opercode)
{
case '1':
printf("输编日期查询:");
scanf("%s",info);
for(i=0;i<zd;i++)
{
if(strcmp(info,JiLu[i].date)==0)
print(i);
else
printf("\n当前无记录!\n\n\n");
break;
}
break;
case '2':
printf("输名称查询:");
scanf("%s",info);
for(i=0;i<zd;i++)
{
if(strcmp(info,JiLu[i].name)==0)
print(i);
else
printf("\n当前无记录!\n\n\n");
break;
}
break;
case '3':
printf("输消费类别查询:");
scanf("%s",info);
for(i=0;i<zd;i++)
{ if(strcmp(info,JiLu[i].type)==0)
print(i);
else
printf("\n当前无记录!\n\n\n");
break;
}
break;
case '4':
if(totalnum !=0 )
{ printf("所有历史记录显示如下\n");
printf("*******************************************************\n");
for(i=0;i<totalnum;i++)
{
print(i);
}
}
else
printf("\n当前无记录!\n\n\n");
break;
default:
printf("\n输入错误,请检查!!!\n");
}
}
该函数也是先通过定义switch(opercode)函数,用4条case语句来对信息进行查询,最后通过调用函数print(i)来读查询结果进行输出。
流程图:
图3.2.2信息查询模块流程图
上图的流程图上点击IF后的流程图如图3.2.2.1所示:
图3.2.2.1查询模块流程图
3.2.3信息修改流程图
功能:该函数可对一记录的历史信息进行修改。
关键代码分析:
int Revisexinxi() //信息修改函数
{
char date[50],name[30],op;
FOOD pp;
int i;
system("cls");
system("color 0c");
printf("**********************************************************************\n");
printf("请在下面输入要修改的消费信息\n\n");
printf(" 信息记录日期:");
scanf("%s",date);
for(i=0;i<zd;i++)
{
if(strcmp(date,JiLu[i].date)==0)
print(i);
}
printf("请在以上选择要修改信息的消费名称\n");
printf(" 消费名称:");
scanf("%s",name);
printf("\n");
for(i=0;i<zd;i++)
{
if(strcmp(name,JiLu[i].name)==0)
{
printf(" 下面的记录将要被修改!\n\n");
print(i);
printf(" \n请输入修改后的记录值:\n\n");
Record(&pp);
printf(" 是否确定修改此条记录(y/n)? \n ");
op=getchar();
if(op=='Y' || op=='y')
{
JiLu[i]=pp;
printf(" 信息已修改~!!!\n\n\n");
}
return 1;
}
}
printf(" 无此信息,输入有错!!!\n\n");
return 0;
}
该函数也是主要通过函数strcmp()对信息进行修改,先是输入要修改的名称,在通过函数strcmp()进行比较判断是否存在,若存在则通过函数print()打印出要修改的信息,最后通过提示输入修改后的新信息。
流程图:
图3.2.3信息修改模块流程图
3.2.4信息保存函数流程图
功能:该函数可对输入的信息进行保存。
关键代码分析:int Savexinxi() //信息保存函数
{
char Savename[30];
FILE *fp=0;
system("color 1a");
printf("*****************************************************************\n");
printf(" 请输入保存文件的文件名:\n");
scanf("%s",Savename);
fp=fopen(Savename,"wb");
if(fp==NULL)
{
printf("不能保存文件:%s\n",Savename);
return -1;
}
fwrite(&totalnum,sizeof(int),1,fp);
fwrite(JiLu,sizeof(FOOD),totalnum,fp);
fclose(fp);
printf("注意:%5d记录已经被成功的写入文件:%s!!\n",totalnum,Savename);
printf("*****************************************************************\n");
return totalnum;
}
该函数主要通过函数fopen()与fowrite()对已输入的信息进行保存。
流程图:
已
图3.2.4信息保存模块流程图
3.2.5信息读取函数流程图
功能:对一保存好的信息进行读取显示。
关键代码分析:
int Readxinxi() // 信息读取函数
{
char Filename[30];
FILE *fp=0;
system("color 6b");
printf("****************************************************************\n");
printf("要读取文件,请输入一个包含完整路径的文件名:\n");
scanf("%s",Filename);
fp=fopen(Filename,"rb");
if(fp==NULL)
{
printf("不能打开指定的文件:%s,或文件不存在!\n",Filename);
return -1;
}
fread(&totalnum,sizeof(int),1,fp);
fread(JiLu,sizeof(FOOD),totalnum,fp);
fclose(fp);
printf("注意:%5d记录已从文件%s中成功读取出来!!\n",totalnum,Filename);
printf("*****************************************************************\n");
return totalnum;
}
该函数的实现与上面信息的保存的思路基本上相同
流程图:
图3.2.5信息读取模块流程图
第4章 设计效果
4.1进入程序
在下面的屏幕中选择一个功能编号,即可对系统进行相应操作
图4.1系统主界面
4.2 信息的添加
注意:在进行信息记录的过程中,输入消费名称时不能有空格键输入
图4.2息添加模块界面
4.3信息的修改
在主界面上点击修改历史信息纪录后将出现如下所示界面,根据提示即可对历史信息进行修改与保存.
图4.3信息修改模块界面
图4.3信息修改后的界面
4.4信息的删除
图4.3信息的修改界面
4.5信息的查询
在主页面输入查询功能键,即可对已有信息进行查询
图4.3信息的查询界面
4.6信息的保存
在保存信息时,在要保存的地址后面输入两个\\然后后面才是文件名.
图4.6信息保存界面
4.7信息的读取
图4.7信息读取界面
第5章 总结
设计体会
这次课程设计虽然只有短短的一周时间,但我却在此过程中获益匪潜。在这期间,我刚开始对于设计非常的茫然,还有在设计过程中面对不熟悉的知识的焦急,更有面对程序运行出错时的惆怅……不过当我最后把程序调试出来后,内心有着说不出的狂喜,成果的背后却有一丝丝的艰辛,但辛苦劳动后换来的是成功的喜悦
在程序的前期编译过程中,我感到很茫然,由于以前从来都没设计过这样的大程序,觉得无从下手。不过最后在老师的一点一点的指导下,我渐渐的有了一个大概的思路,寻着这点思路,我边开始我的程序编译。当然,在此过程中,遇到了很多的问题,有时程序编译事没错但就是连接不上,不能运行,于是我有再次细细的修改。这是我深深体会到编程是一件很谨慎的工作,必须要有科学的严谨态度才能避免少出现错误。而且编这样的程序也不是一朝一夕的事,要经过不断的尝试与努力,而且在编的过程中,有点什么灵感就要马上记下来。
一周的时间真是太短暂了,感觉好像一晃就过去了,通过这次的课题设计实践活动真让我获益不少。
致谢
在此,我正无比激动的写下这篇感谢辞,因为我已经完成了我的课题设计。我首先要感谢学校给了我一个在这里安心学习的机会,感谢学校提供了一个这么好的平台供我们展示自己的才华,感谢学校为我们提供了这么好的设施,感谢学校对我们的无微关怀……还有感谢我的老师,如果没有老师的指导,我也不会这么顺利的的完成我的课题设计……感谢我的同学们,在我遇到困难和疑问时,是他们不求回报和耐心的讲解,才让我克服重重困难,完成课题设计……我还要感谢我的父母,是他们的殷殷关怀和默默的支持,才让我有机会在这里学习
参考文献
[1]谭浩强等.C语言程序设计教程.北京:高等教育出版社,1997.
[2]谭浩强.C程序设计.第2版.北京:清华大学出版社,1999.
[3]郭浩志.C语言程序设计.北京.北京邮电大学出版社,2005.
[4]林学焦.Turbo C2.0用户手册.北京.学苑出版社,1993.
[5]谭浩强、张基温. C语言程序设计教程.北京:高等教育出版社,2006.
附录
6.1主函数程序代码
int main( )
{
char choice;
int opercode;
do
{
mainmenu();
choice=getchar(); getchar();
printf("\n\n\n");
switch(choice)
{
case'1':
Recordxinxi();
break;
case'2':
Revisexinxi();
break;
case'3':
Deletexinxi();
break;
case'4':
Seekxinxi();
break;
case'5':
Savexinxi();
break;
case'6':Readxinxi();
break;
case '0':
opercode=ExitSystem();
if(opercode==1)
{
printf("\n系统已经退出!!!\n");
exit(0);
}
else
break;
default:
printf("\n\n错误的功能编号,请重新输入!!!\n");
}
}while(1);
return 0;
}
6.2数据录入程序代码
void Record (FOOD *pp )
{
system("color 9d");
printf("请输入信息记录日期(nnnn-yy-rr):\n");gets(pp->date);
printf("请输入消费名称:\n");gets(pp->name);
printf("请输入所属类别:\n");gets(pp->type);
printf("请输入消费次数(次):\n");gets(pp->amount);
printf("请输入消费所花金额(元):\n");gets(pp->price);
printf("请输入情况描述:\n");gets(pp->describe);
}
void print(int index)
{
if(index>=0&&index<zd)
{
printf(" \n");
printf(" 信息记录日期:%-15s\n",JiLu[index].date);
getchar();
printf(" 消费名称:%-15s\n",JiLu[index].name);
printf(" 消费次数:%-15s\n",JiLu[index].amount);
printf(" 消费所花金额:%-15s\n",JiLu[index].price);
printf(" 所属类别:%-15s\n",JiLu[index].type);
printf(" 情况描述:%-15s\n",JiLu[index].describe);
printf(" \n");
}
}
void Recordxinxi()
{
system("cls");
printf("***************************************************************************\n");
if(totalnum<zd-1)
{
printf(" 请输入消费信息:\n");
Record(&(JiLu[totalnum]));
totalnum++;
system("cls");
}
else
{
printf(" 信息已满!!!\n ");
}
system("cls");
printf("****************************************************************************\n\n\n");
}
6.3信息删除程序代码
int Deletexinxi()
{
char date[50],name[30],op;
int i,j;
system("color 5d");
printf("***********************************************************************\n");
printf("请输入要删除的历史记录信息\n");
printf(" 信息记录日期:");
scanf("%s",date);
for(i=0;i<zd;i++)
{
if(strcmp(date,JiLu[i].date)==0)
print(i);
}
printf("请在以上选择要删除的纪录\n");
printf(" 消费名称:");
scanf("%s",name);
for(i=0;i<zd;i++)
{
if( strcmp(name,JiLu[i].name)==0)
{
printf(" 下面的记录将要被删除\n");
print(i);
printf(" 是否确定要删除这条记录(y/n)? ");
printf("\n");
op=getchar();
if(op=='Y' || op=='y')
{
for(j=i;j<totalnum-1;j++)
JiLu[j]=JiLu[j+1];
totalnum-=1;
}
printf(" 信息已删除!!!\n\n ");
return 1;
}
}
printf(" 无此信息,输入错误 !!!\n");
return 0;
}
6.4数据查询程序代码
void Seekxinxi()
{int i;
char opercode,info[20];
system("color 12");
printf(" 个人消费信息查询\n\n\n");
printf(" 1.输入日期查询 2.输入名称查询 \n\n ");
printf(" 3.输入消费类别查询 4.查询所有历史记录\n\n");
opercode=getchar();
switch(opercode)
{
case '1':
printf("输编日期查询:");
scanf("%s",info);
for(i=0;i<zd;i++)
{
if(strcmp(info,JiLu[i].date)==0)
print(i);
}
break;
case '2':
printf("输名称查询:");
scanf("%s",info);
for(i=0;i<zd;i++)
{
if(strcmp(info,JiLu[i].name)==0)
print(i);
}break;
case '3':
printf("输消费类别查询:");
scanf("%s",info);
for(i=0;i<zd;i++)
{ if(strcmp(info,JiLu[i].type)==0)
print(i);
}
break;
case '4':
if(totalnum !=0 )
{ printf("所有历史记录显示如下\n");
printf("*******************************************************\n");
for(i=0;i<totalnum;i++)
{
print(i);
}
}
else
printf("\n当前无记录!\n\n\n");
break;
default:
printf("\n输入错误,请检查!!!\n");
}
}
6.5修改程序代码
int Revisexinxi() //信息修改函数
{
char date[50],name[30],op;
FOOD pp;
int i;
system("cls");
system("color 0c");
printf("**********************************************************************\n");
printf("请在下面输入要修改的消费信息\n\n");
printf(" 信息记录日期:");
scanf("%s",date);
for(i=0;i<zd;i++)
{
if(strcmp(date,JiLu[i].date)==0)
print(i);
}
printf("请在以上选择要修改信息的消费名称\n");
printf(" 消费名称:");
scanf("%s",name);
printf("\n");
for(i=0;i<zd;i++)
{
if(strcmp(name,JiLu[i].name)==0)
{
printf(" 下面的记录将要被修改!\n\n");
print(i);
printf(" \n请输入修改后的记录值:\n\n");
Record(&pp);
printf(" 是否确定修改此条记录(y/n)? \n ");
op=getchar();
if(op=='Y' || op=='y')
{
JiLu[i]=pp;
printf(" 信息已修改~!!!\n\n\n");
}
return 1;
}
}
printf(" 无此信息,输入有错!!!\n\n");
return 0;
}
35
展开阅读全文