溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

火車訂票系統(tǒng)源碼筆記c++

發(fā)布時間:2020-07-14 19:12:44 來源:網(wǎng)絡(luò) 閱讀:3865 作者:知止內(nèi)明 欄目:編程語言
/*
系統(tǒng)名稱:火車訂票系統(tǒng)
1、插入一個火車信息
2、搜索火車信息
3、預(yù)定火車信息
4、修改火車信息
5、顯示火車信息
6、保存火車信息

結(jié)構(gòu)組成
1、火車信息結(jié)構(gòu)體
2、訂票人信息結(jié)構(gòu)體
3、火車信息鏈表節(jié)點(diǎn)結(jié)構(gòu)體
4、訂票人的鏈表節(jié)點(diǎn)結(jié)構(gòu)體

操作流程:
    進(jìn)入主界面 -》 選擇菜單 -》選擇基本操作 -》顯示結(jié)果 -》保存信息 -》退出 
*/

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int saveflag = 0;       //定義是否保存是否文件改變(全局變量) (1、表示未保存 0、表示已保存)

#define  HEADER1 "---------------------------------火車訂票系統(tǒng)-----------------------------\n"
#define  HEADER2 "| 編號  | 起始城市  | 抵達(dá)城市 | 起始時間 | 到達(dá)時間 |票的價格 | 車票數(shù)量|\n"
#define  HEADER3 "--------------------------------------------------------------------------\n"

#define  FORMAT  "%- 10s%- 10s%- 10s%- 10s%- 10s %5d  %5d\n"
#define  DATA    q->data.num,q->data.startcity,q->data.reachcity,q->data.takeofftime,q->data.receivetime,q->data.price,q->data.ticketnum

/*定義存儲火車信息的結(jié)構(gòu)體*/
struct train{
    char num[10];   //列車號
    char startcity[10]; //出發(fā)城市
    char reachcity[10]; //目的城市
    char takeofftime[10];   //發(fā)車時間
    char receivetime[10];   //到達(dá)時間
    int price;  //票價
    int ticketnum;  //票數(shù)量
};

/*訂票人的信息*/
struct man{
    char num[20];   //×××號碼
    char name[10];  //姓名
    int bookNum;    //訂票的數(shù)
};

/*定義火車鏈表的節(jié)點(diǎn)結(jié)構(gòu)*/
typedef struct node{
    struct train data;
    struct node *next;
}Node,*Link;

/*定義訂票人鏈表的節(jié)點(diǎn)結(jié)構(gòu)域*/
typedef struct Man{
    struct man data;
    struct Man *next;
}book,*bookLink;

/*初始化界面*/
void menu()
{
    puts("\n\n");
    puts("\t\t|----------------------------------------------------------|");
    puts("\t\t|                     火車訂票系統(tǒng)                         |");
    puts("\t\t|----------------------------------------------------------|");
    puts("\t\t|         0:退出系統(tǒng)                                       |");
    puts("\t\t|         1:插入一個火車信息                               |");
    puts("\t\t|         2:搜索火車信息                                   |");
    puts("\t\t|         3:預(yù)定火車票                                   |");
    puts("\t\t|         4:修改火車信息                                   |");
    puts("\t\t|         5:顯示火車信息                                   |");
    puts("\t\t|         6:保存信息到文件                                 |");
    puts("\t\t|----------------------------------------------------------|");
}
//添加一個火車信息
void Trianinfo(Link linkhead)
{
    struct node *p,*r,*s;
    char num[10];
    r = linkhead;   //鏈表的頭指針不能移動(在以后的查詢中無法找到頭指針)
    s = linkhead->next; //鏈表頭指針后面一個節(jié)點(diǎn)才開始有火車信息數(shù)據(jù)
    while(r->next != NULL) //找到鏈表尾部
        r = r->next;
    while(1)
    {
        printf("請輸入火車的編號(0-無窮大)");
        scanf("%s",num);
        if(strcmp(num,"0") == 0)
            break;
        /*判斷是否存在*/
        while(s /* s != NULL */)
        {
            if(strcmp(s->data.num , num) == 0){
                printf("編號為%s的火車已存在!!\n",num);
                return ;
            }
            s = s->next;
        }
        p = (struct node*)malloc(sizeof(struct node));
        strcpy(p->data.num,num);    //將編號存放到節(jié)點(diǎn)里面
        printf("請輸入火車開始城市 :");  
        scanf("%s",p->data.startcity);//輸入出發(fā)城市
        printf("請輸入火車目的城市 :");  
        scanf("%s",p->data.reachcity);//輸入目的城市
        printf("請輸入火車出發(fā)時間 :");  
        scanf("%s",p->data.takeofftime);//輸入出發(fā)時間
        printf("請輸入火車到達(dá)時間 :");  
        scanf("%s",p->data.receivetime);//輸入到達(dá)時間
        printf("請輸入票價:");
        scanf("%d",&p->data.price);//輸入票價
        printf("請輸入票數(shù):");
        scanf("%d",&p->data.ticketnum);//輸入票數(shù)
        p->next = NULL;
        r->next = p;    //插入到鏈表
        r = p;
        saveflag = 1;
    }
}

//打印火車頭信息
void printheader()
{
    printf(HEADER1);
    printf(HEADER2);
    printf(HEADER3);

}

/*格式化輸出表中的數(shù)據(jù)*/
void printdata(Node *p)
{
    Node* q ;
    q = p;
    printf(FORMAT,DATA);
}

/*顯示火車票信息*/
void showtrain(Link l)
{
    Node *p;
    p = l->next;//鏈表頭指針后面一個節(jié)點(diǎn)才開始有火車信息數(shù)據(jù)
    printheader();  //打印頭部信息
    if(l->next == NULL)     //是否為空鏈表
        printf("是空鏈表");
    else
        while(p != NULL)
        {
            printdata(p);
            p = p->next;
        }
}

/*查詢火車信息*/
void searchtrian(Link l)
{
    Node *s[10],*r; //*s[10]用來存儲尋找到的對象
    int sel,k,i = 0;    //sel表示選擇查詢方式
    char str1[10],str2[10];//str1用來輸入火車編號  ,str2用來輸入城市名稱
    if(!l->next){
        printf("沒有任何記錄");
        return;
    }
    printf("選擇方式:\n 1:根據(jù)火車編號; \n 2:根據(jù)城市:\n");
    scanf("%d",&sel);//輸入選擇的序號
    if(sel == 1)//根據(jù)火車編號來查詢
    {
        printf("輸入火車編號:");
        scanf("%s",str1);
        r = l->next;        //鏈表是從第二個元素開始才有數(shù)據(jù)
        while(r != NULL)
        {
            if(strcmp(r->data.num,str1) == 0)//檢索是否有與輸入的編號相匹配
            {
                s[i] = r;   //把已經(jīng)找到的節(jié)點(diǎn)存放到定義好的結(jié)構(gòu)體指針數(shù)組
                i++;
                r = r->next;//繼續(xù)往表的后面尋找
            }else
                r = r->next;//繼續(xù)往表的后面尋找
        }
        if( i == 0)
            printf("找不到相對應(yīng)的編號的火車");
    }
    else if(sel == 2)//根據(jù)城市來查詢
    {
        printf("輸入想要去的城市:");
        scanf("%s",str2);
        r = l->next;        //鏈表是從第二個元素開始才有數(shù)據(jù)
        while(r != NULL)
        {
            if(strcmp(r->data.reachcity,str2) == 0)//檢索是否有與輸入的編號相匹配
            {
                s[i] = r;   //把已經(jīng)找到的節(jié)點(diǎn)存放到定義好的結(jié)構(gòu)體指針數(shù)組
                i++;
                r = r->next;//繼續(xù)往表的后面尋找
            }else
                r = r->next;//繼續(xù)往表的后面尋找
        }
        if( i == 0)
            printf("找不到相對應(yīng)的城市的火車");
    }
    printheader();
    for(k = 0 ; k < i ; k++)
        printdata(s[k]);
}

/*修改火車信息*/
void Modify(Link l)
{
    Node *p ;       //p節(jié)點(diǎn)從第二個節(jié)點(diǎn)開始(因?yàn)榈诙€節(jié)點(diǎn)才有數(shù)據(jù))
    char tnum[10],ch;//ch判斷是否修改  tnum[10]火車編號的輸入
    p = l->next;
    if(!p/* p != NULL */)
    {
        printf("你沒有記錄可以修改");
        return;
    }
    else
    {
        printf("\n你想修改它么??(y/n)\n");
        scanf("%c",&ch);
        if(ch == 'y'|| ch == 'Y')//字符的比較
        {
            printf("\n輸入火車編號:");
            scanf("%s",tnum);
            while(p != NULL)
            {
                if(strcmp(p->data.num,tnum) == 0)//查找與輸入的編號相匹配的記錄
                    break;      //如果已經(jīng)找到 我們的p肯定不為NULL
                else
                    p = p->next;
            }
            if(p)//如果找到的p不為空
            {
                printf("輸入火車的起始城市:");
                scanf("%s",p->data.startcity);
                printf("輸入火車的目的城市:");
                scanf("%s",p->data.reachcity);
                printf("輸入火車的起始時間:");
                scanf("%s",p->data.takeofftime);
                printf("輸入火車的抵達(dá)時間:");
                scanf("%s",p->data.receivetime);
                printf("輸入火車的票的價格:");
                scanf("%d",&p->data.price);
                printf("輸入火車的票的數(shù)量:");
                scanf("%d",&p->data.ticketnum);
                saveflag = 1;//數(shù)據(jù)發(fā)生改變需要保存
            }
            else/*沒有找到跳到此地*/
                printf("沒有找到該編號的火車");
        }
    }
}

/*訂票模塊*/
void Bookticket(Link l,bookLink k)//l是火車鏈表 k是人員鏈表
{
    Node *r[10],*p;//r存放滿足條件的火車信息
    /*str表示輸入想去城市、ch判斷是否訂票*,tnum 表示火車車次*/
    char ch[2],tnum[10],str[10],str1[10],str2[10];
    book *q,*h;
    int i = 0, t = 0,flag = 0,dnum;//i 記錄滿足條件的火車信息的數(shù)量,t 進(jìn)行循環(huán)打印火車信息 flag 標(biāo)志有票 dnum 買票的數(shù)量
    q = k;//將人員鏈表的表頭賦值給q
    while(q->next != NULL)
        q = q->next;        //遍歷人員鏈表(添加訂票人信息,從鏈表尾部添加)
    printf("輸入你想去的城市: ");
    scanf("%s",str);
    p = l->next;//鏈表的第二節(jié)點(diǎn)才有數(shù)據(jù)
    while( p != NULL)//遍歷火車信息鏈表
    {
        if(strcmp(p->data.reachcity,str) == 0)//如果找到你想去的城市
        {
            r[i] = p;//將滿足條件的記錄存到數(shù)組r中
            i++;
        }
        p = p->next;
    }
    printf("\n\n記錄的數(shù)量%d\n",i);
    printheader();
    for(t = 0 ; t < i ; t++)
        printdata(r[t]);
    if(i == 0)//如果沒有找到你想去的城市
        printf("沒有你所要找的車次");
    else//如果找到就訂票
    {
        printf("\n你想要訂票么?<y/n>\n");
        scanf("%s",ch);
        if(strcmp(ch,"Y")== 0 || strcmp(ch,"y")==0)//進(jìn)行字符串的比較
        {
            printf("請輸入需要的火車車次:");
            scanf("%s",tnum);
            for(t = 0; t < i ; t ++)
            {
                if(strcmp(r[t]->data.num,tnum) == 0)
                {
                    if(r[t]->data.ticketnum < 1)//判斷剩余的供票數(shù)量是否為0
                    {
                        printf("對不起,沒有票");
                        return;
                    }
                    printf("剩余%d張票\n",r[t]->data.ticketnum);
                    flag = 1;//標(biāo)志有票
                    break;
                }
            }
            if(flag == 1){
                h = (book*)malloc(sizeof(book));//增加人員鏈表節(jié)點(diǎn)
                printf("輸入你的名字: ");
                scanf("%s",str1);
                printf("輸入你的×××:");
                scanf("%s",str2);
                printf("輸入你要的買的數(shù)量:");
                scanf("%d",&dnum);/*買票的數(shù)量*/
                if(dnum > r[t]->data.ticketnum){
                    printf("你所需要的票數(shù)過多,無法購買!!!");
                    return;
                }
                r[t]->data.ticketnum = r[t]->data.ticketnum-dnum;//定票成功則票數(shù)相應(yīng)減少

                /*對人員信息表添加節(jié)點(diǎn),q= h 表示在尾部添加*/
                h->data.bookNum = dnum;
                strcpy(h->data.name,str1);
                strcpy(h->data.num,str2);
                h->next = NULL;
                q->next = h;
                q = h;
                printf("\n恭喜購票成功!!!\n");
                saveflag = 1;
            }
            else{
                printf("輸入有誤");
                return;
            }
        }
    }
}

void SaveTrainInfo(Link l)
{
    FILE *fp;//申明一個文件指針
    Node *p;//申明一個火車的節(jié)點(diǎn)
    int count = 0 , flag = 1;
    fp = fopen("g:/train.txt","wb");
    if(fp == NULL)
    {
        printf("無法打開該文件");
        return ;
    }
    p = l->next;
    while(p)
    {
        if(fwrite(p,sizeof(Node),1,fp) == 1){//每次寫入一個結(jié)構(gòu)進(jìn)去
            p = p->next;
            count++;
        }else
        {
            flag = 0;
            break;
        }
    }
    if(flag){//如果寫入成功
        printf("保存%d列火車記錄\n",count);
        saveflag = 0;
    }else{
        printf("保存文件失敗");
    }
    fclose(fp);
}

/*保存訂票人的信息*/
void SaveBookInfo(bookLink k)
{
        FILE *fp;//申明一個文件指針
    book *p;//申明一個火車的節(jié)點(diǎn)
    int count = 0 , flag = 1;
    fp = fopen("g:/man.txt","wb");
    if(fp == NULL)
    {
        printf("無法打開該文件");
        return ;
    }
    p = k->next;
    while(p)
    {
        if(fwrite(p,sizeof(book),1,fp) == 1){//每次寫入一個結(jié)構(gòu)進(jìn)去
            p = p->next;
            count++;
        }else
        {
            flag = 0;
            break;
        }
    }
    if(flag){//如果寫入成功
        printf("保存%d列人員記錄\n",count);
        saveflag = 0;
    }else{
        printf("保存文件失敗");
    }
    fclose(fp);
}

int main(){
    FILE *fp1,*fp2;//fp1文件指針對應(yīng)火車信息,fp2文件指針對應(yīng)人員信息

    Node *p,*r; //表示火車信息節(jié)點(diǎn) p用來表示讀文件的節(jié)點(diǎn)
    char ch2,ch3;
    Link l;     //表示火車信息的鏈表 l指的是鏈表的首位
    bookLink k; //這里表示人員的鏈表
    book *t,*h; //表示人員的節(jié)點(diǎn)
    int sel;    //選擇菜單變量
    l = (Node*)malloc(sizeof(Node));        
    l->next = NULL;     //它下一個節(jié)點(diǎn)指向NULL
    r = l;      //利用r來做一個循環(huán)表示

    k = (book*)malloc(sizeof(book));
    k->next = NULL;     //它下一個節(jié)點(diǎn)指向NULL
    h = k;

    /*火車基本信息的讀取*/
    fp1 = fopen("g:/train.txt","ab+");  //打開存儲火車信息的文件(如果沒有該文件就寫一個)
    if(fp1 == NULL){
        printf("無法打開該文件");
        return 0;
    }
    while(!feof(fp1)){  //feof()函數(shù)表示讀文件到了文件的結(jié)尾( EOF表示文件的結(jié)尾)
        p = (Node*)malloc(sizeof(Node));
        if(fread(p,sizeof(Node),1,fp1) == 1)/*從指定磁盤文件讀取記錄*/
        {
            p->next = NULL;     //因?yàn)閜為節(jié)點(diǎn),p后面現(xiàn)在還有指向,給它初始化
            r->next = p;    //構(gòu)建鏈表
            r = p;
        }
    }
    fclose(fp1);
    /*人員基本操作的讀取*/
    fp2 = fopen("g:/man.txt","ab+");
    if(fp2 == NULL){
        printf("無法讀取人員基本操作文件");
        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){
        menu();
        printf("\t請選擇(0~6):");
        scanf("%d",&sel);
        system("cls");
        if(sel == 0)
        {
            if(saveflag == 1)//表示未保存
            {
                getchar();
                printf("\n該文件已更改!你想保存它么(y/n)?\n");
                scanf("%c",&ch2);
                if(ch2 == 'y' || ch2 == 'Y'){
                    /*保存
                    1、火車信息文件
                    2、人員操作文件
                    */
                    SaveTrainInfo( l);
                    SaveBookInfo(k);
                }
            }
            printf("\n謝謝使用 下次光臨\n");
            break;
        }
        switch(sel)/*根據(jù)與輸入的sel值不同選擇相對應(yīng)的操作*/
        {
            case 1:
                Trianinfo(l);/*插入火車信息*/
                break;
            case 2:
                searchtrian(l);/*搜索火車信息*/
                break;
            case 3:
                Bookticket(l,k);/*預(yù)定火車票   */
                break;
            case 4:
                Modify(l);/*修改火車信息*/
                break;
            case 5:
                showtrain(l);/*顯示火車信息*/
                break;
            case 6:
                /*保存
                    1、火車信息文件
                    2、人員操作文件
                */
                SaveTrainInfo(l);
                SaveBookInfo(k);
                break;
            case 0:
                return 0;
        }
        printf("\n請按任意鍵繼續(xù)...");
    }

    system("pause");
    return 0;
}
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI