亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

基于C語言實現簡單的12306火車售票系統

2020-01-26 14:26:06
字體:
來源:轉載
供稿:網友

程序設計要求用C語言寫一個簡單的火車售票系統,主要實現的功能為:

錄入班次信息

瀏覽班次信息

按班次號查詢

按終點站查詢

按余票數量排序保存

售票

退票

更新班次信息

退出系統

所有的班次信息保存在number.dat文件中,排序過后的保存在sort.dat中(.dat是一種二進制文件)。

在編寫的過程中我覺得在判斷火車的狀態比較值得深究。這里假設火車主要有四種狀態:

1.未發車

2.已發車

3.停止檢票

4.停止退票

在程序中,思路是將代表發車時間的字符串轉化為整型,再和系統現在的時間進行大小比較,主要采用if判斷各種情況。其中atime代表的是發車時間的整型數,btime代表的是系統時間的整型數,具體實現如下:

if(atime<=btime) //已經發車return 1;if(((atime-btime<=30)&&(atime-btime>5)&&(atime/100==btime/100))||(((atime%100+(60-btime%100))<=30)&&(atime%100+(60-btime%100))>5&&(atime/100-btime/100==1))) //距發車半小時以內,停止退票,%表示取余return 2;if(((atime-btime<=5)&&(atime/100==btime/100))||((atime%100+(60-btime%100)&&(atime/100-btime/100==1))<=5)) //距發車前五分鐘內停止檢票return 3;return 0; //可以辦理購退票

在判斷退票時如果兩個時間的小時數是一樣的,則它們的分鐘數如果相差在30之內即半小時之內或者發車時間的小時和系統時間的小時相差一個1,并且發車時間的分鐘數小于30,系統時間的分鐘大于30,則它們之間也就相差在30之內,此時代表停止退票。

判斷檢票和上面思想大致相同。

為了參考研究,貼上代碼:

#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>#include "time.h"http://班次信息表#define SIZELIMIT 10 //每班次的具體信息的字符個數限制在10以內#define MAXNUM 1000 //設定最多只能錄入1000個車次信息typedef struct cardbase //定義一個關于班次信息的結構體,取名為CardBase{char C_ID[SIZELIMIT];//班次char C_TIME[SIZELIMIT];//發車時間char C_ANAME[SIZELIMIT];//起點站char C_BNAME[SIZELIMIT];//終點站char C_USETIME[SIZELIMIT];//行車時間char C_MAXNUM[SIZELIMIT];//額定載量char C_REMAINNUM[SIZELIMIT];//余票數量}CardBase;int cbNum=0;//記錄班次數CardBase cBList[MAXNUM];//班次列表//讀取班次信息void readcardbasefile(){FILE *fp;//打開文件失敗則創建文件if((fp=fopen("./number.dat","r"))==NULL){//初次運行創建文件if ((fp=fopen("./number.dat","w"))==NULL){exit(0); //返回}else{fclose(fp);}return ;}/*文件位置指針移動到文件末尾*/fseek(fp,0,2);//重定位文件內部位置指針/* int fseek( FILE *stream, long offset, int origin );第一個參數stream為文件指針第二個參數offset為偏移量,正數表示正向偏移,負數表示負向偏移第三個參數origin設定從文件的哪里開始偏移,可能取值為:SEEK_CUR、 SEEK_END 或 SEEK_SETSEEK_SET: 文件開頭SEEK_CUR: 當前位置SEEK_END: 文件結尾其中SEEK_SET,SEEK_CUR和SEEK_END依次為0,1和2.簡言之:fseek(fp,100L,0);把stream指針移動到離文件開頭100字節處;fseek(fp,100L,1);把stream指針移動到離文件當前位置100字節處;fseek(fp,-100L,2);把stream指針退回到離文件結尾100字節處。 */if (ftell(fp)>0)//文件不為空/*ftell函數用于得到文件位置指針當前位置相對于文件首的偏移字節數也就是得到文件所包含的字節數,如果大于0,則代表文件非空*/{//文件位置指針移動到文件開始rewind(fp);char buff[10]={0};for (cbNum=0;!feof(fp) && fread(&cBList[cbNum],sizeof(CardBase),1,fp);cbNum++)/*對于feof函數,如果遇到文件結束,函數feof(fp)的值為非零值,否則為0。即如果文件結束,!feof(fp)為0,跳出循環對于fread函數,是從一個文件流中讀數據,如果調用成功返回實際讀取到的項個數,如果不成功或讀到文件末尾返回 0*/fgets(buff,10,fp);/*char *fgets(char *buf, int bufsize, FILE *stream);從文件結構體指針stream中讀取數據,每次讀取一行。讀取的數據保存在buf指向的字符數組中,每次最多讀取bufsize-1個字符(第bufsize個字符賦'/0'),如果文件中的該行,不足bufsize個字符,則讀完該行就結束。如若該行(包括最后一個換行符)的字符數超過bufsize-1,則fgets只返回一個不完整的行,但是,緩沖區總是以NULL字符結尾,對fgets的下一次調用會繼續讀該行。函數成功將返回buf,失敗或讀到文件結尾返回NULL。因此我們不能直接通過fgets的返回值來判斷函數是否是出錯而終止的,應該借助feof函數或者ferror函數來判斷。*/fclose(fp);}else{fclose(fp);}return;}//保存班次信息void writecardbasefile(){int i;FILE *fp;if ((fp=fopen("./number.dat","w"))==NULL){printf("系統錯誤");}char buff[10]={0};strcpy(buff,"/r/n");for (i=0;i<cbNum;i++){if (fwrite(&cBList[i],sizeof(CardBase),1,fp)!=1){printf("系統錯誤");}if (fwrite(buff,2,1,fp)!=1){printf("系統錯誤");}}fclose(fp);}//保存排序信息void writesortfile(){int i;FILE *fp;if ((fp=fopen("./sort.dat","w"))==NULL){printf("系統錯誤");}char buff[10]={0};strcpy(buff,"/r/n");for (i=0;i<cbNum;i++){if (fwrite(&cBList[i],sizeof(CardBase),1,fp)!=1){printf("系統錯誤");}if (fwrite(buff,2,1,fp)!=1){printf("系統錯誤");}}fclose(fp);}//打印并輸入后返回void printReturn(char *info){printf("/n/n/t %s",info);fflush(stdin);//清空輸入緩沖區,通常是為了確保不影響后面的數據讀取.getchar();}//輸入信息void setInfo(char pinfo[1024],char desinfo[]){printf("/n/t%s:",pinfo);fflush(stdin);scanf("%s",desinfo);}//系統初始化void initsystem(){readcardbasefile();};//錄入班次void infoinput(){setInfo("班次",cBList[cbNum].C_ID);setInfo("發車時間(24小時制)",cBList[cbNum].C_TIME);setInfo("起點站",cBList[cbNum].C_ANAME);setInfo("終點站",cBList[cbNum].C_BNAME);setInfo("行車時間",cBList[cbNum].C_USETIME);setInfo("額定載量",cBList[cbNum].C_MAXNUM);setInfo("余票數量",cBList[cbNum].C_REMAINNUM);cbNum++;writecardbasefile();printReturn("/n/t錄入成功,回車鍵返回");};//時間比較int timecmp(char A[10]){//將火車時間轉成整數char tempa[10]={0};int ta=0;int i;for(i=0;i<strlen(A);i++)if(A[i]!=':'&&A[i]!=':') //冒號的中文輸入和英文輸入{tempa[ta]=A[i];ta++;}int atime=atoi(tempa);//把字符串變成整型//獲取系統時間char tempb[10]={0};time_t t = time(0);strftime( tempb, 10, "%H%M",localtime(&t) );int btime=atoi(tempb);//比較if(atime<=btime) //已經發車return 1;if(((atime-btime<=30)&&(atime-btime>5)&&(atime/100==btime/100))||(((atime%100+(60-btime%100))<=30)&&(atime%100+(60-btime%100))>5&&(atime/100-btime/100==1))) //距發車半小時以內,停止退票,%表示取余return 2;if(((atime-btime<=5)&&(atime/100==btime/100))||((atime%100+(60-btime%100)&&(atime/100-btime/100==1))<=5)) //距發車前五分鐘內停止檢票return 3;return 0; //可以辦理購退票}//瀏覽所有班次void queryallinfo(){printf("班次信息/n");printf("班次 發車時間 起點站 終點站 行車時間 額定載量 余票數量 狀態/n");int i;for(i=0;i<cbNum;i++){char temp[20]={0};strcpy(temp,"未發車");if(1==timecmp(cBList[i].C_TIME))strcpy(temp,"已發車");if(2==timecmp(cBList[i].C_TIME))strcpy(temp,"停止退票");if(3==timecmp(cBList[i].C_TIME))strcpy(temp,"停止檢票");printf("%-010s%-010s%-010s%-010s%-010s%-010s%-010s%s/n",cBList[i].C_ID,cBList[i].C_TIME,cBList[i].C_ANAME,cBList[i].C_BNAME,cBList[i].C_USETIME,cBList[i].C_MAXNUM,cBList[i].C_REMAINNUM,temp );}printReturn("/n/t回車鍵返回");};//通過班次號查路線void queryinfobyID(){char ID[20]={0};setInfo("輸入班次號",ID);int i;for( i=0;i<cbNum;i++){if(strcmp(cBList[i].C_ID,ID)==0){printf("班次信息/n");printf("班次 發車時間 起點站 終點站 行車時間 額定載量 余票數量/n");printf("%-010s%-010s%-010s%-010s%-010s%-010s%-010s/n",cBList[i].C_ID,cBList[i].C_TIME,cBList[i].C_ANAME,cBList[i].C_BNAME,cBList[i].C_USETIME,cBList[i].C_MAXNUM,cBList[i].C_REMAINNUM );printReturn("/n/t回車鍵返回");return;}}printReturn("/n/t指定信息不存在,回車鍵返回");};//通過終點站查路線void queryinfobyBNAME(){char Name[20]={0};setInfo("輸入終點站",Name);int i;for(i=0;i<cbNum;i++){if(strcmp(cBList[i].C_BNAME,Name)==0){printf("班次信息/n");printf("班次 發車時間 起點站 終點站 行車時間 額定載量 余票數量/n");printf("%-010s%-010s%-010s%-010s%-010s%-010s%-010s/n",cBList[i].C_ID,cBList[i].C_TIME,cBList[i].C_ANAME,cBList[i].C_BNAME,cBList[i].C_USETIME,cBList[i].C_MAXNUM,cBList[i].C_REMAINNUM );printReturn("/n/t回車鍵返回");return;}}printReturn("/n/t指定信息不存在,回車鍵返回");};//排序按余票數量排序保存void sortSave(){//冒泡排序int i,j;for(i=0;i<cbNum;i++)for(j=0;j<cbNum-i-1;j++){if(atoi(cBList[j].C_REMAINNUM)<atoi(cBList[j+1].C_REMAINNUM)){CardBase temp=cBList[j];cBList[j]=cBList[j+1];cBList[j+1]=temp;}}//打印排序結果queryallinfo();//保存排序結果writesortfile();};//售票void sale(){char ID[20]={0};setInfo("輸入班次號",ID);int i;for(i=0;i<cbNum;i++){if(strcmp(cBList[i].C_ID,ID)==0){if(cBList[i].C_REMAINNUM==0){printReturn("/n/t余票不足,回車返回");return;}//余票減少int temp=atoi(cBList[i].C_REMAINNUM)-1;if(temp<0) temp=0;//確保余票不為負數_itoa(temp,cBList[i].C_REMAINNUM,10);//保存到文件writecardbasefile();printf("班次信息/n");printf("班次 發車時間 起點站 終點站 行車時間 額定載量 余票數量/n");printf("%-010s%-010s%-010s%-010s%-010s%-010s%-010s/n",cBList[i].C_ID,cBList[i].C_TIME,cBList[i].C_ANAME,cBList[i].C_BNAME,cBList[i].C_USETIME,cBList[i].C_MAXNUM,cBList[i].C_REMAINNUM );printReturn("/n/t售票成功,回車返回");return;}}printReturn("/n/t指定班次不存在,回車鍵返回");};//退票void back(){char ID[20]={0};setInfo("輸入班次號",ID);int i;for(i=0;i<cbNum;i++){if(strcmp(cBList[i].C_ID,ID)==0){//余票增加int temp=atoi(cBList[i].C_REMAINNUM)+1;_itoa(temp,cBList[i].C_REMAINNUM,10);//保存到文件writecardbasefile();printf("班次信息/n");printf("班次 發車時間 起點站 終點站 行車時間 額定載量 余票數量/n");printf("%-010s%-010s%-010s%-010s%-010s%-010s%-010s/n",cBList[i].C_ID,cBList[i].C_TIME,cBList[i].C_ANAME,cBList[i].C_BNAME,cBList[i].C_USETIME,cBList[i].C_MAXNUM,cBList[i].C_REMAINNUM );printReturn("/n/t/t退票成功,回車返回");return;}}printReturn("/n/t指定班次不存在,回車鍵返回");};//更新車次信息void update(){int flag;char ID[20]={0};setInfo("請輸入要刪除或修改的車次(請確認車次輸入正確)",ID);do{printf("/n/t按下列提示更新車次信息(退出修改請按0):");printf("/n/t1:刪除車次;2:修改發車時間;3:修改起點站;4:修改終點站;");printf("/n/t5:修改行車時間;6:修改額定載量;7:修改余票數量;0:退出修改;");printf("/n/t請選擇:");scanf("%d",&flag);int i;CardBase temp;for(i=0;i<cbNum;i++){if(strcmp(cBList[i].C_ID,ID)==0){if(flag==1) //刪除車次信息{int j;for(j=i;j<cbNum;j++)cBList[j]=cBList[j+1];//后面的數據覆蓋前面的數據cbNum--;//車次數減一//保存到文件writecardbasefile();}if(flag==2) //修改發車時間{setInfo("請輸入新的發車時間",cBList[i].C_TIME);temp=cBList[i];//保存到文件writecardbasefile();}if(flag==3) //修改起點站{setInfo("請輸入新的起點站",cBList[i].C_ANAME);temp=cBList[i];//保存到文件writecardbasefile();}if(flag==4) //修改終點站{setInfo("請輸入新的終點站",cBList[i].C_BNAME);temp=cBList[i];//保存到文件writecardbasefile();}if(flag==5) //修改行車時間{setInfo("請輸入新的行車時間",cBList[i].C_USETIME);temp=cBList[i];//保存到文件writecardbasefile();}if(flag==6) //修改額定載量{setInfo("請輸入新的額定載量",cBList[i].C_MAXNUM);temp=cBList[i];//保存到文件writecardbasefile();}if(flag==7) //修改余票數量{setInfo("請輸入新的余票數量",cBList[i].C_REMAINNUM);temp=cBList[i];//保存到文件writecardbasefile();}}}//更改完成后顯示更新后的班次信息,如果是刪除車次則不顯示,即flag不等于0的時候顯示更新信息if(flag!=1&&flag!=0){ printf("更新后的班次信息/n");printf("班次 發車時間 起點站 終點站 行車時間 額定載量 余票數量/n");printf("%-010s%-010s%-010s%-010s%-010s%-010s%-010s/n",temp.C_ID,temp.C_TIME,temp.C_ANAME,temp.C_BNAME,temp.C_USETIME,temp.C_MAXNUM,temp.C_REMAINNUM );}}while(flag);printReturn("/n/t完成車次信息更新,回車鍵返回");};void mainmenu(){while(1){char select;do{system("cls");//清屏printf("/n/t 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

91在线高清视频| 亚洲欧美成人网| 欧美精品免费播放| 91精品国产高清| 欧美成人四级hd版| 操91在线视频| 成人黄色中文字幕| xxxxx91麻豆| 一区二区三区视频免费在线观看| 欧美激情亚洲综合一区| 午夜精品一区二区三区在线视频| 中文国产成人精品| 日韩中文综合网| 亚洲欧洲日产国产网站| 亚洲第一福利网站| 国产成人精品a视频一区www| 91产国在线观看动作片喷水| 亚洲一区二区久久| 欧美国产日韩一区| 日本亚洲欧洲色| 日韩av大片免费看| 91免费在线视频| 国产精品久久久久aaaa九色| 黑人与娇小精品av专区| 国产精品视频一| 久久在线精品视频| 国产精品电影网| 欧美做爰性生交视频| 伊人伊成久久人综合网小说| 中文字幕久热精品视频在线| 久久伊人色综合| 亚洲精品按摩视频| 国产欧美精品一区二区三区介绍| 伦理中文字幕亚洲| 欧美精品激情在线观看| 中文字幕精品视频| 国语自产精品视频在免费| 久久久中精品2020中文| 日本成人激情视频| 91精品国产91| 2021久久精品国产99国产精品| 亚洲欧美三级在线| 亚洲第一福利网站| 久久天天躁狠狠躁老女人| 日韩有码视频在线| 亚洲国语精品自产拍在线观看| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品入口夜色视频大尺度| 国产日韩在线播放| 亚洲欧美日韩国产中文| 一区二区在线视频| 亚洲在线视频观看| 精品人伦一区二区三区蜜桃网站| 亚洲视频精品在线| 久久久久久综合网天天| 日韩欧美国产视频| 国产一区二区久久精品| 高清日韩电视剧大全免费播放在线观看| 欧美激情免费观看| 国产精品福利片| 久久精品99久久香蕉国产色戒| 青青a在线精品免费观看| 精品国产欧美一区二区五十路| 不用播放器成人网| 国产精品无码专区在线观看| 欧美电影电视剧在线观看| 国产精品欧美日韩久久| 亚洲精品少妇网址| 国产在线播放91| 91精品国产色综合久久不卡98| 国产精品69精品一区二区三区| 亚洲福利视频免费观看| 日韩麻豆第一页| 亚洲视频自拍偷拍| 久久久久久香蕉网| 午夜精品久久久99热福利| 国产精品丝袜高跟| 亚洲一区美女视频在线观看免费| 国产精品国产福利国产秒拍| 久久亚洲国产成人| 97超视频免费观看| 久久手机免费视频| 久久人人看视频| 亚洲精品国产精品国自产观看浪潮| 奇米四色中文综合久久| 精品少妇一区二区30p| 精品成人久久av| 国产午夜精品美女视频明星a级| 97精品一区二区三区| 欧美日韩福利在线观看| 国产精品老女人精品视频| 伊人久久久久久久久久久| 色多多国产成人永久免费网站| 日韩欧中文字幕| 国产精品亚洲欧美导航| 最新亚洲国产精品| 精品动漫一区二区三区| 4p变态网欧美系列| 久久中文精品视频| 亚洲精品suv精品一区二区| 久久久久久亚洲精品不卡| 国色天香2019中文字幕在线观看| 久久国产精品久久国产精品| 日日骚久久av| 亚洲精品电影网站| 亚洲专区在线视频| 国产在线不卡精品| 国内精品久久久久久久| 日韩av一区二区在线| 国产国语videosex另类| 91在线视频九色| 国产欧美日韩中文字幕| 久久午夜a级毛片| 亚洲人成在线电影| 亚洲国产精品久久91精品| 久久久国产精彩视频美女艺术照福利| 久久久久久久久久久免费精品| 色妞在线综合亚洲欧美| 国产精品自产拍在线观看中文| 亚洲男人天堂2024| 国产精品视频26uuu| 国产精品美女主播在线观看纯欲| 久久久精品欧美| 一本一本久久a久久精品综合小说| 中文欧美日本在线资源| 日韩av电影国产| 成人国产精品久久久久久亚洲| 一本大道香蕉久在线播放29| 91久热免费在线视频| 国产精品吊钟奶在线| 日韩中文字幕在线视频| 精品欧美国产一区二区三区| 亚洲国产精品久久久久| 色狠狠久久aa北条麻妃| 日韩午夜在线视频| 久久精品国产清自在天天线| 亚洲天堂视频在线观看| 国产成人免费av电影| 中文字幕9999| www亚洲精品| 欧美激情一区二区三区久久久| 97成人精品区在线播放| 91精品国产自产在线观看永久| 欧美麻豆久久久久久中文| 热re91久久精品国99热蜜臀| 国产精品ⅴa在线观看h| 久热在线中文字幕色999舞| 国产亚洲欧美日韩美女| 久久全球大尺度高清视频| 中文字幕日韩有码| 欧美丰满片xxx777| 亚洲视频在线观看网站| 国产亚洲精品一区二区| 日韩成人高清在线| 国产在线98福利播放视频| 亚洲丝袜在线视频| 国产日韩在线看| 亚洲成人网在线观看| 日韩精品视频在线播放| 日韩国产欧美精品一区二区三区| www.色综合| 久久精品国产成人| 午夜免费在线观看精品视频| 国产成人精品电影|