




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【电信计费系统客户帐单管理】电信账单 程序设计报告 ( xx / xx 学年 第 二 学期) 题 目: 专 学 生 班 级 指 导 指 导 日 电信计费系统客户帐单管理 业 姓 名 学 号 教 师 单 位 计算机软件教学中心 期 xx 年05月29日 电信计费系统客户帐单管理 一、 课题内容和要求 客户帐单管理是电信计费系统必备的重要功能模块,主要负责对电信各类客户每月帐单的增加、修改、删除、查询、备份等管理工作。本课题以中国电信企业客户帐单管理模块原型参照,要求基于单链表结构对文件存储的客户帐单数据进行排序、查找、计算、显示等造作。通过此可以,熟练掌握单链表结构、文件读写、函数调用等知识,以及查找、排序典型算法的设计与应用。 二、需求分析 要能提供以下几个基本功能: (1)用户文件与话单文件由程序设计人员预先从键盘上录入,用户资料文件中的数据记录不得少于30条,话单文件中的数据记录不得少于200条,且必须有跨月份、跨年份的通话记录话单。 (2)首先从硬盘读入用户资料和话单记录 (3)对话单进行计费处理,输出费用详单到指定的文件。格式如下: 电话号码 用户姓名 月租费 功能费 市内电话费用 长途电话费用 合计 83470000 Zhang Qiang 25.00 6.00 xxxxx xxxxx xxx 83470001 。 。 (4)异常话单提示。有的话单可能是错误的,找出这些话单,不参加计费,另存为一个文件。可能的出错话单有: 一个号码的通话时长大于三天。 一个号码在一个时间存在两条以上的记录。 功能框架图如图1所示 (1)提供可操作的主菜单:输出个菜单,用于显示以从文件中加载的总客户信息和若干个可选的功能选项。根据客户输入的选项来运行不同的功能,运行不同的函数。 (2)显示所有用户的功能:根据选项可将文本里的用户信息在屏幕上显示出来。 (3)显示所有账单功能:可将文本里的通话账单在屏幕上显示出来。 (4)添加用户功能:可在屏幕上进行直接操作,将用户信息添加到记录里。 (5)添加账单功能:操作同上,可将新的通话记录添加到记录里。 (6)按用户民查找功能:输入记录里的用户民,可以查询与之相关的通话账单记录。 (7)按电话号码查找功能:输入记录里的已有电话号码,可以查找相应的通话账单记录。 (8)输出花费功能:在操控台和文本中,直接输出所有的花费详情。 三、概要设计 1、主要函数流程图如图2所示: 图2:主程序图 图3:操作菜单系统 图4:显示所有信息菜单 图5:插入数据菜单 图6:计算话费函数 图7::判断话费正误函数 1、顾客类(Customer ): #include #include #include /控制输出格式 class Customer /定义一个顾客类 protected: char Name20; /用户名 char Number15; /用户电话号码 char CID; /是否来电显示 public: Customer(char* = ,char* = ,char cid= ); /定义构造函数 Customer(); /定义析构函数 Customer(const Customer & obj); /定义拷贝构造函数 char* GetName(); /获得用户名字符型指针函数 char* GetNumber(); /获得用户号字符型指针函数 char GetCID(); /看用户是否有来电显示 friend istream & operator (istream & in , Customer & cus); /友元重载 输入 friend ostream & operator ; Customer:Customer(char *na, char *num,char cid) strcpy( Name , na ); strcpy( Number , num ); CID=cid; Customer:Customer() Customer:Customer( const Customer & obj ) /构造函数的定义 strcpy( Name , obj.Name ); strcpy( Number , obj.Number ); CID=obj.CID; char* Customer:GetName() return Name; char* Customer:GetNumber() return Number; char Customer:GetCID() return CID; istream & operator (istream & in,Customer & cus) incus.Name; /输入用户名 incus.Number; /输入用户号码 incus.CID; /来电业务信息 return in; /友元重载 ostream & operator 2、话单类(Bill ): #include #include #include #include class Bill protected: char Dialing15; char Dialed15; char StartTime15; char EndTime15; public: Bill(char *dialing= ,char *dialed= ,char *stime= ,char *etime= );/定义构造函数 Bill(); Bill( const Bill & obj); /帐单的拷贝构造函数 char* GetDialing(); /获得主叫号码 char* GetDialed(); /获得被叫号码 char* GetStart(); /获得起始时间 char* GetEnd(); /获得结束时间 int GetDate(); /获得日期 int GetTime(); /获得通话时长 friend int mon_day(int year,int month); /记录不同月份的天数 friend istream & operator (istream & in ,Bill & bill); /友元重载输入 friend ostream & operator Bill:Bill(char *dialing,char *dialed,char *stime,char *etime) strcpy( Dialing , dialing ); strcpy( Dialed , dialed ); strcpy( StartTime , stime ); strcpy( EndTime , etime ); Bill:Bill(const Bill & obj) strcpy( Dialing , obj.Dialing ); strcpy( Dialed , obj.Dialed ); strcpy( StartTime , obj.StartTime ); strcpy( EndTime , obj.EndTime ); Bill:Bill() char* Bill:GetDialing() return Dialing; char* Bill:GetDialed() return Dialed; char* Bill:GetStart() return StartTime; char* Bill:GetEnd() return EndTime; istream & operator (istream & in,Bill & bill) inbill.Dialing; inbill.Dialed; inbill.StartTime; inbill.EndTime; return in; ostream & operator out out out out out out return out; int Bill:GetDate() int Dat6; double date=0; for(int i=0;i Dati=StartTimei-48; /文本文件读入时只能以字符型的形式,计算是转 化成整形 date+=Dati*pow(10,5-i); return (int)date; int Bill:GetTime() return Estimate(StartTime,EndTime); int mon_day(int year,int month) /记录不同月份的天数 int day12; /d数组12个成员为12个月份 day0=31; /给成员一一赋值 if( year%4=0 & year%100!=0 | year%400 = 0 ) /判断是否是闰年 day1=29; else day1=28; day2=31; day3=30; day4=31; day5=30; day6=31; day7=31; day8=30; day9=31; day10=30; day11=31; return daymonth-1; /返回y 年m 月有多少天 int Estimate(char *m,char *n) /判断时间正误函数 int a14,b14; /a记录开始时间,b 记录结束时间 for(int i=0;i ai=mi-48; bi=ni-48; int y1,mon1,d1,h1,min1,s1; /开始时间的年月日时分秒 int y2,mon2,d2,h2,min2,s2; /结束时间的年月日时分秒 int x,y; /开始、结束时间的日、时、分统一换算成分钟,对 应着x 、y y1=a0*1000+a1*100+a2*10+a3; /开始时间的年份 mon1=a4*10+a5; /开始时间的月份 d1=a6*10+a7; /开始时间的日期 h1=a8*10+a9; /开始时间的时 min1=a10*10+a11; /开始时间的分 s1=a12*10+a13; /开始时间的秒 x=d1*24*60+h1*60+min1; y2=b0*1000+b1*100+b2*10+b3; /结束时间的年份 mon2=b4*10+b5; /结束时间的月份 d2=b6*10+b7; /结束时间的日期 h2=b8*10+b9; /结束时间的时 min2=b10*10+b11; /结束时间的分 s2=b12*10+b13; /结束时间的秒 y=d2*24*60+h2*60+min2; if( mon112 |mon112 |mon2 h123 |h123 |h159 |min1 |min259 |min259 |s159 | s2mon_day(y1,mon1) |d2mon_day(y2,mon2) return -1; /如果“月,日,时,分,秒”超出范围,则返回-1 else if(y1=y2) /判断同年 if(mon1=mon2) /判断月份 if( (y-x0) ) /判断通话在三天内 钟计算 的,否则错误 误 时间大一月 if(s1s1) /结束秒数大于开始秒数,就是正确 return 1; else cout else /不同年的情况 if(y2-y1=1&mon1=12&mon2=1) /不同年只能是去年的12 月,当年的1月结束 if(s1 return y-x+1+31*24*60; else return y-x+31*24*60; else cout return -1; 四、源程序代码. #includeCustomer.h #includeBill.h #include #include double PrepaidFee=25.0,Cid=6.0,Local=0.1,Toll=0.7;/定义全局变量:月租, 来电显示 费用市内电话单价和长途电话单价 const int Max=2000; /最大数组长度 char ShowMainMeun(); /显示主菜单 char ShowSonMenu(); /显示子菜单 void ShowCustomer(); /显示所有客户信息 void ShowBill(); /显示所有帐单信息 void AddCusInfo(); /添加用户信息 void AddBilInfo(); /添加帐单信息 void SearchCusInfo(); /按照客户查找帐单信息 void SearchNumInfo(); /按照号码查找帐单信息 void Calculate(Customer *cus,Bill *bill ,int m,int n);/ void ShowAll(); /输出所有帐单信息 void ShowWrongMess(Bill *bill,int n);/输出错误帐单的信息 bool Compare(int m,int *p,int n); /如果m 与数组pn的任何一个数都不相等,那 么就返回false int Judge(Bill *bill,int m,Bill bil,int n); /判断bil 帐单是否会发生冲 突 char ShowMainMeun() cout cout = cout cout cout cout cout cout cout cout cout cout cout = cout 合计 cout char choice; cout cinchoice; /用户输入操作选项 return choice; /返回操作选项 char ShowSonMenu() cout = cout cout cout cout | cout | cout = char choice; cout cinchoice; /用户输入操作选项 return choice; /返回操作选项 void ShowCustomer() cout Customer CusMax; Bill billMax; ifstream inf1(用户信息.txt); int count1=0; while (!inf1.eof() inf1Cuscount1; cout count1+; ifstream inf2(话单信息.txt); int count2 =0; while (!inf2.eof() inf2billcount2; count2+; inf1.close(); inf2.close(); char point; while(point=ShowSonMenu()!=0) if(point=1) Calculate(SaveCus,SaveBill,2,count2); else if(point=2) ShowWrongMess(bill,count2); else cout void ShowBill() Customer CusMax; Bill billMax; ifstream inf1(用户信息.txt); | int count1=0; while (!inf1.eof() inf1Cuscount1; count1+; ifstream inf2(话单信息.txt); int count2 =0; while (!inf2.eof() inf2billcount2; cout count2+; inf1.close(); inf2.close(); char point; while(point=ShowSonMenu()!=0) if(point=1) Calculate(SaveCus,SaveBill,2,count2); else if(point=2) ShowWrongMess(bill,count2); else cout void ShowAll() Customer CusMax; Bill billMax; ifstream inf1(用户信息.txt); int count1=0; while(!inf1.eof() /录入顾客信息到Customer 类的数组cust 中 inf1Cuscount1; count1+; /有m-1个顾客 int count2=0; ifstream inf2(话单信息.txt); while(!inf2.eof() /录入账单记录到Bill 类的数组bill 中 inf2billcount2; count2+; /有n 个账单记录 inf1.close(); /关闭文件 inf2.close(); /关闭文件 Calculate(Cus,bill,count1,count2); void AddCusInfo() Customer CusMax; int num; cout cinnum; cout for( int n=0;n cinCusn; /输入添加的用户名 ofstream outf; outf.open(用户信息.txt,ios:app); /用app 方式打开文本,能直接在文本尾加入信息 for(n=0;n outf cout outf.close(); void AddBilInfo() Bill billMax; int num; cout cinnum; cout cout for( int n=0;n cinbilln; ofstream outf; outf.open(话单信息.txt,ios:app); /用app 方式打开文本,能直接在文本尾加入信息 for(n=0;n outf cout outf.close(); void SearchCusInfo() char Name20; cout cinName; Customer CusMax; Bill billMax; ifstream inf1(用户信息.txt); int count1=0; while (!inf1.eof() /录入顾客信息到Customer 类数组Cus 中 inf1Cuscount1; count1+; /记录总共有(count1-1)个顾客 ifstream inf2(话单信息.txt); int count2 =0; while (!inf2.eof() inf2billcount2; count2+; /总共有count2条话单 inf1.close(); inf2.close(); Customer SaveCus1; Bill SaveBillMax; /保存该用户的话单信息 int i=0,j=0,k=0; cout cout void SearchNumInfo() Customer CusMax; ifstream inf1(用户信息.txt); int count1=0; while (!inf1.eof() inf1Cuscount1; count1+; /有count1-1个用户 Bill billMax; ifstream inf2(话单信息.txt); int count2 =0; while (!inf2.eof() inf2billcount2; count2+; /有count2条话单记录 inf1.close(); inf2.close(); char Number15; cout cinNumber; Bill SaveBillMax; int i=0,j=0,k=0; cout bool p=true; for(i=0;i if(strcmp(billi.GetDialing(),Number)=0) cout j=false; SaveBillk=billi; k+; if(j) cout Customer SaveCus1; for(i=0;i if(strcmp(Cusi.GetNumber(),Number)=0) SaveCus0=Cusi; char point; while(point=ShowSonMenu()!=0) if(point=1) Calculate(SaveCus,SaveBill,2,count2); else if(point=2) ShowWrongMess(bill,count2); else cout void Calculate (Customer *cus,Bill *bill,int m,int n) cout ofstream outa(所有信息.txt); ofstream outw(错误账单.txt); for(int i=0;i int aMax=0; /int数组,用于记录已计算过的月份 if(cusi.GetCID()=Y) /判断用户是否有功能费 Cid=6; else Cid=0; for(int j=0;j if( strcmp( cusi.GetNumber() , billj.GetDialing() ) = 0 ) / 找出custi客户的所有帐单 double local=0,toll=0,sum=0; /一个月的市话费、长途费 及总电话费 if(Compare(billj.GetDate(),a,n ) /判断在记录an中是 否存在 billj.getdate() 记录,若存在,则跳过这条账单信息 continue; else for(int k=j;k if(billj.GetDate()=billk.GetDate()&( strcmp(cusi.GetNumber(),bill k.GetDialing() = 0 ) ) /若billk的月份与主叫电话号码都相同,则计算这个 月的电话费 if(billk.GetTime()=0& Judge(bill,n,billk,k)=1) if( strlen( billk.GetDialed() )8 ) / 按照市话来看,长度大于8的都算是长途电话 toll += billk.GetTime()*Toll; else local += billk.GetTime()*Local; aj=billj.GetDate(); 存到an中 else outw sum=PrepaidFee+Cid+toll+local; /文本输出 outa outa outa outa outa outa outa.close(); outw.close(); void ShowWrongMess(Bill *bill,int n) bool a=true; for(int i=0;i if(billi.GetTime()=-1|Judge(bill,n,billi,i)=-1) 或者不符合判断函数的条件,则为错误账单 cout a=false; if(a) cout bool Compare(int m,int *p,int n) for(int i=0;i /把billj/如果时间不符 if(m=pi) return true; else continue; return false; int Judge(Bill *bill,int m,Bill bil,int n) /判断bi 的时间是否和其他账 单冲突, 若冲突,则返回-1 for(int i=0;i if(i!=n) if(strcmp( bil.GetDialed(),billi.GetDialing() )=0) if(strcmp(bil.GetStart(),billi.GetStart()=1) 终止时间是否冲突 if(strcmp(bil.GetStart(),billi.GetEnd()=1) return 1; else return -1; else if(strcmp(bil.GetStart(),billi.GetStart()=-1) 终止时间是否冲突 if(strcmp(billi.GetStart(),bil.GetEnd()=1) return 1; else return -1; else return -1; else continue; return 1; 主函数代码: #includeSourceFile.h #include #include / int main() cout cout cout cout cout cout cout cout cout cout * cout cout cout cout cout cout cout cout cout * Sleep(3000); /延时 system(cls); /清屏 int choice; while(choice=ShowMainMeun()!=0) switch (choice) case 1 :ShowCustomer(); peak; case 2 :ShowBill(); peak; case 3 :AddCusInfo(); peak; case 4 :AddBilInfo(); peak; case 5 :SearchCusInfo(); peak; case 6 :SearchNumInfo(); peak; case 7 :ShowAl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年北京二手房买卖合同样本:房屋权属核实
- 2025版货物运输保险合同范本汇编
- 2025版大型购物中心设施维护保养服务合同范本
- 2025版医疗设备维修保养及备件供应合同范本
- 2025版环保产业投资入股合同样本
- 2025版知识产权风险评估与防控联盟协议
- 2025年新能源发电项目电线电缆供应合同范本
- 河北省成安县2025年上半年公开招聘村务工作者试题含答案分析
- 2025版互联网+医疗健康合作开发协议
- 河北省柏乡县2025年上半年事业单位公开遴选试题含答案分析
- 公路施工环境污染应急预案
- GB/T 31227-2014原子力显微镜测量溅射薄膜表面粗糙度的方法
- 三年级下册口算天天100题(A4打印版)
- 上海交通大学学生生存手册
- 《道德与法治》三年级上册教材分析解读课件
- 幼儿园绘本故事:《苏丹的犀角》 课件
- 03第三阶段04印章模型制作
- 英汉互译课件05
- GB∕T 17766-2020 固体矿产资源储量分类
- Q∕SY 06515.1-2016 炼油化工工程电气技术规范 第1部分:通则
- 2010现代领翔nfcg2.0dohc原厂维修手册车身和外部
评论
0/150
提交评论