电信计费系统的数据维护与计费子系统.docx
《电信计费系统的数据维护与计费子系统.docx》由会员分享,可在线阅读,更多相关《电信计费系统的数据维护与计费子系统.docx(19页珍藏版)》请在冰豆网上搜索。
电信计费系统的数据维护与计费子系统
通达学院
专业课程设计II
题目:
电信计费系统的数据维护与计费子系统
专业)
学生姓名
班级学号
指导教师
指导单位
日期
教师评语
教师签名:
年月日
成绩评定
备注
电信计费系统的数据维护与计费子系统
一、课题内容和要求
客户帐单管理是电信计费系统必备的重要功能模块,主要负责对电信各类客户每月帐单的基本管理。
系统文件中存放了客户的基本信息以及用户在一定时间中通话的时间。
通过程序计算出该用户的话费。
二、需求分析
功能框架图如图所示:
1)提供可操作的主菜单:
输出主菜单,用于显示以从文件中加载的总客户信息和若干个可选的功能选项。
根据客户输入的选项来运行不同的功能,运行不同的函数。
2)进行文本信息的载入:
从指定的文件中以链表形式加载所需的客户信息并建立链表。
这里的文件是在编译时就已经指定好的、存在的文本,需设计者预先自己建立好。
3)查找客户功能:
以客户输入的客户的电话号码进行查找对应的客户信息并将它们输出。
4)对现有信息的保存:
保存内存中的最新的记录输出到磁盘文件中。
这里默认的是保存到原读取文件中并覆盖原来的信息。
5)将信息备份到另外的一个文本中:
通过文件格式读写函数,将源文件信息写到客户提供的目标文件中。
(C++在存储时可自动建立文件,可以不事先建立好。
)
6)统计客户的总费用:
根据客户的基本信息将基本月租费、来电显示费、市话费、长途话费进行合计,从而得到客户的总花费。
应注意每个名称的单一性,不可输出同一个名称。
三、概要设计
1)主要结构体:
structdata{
intyy,mm,dd,h,min,sec;
};
structcall{
boolbendi;
datastart,end;
};
structpeople
{
charname[20];
chartell[20];
boolshow;
callcap[200];
inttop;
doublemoney_in,money_out,money_tot;
inttot_time;
};
2)主要函数流程图:
(1)装载函数:
用于从文本中载入信息用于从文本中载入信系。
将文档中客户的基本信息以及客户的通话记录载入。
(见图3-1)
图3-1图3-2
图3-1图3-2
(2)查找函数:
利用用户输入的名称进行顺序查找并将找到的客户信息输出。
(见图3-2)
(3)保存文件函数:
将最新的内容通过文件读写,从内存中保存到原文本文件中(见图3-3)
(4)计算话费:
通过账单中的通话记录而算出用户的通话费用从而能得到用户的总费用,并显示出来。
(见图3-4)
图3-3图3-4
四、源程序代码
#pragmawarning(disable:
4786)
#include
#include
#include
#include
#include
#include
usingnamespacestd;
intmonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
structdata{
intyy,mm,dd,h,min,sec;
};
structcall{
boolbendi;
datastart,end;
};
structpeople
{
charname[20];
chartell[20];
boolshow;
callcap[200];
inttop;
doublemoney_in,money_out,money_tot;
inttot_time;
};
intis_run(intx){
if(x%4==0&&x%100||x%400==0)return1;
return0;
}
mapphonelist;
mapnamelist;
peoplea[100];
intn,m;
FILE*fin,*fout;
voidinit_yonghu()
{
phonelist.clear();
namelist.clear();
fin=fopen("yonghu.txt","r");
fscanf(fin,"%d\n",&n);
if(!
fin)
{
printf("can'topenfile.\n");
exit
(1);
}
for(inti=0;i{
charch;
fscanf(fin,"%s%s%s",a[i].name,a[i].tell,&ch);
if(ch=='Y')a[i].show=true;elsea[i].show=false;
stringstr=a[i].tell;
stringss=a[i].name;
phonelist[str]=i;
namelist[ss]=i;
a[i].top=0;
a[i].money_in=a[i].money_out=0;
a[i].money_tot=25+(a[i].show?
6:
0);
}
fclose(fin);
}
voidget_time_point(data&t,char*s)
{
inti,len=strlen(s);
intd[20];
for(i=0;it.yy=d[0]*1000+d[1]*100+d[2]*10+d[3];
t.mm=d[4]*10+d[5];
t.dd=d[6]*10+d[7];
t.h=d[8]*10+d[9];
t.min=d[10]*10+d[11];
t.sec=d[12]*10+d[13];
}
intget_time_during(datai,dataj)
{
intday=0,t;
intmostday;
if(i.yy{
for(t=i.yy+1;tfor(t=i.mm+1;t<13;t++)if(t==2)day+=month[t]+is_run(i.yy);elseday+=month[t];
for(t=1;t<=j.mm-1;t++)if(t==2)day+=month[t]+is_run(j.yy);elseday+=month[t];
}
else
for(t=i.mm+1;t<=j.mm-1;t++)
if(t==2)day+=month[t]+is_run(i.yy);elseday+=month[t];
if(i.mm==j.mm&&i.yy==j.yy)
day+=j.dd-i.dd-1;
else
{
if(i.mm==2)mostday=month[t]+is_run(i.yy);elsemostday=month[t];
day+=mostday-i.dd;
day+=j.dd-1;
}
inthour=23-i.h+j.h;
intminiter=59-i.min+j.min;
intsecond=59-i.sec+j.sec;
inttotals=day*24*3600+hour*3600+miniter*24+second;
returntotals/60;
}
voidinit_huadan()
{
fin=fopen("huadan.txt","r");
if(!
fin)
{
printf("can'topenfile.\n");
exit
(1);
}
fscanf(fin,"%d",&m);
chartime1[20],time2[20],zhujiao[20],beijiao[20];
for(inti=0;i{
fscanf(fin,"%s%s%s%s",zhujiao,beijiao,time1,time2);
stringstr=zhujiao;
intk=phonelist[str];
inttt=a[k].top;
if(beijiao[0]=='0')a[k].cap[tt].bendi=false;elsea[k].cap[tt].bendi=true;
get_time_point(a[k].cap[tt].start,time1);
get_time_point(a[k].cap[tt].end,time2);
//a[k].tot_time=get_time_during(a[k].cap[tt].start,a[k].cap[tt].end);
a[k].top++;
}
fclose(fin);
}
voidcal_huafei()
{
inti,j;
for(i=0;ifor(j=0;jif(a[i].cap[j].bendi)a[i].money_in+=get_time_during(a[i].cap[j].start,a[i].cap[j].end)*.1;
elsea[i].money_out+=get_time_during(a[i].cap[j].start,a[i].cap[j].end)*.7;
printf("电话号码用户姓名月租费功能费市内电话费用长途电话费用合计\n");
for(i=0;i{
a[i].money_tot+=a[i].money_in+a[i].money_out;
inttmp=a[i].show?
6:
0;
printf("%-10s%-15s25.00%d.00%-10.2lf%-9.2lf%-10.2lf\n",a[i].tell,a[i].name,tmp,a[i].money_in,a[i].money_out,a[i].money_tot);
}
}
voidmyprint()
{
inti;
printf("用户信息:
\n");
printf("姓名电话是否来电显示\n");
for(i=0;iprintf("%-15s%-15s%c\n",a[i].name,a[i].tell,(a[i].show?
'Y':
'N'));
printf("话单信息\n");
printf("主叫被叫开始时间截止时间\n");
fin=fopen("huadan.txt","r");
if(!
fin)
{
printf("can'topenfile.\n");
exit
(1);
}
fscanf(fin,"%d",&m);
chartime1[20],time2[20],zhujiao[20],beijiao[20];
for(i=0;i{
fscanf(fin,"%s%s%s%s",zhujiao,beijiao,time1,time2);
printf("%s%s%s%s\n",zhujiao,beijiao,time1,time2);
}
fclose(fin);
}
voidsave()
{
fout=fopen("money.txt","w");
if(!
fout)
{
printf("can'topenfile.\n");
exit
(1);
}
fprintf(fout,"电话号码用户姓名月租费功能费市内电话费用长途电话费用合计\n");
for(inti=0;i{
a[i].money_tot+=a[i].money_in+a[i].money_out;
inttmp=a[i].show?
6:
0;
fprintf(fout,"%-10s%-15s25.00%d.00%-10.2lf%-9.2lf%-10.2lf\n",a[i].tell,a[i].name,tmp,a[i].money_in,a[i].money_out,a[i].money_tot);
}
fclose(fout);
}
voidcheck_phone()
{
printf("请输入号码:
");getchar();
charstr[20];
gets(str);
strings=str;
if(phonelist.find(s)==phonelist.end())
printf("无此号码.\n");
else
{
inti=phonelist[s];
inttmp=a[i].show?
6:
0;
printf("电话号码用户姓名月租费功能费市内电话费用长途电话费用合计\n");
printf("%-10s%-15s25.00%d.00%-10.2lf%-9.2lf%-10.2lf\n",a[i].tell,a[i].name,tmp,a[i].money_in,a[i].money_out,a[i].money_tot);
}
}
voidcheck_name()
{
printf("请输入姓名:
");getchar();
charstr[20];
gets(str);
strings=str;
if(namelist.find(s)==namelist.end())
printf("无此用户.\n");
else
{
inti=namelist[s];
inttmp=a[i].show?
6:
0;
printf("电话号码用户姓名月租费功能费市内电话费用长途电话费用合计\n");
printf("%-10s%-15s25.00%d.00%-10.2lf%-9.2lf%-10.2lf\n",a[i].tell,a[i].name,tmp,a[i].money_in,a[i].money_out,a[i].money_tot);
}
}
intmain()
{
init_yonghu();
init_huadan();
printf("欢迎使用\n");
boolexi=false;
boolfirst=true;
intchoi;
while
(1)
{
printf(" \\\|///\n");
printf(" \\ .-.- //\n");
printf(". ( .@.@ )\n");
printf("+-------oOOo-----(_)-----oOOo---------+\n");
printf("| 0费用 |\n");
printf("| 1话单 |\n");
printf("| 2保存 |\n");
printf("| 3按号码查询 |\n");
printf("| 4按姓名查询 |\n");
printf("| 5退出 |\n");
printf("+---------------------Oooo------------+\n");
scanf("%d",&choi);
switch(choi)
{
case0:
if(first){cal_huafei();first=false;}elseprintf("已经计算过话费.\n");break;
case1:
myprint();break;
case2:
save();printf("保存成功.\n");break;
case3:
exi=true;break;
case4:
check_phone();break;
case5:
check_name();break;
default:
printf("inputwrong.\n");
}
system("pause");
if(exi)break;
}
printf("谢谢使用.\n");
return0;
}
五、测试数据及其结果分析
显示的主菜单界面:
欢迎使用客户帐单管理系统!
菜单:
0费用
1话单
2保存
3按号码查询
4按姓名查询
5退出
(1)费用:
输入:
0
(2)话单:
输入:
1
(3)保存:
输入:
2
(4)按号码查询:
输入:
4
(5)按姓名查询:
输入:
5
(6)保存
输入:
3
结果分析:
1)在输入菜单选项时如果输入的内容不是1-0之间的数字,而是其他数字,系统将继续执行等待下次正确的输入;若输入的为其他字符(字母或符号),系统将自动认为操作结束而退出系统。
2)在需要输入所须查找的名称处如输入名称不在系统中,系统提示错误并退出系统。
3)当需要进行输入各个量的信息时,如果客户输入信息格式不正确,系统将提示:
请输入所要寻找的客户名称:
can'tfindyourname!
而推出系统。
六、调试过程中的问题
(1)刚开始时我们尝试着用连表的形式来编程的,也是历经很多的困难变了一个程序出来,调试了很长的时间,过程中遇到的问题基本都是忘记定义链表最后的空。
虽然后来改用了C++编程的,但我们还是对连表的形式有了进一步的了解,我想这对我们以后的学习会有很大的帮助。
(2)程序要求里面有了要计算总费用的,还要是跨年和跨月的,所以后来调试了很长时间才把错误答案给搞真确了。
七、课程设计总结
我感觉自己最大的收获就是变得耐心了,真的如果没有耐心根本无法写好程序,调试好程序。
还有就是细心,因为运行程序时会出现各种错误,所以需要我细心的去看去找,享受找到问题解决问题的快乐。
做这个题,顺便也把这学期所学的知识复习了一遍,真的,几乎把所学的知识都用了。
我的C语言学习并不是很理想,因此这次程序设计给了我个很大的困惑。
自己也觉得难度很大。
通过这次的程序设计,发现了很多自己的不足,让我在以后的程序编写中能慢慢变强。
C语言演绎了面向对象程序设计的封装性、继承性和多态性,极大地降低了我设计软件的复杂性,很好改善了我的软件的重用性和可维护性,同时提高了软件的执行效率。
以后应该多做一些这样的东西,有助于拓展自己的思维,锻炼自己独立思考问题解决问题的能力,以及培养自己的耐心和细心。