航空订票乘客管理系统

     这是这学期基础强化训练的课设题目,要求写一个简单的航空订票管理系统,前面两个课设我大都是网上找的资料来应付任务,这次终于狠下心来自己写,花了大概有两天多的时间吧,代码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;
   }
}

你可能感兴趣的:(航空订票管理系统)