亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

火車訂票系統源碼筆記c++

發布時間:2020-07-14 19:12:44 來源:網絡 閱讀:3876 作者:知止內明 欄目:編程語言
/*
系統名稱:火車訂票系統
1、插入一個火車信息
2、搜索火車信息
3、預定火車信息
4、修改火車信息
5、顯示火車信息
6、保存火車信息

結構組成
1、火車信息結構體
2、訂票人信息結構體
3、火車信息鏈表節點結構體
4、訂票人的鏈表節點結構體

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

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

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

#define  HEADER1 "---------------------------------火車訂票系統-----------------------------\n"
#define  HEADER2 "| 編號  | 起始城市  | 抵達城市 | 起始時間 | 到達時間 |票的價格 | 車票數量|\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

/*定義存儲火車信息的結構體*/
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[20];   //×××號碼
    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("\n\n");
    puts("\t\t|----------------------------------------------------------|");
    puts("\t\t|                     火車訂票系統                         |");
    puts("\t\t|----------------------------------------------------------|");
    puts("\t\t|         0:退出系統                                       |");
    puts("\t\t|         1:插入一個火車信息                               |");
    puts("\t\t|         2:搜索火車信息                                   |");
    puts("\t\t|         3:預定火車票                                   |");
    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; //鏈表頭指針后面一個節點才開始有火車信息數據
    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);    //將編號存放到節點里面
        printf("請輸入火車開始城市 :");  
        scanf("%s",p->data.startcity);//輸入出發城市
        printf("請輸入火車目的城市 :");  
        scanf("%s",p->data.reachcity);//輸入目的城市
        printf("請輸入火車出發時間 :");  
        scanf("%s",p->data.takeofftime);//輸入出發時間
        printf("請輸入火車到達時間 :");  
        scanf("%s",p->data.receivetime);//輸入到達時間
        printf("請輸入票價:");
        scanf("%d",&p->data.price);//輸入票價
        printf("請輸入票數:");
        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 *p)
{
    Node* q ;
    q = p;
    printf(FORMAT,DATA);
}

/*顯示火車票信息*/
void showtrain(Link l)
{
    Node *p;
    p = l->next;//鏈表頭指針后面一個節點才開始有火車信息數據
    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:根據火車編號; \n 2:根據城市:\n");
    scanf("%d",&sel);//輸入選擇的序號
    if(sel == 1)//根據火車編號來查詢
    {
        printf("輸入火車編號:");
        scanf("%s",str1);
        r = l->next;        //鏈表是從第二個元素開始才有數據
        while(r != NULL)
        {
            if(strcmp(r->data.num,str1) == 0)//檢索是否有與輸入的編號相匹配
            {
                s[i] = r;   //把已經找到的節點存放到定義好的結構體指針數組
                i++;
                r = r->next;//繼續往表的后面尋找
            }else
                r = r->next;//繼續往表的后面尋找
        }
        if( i == 0)
            printf("找不到相對應的編號的火車");
    }
    else if(sel == 2)//根據城市來查詢
    {
        printf("輸入想要去的城市:");
        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("找不到相對應的城市的火車");
    }
    printheader();
    for(k = 0 ; k < i ; k++)
        printdata(s[k]);
}

/*修改火車信息*/
void Modify(Link l)
{
    Node *p ;       //p節點從第二個節點開始(因為第二個節點才有數據)
    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;      //如果已經找到 我們的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("輸入火車的抵達時間:");
                scanf("%s",p->data.receivetime);
                printf("輸入火車的票的價格:");
                scanf("%d",&p->data.price);
                printf("輸入火車的票的數量:");
                scanf("%d",&p->data.ticketnum);
                saveflag = 1;//數據發生改變需要保存
            }
            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 記錄滿足條件的火車信息的數量,t 進行循環打印火車信息 flag 標志有票 dnum 買票的數量
    q = k;//將人員鏈表的表頭賦值給q
    while(q->next != NULL)
        q = q->next;        //遍歷人員鏈表(添加訂票人信息,從鏈表尾部添加)
    printf("輸入你想去的城市: ");
    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("\n\n記錄的數量%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)//進行字符串的比較
        {
            printf("請輸入需要的火車車次:");
            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("對不起,沒有票");
                        return;
                    }
                    printf("剩余%d張票\n",r[t]->data.ticketnum);
                    flag = 1;//標志有票
                    break;
                }
            }
            if(flag == 1){
                h = (book*)malloc(sizeof(book));//增加人員鏈表節點
                printf("輸入你的名字: ");
                scanf("%s",str1);
                printf("輸入你的×××:");
                scanf("%s",str2);
                printf("輸入你要的買的數量:");
                scanf("%d",&dnum);/*買票的數量*/
                if(dnum > r[t]->data.ticketnum){
                    printf("你所需要的票數過多,無法購買!!!");
                    return;
                }
                r[t]->data.ticketnum = r[t]->data.ticketnum-dnum;//定票成功則票數相應減少

                /*對人員信息表添加節點,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;//申明一個火車的節點
    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){//每次寫入一個結構進去
            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;//申明一個火車的節點
    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){//每次寫入一個結構進去
            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文件指針對應火車信息,fp2文件指針對應人員信息

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

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

    /*火車基本信息的讀取*/
    fp1 = fopen("g:/train.txt","ab+");  //打開存儲火車信息的文件(如果沒有該文件就寫一個)
    if(fp1 == NULL){
        printf("無法打開該文件");
        return 0;
    }
    while(!feof(fp1)){  //feof()函數表示讀文件到了文件的結尾( EOF表示文件的結尾)
        p = (Node*)malloc(sizeof(Node));
        if(fread(p,sizeof(Node),1,fp1) == 1)/*從指定磁盤文件讀取記錄*/
        {
            p->next = NULL;     //因為p為節點,p后面現在還有指向,給它初始化
            r->next = p;    //構建鏈表
            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)/*根據與輸入的sel值不同選擇相對應的操作*/
        {
            case 1:
                Trianinfo(l);/*插入火車信息*/
                break;
            case 2:
                searchtrian(l);/*搜索火車信息*/
                break;
            case 3:
                Bookticket(l,k);/*預定火車票   */
                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請按任意鍵繼續...");
    }

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

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宝应县| 盐津县| 喀喇| 北宁市| 乌苏市| 巴林右旗| 澄迈县| 孙吴县| 余干县| 新乡县| 吉水县| 林口县| 宁河县| 石棉县| 舒城县| 凤冈县| 泰兴市| 景洪市| 连城县| 长顺县| 潞城市| 巨野县| 青河县| 望江县| 怀化市| 六盘水市| 大兴区| 顺昌县| 漯河市| 汝城县| 自治县| 灵武市| 同德县| 澎湖县| 论坛| 新竹县| 昌都县| 广安市| 新邵县| 井冈山市| 垦利县|