電信計費系統客戶帳單管理_第1頁
電信計費系統客戶帳單管理_第2頁
電信計費系統客戶帳單管理_第3頁
電信計費系統客戶帳單管理_第4頁
電信計費系統客戶帳單管理_第5頁
已閱讀5頁,還剩42頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

編號:時間: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

提交評論