当前位置:首页 > 芯闻号 > 充电吧
[导读]要求:火车订票系统要求:1、用户注册功能注册新用户,输入用户名密码。2、用户名检测,用户名重复,重新注册。3、用户注册成功。用户登录检测用户名和密码是否正确,正确,登录成功,否则失败。后台管理列车信息

要求:

火车订票系统

要求:

1、用户注册功能

注册新用户,输入用户名密码。

2、用户名检测,用户名重复,重新注册。

3、用户注册成功。

用户登录

检测用户名和密码是否正确,正确,登录成功,否则失败。

后台管理

列车信息录入

4、列车时刻表查询

车次查询

    输入车次,列出本次车所有到站及价格 

 

发到站查询

 输入发站

 输入到站

 列出所有车次及价格

订票功能

    输入发车站

    输入到站

    列出所有车次,同时显示车上是否有票

订票,显示座位号

    订票成功

    订票信息记入个人账户


//  main.c
//  TrainTicketSystem
//
//  Created by xiaobai on 15/7/21.
//  Copyright (c) 2015年 xiaobaiyige. All rights reserved.
//
#include "ticket_data.h"
int main(int argc, const char * argv[])
{
    int m_s;
    int n_s;
    int k_s=0;
    system_init();
    while (1)
    {
        m_s=show_main_menu(k_s);
        k_s=m_s;
        getchar();
        switch (m_s)
        {
            case 1:
                usr_regester();
                break;
            case 2:
                if(usr_load()==1)
                {
                    int cc;
                    printf("请选择你要的服务选项:n");
                    printf("1.去订票.n");
                    printf("2.查看自己的订票信息.n");
                    scanf("%d",&cc);
                    switch (cc) {
                        case 1:
                            k_s=m_s=5;
                            break;
                        case 2:
                            show_booked();
                            break;
                        default:
                            break;
                    }
                    
                }
                break;
            case 3:
                back_manage();
                break;
            case 4:
                printf("请选择查询方式:n");
                printf("1.查区间.n");
                printf("2.查车次.n");
                printf("3.看所有车次.n");
                scanf("%d",&n_s);
                switch (n_s)
                {
                    case 1:
                        find_t();
                    break;
                    case 2:
                        find_t2();
                        break;
                    case 3:
                        show_train();
                        break;
                    default:
                        break;
                }
                break;
            case 5:
                book_ticket();
                break;
            case 6:
                exit(0);
            default:
                break;
        }
    }
}


//  ticket_data.c
//  TrainTicketSystem
//
//  Created by xiaobai on 15/7/22.
//  Copyright (c) 2015年 xiaobaiyige. All rights reserved.
//
#include "ticket_data.h"
LOAD_FLAG L_F;
usr uu;//保存读取的信息;

int my_fwrite(char *filename,char *write_str,char *model)//进行一次讲 write_str以model模式写入到filename里面
{
    FILE*fp=NULL;
    if((fp=fopen(filename, model))!=NULL)
    {
        fwrite(write_str,sizeof(write_str),1,fp);
        fclose(fp);
        return 0;//写入成功
    }
    else
        return -1;
}
int my_fread(char *filename,char *read,char *model)//进行一次读取filename里面的内容到 read里面,模式是model
{
    FILE *fp=NULL;
    if ((fp=fopen(filename, model))!=NULL)
    {
        fread(read,sizeof(read),1, fp);
        fclose(fp);
        return 0;
    }
    else return -1;
}
int check_account(char *str_name)
{
    FILE *fp=NULL;
    if ((fp=fopen(str_name, "r"))==NULL) {
        return 1;//文件不存在,代表用户名可以注册
    }
    else
    {
        fclose(fp);
        return 0;//表示文件已经存在用户名不可注册
    }
    
}
void usr_regester()//新用户注册函数
{
    usr new_user;
    FILE *fp=NULL;
    printf("请输入需要注册的用户名:n");
    scanf("%s",new_user.name);
    if (check_account(new_user.name))
    {
        printf("恭喜你,账号可以使用,请输入密码:n");
        scanf("%s",new_user.pass);
        new_user.has_booked=0;
        if((fp=fopen(new_user.name, "wb"))!=NULL)
        {
            fwrite(&new_user, sizeof(usr), 1, fp);
            fclose(fp);
            printf("注册新用户成功:n");
            printf("你的用户名是:%s,请牢记n",new_user.name);
            return ;
        }
        else
        {
            printf("创建新用户失败.文件写入错误.");
            return ;
        }
    }
    else
    {
        printf("注册的用户名已经存在请重新注册:n");
        return ;
    }
}
int show_main_menu(int last)
{
    int n=0;
    static int p_s=0;
    if (p_s==last) {
        while (1)
        {
            printf("请输入你所需要的服务编号n");
            printf("1:注册新的用户.n");
            printf("2:用户登录.n");
            printf("3:后台管理.n");
            printf("4:车次时刻表查询.n");
            printf("5:预定车票.n");
            printf("6:退出.n");
            scanf("%d",&n);
            if (n>=1&&n<=6)
            {
                p_s=n;
                return n;
            }
            else
            {
                printf("请重新输入n");
            }
        }

    }
    else{
        return last;
    }
}
int usr_load()
{
    usr u;
    FILE*fp=NULL;
    printf("请输入用户名:n");
    scanf("%s",u.name);
    int times=0;//用来计算密码剩余输入次数
    if (check_account(u.name)==0)//用户名存在
    {
        fp=fopen(u.name, "rb");
        fread(&uu, sizeof(usr), 1, fp);
        fclose(fp);
        while(times<3)//3次密码输入错误后退出
        {
            printf("请输入密码:n");
            scanf("%s",u.pass);
            if (strcmp(u.pass, uu.pass)==0)
            {
                printf("密码输入正确,登录成功:n");
                L_F.flag=1;//给系统用户标志位赋值为1
                L_F.load_usr=&uu;//
                return 1;
            }
            else
            {
                times++;
                printf("密码输入错误,请重新输入,还有%d次机会:n",3-times);
            }
        }
        return 0;
    }
    else//用户名不存在
    {
        printf("你输入的用户不存在.n");
        return -1;
    }
}
void system_init()
{
    char r_p[10];
    FILE *fp=NULL;
    if((fp=fopen("root", "rb"))==NULL)
    {
        printf("这是本系统第一次使用,请输入root密码,用来管理车次信息n");
        scanf("%s",r_p);
        getchar();//获取自己刚刚输入的回车
        fp=fopen("root", "wb");
        fwrite(r_p, sizeof(r_p), 1, fp);
        fclose(fp);
        printf("系统初始化成功,请牢记密码.n");
    }
}
void back_manage()
{
    char s[10];
    int i=0;
    int j;
    int n;//输入车次的总数
    char s2[10];//密码的保留
    int times=0;//密码输入次数统计
    TRAINS tt,t2;//保存和车次处理相关的问题
    FILE *fp,*fp2;
    int t_sum;
    printf("请输入root密码n");
    if (my_fread("root", s2, "rb")==0)
    {
        scanf("%s",s);
        while (times<3)
        {
            if (strcmp(s2, s)==0)
            {
               printf("密码输入正确,请输入车次信息:n");
               printf("请输入要输入的车次的个数:n");
               scanf("%d",&n);
               tt.all_sum=n;//所有的车的数目
               getchar();
                for(i=1;i<=n;i++)
                {
                    printf("请输入第%d次列车中途站的数目和车次的名称:n",i);
                    scanf("%d %s",&tt.all_t[i].sum,tt.all_t[i].name);
                    getchar();
                    printf("下面请依次输入%s车次的%d个站的时间,价格和名称n",tt.all_t[i].name,tt.all_t[i].sum);
                    for (j=1; j<=tt.all_t[i].sum; j++)
                    {
                        scanf("%s %lf %s",tt.all_t[i].t[j].time,&tt.all_t[i].t[j].price,tt.all_t[i].t[j].name);
                        getchar();
                    }
                    init_pos(tt.all_t[i].pos);//初始化车票信息
                }
                fp=fopen("trains.txt", "wb");
                fwrite(&tt, sizeof(TRAINS), 1, fp);
                fclose(fp);
                printf("信息已经记录.n");
                fp2=fopen("trains.txt", "rb");
                fread(&t2, sizeof(TRAINS), 1, fp);
                fclose(fp2);
                for (i=1; i<=t2.all_sum; i++)
                {
                    t_sum=tt.all_t[i].sum;
                    printf("%d %s %s %s %sn",
                           i,
                           t2.all_t[i].name,
                           t2.all_t[i].t[1].name,
                           t2.all_t[i].t[t_sum].name,
                           t2.all_t[i].t[1].time);
                }
                 break;
            }
            else
            {
                times++;
                printf("密码输入错误,还有%d次机会n",3-times);
            }
        }
        
    }else
    {
        printf("root文件损坏n");
    }
}
void show_train()
{
    TRAINS t2;
    FILE *fp;
    fp=fopen("trains.txt","rb");
    fread(&t2,sizeof(TRAINS),1,fp);
    fclose(fp);
    int i=0;
    int t_sum;//临时保存一个车次的站数
    printf("******下面是车次信息*********n");
    printf("序号:   车次      始发站       终点站       发车时间n");
    for (i=1; i<=t2.all_sum; i++)
    {
        t_sum=t2.all_t[i].sum;
        printf("%2d    %5s     %-12s%-12s   %sn",
               i,
               t2.all_t[i].name,
               t2.all_t[i].t[1].name,
               t2.all_t[i].t[t_sum].name,
               t2.all_t[i].t[1].time);
    }
}
void find_t()
{
    char s[10];
    char e[10];
    printf("请输入出发站和终点站:n");
    scanf("%s %s",s,e);
    TRAINS t_t;
    int i,j;
    int s_i=0;
    int s_j=0;
    FILE *fp;
    int count=1;
    fp=fopen("trains.txt", "rb");
    printf("序号  车次  上车时间  下车时间  余票  价格n");
    if(fp!=NULL)
    {
        fread(&t_t, sizeof(TRAINS), 1, fp);
        fclose(fp);
    }
    for (i=1; i<=t_t.all_sum; i++)//列车车次
    {
        for (j=1; j<=t_t.all_t[i].sum; j++)//列车的站
        {
            if(strcmp(s,t_t.all_t[i].t[j].name)==0)//始发站
            {
                s_i=j;
            }
            if (strcmp(e,t_t.all_t[i].t[j].name)==0) {//终点站
                s_j=j;
            }
            if (s_i<s_j)
            {
                printf("%-2d   %-6s  %-6s  %-6s %-4d %.2fn",
                       count,//序号
                       t_t.all_t[i].name,//车次
                       t_t.all_t[i].t[s_i].time,//上车时间
                       t_t.all_t[i].t[s_j].time,//下车时间
                       t_t.all_t[i].pos[s_i][s_j],
                       t_t.all_t[i].t[s_j].price-t_t.all_t[i].t[s_i].price);//价格
                s_i=s_j=0;
                break;
            }
        }
        count++;
    }
    if (count==1) {
        printf("该区间内没有满足条件的车次n");
    }
}
void find_t2()
{
    TRAINS t_t;
    char train_name[10];
    printf("请输入车次:n");
    scanf("%s",train_name);
    int i,j=0;
    int flag=0;
    FILE *fp;
    fp=fopen("trains.txt", "rb");
    fread(&t_t, sizeof(TRAINS), 1, fp);
    fclose(fp);
    for (i=1; i<=t_t.all_sum; i++) {
        if (strcmp(train_name,t_t.all_t[i].name)==0)
        {
            flag=1;
            printf("列车次%s信息如下:n",t_t.all_t[i].name);
            printf("序号    站名      时间     价钱n");
            for (j=1; jt_sum[L_F.load_usr->has_booked].t_name);
        fp=fopen("trains.txt", "rb");
        if (fp==NULL) {
            printf("文件打开错误.n");
            exit(0);
        }
         fread(&t_t, sizeof(TRAINS), 1, fp);
         fclose(fp);
         for (i=1; it_sum[L_F.load_usr->has_booked].t_name,t_t.all_t[i].name)==0)
           {
             printf("请输入你的乘车区间起始站和终点站:n");
             scanf("%s %s",L_F.load_usr->t_sum[L_F.load_usr->has_booked].s_to_e.s_station,
                 L_F.load_usr->t_sum[L_F.load_usr->has_booked].s_to_e.e_station);
              for (j=1; jt_sum[L_F.load_usr->has_booked].s_to_e.s_station,t_t.all_t[i].t[j].name)==0)//始发站
                  {
                      s_i=j;
                  }
                  if (strcmp(L_F.load_usr->t_sum[L_F.load_usr->has_booked].s_to_e.e_station,t_t.all_t[i].t[j].name)==0) {//终点站
                      s_j=j;
                  }
                  if (s_i < s_j)
                  {
                      if (t_t.all_t[i].pos[s_i][s_j]t_sum[L_F.load_usr->has_booked].price=
                      t_t.all_t[i].t[s_j].price-t_t.all_t[i].t[s_i].price;
                      
                      pos_num=rand()%100+1;
                      srand((unsigned)time(NULL));
                      while (!(check_if_sell(t_t.all_t[i].pos_num,pos_num,100-t_t.all_t[i].pos[s_i][s_j]))) {
                          pos_num=rand()%100+1;
                      }
                      L_F.load_usr->t_sum[L_F.load_usr->has_booked].p_pos=pos_num;
                      
                      //随机生成一个不重复的座位号
                      update_ticket(t_t.all_t[i].pos,s_i,s_j);//更新余票的信息
                      if((fp=fopen("trains.txt", "wb"))!=NULL)
                      {
                          
                          fwrite(&t_t, sizeof(TRAINS), 1, fp);
                          fclose(fp);
                      }
                      printf("你已经订票成功,信息如下:n");
                      printf("车次    上车时间    下车时间    上车站    下车站   价格   座位号:n");
                      printf("%-4s  %-8s  %-8s %-8s  %-8s %.2f   %dn",
                             t_t.all_t[i].name,//车次
                             t_t.all_t[i].t[s_i].time,//上车时间
                             t_t.all_t[i].t[s_j].time,//下车时间
                             t_t.all_t[i].t[s_i].name,
                             t_t.all_t[i].t[s_j].name,
                             t_t.all_t[i].t[s_j].price-t_t.all_t[i].t[s_i].price,
                             L_F.load_usr->t_sum[L_F.load_usr->has_booked].p_pos);//价格
                      L_F.load_usr->has_booked++;
                      fp=fopen(L_F.load_usr->name, "wb");
                      fwrite(L_F.load_usr, sizeof(usr), 1, fp);
                      fclose(fp);
                      return;
                  }
              }
           }
         }
        printf("你输入的车次不存在n.");
        
    }
}
void show_booked()
{
    int i=0;
    usr *t_t=L_F.load_usr;
    FILE *fp=NULL;
    if((fp=fopen(t_t->name, "rb"))!=NULL)
    {
        fread(t_t,sizeof(usr), 1, fp);
        fclose(fp);
        printf("你已经订票成功,信息如下:n");
        printf("车次  上车站  下车站  价格  座位号:n");
        for (i=0; ihas_booked; i++) {
            printf("%-4s %-12s %-12s %.2f %dn",
                t_t->t_sum[i].t_name,//车次
                t_t->t_sum[i].s_to_e.s_station, //上车站
                t_t->t_sum[i].s_to_e.e_station,//下车站
                t_t->t_sum[i].price,
                t_t->t_sum[i].p_pos);
        }
    }
}
void init_pos(int a[][13])//初始化列车的座位
{
    int i,j=1;
    for (i=1; i<=12; i++) {
        for (j=i+1; j<=12; j++) {
            a[i][j]=100;
        }
    }
}
//用一个二维数组表示各个站点间票数,a[i][j]表示i站到j站所在的票数还有a[i][j]张
void update_ticket(int a[][13],int index_i,int index_j)
{
    int i,j=1;
    for (i=1; i<=12; i++) {
        for (j=i+1; j<=12; j++) {//除了车的出发站到订票的起始站或者下车站到终点站的车站票数都要-1
            if (!(j=index_j)) {
                a[i][j]--;
            }
        }
    }
}
int check_if_sell(int *a,int b,int has_sell)
{
    int i=0;
    for (i=1; i<=has_sell; i++) {
        if (a[i]==b) {
            return 0;
        }
    }
    return 1;
}


//  ticket_data.h
//  TrainTicketSystem
//
//  Created by xiaobai on 15/7/22.
//  Copyright (c) 2015年 xiaobaiyige. All rights reserved.
//
#ifndef __TrainTicketSystem__ticket_data__
#define __TrainTicketSystem__ticket_data__
#include#include#include#includetypedef struct
{
    char s_station[15];//起始站
    char e_station[15];//终点站
}s_e;
typedef struct
{
    char t_name[10];
    double price;//车票价格
    int p_pos;//座位号
    s_e s_to_e;//始发站和终点站
}ticket;//车票结构体
typedef struct
{
    char time[10];//到本站的时间
    double price;//始发站到本站的价格
    char name[18];//本站的名字
}station_one;
typedef struct
{
    int sum;//车站的数目
    char name[10];//车次的名字
    station_one t[12];
    int pos[13][13];
    int pos_num[100];//保存座位的编号
    
}TRAIN;
typedef struct
{
    TRAIN all_t[10];
    int all_sum;
}TRAINS;
typedef struct
{
    char name[20];//账号
    char pass[20];//密码
    ticket t_sum[10];//车票相关的
    int has_booked;
}usr;//用户结构体
typedef struct
{
    int flag;
    usr*load_usr;
}LOAD_FLAG;
int check_account(char *str_name);
void usr_regester();//新用户注册函数
int show_main_menu(int last);//主菜单
int usr_load();//用户登录
void system_init();//系统初始化
void back_manage();//后台管理
void show_train();//查看所有的列车车次
void book_ticket();//订票
void find_t2();//查找某一个车次的乘车信息
void find_t();//根据区间查找车次
void show_booked();//显示已经订购的车次信息
void update_ticket(int a[][13],int index_i,int index_j);//更新车票信息
void init_pos(int a[][13]);//初始化列车的座位
int check_if_sell(int *a,int b,int has_sell);//检查b号座位是否已经卖出
#endif /* defined(__TrainTicketSystem__ticket_data__) */










本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

业内消息,台积电在近日举行的 2024 年欧洲技术论坛上再次确认,其德国晶圆厂项目定于今年四季度开始建设,预估 2027 年投产。

关键字: 台积电 晶圆厂

业内消息,日前美国移动、视频和人工智能技术公司InterDigital宣布,由于联想(包括摩托罗拉移动)侵犯其4G和5G设备专利,已获得德国慕尼黑地区法院对于联想的禁令。这也意味着联想支持4G/5G网络的设备(包含手机、...

关键字: 联想 4G 5G

业内消息,特斯拉近日又损失了一位自动驾驶领域的顶尖 AI 工程师 ——Paril Jain,Jain 此前担任特斯拉人工智能团队的“规划、模仿学习和强化学习”部门的技术负责人。他的离职正值特斯拉大规模裁员以及员工士气低迷...

关键字: 自动驾驶 特斯拉 AI工程师

业内消息,近日求职平台脉脉高聘人才智库发布的《2024春招高薪职业和人才洞察》报告显示,抖音、亚⻢逊、大疆霸榜高薪公司,岗位平均薪资超5万元(月薪)。

关键字: 抖音 华为 亚马逊 大疆 商汤科技

业内消息,日前微软官方宣布与量子计算公司Quantinuum的深度合作取得了显著成果。在实验中成功完成了多达14000次无错误的量子计算操作,这一成就不仅刷新了量子计算错误率的纪录,而且将错误率降低了800倍,为量子计算...

关键字: 微软 量子计算 突破

国际货币基金组织(IMF)总裁克里斯塔利娜・格奥尔基耶娃(Kristalina Georgieva)日前表示,AI正在像“海啸”一样冲击着全球劳动力市场。

关键字: IMF AI 劳动力市场 GPT-4o

助力科研与检测新突破 上海2024年5月15日 /美通社/ -- 全球知名的科学仪器和服务提供商珀金埃尔默公司今日在上海举办了主题为"创新不止,探索无界"的新品发布会,集中展示了其在分析仪器领域的最...

关键字: 质谱仪 BSP DSC 气相色谱

深圳2024年5月15日 /美通社/ -- 近日,国际公认的测试、检验和认证机构SGS(以下简称为"SGS")为雅特力科技颁发AEC-Q100认证证书以及IEC 60730认证证书。获得AEC-Q10...

关键字: AEC-Q100 力科 AT32 测试

广州2024年5月16日 /美通社/ -- 为全面推动昆明市公共领域车辆电动化,在昆明市发展和改革委员会的牵头组织下,昆明配售电有限公司、昆明低碳投资集团有限公司、昆明空投城...

关键字: 电动化 电站 新能源汽车 电网

借助面板,用户在思考和创作时只需轻捏Apple Pencil Pro,即可调用基本工具和命令,避免因繁琐的操作分散注意力 适用于钢笔的动态墨水可根据Apple Pencil Pro的旋转调节墨水流量,让数字化...

关键字: APPLE PENCIL NOTES GO
关闭
关闭