大一的時課設,這是簡單的1.0版本,可供參考框架和思路。那時候喜歡用拼音做變量名函數名,介意的望海涵。
還不會上傳資源,完整代碼在最後。
功能全面升級的完整版我過幾天會整理上來。
實現功能:
具體實現:
1、頭文件、結構體和函數如下:
#include <iostream>
#include<cstring> //包含字符串函數處理頭文件
#include<process.h> //包含access函數的頭文件
#include<io.h>
#include<cstdlib>
#include<windows.h>
#include<conio.h>
#include<fstream>
#define N 9999 //定義最多的航班數
#define PRINT s[i].num<<"\t\t"<<s[i].start<<"\t\t"<<s[i].over<<"\t\t星期"<<s[i].time<<"\t\t"<<s[i].count<<endl //宏定義輸出格式
using namespace std;
struct air //定義航班信息結構體數組
{
int num; //定義航班號
char start[20]; //航班起始站
char over[20]; //終點站
char time[10]; //飛行時間
int count; //機票數量
}s[N];
int i,a,m=0; //定義全局變量
char ii[10];
void add(); //函數聲明增加航班信息函數
void print(); //顯示航班信息
bool search(); //查找航班信息
void dingpiao(); //訂票業務
void tuipiao(); //退票
void Read(); //讀取文件
void save(); //保存文件
void output(); //輸出格式
void paixu(); //航班排序
void chushihua(); //系統初始化
void build(); //建立數據文件
void paixu1(); //按航班號從小到大排序
void paixu2(); //從大到小
int head (); //進入訂票系統
要點:
宏定義輸出格式:可以讓代碼方便簡潔
結構體數組:保存多組信息
2、主函數
int main() //主函數
{
int j;
system("color b0"); //這裏可以調整顏色
chushihua(); //系統初始化判斷是否存在原始數據文件
system("cls");
head(); //打印出系統主界面
system("cls");
do
{
cout<<"================================================================================ ";
cout<<"\n\t\t\t\t1.增加航班信息\n\t\t"
"\t\t2.瀏覽航班信息\n\t\t"
"\t\t3.查找航班信息(按航班號)\n\t\t"
"\t\t4.航班排序(按航班號)\n\t\t"
"\t\t5.訂票業務\n\t\t"
"\t\t6.退票業務\n\t\t"
"\t\t0.退出\n";
cout<<"================================================================================ " ;
cout<<"\n請在0-6中選擇以回車鍵結束: " ;
cin>>j ;
switch(j)
{
case 1: add(); system("cls"); //調用增加航班函數
break;
case 2:print(); system("cls");//調用顯示模塊
break;
case 3:search();system("cls"); //調用查找模塊
break;
case 4:paixu(); system("cls"); //調用排序函數
break;
case 5:dingpiao();system("cls"); //調用訂票模塊
break;
case 6:tuipiao();system("cls"); //調用退票模塊
break;
case 0: //退出系統
save();system("cls");
cout<<"\n\n\n\t\t\t\t\n\n\t謝謝使用,再見! ";
cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n";
break;
}
}while(j!=0); //判斷是否調用其他函數
}
要點:
打印主界面,選擇後跳轉各個功能函數。
3、建立數據文件
用於保存航班信息
void build() //定義建立數據文件函數
{
FILE *fp; //定義文件指針
if((fp=fopen("hangban.dat","wb"))==NULL) //打開文件並判定是否出錯
{
cout<<"創建文件失敗! " ; //打印出錯提示
getchar();
return;
}
cout<<"請依次輸入航班信息(以回車鍵結束):\n" ; //打印提示信息
cout<<"-------------------------------------------------------------------------- \n" ;
for(i=0;i<N;i++)
{
cout<<"請輸入航班號: " ;
cin>>s[i].num ; //輸入航班號
cout<<"請輸入起始站: " ;
cin>>s[i].start ; //輸入起始站
cout<<"請輸入終點站: " ;
cin>>s[i].over ; //輸入終點站
cout<<"請輸入時間(星期幾 : " ;
cin>>s[i].time ; //輸入時間
cout<<"請輸入機票數: " ;
cin>>s[i].count ; //輸入機票數
fwrite(&s[i],sizeof(struct air),1,fp);
m++;
cout<<"添加完畢,是否繼續添加?請鍵入y或n以回車鍵結束:";
cin>>ii ;
if(strcmp(ii,"y")!=0) //判斷是否繼續添加航班信息
{
fclose(fp); //關閉文件
return;
}
}
}
要點:
定義文件指針,打開(或創建文件)
保存到結構體,循環用結構體寫文件fwrite(&s[i],sizeof(struct air),1,fp);
不再添加信息,則關閉文件。
4、退出前保存信息
使用系統後,更改數據到文件
void save() //定義保存函數
{
FILE *fp;
if((fp=fopen("hangban.dat","wb"))==NULL)
{
cout<<"創建文件失敗! ";
getchar();
return;
}
for(i=0;i<m;i++) //逐塊保存數據
fwrite(&s[i],sizeof(struct air),1,fp);
fclose(fp);
cout<<"正在保存數據並退出";
for(a=0;a<3;a++)
{
cout<<"." ;
Sleep(200);
}
cout<<"\n";
cout<<"\n" ;
}
要點:
定義文件指針。打開或創建文件。
逐個保存航班信息,寫文件。
5、讀取信息
void Read() //定義讀取文件函數
{
FILE *fp;
if((fp=fopen("hangban.dat","r"))==NULL)
{
cout<<"創建文件失敗! " ;
getchar();
return;
}
i=0;
while(!feof(fp))
{
fread(&s[i],sizeof(struct air),1,fp); //逐塊讀取數據
i++;
m++; //計算存在航班數
}
m--;
fclose(fp);
cout<<"請稍候,正在初始化" ;
for(a=0;a<3;a++)
{
cout<<"." ;
Sleep(200);
}
cout<<"\n";
}
要點:
定義文件指針,打開文件。
逐個結構體讀取,同時計數。
添加航班信息:
保存信息到結構體,指針後移即可。
訂票退票:
先查找到航班,修改結構體數組上的數據即可。
完整代碼如下:
#include <iostream>
#include<cstring> //包含字符串函數處理頭文件
#include<process.h> //包含access函數的頭文件
#include<io.h>
#include<cstdlib>
#include<windows.h>
#include<conio.h>
#include<fstream>
#define N 9999 //定義最多的航班數
#define PRINT s[i].num<<"\t\t"<<s[i].start<<"\t\t"<<s[i].over<<"\t\t星期"<<s[i].time<<"\t\t"<<s[i].count<<endl //宏定義輸出格式
using namespace std;
struct air //定義結構體數組
{
int num; //定義航班號
char start[20]; //航班起始站
char over[20]; //終點站
char time[10]; //飛行時間
int count; //機票數量
}s[N];
int i,a,m=0; //定義全局變量
char ii[10];
void add(); //函數聲明增加航班信息函數
void print(); //顯示航班信息
bool search(); //查找航班信息
void dingpiao(); //訂票業務
void tuipiao(); //退票
void Read(); //讀取文件
void save(); //保存文件
void output(); //輸出格式
void paixu(); //航班排序
void chushihua(); //系統初始化
void build(); //建立數據文件
void paixu1(); //按航班號從小到大排序
void paixu2(); //從大到小
int head (); //進入訂票系統
int main() //主函數
{
int j;
system("color b0");
chushihua(); //系統初始化判斷是否存在原始數據文件
system("cls");
head(); //打印出系統主界面
system("cls");
do
{
cout<<"================================================================================ ";
cout<<"\n\t\t\t\t1.增加航班信息\n\t\t"
"\t\t2.瀏覽航班信息\n\t\t"
"\t\t3.查找航班信息(按航班號)\n\t\t"
"\t\t4.航班排序(按航班號)\n\t\t"
"\t\t5.訂票業務\n\t\t"
"\t\t6.退票業務\n\t\t"
"\t\t0.退出\n";
cout<<"================================================================================ " ;
cout<<"\n請在0-6中選擇以回車鍵結束: " ;
cin>>j ;
switch(j)
{
case 1: add(); system("cls"); //調用增加航班函數
break;
case 2:print(); system("cls");//調用顯示模塊
break;
case 3:search();system("cls"); //調用查找模塊
break;
case 4:paixu(); system("cls"); //調用排序函數
break;
case 5:dingpiao();system("cls"); //調用訂票模塊
break;
case 6:tuipiao();system("cls"); //調用退票模塊
break;
case 0: //退出系統
save();system("cls");
cout<<"\n\n\n\t\t\t\t\n\n\t謝謝使用,再見! ";
cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n";
break;
}
}while(j!=0); //判斷是否調用其他函數
}
void chushihua() //定義系統初始化函數
{
if(access("hangban.dat",0))
{
build();
}
else
Read();
}
void build() //定義建立數據文件函數
{
FILE *fp; //定義文件指針
if((fp=fopen("hangban.dat","wb"))==NULL) //打開文件並判定是否出錯
{
cout<<"創建文件失敗! " ; //打印出錯提示
getchar();
return;
}
cout<<"請依次輸入航班信息(以回車鍵結束):\n" ; //打印提示信息
cout<<"-------------------------------------------------------------------------- \n" ;
for(i=0;i<N;i++)
{
cout<<"請輸入航班號: " ;
cin>>s[i].num ; //輸入航班號
cout<<"請輸入起始站: " ;
cin>>s[i].start ; //輸入起始站
cout<<"請輸入終點站: " ;
cin>>s[i].over ; //輸入終點站
cout<<"請輸入時間(星期幾 : " ;
cin>>s[i].time ; //輸入時間
cout<<"請輸入機票數: " ;
cin>>s[i].count ; //輸入機票數
fwrite(&s[i],sizeof(struct air),1,fp);
m++;
cout<<"添加完畢,是否繼續添加?請鍵入y或n以回車鍵結束:";
cin>>ii ;
if(strcmp(ii,"y")!=0) //判斷是否繼續添加航班信息
{
fclose(fp); //關閉文件
return;
}
}
}
void Read() //定義讀取文件函數
{
FILE *fp;
if((fp=fopen("hangban.dat","r"))==NULL)
{
cout<<"創建文件失敗! " ;
getchar();
return;
}
i=0;
while(!feof(fp))
{
fread(&s[i],sizeof(struct air),1,fp); //逐塊讀取數據
i++;
m++; //計算存在航班數
}
m--;
fclose(fp);
cout<<"請稍候,正在初始化" ;
for(a=0;a<3;a++)
{
cout<<"." ;
Sleep(200);
}
cout<<"\n";
}
void save() //定義保存函數
{
FILE *fp;
if((fp=fopen("hangban.dat","wb"))==NULL)
{
cout<<"創建文件失敗! ";
getchar();
return;
}
for(i=0;i<m;i++) //逐塊保存數據
fwrite(&s[i],sizeof(struct air),1,fp);
fclose(fp);
cout<<"正在保存數據並退出";
for(a=0;a<3;a++)
{
cout<<"." ;
Sleep(200);
}
cout<<"\n";
cout<<"\n" ;
}
void add() //定義增加航班信息函數
{
do{
cout<<"請依次輸入您要增加的航班信息(以回車鍵結束): \n" ; //打印提示信息
cout<<"-------------------------------------------------------------------------- \n" ;
cout<<"請輸入航班號: " ;
cin>>s[m].num ; //讀取航班號
cout<<"請輸入起始站: " ;
cin>>s[m].start ; //讀取起始站
cout<<"請輸入終點站: " ;
cin>>s[m].over ; //讀取終點站
cout<<"請輸入時間(星期幾): " ;
cin>>s[m].time ; //讀取時間
cout<<"請輸入機票數: " ;
cin>>s[m].count ; //讀取機票數
m++;
cout<<"添加完畢,是否繼續添加?請鍵入y或n以回車鍵結束:" ;
cin>>ii ;
}while(!strcmp(ii,"y")); //判斷是否繼續添加
cout<<"正在保存,請稍候" ;
for(a=0;a<5;a++)
{
cout<<"." ;
Sleep(600);
}
cout<<"\n" ;
}
void output() //定義輸出格式函數
{
cout<<"航班號\t\t起始站\t\t終點站\t\t時間\t\t機票數\n" ; //信息標題
for(i=0;i<m;i++)
cout<<PRINT;//打印出信息
}
void print() //定義顯示航班信息函數
{
cout<<"正在加載,請稍候" ;
for(a=0;a<5;a++)
{
cout<<"." ;
Sleep(400);
}
cout<<"\n" ;
system("cls");
cout<<"\n目前我們有如下航班:\n\n" ;
output(); //調用輸出格式函數
cout<<"\n請按回車鍵返回上層菜單 " ;
getchar();
getchar();
}
bool search() //定義查詢函數
{
int n;
do
{
cout<<"\n請輸入航班號: " ;
cin>>n; //輸入查詢的航班號
cout<<"正在查詢" ;
for(a=0;a<5;a++)
{
cout<<"." ;
Sleep(400);
}
cout<<"\n" ;
for(i=0;i<m;i++)
{
if(s[i].num==n) //按航班號判定輸出條件
{
cout<<"\n您所查找的航班信息爲:\n " ;
cout<<"航班號\t\t起始站\t\t終點站\t\t時間\t\t機票數 \n\n" ;
cout<<PRINT ; //顯示信息
cout<<"\n查詢完畢,按回車鍵繼續" ;
getchar();
getchar();
return true;
}
}
cout<<"\n對不起,沒有您需要的信息!\n " ;
cout<<"是否重新查找?請鍵入y或n以回車鍵結束 " ;
cin>>ii ;
}while(!strcmp(ii,"y"));//判定是否重新查找
}
void dingpiao() //定義訂票業務函數
{
int n,x;
char a[10]="y";
do
{
if(!search())
{
cout<<"對不起!沒有找到您所需要的航班,所以不能訂票。\n" ; //未查找到所需航班
cout<<"\n請按回車鍵返回上層菜單 " ;
getchar();
getchar();
strcpy(ii,"n");
break;
}
do
{
cout<<"請輸入您要訂的機票數(以回車鍵結束): " ;
cin>>n ; //輸入所訂機票數
cout<<"請稍候,正在訂票" ;
for(x=0;x<3;x++)
{
cout<<"." ;
Sleep(600);
}
cout<<"\n" ;
if(n<=0) //判定機票數是否出錯
{
cout<<"輸入錯誤!至少需訂1張機票。\n" ;
}
else if(s[i].count==0)//判定機票是否售完
{
cout<<"對不起,你所選擇的航班的機票已售完!\n" ;
break;
}
else if(s[i].count!=0&&s[i].count>=n) //判定機票數是否大於等於訂票數
{
s[i].count=s[i].count-n;
cout<<"訂票成功! " ;
break;
}
else if(s[i].count<n)//判定機票數是否小於訂票數
{
cout<<"對不起,你所選擇的航班只剩"<<s[i].count<<"張機票\n";
cout<<"是否需要重新輸入機票數?\n請輸入y或n以回車鍵結束: " ;//判定是否重新輸入訂票數
cin>>a ;
cout<<"請稍候,正在訂票" ;
for(x=0;x<3;x++)
{
cout<<"." ;
Sleep(600);
}
cout<<"\n" ;
}
}while(!strcmp(a,"y"));
cout<<"是否需要訂其他航班的機票?\n請輸入y或n以回車鍵結束: " ;
cin>>a ;
}while(!strcmp(a,"y" )) ; //判定是否繼續訂票
}
void tuipiao() //定義退票函數
{
int n,x;
char a[10];
do
{
if(!search())
{
cout<<"對不起!沒有找到您所需要的航班,所以不能退票。\n";
cout<<"\n請按回車鍵返回上層菜單 " ;
getchar();
getchar();
strcpy(ii,"n");
break;
}
cout<<"請輸入您要退的機票數目: " ;
cin>>n ; //輸入所退票數
cout<<"請稍候,正在退票" ;
for(x=0;x<3;x++)
{
cout<<"." ;
Sleep(600);
}
cout<<"\n" ;
if(n<=0) //判定票數是否有效
cout<<"輸入錯誤!至少需退1張機票。 " ;
else
{
s[i].count=s[i].count+n;
cout<<"退票成功! " ;
}
cout<<"是否繼續? 請鍵入y或n以回車鍵結束: " ; //判定是否繼續退票
cin>>a ;
}while(!strcmp(a,"y")); //判定並跳出循環
}
void paixu() //定義排序函數
{
int n;
cout<<"\n******************************************************************************** " ;
cout<<"\n\t\t1.按航班號從小到大排序\t\t\n"
"\t\t2.按航班號從大到小排序\t\t\n" ;
cout<<"******************************************************************************** " ;
cout<<"請在1-2中選擇以回車鍵結束: " ;
cin>>n ; //輸入排序方式
switch(n)
{
case 1:paixu1();//調用從小到大排序函數
break;
case 2:paixu2();//調用從大到小排序函數
break;
}
cout<<"排序後的航班信息爲:\n" ;
output(); //顯示排序後航班信息
cout<<"\n請按回車鍵返回上層菜單 " ;
getchar();
getchar();
/*for(a=0;a<5;a++)
{
cout<<"." ;
Sleep(400);
}
cout<<"\n" ;*/
}
void paixu1() //定義從小到大排序函數
{
int k,j;
struct air t;
for(i=0;i<m;i++) //選擇排序
{
k=i;
for(j=i+1;j<m;j++)
if(s[k].num>s[j].num)
k=j;
if(i!=k)
{
t=s[k];
s[k]=s[i];
s[i]=t;
}
}
cout<<"正在排序,請稍後" ;
for(a=0;a<5;a++)
{
cout<<"." ;
Sleep(400);
}
cout<<"\n" ;
}
void paixu2() //定義從大到小排序函數
{
int k,j;
struct air t;
for(i=0;i<m;i++)
{
k=i;
for(j=i+1;j<m;j++)
if(s[k].num<s[j].num)
k=j;
if(i!=k)
{
t=s[k];
s[k]=s[i];
s[i]=t;
}
}
cout<<"正在排序,請稍後" ;
for(a=0;a<5;a++)
{
cout<<"." ;
Sleep(400);
}
cout<<"\n" ;
}
int head () //進入訂票系統
{
cout<<"=================================================================\n" ;
cout<<"* *\n" ;
cout<<"* 歡迎使用機票訂票管理系統 *\n" ;
cout<<"* *\n" ;
cout<<"* *\n" ;
cout<<"=================================================================\n" ;
cout<<"請按回車鍵進入界面" ;
getchar();
cout<<"正在進入系統選項" ;
for(a=0;a<3;a++)
{
cout<<"." ;
Sleep(600);
}
cout<<"\n" ;
return 0;
}