這是這學期基礎強化訓練的課設題目,要求寫一個簡單的航空訂票管理系統,前面兩個課設我大都是網上找的資料來應付任務,此次終於狠下心來本身寫,花了大概有兩天多的時間吧,代碼300多行,也不算多,系統很簡單,但第一次這麼認真的本身完成任務,內心固然仍是很得意,並且本身寫代碼,本身調試,收穫也很不小,我也都把這些經驗記下來,這些東西慢慢積累起來,確定能讓我收穫不小。ios
(1).關於cin與getchar(),在這個程序中,我定義了char name[]等字符數組,而後我使用getchar()函數來接收數組的每一個字符(實際上用cin也能夠,並且更方便,只是當時我寫的時候還不知道能夠用cin),而後我程序中也使用了cin來輸入數據,但運行程序輸入數據的時候卻出現了我想不到的錯誤。後來經過調試,也查閱了一下cin的用法,終於找出了錯誤緣由:用cin輸入數據的時候,程序讀取數據會忽略開頭的空格,換行等字符,遇到下一個空格,換行等字符表示輸入的數據的結束,但getchar()不會忽略這些字符。個人程序中先用cin來給了一個float型數據賦值,而後再使用getchar()來接收name數組的每一個字符,這樣的話,上個表示cin輸入結束的ENTER字符會賦給name數組的第一個元素,致使程序出現錯誤。數組
(2).關於struct Node結構體,開始我給個人Node結構體裏面的姓名等數據項定義的是string類型,而不是字符數組類型,覺得這樣的話易於進行各類操做。但後面編譯程序的時候卻出現了錯誤,錯誤出如今這一句: Node *head=(Node *)malloc(sizeof(Node)); 找了很久終於發現錯誤就是出如今結構體Node的定義裏面,我給裏面的數據項定義了string類型,string類型定義的是未知長度的字符串,那這樣的話sizeof(Node)是未知的,因此那一句會出現編譯錯誤。函數
(3).這個程序裏面的兩個函數return_ticket()和change_mes()還存在缺陷,退票和修改訂票信息我都是經過姓名來查找定位的,若是存在兩個同名人訂票或一我的定了兩張不一樣的票,使用這兩個函數的時候就有可能得不到你想要的結果,修改起來我略嫌麻煩,哪位高人有興趣改進的話,不勝感激!spa
下面是代碼:調試
#include<iostream> #include<fstream> #include<string> #include<malloc.h> using namespace std; struct Node { Node *next; char name[20]; //姓名 char num[10]; //航班號 char line[30]; //航線 char date[20]; //日期 float price; //票價 }; void welcome(); //歡迎界面 void reading_mes(Node *head); void booking_ticket(Node *head); //訂票 void checking_mes(Node *head); //查看訂票信息 void return_ticket(Node *head); //退票 void changing_mes(Node *head); //修改訂票信息 void show_menu(); //顯示菜單 void saving_mes(Node *head); int main() { welcome(); Node *head=(Node *)malloc(sizeof(Node)); head->next=NULL; reading_mes(head); int i; bool flag=true; cout<<"請選擇你想執行的操做(1--5):"; cin>>i;cout<<endl; while(flag) { switch (i) { case 1: cout<<"你選擇了「查看乘客訂票信息」:"<<endl;checking_mes(head);cout<<endl;show_menu();;cin>>i;break; case 2: cout<<"你選擇了「乘客訂票」:"<<endl;booking_ticket(head);cout<<endl;show_menu();cin>>i;break; case 3: cout<<"你選擇了「乘客退票」"<<endl;return_ticket(head);cout<<endl;show_menu();cin>>i;break; case 4: cout<<"你選擇了「修改乘客訂票信息」"<<endl;changing_mes(head);cout<<endl;show_menu();cin>>i;break; case 5: flag=false; cout<<"您已退出系統!"<<endl;break; default: cout<<"輸入不在1--5之間,請從新輸入!";cin>>i; break; } } saving_mes(head); return 0; } void welcome() { //歡迎界面 cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * * * * "<<endl; cout<<" 歡迎使用航空訂票乘客管理系統! "<<endl; cout<<" 請選擇下面的菜單來執行操做: "<<endl; cout<<" (1).查看乘客訂票信息。 "<<endl; cout<<" (2).乘客訂票。 "<<endl; cout<<" (3).乘客退票。 "<<endl; cout<<" (4).修改乘客訂票信息。 "<<endl; cout<<" (5).退出系統! "<<endl; cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * * * * "<<endl; cout<<endl; } void booking_ticket(Node *head) { int i; Node *p=(Node *)malloc(sizeof(Node)); cout<<"請輸入乘客姓名:"; for(i=0;i<20;i++) { p->name[i]=getchar(); if (i==0&&p->name[i]=='\n') {i=-1;continue;} if (p->name[i]=='\n') { p->name[i]='\0' ;break;} } cout<<"請輸入航班號:"; for(i=0;i<10;i++) { p->num[i]=getchar(); if (p->num[i]=='\n') { p->num[i]='\0'; break;} } cout<<"請輸入航線:"; for(i=0;i<30;i++) { p->line[i]=getchar(); if (p->line[i]=='\n') { p->line[i]='\0'; break;} } cout<<"請輸入日期:"; for(i=0;i<20;i++) { p->date[i]=getchar(); if (p->date[i]=='\n') { p->date[i]='\0'; break;} } cout<<"請輸入票價(元):"; cin>>p->price; p->next=NULL; int flag; cout<<"是否保存?(0/1)"; cin>>flag; if (flag==1) { //插入新生成的結點 Node *q=head->next; head->next=p; p->next=q; cout<<"保存成功!"<<endl; } else { free(p); cout<<"未保存!"<<endl; } } void checking_mes(Node *head) { int i,j; bool flag=false; Node *p; cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * * * * "<<endl; cout<<" 你能夠按下面幾種方式查看: "<<endl; cout<<" (1).按姓名查找。 "<<endl; cout<<" (2).按航班號查找。 "<<endl; cout<<" (3).按航線查找。 "<<endl; cout<<" (4).按日期查找。 "<<endl; cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * * * * "<<endl; cout<<"請輸入你想選擇的查找方式(1--4):"; cin>>i; switch(i) { case 1: cout<<"請輸入姓名:"; char name[20]; for(j=0;j<20;j++) { name[j]=getchar(); if (j==0&&name[j]=='\n') {j=-1;continue;} if (name[j]=='\n') { name[j]='\0' ;break;} } p=head->next; while(p) { if(strcmp(name,p->name)==0) { cout<<"姓名:"<<p->name<<" 航班號:"<<p->num<<" 航線:"<<p->line; cout<<" 日期:"<<p->date<<" 票價:"<<p->price<<endl; flag=true; } p=p->next; } break; case 2: cout<<"請輸入航班號:"; char num[10]; for(j=0;j<10;j++) { num[j]=getchar(); if (j==0&&num[j]=='\n') {j=-1;continue;} if (num[j]=='\n') {num[j]='\0';break;} } p=head->next; while(p) { if(strcmp(num,p->num)==0) { cout<<"姓名:"<<p->name<<" 航班號:"<<p->num<<" 航線:"<<p->line; cout<<" 日期:"<<p->date<<" 票價:"<<p->price<<endl; flag=true; } p=p->next; } break; case 3: cout<<"請輸入航線:"; char line[30]; for(j=0;j<30;j++) { line[j]=getchar(); if (j==0&&line[j]=='\n') {j=-1;continue;} if (line[j]=='\n') {line[j]='\0';break;} } p=head->next; while(p) { if(strcmp(line,p->line)==0) { cout<<"姓名:"<<p->name<<" 航班號:"<<p->num<<" 航線:"<<p->line; cout<<" 日期:"<<p->date<<" 票價:"<<p->price<<endl; flag=true; } p=p->next; } break; case 4: cout<<"請輸入日期:"; char date[20]; for (j=0;j<20;j++) { date[j]=getchar(); if (j==0&&date[j]=='\n') {j=-1;continue;} if (date[j]=='\n') {date[j]='\0';break;} } p=head->next; while(p) { if(strcmp(date,p->date)==0) { cout<<"姓名:"<<p->name<<" 航班號:"<<p->num<<" 航線:"<<p->line; cout<<" 日期:"<<p->date<<" 票價:"<<p->price<<endl; flag=true; } p=p->next; } break; default: cout<<"輸入有誤!"<<endl;flag=true;break; } if (!flag) cout<<"您要查找的乘客不存在!"<<endl; } void return_ticket(Node *head) { char name[20]; cout<<"請輸入須要退票的乘客姓名:"<<endl; int i; for(i=0;i<20;i++) { name[i]=getchar(); if (i==0&&name[i]=='\n') {i=-1;continue;} if (name[i]=='\n') { name[i]='\0' ;break;} } Node *p=head; Node *q; while(p->next) { q=p; p=p->next; if(strcmp(name,p->name)==0) { q->next=p->next; free(p); cout<<"退票成功!"<<endl;break; } } if (!p) cout<<"你所輸入的乘客不存在!"<<endl; } void changing_mes(Node *head) { int i,j; Node *p; char name[20]; cout<<"請輸入你想修改訂票信息的乘客姓名:"; for(i=0;i<20;i++) { name[i]=getchar(); if (i==0&&name[i]=='\n') {i=-1;continue;} if (name[i]=='\n') { name[i]='\0' ;break;} } p=head->next; while (p) { if (strcmp(name,p->name)==0) break; p=p->next; } if (!p) cout<<"你所輸入的乘客不存在!"<<endl; else { int flag=1; while(flag==1) { cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * * * * "<<endl; cout<<" 你能夠修改如下信息: "<<endl; cout<<" (1).姓名。 "<<endl; cout<<" (2).航班號。 "<<endl; cout<<" (3).航線。 "<<endl; cout<<" (4).日期。 "<<endl; cout<<" (5).票價。 "<<endl; cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * * * * "<<endl; cout<<"請輸入你想修改的信息(1--5):"; cin>>i; switch (i) { case 1: cout<<"請輸入修改後的姓名:"; for(j=0;j<20;j++) { name[j]=getchar(); if (j==0&&name[j]=='\n') {j=-1;continue;} if (name[j]=='\n') { name[j]='\0' ;break;} } strcpy(p->name,name); cout<<"修改爲功!"<<endl; break; case 2: cout<<"請輸入修改後的航班號:"; char num[10]; for(j=0;j<10;j++) { num[j]=getchar(); if (j==0&&num[j]=='\n') {j=-1;continue;} if (num[j]=='\n') {num[j]='\0';break;} } strcpy(p->num,num); cout<<"修改爲功!"<<endl; break; case 3: cout<<"請輸入修改後的航線:"; char line[30]; for(j=0;j<30;j++) { line[j]=getchar(); if (j==0&&line[j]=='\n') {j=-1;continue;} if (line[j]=='\n') {line[j]='\0';break;} } strcpy(p->line,line); cout<<"修改爲功!"<<endl; break; case 4: cout<<"請輸入修改後的日期:"; char date[20]; for (j=0;j<20;j++) { date[j]=getchar(); if (j==0&&date[j]=='\n') {j=-1;continue;} if (date[j]=='\n') {date[j]='\0';break;} } strcpy(p->date,date); cout<<"修改爲功!"<<endl; break; case 5: cout<<"請輸入修改後的票價:"; float price; cin>>price; p->price=price; cout<<"修改爲功!"<<endl; break; default: cout<<"輸入有誤!"<<endl;break; } cout<<"是否繼續修改該乘客信息?(0/1)"; cin>>flag; } } } void show_menu() { cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * * * * "<<endl; cout<<" 菜單: "<<endl; cout<<" (1).查看乘客訂票信息。 "<<endl; cout<<" (2).乘客訂票。 "<<endl; cout<<" (3).乘客退票。 "<<endl; cout<<" (4).修改乘客訂票信息。 "<<endl; cout<<" (5).退出系統! "<<endl; cout<<" * * * * * * * * * * * * * * * * * * * * * * * * * * * * "<<endl; cout<<"請選擇你要執行的操做(1--5):"; } void reading_mes(Node *head) { ifstream in("tickets.txt"); if (!in) {cout<<"打開文件失敗!"; exit(0);} Node *q; while(in) { Node *p=(Node *)malloc(sizeof(Node)); in>>p->name>>p->num>>p->line>>p->date>>p->price; p->next=NULL; q=head->next; head->next=p; p->next=q; } q=head->next; head->next=q->next; free(q); } void saving_mes(Node *head) { ofstream out("tickets.txt"); if (!out) {cout<<"打開文件失敗!"<<endl;exit(0);} Node *p=head->next; while(p) { out<<p->name<<" "<<p->num<<" "<<p->line<<" "<<p->date<<" "<<p->price<<endl; p=p->next; } }