航空訂票乘客管理系統

     這是這學期基礎強化訓練的課設題目,要求寫一個簡單的航空訂票管理系統,前面兩個課設我大都是網上找的資料來應付任務,此次終於狠下心來本身寫,花了大概有兩天多的時間吧,代碼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;
   }
}
相關文章
相關標籤/搜索