1程序设计报告(2012/2013学年第二学期)题目:电信计费系统客户帐单管理专业学生姓名班级学号指导教师指导单位计算机软件教学中心日期2013年05月29日2评分细则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简短评语教师签名:郭剑2012年12月25日3评分等级备注评分等级有五种:优秀、良好、中等、及格、不及格电信计费系统客户帐单管理一、课题内容和要求客户帐单管理是电信计费系统必备的重要功能模块,主要负责对电信各类客户每月帐单的增加、修改、删除、查询、备份等管理工作。本课题以中国电信企业客户帐单管理模块原型参照,要求基于单链表结构对文件存储的客户帐单数据进行排序、查找、计算、显示等造作。通过此可以,熟练掌握单链表结构、文件读写、函数调用等知识,以及查找、排序典型算法的设计与应用。二、需求分析要能提供以下几个基本功能:(1)用户资料文件与话单文件由程序设计人员预先从键盘上录入,用户资料文件中的数据记录不得少于30条,话单文件中的数据记录不得少于200条,且必须有跨月份、跨年份的通话记录话单。(2)首先从硬盘读入用户资料和话单记录(3)对话单进行计费处理,输出费用详单到指定的文件。格式如下:电话号码用户姓名月租费功能费市内电话费用长途电话费用合计83470000ZhangQiang25.006.00xxxxxxxxxxxxx83470001。。。。。。。。。。。。(4)异常话单提示。有的话单可能是错误的,找出这些话单,不参加计费,另存为一个文件。可能的出错话单有:①一个号码的通话时长大于三天。②一个号码在一个时间存在两条以上的记录。4功能框架图如图1所示(1)提供可操作的主菜单:输出个菜单,用于显示以从文件中加载的总客户信息和若干个可选的功能选项。根据客户输入的选项来运行不同的功能,运行不同的函数。(2)显示所有用户的功能:根据选项可将文本里的用户信息在屏幕上显示出来。(3)显示所有账单功能:可将文本里的通话账单在屏幕上显示出来。(4)添加用户功能:可在屏幕上进行直接操作,将用户信息添加到记录里。(5)添加账单功能:操作同上,可将新的通话记录添加到记录里。(6)按用户民查找功能:输入记录里的用户民,可以查询与之相关的通话账单记录。(7)按电话号码查找功能:输入记录里的已有电话号码,可以查找相应的通话账单记录。(8)输出花费功能:在操控台和文本中,直接输出所有的花费详情。5三、概要设计1、主要函数流程图如图2所示:图2:主程序图开始打开文本读入数据选择操作选项子菜单结束返回上一级6图3:操作菜单系统图4:显示所有信息菜单开始读入数据显示用户信息结束打开文本开始调用菜单函数输出操作选项输入操作选项调用应用函数子菜单应用函数结束返回操作选项选择结束7图5:插入数据菜单图6:计算话费函数开始打开文本输入在末尾插入数据输出数据到文本尾关闭文本结束读入账户和账单信息选出一个所有用户账单选出该用户每个月账单计算话费结束打开文本开始判断账单是否合理返回所有正确账单8开始图7::判断话费正误函数1、顾客类(Customer):#includeiostream.h#includestring.h#includeiomanip.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);//友元重载开始记录开始时间以及结束时间的年月日时分秒月日时分秒是否超出时间范围?YesNo返回1;输出错误提示,返回-1;结束9输入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){incus.Name;//输入用户名incus.Number;//输入用户号码incus.CID;//来电业务信息returnin;}10ostream&operator(ostream&out,constCustomer&cus){outsetiosflags(ios::left);outsetw(20)cus.Name;//左对齐输出用户名outsetw(15)cus.Number;//左对齐输出用户号码outsetw(1)cus.CID;//来电业务信息outendl;returnout;}2、话单类(Bill):#includeiostream.h#includestring.h#includeiomanip.h#includemath.hclassBill{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);11strcpy(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){inbill.Dialing;inbill.Dialed;inbill.StartTime;inbill.EndTime;returnin;}ostream&operator(ostream&out,constBill&bill){outsetiosflags(ios::left);12outsetw(15)bill.Dialing;outsetw(15)bill.Dialed;outsetw(15)bill.StartTime;outsetw(15)bill.EndTime;outendl;returnout;}intBill::GetDate(){intDat[6];doubledate=0;for(inti=0;i6;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月有多少天}13intEstimate(char*m,char*n)//判断时间正误函数{inta[14],b[14];//a记录开始时间,b记录结束时间for(inti=0;i14;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、yy1=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