




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
编号:时间:2021年x月x日书山有路勤为径,学海无涯苦作舟页码:第页程序设计报告(2012/2013学年第二学期)题目:电信计费系统客户帐单管理专业学生姓名班级学号指导教师指导单位计算机软件教学中心日期2013年05月29日评分细则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简短评语教师签名:郭剑2012年12评分等级备注评分等级有五种:优秀、良好、中等、及格、不及格电信计费系统客户帐单管理课题内容和要求客户帐单管理是电信计费系统必备的重要功能模块,主要负责对电信各类客户每月帐单的增加、修改、删除、查询、备份等管理工作。本课题以中国电信企业客户帐单管理模块原型参照,要求基于单链表结构对文件存储的客户帐单数据进行排序、查找、计算、显示等造作。通过此可以,熟练掌握单链表结构、文件读写、函数调用等知识,以及查找、排序典型算法的设计与应用。二、需求分析要能提供以下几个基本功能:(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月日时分秒是否超出时间范围?No月日时分秒是否超出时间范围?YesYes输出错误提示,返回输出错误提示,返回-1;返回1;结束结束图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; 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<s2)//如果不足一分钟,按一分钟计算 returny-x+1; else returny-x; }else if(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); else cout<<"输入有误:请重新输入!"<<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); else cout<<"输入有误:请重新输入!"<<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++; } else continue; } r=true; } else p=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); else cout<<"输入有误:请重新输入!"<<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); else cout<<"输入有误:请重新输入!"<<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; else Cid=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; else local+=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; else continue; } 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; else return-1; } elseif(strcmp(bil.GetStart(),bill[i].GetStart())==-1) //终止时间是否冲突 { if(strcmp(bill[i].GetStart(),bil.GetEnd())==1) return1; else return-1; } else return-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***********组长:**********"<<endl; cout<<"\t***********组员:**********"<<endl; cout<<"\t*********************"<<endl; cout<<"\t*********************"<<endl; cout<<"\t*********************"<<endl; cout<<"\t*********************"<<endl; cout<<"\t***********************************************************"<<endl; Sleep(3000); //延时 system("cls"); //清屏 intchoice; while((choice=ShowMainMeun())!='0') { switch(choice) { case'1':ShowCustomer(); break; case'2':ShowBill(); break; case'3':AddCusInfo(); break; case'4':AddBilInfo(); break; case'5':SearchCusInfo(); break; case'6':SearchNumInfo(); break; case'7':ShowAll(); break; default:cout<<"输入有误:请重新输入!"<<endl; } } return0;}五、测试数据及其结果分析、欢迎界面略主菜单的显示:1、显示所有用户信息:图92、显示所有账单信息:图10图113、添加用户信息图124、添加话单信息图135、按客户名查找话单图14输入1图156、按号码查找话单图16输入2:图177、输出所有话费信息图188、结束操作六、调试过程中的问题(1)输出格式不对,不整齐:用了setw()函数和ios::left解决。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)在文档末尾添加信息时,出错,把原来的信息覆盖了:用ios::app解决;outf.open(“话费账单.txt”,ios::app);(3) 比较时间大小时,因为是字符串,所以常规比较法出错:用strcmp函数解决。strcmp(bill[i].GetStart(),bill[i].GetEnd());(4)在.txt的使用中要注意使用tab键,有可能在把文本文件读入内存时出现问题(有时候会和空格混合);在调试的时候,用strlen来判断读入时是否发生问题。七、课程设计总结本次C++试验的题目——“电信计费”,存在着很强的实用意义,和学生成绩管理系统雷同,但是面向的对象范围更加广阔一些。可以极大的优化电信服务业务。因此,我更愿意将此次的实验视作一次历练:将自己已经学过的知识和实践能力结合的尝试。与C语言不通的是,C++是面向对象的。(因此其实上面的报告用流程图来展示我们的成果并不是特别的合适。)这就意味着核心不是过程(流程)而是类本身就是一种包含与关联先根据题目来确定类(再看实体依赖),这里确定的是顾客类和话单类,实际上这里的顾客和账单可以合并。用类而不用结构体的加大了程序的封装性。进而保密性更加强。接下来确定程序的相应功能,根据功能写出相应的实现函数,这里对程序语言编写的功底要求很高,其实从附加题就能看的出来,在intEstimate(char*m,char*n) 函数里头用了大量的strcmp()的语句进行字符串比较进而实现是话单时间是否符合要求进而进行筛选。由于本人不熟悉链表的使用,所以造成了繁杂,实际情况可以根据如下图显示逻辑判断:如果用链表来写这段代码将会简洁很多。先写出程序的一个大体框架,先把最主要的功能:读入文件和输出文件实现了,再来写其他功能的函数。因为代码比较长,在测试代码的时候会出现很多error,这是如果没有耐心是不可能做好的:先注释掉一部分代码,一个一个函数地进行修改。这个程序的运行速度并不是很高,有些逻辑问题处理得并不完善,需要,想要做一个比较合格的程序员,在以后学数据结构以后学会提高代码的运行速度。附录资料:不需要的可以自行删除常见电脑故障与解决的方法硬盘异响故障的简单解决方法有时候硬盘正在使用,会突然“当当”直响,然后无法继续读写数据,再次重新启动电脑,在BIOS里也不能找到硬盘了。这类故障,有时候硬盘还能够找到,比较的典型的故障表现是硬盘刚开机时使用正常,但是当硬盘使用一个或两个小时后,就突然出现上面的现象。笔者遇到这种情况最多的是一些老硬盘,比如昆腾10G、15G和20G,这到底是怎么回事呢?表面看起来这好像是硬盘的某个芯片不稳定,造成硬盘工作瘫痪。但当故障出现时,我也试着用手接触硬盘电路板上的芯片,确实芯片都十分热,但好象也不至于会出现失控的情况。遇到这种情况,大家都以为硬盘坏了,再加上硬盘已经过保了,就只能更换新硬盘了。不过,这类故障的硬盘并不一定是真正的损坏,而可能是一种表面假像。我们只需要做一下简单处理就可以完全恢复正常,把我们丢失的宝贵数据全部读出。我们先来看看硬盘是怎么工作的。硬盘在读写数据时,主轴电机高速旋转,在控制芯片的控制下驱动磁臂进行相应的动作,来完成数据的读写操作。主轴电机的高速旋转是在恒定转速下工作的,如果硬盘供电电压变化太大,就会引起硬盘转速的改变,这时就会出现磁臂定位不准或错误,造成无正常读取数据或硬盘坏道增加。主机在需要读写数据时,只需要发出读写某一文件的命令到硬盘,具体如何读写是硬盘自己执行的,这些操作对于主机来说是不透明的。说得再明白一点,硬盘自身也是一部计算机,硬盘在启动时,首先要读取硬盘主引导区的内容,把硬盘的分区信息读入缓存,再根据主机送来的信息去读取目标操作分区的引导区信息,把目标分区的引导信息内容进行解密,再接下来去读取FAT表和根目录,这样就可以读取目标分区中的任一文件。当硬盘找到主要所要读写的目标文件后,完成所需要的操作就可以把执行的结果暂存在硬盘的缓存中,然后再向主机发出中断请求,继而把结果送到数据总线上。这样就完成一次主机的命令操作任务。硬盘为什么会出现在工作中突然丢失呢?硬盘工作时需要稳定的电压和足够的电流供应,如果电压不稳或者电源提供的电流不足时,就会出现寻道困难,硬盘“咔咔”直响,要么找不到硬盘或者数据读取困难,也可能表现为在工作过程中硬盘突然丢失,数据无法读取等情况。这两种情况一般是我们计算机所使用的开关电源功率不足或有故障才会出现上述情况。对于电源提供的+5V和+12V电压不稳的现象,我们可以使用万用表测试来进行判断。过高和过低都不行,一般在10%波动之内都可以认为是正常情况。对于电源提供电流不足的情况,我们可以根据自己主机所使用的硬盘、光驱及相关配置的多少计算出其满负荷工作时所需要的功率,与我们所使用的开关电源功率相比较。一般情况下,电源功率应该大于各部件最大功率总和的10%,而不能使二者相等。还有一种情况就是硬盘自身出现问题,可能芯片出现故障,也可能电机损坏,再可能是磁臂断裂。不过这里所说的硬盘突然“咔咔”响的问题既不是电源供电不足,也不是硬盘控制芯片损坏所致,而是硬盘电路板与硬盘盘体的磁臂供电接口部分接触不良所致。该硬盘电路板与盘体供电相接部分不是采用插针或柔性电缆,而是采用压接方式,因为硬盘长时间使用,再加上工作环境不好,电路板的接口镀锡层氧化,盘体弹簧片氧化,造成二者接触不良,导致磁臂寻道电机供电不稳,而出现寻道异常,硬盘无法正常工作。如何解决呢?方法也很简单,拆开固定电路板的四个螺丝,取下电路板,向上拿起电路板,在电路板的接口一侧会有两排弹簧片,我们需要小心的用水砂纸将每一个弹簧片的触点打磨光亮。同时将电路板上的对应触点也要打磨光亮,然后再将电路板原样装回即可。
主板相关的故障五则主板“罢工”时,出现的故障现象,可能多种多样。此时,你该采取什么应对措施,来将主板故障快速而有效地排除呢?为此,本文特意为各位网友提供一些相关故障的快速应对措施。1.为什么主板无法正常启动,同时内存发出“嘀嘀”声?出现这种现象的可能原因是:主板内存插槽,性能较差,内存条上的金手指与插槽簧片接触不良;也有可能是内存条上的金手指,表面的镀金效果不好,在长时间工作中,镀金表面出现了很厚的氧化层,从而导致内存条接触不好;还有一种可能是,内存条生产工艺不标准,看上有点儿薄,这样内存条与插槽始终有一些缝隙,稍微有点震动,就可能导致内存接触不好,从而引发报警现象。解决这种现象,只要将计算机机箱打开,并在断电条件下取出内存条,将出现在内存条上的灰尘或氧化层,用橡皮把它们擦干净,然后重新插入到内存插槽中就可以了。要是内存太薄的话,可以用热熔胶,将插槽两侧的微小缝隙填平,以确保内存条不左右晃动,这样也能有效避免金手指被氧化。要是上面的方法,无法解决故障的话,可以更换新的内存条试试;在更换新内存的条件下,报警声继续出现的话,此时只能重新更换主板来试试了。2.为什么无法正确识别出键盘和鼠标?出现这种现象的可能原因是:主板不支持鼠标、键盘,这样系统无法找到鼠标、键盘,即使可以找到鼠标,鼠标操作也不听你控制;或者键盘、鼠标与计算机连接时,出现接口连接松动现象,这样就会很容易造成,键盘、鼠标与主板接触不良的现象;还有一种原因,就是鼠标、键盘本身有故障,导致系统无法有效识别。首先查看一下说明书,看看主板到底支持什么样的键盘、鼠标,要是当前使用的,与主板不兼容的话,可以重新更换主板可以兼容的键盘、鼠标,就能解决问题;要是鼠标、键盘的连接端口出现松动的话,可以重新更换一下键盘、鼠标接口,确保连接稳定、可靠;要是上面的方法无法解决问题的话,你必须检查键盘、鼠标本身的问题,例如查看它们的供电电压是否为5V,要是不正常的话,就应该检查供电保险电阻有没有出现熔断现象,要是保险电阻数值很大的话,可以使用较细的导线直接连通。3.为什么打印机不能正常工作?在排除打印机本身故障以及软件故障外,打印机不能正常工作,很有可能是由于带电插拔打印线缆,造成了打印接口的损坏。要解决这种故障,必须更换新的打印接口芯片,这种打印芯片往往可以在同型号的旧主板上,能轻松找到,你可以请专业人士,来帮忙将打印芯片焊接起来;要是你的打印机可以支持USB接口的话,那么你可以将打印机连接到USB接口上,这样就不需要更换什么打印接口了;当然,你还可以去购买一块多功能卡,来重新“打造”一个新的LPT端口;但由于“打造”新LPT端口,需要经过跳线设置和软件设置,没有太多专业知识的你,最好不要轻举妄动。4.为什么主板无法正常启动,也没有报警声出现?主板无法正常启动的原因可能有多种,例如主板上的电容,在长时间的工作下,可能会出现炸裂或冒泡现象,这样主板的滤波功能可能就失效了,如此一来,供电电流中出现了很大成分的交流冲击波,从而导致主板工作不稳定,以致于无法正常启动;要是CPU供电不正常的话,主板也会无法正常启动,同时没有报警声;此外,CPU风扇的固定卡子要是发生断裂,或内存插槽出现断裂,或者内存插槽出现断针,CPU插座出现断针等,都有可能引发上面的故障。为了确保主板电容上的电压不致过高,应确保供电电源通过稳压器过滤,还不要让计算机长期工作,导致电容过热;你可以利用万用表,来检测CPU周围的三极管、二极管,是否工作正常,以便检查CPU供电是否正常;要是出现断针或断裂现象,都必须重新更换新的配件。5.为什么显卡总是发出非正常的报警声?出现这种现象,很有可能是显卡与主板之间出现了松动,或者是显卡本身受到了损坏;另外一种可能的原因是,主板与显卡无法正常兼容。要是显卡与主板之间有松动现象,你千万不要随意震动计算机,最好再把显卡拔出来,重新插紧插好。要是显卡在其他主板中,使用一切正常,但到了这台计算机上时,总是没有图象出现,不过显示器电源却能正常,那么这很有可能是显卡和主板不兼容引起的,此时必须更换能与主板兼容的显卡。要是上面的方法,还不能解决问题的话,很有可能是显卡本身的问题,此时可以将它安装在其他主板上,要是还不能工作的话,就可以断定显卡已经损坏,此时只有重新更换新的显卡了。显卡及显示器故障处理技巧(一)一、显卡常见故障的处理1.显卡驱动未能正常安装我们在安装显卡驱动程序时,经常会遇到提示安装失败的麻烦,而且采用不同版本的驱动也无法解决问题,应该怎样正确地安装显卡驱动程序呢?(1)在机器启动的时候,按“Del”键进入BIOS设置,找到“ChipsetFeaturesSetup”选项,将里面的“AssignIRQToVGA”设置为“Enable”,然后保存退出。许多显卡,特别是Matrox的显卡,当此项设置为“Disable”时一般都无法正确安装其驱动。另外,对于ATI显卡,要先将显卡设置为标准VGA显卡后再安装附带驱动。(2)在安装好操作系统以后,一定要安装主板芯片组补丁程序,特别是对于采用VIA芯片组的主板而言,一定要记住安装主板最新的4IN1补丁程序。(3)安装驱动程序:进入“设备管理器”后,右键单击“显示卡”下的显卡名称,然后点击右键菜单中的“属性”。进入显卡属性后点击“驱动程序”标签,选择“更新驱动程序”,然后选择“显示已知设备驱动程序的列表,从中选择特定的驱动程序”,当弹出驱动列表后,选择“从磁盘安装”。接着点击“浏览”按钮,在弹出的查找窗口中找到驱动程序所在的文件夹,按“打开”按钮,最后确定。此时驱动程序列表中出现了许多显示芯片的名称,根据你的显卡类型,选中一款后按“确定”完成安装。如果程序是非WHQL版,则系统会弹出一个警告窗口,不要理睬它,点击“是”继续安装,最后根据系统提示重新启动电脑即可。另外,显卡安装不到位,往往也会引起驱动安装的错误,因此在安装显卡时,一定要注意显卡金手指要完全插入AGP插槽。2.电脑启动时黑屏故障启动电脑时,如果显示器出现黑屏现象,且机箱喇叭发出一长两短的报警声,则说明很可能是显卡引发的故障。首先要确定一下是否由于显卡接触不良引发的故障:关闭电源,打开机箱,将显卡拔出来,然后用毛笔刷将显卡板卡上的灰尘清理掉,特别是要注意将显卡风扇及散热片上的灰尘处理掉。接着用橡皮擦来回擦拭板卡的“金手指”。完成这一步之后,将显卡重新安装好(一定要将挡板螺丝拧紧),看故障是否已经解决。另外,针对接触不良的显示卡,比如一些劣质的机箱背后挡板的空档不能和主板AGP插槽对齐,在强行上紧显示卡螺丝以后,过一段时间可能导致显示卡的PCB变形的故障,只要尝试着松开显示卡的螺丝即可。如果使用的主板AGP插槽用料不是很好,AGP槽和显示卡PCB不能紧密接触,你可以使用宽胶带将显示卡挡板固定,如果还觉得不把握就把显示卡两边的机箱都装上,把显示卡的挡板夹在中间。如果你的显示卡金手指遇到了氧化问题,而且使用橡皮清除锈渍显示卡后仍不能正常工作的话,可以使用除锈剂清洗金手指,然后在金手指上轻轻敷上一层焊锡,以增加金手指的厚度,但一定注意不要让相邻的金手指之间短路。如果通过上面的方法不能解决问题的话,则可能是显卡与主板有兼容问题,此时可以另外拿一块显卡插在主板上,如果故障解除,则说明兼容问题存在。当然,用户还可以将该显卡插在另一块主板上,如果也没有故障,则说明这块显卡与原来的主板确实存在兼容问题。对于这种故障,最好的解决办法就是换一块显卡或者主板。还有一种情况值得注意,那就是显卡硬件上出问题了,一般是显示芯片或显存烧毁,建议将显卡拿到别的机器上试一试,若确认是显卡问题就只能更换了。3.显示花屏的故障显卡花屏是一种比较常见的显示故障,大部分显卡花屏的故障都是由显卡本身引起的。如果开机显示就花屏的话,首先应检查显卡是不是存在散热问题,用手触摸一下显存芯片的温度,看看显卡的风扇是否停转。再有要检查一下主板上的AGP插槽里是否有灰尘,看看显卡的金手指是否被氧化了,然后可根据具体情况把灰尘清除掉,用橡皮擦把金手指的氧化部分擦亮。如果散热的确有问题的话,我们可以采用换个风扇或在显存上加装散热片的方法解决。如果是在玩游戏或做3D时出现花屏的话,就要考虑到是不是由于显卡驱动与程序本身不兼容或驱动存在BUG而造成的了,可以换一个版本的显卡驱动试一试。如果以上方法不能解决问题,可以尝试着刷新显卡的BIOS,去显卡厂商的主页看看有没更新的BIOS下载。但是要注意——同一厂商同一型号的显示卡的BIOS文件往往也是不相同的,所以说刷新BIOS还是有一定风险的。还有一种情况,由于显示器或显卡不支持高分辨率往往也会造成显示花屏的故障。遇到这类故障时我们可切换启动模式到安全模式,在Win98下进入显示设置,在16色状态下点选“应用”、“确定”按钮。重新启动,在Windows98系统正常模式下删掉显卡驱动程序,然后重新启动计算机即可。当然也可以在纯DOS的环境下,编辑SYSTEM.INI文件,将display.drv=pnpdrver改为display.drv=vga.drv后,存盘退出,再在Windows里更新驱动程序,即解决问题。除此之外,扩显存不当也很容易导致花屏,为了避免麻烦——在扩显存时应使用相同品牌、相同速度的显存。显卡及显示器故障处理技巧(二)二、CRT显示器常见故障目前大家最常用的还是CRT显示器,但随着使用时间增加,CRT显示器的内部元件部分参数也会发生变化,导致显示器出现故障,而这些故障很多是可以通过调整显示器内部某些可调元件解决的。不过由于显示器内有高压电源,出现比较严重的异常问题后应及时送专业维修点维修,而不要自己随意处理,以免出现火灾、人身伤害等危险。1.显示器出现偏色问题显示器出现偏色的现象也是我们常遇到的问题,其产生的原因主要有:显示器靠近磁性物品被磁化;搬动显示器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论