程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 基於C說話完成簡略的12306火車售票體系

基於C說話完成簡略的12306火車售票體系

編輯:關於C++

基於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();
}
}

法式中確定還存在許多成績,本身對換用體系函數方面還有許多須要進修,文件的操作也不是很闇練,迎接年夜家一路商量交換。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved