版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
客户帐单管理程序设计报告(2012/2013学年第二学期)题目:电信计费系统客户帐单管理专业学生姓名班级学号指导教师指导单位计算机软件教学中心日期2013年05月29日评分细则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简短评语教师签名:郭剑2012年12月25日评
分
等
级备注评分等级有五种:优秀、良好、中等、及格、不及格电信计费系统客户帐单管理一、课题内容和要求读写、函数调用等知识,以及查找、排序典型算法的设计与应用。二、需求分析要能提供以下几个基本功能:(1)用户资料文件与话单文件由程序设计人员预先从键盘上录入,用户资料文件中的数据记录不得少于30条,话单文件中的数据记录不得少于200条,且必须有跨月份、跨年份的通话记录话单。(2)首先从硬盘读入用户资料和话单记录(3)对话单进行计费处理,输出费用详单到指定的文件。格式如下:电话号码用户姓名月租费功能费市内电话费用长途电话费用合计83470000ZhangQiang25.006.00xxxxxxxxxxxxx83470001(4)异常话单提示。有的话单可能是错误的,找出这些话单,不参加计费,另存为一个文件。可能的出错话单有:①一个号码的通话时长大于三天。②一个号码在一个时间存在两条以上的记录。功能框架图如图1所示(1)提供可操作的主菜单:输出个菜单,用于显示以从文件中加载的总客户信的函数。(2(3)显示所有账单功能:可将文本里的通话账单在屏幕上显示出来。(4)添加用户功能:可在屏幕上进行直接操作,将用户信息添加到记录里。(5)添加账单功能:操作同上,可将新的通话记录添加到记录里。(6)按用户民查找功能:输入记录里的用户民,可以查询与之相关的通话账单记录。(7)按电话号码查找功能:输入记录里的已有电话号码,可以查找相应的通话账单记录。(8)输出花费功能:在操控台和文本中,直接输出所有的花费详情。三、概要设计1、主要函数流程图如图2所示:开始打开文本读入数据选择操作选项返回上一级子菜单结束图2:主程序图图3:操作菜单系统图4:显示所有信息菜单开始打开文本输入在末尾插入数据输出数据到文本尾关闭文本结束图5:插入数据菜单图6:计算话费函数开始开始记录开始时间以及结束月日时分秒是否No超出时间范围?输出错误提示,结束图7::判断话费正误函数1、顾客类(Customer):#include<iostream.h>#include<string.h>#include<iomanip.h>//控制输出格式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<<setiosflags(ios::left);out<<setw(20)<<cus.Name;//左对齐输出用户名out<<setw(15)<<cus.Number;//左对齐输出用户号码out<<setw(1)<<cus.CID;//来电业务信息out<<endl;
returnout;
}2、话单类(Bill):#include<iostream.h>#include<string.h>#include<iomanip.h>#include<math.h>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<<setiosflags(ios::left);out<<setw(15)<<bill.Dialing;out<<setw(15)<<bill.Dialed;out<<setw(15)<<bill.StartTime;out<<setw(15)<<bill.EndTime;
out<<endl;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;
elseday[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<s2)//如果不足一分钟,按一分钟计算returny-x+1;elsereturny-x;}elseif(y==x)//开始结束分钟数相同{if(s2>s1)//结束秒数大于开始秒数,就是正确的,否则错误return1;else{cout<<"通话时间记录错误!"<<endl;return-1;}}else//通话不在三天内或结束时间小于开始时间则错误{cout<<"通话时间记录错误!"<<endl;return-1;}}else{if(mon2-mon1!=1)//不再同一月的话,那么结束时间必须比开始时间大一月{cout<<"通话时间记录错误!"<<endl;return-1;}else{if(s1<s2)//s1跟s2不同的大小关系决定怎么算{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<s2){returny-x+1+31*24*60;}else{returny-x+31*24*60;}}else{cout<<"通话时间记录错误!"<<endl;return-1;
}}}}四、源程序代码.#include"Customer.h"#include"Bill.h"#include<iomanip.h>#include<fstream.h>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]的任何一个数都不相等,那么就返回falseintJudge(Bill*bill,intm,Billbil,intn);//判断bil帐单是否会发生冲突charShowMainMeun(){cout<<"\t主菜单"<<endl;cout<<"\t============================================================"<<endl;
cout<<"\t||"<<endl;cout<<"\t|输入1:显示所有用户信息|"<<endl;
cout<<"\t|输入2:显示所有话单信息|"<<endl;
cout<<"\t|输入3:添加用户信息|"<<endl;
cout<<"\t|输入4:添加话单信息|"<<endl;cout<<"\t|输入5:按客户名查找话单|"<<endl;cout<<"\t|输入6:按号码查找话单|"<<endl;cout<<"\t|输入7:输出所有话费信息|"<<endl;cout<<"\t|输入0:结束操作|"<<endl;cout<<"\t||"<<endl;cout<<"\t============================================================"<<endl;cout<<"-------"<<endl;cout<<"注:时间24:00算错误;计费月份按拨打电话时间算"<<endl<<endl;charchoice;cout<<"请输入操作选项:"<<endl;cin>>choice;//用户输入操作选项returnchoice;//返回操作选项}charShowSonMenu(){cout<<"\t============================================================"<<endl;cout<<"\t||"<<endl;cout<<"\t|输入0:返回上一级菜单|"<<endl;cout<<"\t|输入1:显示查询用户话费信息|"<<endl;cout<<"\t|输入2:显示查询用户错误话单信息|"<<endl;cout<<"\t||"<<endl;cout<<"\t============================================================"<<endl;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<<Cus[count1];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);elsecout<<"输入有误:请重新输入!"<<endl;}}voidShowBill(){CustomerCus[Max];Billbill[Max];ifstreaminf1("用户信息.txt");intcount1=0;while(!inf1.eof())
{inf1>>Cus[count1];count1++;}ifstreaminf2("话单信息.txt");intcount2=0;while(!inf2.eof()){inf2>>bill[count2];cout<<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);elsecout<<"输入有误:请重新输入!"<<endl;}}voidShowAll(){CustomerCus[Max];Billbill[Max];ifstreaminf1("用户信息.txt");intcount1=0;while(!inf1.eof())//录入顾客信息到Customer类的数组cust中{inf1>>Cus[count1];count1++;//有m-1个顾客}intcount2=0;ifstreaminf2("话单信息.txt");while(!inf2.eof())//录入账单记录到Bill类的数组bill中{inf2>>bill[count2];count2++;//有n个账单记录}inf1.close();//关闭文件inf2.close();//关闭文件Calculate(Cus,bill,count1,count2);}voidAddCusInfo(){CustomerCus[Max];intnum;cout<<"请输入添加用户的数目:";cin>>num;cout<<"请输入用户的相应信息:"<<endl<<"用户姓名用户号码是否开通来电显示(Y/N)"<<endl;for(intn=0;n<num;n++)cin>>Cus[n];//输入添加的用户名ofstreamoutf;outf.open("用户信息.txt",ios::app);//用app方式打开文本,能直接在文本尾加入信息for(n=0;n<num;n++)outf<<Cus[n];//添加客户文本信息cout<<"成功添加用户信息。"<<endl;outf.close();}voidAddBilInfo(){Billbill[Max];intnum;cout<<"请输入添加帐单的数目:";cin>>num;cout<<"请输入帐单的相应信息:"<<endl;cout<<"主叫号码被叫号码开始通话时间结束通话时间"<<endl;cout<<"格式形如:20130528132112"<<endl;for(intn=0;n<num;n++)cin>>bill[n];ofstreamoutf;outf.open("话单信息.txt",ios::app);//用app方式打开文本,能直接在文本尾加入信息for(n=0;n<num;n++)outf<<bill[n];//添加话单文本信息cout<<"成功添加话单信息。"<<endl;outf.close();}voidSearchCusInfo(){charName[20];cout<<"请出入查找的用户名:";cin>>Name;CustomerCus[Max];Billbill[Max];ifstreaminf1("用户信息.txt");intcount1=0;while(!inf1.eof())//录入顾客信息到Customer类数组Cus中{inf1>>Cus[count1];count1++;//记录总共有(count1-1)个顾客}ifstreaminf2("话单信息.txt");intcount2=0;while(!inf2.eof()){inf2>>bill[count2];count2++;//总共有count2条话单}inf1.close();inf2.close();CustomerSaveCus[1];BillSaveBill[Max];//保存该用户的话单信息inti=0,j=0,k=0;cout<<"您所查找的用户信息是:"<<endl;boolp=false,q=false,r=false;for(i=0;i<count1-1;i++){if(strcmp(Cus[i].GetName(),Name)==0){SaveCus[0]=Cus[i];for(j=0;j<count2;j++){if(strcmp(Cus[i].GetNumber(),bill[j].GetDialing())==0){cout<<bill[j];q=true;SaveBill[k]=bill[j];k++;}elsecontinue;
}r=true;}elsep=true;}if(!q&&r)cout<<"无法查询该用户信息!"<<endl;if(p&&!r)cout<<"输入有误:无法查询该用户信息!"<<endl;charpoint;while((point=ShowSonMenu())!='0'){if(point=='1')Calculate(SaveCus,SaveBill,2,count2);elseif(point=='2')ShowWrongMess(bill,count2);elsecout<<"输入有误:请重新输入!"<<endl;}}voidSearchNumInfo(){CustomerCus[Max];ifstreaminf1("用户信息.txt");intcount1=0;while(!inf1.eof()){inf1>>Cus[count1];count1++;//有count1-1个用户}Billbill[Max];ifstreaminf2("话单信息.txt");intcount2=0;while(!inf2.eof())
{inf2>>bill[count2];count2++;//有count2条话单记录}inf1.close();inf2.close();charNumber[15];cout<<"请出入查找的号码:";cin>>Number;BillSaveBill[Max];inti=0,j=0,k=0;cout<<"您所查找的话单信息是:"<<endl;boolp=true;for(i=0;i<count2;i++){if(strcmp(bill[i].GetDialing(),Number)==0){cout<<bill[i];j=false;SaveBill[k]=bill[i];k++;}}if(j)cout<<"输入有误:无法查询该号码信息!"<<endl;CustomerSaveCus[1];for(i=0;i<count1-1;i++){if(strcmp(Cus[i].GetNumber(),Number)==0){SaveCus[0]=Cus[i];}}charpoint;while((point=ShowSonMenu())!='0'){if(point=='1')Calculate(SaveCus,SaveBill,2,count2);elseif(point=='2')ShowWrongMess(bill,count2);elsecout<<"输入有误:请重新输入!"<<endl;}
}voidCalculate(Customer*cus,Bill*bill,intm,intn){cout<<"姓名\t电话号码日期月租来电市话长途总计"<<endl;ofstreamouta("所有信息.txt");ofstreamoutw("错误账单.txt");for(inti=0;i<m-1;i++)//计算话费{inta[Max]={0};//int数组,用于记录已计算过的月份if(cus[i].GetCID()=='Y')//判断用户是否有功能费Cid=6;elseCid=0;for(intj=0;j<n;j++){if(strcmp(cus[i].GetNumber(),bill[j].GetDialing())==0)//找出cust[i]客户的所有帐单{doublelocal=0,toll=0,sum=0;//一个月的市话费、长途费及总电话费if(Compare(bill[j].GetDate(),a,n))//判断在记录a[n]中是否存在bill[j].getdate()记录,若存在,则跳过这条账单信息continue;else{for(intk=j;k<n;k++)
{if((bill[j].GetDate()==bill[k].GetDate())&&(strcmp(cus[i].GetNumber(),bill[k].GetDialing())==0))//若bill[k]的月份与主叫电话号码都相同,则计算这个月的电话费{if(bill[k].GetTime()>=0&&Judge(bill,n,bill[k],k)==1){if(strlen(bill[k].GetDialed())>8)//按照市话来看,长度大于8的都算是长途电话toll+=bill[k].GetTime()*Toll;elselocal+=bill[k].GetTime()*Local;a[j]=bill[j].GetDate();//把bill[j]存到a[n]中}else{outw<<bill[k];}}}sum=PrepaidFee+Cid+toll+local;//文本输出outa<<cus[i].GetNumber();outa<<setw(15)<<cus[i].GetName();outa<<setw(10)<<bill[j].GetDate();outa<<setw(5)<<PrepaidFee<<setw(5)<<Cid;outa<<setw(8)<<local<<setw(8)<<toll;outa<<setw(8)<<sum<<endl;}}}}outa.close();outw.close();}voidShowWrongMess(Bill*bill,intn)
{boola=true;for(inti=0;i<n;i++){if(bill[i].GetTime()==-1||Judge(bill,n,bill[i],i)==-1)//如果时间不符或者不符合判断函数的条件,则为错误账单{cout<<bill[i];a=false;
}}if(a)cout<<"该用户无错误信息!"<<endl;}boolCompare(intm,int*p,intn){for(inti=0;i<n;i++){if(m==p[i])returntrue;elsecontinue;}returnfalse;}intJudge(Bill*bill,intm,Billbil,intn)//判断bi的时间是否和其他账单冲突,若冲突,则返回-1{for(inti=0;i<m;i++){if(i!=n){if(strcmp(bil.GetDialed(),bill[i].GetDialing())==0){if(strcmp(bil.GetStart(),bill[i].GetStart())==1)//终止时间是否冲突{if(strcmp(bil.GetStart(),bill[i].GetEnd())==1)return1;elsereturn-1;}elseif(strcmp(bil.GetStart(),bill[i].GetStart())==-1)//终止时间是否冲突{if(strcmp(bill[i].GetStart(),bil.GetEnd())==1)return1;elsereturn-1;}elsereturn-1;}}elsecontinue;}return1;}主函数代码:#include"SourceFile.h"#include<stdlib.h>#include<windows.h>intmain(){cout<<"\t﹀"<<endl;cout<<"\t﹀_▁▂▃__"<<endl;cout<<"\t__▁▂▁___﹀﹋●"<<endl;cout<<"\t﹋﹀__▁▂▃▁__"<<endl;cout<<endl;cout<<"\t█▆▅▇▆▅▄▃▄▅▆▄▅▄▃▂▃▄▆▅▇▆▄▅█▇▆▄▂"<<endl;cout<<"\t-__~~--___-▔~~__--__~~~_----__----~~~---▔---___▔--__-▔"<<endl;cout<<"\t___---_~__-~_▔___-欢迎进入电信计费系统--▔~~---__--~~"<<endl;cout<<"\t█▇▆▅▃▁▂▁--_--_----------▔---~~▔▁▂▃▄▅▇"<<endl;cout<<"\t***********************************************************"<<endl;cout<<"\t*********************"<<endl;cout<<"\t*********************"<<endl;cout<<"\t***********组长:**********"<<en
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 兄弟房产分割协议书
- 水果采购合同
- 2023年武汉海淀外国语实验学校高中新校区招聘教师笔试真题
- 2023年沐川县事业单位招聘工作人员考试真题
- 2023年贵阳贵安招聘乡镇(街道)事业单位人员考试真题
- 小学工会经费管理制度
- 2023年福建福州平潭综合实验区消防救援支队招录政府专职消防队员笔试真题
- 万名教师大家访实施方案
- 婴幼儿智能发展训练课件
- 第三章 社会学基础课件
- 图灵机与现代计算机PPT教案
- 26个英文字母幼儿学习卡片可打印
- 北京语言大学外语专业综合水平测试英语历年真题版
- 物业工程部危险源辨识、评价与控制措施表
- 高中人音版必修 音乐鉴赏18西出阳关无故人课件
- 丝网除沫器的设计计算
- 光伏系统的安装工程监理实施细则
- 标准作业组合票--自动生成
- 王洼二矿原煤仓机电设备安装工程资料文稿
- 数学人教版七年级下册你有多少种画平行线的方法
- 颗粒沉降速度计算
评论
0/150
提交评论