电信计费系统客户帐单管理.docx
- 文档编号:5722358
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:42
- 大小:665.32KB
电信计费系统客户帐单管理.docx
《电信计费系统客户帐单管理.docx》由会员分享,可在线阅读,更多相关《电信计费系统客户帐单管理.docx(42页珍藏版)》请在冰豆网上搜索。
电信计费系统客户帐单管理
程序设计报告
(2012/2013学年第二学期)
题目:
电信计费系统客户帐单管理
专业
学生姓名
班级学号
指导教师
指导单位计算机软件教学中心
日期2013年05月29日
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
郭剑
2012年12月25日
评分等级
备注
评分等级有五种:
优秀、良好、中等、及格、不及格
电信计费系统客户帐单管理
一、课题内容和要求
客户帐单管理是电信计费系统必备的重要功能模块,主要负责对电信各类客户每月帐单的增加、修改、删除、查询、备份等管理工作。
本课题以中国电信企业客户帐单管理模块原型参照,要求基于单链表结构对文件存储的客户帐单数据进行排序、查找、计算、显示等造作。
通过此可以,熟练掌握单链表结构、文件读写、函数调用等知识,以及查找、排序典型算法的设计与应用。
二、需求分析
要能提供以下几个基本功能:
(1)用户资料文件与话单文件由程序设计人员预先从键盘上录入,用户资料文件中的数据记录不得少于30条,话单文件中的数据记录不得少于200条,且必须有跨月份、跨年份的通话记录话单。
(2)首先从硬盘读入用户资料和话单记录
(3)对话单进行计费处理,输出费用详单到指定的文件。
格式如下:
电话号码用户姓名月租费功能费市内电话费用长途电话费用合计
83470000ZhangQiang25.006.00xxxxxxxxxxxxx
83470001。
。
。
。
。
。
。
。
。
。
。
。
(4)异常话单提示。
有的话单可能是错误的,找出这些话单,不参加计费,另存为一个文件。
可能的出错话单有:
①一个号码的通话时长大于三天。
②一个号码在一个时间存在两条以上的记录。
功能框架图如图1所示
(1)提供可操作的主菜单:
输出个菜单,用于显示以从文件中加载的总客户信息和若干个可选的功能选项。
根据客户输入的选项来运行不同的功能,运行不同的函数。
(2)显示所有用户的功能:
根据选项可将文本里的用户信息在屏幕上显示出来。
(3)显示所有账单功能:
可将文本里的通话账单在屏幕上显示出来。
(4)添加用户功能:
可在屏幕上进行直接操作,将用户信息添加到记录里。
(5)添加账单功能:
操作同上,可将新的通话记录添加到记录里。
(6)按用户民查找功能:
输入记录里的用户民,可以查询与之相关的通话账单记录。
(7)按电话号码查找功能:
输入记录里的已有电话号码,可以查找相应的通话账单记录。
(8)输出花费功能:
在操控台和文本中,直接输出所有的花费详情。
三、概要设计
1、主要函数流程图如图2所示:
图2:
主程序图
图3:
操作菜单系统
图4:
显示所有信息菜单
图5:
插入数据菜单
图6:
计算话费函数
开始
图7:
:
判断话费正误函数
1、顾客类(Customer):
#include
#include
#include
classCustomer//定义一个顾客类
{
protected:
charName[20];//用户名
charNumber[15];//用户电话号码
charCID;//是否来电显示
public:
Customer(char*="",char*="",charcid='');//定义构造函数
~Customer();//定义析构函数
Customer(constCustomer&obj);//定义拷贝构造函数
char*GetName();//获得用户名字符型指针函数
char*GetNumber();//获得用户号字符型指针函数
charGetCID();//看用户是否有来电显示
friendistream&operator>>(istream&in,Customer&cus);//友元重载输入
friendostream&operator<<(ostream&out,constCustomer&cus);//友元重载输出
};
Customer:
:
Customer(char*na,char*num,charcid)
{
strcpy(Name,na);
strcpy(Number,num);
CID=cid;
}
Customer:
:
~Customer()
{
}
Customer:
:
Customer(constCustomer&obj)//构造函数的定义
{
strcpy(Name,obj.Name);
strcpy(Number,obj.Number);
CID=obj.CID;
}
char*Customer:
:
GetName()
{
returnName;
}
char*Customer:
:
GetNumber()
{
returnNumber;
}
charCustomer:
:
GetCID()
{
returnCID;
}
istream&operator>>(istream&in,Customer&cus)
{
in>>cus.Name;//输入用户名
in>>cus.Number;//输入用户号码
in>>cus.CID;//来电业务信息
returnin;
}
ostream&operator<<(ostream&out,constCustomer&cus)
{
out< : left); out< out< out< (1)< out< returnout; } 2、话单类(Bill): #include #include #include #include classBill { protected: charDialing[15]; charDialed[15]; charStartTime[15]; charEndTime[15]; public: Bill(char*dialing="",char*dialed="",char*stime="",char*etime="");//定义构造函数 ~Bill(); Bill(constBill&obj);//帐单的拷贝构造函数 char*GetDialing();//获得主叫号码 char*GetDialed();//获得被叫号码 char*GetStart();//获得起始时间 char*GetEnd();//获得结束时间 intGetDate();//获得日期 intGetTime();//获得通话时长 friendintmon_day(intyear,intmonth);//记录不同月份的天数 friendistream&operator>>(istream&in,Bill&bill);//友元重载输入 friendostream&operator<<(ostream&out,constBill&bill);//友元重载输出 friendintEstimate(char*m,char*n);//判断时间正误函数 }; Bill: : Bill(char*dialing,char*dialed,char*stime,char*etime) { strcpy(Dialing,dialing); strcpy(Dialed,dialed); strcpy(StartTime,stime); strcpy(EndTime,etime); } Bill: : Bill(constBill&obj) { strcpy(Dialing,obj.Dialing); strcpy(Dialed,obj.Dialed); strcpy(StartTime,obj.StartTime); strcpy(EndTime,obj.EndTime); } Bill: : ~Bill() { } char*Bill: : GetDialing() { returnDialing; } char*Bill: : GetDialed() { returnDialed; } char*Bill: : GetStart() { returnStartTime; } char*Bill: : GetEnd() { returnEndTime; } istream&operator>>(istream&in,Bill&bill) { in>>bill.Dialing; in>>bill.Dialed; in>>bill.StartTime; in>>bill.EndTime; returnin; } ostream&operator<<(ostream&out,constBill&bill) { out< : left); out< out< out< out< out< returnout; } intBill: : GetDate() { intDat[6]; doubledate=0; for(inti=0;i<6;i++) { Dat[i]=StartTime[i]-48;//文本文件读入时只能以字符型的形式,计算是转化成整形 date+=Dat[i]*pow(10,5-i); } return(int)date; } intBill: : GetTime() { returnEstimate(StartTime,EndTime); } intmon_day(intyear,intmonth)//记录不同月份的天数 { intday[12];//d数组12个成员为12个月份 day[0]=31;//给成员一一赋值 if(year%4==0&&year%100! =0||year%400==0)//判断是否是闰年 day[1]=29; else day[1]=28; day[2]=31; day[3]=30; day[4]=31; day[5]=30; day[6]=31; day[7]=31; day[8]=30; day[9]=31; day[10]=30; day[11]=31; returnday[month-1];//返回y年m月有多少天 } intEstimate(char*m,char*n)//判断时间正误函数 { inta[14],b[14];//a记录开始时间,b记录结束时间 for(inti=0;i<14;i++)//将字符型数字换算成整型 { a[i]=m[i]-48; b[i]=n[i]-48; } inty1,mon1,d1,h1,min1,s1;//开始时间的年月日时分秒 inty2,mon2,d2,h2,min2,s2;//结束时间的年月日时分秒 intx,y;//开始、结束时间的日、时、分统一换算成分钟,对应着x、y y1=a[0]*1000+a[1]*100+a[2]*10+a[3];//开始时间的年份 mon1=a[4]*10+a[5];//开始时间的月份 d1=a[6]*10+a[7];//开始时间的日期 h1=a[8]*10+a[9];//开始时间的时 min1=a[10]*10+a[11];//开始时间的分 s1=a[12]*10+a[13];//开始时间的秒 x=d1*24*60+h1*60+min1; y2=b[0]*1000+b[1]*100+b[2]*10+b[3];//结束时间的年份 mon2=b[4]*10+b[5];//结束时间的月份 d2=b[6]*10+b[7];//结束时间的日期 h2=b[8]*10+b[9];//结束时间的时 min2=b[10]*10+b[11];//结束时间的分 s2=b[12]*10+b[13];//结束时间的秒 y=d2*24*60+h2*60+min2; if(mon1>12||mon1<1||mon2>12||mon2<1|| h1>23||h1<0||h2>23||h1<0||min1>59||min1<0 ||min2>59||min2<0||s1>59||s1<0||s2>59|| s2<0||d1<1||d2<1||d1>mon_day(y1,mon1)||d2>mon_day(y2,mon2)) { return-1;//如果“月,日,时,分,秒”超出范围,则返回-1 } else { if(y1==y2)//判断同年 { if(mon1==mon2)//判断月份 { if((y-x<24*60*3)&&(y-x>0))//判断通话在三天内 { if(s1 returny-x+1; else returny-x; }else if(y==x)//开始结束分钟数相同 { if(s2>s1)//结束秒数大于开始秒数,就是正确的,否则错误 return1; else { cout<<"通话时间记录错误! "< return-1; } } else//通话不在三天内或结束时间小于开始时间则错误 { cout<<"通话时间记录错误! "< return-1; } } else { if(mon2-mon1! =1)//不再同一月的话,那么结束时间必须比开始时间大一月 { cout<<"通话时间记录错误! "< return-1; } else { if(s1 { returny-x+1+mon_day(y1,mon1)*24*60; } else { returny-x+mon_day(y1,mon1)*24*60; } } } } else//不同年的情况 { if(y2-y1==1&&mon1==12&&mon2==1)//不同年只能是去年的12月,当年的1月结束 { if(s1 { returny-x+1+31*24*60; } else { returny-x+31*24*60; } } else { cout<<"通话时间记录错误! "< return-1; } } } } 四、源程序代码. #include"Customer.h" #include"Bill.h" #include #include doublePrepaidFee=25.0,Cid=6.0,Local=0.1,Toll=0.7;//定义全局变量: 月租,来电显示费用市内电话单价和长途电话单价 constintMax=2000;//最大数组长度 charShowMainMeun();//显示主菜单 charShowSonMenu();//显示子菜单 voidShowCustomer();//显示所有客户信息 voidShowBill();//显示所有帐单信息 voidAddCusInfo();//添加用户信息 voidAddBilInfo();//添加帐单信息 voidSearchCusInfo();//按照客户查找帐单信息 voidSearchNumInfo();//按照号码查找帐单信息 voidCalculate(Customer*cus,Bill*bill,intm,intn);// voidShowAll();//输出所有帐单信息 voidShowWrongMess(Bill*bill,intn);//输出错误帐单的信息 boolCompare(intm,int*p,intn);//如果m与数组p[n]的任何一个数都不相等,那么就返回false intJudge(Bill*bill,intm,Billbil,intn);//判断bil帐单是否会发生冲突 charShowMainMeun() { cout<<"\t主菜单"< cout<<"\t============================================================"< cout<<"\t||"< cout<<"\t|输入1: 显示所有用户信息|"< cout<<"\t|输入2: 显示所有话单信息|"< cout<<"\t|输入3: 添加用户信息|"< cout<<"\t|输入4: 添加话单信息|"< cout<<"\t|输入5: 按客户名查找话单|"< cout<<"\t|输入6: 按号码查找话单|"< cout<<"\t|输入7: 输出所有话费信息|"< cout<<"\t|输入0: 结束操作|"< cout<<"\t||"< cout<<"\t============================================================"< cout<<"费用详单目录为: 电话号码-用户姓名-月份-月租费-功能费-市话-长途-合计"< cout<<"注: 时间24: 00算错误;计费月份按拨打电话时间算"< charchoice; cout<<"请输入操作选项: "< cin>>choice;//用户输入操作选项 returnchoice;//返回操作选项 } charShowSonMenu() { cout<<"\t============================================================"< cout<<"\t||"< cout<<"\t|输入0: 返回上一级菜单|"< cout<<"\t|输入1: 显示查询用户话费信息|"< cout<<"\t|输入2: 显示查询用户错误话单信息|"< cout<<"\t||"< cout<<"\t============================================================"< charchoice; cout<<"请输入操作选项: \n"; cin>>choice;//用户输入操作选项 returnchoice;//返回操作选项 } voidShowCustomer() { cout<<"\n\n"; CustomerCus[Max]; Billbill[Max]; ifstreaminf1("用户信息.txt"); intcount1=0; while(! inf1.eof()) { inf1>>Cus[count1]; cout< count1++; } ifstreaminf2("话单信息.txt"); intcount2=0; while(! inf2.eof()) { inf2>>bill[count2]; count2++; } inf1.close(); inf2.close(); charpoint; while((point=ShowSonMenu())! ='0') { if(point=='1') Calculate(SaveCus,SaveBill,2,count2); elseif(point=='2') ShowWrongMess(bill,count2); else cout<<"输入有误: 请重新
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电信 计费 系统 客户 帐单 管理