简单个人话费管理系统课程设计.docx
《简单个人话费管理系统课程设计.docx》由会员分享,可在线阅读,更多相关《简单个人话费管理系统课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
简单个人话费管理系统课程设计
怀化学院计算机系
《高级语言程序设计》课程设计报告书
简单个人话费管理系统
学生姓名:
**
学号:
**
年级专业及班级:
**
指导老师及职称:
**教授
专业:
计算机科学与技术专业
**·**
提交日期:
**年**月
简单个人话费管理系统
学生:
**
指导老师:
**
(**系,****)
摘要:
本次设计的目的是设计一个简单的个人话费管理系统,达到求余额、记录通话详细消息、查询呼叫号码等方面的功能。
既能使用户随时了解自己的话费支出,又能使用户及时根据系统统计的数据对以后的使用进行调整。
该系统主要针对所有手机及座机用户,主要采用的语言工具是C语言,编程的环境是VC6.0.系统有若干个功能函数组成,用到了结构体、函数调用、文件读写和常见的循环等手法,经过一次又一次的调式最终圆满完成任务。
在这次的动手过程中,我发现要很好地完成一个程序除了对专业知识的了解和熟练应用以外,还需要编程者有很好的耐性以及细心的良好习惯。
关键词:
结构体;文件;循环;C;
1前言
本次课程设计的目的是设计一个简单的个人话费管理系统,使用户随时了解自己的话费支出,并及时根据系统统计的数据对以后的使用进行调整。
难度为三颗星,并且要求具有以下基本功能:
1、输入记录功能(从键盘输入:
各次交费金额,各次呼出电话号码、日期、时间长短、长途与否。
设长途每分钟1元,短途每分钟0.3元)
2、统计余额、各次呼出电话金额。
3、统计长话总金额、短话总金额。
4、排序功能(按时间长短,显示各次呼出的电话号码)。
5、查询呼叫某电话的次数。
6、增加记录、删除记录、修改记录功能。
7、统计结果保存在文本文件中。
8、从文本文件中读取数据、显示。
针对题目的各项要求,我运用c语言工具在vc6.0的环境中,通过结构体数组、文件的打开与关闭、循环、函数调用等C语言常用方法的使用逐步解决了这些问题,编写出了一个满足要求的简单系统。
2设计分析
根据题目的要求,从输入记录这项功能可以知道,应该要定义一个结构体包含所有要输入的信息,并且为了方便起见,将需要求的余额等数值也包含在结构体内,由于记录的数据需要保存,所以系统中将用到文件的打闭、读写等功能。
该系统提供到了多项功能,于是考虑用一个switch语句,而控制该语句开关的值从调用函数中返回。
其中需要注意的问题有:
为了使源代码清晰明了,所有的函数不采取嵌套的用法,而是对每个功能都编写一个实现的函数,然后通过调用来达到题目要求。
另外一个值得注意的是电话号码以及日期的定义只能是字符数组,因为他们的第一个数都有为0的可能。
3实现方法
本程序通过c语言来实现,在vc6.0下运行通过。
3.1函数功能介绍
3.1.1定义一个信息结构体数组,方便对多条记录进行处理
structtype1
{
charno[15];
floatmoney;
chardate[10];
floattime;
floatleftlong,leftshort;
inta;
}H[SIZE];/*定义一个结构体数组*/
上述结构体中定义的量一次为:
所拨出的号码、各次所交话费金额、缴费日期、每次通话时间、长途总金额、短途总金额以及长短途的区分(长途用1表示,短途用0)。
3.1.2函数功能描述
1intmenu_select()打印输出主菜单和功能选择,并将选择值返回到主函数;
2voidenter()输入记录并保存;
3voidleavings()计算当前总余额;
4voidcosts()求通话所用金额和长短途所用金额总计;
5voidtimes()求所查询的号码的呼叫次数;
6voidappend()增加记录的实现;
7voiddel()删除记录功能的实现;
8voidcorrect()更正记录;
3.2函数功能实现
3.2.1源码分析
程序预处理:
#include"stdio.h"/*I/O函数*/
#include"stdlib.h"/*其它说明*/
#include"string.h"/*字符串函数*/
#defineSIZE100/*宏定义*/
3.2.2主函数
voidmain()
{
FILE*fp;/*定义一个文件指针,用于文件的开闭和读写*/
inti,j;
i=0;
if((fp=fopen("jilu.txt","r"))==NULL)/*打开文件并判断是否有记录*/
{
printf("无任何记录,请输入要记录的条数:
");
scanf("%d",&m);
}
else
{
while(!
feof(fp))/*当有记录的时候就读入记录*/
{
fread(&H[i],sizeof(structtype1),1,fp);
i++;
}
fclose(fp);
m=i-1;
if(!
m)/*当m=0的时候*/
{
printf("无任何记录,请输入要记录的条数:
");
scanf("%d",&m);
}
elseprintf("\n\n已有%d条记录!
\n");
}
getchar();
system("cls");/*c语言的清屏函数*/
for(;;)/*无限循环进行功能选择*/
{
switch(menu_select())
{
case1:
enter();break;
case2:
leavings();break;
case3:
costs();break;
case4:
sort();break;
case5:
times();break;
case6:
append();break;
case7:
del();break;
case8:
correct();break;
case9:
exit(0);
}/*此语句相当于一个调用函数的开关*/
getchar();
system("cls");
}
}
3.2.3被调用函数
intmenu_select()/*菜单函数*/
{
char*menu[]={"**************************菜单***************************",
"*1.读入记录并保存*",
"*2.总余额*",
"*3.电话金额统计(各次金额、长话总金额、短话总金额)*",
"*4.排序功能(按时间长短,显示各次呼出的电话号码)*",
"*5.查询呼叫某电话的次数*",
"*6.增加记录*",
"*7.删除记录*",
"*8.修改记录*",
"*9.退出*",
"*********************************************************"};
/*以上为菜单目录的制定*/
inti,c;
for(i=0;i<11;i++)
{
printf("%s\n",menu[i]);
}/*输出菜单*/
do
{
printf("Enteryouchoice(1~9):
\n");
scanf("%d",&c);
system("cls");
}while(c<1||c>9);
returnc;/*输入要实现的功能的选项并将其作为返回值带入主函数*/
}
voidenter()/*输入记录并保存功能*/
{
FILE*fp;/*定义文件指针*/
inti;
printf("*请输入11位的手机号码*\n");
for(i=0;i{
printf("输入通话的电话号码:
");
scanf("%s",H[i].no);
if(strlen(H[i].no)!
=11)
{
printf("sorry!
请重新输入\n");
i=i-1;
continue;
}
printf("\n缴费金额:
");
scanf("%f",&H[i].money);
printf("\n通话日期:
");
scanf("%s",H[i].date);
printf("\n通话时长(分):
");
scanf("%f",&H[i].time);
printf("\n长途1或短途0:
");
scanf("%d",&H[i].a);/*以上为输入记录*/
if(H[i].a)
{
H[i].leftlong=H[i].time;
H[i].leftshort=0;
}
else
{
H[i].leftlong=0;
H[i].leftshort=H[i].time*0.3;
}
}/*判断长短途,并分别计算总时间*/
if((fp=fopen("jilu.txt","w"))==NULL)
{
printf("cannotopenfile\n");
return;
}
for(i=0;iif(fwrite(&H[i],sizeof(structtype1),1,fp)!
=1)
printf("filewriteerror\n");
fclose(fp);
}/*把数据写入文件*/
voidleavings()/*计算当前总余额*/
{
FILE*fp1,*fp2;
inti;
floatt1=0,t2=0;
floatlea[SIZE];/*定义一个余额数组*/
floatleavings=0;
fp1=fopen("jilu.txt","r");
for(i=0;i{
fread(&H[i],sizeof(structtype1),1,fp1);
if(H[i].a==1)lea[i]=float(H[i].money-H[i].time);
if(H[i].a==0)lea[i]=float(H[i].money-H[i].time*0.3);
leavings+=lea[i];
}
fclose(fp1);/*从文件中读取记录并计算余额*/
fp2=fopen("jinge.txt","w");
fprintf(fp2,"%g",leavings);
fclose(fp2);
printf("余额为%g\n\n\n",leavings);/*将得到的余额保存在另一个文件中*/
getchar();
}
voidcosts()/*求通话所用金额和长短途所用金额总计*/
{
FILE*fp1,*fp2;
inti;
floatt1=0,t2=0;
floatcost1=0,cost0=0;
floatCOST;
fp1=fopen("jilu.txt","r");
for(i=0;i{
fread(&H[i],sizeof(structtype1),1,fp1);
cost1+=H[i].leftlong;
cost0+=H[i].leftshort;
}
fclose(fp1);/*读取数据并计算*/
COST=cost1+cost0;
fp2=fopen("jinge.txt","a");
fprintf(fp2,"%g%g%g",cost1,cost0,COST);
fclose(fp2);/*保存在另一个文件中*/
printf("\n\n\t长途通话费用合计\t短途通话费用合计\t总话费合计\n");
printf("\t%g\t\t\t%g\t\t\t%g\n",cost1,cost0,COST);
getchar();/*所求值求后输出*/
}
voidsort()/*实现排序功能的函数*/
{
FILE*fp;inti,j,k;structtype1t;
fp=fopen("jilu.txt","r");
i=0;
while(!
feof(fp))
{
fread(&H[i],sizeof(structtype1),1,fp);
i++;
}
fclose(fp);/*文件中读取数据*/
m=i-1;
for(i=0;i{
k=i;
for(j=i+1;jif(H[j].timet=H[k];H[k]=H[i];H[i]=t;
}/*进行大小比较实现排序*/
for(i=0;i{
printf("\t通话时间\t电话号码\n");
printf("\t%g\t\t%s\n",H[i].time,H[i].no);
}/*排序结果输出*/
getchar();
}
voidtimes()/*查询某个号码的拨打次数*/
{
FILE*fp;
charnumber[15];
inti,j=0;
i=0;
fp=fopen("jilu.txt","r");
while(!
feof(fp))
{
fread(&H[i],sizeof(structtype1),1,fp);
i++;
}
m=i;
fclose(fp);/*文件打开数据读入*/
printf("输入你要查询的号码\n");
scanf("%s",number);
for(i=0;iif(strcmp(H[i].no,number)==0)j++;/*进行号码比对*/
printf("\t拔打次数:
%d\t次\n",j);
getchar();/*进行号码查询*/
}
voidappend()/*增加记录的实现*/
{
FILE*fp;
inti,j;
i=0;
fp=fopen("jilu.txt","r");
while(!
feof(fp))
{
fread(&H[i],sizeof(structtype1),1,fp);
i++;
}
fclose(fp);
m=i-1;
printf("输入要增加的记录条数(<100):
");
scanf("%d",&j);
for(i=m;i{
printf("\n输入通话的电话号码:
");
scanf("%s",H[i].no);
if(strlen(H[i].no)!
=11)
{
printf("sorry!
请重新输入\n");
i=i-1;
continue;
}
printf("\n缴费金额:
");
scanf("%f",&H[i].money);
printf("\n通话日期:
");
scanf("%s",H[i].date);
printf("\n通话时长(分):
");
scanf("%f",&H[i].time);
printf("\n长途1或短途0:
");
scanf("%d",&H[i].a);
if(H[i].a)
{
H[i].leftlong=H[i].time;
H[i].leftshort=0;
}
else
{
H[i].leftlong=0;
H[i].leftshort=H[i].time*0.3;
}
}/*将结构体中其他需计算的数据计算出来*/
m=i;
if((fp=fopen("jilu.txt","w"))==NULL)
{
printf("cannotopenfile\n");
return;
}
for(i=0;iif(fwrite(&H[i],sizeof(structtype1),1,fp)!
=1)
printf("filewriteerror\n");
fclose(fp);/*保存并关闭文件*/
}
voiddel()/*删除记录功能的实现*/
{
FILE*fp;
inti,j;
chara[15];
i=0;j=0;
if((fp=fopen("jilu.txt","r"))==NULL)
{
printf("无记录可删除!
\n");
getchar();
return;
}
while(!
feof(fp))
{
fread(&H[i],sizeof(structtype1),1,fp);
i++;
}
fclose(fp);
m=i-1;
if(!
m)
{
printf("无记录可删除!
\n");
getchar();
return;
}
printf("输入你要删除的记录的电话号码:
");
scanf("%s",a);
if((fp=fopen("jilu.txt","w"))==NULL)
{
printf("cannotopenfile\n");
return;
}
for(i=0;i{
if(strcmp(H[i].no,a)!
=0)
{
if(fwrite(&H[i],sizeof(structtype1),1,fp)!
=1)
printf("filewriteerror\n");
}
elsej++;
}
fclose(fp);
printf("\n\n共删除%d条记录!
\n",j);
getchar();/*修改后保存*/
}
voidcorrect()/*更正记录*/
{
FILE*fp;
inti;
structtype1t;
intc;
if((fp=fopen("jilu.txt","r"))==NULL)
{
printf("\n\n无任何记录可被修改!
\n");
getchar();
return;
}
i=0;
while(!
feof(fp))
{
fread(&H[i],sizeof(structtype1),1,fp);
i++;
}
fclose(fp);
m=i-1;
if(!
m)
{
printf("\n\n无任何记录可被修改!
\n");
getchar();
return;
}
system("deljilu.txt");
printf("输入你要修改的记录编号(>0&<%d):
",m+1);
scanf("%d",&c);
c--;
printf("\t\t旧记录\t\t新记录\n");
printf("电话号码:
\t%s\t",H[c].no);
scanf("%s",H[c].no);
printf("\n");
printf("缴费金额:
\t%g\t\t",H[c].money);
scanf("%f",&H[c].money);
printf("\n");
printf("通话时间:
\t%g\t\t",H[c].time);
scanf("%f",&H[c].time);
printf("\n长途1或短途0:
\t%d\t\t",H[c].a);
scanf("%d",&H[c].a);
printf("\n");
fp=fopen("jilu.txt","w");
for(i=0;iif(fwrite(&H[i],sizeof(structtype1),1,fp)!
=1)
printf("filewriteerror\n");
fclose(fp);
}
3.3程序演示
文件开始将出现如上界面;
输入记录的条数后回车将出现菜单界面如下:
选1~9这几项功能后将出现相应的界面,按照提示进行操作,即可完成目的。
下面分别看看这几个功能界面:
第一个:
第二个:
第三个:
第四个:
第五个:
第六个:
第七条:
第八条:
第九条:
3.4程序调试
在编此系统的过程当中,我和大家一样,也遇到了很多问题和错误。
该程序也是经过多番的改动,印象最深的就是,因为个人比较马虎,经常出现一些不必要范的错误,如多加了一个分号或者忘了加地址符等,有时候因为改动较多,甚至有括号不配对的情况出现,这时候,在程序编译时就会引发很多的错误提示,让人吓一大跳,由此可见编程严谨的精神不可少。
当然由于本身知识的不完善,编程时还出现了其他更专业一点的错误。
我的第一个程序就是因为对链表的不熟练导致运行前几项后就不能继续下去,多次调式不见效果后,只得从新编写,最后才得到现在的程序。
具体调式过程就不详细说明了。
4系统使用说明书
使用本系统需注意的地方:
1.本系统所需数据必须严格按照要求输入。
如电话属长途还是短途时,系统规定长短输入1,短途输入0等。
2.本系统适合个人用户使用;
5结论
,虽然接触c这么语言工具已经有一个学期了,但是这次却是我第一次对一个系统进行编写。
也从未想过自己也能做出这么实用的东西出来。
在这次的动手过程中,我收获了很多,除了对这门语言有了一个新的认识以外,还发现要很好地完成一个程序除了对专业知识的了解和熟练应用,还十分考验编程者的耐性和细心。