專用主機(jī)網(wǎng)站建設(shè)企業(yè)郵箱域名
需求描述:
火車票訂票系統(tǒng)以用戶預(yù)定火車票的一系列流程為主線,將火車票車次詳細(xì)信息進(jìn)行顯示、保存,同時提供火車的剩余票數(shù),以供用戶查詢決定是否預(yù)訂,當(dāng)預(yù)訂成功后,提供保存用戶的訂票信息的功能。由于訂票系統(tǒng)面向的人群主要分為兩類:管理員和普通用戶。他們對于該購票系統(tǒng)的需求不同,使用方法也不同,由此應(yīng)該分成兩個對象分別設(shè)計不同界面和用途該系統(tǒng)詳細(xì)周到的操作流程滿足了用戶的需求,也提高了鐵路工作人員的工作效率。
火車售票系統(tǒng)介紹:該系統(tǒng)分為管理員和用戶兩個角色:
管理員的功能包含:?
1、錄入火車票信息? ? ? ? ? ? ? ? ? ? ? ? ? ?
?2、顯示火車票信息? ? ? ? ? ? ? ? ? ? ? ? ? ?
?3、查詢火車票信息? ? ? ? ? ? ? ? ? ? ? ? ? ?
?4、修改火車票信息
用戶(顧客)的功能包含:
1、火車票區(qū)間查詢
2、查詢已購票信息
該C語言程序主要用到了以下數(shù)據(jù)結(jié)構(gòu)的知識點:
-
結(jié)構(gòu)體(struct):
- 用于定義火車票信息的結(jié)構(gòu)體?
train_infor
,簡稱?train
。 - 結(jié)構(gòu)體包括火車車次、始發(fā)地、終點站、發(fā)車時間、到達(dá)時間、票價等信息。
- 用于定義火車票信息的結(jié)構(gòu)體?
-
數(shù)組:
- 使用一維數(shù)組?
train info[10000]
?保存所有的車次信息。 - 使用二維數(shù)組?
train users[100][100]
?保存每個用戶的購票信息。
- 使用一維數(shù)組?
-
字符串:
- 結(jié)構(gòu)體中包含字符數(shù)組(如?
number
,?start
,?end
)用于存儲車次、始發(fā)地、終點站。 - 使用?
strcmp
?函數(shù)進(jìn)行字符串比較,用于查詢和修改車次信息。
- 結(jié)構(gòu)體中包含字符數(shù)組(如?
-
多維數(shù)組:
train users[100][100]
?是一個二維數(shù)組,用于記錄用戶的購票信息,其中?users[no]
?表示用戶?no
?的購票記錄,users[no][vcs[no]]
?用于表示用戶?no
?的第?vcs[no]
?張車票。
-
循環(huán)結(jié)構(gòu):
- 使用?
for
?循環(huán)錄入、顯示和查詢車次信息。 - 使用?
while
?循環(huán)處理用戶和管理員的選擇輸入,確??梢远啻芜M(jìn)行操作。
- 使用?
-
條件結(jié)構(gòu):
- 使用?
if-else
?判斷條件,確保操作的正確性,例如判斷是否有車次信息、用戶是否有購票記錄等。 - 使用?
switch-case
?處理菜單選擇,便于管理不同操作。
- 使用?
-
函數(shù):
- 該程序定義了多個函數(shù)來實現(xiàn)不同功能,如錄入火車票信息 (
Traininfo
)、顯示火車票信息 (showtrain
)、查詢火車票信息 (searchtrain
)、修改火車票信息 (Modify
)、購票 (bookticket
)、區(qū)間查詢 (look_up
)、保存用戶購票信息 (SaveTraininfo
)、管理員界面 (admin
)、用戶界面 (user
) 。
- 該程序定義了多個函數(shù)來實現(xiàn)不同功能,如錄入火車票信息 (
運(yùn)行效果截圖:
管理員登錄后錄入車票信息:
管理員查詢已添加的車票信息:
管理員單次查詢車次:
管理員修改車次信息(中間都用英文狀態(tài)下的空格):
用戶登錄查詢或?qū)崿F(xiàn)訂票:
用戶端查詢車票:
用戶端購票:
課設(shè) 源代碼訪問地址https://docs.qq.com/doc/p/71239d69a76f56cf1521717ae6b22c27cf876f10
結(jié)構(gòu)體定義:
//火車票信息模塊 (以結(jié)構(gòu)體實現(xiàn))typedef struct train_infor
{char number[10];//火車車次char start[20];//始發(fā)地char end[20];//終點站int year1,month1,day1,h1,m1;//始發(fā)時間int year2,month2,day2,h2,m2;//到站時間int price;//票價
}train;int cnum=0;//記錄總共列車信息的數(shù)量
train info[10000];//以結(jié)構(gòu)體類型的數(shù)組用來保存所有的車次信息;
train users[100][100];//二維數(shù)組用來保存用戶信息,每一行可以用來表示一個用戶的購票信息
int vcs[100]={0};//記錄每一個用戶自己賬戶的票數(shù),初始為0
?主函數(shù):
int main()
{printf("提示:整個輸入過程請嚴(yán)格按照格式,標(biāo)點均為英文狀態(tài)下輸入!\n");printf("-------------請選擇身份-------------\n");printf("| 1、管 理 員 | 2、用 戶 |\n");printf("| 0、結(jié)束程序 |\n");printf("------------------------------------\n");//輸入1表示進(jìn)入管理員界面,2進(jìn)入用戶界面int choose1;while(~scanf("%d",&choose1))//記錄選擇的序號,多組測試{if(choose1==0)break;switch (choose1){case 1:admin();break;case 2:user();break;default :printf("請選擇有效操作對應(yīng)編號哦!\n");break;}printf("-------------請選擇身份-------------\n");printf("| 1、管 理 員 | 2、用 戶 |\n");printf("| 0、結(jié)束程序 |\n");printf("------------------------------------\n");}return 0;
}
用戶函數(shù):
//用戶界面
void user()
{int no;printf("請輸入你的用戶編碼:");scanf("%d",&no);//記錄用戶編碼用來對應(yīng)的保存其購票信息user_menu();int choose3;while(~scanf("%d",&choose3))//記錄用戶選擇的操作;{switch(choose3){case 1:look_up(no);break;case 2:SaveTraininfo(no);break;case 0:return ;//輸入0直接退出整個函數(shù)default :printf("請選擇有效操作對應(yīng)編號哦!\n");break ;}
?錄入火車票信息:
//錄入火車票信息(即添加模塊)
void Traininfo()
{int sum,i;printf("請輸入要錄入的列車信息條數(shù):");scanf("%d",&sum);printf("請依次輸入火車車次 始發(fā)地 終點站 始發(fā)時間(年/月/日 時:分) 到站時間(年/月/日 時:分) 票價 ;\n");printf("每輸入一項數(shù)據(jù)后以空格結(jié)束,進(jìn)行下一數(shù)據(jù)錄入\n");for(i=cnum;i<cnum+sum;i++)/*錄入信息從cnum開始錄入信息,避免管理員先進(jìn)行插入或添加、刪除等操作后再來錄入數(shù)據(jù),發(fā)生覆蓋;同時這樣可以多次循環(huán)進(jìn)行錄入操作(在之前的信息下繼續(xù)添加)*/ {scanf("%s %s %s %d/%d/%d %d:%d %d/%d/%d %d:%d %d",info[i].number,info[i].start,info[i].end,&info[i].year1,&info[i].month1,&info[i].day1,&info[i].h1,&info[i].m1,&info[i].year2,&info[i].month2,&info[i].day2,&info[i].h2,&info[i].m2,&info[i].price);} printf("錄入成功!\n");cnum+=sum;return ;
}
修改火車票信息:?
//修改火車票信息
void Modify()
{int i;printf("請輸入要修改的車次:");char ch[10];//記錄要修改的車次scanf("%s",ch);//和查詢車票一樣先找到該列車所在的位置,然后對其進(jìn)行修改for(i=0;i<cnum;i++){if(strcmp(ch,info[i].number)==0)//比較所有的列車信息一直到和輸入的車次相同則找到并輸出,字符串的比較要是用strcmp()函數(shù);如果相等則為0{printf("該列車原信息:\n");printf("車次\t始發(fā)地\t終點站\t發(fā)車時間\t\t到達(dá)時間\t\t票價\n");printf("%s\t%s\t%s\t%d/%02d/%02d %02d:%02d\t%d/%02d/%02d %02d:%02d\t%d\n",info[i].number,info[i].start,info[i].end,info[i].year1,info[i].month1,info[i].day1,info[i].h1,info[i].m1,info[i].year2,info[i].month2,info[i].day2,info[i].h2,info[i].m2,info[i].price);printf("請輸入新的數(shù)據(jù):\n");printf("車次\t始發(fā)地\t終點站\t發(fā)車時間\t\t到達(dá)時間\t\t票價\n");scanf("%s %s %s %d/%d/%d %d:%d %d/%d/%d %d:%d %d",info[i].number,info[i].start,info[i].end,&info[i].year1,&info[i].month1,&info[i].day1,&info[i].h1,&info[i].m1,&info[i].year2,&info[i].month2,&info[i].day2,&info[i].h2,&info[i].m2,&info[i].price);printf("修改成功!\n");return ;//修改后直接結(jié)束無需再進(jìn)行}}printf("無此列車信息!\n");//如果找到前面就結(jié)束則不會運(yùn)行到此處;所以運(yùn)行到此處只能是沒有找到;return ;
}
用戶訂票函數(shù):
//用戶訂票模塊
void bookticket(int no)
{int i;printf("請輸入你要購票的車次:\n");char che[10];scanf("%s",che);for(i=0;i<cnum;i++){if(strcmp(che,info[i].number)==0){users[no][vcs[no]]=info[i];vcs[no]++;//該用戶的購票數(shù)加一;printf("購票成功!\n");return ;}}printf("無此列車信息!\n");return ;