第一篇:c++課程實踐火車票管理系統(tǒng)
#include
using namespace std;
class Bus_infor { int No;
static int Bus_No;char start[20];char end[20];int Bus_order;
int all_tickted;int tickted;int Hour_start,Minute_start,Hour_end,Minute_end;int Hour;int Minute;
public: Bus_infor *next;Bus_infor();~Bus_infor();int Get_no();int Get_all_tickted();int Get_tickted();int Get_bus_order();
char *Get_start();char *Get_end();void addr();
void Order_tickt(int n);void Unorder_tickt(int n);void GetTime_start();void GetTime_end();void ShowTime();void GetTime();void Show_infor();
void input(){
cout<<“ttt按提示輸入:”< cout<<“tt輸入車次: ”; cin>>Bus_order; cout<<“請輸入車的額定載量: ”; cin>>all_tickted; GetTime_start(); GetTime_end(); addr(); char a; cout<<“是否清空售票(y/n)?”< cin>>a; if(a=='y')tickted=0;} void input(ifstream & is) { is>>Bus_order>>start>>end>>all_tickted>>tickted>>Hour_start>>Minute_start>>Hour_end>>Minute_end; is.get(); } void output(){cout<<“客車基本信息如下:”< <<“ 發(fā)車時間:”< <<“ 起點站:”< <<“ 終點站:”< <<“行車時間”< <<“額定載量”< void output(ofstream & os) { os< < < < < < < < < < }; int Bus_infor::Bus_No=1; void Bus_infor::GetTime_start(){ int NewH=0,NewM=0;cout<<“請輸入發(fā)車時間:”< void Bus_infor::GetTime_end(){ int NewH=0,NewM=0;cout<<“請輸入行車時間:”< void Bus_infor::GetTime(){ if(Minute_end>=Minute_start){Minute=(Minute_end-Minute_start);Hour=(Hour_end-Hour_start);} else {Minute=(Minute_end-Minute_start+60);Hour=(Hour_end-Hour_start-1);} } void Bus_infor::ShowTime(){ cout< cout< tickted=0;} Bus_infor::~Bus_infor(){ Bus_No--;} void Bus_infor::addr(){ cout<<“請輸入起點站與終點站:”< cin>>a;cin>>b;strcpy(start,a);strcpy(end,b);} char *Bus_infor::Get_start(){ return start;} char *Bus_infor::Get_end(){ return end;} int Bus_infor::Get_no(){ return No;} int Bus_infor::Get_all_tickted(){ return all_tickted;} int Bus_infor::Get_tickted(){ return tickted;} int Bus_infor::Get_bus_order(){ return Bus_order;} void Bus_infor::Order_tickt(int n){ tickted=tickted+n;} void Bus_infor::Unorder_tickt(int n){ tickted=tickted-n;}; class Bus_link{ public: Bus_link(){head=new Bus_infor;head->next=NULL;key=0;} void input();void mend();void del();int find(Bus_infor **p,int num,char *pn); int find1(Bus_infor **p,int num,char *pn); void found();void show(); void Order(); void Unorder(); void save(); void begin(); void clear(); char mainmenu(); int getkey(){ return key;} void setkey(int k){ key=k;} private: Bus_infor *head; int key;}; void Bus_link::input(){ Bus_infor *p,*p2=NULL;p=head; int n;while(p->next) p=p->next;while(n){ p2=new Bus_infor; p2->input(); p->next=p2; p2->next=NULL; p=p->next; Bus_link::setkey(1); cout<<“ttt按1繼續(xù),按0返回 : ”; cin>>n;} } void Bus_link::Order(){ Bus_infor *p;cout<<“確定購票(y/n)?”< int num; cout<<“ttt輸入車次號: ”; cin>>num; if(!find1(&p,num,“^”)) { cout<<“tt找不到你要定票的車輛的內(nèi)容!”< return; } cout<<“輸入要定的票數(shù) ”; int n;cin>>n; p=p->next; if((p->Get_tickted()+n)<=p->Get_all_tickted()) {p->Order_tickt(n); cout<<“謝謝使用”< else cout<<“對不起,沒有足夠的票數(shù)?!? } else if(X=='n')cout<<“謝謝使用”< void Bus_link::Unorder(){ Bus_infor *p;cout<<“確定退票(y/n)?”< int num; cout<<“ttt輸入車次號: ”; cin>>num; if(!find1(&p,num,“^”)) { cout<<“tt找不到你要定票的車輛的內(nèi)容!”< return; } cout<<“輸入要退的票數(shù) ”; int n;cin>>n; p=p->next; if((p->Get_tickted()-n)>=0) p->Unorder_tickt(n); else cout<<“對不起,數(shù)據(jù)出錯!?!? } else if(X=='n')cout<<“謝謝使用”< void Bus_link::found(){ Bus_infor *p;int num=-1,n=9;char name[20]=“^”;do { cout<<“tt1:按車次查找,2:按終點站查找: ”; cin>>n;}while(n<1||n>2);if(n==1){ cout<<“ttt輸入車次: ”; cin>>num;} if(n==2){ cout<<“ttt輸入終點站: ”; cin>>name;} if(!find(&p,num,name)){ cout<<“tt找不到你要查找的內(nèi)容!”< return;} } int Bus_link::find(Bus_infor **p1,int num,char *pn){ Bus_infor *p; p=head; int t=0; while(p->next){ (*p1)=p; if((p->next)->Get_bus_order()==num||!strcmp((p->next)->Get_end(),pn)) { (p->next)->output(); t=1; break; } p=p->next;} return t;} int Bus_link::find1(Bus_infor **p1,int num,char *pn){ Bus_infor *p;p=head;int t=0;while(p->next){ (*p1)=p; if((p->next)->Get_bus_order()==num||!strcmp((p->next)->Get_end(),pn)) {return 1;} p=p->next;} return 0;} void Bus_link::del(){ Bus_infor *p,*p2;int num;cout<<“ttt輸入車次號: ”;cin>>num; if(!find(&p,num,“^”)){ cout<<“tt找不到你要刪除的內(nèi)容!”< return;} p2=p->next;p->next=p2->next;delete p2;Bus_link::setkey(1);} void Bus_link::show(){ Bus_infor *p;p=head;while(p->next){ (p->next)->output(); p=p->next;} } void Bus_link::mend(){ Bus_infor *p;int num=-1;char name[20]=“^”; cout<<“ttt輸入車次號: ”;cin>>num; if(!find1(&p,num,name)){ cout<<“tt找不到你要修改的內(nèi)容!”< return;}(p->next)->output();(p->next)->input();Bus_link::setkey(1);} void Bus_link::save(){ Bus_infor *p;p=head;ofstream os(“bus.txt”,ios::out);if(Bus_link::getkey()==1){ while(p->next) { (p->next)->output(os); p=p->next; } } cout<<“ttt文件已保存!”< Bus_infor *p,*p2;p=head;clear();long t;ifstream is(“bus.txt”,ios::in); if(!is){ ofstream os(“bus.txt”,ios::out); os.close(); return;} int num=-1;while(1){ num=-1; t=is.tellg(); is>>num; is.seekg(t); if(num<0) { is.close(); return; } p2=new Bus_infor; p2->input(is); p->next=p2; p2->next=NULL; p=p->next;} } void Bus_link::clear(){ Bus_infor *p,*p2;p=head->next;while(p){ p2=p; p=p->next; delete p2;} } char Bus_link::mainmenu(){ char n[6];cout<<“nn ---歡迎使用車票管理系統(tǒng)---”< 制作人 劉強 ”< <<“ 物理學(xué)院 ”< <<“ ”< <<“ 1.錄入車票信息 2.瀏覽車票信息 <<” 3.查詢車票信息 4.刪除車票信息 <<“ 5.修改車票信息 6.定購車票信息 <<” 7.退還車票信息 8.保存車票信息 <<“ 0: 退出系統(tǒng) <<”--------------------------“< <<”--------------------------“< <<” 請選擇功能按鈕: “;cin>>n;return n[0];} int main(){ Bus_link pp;int k=1;char n;pp.begin(); while(k==1){ n=pp.mainmenu(); switch(n) { case '1':pp.input();break; case '2':pp.show();break; case '3':pp.found();break; ”< case '4':pp.del();break; case '5':pp.mend();break; case '6':pp.Order();break; case '7':pp.Unorder();break; case '8':pp.save();break; case '0': if(pp.getkey()==1) { cout<<“ttt是否保存? 1 : 保存 0:不保存 : ”; cin>>k; if(k==1) pp.save(); } pp.clear(); k=0; break; } } return 0;} 火車票管理系統(tǒng)一、課題內(nèi)容和要求 改系統(tǒng)要求實現(xiàn)一個簡單、實用的火車票管理程序,主要功能包括火車票數(shù)據(jù)的錄入、查找、刪除、顯示、售票、退票等。所有火車票數(shù)據(jù)都要利用文件系統(tǒng)保存,以備系統(tǒng)下次運行時使用。通過此課題,熟練掌握文件、數(shù)組、指針的各種操作,以及一些基本算法思想的應(yīng)用。 二、需求分析 功能框架圖:(見圖2-1) 火車票管理系統(tǒng) 錄入 查找 刪除 排序 售票 退票 保存 圖2-1。 1.新增火車票數(shù)據(jù)記錄:預(yù)先建立一個txt文檔,存入數(shù)據(jù),然后在程序中讀取文檔。 2.查找火車票數(shù)據(jù)(可按車次,發(fā)車時間、起點站、終點站等查找)。 3.刪除火車票數(shù)據(jù)記錄(先查找,再刪除。若查找出多條記錄,則進一步提示用戶選擇記錄的車次,再刪除)。 4.對火車票排序(可按車次、發(fā)車時間、起點站、終點站等排序。)。 5.顯示當前所有火車票信息列表。 6.售票(先查找,當確定車次后,根據(jù)售票張數(shù)對該車次的已售票人數(shù)進行修改)。 7.退票(售票的逆處理,過程與售票類似)。 8.保存火車票數(shù)據(jù)到文件中。 9.從文件中讀入火車票數(shù)據(jù)。 三、概要設(shè)計 1)主要結(jié)構(gòu)體: struct time { int hour; int minutes; }; struct ticket { char SerialNumber[10]; struct time SetOut; char DeparturePoint[MAX]; char TerminalPoint[MAX]; float LastTime; int FixNumber; int FixedNumber; }train[N]; 2)主要函數(shù)流程圖: l 載入函數(shù):用于從文本中載入信息。(見圖3-1) 打開文本 能否打開 讀入數(shù)據(jù) 是否結(jié)束 結(jié)束 否 否 開始 開始 否 是 是 讀入車次 是否符合輸出信息 結(jié)束 是 圖3-2 圖3-1 l 查找函數(shù):利用輸入的車次或站點進行順序查找并將找到的信息輸出。(見圖3-2) l 刪除函數(shù):先查找出要刪除的信息再刪除。(見圖3-3) 否 否 是 無法訂票 人數(shù)加一 是否超載 否 圖3-4 結(jié)束 開始 讀入車次 是否誤點 否 圖3-3 是 是 否 是否符合讀入車次 開始 記錄下標i i=i+1,i++ i<車次總數(shù)-1 結(jié)束 l 售票退票函數(shù):先判斷該車是否已發(fā)車,若未發(fā)車且人未滿則訂票成功,否則無法訂票退票。(見圖3-4) l 備份文件函數(shù):將文件內(nèi)容存儲到用戶給定的地址中(見圖3—5) 圖3-5 l 排序函數(shù)(見圖3-6) 圖3-6 四、源程序代碼 #include #include #include #include #include #include const int MAX=20; const int N=50; const int MAXFILENAME=100; enum {FALSE,TRUE}; struct time { int hour; int minutes; }; struct ticket { char SerialNumber[10]; struct time SetOut; char DeparturePoint[MAX]; char TerminalPoint[MAX]; float LastTime; int FixNumber; int FixedNumber; }train[N]; int RecordNumber; int FLAG=FALSE; /**********************************************/ int ShowMessage(void); //載入原始數(shù)據(jù) void mainmenu(void); //主菜單 void InsertMessage(void); //錄入班次信息 void SearchMenu(void); //查詢路線子菜單 void SearchByNumber(void); //按班次號查詢 void SearchByAddress(void); //按終點站查詢 void cancle(void);//刪除數(shù)據(jù) void selection(ticket *pa,int n);//排序 void TicketManagement(void); //車票售出與退回 void TicketOrder(void); //售票 void TicketDelete(void); //退票 void exit(void); //退出該系統(tǒng) void SaveRecord(ticket x); //儲存信息到文件中 /********************************************/ int main(void) { do{ mainmenu(); }while(FLAG==FALSE); return 0; } void mainmenu(void) { system(“mode con: cols=140 lines=130“); char functionNumber; printf(“ 火車票管理系統(tǒng)\n\n“); printf(“============================================================================\n“); printf(“ 1.錄入班次信息\t\n“); printf(“ 2.顯示所有車票信息列表\t\n“); printf(“ 3.查詢火車票數(shù)據(jù)\t\n“); printf(“ 4.刪除火車票數(shù)據(jù)記錄\t\n“); printf(“ 5.按行車時間排序\t\n“); printf(“ 6.售票與退票系統(tǒng)\t\n“); printf(“ 7.退出該系統(tǒng)\t\n“); printf(“============================================================================\n“); printf(“請選擇你所需要的功能:“); scanf(“%c“,&functionNumber); switch(functionNumber) { case '1': { InsertMessage(); printf(“\n按任意鍵回主菜單......\n“); getchar(); getchar(); } break; case '2': { RecordNumber=ShowMessage(); printf(“\n按任意鍵回主菜單......\n“); getchar(); getchar(); } break; case '3': { SearchMenu(); printf(“\n按任意鍵回主菜單......\n“); getchar(); getchar(); } break; case '4': { cancle(); printf(“\n按任意鍵回主菜單......\n“); getchar(); getchar(); } break; case '5': { selection(train,RecordNumber); printf(“班次\t發(fā)車時間\t起點\t終點\t行車時間(小時)\t額定載量\t已定票人數(shù)\n“); int i; for(i=0;i { printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } printf(“\n按任意鍵回主菜單......\n“); getchar(); getchar(); } break; case '6': { TicketManagement(); getchar(); getchar(); } break; case '7': { int i; FLAG=TRUE; for(i=0;i { SaveRecord(*(train+i)); } exit(); } break; default: { printf(“輸入錯誤,請確保你的輸入為1--7.\n“); printf(“按任意鍵回主菜單......\n“); getchar(); getchar(); } }//switch ends FLAG=FALSE; } void InsertMessage(void) { FILE *fp; char filename[MAXFILENAME]; int i; printf(“請輸入文件名或者文件路徑名:“); scanf(“%s“,filename); if((fp=fopen(filename,“r“))==NULL) { printf(“文件%s不可讀,請確認文件%s存在或者文件路徑正確.\n\n“,filename,filename); mainmenu(); } for(i=RecordNumber;!feof(fp)&&!ferror(fp);i++) { fscanf(fp,“%s%d%d“,&train[i].SerialNumber,&train[i].SetOut.hour,&train[i].SetOut.minutes); fscanf(fp,“%s%s%f%d%d“,&train[i].DeparturePoint,&train[i].TerminalPoint,&train[i].LastTime,&train[i].FixNumber,&train[i].FixedNumber); } RecordNumber=i; /*******************************輸出更新后的訂票記錄************************************************************/ printf(“班次\t發(fā)車時間\t起點\t終點\t行車時間(小時)\t額定載量\t已定票人數(shù)\n“); for(i=0;i { printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } fclose(fp); } int ShowMessage(void) { int i; FILE *fp; if((fp=fopen(“add.txt“,“r“))==NULL) { printf(“讀取數(shù)據(jù)失敗,請檢查文件add.txt是否存在.\n“); exit(-1); } for(i=RecordNumber;!feof(fp)&&!ferror(fp);i++) { fscanf(fp,“%s%d%d“,&train[i].SerialNumber,&train[i].SetOut.hour,&train[i].SetOut.minutes); fscanf(fp,“%s%s%f%d%d“,&train[i].DeparturePoint,&train[i].TerminalPoint,&train[i].LastTime,&train[i].FixNumber,&train[i].FixedNumber); } int count=i; printf(“班次\t發(fā)車時間\t起點\t終點\t行車時間(小時)\t額定載量\t已定票人數(shù)\n“); for(i=0;i { printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\t“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); printf(“\n“); } return count; } void SearchMenu(void) { system(“mode con: cols=140 lines=130“); char functionNumber; printf(“ 查詢子菜單\n“); printf(“============================================================================\n“); printf(“ 1.按班次號查詢\t\n“); printf(“ 2.按終點站查詢\t\n“); printf(“ 3.返回主菜單\t\n“); printf(“============================================================================\n“); printf(“請選擇你所需要的功能:“); scanf(“%*c%c“,&functionNumber); switch(functionNumber) { case '1':SearchByNumber();break; case '2':SearchByAddress();break; case '3': getchar(); mainmenu(); break; default: printf(“輸入錯誤,請確保你的輸入為1--3.\n“); printf(“按任意鍵回查詢子菜單......\n“); getchar(); getchar(); SearchMenu(); } } void SearchByNumber(void) { int i; char Number[MAX]; printf(“請輸入班次號:“); scanf(“%s“,&Number); printf(“班次\t發(fā)車時間\t起點\t終點\t行車時間(小時)\t額定載量\t已定票人數(shù)\n“); for(i=0;i { //對比終點站記錄,找到并輸出 if((strcmp(Number,train[i].SerialNumber))==0) { printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } } } void SearchByAddress(void) { int i; char Address[MAX]; printf(“請輸入終點站的名稱:“); scanf(“%s“,&Address); printf(“班次\t發(fā)車時間\t起點\t終點\t行車時間(小時)\t額定載量\t已定票人數(shù)\n“); for(i=0;i { //對比終點站記錄,找到并輸出 if((strcmp(Address,train[i].TerminalPoint))==0) { printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } } } void cancle(void) { SearchMenu(); int i,j; char m[MAX]; printf(“請輸入要刪除的班次:“); scanf(“%s“,&m); for(i=0;i { if(i==RecordNumber) { printf(“對不起,沒有這趟車\n“); } } for(j=i;j { train[j]=train[j+1]; } printf(“刪除成功\n“); } void selection(ticket *pa,int n) { int i,k,index; struct ticket temp; for(k=0;k { index=k; for(i=k+1;i if(pa[i].LastTime index=i; if(index!=k) { temp=pa[index]; pa[index]=pa[k]; pa[k]=temp; } } } void TicketManagement(void) { char functionNumber; system(“mode con: cols=140 lines=130“); printf(“ 訂票與退票菜單\n“); printf(“============================================================================\n“); printf(“ 1.訂票\t\n“); printf(“ 2.退票\t\n“); printf(“ 3.返回主菜單.\n“); printf(“============================================================================\n“); printf(“選擇你需要的功能:“); scanf(“%*c%c“,&functionNumber); switch(functionNumber) { case '1': { TicketOrder(); //getchar(); //getchar(); } break; case '2':TicketDelete();break; case '3': { getchar(); mainmenu(); } break; default: { printf(“輸入錯誤,請確保你的輸入為1--3.\n“); printf(“按任意鍵回主菜單......\n“); getchar(); getchar(); mainmenu(); } } } void TicketOrder(void) { SearchMenu(); int i,j; char a[MAX]; printf(“請輸入要訂購的車票的班次:“); scanf(“%s“,&a); printf(“請輸入要訂購的車票的張數(shù):“); scanf(“%d“,&j); for(i=0;i { if((strcmp(a,train[i].SerialNumber))==0) { if(train[i].FixedNumber { (train[i].FixedNumber)+=j; printf(“你的訂票成功,請按時上車,謝謝使用!\n“); printf(“班次\t發(fā)車時間\t起點\t終點\t行車時間(小時)\t額定載量\t已定票人數(shù)\n“); printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } else printf(“對不起,票已賣完\n“); } } } void TicketDelete(void) { SearchMenu(); int i,j; char b[MAX]; printf(“請輸入要退購的車票的班次:“); scanf(“%s“,&b); printf(“請輸入要退購的車票的張數(shù):“); scanf(“%d“,&j); for(i=0;i { if((strcmp(b,train[i].SerialNumber))==0) { if(train[i].FixedNumber>=1) { train[i].FixedNumber-=j; printf(“退訂車票成功,謝謝使用!\n“); printf(“班次\t發(fā)車時間\t起點\t終點\t行車時間(小時)\t額定載量\t已定票人數(shù)\n“); printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } else printf(“對不起,今天的這趟車的票尚未賣出,無法完成退票!\n“); } } } void exit(void) { printf(“\n\n*********************謝謝使用本系統(tǒng),歡迎下次繼續(xù)使用***********************\n“); exit(0); } void SaveRecord(ticket x) { FILE *fp; if((fp=fopen(“add.txt“,“a“))==NULL) { printf(“打開文件%s失?。躰“,“add.txt“); exit(-1); } fprintf(fp,“\n%s\t%d\t%d\t\t“,x.SerialNumber,x.SetOut.hour,x.SetOut.minutes); fprintf(fp,“%s\t%s\t\t%.1f\t %d\t\t%d“,x.DeparturePoint,x.TerminalPoint,x.LastTime,x.FixNumber,x.FixedNumber); } 五、測試數(shù)據(jù)及其結(jié)果分析 顯示的主菜單界面: 火車票管理系統(tǒng) ============================================================================ 1.錄入班次信息 2.顯示所有車票信息列表 3.查詢火車票數(shù)據(jù) 4.刪除火車票數(shù)據(jù)記錄 5.按行車時間排序 6.售票與退票系統(tǒng) 7.退出該系統(tǒng) ============================================================================ 請選擇你所需要的功能: 1)錄入班次信息 輸入:1 輸出:請輸入文件名或者文件路徑名: 輸入:D:\\1.txt 輸出: 班次 發(fā)車時間 起點 終點 行車時間(小時) 額定載量 已定票人數(shù) k1111 8:30 南京 上海 4.0 300 200 k1234 10:20 上海 蘇州 2.0 200 t2222 12:40 長沙 上海 9.0 250 k2323 13:50 揚州 南京 1.5 200 k1122 9:20 廣州 南京 20.0 300 170 按任意鍵回主菜單......2)顯示所有車票信息列表 輸入:2 輸出: 班次 發(fā)車時間 起點 終點 行車時間(小時) 額定載量 已定票人數(shù) k1111 8:30 南京 上海 4.0 300 200 k1234 10:20 上海 蘇州 2.0 200 t2222 12:40 長沙 上海 9.0 250 k2323 13:50 揚州 南京 1.5 200 k1122 9:20 廣州 南京 20.0 300 170 按任意鍵回主菜單......3)查詢火車票記錄 輸入:3 輸出: 查詢子菜單 ============================================================================ 1.按班次號查詢 2.按終點站查詢 3.返回主菜單 ============================================================================ 請選擇你所需要的功能: 輸入:1 輸出:請輸入班次號: 輸入:k1111 輸出: 班次 發(fā)車時間 起點 終點 行車時間(小時) 額定載量 已定票人數(shù) k1111 8:30 南京 上海 4.0 300 200 按任意鍵回主菜單......輸入:2 輸出:請輸入終點站的名稱: 輸入:上海 輸出: 班次 發(fā)車時間 起點 終點 行車時間(小時) 額定載量 已定票人數(shù) k1111 8:30 南京 上海 4.0 300 200 t2222 12:40 長沙 上海 9.0 250 按任意鍵回主菜單......4)刪除火車票數(shù)據(jù) 輸入:4 輸出:查詢子菜單 ============================================================================ 1.按班次號查詢 2.按終點站查詢 3.返回主菜單 ============================================================================ 請選擇你所需要的功能: (查找過程同上) 輸出:請輸入要刪除的班次: 輸入:t2222 輸出:刪除成功 按任意鍵回主菜單......5)按行車時間排序: 輸入:5 輸出: 班次 發(fā)車時間 起點 終點 行車時間(小時) 額定載量 已定票人數(shù) k2323 13:50 揚州 南京 1.5 200 k1234 10:20 上海 蘇州 2.0 200 k1111 8:30 南京 上海 4.0 300 200 t2222 12:40 長沙 上海 9.0 250 k1122 9:20 廣州 南京 20.0 300 170 按任意鍵回主菜單......6)售票 輸入:6 輸出: 訂票與退票菜單 =================================================== 1.訂票 2.退票 3.返回主菜單 ================================================== 選擇你需要的功能: 輸入:1 輸出: 查詢子菜單 ======================================================================== 1.按班次號查詢 2.按終點站查詢 3.返回主菜單 ========================================================================= 請選擇你所需要的功能: (查詢過程同上) 輸出:請輸入需要訂購的車票班次 輸入:k1111 輸出:請輸入要訂購的車票張數(shù) 輸入:10 輸出: 您的訂票成功,請按時上車,謝謝使用! 班次 發(fā)車時間 起點 終點 行車時間(小時) 額定載量 已定票人數(shù) k1111 8:30 南京 上海 4.0 300 210 7)退票 輸入:6 輸出: 訂票與退票菜單 =================================================== 1.訂票 2.退票 3.返回主菜單 ================================================== 選擇你需要的功能: 輸入:2 輸出: 查詢子菜單 ======================================================================== 1.按班次號查詢 2.按終點站查詢 3.返回主菜單 ========================================================================= 請選擇你所需要的功能: (查詢過程同上) 輸出:請輸入需要退購的車票班次 輸入:k1111 輸出:請輸入要訂購的車票張數(shù) 輸入:5 退訂車票成功,謝謝使用! 班次 發(fā)車時間 起點 終點 行車時間(小時) 額定載量 已定票人數(shù) k1111 8:30 南京 上海 4.0 300 195 8)退出 輸入:7 輸出:****************謝謝使用本系統(tǒng),歡迎下次繼續(xù)使用**************** 結(jié)果分析:(1).若輸入數(shù)字不在1——7之間,則會提示錯誤。 (2).當輸入列車班次信息不正確時,將不會得到結(jié)果。 (3).文件錄入不正確時,將不會得到任何結(jié)果。 六、調(diào)試過程中的問題 1)文件存儲方式不正確:應(yīng)先定義一個文件存儲函數(shù),在其它函數(shù)中調(diào)用,方便有效。 2)刪除時若遇到?jīng)]有的班次則程序出錯。應(yīng)在不存在輸入的列車班次時,輸出不存在的提示 3)保存后在下次運行時出錯問題:在保存信息時,應(yīng)在每個信息之間加一空格來保存,否則在文件下次使用時讀取就會沒有分界點。 4)訂票退票只能一次一張。應(yīng)在用戶輸入列車班次后讓用戶輸入需要訂購的張數(shù)。 5)結(jié)構(gòu)指針定義錯誤,ticket前不應(yīng)加struct。 黑龍江工程學(xué)院 第一章 問題分析和任務(wù)定義 1.1 問題分析 問題: 編寫一個通訊錄管理系統(tǒng)。要求包括通訊錄建立、增加號碼、刪除號碼、查詢號碼(按姓名、按號碼)、修改號碼、號碼分組、打印通訊錄(全部或分組號碼)等功能,并設(shè)計主控菜單和子菜單供用戶選擇要執(zhí)行的操作。 分析: 實現(xiàn)以下功能: 1)通訊錄編輯(添加、刪除); 2)按不同的項進行查找; 3)對已存在的通訊錄按不同的項排序; 4)將通訊錄寫入文件; 5)從文件讀入通訊錄。 1.2 任務(wù)定義 創(chuàng)建一個鏈表,每個節(jié)點有姓名和號碼以及關(guān)系三個信息。增加號碼操作為增加節(jié)點,刪除號碼操作為刪除節(jié)點,查找號碼為鏈表的遍歷。每個功能以函數(shù)的形式出現(xiàn),由主控菜單控制。并以文件的形式對號碼信息進行保存。 第二章 詳細設(shè)計 主函數(shù)(main()函數(shù))是通過一個多分支語句(switch(i)語句)實現(xiàn)的。顯示菜單函數(shù)(displaymenu()函數(shù))顯示與用戶交互的界面。以下是各個模塊實現(xiàn)程序各項功能的函數(shù)的詳細設(shè)計: 1、插入新的記錄:insert()函數(shù) 定義變量,設(shè)計loop模塊,模塊的功能是用來輸入記錄:輸入姓名、性別、電話號碼、地址的信息。用for語句查找是否輸入了與原有記錄相同的記錄,用strcmp 函數(shù)比較,if 語句判斷,如果輸入了重復(fù)的記錄,提示信息:“此記錄已存在,請重新輸入!”并且用 goto語句返回到loop,重新輸入信息。設(shè)計一個a模塊:鍵盤輸入一個字符,必須是“Y”“y”“N”“n”,否則重新輸入。最后if 語句判斷變量的值是否重新輸入信息,如果輸入的是“Y”或“y”,返回到loop,黑龍江工程學(xué)院 用戶可以輸入下一條信息,直到用戶輸入“N”或“n”返回主界面。每插入一條記錄n的值加1。功能的實現(xiàn)見源程序: 2、示好友的信息:display()函數(shù) 定義整型變量i用來循環(huán)輸出記錄。分別輸出每條記錄,并輸出記錄的個數(shù)。 3、查找好友的信息search()函數(shù) 定義字符型變量c,字符型數(shù)組a,定義loop模塊,功能:通過鍵盤輸入要查找的信息。首先顯示提示信息:“輸入你要查找的好友的姓名”然后從鍵盤輸入姓名。For語句循環(huán)內(nèi)嵌if語句,用strcmp 函數(shù)查找信息,并且顯示該記錄的所有信息,并跳出循環(huán)。再用for 語句內(nèi)嵌if語句判斷,如果沒有查到顯示提示信息:“如果沒有查到相關(guān)語句,是否重新查找(Y/N)?定義abc模塊的功能輸入一個字符(“Y”或“y”“N”“n”)用來判斷是否重新查找。如果輸入“Y”或“y”,則用goto語句返回loop重新查找。否則令i的值為n跳出循環(huán)。最后返回主界面。 4、刪除好友信息:del()函數(shù) 首先定義字符數(shù)組、變量和a、b兩個goto標識符。在a模塊中用scanf函數(shù)輸入要刪除的好友的姓名,用for循環(huán)和if 語來實現(xiàn)對好友的查找,如果找到記錄末尾,提示查無此人。在b模塊中,用來實現(xiàn)刪除功能。先確認是否刪除,如果鍵盤輸入Y 或y來確認要刪除再執(zhí)行for循環(huán),通過strcmpy函數(shù)把后一條記錄復(fù)制到前一條記錄。進行刪除記錄后,并把原末尾記錄數(shù)據(jù)賦空字符,按任意鍵刪除,按任意鍵返回主菜單。 5、修改記錄:modify()函數(shù) 定義了a、b兩個goto標識符。在a模塊中,用scanf函數(shù)輸入要修改人的姓名,用for 循環(huán)、if語句及strcmp函數(shù)找到該姓名的記錄,若到記錄末尾提示“查無此人”是否繼續(xù)重新輸入姓名,黑龍江工程學(xué)院 如果重新輸入姓名再用goto語句再執(zhí)行重新查找。在b模塊中,用于修改記錄,如果要修改記錄則從鍵盤輸入Y或y,用scanf函數(shù)來輸入新的記錄數(shù)據(jù)來實現(xiàn)修改記錄。 6、排序:sort()函數(shù) 選擇法排序的方法。定義變量i,j,用于循環(huán),定義4個字符型數(shù)組,用于替換的中間變量;用兩個for循環(huán)語句,用strcmp函數(shù)比較。按姓名升序排序。比較前一條記錄和后一條記錄的姓名,如果strcmp函數(shù)值大于0,則將這兩條記錄的所有信息替換,4個字符型數(shù)組用作替換的中間變量。最后調(diào)用display()(顯示結(jié)果)顯示排序后的結(jié)果。 第三章 程序編碼 #include 黑龍江工程學(xué)院 void format();int back(){ cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”; char back; cin>>back; if(back=='R'||back=='r') return 1; else return 0;} void print(int i){ cout<<“學(xué)號:”< cout<<“姓名:”< cout<<“地址:”< cout<<“電話號碼:”< cout<<“郵編:”< cout<<“E_MAIL:”< <<“tt★★★★★★★★★★★★★★★★★★★★★★★★★★” < <<“tt※ ※” < <<“tt※ 通 迅 錄 ※” < <<“tt※ ※” < <<“tt※ 1.通訊錄編輯.4.按序排列.※” < <<“tt※ ※” < <<“tt※ 2.查詢聯(lián)系人.5.將文件讀入程序.※” < <<“tt※ ※” < <<“tt※ 3.將資料寫入文件.6.格式化(慎用).※” < <<“tt※ ※” < <<“tt★★★★★★★★★★★★★★★★★★★★★★★★★★” < <<“tt ”< <<“ttt選擇 :”;cin>>select1;switch(select1) 黑龍江工程學(xué)院 { case '1':cout<<“(1)添加:”< cout<<“(2)刪除:”< cout<<“(3)修改:”< char select2; cout<<“ 請選擇:”< cin>>select2; switch(select2) { case '1':cout<<“ 輸入添加的資料:”< char no[13];char name[20];char address[100];char tel_no[12];char post_code[7];char e_mail[40]; cout<<“ 輸入學(xué)號:”< cin>>no; cout<<“ 輸入姓名:”< cin>>name; cout<<“ 輸入地址:”< cin>>address; cout<<“ 輸入電話號碼:”< cin>>tel_no; cout<<“ 輸入郵編:”< cin>>post_code;cout<<“ 輸入E_mail:”< cin>>e_mail; a.add(no,name,address,tel_no,post_code,e_mail); cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”; char back_add; cin>>back_add; if(back_add=='R'||back_add=='r') goto top; else goto bottom; break; case '2':cout<<“ 輸入要刪除人的姓名:”< char name2[20]; cin>>name2; a.del(name2); cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”; 黑龍江工程學(xué)院 “; ”; char back_del; cin>>back_del; if(back_del=='R'||back_del=='r') goto top; else goto bottom; break;case '3':cout<<“ 輸入需要修改人的姓名:”< char name3[20]; cin>>name3; if(a.correct(name3)) goto top; else goto bottom; break;} break;case '2':cout<<“(1)根據(jù)姓名查找”< cout<<“ 輸入姓名: ”; cin>>name4; a.find2(name4); cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): char back_f1;cin>>back_f1;if(back_f1=='R'||back_f1=='r') goto top;else goto bottom;break;case '2':char no4[13];cout<<” 輸入學(xué)號: “;cin>>no4;a.find1(no4); cout<<” 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): char back_f2;cin>>back_f2; 黑龍江工程學(xué)院 “; ”; if(back_f2=='R'||back_f2=='r') goto top; else goto bottom; break;} break;case '3':a.write();cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”;char back_w;cin>>back_w;if(back_w=='R'||back_w=='r') goto top;else goto bottom;break;case '4':cout<<“(1)按學(xué)號排序:”< cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): char back;cin>>back;if(back=='R'||back=='r') goto top;else goto bottom;break;case '2':a.list2();cout<<” 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): } char back1;cin>>back1;if(back1=='R'||back1=='r')goto top;else goto bottom;break; 黑龍江工程學(xué)院 break;case '5':a.read(); cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”; char back_r; cin>>back_r; if(back_r=='R'||back_r=='r') goto top; else goto bottom; break;case '6':cout<<“ 請確認刪除所有資料!(Y/N)”; char select5; cin>>select5; if(select5=='Y'||select5=='y') a.format(); cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”; char back_f; cin>>back_f; if(back_f=='R'||back_f=='r') goto top; else goto bottom; break;} bottom:cout<<“ ★★★★★★★★★★★★★★★★★★★★★★★ ”< void inter::add(char no[13],char name[20],char address[100],char tel_no[12],char post_code[7],char e_mail[40]){ int x=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].no,“0”)) { strcpy(st[i].address,address); strcpy(st[i].e_mail,e_mail); strcpy(st[i].name,name); strcpy(st[i].no,no); strcpy(st[i].post_code,post_code); strcpy(st[i].tel_no,tel_no); x=0; } 黑龍江工程學(xué)院 if(x==0) break;} } //刪除聯(lián)系人 void inter::del(char name[20]){ int x=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)) { strcpy(st[i].address,“0”); strcpy(st[i].e_mail,“0”); strcpy(st[i].name,“0”); strcpy(st[i].no,“0”); strcpy(st[i].post_code,“0”); strcpy(st[i].tel_no,“0”); } else x=0;} if(x==0) cout<<“ error:輸入姓名錯誤!”< int inter::correct(char name[30]){ int x;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)) x=i;} char select;cout<<“(1)修改姓名:”< 黑龍江工程學(xué)院 char name1[30]; cin>>name1; strcpy(st[x].name,name1); cout<<“ 修改成功!”< return back(); break;case '2':cout<<“ 輸入要修改的學(xué)號:”; char no1[13]; cin>>no1; strcpy(st[i].no,no1); cout<<“ 修改成功!”< return back(); break;case '3':cout<<“ 輸入要修改的地址:”; char address1[100]; cin>>address1; strcpy(st[x].address,address1); cout<<“ 修改成功!”< return back(); break;case '4':cout<<“ 輸入要修改的郵編:”; char post_code1[7]; cin>>post_code1; strcpy(st[x].post_code,post_code1); cout<<“ 修改成功!”< return back(); break;case '5':cout<<“ 輸入要修改的電話號碼:”; char tel_no1[12]; cin>>tel_no1; strcpy(st[x].tel_no,tel_no1); cout<<“ 修改成功!”< return back(); break;case '6':cout<<“ 輸入要修改的E_MAIL:”; char e_mail1[40]; cin>>e_mail1; strcpy(st[x].e_mail,e_mail1); cout<<“ 修改成功!”< return back(); break;} } //按學(xué)號查詢聯(lián)系人 黑龍江工程學(xué)院 void inter::find1(char no[13]){ int x,y=1,z=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].no,no)) { x=i; z=0; } else y=0; if(z==0) break;} if(y==0) cout<<“ 輸入的學(xué)號查找不到??!”< } //按姓名查詢聯(lián)系人 void inter::find2(char name[20]){ int x,y=1,z=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)) { x=i; z=0; } else y=0; if(z==0) break;} if(y==0) cout<<“ 輸入的姓名查找不到??!”< void inter::read(){ char name1[20];cout<<“ 輸入你要導(dǎo)入的文件名: ”;cin>>name1; 黑龍江工程學(xué)院 strcat(name1,“.txt”);ifstream file(name1);char line[120];char no[120];char name[120];char address[120];char post_code[120];char tel_no[120];char e_mail[120];int time=0;file.getline(line,120);while(!file.eof()){ for(int k=0;k<35;k++){ if(time==0) { strcpy(no,line); time=1; for(int i=0;i<120;i++) { if(no[i]==':') { i++; for(int j=0;j<13;j++) { st[k].no[j]=no[i]; i++; } } } file.getline(line,120,'n'); } if(time==1){ strcpy(name,line); time=2; for(int i=0;i<120;i++) { if(name[i]==':') { i++; for(int j=0;j<20;j++) { 黑龍江工程學(xué)院 st[k].name[j]=name[i]; i++; } } } file.getline(line,120,'n');} if(time== 2){ strcpy(address,line);time=3;for(int i=0;i<120;i++){ if(address[i]==':') { i++; for(int j=0;j<100;j++) { st[k].address[j]=address[i]; i++; } } } file.getline(line,120,'n');} if(time==3){ strcpy(tel_no,line);time=4;for(int i=0;i<120;i++){ if(tel_no[i]==':') { i++; for(int j=0;j<12;j++) { st[k].tel_no[j]=tel_no[i]; i++; } } } file.getline(line,120,'n');} 黑龍江工程學(xué)院 if(time==4) { strcpy(post_code,line); time=5; for(int i=0;i<120;i++) { if(post_code[i]==':') { i++; for(int j=0;j<7;j++) { st[k].post_code[j]=post_code[i]; i++; } } } file.getline(line,120,'n'); } if(time==5) { strcpy(e_mail,line); time=0; for(int i=0;i<120;i++) { if(e_mail[i]==':') { i++; for(int j=0;j<40;j++) { st[k].e_mail[j]=e_mail[i]; i++; } } } file.getline(line,120,'n'); } } } file.close();} //寫入文件 void inter::write(){ char name[20]; 黑龍江工程學(xué)院 cout<<“ 輸入要保存的文件名 ”;cin>>name;strcat(name,“.txt”);ofstream savefile(name);for(int i=0;i<35;i++){ savefile << “學(xué)號:”< savefile << “姓名:”< savefile << “地址:”< savefile << “電話號碼:”< savefile << “郵編:”< savefile << “E_MAIL:”< void inter::list1(){ for(int i=0;i<34;i++){ for(int j=0;j<35-i;j++) { if(strcmp(st[j].no,st[j+1].no)>0) { char no[13];char name[20];char address[100];char tel_no[12];char post_code[7];char e_mail[40]; strcpy(no,st[j].no); strcpy(st[j].no,st[j+1].no); strcpy(st[j+1].no,no); strcpy(name,st[j].name); strcpy(st[j].name,st[j+1].name); strcpy(st[j+1].name,name); strcpy(address,st[j].address); strcpy(st[j].address,st[j+1].address); strcpy(st[j+1].address,address); strcpy(tel_no,st[j].tel_no); 黑龍江工程學(xué)院 strcpy(st[j].tel_no,st[j+1].tel_no); strcpy(st[j+1].tel_no,tel_no); strcpy(post_code,st[j].post_code); strcpy(st[j].post_code,st[j+1].post_code); strcpy(st[j+1].post_code,post_code); strcpy(e_mail,st[j].e_mail); strcpy(st[j].e_mail,st[j+1].e_mail); strcpy(st[j+1].e_mail,e_mail); } } } for(int k=0;k<35;k++){ int x=0; if(strcmp(st[k].no,“0”)) { print(k); x=1; } if(x==1) { cout< cout<<“---------------”< } } } //按姓名排序 void inter::list2(){ for(int i=0;i<34;i++){ for(int j=0;j<35-i;j++) { if(strcmp(st[j].name,st[j+1].name)>0) { char no[13];char name[20];char address[100];char tel_no[12];char post_code[7]; 黑龍江工程學(xué)院 char e_mail[40]; strcpy(no,st[j].no); strcpy(st[j].no,st[j+1].no); strcpy(st[j+1].no,no); strcpy(name,st[j].name); strcpy(st[j].name,st[j+1].name); strcpy(st[j+1].name,name); strcpy(address,st[j].address); strcpy(st[j].address,st[j+1].address); strcpy(st[j+1].address,address); strcpy(tel_no,st[j].tel_no); strcpy(st[j].tel_no,st[j+1].tel_no); strcpy(st[j+1].tel_no,tel_no); strcpy(post_code,st[j].post_code); strcpy(st[j].post_code,st[j+1].post_code); strcpy(st[j+1].post_code,post_code); strcpy(e_mail,st[j].e_mail); strcpy(st[j].e_mail,st[j+1].e_mail); strcpy(st[j+1].e_mail,e_mail); } } } for(int k=0;k<35;k++){ int x=0; if(strcmp(st[k].no,“0”)) { print(k); x=1; } if(x==1) { cout< cout<<“-------”< } } 黑龍江工程學(xué)院 } //格式化 void inter::format(){ for(int i=0;i<35;i++){ strcpy(st[i].address,“0”); strcpy(st[i].e_mail,“0”); strcpy(st[i].name,“0”); strcpy(st[i].no,“0”); strcpy(st[i].post_code,“0”); strcpy(st[i].tel_no,“0”);} } 第四章 程序調(diào)試與測試 運行程序,首頁顯示如下: 按1選擇通訊錄編輯,編輯通訊錄,顯示(1)添加,(2)刪除,(3)修改,運行后結(jié)果如下: 黑龍江工程學(xué)院 第一次使用,按1添加聯(lián)系人,填入相關(guān)信息,運行圖如下: 返回首頁,按2可以查找聯(lián)系人,可以根據(jù)姓名查找和學(xué)號查找,本次運用學(xué)號查找,運行如下: 返回首頁,按4可以進行排序,可以根據(jù)姓名和學(xué)號排序,按姓名排序需要自己編輯的姓氏排序規(guī)則才能使用,本次使用學(xué)號排序,運行如下: 將資料寫入文件功能是將編輯好的通訊錄寫入文本文件,文本文件的名字可以自己輸入。將文件讀入程序,是將文本文件中的信息讀入程序,進行添加,修改,刪除,排序等功能。 第五章 結(jié)果分析 總體上可以滿足一般的應(yīng)用需求,但是還有一定的不足,程序運行流暢,沒有未知錯誤。 第六章 設(shè)計創(chuàng)新及心得 黑龍江工程學(xué)院 程設(shè)計是培養(yǎng)學(xué)生綜合運用所學(xué)知識 ,發(fā)現(xiàn),提出,分析和解決實際問題,鍛煉實踐能力的重要環(huán)節(jié),是對我們的實際工作能力的具體訓(xùn)練和考察過程.隨著科學(xué)技術(shù)發(fā)展的日新月異,當今計算機應(yīng)用在生活中可以說得是無處不在。因此作為二十一世紀的大學(xué)來說掌握程序開發(fā)技術(shù)是十分重要的,而C++語言又是最常見,功能最強大的一種高級語言,因此做好C++語言課程設(shè)計是十分必要的。 通過幾天的課程設(shè)計使我們懂得了理論與實際相結(jié)合是很重要的,只有理論知識是遠遠不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提高自己的實際動手能力和獨立思考的能力。在設(shè)計的過程中遇到問題,可以說得是困難重重,這畢竟第一次真真的做程序設(shè)計,難免會遇到過各種各樣的問題,同時在設(shè)計的過程中發(fā)現(xiàn)了自己的不足之處,對一些前面學(xué)過的知識理解得不夠深刻,掌握得不夠牢固,比如說結(jié)構(gòu)體,指針??通過這次課程設(shè)計之后,我們把前面所學(xué)過的知識又重新溫故了一遍。 我做的是班級通訊錄的課程設(shè)計,雖然是很簡單的一個小的程序,但對我來說卻是一個很大的困難。更加是第一次做課程設(shè)計,所以在機房做了一個下午卻絲毫沒有進展,最主要是不知從何開始,這個時候才知道上課老師們不厭其煩的教導(dǎo)是多么的寶貴,這個時候才后悔上課的時候沒有認真的聽講??墒乾F(xiàn)在一切都晚了,還好時間還算是充裕,只好拿出書本重新復(fù)習一下。 開始的時候真的感覺編程是一件很無聊的事情,不過當一個程序運行成功的時候那種喜悅是無法言語的,那種成就感是無法比擬的。又經(jīng)過幾天的努力,終于把程序完成了,盡管程序還是有很多功能上的欠缺和漏洞,可我還是很高興的。無論如何是自己的勞動成果,是自己經(jīng)過努力得到的成績,同時也是學(xué)習C++語言的一次實踐作業(yè),自己進步的證明。 在課程設(shè)計過程中,收獲知識,提高能力的同時,我也學(xué)到了很多人生的哲理,懂得怎么樣去制定計劃,怎么樣去實現(xiàn)這個計劃,并掌握了在執(zhí)行過程中怎么樣去克服心理上的不良情緒。因此在以后的生活和學(xué)習的過程中,我一定會把課程設(shè)計的精神帶到生活中,不畏艱難,勇往直前! 火車票管理系統(tǒng)可行性報告 一.引言 學(xué)習《面向?qū)ο蟪绦蛟O(shè)計》課程必須重視實踐環(huán)節(jié),即通過C#結(jié)合實際需求開發(fā)應(yīng)用程序。本次課程實習選擇使用C#開發(fā)數(shù)據(jù)庫應(yīng)用程序,它能將所學(xué)的C#整合SQL Server數(shù)據(jù)庫知識,形成與應(yīng)實際緊密結(jié)合的連貫整體,進一步加深學(xué)生對C#基礎(chǔ)語法的理解,加強對WinForms編程的認識,提高應(yīng)用ADO.NET這一.NET中數(shù)據(jù)庫驅(qū)動解決方案核心技術(shù)的能力,為將來的軟件設(shè)計工作打下一定的基礎(chǔ)。 該課程的實習主要是鍛煉學(xué)生的實際動手與操作的能力,充分實現(xiàn)理論與實踐相結(jié)合,從而培養(yǎng)出優(yōu)秀的學(xué)生! 1.摘要 系統(tǒng)名稱: 火車票管理系統(tǒng) 系統(tǒng)功能: 實現(xiàn)管理員對系統(tǒng)的增刪改查等一系列的功能,讓客戶可以訂票、退票等,該系統(tǒng)只要實現(xiàn)簡單的操作功能。 2.背景 揚州環(huán)境資源職業(yè)技術(shù)學(xué)院1012網(wǎng)絡(luò)班小組成員在C#面向?qū)ο蟪绦蛟O(shè)計該課程的實訓(xùn)周內(nèi)進行的課程實訓(xùn),借此提高學(xué)生的動手能力,理論與實踐相結(jié)合的能力;該系統(tǒng)主要是在Visual Studio C# 2005的基礎(chǔ)上與SQL數(shù)據(jù)庫相結(jié)合而成的面向?qū)ο蟮某绦蛟O(shè)計系統(tǒng)。 二.系統(tǒng)開發(fā)的背景、必要性及意義 1.現(xiàn)行系統(tǒng)調(diào)查研究 (1)組織機構(gòu):揚州環(huán)境資源職業(yè)技術(shù)學(xué)院 1012網(wǎng)絡(luò)班;指導(dǎo)老師:陳彥(2)實訓(xùn)時間:2011年12月26日至2012年1月6日 (3)小組成員:徐濤平(組長)、,孫淑茵、孫垚垚、,夏盼盼、,柏銘慧、,華飛龍、,陳龍、,顧漢明 (4)成員任務(wù):徐濤平、,孫垚垚、,夏盼盼、,柏銘慧、,華飛龍、,陳龍、,顧漢明負責系統(tǒng)相關(guān)文檔的編寫;,柏銘慧負責前期的數(shù)據(jù)庫設(shè)計;孫淑茵負責設(shè)計后期與系統(tǒng)相連接的數(shù)據(jù)庫DB的設(shè)計,并負責系統(tǒng)的編碼編寫。 (5)計算機應(yīng)用情況:臺式機裝有Visual Studio C# 2005和SQL數(shù)據(jù)庫 2.需求調(diào)查和分析 對于現(xiàn)在網(wǎng)絡(luò)的迅速發(fā)展,人們越來越關(guān)注網(wǎng)絡(luò)。人們在網(wǎng)絡(luò)上進行交易,購物,訂餐等。在網(wǎng)上進行訂票也越來越受人們的歡迎。鑒于這種情況,本人孫淑茵想要開發(fā)一個類似的系統(tǒng),故而有了現(xiàn)在的火車票管理系統(tǒng)。 該系統(tǒng)由于是本人的初次嘗試開發(fā),所以功能比較的簡單,還存在不足之處。 三.可行性分析 1.系統(tǒng)運行可行性分析 該系統(tǒng)只需要一臺裝有Visual Studio C# 2005和SQL數(shù)據(jù)庫的的電腦就可以進行運行,對于企業(yè)來說,這是最簡單的、最實用的系統(tǒng)了;對于人員來說,不需要花費大量的金錢進行人員的培訓(xùn),只需要招聘一個相關(guān)專業(yè)的計算機人員,就可以對系統(tǒng)進行操作。2.技術(shù)可行性 火車票管理系統(tǒng)功能簡單,對人員要求以及技術(shù)要求不高,在這方面,只需要一個計算機相關(guān)專業(yè)的人員就可以操作系統(tǒng),在技術(shù)上完全可以進行。3.經(jīng)濟可行性 在經(jīng)濟上,不需要額外的費用,只需要付費開發(fā)人員即可,可以說是一勞永逸,在后期,不需要企業(yè)花費費用,只需要技術(shù)人員進行定期的維護即可,在經(jīng)濟上完全可行。 四.系統(tǒng)功能簡單介紹 1.數(shù)據(jù)庫 火車票管理系統(tǒng)連接的數(shù)據(jù)庫主要是SQL數(shù)據(jù)庫,數(shù)據(jù)庫的名稱為DB.mdb,它包括了Stype表、Train表和UserInfo表三張表,由于時間匆忙,所以只有這三張表,進而組成與系統(tǒng)相連接的數(shù)據(jù)庫。詳見下圖4.1 圖4.1 2.系統(tǒng)功能介紹 火車票管理系統(tǒng)功能比較簡單,管理員可以對系統(tǒng)進行增刪改查,而一般的瀏覽者就可以對系統(tǒng)進行相應(yīng)的查票、訂票、退票操作,而不能像管理員那樣對系統(tǒng)進行增刪改查等操作,從而保證了系統(tǒng)的安全性。下圖是系統(tǒng)的相關(guān)截圖,如圖4.2、4.3所示: 圖4.2 圖4.3 五.結(jié)論 在2011年12月26日至2012年1月6日實訓(xùn)期間,小組成員團結(jié)協(xié)作,共同努力,完成了火車票管理系統(tǒng)的開發(fā),在這個過程中每個成員的努力都市值得褒獎的,尤其是負責代碼編寫的孫淑茵為我們的系統(tǒng)完成與完善更是值得獎勵的。 火車票管理系統(tǒng)功能簡單,實現(xiàn)方便,但也耗費了人力物力與心力,能在短時間內(nèi)開發(fā)出這樣一個的系統(tǒng),我們的努力是值得肯定的,但是這個系統(tǒng)還存在著不足之處,有望在以后的日子里,對系統(tǒng)進行改善和維護。 六.說明 在這里,對相關(guān)的問題做一些說明: 1.我們是軟件技術(shù)基礎(chǔ)實訓(xùn)和C#課程實訓(xùn)前后進行的,軟件技術(shù)基礎(chǔ)實訓(xùn)在前,分組也是在軟件技術(shù)基礎(chǔ)實訓(xùn)期間分的,相關(guān)的文檔也是在此期間完成的,代碼也是在此期間編寫完成,只是比較不完善,而且在軟件技術(shù)基礎(chǔ)實訓(xùn)期間小組成員負責前期數(shù)據(jù)庫設(shè)計出的數(shù)據(jù)庫并不能用,都是中文,并且表與表之間沒有相關(guān)的聯(lián)系,所以負責代碼編寫的孫淑茵就自己設(shè)計了一個數(shù)據(jù)庫DB。 2.在后來的C#實訓(xùn)期間,小組成員孫淑茵自己對軟件技術(shù)基礎(chǔ)實訓(xùn)期間不完善的火車票管理系統(tǒng)進行了改進,在陳彥老師的指導(dǎo)下,才有了后來的完善的火車票管理系統(tǒng),可以說這個火車票管理系統(tǒng)是孫淑茵同學(xué)的私有產(chǎn)物,與小組其他成員關(guān)系不大,在此說明一下。 XXXXXXXXXXXC/C++程序設(shè)計實訓(xùn) 電話簿管理系統(tǒng) 學(xué)生姓名 ×××× 學(xué) 號 ×××× 所在學(xué)院 ×××× 專業(yè)名稱 ×××× 班 級 ×××× 指導(dǎo)教師 XXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX 目 錄 1.前言··················································································································· 3 2.設(shè)計目的··········································································································· 3 3.功能描述··········································································································· 3 4.總體設(shè)計··········································································································· 4 1、功能模塊設(shè)計···························································································· 4 2、數(shù)據(jù)結(jié)構(gòu)設(shè)計···························································································· 6 3、函數(shù)功能描述···························································································· 7 5.程序?qū)崿F(xiàn)··········································································································· 7 1、源程序(略)···························································································· 7 2、運行結(jié)果···································································································· 7 6.小結(jié)··················································································································· 9 1.前言 隨著科技的進步和信息產(chǎn)業(yè)的飛速發(fā)展,電話簿成為了現(xiàn)代生活中一個重要的工具。本電話簿管理系統(tǒng)利用計算機對通訊錄進行統(tǒng)一管理,包括添加、修改、查詢記錄等功能,實現(xiàn)通訊錄管理工作的系統(tǒng)化、規(guī)范化和自動化,為人們的工作和生活提供便利。本程序是利用結(jié)構(gòu)數(shù)組實現(xiàn)此電話簿管理系統(tǒng)。 2.設(shè)計目的 本程序旨在訓(xùn)練基本編程能力,了解管理信息系統(tǒng)的開發(fā)流程,熟悉C語言的文件和結(jié)構(gòu)數(shù)組的各種基本操作。本程序中涉及結(jié)構(gòu)體、數(shù)組、文件等方面的知識。通過本程序的訓(xùn)練,能對C語言的文件操作有一個更深刻的了解,掌握利用數(shù)組存儲結(jié)構(gòu)實現(xiàn)電話簿管理的原理,為進一步開發(fā)出高質(zhì)量的信息管理系統(tǒng)打下堅實的基礎(chǔ)。 3.功能描述 如圖1所示,電話簿管理系統(tǒng)主要利用數(shù)組來實現(xiàn),其數(shù)組元素是結(jié)構(gòu)體類型,整個系統(tǒng)由如下幾大功能模塊組成。 電話簿管理系統(tǒng)輸入記錄模塊查詢記錄模塊更新記錄模塊輸出記錄模塊從文件讀入從鍵盤讀入按姓名查詢按電話查詢修改記錄刪除記錄插入記錄排序記錄輸出至文件輸出至屏幕(1)輸入記錄模塊。輸入記錄模塊主要完成將數(shù)據(jù)存入數(shù)組中的工作。在此電話簿管理系統(tǒng)中,記錄可以從以文本形式存儲的數(shù)據(jù)文件中讀入,也可從鍵盤逐個輸入記錄。記錄由與聯(lián)系人有關(guān)的基本信息字段構(gòu)成。當從數(shù)據(jù)文件中讀入記錄時,它就是在以記錄為單位存儲的數(shù)據(jù)文件中,將記錄逐條復(fù)制到結(jié)構(gòu)體類型的數(shù)組元素中。 (2)查詢記錄模塊。查詢記錄模塊主要完成在數(shù)組中查找滿足相關(guān)條件的記錄。在此電話簿管理系統(tǒng)中,用戶可以按照聯(lián)系人姓名或聯(lián)系人電話號碼在數(shù)組中進行查找。若找到該記錄,則以表格形式打印出此記錄的信息;否則,返回一個-1的值,并打印出未找到該記錄的提示信息。 (3)更新記錄模塊。更新記錄模塊主要完成對記錄的維護。在此電話簿管理系統(tǒng)中,它實現(xiàn)對記錄的修改、刪除、插入和排序操作。一般而言,系統(tǒng)進行了這些操作之后,需要將修改的數(shù)據(jù)存入源數(shù)據(jù)文件。 (4)輸出記錄模塊。輸出記錄模塊主要完成兩個任務(wù)。第一,它實現(xiàn)對記錄的存盤操作,即將數(shù)組中各元素中存儲的記錄信息寫入數(shù)據(jù)文件中。第二,它實現(xiàn)將數(shù)組中存儲的記 圖1 電話簿管理系統(tǒng)功能模塊 錄信息以表格的形式在屏幕上打印顯示出來。 4.總體設(shè)計 1、功能模塊設(shè)計 (1)主控main()函數(shù)執(zhí)行流程 電話簿管理系統(tǒng)執(zhí)行主流程如圖2所示。它先以可讀寫的方式打開文本類型的數(shù)據(jù)文件,此文件默認為“c:telephon”,若該文件不存在,則新建此數(shù)據(jù)文件。當打開文件操作成功后,從文件中一次讀出一條記錄,添加到新建的數(shù)組中,然后執(zhí)行顯示主菜單和進入主循環(huán)操作,進行按鍵判斷。值得一提的是,文本類型文件與二進制類型文件不同,它可以使用Windows自帶的記事本打開并查看到存儲的文件內(nèi)容。 開始以可讀寫的方式打開一個數(shù)據(jù)文件將此文件的內(nèi)容讀出,并存入一個新的結(jié)構(gòu)體類型的數(shù)組中調(diào)用emnu()菜單函數(shù)進入while(1)主循環(huán)輸入0~8中的一個數(shù)值,選擇相應(yīng)操作輸入是否為0?是否判斷鍵值,調(diào)用相應(yīng)函數(shù),完成相應(yīng)功能是否已對修改進行了存盤?否調(diào)用Save()函數(shù),進行寫數(shù)據(jù)文件操作是結(jié)束 圖2 主控函數(shù)執(zhí)行流程圖 在判斷鍵值時,有效的輸入為0-8之間的任意數(shù)值,其他輸入都被視為錯誤按鍵。若輸入為0(即變量select=0),則會繼續(xù)判斷是否在對記錄進行了更新操作之后進行了存盤操作,若未存盤,則全局變量saveflag=1,系統(tǒng)會提示用戶是否需要進行數(shù)據(jù)存盤操作,用戶輸入 Y或y,系統(tǒng)會進行存盤操作。最后,系統(tǒng)執(zhí)行退出電話簿管理系統(tǒng)的操作。 若選擇1,則調(diào)用Add()函數(shù),執(zhí)行增加記錄操作;若選擇2,則調(diào)用Disp()函數(shù),執(zhí)行將記錄以表格形式打印輸出至屏幕的操作;若選擇3,則調(diào)用Del()函數(shù),執(zhí)行刪除記錄操作;若選擇4,則調(diào)用Qur()函數(shù),執(zhí)行查詢記錄操作:若選擇5,則調(diào)用Modify()函數(shù),執(zhí)行修改記錄操作;若選擇6,則調(diào)用lnsert()函數(shù),執(zhí)行插入記錄操作;若選擇7,則調(diào)用SelectSort()函數(shù),執(zhí)行按升序排序記錄的操作;若選擇8,則調(diào)用Save()函數(shù),執(zhí)行將記錄存入磁盤中的數(shù)據(jù)文件的操作:若輸入為0-8之外的值,則調(diào)用Wrong()函數(shù),給出按鍵錯誤的提示。 (2)輸入記錄模塊 輸入記錄模塊主要實現(xiàn)將數(shù)據(jù)存入數(shù)組中。當從數(shù)據(jù)文件中讀出記錄時,它調(diào)用fread(&tele[count],sizeof(TELEBOOK), l,fp)文件讀取函數(shù),執(zhí)行一次從文件中讀取一條電話簿記錄信息存入某個數(shù)組元素中的操作,并且這個操作在main()中調(diào)用執(zhí)行,即在電話簿管理系統(tǒng)進入顯示菜單界面時,該操作己經(jīng)執(zhí)行了。若該文件中沒有數(shù)據(jù),則系統(tǒng)會提示數(shù)組為空,沒有任何記錄可操作,此時,用戶應(yīng)選擇1,調(diào)用Add()函數(shù),進行記錄的輸入,即完成在數(shù)組中添加元素的操作。 (3)查詢記錄模塊 查詢記錄模塊主要實現(xiàn)在數(shù)組中按聯(lián)系人姓名或電話查找滿足條件的記錄。在查詢函數(shù)Qur()中,為了遵循模塊化編程的原則,對在數(shù)組中進行的記錄定位操作設(shè)計成了一個單獨的函數(shù)int Locate(TELEBOOK temp[],int n,char findmess[],char nameorphonenum[]),參數(shù)findmess[]保存要查找的具體內(nèi)容,nameorphonenum[]保存要查找的字段(值為字特串類型的name或phonenum),若找到該記錄,則返回指向該記錄的數(shù)組元素的下標;否則,返回一個-1的值。 (4)更新記錄模塊 更新記錄模塊主要實現(xiàn)了對記錄的修改、刪除、插入和排序操作。因為記錄是以數(shù)組的結(jié)構(gòu)形式存儲的,所以這些操作都在數(shù)組中完成。下面分別介紹這4個功能模塊。 1)修改記錄 修改記錄操作需要對數(shù)組中目標元素的數(shù)據(jù)域中的值進行修改,它分兩步完成。第一步,輸入要修改的聯(lián)系人姓名,輸入后調(diào)用定位函數(shù)Locate()在數(shù)組中逐個對聯(lián)系人姓名字段的值進行比較,直到找到該聯(lián)系人姓名的記錄;第二步,若找到該記錄,修改除記錄編號之外的各字段的值,并將存盤標記變saveflag置1,表示已經(jīng)對記錄進行了修改,但還未執(zhí)行存盤操作。 2)刪除記錄 刪除記錄操作完成刪除指定聯(lián)系人姓名或電話號碼的記錄,它也分兩步完成。第一步,輸入要修改的聯(lián)系人姓名或電話號碼,輸入后調(diào)用定位函數(shù)Locate()在數(shù)組中逐個對聯(lián)系人姓名或電話號碼字段的值進行比較,直到找到該聯(lián)系人姓名或電話號碼的記錄,返回指向該記錄的數(shù)組元素下標;第二步,若找到該記錄,則從該記錄所在元素的后續(xù)元素起,依次向前移一個元素位置,有值的數(shù)組元素個數(shù)減1,其具體過程如圖3所示,在刪除了數(shù)組元素A2后,數(shù)組元素A3和A4向前移動了一個位置 A0刪除A2前A0刪除A2后A1A1A2A3A3A4A4 圖3 數(shù)組中刪除記錄示意圖 3)插入記錄 插入記錄操作完成在指定記錄編號的隨后位置插入新的記錄。首先,它要求用戶輸入某個記錄編號,新的記錄將插入在該記錄之后、然后,提示用戶輸入一條新的記錄的信息,這些信息保存在新結(jié)構(gòu)體類型的數(shù)組元素的各字段中;最后,將該元素插入在已經(jīng)確認位置的記錄編號之后。它的具體插入執(zhí)行過程如圖4所示,新元素B1準備插入至已有5個元素的數(shù)組中,插入位置為元素A2之后。這具體過程為:先調(diào)用Locate()函數(shù)找到A2在數(shù)組中的下標,從A4開始,往后移動,至A2停止移動,然后在原A3的位置插入元素B1。 插入B1A0插入B1前A0插入B1后A1A2B1A3A4A1A2A3A4 圖4 數(shù)組中插入記錄示意圖 4)排序記錄 選擇排序法也屬于內(nèi)部排序法中的一種,它是運用字段值比較后,從欲排序的數(shù)組元素中,按指定規(guī)則選出其字段值最小的元素,并依原則交換數(shù)組元素位置后,更新欲排序的數(shù)組元素,以達到排序的目的。這里我們采用這種排序法來實現(xiàn)按照記錄編號或聯(lián)系人姓名字段的值從低到高對記錄進行升序排序。對按照記錄編號排序方式而言,我們將按其數(shù)值大小來排序;對按照聯(lián)系人姓名排序方式而言,我們將按其姓名字符ASCII碼的大小來排序。 選擇排序的方法為:從欲排序的n個數(shù)組元素中,以線性查找的方式找出最小的元素和第一個元素交換,再從剩下的(n-1)個數(shù)組元素中,找出最小的元素和第二個元素交換,以此類推,直到所有元素均已排序完成。 將相鄰的兩個數(shù)組元素的電話簿字段的值進行比較,若左邊的值小于右邊的值,則將此兩個元素的值進行交換;若左邊的值大于等于右邊的值,則此兩個值的位置不變。右邊的值繼續(xù)和下一個值做比較,重復(fù)此動作,直到比較到最后一個值,最終實現(xiàn)了升序排序。選擇排序法是最簡單的排序法,但選擇排序法所需的排序時間比其他排序法長。 (5)輸出記錄模塊 當把記錄輸出至文件時,調(diào)用fwrite(&temp[i],sizeof(TELEBOOK),L,fp)函數(shù),將數(shù)組元素temp[i ]中各字段的值,寫入文件指針fp所指的文件:當把記錄輸出至屏幕時,調(diào)用void Disp()函數(shù),將數(shù)組中存儲的記錄信息以表格的形式在屏幕上打印出來。 2、數(shù)據(jù)結(jié)構(gòu)設(shè)計 本程序定義了結(jié)構(gòu)體telebook,用于存放聯(lián)系人的基本信息。這里僅有3 個與聯(lián)系人有關(guān)的字段,讀者可以按照需要擴展相關(guān)字段。 typedef struct telebook { char num[4];char name[10];char phonenum[15];char address[20];}TELEBOOK;其各字段的值的含義如下: ? num[4]:保存記錄編號。? name[10]:保存聯(lián)系人姓名。? phonenum[15]:保存聯(lián)系人的電話號碼。? address[20]:保存聯(lián)系人地址。 3、函數(shù)功能描述 1)printheader()函數(shù)原型:void printheader()printheader()函數(shù)用于在表格形式顯示記錄時,打印輸出表頭信息。2)printdata()函數(shù)原型:void printdata(TELEBOOK pp)printdatan()數(shù)用于以表格顯示的方式,打印輸出單個數(shù)組元素pp中的記錄信息。3)Disp()函數(shù)原型:void Disp(TELEBOOK temp[],int n)Disp()函數(shù)用于顯示temp數(shù)組中存儲的n條記錄,內(nèi)容為telebook結(jié)構(gòu)中定義的內(nèi)容。其余函數(shù)功能描述省略,請同學(xué)們在自己寫的時候?qū)懲暾?/p> 5.程序?qū)崿F(xiàn) 1、源程序(略) 2、運行結(jié)果 (1)主界面 圖5 主界面 當用戶剛進入電話簿管理系統(tǒng)時,其主界面如圖5所示。此時,系統(tǒng)己經(jīng)將“c:telephon”文件打開,若文件不為空,則將數(shù)據(jù)從文件中逐條記錄讀出,并寫入數(shù)組中。用戶可選擇0-8之間的數(shù)值,調(diào)用相應(yīng)功能進行操作。當輸入為0時,退出此管理系統(tǒng)。 (2)輸入記錄 當用戶輸入1并按Enter鍵后,即可進入數(shù)據(jù)輸入界面。其輸入記錄過程如圖6所示,這里輸入了3條記錄。當用戶輸入為0的記錄編號時,它會結(jié)束輸入過程,返回到主菜單界面。 (3)顯示記錄 當用戶執(zhí)行了輸入記錄或已經(jīng)從數(shù)據(jù)文件中讀取了記錄之后,即可輸入2并按Enter鍵,查看當前數(shù)組中的記錄情況,如圖7所示,此時表中有3條記錄。 圖6 輸入記錄 圖7 顯示記錄 (4)刪除記錄 當用戶輸入3并按Enter鍵后,即可進入記錄刪除界面。其刪除記錄過程如圖8所示,這里按聯(lián)系人姓名刪除了一條姓名為A1的記錄。 圖8 刪除記錄 (5)查找記錄 當用戶輸入4并按Enter鍵后,即可進入記錄查找界面。其查找記錄過程如圖9所示,8 用戶可按姓名或電話號碼進行記錄查找。 圖9 查找記錄 (6)修改記錄 當用戶輸入5并按Enter鍵后,即可進入記錄修改界面。其修改記錄過程如圖10所示,這里修改了姓名為a2的聯(lián)系電話和地址字段。 圖11 修改記錄 (7)插入記錄 當用戶輸入6并按Enter鍵后,即可進入記錄插入界面。其插入過程如圖11所示,這里在記錄編號為3的記錄后插入了一條記錄編號為5的記錄。 (8)排序記錄 當用戶輸入7并按Enter鍵后,即可進入記錄排序界面。用戶可以選擇按照記錄編號或聯(lián)系人姓名進行排序,圖12為按記錄編號進行記錄升序排序的結(jié)果。 (9)保存記錄 當用戶輸入8并按Enter鍵后,即可進入記錄保存界面。其保存結(jié)果提示信息如圖13所示,這里有3條記錄已經(jīng)存儲至磁盤數(shù)據(jù)文件c:telephon中。 6.小結(jié) 本文介紹了電話簿管理系統(tǒng)的設(shè)計思路及其編程實現(xiàn),重點介紹了功能模塊的設(shè)計原理和利用數(shù)組存儲結(jié)構(gòu)實現(xiàn)電話簿管理的過程。通過本程序的開發(fā)使我熟悉C語言下的文件和數(shù)組操作,了解管理信息系統(tǒng)(MIS)的開發(fā)原理,并注意利用選擇排序法來實現(xiàn)數(shù)組元素 排序的特點。 利用本電話簿管理系統(tǒng)可以對通訊錄進行日常維護和管理。第二篇:火車票管理系統(tǒng)
第三篇:C++通訊錄管理系統(tǒng)
第四篇:火車票管理系統(tǒng)可行性報告(本站推薦)
第五篇:C++程序設(shè)計—電話簿管理系統(tǒng)