基於C說話完成簡略的12306火車售票體系。本站提示廣大學習愛好者:(基於C說話完成簡略的12306火車售票體系)文章只能為提供參考,不一定能成為您想要的結果。以下是基於C說話完成簡略的12306火車售票體系正文
法式設計請求用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" //班次信息表 #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_SET SEEK_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 ╭═════════■□■□═══╮"); printf("\n\t│ 火車班次體系 │"); printf("\n\t╰═══■□■□══════════╯"); printf("\n\t ┌────────────────┐"); printf("\n\t │1.錄入班次 │"); printf("\n\t │2.閱讀一切班次 │"); printf("\n\t │3.經由過程班次號查道路 │"); printf("\n\t │4.經由過程起點站查道路 │"); printf("\n\t │5.排序保留 │"); printf("\n\t │6.售票 │"); printf("\n\t │7.退票 │"); printf("\n\t │8.更新車次信息 │"); printf("\n\t │0.加入登錄 │"); printf("\n\t └────────────────┘"); printf("\n\t 請選擇:"); fflush(stdin);//清空輸出緩沖區,平日是為了確保不影響前面的數據讀取. select=getchar();//期待用戶輸出數據 }while (select<'0'||select>'8'); switch(select) { case '0':exit(0);break; case '1':infoinput();break; case '2':queryallinfo();break; case '3':queryinfobyID();break; case '4':queryinfobyBNAME();break; case '5':sortSave();break; case '6':sale();break; case '7':back();break; case '8':update();break; } } } //主函數 int main() { initsystem(); //體系初始化 while(1) { mainmenu(); } }
法式中確定還存在許多成績,本身對換用體系函數方面還有許多須要進修,文件的操作也不是很闇練,迎接年夜家一路商量交換。