欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

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

/*
系統(tǒng)名稱:火車訂票系統(tǒng)
1、插入一個(gè)火車信息
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 "| 編號(hào)  | 起始城市  | 抵達(dá)城市 | 起始時(shí)間 | 到達(dá)時(shí)間 |票的價(jià)格 | 車票數(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

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

/*訂票人的信息*/
struct man{
    char num[20];   //×××號(hào)碼
    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:插入一個(gè)火車信息                               |");
    puts("\t\t|         2:搜索火車信息                                   |");
    puts("\t\t|         3:預(yù)定火車票                                   |");
    puts("\t\t|         4:修改火車信息                                   |");
    puts("\t\t|         5:顯示火車信息                                   |");
    puts("\t\t|         6:保存信息到文件                                 |");
    puts("\t\t|----------------------------------------------------------|");
}
//添加一個(gè)火車信息
void Trianinfo(Link linkhead)
{
    struct node *p,*r,*s;
    char num[10];
    r = linkhead;   //鏈表的頭指針不能移動(dòng)(在以后的查詢中無法找到頭指針)
    s = linkhead->next; //鏈表頭指針后面一個(gè)節(jié)點(diǎn)才開始有火車信息數(shù)據(jù)
    while(r->next != NULL) //找到鏈表尾部
        r = r->next;
    while(1)
    {
        printf("請(qǐng)輸入火車的編號(hào)(0-無窮大)");
        scanf("%s",num);
        if(strcmp(num,"0") == 0)
            break;
        /*判斷是否存在*/
        while(s /* s != NULL */)
        {
            if(strcmp(s->data.num , num) == 0){
                printf("編號(hào)為%s的火車已存在!!\n",num);
                return ;
            }
            s = s->next;
        }
        p = (struct node*)malloc(sizeof(struct node));
        strcpy(p->data.num,num);    //將編號(hào)存放到節(jié)點(diǎn)里面
        printf("請(qǐng)輸入火車開始城市 :");  
        scanf("%s",p->data.startcity);//輸入出發(fā)城市
        printf("請(qǐng)輸入火車目的城市 :");  
        scanf("%s",p->data.reachcity);//輸入目的城市
        printf("請(qǐng)輸入火車出發(fā)時(shí)間 :");  
        scanf("%s",p->data.takeofftime);//輸入出發(fā)時(shí)間
        printf("請(qǐng)輸入火車到達(dá)時(shí)間 :");  
        scanf("%s",p->data.receivetime);//輸入到達(dá)時(shí)間
        printf("請(qǐng)輸入票價(jià):");
        scanf("%d",&p->data.price);//輸入票價(jià)
        printf("請(qǐng)輸入票數(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;//鏈表頭指針后面一個(gè)節(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]用來存儲(chǔ)尋找到的對(duì)象
    int sel,k,i = 0;    //sel表示選擇查詢方式
    char str1[10],str2[10];//str1用來輸入火車編號(hào)  ,str2用來輸入城市名稱
    if(!l->next){
        printf("沒有任何記錄");
        return;
    }
    printf("選擇方式:\n 1:根據(jù)火車編號(hào); \n 2:根據(jù)城市:\n");
    scanf("%d",&sel);//輸入選擇的序號(hào)
    if(sel == 1)//根據(jù)火車編號(hào)來查詢
    {
        printf("輸入火車編號(hào):");
        scanf("%s",str1);
        r = l->next;        //鏈表是從第二個(gè)元素開始才有數(shù)據(jù)
        while(r != NULL)
        {
            if(strcmp(r->data.num,str1) == 0)//檢索是否有與輸入的編號(hào)相匹配
            {
                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("找不到相對(duì)應(yīng)的編號(hào)的火車");
    }
    else if(sel == 2)//根據(jù)城市來查詢
    {
        printf("輸入想要去的城市:");
        scanf("%s",str2);
        r = l->next;        //鏈表是從第二個(gè)元素開始才有數(shù)據(jù)
        while(r != NULL)
        {
            if(strcmp(r->data.reachcity,str2) == 0)//檢索是否有與輸入的編號(hào)相匹配
            {
                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("找不到相對(duì)應(yīng)的城市的火車");
    }
    printheader();
    for(k = 0 ; k < i ; k++)
        printdata(s[k]);
}

/*修改火車信息*/
void Modify(Link l)
{
    Node *p ;       //p節(jié)點(diǎn)從第二個(gè)節(jié)點(diǎn)開始(因?yàn)榈诙€(gè)節(jié)點(diǎn)才有數(shù)據(jù))
    char tnum[10],ch;//ch判斷是否修改  tnum[10]火車編號(hào)的輸入
    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輸入火車編號(hào):");
            scanf("%s",tnum);
            while(p != NULL)
            {
                if(strcmp(p->data.num,tnum) == 0)//查找與輸入的編號(hào)相匹配的記錄
                    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("輸入火車的起始時(shí)間:");
                scanf("%s",p->data.takeofftime);
                printf("輸入火車的抵達(dá)時(shí)間:");
                scanf("%s",p->data.receivetime);
                printf("輸入火車的票的價(jià)格:");
                scanf("%d",&p->data.price);
                printf("輸入火車的票的數(shù)量:");
                scanf("%d",&p->data.ticketnum);
                saveflag = 1;//數(shù)據(jù)發(fā)生改變需要保存
            }
            else/*沒有找到跳到此地*/
                printf("沒有找到該編號(hào)的火車");
        }
    }
}

/*訂票模塊*/
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("請(qǐng)輸入需要的火車車次:");
            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("對(duì)不起,沒有票");
                        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)減少

                /*對(duì)人員信息表添加節(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;//申明一個(gè)文件指針
    Node *p;//申明一個(gè)火車的節(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){//每次寫入一個(gè)結(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;//申明一個(gè)文件指針
    book *p;//申明一個(gè)火車的節(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){//每次寫入一個(gè)結(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文件指針對(duì)應(yīng)火車信息,fp2文件指針對(duì)應(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;     //它下一個(gè)節(jié)點(diǎn)指向NULL
    r = l;      //利用r來做一個(gè)循環(huán)表示

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

    /*火車基本信息的讀取*/
    fp1 = fopen("g:/train.txt","ab+");  //打開存儲(chǔ)火車信息的文件(如果沒有該文件就寫一個(gè))
    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請(qǐng)選擇(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值不同選擇相對(duì)應(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請(qǐng)按任意鍵繼續(xù)...");
    }

    system("pause");
    return 0;
}

文章名稱:火車訂票系統(tǒng)源碼筆記c++
標(biāo)題網(wǎng)址:http://www.chinadenli.net/article36/gshdsg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google做網(wǎng)站網(wǎng)站內(nèi)鏈搜索引擎優(yōu)化企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)