您好,登錄后才能下訂單哦!
/*
系統名稱:火車訂票系統
1、插入一個火車信息
2、搜索火車信息
3、預定火車信息
4、修改火車信息
5、顯示火車信息
6、保存火車信息
結構組成
1、火車信息結構體
2、訂票人信息結構體
3、火車信息鏈表節點結構體
4、訂票人的鏈表節點結構體
操作流程:
進入主界面 -》 選擇菜單 -》選擇基本操作 -》顯示結果 -》保存信息 -》退出
*/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int saveflag = 0; //定義是否保存是否文件改變(全局變量) (1、表示未保存 0、表示已保存)
#define HEADER1 "---------------------------------火車訂票系統-----------------------------\n"
#define HEADER2 "| 編號 | 起始城市 | 抵達城市 | 起始時間 | 到達時間 |票的價格 | 車票數量|\n"
#define HEADER3 "--------------------------------------------------------------------------\n"
#define FORMAT "%- 10s%- 10s%- 10s%- 10s%- 10s %5d %5d\n"
#define DATA q->data.num,q->data.startcity,q->data.reachcity,q->data.takeofftime,q->data.receivetime,q->data.price,q->data.ticketnum
/*定義存儲火車信息的結構體*/
struct train{
char num[10]; //列車號
char startcity[10]; //出發城市
char reachcity[10]; //目的城市
char takeofftime[10]; //發車時間
char receivetime[10]; //到達時間
int price; //票價
int ticketnum; //票數量
};
/*訂票人的信息*/
struct man{
char num[20]; //×××號碼
char name[10]; //姓名
int bookNum; //訂票的數
};
/*定義火車鏈表的節點結構*/
typedef struct node{
struct train data;
struct node *next;
}Node,*Link;
/*定義訂票人鏈表的節點結構域*/
typedef struct Man{
struct man data;
struct Man *next;
}book,*bookLink;
/*初始化界面*/
void menu()
{
puts("\n\n");
puts("\t\t|----------------------------------------------------------|");
puts("\t\t| 火車訂票系統 |");
puts("\t\t|----------------------------------------------------------|");
puts("\t\t| 0:退出系統 |");
puts("\t\t| 1:插入一個火車信息 |");
puts("\t\t| 2:搜索火車信息 |");
puts("\t\t| 3:預定火車票 |");
puts("\t\t| 4:修改火車信息 |");
puts("\t\t| 5:顯示火車信息 |");
puts("\t\t| 6:保存信息到文件 |");
puts("\t\t|----------------------------------------------------------|");
}
//添加一個火車信息
void Trianinfo(Link linkhead)
{
struct node *p,*r,*s;
char num[10];
r = linkhead; //鏈表的頭指針不能移動(在以后的查詢中無法找到頭指針)
s = linkhead->next; //鏈表頭指針后面一個節點才開始有火車信息數據
while(r->next != NULL) //找到鏈表尾部
r = r->next;
while(1)
{
printf("請輸入火車的編號(0-無窮大)");
scanf("%s",num);
if(strcmp(num,"0") == 0)
break;
/*判斷是否存在*/
while(s /* s != NULL */)
{
if(strcmp(s->data.num , num) == 0){
printf("編號為%s的火車已存在!!\n",num);
return ;
}
s = s->next;
}
p = (struct node*)malloc(sizeof(struct node));
strcpy(p->data.num,num); //將編號存放到節點里面
printf("請輸入火車開始城市 :");
scanf("%s",p->data.startcity);//輸入出發城市
printf("請輸入火車目的城市 :");
scanf("%s",p->data.reachcity);//輸入目的城市
printf("請輸入火車出發時間 :");
scanf("%s",p->data.takeofftime);//輸入出發時間
printf("請輸入火車到達時間 :");
scanf("%s",p->data.receivetime);//輸入到達時間
printf("請輸入票價:");
scanf("%d",&p->data.price);//輸入票價
printf("請輸入票數:");
scanf("%d",&p->data.ticketnum);//輸入票數
p->next = NULL;
r->next = p; //插入到鏈表
r = p;
saveflag = 1;
}
}
//打印火車頭信息
void printheader()
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}
/*格式化輸出表中的數據*/
void printdata(Node *p)
{
Node* q ;
q = p;
printf(FORMAT,DATA);
}
/*顯示火車票信息*/
void showtrain(Link l)
{
Node *p;
p = l->next;//鏈表頭指針后面一個節點才開始有火車信息數據
printheader(); //打印頭部信息
if(l->next == NULL) //是否為空鏈表
printf("是空鏈表");
else
while(p != NULL)
{
printdata(p);
p = p->next;
}
}
/*查詢火車信息*/
void searchtrian(Link l)
{
Node *s[10],*r; //*s[10]用來存儲尋找到的對象
int sel,k,i = 0; //sel表示選擇查詢方式
char str1[10],str2[10];//str1用來輸入火車編號 ,str2用來輸入城市名稱
if(!l->next){
printf("沒有任何記錄");
return;
}
printf("選擇方式:\n 1:根據火車編號; \n 2:根據城市:\n");
scanf("%d",&sel);//輸入選擇的序號
if(sel == 1)//根據火車編號來查詢
{
printf("輸入火車編號:");
scanf("%s",str1);
r = l->next; //鏈表是從第二個元素開始才有數據
while(r != NULL)
{
if(strcmp(r->data.num,str1) == 0)//檢索是否有與輸入的編號相匹配
{
s[i] = r; //把已經找到的節點存放到定義好的結構體指針數組
i++;
r = r->next;//繼續往表的后面尋找
}else
r = r->next;//繼續往表的后面尋找
}
if( i == 0)
printf("找不到相對應的編號的火車");
}
else if(sel == 2)//根據城市來查詢
{
printf("輸入想要去的城市:");
scanf("%s",str2);
r = l->next; //鏈表是從第二個元素開始才有數據
while(r != NULL)
{
if(strcmp(r->data.reachcity,str2) == 0)//檢索是否有與輸入的編號相匹配
{
s[i] = r; //把已經找到的節點存放到定義好的結構體指針數組
i++;
r = r->next;//繼續往表的后面尋找
}else
r = r->next;//繼續往表的后面尋找
}
if( i == 0)
printf("找不到相對應的城市的火車");
}
printheader();
for(k = 0 ; k < i ; k++)
printdata(s[k]);
}
/*修改火車信息*/
void Modify(Link l)
{
Node *p ; //p節點從第二個節點開始(因為第二個節點才有數據)
char tnum[10],ch;//ch判斷是否修改 tnum[10]火車編號的輸入
p = l->next;
if(!p/* p != NULL */)
{
printf("你沒有記錄可以修改");
return;
}
else
{
printf("\n你想修改它么??(y/n)\n");
scanf("%c",&ch);
if(ch == 'y'|| ch == 'Y')//字符的比較
{
printf("\n輸入火車編號:");
scanf("%s",tnum);
while(p != NULL)
{
if(strcmp(p->data.num,tnum) == 0)//查找與輸入的編號相匹配的記錄
break; //如果已經找到 我們的p肯定不為NULL
else
p = p->next;
}
if(p)//如果找到的p不為空
{
printf("輸入火車的起始城市:");
scanf("%s",p->data.startcity);
printf("輸入火車的目的城市:");
scanf("%s",p->data.reachcity);
printf("輸入火車的起始時間:");
scanf("%s",p->data.takeofftime);
printf("輸入火車的抵達時間:");
scanf("%s",p->data.receivetime);
printf("輸入火車的票的價格:");
scanf("%d",&p->data.price);
printf("輸入火車的票的數量:");
scanf("%d",&p->data.ticketnum);
saveflag = 1;//數據發生改變需要保存
}
else/*沒有找到跳到此地*/
printf("沒有找到該編號的火車");
}
}
}
/*訂票模塊*/
void Bookticket(Link l,bookLink k)//l是火車鏈表 k是人員鏈表
{
Node *r[10],*p;//r存放滿足條件的火車信息
/*str表示輸入想去城市、ch判斷是否訂票*,tnum 表示火車車次*/
char ch[2],tnum[10],str[10],str1[10],str2[10];
book *q,*h;
int i = 0, t = 0,flag = 0,dnum;//i 記錄滿足條件的火車信息的數量,t 進行循環打印火車信息 flag 標志有票 dnum 買票的數量
q = k;//將人員鏈表的表頭賦值給q
while(q->next != NULL)
q = q->next; //遍歷人員鏈表(添加訂票人信息,從鏈表尾部添加)
printf("輸入你想去的城市: ");
scanf("%s",str);
p = l->next;//鏈表的第二節點才有數據
while( p != NULL)//遍歷火車信息鏈表
{
if(strcmp(p->data.reachcity,str) == 0)//如果找到你想去的城市
{
r[i] = p;//將滿足條件的記錄存到數組r中
i++;
}
p = p->next;
}
printf("\n\n記錄的數量%d\n",i);
printheader();
for(t = 0 ; t < i ; t++)
printdata(r[t]);
if(i == 0)//如果沒有找到你想去的城市
printf("沒有你所要找的車次");
else//如果找到就訂票
{
printf("\n你想要訂票么?<y/n>\n");
scanf("%s",ch);
if(strcmp(ch,"Y")== 0 || strcmp(ch,"y")==0)//進行字符串的比較
{
printf("請輸入需要的火車車次:");
scanf("%s",tnum);
for(t = 0; t < i ; t ++)
{
if(strcmp(r[t]->data.num,tnum) == 0)
{
if(r[t]->data.ticketnum < 1)//判斷剩余的供票數量是否為0
{
printf("對不起,沒有票");
return;
}
printf("剩余%d張票\n",r[t]->data.ticketnum);
flag = 1;//標志有票
break;
}
}
if(flag == 1){
h = (book*)malloc(sizeof(book));//增加人員鏈表節點
printf("輸入你的名字: ");
scanf("%s",str1);
printf("輸入你的×××:");
scanf("%s",str2);
printf("輸入你要的買的數量:");
scanf("%d",&dnum);/*買票的數量*/
if(dnum > r[t]->data.ticketnum){
printf("你所需要的票數過多,無法購買!!!");
return;
}
r[t]->data.ticketnum = r[t]->data.ticketnum-dnum;//定票成功則票數相應減少
/*對人員信息表添加節點,q= h 表示在尾部添加*/
h->data.bookNum = dnum;
strcpy(h->data.name,str1);
strcpy(h->data.num,str2);
h->next = NULL;
q->next = h;
q = h;
printf("\n恭喜購票成功!!!\n");
saveflag = 1;
}
else{
printf("輸入有誤");
return;
}
}
}
}
void SaveTrainInfo(Link l)
{
FILE *fp;//申明一個文件指針
Node *p;//申明一個火車的節點
int count = 0 , flag = 1;
fp = fopen("g:/train.txt","wb");
if(fp == NULL)
{
printf("無法打開該文件");
return ;
}
p = l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp) == 1){//每次寫入一個結構進去
p = p->next;
count++;
}else
{
flag = 0;
break;
}
}
if(flag){//如果寫入成功
printf("保存%d列火車記錄\n",count);
saveflag = 0;
}else{
printf("保存文件失敗");
}
fclose(fp);
}
/*保存訂票人的信息*/
void SaveBookInfo(bookLink k)
{
FILE *fp;//申明一個文件指針
book *p;//申明一個火車的節點
int count = 0 , flag = 1;
fp = fopen("g:/man.txt","wb");
if(fp == NULL)
{
printf("無法打開該文件");
return ;
}
p = k->next;
while(p)
{
if(fwrite(p,sizeof(book),1,fp) == 1){//每次寫入一個結構進去
p = p->next;
count++;
}else
{
flag = 0;
break;
}
}
if(flag){//如果寫入成功
printf("保存%d列人員記錄\n",count);
saveflag = 0;
}else{
printf("保存文件失敗");
}
fclose(fp);
}
int main(){
FILE *fp1,*fp2;//fp1文件指針對應火車信息,fp2文件指針對應人員信息
Node *p,*r; //表示火車信息節點 p用來表示讀文件的節點
char ch2,ch3;
Link l; //表示火車信息的鏈表 l指的是鏈表的首位
bookLink k; //這里表示人員的鏈表
book *t,*h; //表示人員的節點
int sel; //選擇菜單變量
l = (Node*)malloc(sizeof(Node));
l->next = NULL; //它下一個節點指向NULL
r = l; //利用r來做一個循環表示
k = (book*)malloc(sizeof(book));
k->next = NULL; //它下一個節點指向NULL
h = k;
/*火車基本信息的讀取*/
fp1 = fopen("g:/train.txt","ab+"); //打開存儲火車信息的文件(如果沒有該文件就寫一個)
if(fp1 == NULL){
printf("無法打開該文件");
return 0;
}
while(!feof(fp1)){ //feof()函數表示讀文件到了文件的結尾( EOF表示文件的結尾)
p = (Node*)malloc(sizeof(Node));
if(fread(p,sizeof(Node),1,fp1) == 1)/*從指定磁盤文件讀取記錄*/
{
p->next = NULL; //因為p為節點,p后面現在還有指向,給它初始化
r->next = p; //構建鏈表
r = p;
}
}
fclose(fp1);
/*人員基本操作的讀取*/
fp2 = fopen("g:/man.txt","ab+");
if(fp2 == NULL){
printf("無法讀取人員基本操作文件");
return 0;
}
while(!feof(fp2)){
t = (book*)malloc(sizeof(book));
if(fread(t,sizeof(book),1,fp2) == 1){
t->next = NULL;
h->next = t;
h = t;
}
}
fclose(fp2);
while(1){
menu();
printf("\t請選擇(0~6):");
scanf("%d",&sel);
system("cls");
if(sel == 0)
{
if(saveflag == 1)//表示未保存
{
getchar();
printf("\n該文件已更改!你想保存它么(y/n)?\n");
scanf("%c",&ch2);
if(ch2 == 'y' || ch2 == 'Y'){
/*保存
1、火車信息文件
2、人員操作文件
*/
SaveTrainInfo( l);
SaveBookInfo(k);
}
}
printf("\n謝謝使用 下次光臨\n");
break;
}
switch(sel)/*根據與輸入的sel值不同選擇相對應的操作*/
{
case 1:
Trianinfo(l);/*插入火車信息*/
break;
case 2:
searchtrian(l);/*搜索火車信息*/
break;
case 3:
Bookticket(l,k);/*預定火車票 */
break;
case 4:
Modify(l);/*修改火車信息*/
break;
case 5:
showtrain(l);/*顯示火車信息*/
break;
case 6:
/*保存
1、火車信息文件
2、人員操作文件
*/
SaveTrainInfo(l);
SaveBookInfo(k);
break;
case 0:
return 0;
}
printf("\n請按任意鍵繼續...");
}
system("pause");
return 0;
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。