首頁 > 軟體

C語言實現火車票管理系統

2022-03-16 10:01:18

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

1、前言

這是大一剛學C語言一個學期完成的課設專案,裡面的功能還可以進一步的完善,僅供分享、參考、記錄使用,加油!

2、設計目的

隨著社會的發展,為了滿足人們的訂車票需求,所以設計了一個車票管理系統,讓使用者可以查詢到車票的餘數,乘車時間,以及為使用者提供一個訂票和退票的平臺,同時管理員也可以借用此係統進行對車票進行操作。

3、設計內容

1.對車票的各類資訊進行採集並錄入;
2.從磁碟檔案中讀取車輛資訊;
3.對所有車票資訊的個數進行統計
4.對車票資訊進行增加;
5.對特定的車票進行查詢
6.對所有車輛的旅程總時長進行排序;
7.乘客輸入自己的資訊訂票;
8.乘客輸入自己的資訊退票;
9.註冊賬號以及登入賬號進入系統。

4、概要設計

採用連結串列實現系統,同時設定了密碼,使用者進入系統輸入密碼時,給密碼進行了加密操作,而且該管理系統實現了查票、訂票、退票、增加票、排序等功能。

5、各函數功能

登入功能: void enroll(),int land();
包括註冊和登入,新使用者需要先註冊登入,並且登入的時候密碼用*進行覆蓋;
車票功能:①struct node *read_inf();
從檔案中讀取資訊,在檔案中書寫好車票資訊,然後呼叫函數,將檔案中的資訊讀取並顯示出來。
②void save_inf(struct node *pHead);
將從鍵盤輸入的車票資訊儲存到檔案中,最後可以在檔案中檢視所儲存的資訊。
③struct node *add(struct node *pHead);
增加車票資訊,採用頭插法或者尾插法增加車票資訊並且顯示出所有的車票資訊。
④int listlength(struct node *pHead);
統計所以的車票資訊數,通過連結串列的遍歷的方法,用count計數,最後count的值即為車票資訊數。
⑤int inquire(struct node *pHead);
查詢所需的車票資訊,通過連結串列遍歷,查詢起點站和終點站和所需相一致的進而實現此功能。
⑥void Sort(struct node *pHead);
對車票的時長進行排序,通過連結串列的遍歷,採用氣泡排序,讓時長從短到長的排序,也可以把時長變數換成餘票數等等變數名進行排序,借用中間變數進行交換值。
⑦void output(struct node *pHead);
輸出顯示車票資訊,採用連結串列的遍歷方法,將所儲存的連結串列資訊列印顯示出來。
⑧int buy(struct node *pHead);
訂票,輸入姓名,以及所需的訂票數,查詢起始站與終點站,最後票數會得到相應的減少。
⑨int back(struct node *pHead);
退票,輸入姓名,以及所想的退票數,最後此票數會得到相應的增加。

6、原始碼

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<ctype.h>
#include<windows.h>

#define n 5

int len=0;

//乘客資訊
struct passenge                     
{
    char name[10];                 //姓名
    int  num;                      //所需票量
}lg[n];                           //結構體變數名 

//車票資訊
typedef struct train                      
{
    char start_stat[20];          //起始站
    char end_stat[20];            //終點站
    char go_time[16];             //出發時間 
    char go_data[16];             //出發日期
    char train_num[15];           //車次資訊
    char all_time[16];            //旅途時間
    int  ticket_lea;               //餘票數量
}Train;              //把結構體struct train 叫做 Train 

typedef Train Item;    //又把Train 叫做 Item,目的讓連結串列更通用    連結串列裡只有2 個東西 專案和指標  

struct node
{                        //node是一個節點   節點包括專案和指標 
    Item item;
    struct node *next;
};

//註冊資訊
void enroll()
{
    char a[100];                   //註冊使用者名稱
    char b[100];                   //註冊密碼
    char s[100];                   //再次確定密碼
    int  len;
    
       printf("請輸入您的使用者名稱:");
    scanf("%s",a);
    
    printf("請設定您的密碼:");
            
    reset: scanf("%s",b);     //用到了if goto語句 

        len=strlen(b);    //讀取密碼長度 
       
       if(len>9)
        {
            printf("密碼長度過長,請重新設定:");
          goto reset;    //if goto 語句  
        }
        printf("請再次輸入您設定的密碼:");
         scanf("%s",s);
    
    if(strcmp(b,s) == 0)       //字串比較函數 
    {
        FILE *fp;
        
        fp=fopen("register.txt","at");     //選用追加方式,可以存多個資訊
        
        if(fp == NULL)
        {
            printf("檔案不存在!");
            exit(1);                           
        }
        
        fprintf(fp,"%s %sn",a,b);                    //字串寫入函數進行寫入操作
       
        printf("nt------註冊成功------n");
        fclose(fp);
    }
    else if(strcmp(b,s) != 0)
    {
        printf("您兩次輸入的密碼不一致,請重新設定密碼!n");
        goto reset;          //if goto 語句 
    }
}

//登陸頁面
int land()
{
    int  i=0;      //i是為了判斷密碼長度 並加密 
    char a[10];                 
    char b[10];                   

    char user_name[10];           
    char user_passwords[10];      

    printf("請輸入您的使用者名稱:");
    scanf("%s",user_name);

    printf("請輸入您的密碼:");

    while(i<9 && (user_passwords[i] = getch()) && user_passwords[i] != 'r')   //如果輸入超限 或者 遇到換行符就跳出迴圈
    {
        printf("*");   //掩飾密碼 
        i++;
    }
    
    user_passwords[i]=0;   //字串結束標誌 '/0' 
    
    FILE *fp;
    fp=fopen("register.txt","rt");       //又開啟檔案 
    
    if(fp==NULL)
    {
        printf("檔案不存在!");
        exit(1);
    }
    
    while(fscanf(fp,"%s %s",a,b)!=EOF)    //讀檔案判斷賬號密碼是否正確 
    {    
        if(strcmp(a,user_name)==0  &&  strcmp(b,user_passwords)==0)   //字串比較函數,看是否正確 
         {
            printf("nt--------登陸成功--------n");
            printf("t------歡迎進入系統------n");
            return 0;
         } 
    }
    if(1)
    {
        printf("n資訊輸入錯誤!n");
         land();
    }
    fclose(fp);
}

//將資訊儲存到檔案 
void save_inf(struct node *pHead)             //將連結串列中的資訊儲存到制定檔案中
{                                         //頭指標不能移動 
    struct node *pTemp;   //因為要一個節點移動 所以定義為pTemp移動 
    
    FILE *fp;
    fp=fopen("information.txt","at");    //開啟檔案 
    
    if(fp==NULL)
    {
        printf("開啟檔案失敗,檔案可能不存在!n");
        exit(1);
    }
                                                           //遍歷輸入 
    for(pTemp=pHead ; pTemp != NULL;pTemp=pTemp->next)      //節點先指向專案,專案裡面再找成員 
        
        fprintf(fp,"%s %s %s %s %s %s %dn",pTemp->item.start_stat,pTemp->item.end_stat,
            pTemp->item.go_time,pTemp->item.go_data,pTemp->item.train_num,pTemp->item.all_time,pTemp->item.ticket_lea);
   
    fclose(fp);
} 

//增加 
struct node *add(struct node *pHead)
{
       struct node *pNew;
       struct node *current; 
      
        pNew=(struct node *)malloc(sizeof(struct node));      //再次分配結點的記憶體空間
        
        pNew->next=pHead;    //新結點指向原來的首節點 
        pHead=pNew;          //頭指標指向新結點
        
        
        //尾插法;
        /*current=pHead;
        while(current->next!=NULL)
        {
            current=current->next;
        } 
        current->next=pNew;
        pNew->next=NULL;
        */
        
        printf("n請輸入起始站:");
        scanf("%s",pNew->item.start_stat);
        printf("請輸入終點站:");
        scanf("%s",pNew->item.end_stat);
        printf("請輸入出發時間:");
        scanf("%s",pNew->item.go_time);
        printf("請輸入出發日期:");
        scanf("%s",pNew->item.go_data);
        printf("請輸入車次資訊:");
        scanf("%s",pNew->item.train_num);
        printf("請輸入旅途時間:");
        scanf( "%s",pNew->item.all_time);
        printf("請輸入餘票數量:");
        scanf("%d",&pNew->item.ticket_lea);
        
        current=pHead;
    
        while(current!=NULL){
            printf("%-10s",current->item.start_stat);
            printf("%-10s",current->item.end_stat);
            printf("%-12s",current->item.go_time);
            printf("%-14s",current->item.go_data);
            printf("%-12s",current->item.train_num);
            printf("%-13s",current->item.all_time);
            printf("%-d",current->item.ticket_lea);
            printf("n");
            current=current->next;
        }
         
        return pHead;       //返回頭指標 
        
 } 


//輸出顯示模組
void output(struct node *pHead)
{
    struct node *pTemp;                 //迴圈所用的臨時指標

    pTemp=pHead;                         //指標的到首結點的指標

    printf("t******車票資訊如下******n");
    printf("起始站    終點站    出發時間    出發日期     車次資訊     旅途時間    餘票量n");

    while((pTemp!=NULL))
    {
        printf("%-10s",pTemp->item.start_stat);
        printf("%-10s",pTemp->item.end_stat);
        printf("%-12s",pTemp->item.go_time);
        printf("%-14s",pTemp->item.go_data);
        printf("%-12s",pTemp->item.train_num);
        printf("%-13s",pTemp->item.all_time);
        printf("%-d",pTemp->item.ticket_lea);
        printf("n");
        pTemp=pTemp->next;              //移動臨時指標到下一個結點
    }

}

//查詢車票資訊
int inquire(struct node *pHead)
{
    int flag = 0;
    struct node *pTemp; 
    
    char inquire_start[20],inquire_end[20];       //查詢選擇的起始站和終點站
  
    printf("請輸入要查詢車票的起始站和終點站:");
    scanf("%s %s",inquire_start,inquire_end);
    
    pTemp=pHead;
    
    while(pTemp!=NULL)
    {
        if((strcmp(pTemp->item.start_stat,inquire_start)==0) && (strcmp(pTemp->item.end_stat,inquire_end)==0))
        {
            flag = 1;
            printf("n車票資訊結果如下:n");
            printf("起始站    終點站    出發時間    出發日期    車次    旅途時間    餘票量n");
            printf("%-10s",pTemp->item.start_stat);
            printf("%-10s",pTemp->item.end_stat);
            printf("%-12s",pTemp->item.go_time);
            printf("%-14s",pTemp->item.go_data);
            printf("%-12s",pTemp->item.train_num);
            printf("%-13s",pTemp->item.all_time);
            printf("%-d",pTemp->item.ticket_lea);       
        }
           pTemp=pTemp->next;
           continue;
    }
    
    if(flag == 0)
    {
        printf("輸入錯誤!n");
        inquire(pHead);
    }
    return 0;
    } 
    
//訂票    
    int buy(struct node *pHead)
{
    struct node *pTemp; 
    char   choice_start[20],choice_end[20];       /*購票選擇的起始和終點站*/
    int    numbers;                                /*購買數量*/
    char   buy_name[10];                          /*購買人姓名*/
    char   wy;
    
    pTemp=pHead; 
    printf("請輸入所購買車票的起始站、終點站和票數:");
    scanf("%s %s %d",choice_start,choice_end,&numbers);
  
    while(pTemp!=NULL)
    {
        if((strcmp(pTemp->item.start_stat,choice_start)==0)&&(strcmp(pTemp->item.end_stat,choice_end)==0))      /*找到起始終點均相同的站*/
        {
            if(numbers<=pTemp->item.ticket_lea)       /*若小於餘票量進行辦理*/
            {
                printf("找到符合資訊的車次:n");
                printf("起始站    終點站    出發時間    出發日期    車次    旅途時間    餘票量n");
                printf("%-10s",pTemp->item.start_stat);
                printf("%-10s",pTemp->item.end_stat);
                printf("%-11s",pTemp->item.go_time);
                printf("%-12s",pTemp->item.go_data);
                printf("%-10s",pTemp->item.train_num);
                printf("%-13s",pTemp->item.all_time);
                printf("%-d",pTemp->item.ticket_lea);
                printf("n");
                printf("請您輸入姓名:");
                scanf("%s",buy_name);
                
                printf("正在辦理訂票......n");
                printf("恭喜您辦理成功!n");
                
                pTemp->item.ticket_lea=pTemp->item.ticket_lea - numbers;       /*辦理成功,該車次票量減少*/
                
                strcpy(lg[len].name,buy_name);
                
                lg[len].num=numbers;
                len++;
                return 0;    /*訂票成功返回主選單*/
            }
            else 
            {
                printf("您所需要的票數超過餘票數,請問是否繼續辦理(Y/y || N/n)?n");
                getchar();
                scanf("%c",&wy);
                
                if(wy == 'Y' || wy == 'y')
                    buy(pHead);
                else if(wy == 'N' || wy=='n' )
                {
                     printf("謝謝使用,按任意鍵返回!n");
                     getch();
                     return 0;
                }
            }
        }
        else
            pTemp=pTemp->next;
    }
    printf("n很遺憾,未找到您需要的車次,請重新訂票!n");

    buy(pHead);
    return 0;
}

//退票
int back(struct node *pHead)
{
     struct node *pTemp;
        int i;
     char wy;                //判斷yes or no 
     
     char back_name[10];     //退票人姓名
     int back_num;           //退票數
     char back_start[20];    //退票起始站
     char back_end[20];      //退票終點站
     
     printf("請輸入要退票人姓名和退票數:");
     scanf("%s%d",back_name,&back_num);
     printf("請輸入退票的起始站和終點站:");
     scanf("%s%s",back_start,back_end);
     pTemp=pHead;
    
     while(pTemp!=NULL)
     {
         if((strcmp(pTemp->item.start_stat,back_start)==0)&&(strcmp(pTemp->item.end_stat,back_end)==0))      /*找到起始終點均相同的站*/
         {
             for(i=0;i<len;i++)
             {
                 if(strcmp(back_name,lg[i].name)==0)
                 {
                     printf("退票成功!n");
                     pTemp->item.ticket_lea=pTemp->item.ticket_lea + back_num;       //辦理成功,該車次票數增加
                     return 0;
                 }
                 else
                 {
                     printf("未找到您定的票,請問您是否重輸資訊繼續進行退票(Y/y || N/n):");
                     getchar();
                        scanf("%c",&wy);
                     if(wy=='Y' || wy =='y')
                        back(pHead);
                    else if(wy=='N' || wy == 'n')
                    {
                         printf("謝謝使用,按任意鍵返回!n");
                         getch();
                         return 0;
                    }
                 }
             }
         }
        else
            pTemp=pTemp->next;
     }
    printf("n很遺憾,未找到您要退票的車次,請重新退票!n");
    back(pHead);
    return 0;
}

//從檔案中讀取資訊
struct node *read_inf() //從磁碟檔案中讀取資訊並存入單連結串列 
{
    struct node *head, *r, *train;   //定義結構體指標變數  struct node是型別 
                                     //head為頭結點(頭結點中有資訊),r為尾節點, train為當前節點 
    FILE *fp;

    if((fp=fopen("information.txt","rt"))==NULL)
    {
        printf("讀檔案出錯,按任意鍵退出");
        getch();
        exit(1); 
    }
    
    head=(struct node *)malloc(sizeof(struct node));   //初始化 
    head->next=NULL;
    
    fscanf(fp,"%s %s %s %s %s %s %d",head->item.start_stat,head->item.end_stat,
            head->item.go_time,head->item.go_data,head->item.train_num,head->item.all_time,&head->item.ticket_lea);
    
    r=head;  //r是尾節點 
    while(!feof(fp))     //檔案末結束 
    {                        
        train=(struct node *)malloc(sizeof(struct node));        //建立連結串列 
        fscanf(fp,"%s %s %s %s %s %s %d",train->item.start_stat,train->item.end_stat,
            train->item.go_time,train->item.go_data,train->item.train_num,train->item.all_time,&train->item.ticket_lea);
        r->next=train;   //連結串列節點 
        r=train;
    }
    r->next=NULL;
    
    fclose(fp);
    printf("n檔案中資訊以正確讀出,按任意鍵返回!");
    getch();   //清除緩衝區 
    system("cls");
    return head; 
}

//主介面
void meau()
{
    printf("n");
    printf("t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n");
    printf("t☆==============歡迎使用車票管理系統==============☆n");
    printf("t☆~~~~~~~~~~~~~~~1.存入車票資訊~~~~~~~~~~~~~~~~~~~☆n");
    printf("t☆~~~~~~~~~~~~~~~2.顯示車票資訊~~~~~~~~~~~~~~~~~~~☆n");
    printf("t☆~~~~~~~~~~~~~~~3.查詢車票資訊~~~~~~~~~~~~~~~~~~~☆n");
    printf("t☆~~~~~~~~~~~~~~~4.增加車票資訊~~~~~~~~~~~~~~~~~~~☆n");
    printf("t☆~~~~~~~~~~~~~~~5.統計 與 排序~~~~~~~~~~~~~~~~~~~☆n");
    printf("t☆~~~~~~~~~~~~~~~6. 訂     票~~~~~~~~~~~~~~~~~~~~~☆n");
    printf("t☆~~~~~~~~~~~~~~~7. 退     票~~~~~~~~~~~~~~~~~~~~~☆n");
    printf("t☆~~~~~~~~~~~~~~~8.切換賬號登入~~~~~~~~~~~~~~~~~~~☆n");
    printf("t☆~~~~~~~~~~~~~~~9.退出管理系統~~~~~~~~~~~~~~~~~~~☆n");
    printf("t☆================================================☆n");
    printf("t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n");
    printf("請選擇編號(1-9)選擇功能進行相應的操作:");
}

//連結串列長度,為了更好的排序 
int listlength(struct node *pHead)   //判斷連結串列的長度 進而知道迴圈次數 
{
    struct node *current;
    int len=0;
    
    current=pHead;
    while(current!=NULL)
    {
        len++;                   //遍歷一篇 len自增 表示最後連結串列的長度 
        current=current->next;
    } 
    return len;
}

//排統計序 
void Sort(struct node *pHead)
{
    int len;
    
    struct node *current;
    
    current=pHead;
    len=listlength(pHead);         //上面一個函數的功能判斷連結串列的長度 
    printf("共有%d個資訊n", len);
    while(len>1)
    {                       //氣泡排序 
        while(current->next != NULL)
        {
            if(strcmp(current->item.all_time, current->next->item.all_time)>0)   //比較時間 
            {    
                Item temp;  //定義一個交換變數 
                
                temp=current->item;
                current->item=current->next->item;
                current->next->item=temp;
                
            }
            current=current->next;
        }
        len--;
        current=pHead;   //每次從頭開始遍歷 
    }
    output(pHead);  //進去輸出函數 
    return;
} 

//主函數
int main()
{
    system("color 4");
    printf("歡");sleep(0);
    printf("迎");sleep(1); 
    system("color 3");
    printf("使");sleep(0);
    printf("用");sleep(1);
    system("color 2");
    printf("車");sleep(0);
    printf("票");sleep(1);
    system("color 1");
    printf("管");sleep(0);
    printf("理");sleep(1); 
    system("color 6");
    printf("系");sleep(0);
    printf("統n");sleep(2);
    printf("tt");
    printf("n");    
    
    system("color 8"); 
    printf("ttt即將進入登陸註冊頁面請稍候.....");
    sleep(3);
    system("cls");
    
    system("color 3");
    
    int x; 
    printf("tt1.登陸ttt2.註冊並登入n");
    printf("請選擇序號:");
    scanf("%d",&x);
    if(x==1)
        land();
    else if(x==2)
    {
        enroll();
        land();
    }
    else
    {
        printf("輸入無效,即將退出系統!n");
        exit(1);
    }
    
    int choice=8;
    struct node *pHead;                  //定義頭結點
    
    //選擇編號  
    while(choice != 10)
    {  
        meau();
        
        scanf("%d",&choice);

        switch(choice)
        {  
        case 1:system("cls"); pHead=read_inf();  break;         
        case 2:system("cls"); output(pHead);     break;                       
        case 3:system("cls"); inquire(pHead);    break;
        case 4:system("cls"); add(pHead);   save_inf(pHead);        break;
        case 5:system("cls"); Sort(pHead);       break;
        case 6:system("cls"); buy(pHead);        break;
        case 7:system("cls"); back(pHead);       break;
        case 8:land(); break;
        case 9:exit(1);
        default:printf("請輸入正確的編號!n");  break;
        }    
    }
}

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


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