这是这学期基础强化训练的课设题目,要求写一个简单的航空订票管理系统,前面两个课设我大都是网上找的资料来应付任务,这次终于狠下心来自己写,花了大概有两天多的时间吧,代码300多行,也不算多,系统很简单,但第一次这么认真的自己完成任务,心里当然还是很得意,而且自己写代码,自己调试,收获也很不小,我也都把这些经验记下来,这些东西慢慢积累起来,肯定能让我收获不小。
(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()还存在缺陷,退票和修改订票信息我都是通过姓名来查找定位的,如果存在两个同名人订票或一个人定了两张不同的票,使用这两个函数的时候就有可能得不到你想要的结果,修改起来我略嫌麻烦,哪位高人有兴趣改进的话,不胜感激!
下面是代码:
#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; } }