首頁 > 軟體

C語言實現火車訂票系統

2022-08-05 18:01:32

本文範例為大家分享了C語言實現火車訂票系統的具體程式碼,供大家參考,具體內容如下

程式介紹

1.執行程式時,首先進入到選單部分,選單部分提供了選單顯示和輸入功能部分。其執行效果如圖所示。在主介面上輸入數位0——6,實現相應的功能。

2.主介面輸入“1”,進入新增火車資訊介面,如圖所示。根據螢幕上給出的提示輸入火車的車次,起點,終點,出發時間,到達時間,票價和可以訂購的票數。

3.主介面輸入“2”,可以查詢火車資訊,可以選擇查詢的方法有兩種,一種是按照車次查詢,一種是按照你想要到達的地方查詢,執行效果如圖所示。

4.當在主介面輸入“3”時,進入訂票介面,按照提示輸入你想要到達的城市,會自動顯示出你終點站為你輸入城市的資訊,根據提示輸入你是否決定訂票以及你的個人資訊,執行效果如圖所示。

5.當在主介面輸入“4”時,進入修改介面,根據提示輸入你要修改的內容,修改模組的執行效果如圖所示。

6.當在主介面輸入“5”時,可以顯示出所有的火車資訊,顯示模組效果如圖所示。

7.當在主介面輸入“6”時,進入到儲存模組,將錄入的火車資訊進行儲存,並且將訂票人的資訊也進行儲存,儲存在指定的磁碟檔案中。執行效果如圖所示。

程式碼

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#define HEADER1 " -------------------------------BOOK TICKET----------------------------------n"
#define HEADER2 " |  number  |start city|reach city|takeofftime|receivetime|price|ticketnumber|n"
#define HEADER3 " |----------|----------|----------|-----------|-----------|-----|------------|n"
#define FORMAT  " |%-10s|%-10s|%-10s|%-10s |%-10s |%5d|  %5d     |n"
#define DATA p->data.num,p->data.startcity,p->data.reachcity,p->data.takeofftime,p->data.receivetime,p->data.price,p->data.ticketnum
int saveflag=0 ;
/*定義儲存火車資訊的結構體*/
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[10];/*ID*/
    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("nn");
    puts("tt|------------------------------------------------------|");
    puts("tt|                   Booking Tickets                    |");
    puts("tt|------------------------------------------------------|");
    puts("tt|       0:quit the system                              |");
    puts("tt|       1:Insert a train information                   |");
    puts("tt|       2:Search a train information                   |");
    puts("tt|       3:Book a train ticket                          |");
    puts("tt|       4:Modify the train information                 |");
    puts("tt|       5:Show the train information                   |");
    puts("tt|       6:save information to file                     |");
    puts("tt|------------------------------------------------------|");
}
/*新增一個火車資訊*/
void Traininfo(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("please input the number of the train(0-return)");
        scanf("%s",num);
        if(strcmp(num,"0")==0)
          break ;
        /*判斷是否已經存在*/
        while(s)
        {
            if(strcmp(s->data.num,num)==0)
            {
                printf("the train '%s'is existing!n",num);
                return ;
            }
            s = s->next ;
        }
        p = (struct node*)malloc(sizeof(struct node));
        strcpy(p->data.num,num);/*輸入車號*/
     printf("Input the city where the train will start:");
        scanf("%s",p->data.startcity);/*輸入出發城市*/
        printf("Input the city where the train will reach:");
        scanf("%s",p->data.reachcity);/*輸入到站城市*/
        printf("Input the time which the train take off:");
    scanf("%s",p->data.takeofftime);/*輸入出發時間*/
        printf("Input the time which the train receive:");
    scanf("%s",&p->data.receivetime);/*輸入到站時間*/
        printf("Input the price of ticket:");
        scanf("%d",&p->data.price);/*輸入火車票價*/
        printf("Input the number of booked tickets:");
    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 *q) /*格式化輸出表中資料*/
{
Node* p;
p=q;
printf(FORMAT,DATA);
}

/*查詢火車資訊*/
void searchtrain(Link l)

{
    Node *s[10],*r;
    int sel,k,i=0 ;
    char str1[5],str2[10];
    if(!l->next)
    {
        printf("There is not any record !");
        return ;
    }
    printf("Choose the way:n1:according to the number of train;n2:according to the city:n");
    scanf("%d",&sel);/*輸入選擇的序號*/
    if(sel==1)
    {
        printf("Input the the number of train:");
        scanf("%s",str1);
        r=l->next;
    while(r!=NULL)
        if(strcmp(r->data.num,str1)==0)/*檢索是否有與輸入的車號相匹配的*/
        {
            s[i]=r;
        i++;
        break;
        }
        else 
            r=r->next;
    }
    else if(sel==2)
    {
        printf("Input the city  you want to go:");
        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("can not find!");
    else
    {
        printheader();
    for(k=0;k<i;k++)
printdata(s[k]);
    }
}

/*訂票子模組*/
void Bookticket(Link l,bookLink k)
{
    Node *r[10],*p ;
    char ch[2],tnum[10],str[10],str1[10],str2[10];
    book *q,*h ;
    int i=0,t=0,flag=0,dnum;
    q=k ;
    while(q->next!=NULL)
    q=q->next ;
    printf("Input the city you want to go: ");
    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("nnthe number of record have %dn",i);
       printheader();
    for(t=0;t<i;t++)
        printdata(r[t]);
    if(i==0)
    printf("nSorry!Can't find the train for you!n");
    else
    {
        printf("ndo you want to book it?<y/n>n");
        scanf("%s",ch);
    if(strcmp(ch,"Y")==0||strcmp(ch,"y")==0)/*判斷是否訂票*/
        {
        h=(book*)malloc(sizeof(book));
            printf("Input your name: ");
            scanf("%s",&str1);
            strcpy(h->data.name,str1);
            printf("Input your id: ");
            scanf("%s",&str2);
            strcpy(h->data.num,str2);
        printf("please input the number of the train:");
        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("sorry,no ticket!");
               sleep(2);
               return;
           }
          printf("remain %d ticketsn",r[t]->data.ticketnum);
               flag=1;
           break;
        }
        if(flag==0)
        {
            printf("input error");
           sleep(2);
                    return;
        }
        printf("Input your bookNum: ");
            scanf("%d",&dnum);
            r[t]->data.ticketnum=r[t]->data.ticketnum-dnum;/*定票成功則可供訂的票數相應減少*/
        h->data.bookNum=dnum ;
            h->next=NULL ;
        q->next=h ;
        q=h ;
            printf("nLucky!you have booked a ticket!");
            getch();
            saveflag=1 ;
        }
    }
}
/*修改火車資訊*/
void Modify(Link l)
{
    Node *p ;
    char tnum[10],ch ;
    p=l->next;
    if(!p)
    {
        printf("nthere isn't record for you to modify!n");
        return ;
    }
    else
    {
        printf("nDo you want to modify it?(y/n)n");
            getchar();
            scanf("%c",&ch);
            if(ch=='y'||ch=='Y')
            {
                printf("nInput the number of the train:");
        scanf("%s",tnum);
    while(p!=NULL)
    if(strcmp(p->data.num,tnum)==0)/*查詢與輸入的車號相匹配的記錄*/
        break;
        else
            p=p->next;
                if(p)
                {
                    printf("Input new number of train:");
                    scanf("%s",&p->data.num);
            printf("Input new city the train will start:");
                    scanf("%s",&p->data.startcity);
                    printf("Input new city the train will reach:");
                    scanf("%s",&p->data.reachcity);
                    printf("Input new time the train take off");
            scanf("%s",&p->data.takeofftime);
                    printf("Input new time the train reach:");
            scanf("%s",&p->data.receivetime);
                    printf("Input new price of the ticket::");
                    scanf("%d",&p->data.price);
                    printf("Input new number of people who have booked ticket:");
                    scanf("%d",&p->data.ticketnum);
                    printf("nmodifying record is sucessful!n");
                    saveflag=1 ;
                }
                else
                printf("tcan't find the record!");
            }
    }
}
void showtrain(Link l)/*自定義函數顯示列車資訊*/
{
Node *p;
p=l->next;
printheader();
if(l->next==NULL)
printf("no records!");
else
 while(p!=NULL)
{
    printdata(p);
    p=p->next;
}
}
/*儲存火車資訊*/
void SaveTrainInfo(Link l)
{
    FILE*fp ;
    Node*p ;
    int count=0,flag=1 ;
    fp=fopen("f:\train.txt","wb");
    if(fp==NULL)
    {
        printf("the file can't be opened!");
        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(" saved %d train recordsn",count);
        saveflag=0 ;
    }
    fclose(fp);
}
/*儲存訂票人的資訊*/
void SaveBookInfo(bookLink k)
{
    FILE*fp ;
    book *p ;
    int count=0,flag=1 ;
    fp=fopen("f:\man.txt","wb");
    if(fp==NULL)
    {
        printf("the file can't be opened!");
        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(" saved %d booking recordsn",count);
        saveflag=0 ;
    }
    fclose(fp);
}

main()
{
    FILE*fp1,*fp2 ;
    Node *p,*r ;
    char ch1,ch2 ;
    Link l ;
    bookLink k ;
    book *t,*h ;
    int sel ;
    l=(Node*)malloc(sizeof(Node));
    l->next=NULL ;
    r=l ;
    k=(book*)malloc(sizeof(book));
    k->next=NULL ;
    h=k ;
    fp1=fopen("f:\train.txt","ab+");/*開啟儲存車票資訊的檔案*/
    if((fp1==NULL))
    {
        printf("can't open the file!");
        return 0 ;
    }
    while(!feof(fp1))
    {
        p=(Node*)malloc(sizeof(Node));
        if(fread(p,sizeof(Node),1,fp1)==1)/*從指定磁碟檔案讀取記錄*/
        {
            p->next=NULL ;
            r->next=p ;/*構造連結串列*/
            r=p ;
        }
    }
    fclose(fp1);
    fp2=fopen("f:\man.txt","ab+");
    if((fp2==NULL))
    {
        printf("can't open the file!");
        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)
    {
        system("CLS");
        menu();
        printf("tplease choose (0~6):  ");
        scanf("%d",&sel);
        system("CLS"); 
        if(sel==0)
        {
        if(saveflag==1)/*當退出時判斷資訊是否儲存*/
            {
                getchar();
                printf("nthe file have been changed!do you want to save it(y/n)?n");
                scanf("%c",&ch1);
                if(ch1=='y'||ch1=='Y')
                {
            SaveBookInfo(k);
                    SaveTrainInfo(l);
                }
            }
            printf("nThank you!!You are welcome toon");
            break ;

        }
        switch(sel)/*根據輸入的sel值不同選擇相應操作*/
        {
            case 1 :
              Traininfo(l);break ;
            case 2 :
              searchtrain(l);break ;
            case 3 :
              Bookticket(l,k);break ;
            case 4 :
              Modify(l);break ;
        case 5:
            showtrain(l);break;
            case 6 :
          SaveTrainInfo(l);SaveBookInfo(k);break ;
            case 0:
            return 0;
        }
        printf("nplease press any key to continue.......");
        getch();
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com