精华内容
下载资源
问答
  • 火车订票系统: 实现了登录注册、订票、查询、退票、等基本功能!
  • 火车订票系统带有数据库文件,源代码,课程设计报告,功能包括用户注册,用户登录,用户根据需要进行查询车票,下单订票,退订车票,改签车票功能,在列车购买商品(矿泉水零食等)
  • 火车订票系统课程设计 此概要设计说明书是为了说明整个系统的体系架构为系统的详细设计人员进行详细设计时的输入参考文档。 该项目的读者主要有:程序员、数据库设计人员、系统分析员、软件测试人员
  • 火车售票系统课程设计

    千次阅读 多人点赞 2020-07-14 15:53:26
    火车站售票系统课程设计 一、课题内容和要求 设计目标:设计一个火车售票系统,用C语言实现。对该系统的要求如下: (1) 需求描述: 一、系统角色: 1.火车站售票员: 火车站售票员能够使用本系统完成基本的车票销售...

    火车站售票系统课程设计

    一、课题内容和要求
    设计目标:设计一个火车售票系统,用C语言实现。对该系统的要求如下:
    (1) 需求描述:
    一、系统角色:
    1.火车站售票员:
    火车站售票员能够使用本系统完成基本的车票销售过程及销售记录统计过程。

    1)车票销售过程
    (1)售票
    (2)退票
    (3)换票
    3)销售记录统计

    2.系统管理员
    能够添加、删除和修改系统用户(火车站售票员),设置用户权限。包括
    1)添加新用户
    2)删除用户
    3)修改用户权限

    二、系统流程描述:
    系统启动则进入登陆菜单。
    1.登陆流程
    (1)程序运行,显示登陆界面,请用户输入角色、账号及密码。
    (2)用户输入账号密码后,系统校验正确与否,正确则进入功能菜单。错误则提示输入错误,继续显示登陆界面。

    2.火车站售票员使用流程描述:
    1)主界面:
    火车站售票员登陆成功后,系统显示功能菜单:

    1. 车票销售
      2.销售记录统计
      3.退出”。
      2)票务管理
      (1)售票员在主界面输入数字1,系统进入票务管理界面,显示功能菜单:
      “1. 录入火车时刻信息
    2. 查询火车时刻信息
    3. 统计火车车次
      4.退出”。
      (2)火车站售票员在票务管理界面输入数字1.进入录入火车时刻信息界面,提示售票员输入车次信息,包括车次、日期、起点、终点、开车时间、到达时间、票价等。
      (3)火车站售票员在票务管理界面输入数字2.进入查询火车时刻信息界面,提示售票员输入查询方式,包括:
      1.按照车次查询
      2.按终点查询
      3.按起点查询
      4.按终点和日期查询。售票员输入查询方式及相关信息后,系统能够按照指定的查询方式显示所需信息。
      (4)火车站售票员在票务管理界面输入数字3.进入统计火车车次界面,提示售票员输入统计方式:
      1.按起点统计车次
      2.按终点统计车次。
      售票员选择统计方式后,系统输出搜索到的车次数。
      火车站售票员在票务管理界面输入数字4.退出票务管理界面,回到主界面。
      3)车票销售
      (1)售票员在主界面输入数字2,系统进入车票销售界面,包括:1.售票 2.退票 3.换票 4.退出
      (2)售票员在车票销售界面输入1.进入售票界面,系统提示售票员输入起点站、终点站、所需车票的日期、需要几张票。售票员输入信息后,系统打印符合条件的记录,包括:起点、终点、日期、发车时间、到达时间、单价及剩余票数。如票数不足则提示票数不足并返回主界面。如票数足够则提示是否确认售票,售票员选择确认后,系统保存售票信息并打印所售车票的信息。
      (3)售票员在车票销售界面输入数字2,系统进入退票界面,提示售票员输入需要退票的起点、终点、日期、发车时间、车次及需要退票数。售票员输入完成后系统打印应返还给客户的总金额。
      (4)售票员在车票销售界面输入数字3,系统进入换票界面,提示售票员输入原车票的起点、终点、日期、发车时间、车次。售票员输入完成后,系统提示售票员输入更换后的车票的起点、终点、日期、发车时间、车次及需要换票数。输入完成后,系统更新售票记录,提示换票成功,并打印更换后的车票信息。
      (5)退出
      售票员选择退出,则系统返回到主界面。
      4)销售记录统计
      售票员在主界面输入数字3,系统进入销售记录统计界面,显示当前共售出的车票信息及总销售额以及当前未售出的车票信息。
      (1)退出
      售票员在主界面输入数字4,则系统返回到登录界面。
      5).系统管理员使用流程
      (1)主界面:
      管理员登陆成功后,系统显示功能菜单:“1.用户资料打印 2.添加用户 3.删除用户 4.修改用户权限 5退出”
      (2)用户资料打印:
      管理员选择用户资料打印功能,则进入用户资料打印界面,提示管理员输入用户账号,管理员输入后,系统打印该用户的账号、密码、角色、权限等信息。
      3)添加用户
      管理员选择添加用户功能,则进入添加用户界面,提示管理员输入用户账号和初始密码。管理员输入后,系统打印该用户相关信息并返回主界面。
      4)删除用户
      管理员选择删除用户功能,则进入删除用户界面,提示管理员输入要删除的用户账号。管理员输入后,系统提示已删除该用户信息并返回主界面。
      5)修改用户权限
      管理员选择修改用户权限功能,则进入修改用户权限界面,提示管理员输入要修改的用户账号。管理员输入后,系统打印该用户的权限,并提示管理员输入要修改后的权限,管理员输入后,系统打印该用户的信息并返回主界面。
      6)退出管理员选择退出,则系统返回到登陆界面。

    二、需求分析
    系统主界面应有以下功能选项
    1.录入火车时刻信息
    2.查询火车时刻信息
    3.统计火车车次
    4.退出

    (1)火车时刻信息录入。包括车次、日期、起点、终点、开车时间、到达时间、票价。数据存入数据文件hchsk.dat或hchsk.txt中。
    (2)火车时刻信息查询。
    按照车次查询
    按终点查询
    按起点查询
    按终点和日期查询
    (3)统计
    按终点统计每日的车次数
    按起点统计每日的车次数

    三、 概要设计及源代码
    void sell(); //售票函数
    void back(); //退票
    void change(); //换票
    void shoupiaoyuan(); //售票员

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<windows.h>
    struct trian
    {
    char name[10];
    char qs[20];
    char zd[20];
    char date[20];
    char time1[20];
    char time2[20];
    int price;
    int num;
    }ticket[90];
    void sell()//售票函数
    {
    time_t now;
    now=time_t(NULL);
    char s1[128],s2[128],s3[128],s4[128];
    char a;
    FILE fp;
    int i,len,t,n,m=1;
    fp=fopen(“D:\票.txt”,“rb”);
    if(fp==NULL)
    {
    printf(“Open Error!\n”);
    return ;
    }
    for(i=0;!feof(fp);i++) //读取文件信息,逐条读出,没有时结束
    fread(&ticket[i],sizeof(struct trian),1,fp);
    len=i-1;
    printf(“请输入出发地(全拼): “);
    scanf(”%s”,s1);
    printf(“请输入目的地(全拼): “);
    scanf(”%s”,s2);
    for(i=0;i<len;i++)
    {
    if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0)//若输入的字符串符合条件,输出符合条件的语句
    {
    printf("%-10s %-10s %-10s %-10s %-10s %-10s %3d\n",ticket[i].name,ticket[i].qs,ticket[i].zd,ticket[i].date,ticket[i].time1,
    ticket[i].time2,ticket[i].price);
    m=0; //若输入的字符串在文件能找到 m=0
    }
    }
    if(m!=0)//输入的字符串在文件没找到
    {
    printf(“输入错误!\n按任意键继续…\n”);
    a=getchar();
    system(“cls”);//输入错误时,重新输入,清屏一次
    return ;
    }m=1;
    printf(“请输入所需票的日期:\n”);
    scanf("%s",s3);
    for(i=0;i<len;i++)
    {
    if((strcmp(ticket[i].qs,s1)==0)&&(strcmp(ticket[i].zd,s2)==0)&&(strcmp(ticket[i].date,s3)==0))
    {
    printf("%-10s %-10s %-10s %-10s %-10s %-10s %3d\n",ticket[i].name,ticket[i].qs,ticket[i].zd,ticket[i].date,ticket[i].time1,ticket[i].time2,ticket[i].price);
    m=0;
    }
    }
    if(m!=0)
    {
    printf(“输入错误!\n按任意键继续…\n”);
    a=getchar();
    return ;
    }
    m=1;
    printf(“请输入车次:”);
    scanf("%s",&s4);
    printf(“请输入买票张数: “);
    scanf(”%d”,&n);
    for(i=0;i<len;i++)
    {
    if((strcmp(ticket[i].qs,s1)==0)&&(strcmp(ticket[i].zd,s2)==0)&&(strcmp(ticket[i].date,s3)==0)&&(strcmp(ticket[i].name,s4)0))
    { //买票成功,这文件中的票数需要修改,将卖的票数减去,程序结束时将剩余张数重新写入文件
    ticket[i].num=ticket[i].num-n;
    t=i;
    m=0;
    }
    }
    if(strcmp(ticket[i].name,s4)!=0)//每输入一次就判断输入是否正确,
    {
    printf(“输入错误!\n”);
    printf(“按任意键继续…”);
    a=getchar();
    return ;
    }
    for(i=0;i<n;i++)
    {
    printf("%-10s %-10s %-10s %-10s %-10s %-10s %3d %3d\n",ticket[t].name,ticket[t].qs,ticket[t].zd,ticket[t].date,
    ticket[t].time1,ticket[t].time2,ticket[t].price,ticket[t].num+n-i);
    printf("%s\n",time_t(&now));
    }
    printf(“该票剩余数:%2d\n”,ticket[t].num);
    if(ticket[t].num<0)
    {
    printf(“无票\n”);
    }
    else
    {
    printf(“购票成功!\n”);
    }
    printf(“按任意键继续…”);
    a=getchar();
    system(“cls”);
    fclose(fp);
    fp=fopen(“D:\票.txt”,“wb”);
    for(i=0;i<len;i++)
    {
    fwrite(&ticket[i],sizeof(struct trian),1,fp);
    }
    fclose(fp);
    }
    void back() //退票
    {
    char s1[128],s2[128],s3[128],s4[128];
    char a;
    FILE *fp;
    int i,len,t,n,m=1;
    double money;
    fp=fopen(“D:\票.txt”,“rb”);
    if(fp
    NULL)
    {
    printf(“Open Error!\n”);
    return ;
    }
    for(i=0;!feof(fp);i++)
    {
    fread(&ticket[i],sizeof(struct trian),1,fp);
    }
    len=i-1;
    printf(“请输入要退票的出发地(全拼):”);
    scanf("%s",&s1);
    printf(“请输入要退票的目的地(全拼):”);
    scanf("%s",&s2);
    for(i=0;i<len;i++)
    {
    if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0)
    {
    m=0;
    }
    }
    if(m!=0)
    {
    printf(“输入错误!\n”);
    printf(“按任意键继续…”);
    a=getchar();
    system(“cls”);
    return ;
    }
    m=1;
    printf(“请输入所退票的日期:”);
    scanf("%s",&s3);
    for(i=0;i<len;i++)
    {
    if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0&&strcmp(ticket[i].date,s3)==0)
    m=0;
    }
    if(m!=0)
    {
    printf(“输入错误!\n”);
    printf(“按任意键继续…”);
    a=getchar();
    system(“cls”);
    return ;
    }
    m=1;
    printf(“请输入车次:”);
    scanf("%s",&s4);
    for(i=0;i<len;i++)
    {
    if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0&&strcmp(ticket[i].date,s3)==0&&strcmp(ticket[i].name,s4)==0)
    m=0;
    }
    if(m!=0)
    {
    printf(“输入错误!\n”);
    printf(“按任意键继续…”);
    a=getchar();
    system(“cls”);
    return ;
    }
    m=1;
    printf(“请输入退票的张数:”);
    scanf("%d",&n);
    for(i=0;i<len;i++)
    {
    if(strcmp(ticket[i].qs,s1)==0&&strcmp(ticket[i].zd,s2)==0&&strcmp(ticket[i].date,s3)0&&strcmp(ticket[i].name,s4)0)
    {
    ticket[i].num=ticket[i].num+n;
    t=i;
    m=0;
    }
    }
    if(m!=0)
    {
    printf(“输入错误!\n”);
    printf(“按任意键继续…”);
    a=getchar();
    system(“cls”);
    return ;
    }
    m=1;
    fclose(fp);
    fp=fopen(“D:\票.txt”,“wb”);
    for(i=0;i<len;i++)
    {
    fwrite(&ticket[i],sizeof(struct trian),1,fp);
    }
    fclose(fp);
    printf(“退票成功!\n按任意键继续…”);
    a=getchar();
    system(“cls”);
    }
    void change()
    {
    back();
    sell();
    }
    void shoupiaoyuan()
    {
    char key[128], key1[128], id[128]=“2”, id1[128];
    FILE *fp;
    fp=fopen(“D:\secret.txt”,“wb”); //第一次输入售票员密码,并将密码写进文件
    if(fp
    NULL)
    {
    printf(“Open Error!\n”);
    return ;
    }
    char s[128]=“2”;
    fprintf(fp,"%s",s);
    fclose(fp);
    ///初始化密码,也可用于一键还原
    fp=fopen(“D:\secret.txt”,“rb”);
    if(fp
    NULL)
    {
    printf(“Open Error!\n”);
    return ;
    }
    fprintf(fp,"%s",key);
    int flag=1;
    int n,i=0;
    printf("\t\t\t
    ******************售 票 员*********************\n");
    printf(“请输入工号:”);
    scanf("%s",id1);
    printf(“请输入密码:”);
    while(1) //密码出入处理,出入字符,输出“
    ”号
    {
    key1[i]=getchar();
    if(key1[i]==13)
    break;
    putchar(’
    ’);
    i++;
    }
    key1[i]=’\0’;
    printf("\n");
    system(“cls”); //输入密码清屏一次
    if(strcmp(id1,id)==0 && strcmp(key1,key)0)
    {
    printf("\t\t\t*********************welcome*********************\n");
    while(flag
    1) //flag标记,用于实现循环
    {
    printf(“请选择操作:\n 1:售票\n 2:换票\n 3:退票\n 4:退出\n”);
    scanf("%d",&n);
    switch(n)
    {
    case 1:sell();break;
    case 2:change();break;
    case 3:back();break;
    case 4:flag=0;break;
    default:printf(“输入错误,请重新输入!\n”);
    }
    }
    }
    else
    printf(“登陆错误,请重新输入!\n”);
    system(“cls”);
    fclose(fp);
    }
    void main()
    {

    int n,t=0;
    while(t==0)
    {
    	printf("*****************************车 站 售 票 系 统******************************\n");
    	printf("*****************************选 择 用 户 类 型******************************\n");
    	scanf("%d",&n);
    	system("cls");
    	switch(n)
    	{
    	case 1:shoupiaoyuan();break;
    	case 2:t=1;break;
    	default:printf("输入错误!!!\n");
    	}
    }
    

    }
    四、详细设计售票员的总体框架图如下:

    说明:售票员的程序中也包括了五个部分,分为登录,售票,退票,换票和以及退出操作,前面的四个部分是基本操作,能够对原文件进行操作的程序,同样是退到主菜单的操作,每次基本操作玩了之后,又会自动转到售票员的主页面去,而退出和以上的管理员的是一样的,自动退到主菜单。

    五、测试与分析(如图)


    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    六、课程设计总结(程序设计实践过程的收获、遇到问题解决问题过程的思考、程序调试能力的思考、心得);
    遇到问题及解决问题 :
    在开始时从机房拷回家后总是不能运行,后来发现是文件打开的途径不对,经过几次的教训,就把途径不变,把票文件,密码文件,secret文件写到了D盘根目录里去,省去了很多不必要的工作量。
    在修改密码时老是不能把新密码写入文件,结果改过来还是不能运行,经过仔细的查看程序发现了问题,最终增加了写入文件。
    还有在写程序的过程中,每次都会遇到打开文件,则我们会用复制粘贴,而忘记了更改读或写的方式,因此在每次复制粘贴之后必须看一下有没有要更改的,有的话一定要及时更改过来,不然到最后程序大了,则会增加工作量。

    收获:
    拓展我们的知识层面,将我们C语言编写的功能进一步深入,可能我们知识有限,不能成功完成任务,我们可以通过自己看书以及求助同学来完成任务。
    基本上用到了我们所学的所有知识,在大作业的过程中,翻过好几次书,书上的
    很多知识都用到了,还有在大作业中团结协作是很重要的,

    程序调试能力的思考:
    1、 良好的编码习惯,良好的逻辑结构能力,对Bug的预见能力。一个成熟的程序员,应该有一个良好的编程习惯,不仅需要有良好的编码格式规范,更为需要的是对于程序中的逻辑实现时候有一种良好的结构。
    2、 编码过程中的调试跟踪和错误定位能力。这个能力主要就是在开发过程中,当自己在Build程序,Run起来以后,竟然发生了Bug或者是Memory Leak,这时候就需要你使用各种工具进行调试跟踪了

    结论(课程设计心得);
    C语言大作业是团体合作共同完成的一项任务,合作者之间的交流很重要,如果编程者只是为了完成自己的任务而独自编写,各模块进行整合的时候,可能会出现相当大的差异,而且编程者可能出于坚持各自的想法,而使任务在规定时间内无法完成。
    在平时学习C语言时,注意知识的全面性,C语言大作业所需的知识相当全面,所以平时的积累也是相当重要的。
    在团体编写程序过程中,我们自身也应具备相当多的素质:我们肯下功夫,有恒心,有毅力的精神,在完成C语言的过程中往往有的错误不是一眼就能看出来的,我们要善于思考,而且思考的要尽量全面。第一,我们要完成自己所需要完成的模块,在完成过程可能会出现很多麻烦的错误,在自己努力修改后还是没能修改出来时,我们应积极讨论,不应放弃,询问合作者,如果两人都无法修改的话,就想老师求助。在模块整合时,往往会出现相当多的问题,每个人有每个人的设计理念,可能想法上会发生分歧,这时我们应冷静的交流,取最佳的想法,实现模块的成功整合。可能同一组的成员之间编写C语言的能力有差异,优秀的人在完成自己任务后也应辅导帮助其他人完成他们的任务,C语言大作业,完成的好坏不是靠个人的力量,是集体。而且在评价C语言大作业时,也不是拿出个人的模块来评价,也是直接评价这个组队完成的情况。

    展开全文
  • 售票信息:身份证号,姓名,出发日期,车次,出发站,到达站等; 系统能完成以下功能: (1)录入信息用文件保存; (2)能完成对火车票信息的录入、修改和删除; (3)能进行各种信息的查询。
  • C++课程设计--火车售票系统设计(MFC)

    千次阅读 多人点赞 2020-01-13 13:38:09
    火车售票系统设计 课设要求 用户管理 车票信息的录入、修改和删除 根据不同需求对车票信息进行浏览、查询 购票业务管理 退票管理 按车次统计售票数量 按车次查询车票余量 车票信息的导入和导出 程序运行界面 ...

    课设题目

    火车票售票系统设计

    课设要求

    1. 用户管理
    2. 车票信息的录入、修改和删除
    3. 根据不同需求对车票信息进行浏览、查询
    4. 购票业务管理
    5. 退票管理
    6. 按车次统计售票数量
    7. 按车次查询车票余量
    8. 车票信息的导入和导出

    程序运行界面

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    核心代码

    // pay.cpp : implementation file
    //
    
    #include "stdafx.h"
    #include "火车票售票系统.h"
    #include "pay.h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /
    // pay dialog
    
    class Studentx{
    public:
    	CString phone;
    	CString name;
    
    };
    
    vector <Studentx>stu;
    int m=-1;
    pay::pay(CWnd* pParent /*=NULL*/)
    	: CDialog(pay::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(pay)
    	//}}AFX_DATA_INIT
    }
    
    
    void pay::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(pay)
    	DDX_Control(pDX, IDC_LIST2, m_list);
    	DDX_Control(pDX, IDC_COMBO1, m_name);
    	DDX_Control(pDX, IDC_LIST1, m_pay);
    	//}}AFX_DATA_MAP
    }
    
    
    BEGIN_MESSAGE_MAP(pay, CDialog)
    	//{{AFX_MSG_MAP(pay)
    	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
    	ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
    	ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
    	ON_BN_CLICKED(IDC_BUTTON10, OnButton10)
    	ON_BN_CLICKED(IDC_BUTTON8, OnButton8)
    	ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
    	ON_BN_CLICKED(IDC_BUTTON9, OnButton9)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /
    // pay message handlers
    BOOL pay::OnInitDialog() 
    {
    	CDialog::OnInitDialog();
    	
    	// TODO: Add extra initialization here
    	m_pay.InsertColumn(0,"车次",LVCFMT_CENTER,100);
    	m_pay.InsertColumn(1,"始发站",LVCFMT_CENTER,100);
    	m_pay.InsertColumn(2,"终点站",LVCFMT_CENTER,100);
    	m_pay.InsertColumn(3,"时间",LVCFMT_CENTER,100);
       	m_pay.InsertColumn(4,"余票数量",LVCFMT_CENTER,100);
    	m_pay.InsertColumn(5,"价格",LVCFMT_CENTER,95);
    	m_pay.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
    
    	m_list.InsertColumn(0,"姓名",LVCFMT_CENTER,100);
    	m_list.InsertColumn(1,"车次",LVCFMT_CENTER,95);
    	m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
     
    	showname();
    	ShowCai();
        show();
    	m_name.SetCurSel(0);
    //    m_flag.SetCurSel(0);
    	return TRUE;  // return TRUE unless you set the focus to a control
    	              // EXCEPTION: OCX Property Pages should return FALSE
    }
    void pay::showname()
    {
    	
    //	m_list.DeleteAllItems(); // 全部清空 	
    	ifstream fin("members.txt",ios_base::in); 
    	string a,b;
    	fin>>a>>b;
    	for(int i=0;!fin.fail();++i){
    
    		m_name.AddString(_T(a.data()));
           	rname=a.data();
    	
    		Studentx s1;
    		
    		s1.phone=a.data();
    		s1.name=b.data();
    		stu.reserve(stu.size()+1);//增加容量以防止溢出
    
    	stu.push_back(s1);
    	fin>>a>>b;
    	}
    	fin.close();
    }
    void pay::ShowCai()
    {
    	m_pay.DeleteAllItems();
    	int num=ReadCai();
    	for(int i=0;i<num;i++)
    	{
    		m_pay.InsertItem(i,0);
    		m_pay.SetItemText(i,0,cai[i].id);// 车次
    		m_pay.SetItemText(i,1,cai[i].name);// 始发站
    		m_pay.SetItemText(i,2,cai[i].type);// 终点站
    		m_pay.SetItemText(i,3,cai[i].price);// 时间
    		m_pay.SetItemText(i,4,cai[i].flag);// 余票
    		m_pay.SetItemText(i,5,cai[i].time);// 价格
    	}
    }
    
    int pay::ReadCai()
    {
    	
    	FILE *file=fopen("chepiao.txt","r");
    	int a=0;
    	while(!feof(file))
    	{
    		fscanf(file,"%s%s%s%s%s%s",&cai[a].id,&cai[a].name,&cai[a].type,&cai[a].price,&cai[a].flag,&cai[a].time);
    		a++;
    	}
    	fclose(file);
    	a--;
    	return a;
    }
    void pay::OnButton1() 
    {
    	// TODO: Add your control notification handler code here
    
    		CString id,name,type,price,flag,time;// flag为输入or支出
    
    	GetDlgItem(IDC_EDIT4)->GetWindowText(id);
    	GetDlgItem(IDC_EDIT5)->GetWindowText(name);
    	GetDlgItem(IDC_EDIT6)->GetWindowText(type);
    	GetDlgItem(IDC_EDIT7)->GetWindowText(price);
    	GetDlgItem(IDC_EDIT8)->GetWindowText(flag);
    	GetDlgItem(IDC_EDIT9)->GetWindowText(time);
    	
    	if(id==""||name==""||price==""||type==""||flag==""||time=="")
    	{
    		MessageBox("添加信息不能为空");
    		return;
    	}
    	
    	FILE *file=fopen("chepiao.txt","a+");
    	fprintf(file,"%s   %s   %s   %s   %s   %s\r\n",id,name,type,price,flag,time);
    	fclose(file);	
    	MessageBox("添加成功");
    	ShowCai();
    }
    
    void pay::OnButton3() 
    {
    CString txt_name;// 临时文件名
    	txt_name="chepiao.txt";
    	// TODO: Add your control notification handler code here
    
    		int sel = m_pay.GetSelectionMark();
    	if(sel ==-1)
    	{
    		MessageBox("请选择需要修改的车票!");
    	}
    	else
    	{
    	
    	CString id,name,type,price,flag,time;
    		GetDlgItem(IDC_EDIT4)->GetWindowText(id);
    	GetDlgItem(IDC_EDIT5)->GetWindowText(name);
    	GetDlgItem(IDC_EDIT6)->GetWindowText(type);
    	GetDlgItem(IDC_EDIT7)->GetWindowText(price);
    	GetDlgItem(IDC_EDIT8)->GetWindowText(flag);
    	GetDlgItem(IDC_EDIT9)->GetWindowText(time);
    	if(id==""||name==""||price==""||type==""||flag==""||time=="")
    	{
    		MessageBox("修改信息不能为空");
    		return;
    	}
    	int num=ReadCai();
    	FILE *file=fopen(txt_name,"w");	
    	for(int i=0;i<num;i++)
    	{
    		if(i==sel)
    		{
    			strcpy(cai[i].name,name);
    			strcpy(cai[i].type,type);
    			strcpy(cai[i].price,price);
                strcpy(cai[i].flag,flag);
    			strcpy(cai[i].id,id);
    			strcpy(cai[i].time,time);
    
    		}
    		fprintf(file,"%s   %s   %s   %s   %s   %s\r\n",cai[i].id,cai[i].name\
    			,cai[i].type,cai[i].price,cai[i].flag,cai[i].time);
    	}
    	fclose(file);
    
    	MessageBox("修改成功");
    	ShowCai();	
    	}
    	
    }
    
    void pay::OnButton5() 
    {
    CString txt_name;// 临时文件名
    	txt_name="chepiao.txt";
    
    	// TODO: Add your control notification handler code here
    	int sel = m_pay.GetSelectionMark();
    	if(sel ==-1)
    	{
    		MessageBox("请先选择需要删除的车票信息");
    	}
         else
    	 {
    	 
    	CString id=	m_pay.GetItemText(sel,0);
    	int num=ReadCai();
    	FILE *file=fopen(txt_name,"w+");
    
    	for(int i=0;i<num;i++)
    	{
    		if(strcmp(id,cai[i].id)==0)  
    			continue;
    		fprintf(file,"%s   %s   %s   %s   %s   %s\r\n",cai[i].id,cai[i].name\
    			,cai[i].type,cai[i].price,cai[i].flag,cai[i].time);
    	}
    	fclose(file);
    	MessageBox("删除成功","提示");
    	ShowCai();	 
    	 }
    	
    }
    
    void pay::OnButton6() 
    {
    	// TODO: Add your control notification handler code here
    	m_pay.DeleteAllItems();
    	CString id;
    	GetDlgItem(IDC_EDIT10)->GetWindowText(id);
    	if(id=="")
    	{
    		ShowCai();
    	}
    	else
    	{
    		int i = 0;
    		for(int a=0;a<ReadCai();a++)
    		{
    			if(strcmp(id,cai[a].id)==0)
    			{
    				
    				m_pay.InsertItem(i,0);
    				m_pay.SetItemText(i,0,cai[a].id);
    				m_pay.SetItemText(i,1,cai[a].name);
    				m_pay.SetItemText(i,2,cai[a].type);
    				m_pay.SetItemText(i,3,cai[a].price);
    				m_pay.SetItemText(i,4,cai[a].flag);
    				m_pay.SetItemText(i,5,cai[a].time);
    				i++;
    			}
    		}
    	}	
    }
    
    void pay::OnButton10() 
    {
    	// TODO: Add your control notification handler code here
    	
    	int sel = m_pay.GetSelectionMark();
    	if(sel ==-1)
    	{
    		MessageBox("请选择需要购票的车次!");
    	}
    	else
    	{
    	 
        // 将此购票信息存入buy.txt
    	FILE *file=fopen("buy.txt","a+");
    	fprintf(file,"%s   %s\r\n",rname,m_pay.GetItemText(sel,0));
    	fclose(file);	
      
    	// 修改余票数量
    	int num=ReadCai();
    	FILE *filex=fopen("chepiao.txt","w");	
    	for(int i=0;i<num;i++)
    	{
    		if(i==sel)
    		{
    			
    int port = _ttoi(m_pay.GetItemText(sel,4)); //转化成10进制;
    port=port-1;
    CString x;
    x.Format("%d",port);
    		    strcpy(cai[i].flag,x);
    		}
    		fprintf(filex,"%s   %s   %s   %s   %s   %s\r\n",cai[i].id,cai[i].name\
    			,cai[i].type,cai[i].price,cai[i].flag,cai[i].time);
    	}
    	fclose(file);
    	
    	
    	show();
    		ShowCai();
    	MessageBox("办理成功");
    
    	}
    
    
    }
    
    void pay::show()
    {
    	m_list.DeleteAllItems();
    	int num=readnum();
    	for(int i=0;i<num;i++)
    	{
    		m_list.InsertItem(i,0);
    		m_list.SetItemText(i,0,caix[i].id);// 车次
    		m_list.SetItemText(i,1,caix[i].name);// 始发站
    	
    	}
    }
    
    int pay::readnum()
    {
    
    	
    	FILE *file=fopen("buy.txt","r");
    	int a=0;
    	while(!feof(file))
    	{
    		fscanf(file,"%s%s",&caix[a].id,&caix[a].name);
    		a++;
    	}
    	fclose(file);
    	a--;
    	return a;
    }
    
    void pay::OnButton8() 
    {
    	// TODO: Add your control notification handler code here
    		CString str; //获取车次
    	GetDlgItem(IDC_EDIT3)->GetWindowText(str);
    
    
    
    	FILE *file=fopen("buy.txt","r");
    	int a=0;
    	char x0[20];
    	char x1[20];
    
    	float count=0;
    	
    	while(!feof(file))
    	{
    		fscanf(file,"%s%s",&x0,&x1);
    		if(strcmp(x1,str)==0)
    		{
    		
    			count++;		
    		}
    	}
    	fclose(file);
    
    	CString aaa;
    	aaa.Format("当前车次售票张数为:%f",count-1);
    
    	MessageBox(aaa);
    }
    
    void pay::OnButton7() 
    {
    	// TODO: Add your control notification handler code here
    		int sel = m_list.GetSelectionMark();
    	if(sel ==-1)
    	{
    		MessageBox("请选择需要退票的车次!");
    	}
    	else
    	{
    
    		// 删除buy.tex中的已购买车票
    	int num=readnum();
    	FILE *file=fopen("buy.txt","w+");
    
    	for(int i=0;i<num;i++)
    	{
    		if(i==sel)  
    			continue;
    		fprintf(file,"%s   %s\r\n",caix[i].id,caix[i].name);
    	}
    	fclose(file);
    
    
    	MessageBox("删除成功","提示");
    	ShowCai();
    	show();
    	
    	
    	}
    }
    
    void pay::OnButton9() 
    {
    	// TODO: Add your control notification handler code here
    		int index = m_name.GetCurSel();
     CString str_name;  
      CString strI;  
       m_name.GetLBText(index,str_name); 
       rname=str_name;
     MessageBox("用户切换成功","提示");
    	
    }
    
    

    项目源码

    需要源码的小伙伴请前往
    微信公众号:海轰Pro
    回复: 海轰
    O(∩_∩)O哈哈~

    展开全文
  • (2)创建子程序,分别实现添加火车票信息、显示火车票信息、火车票查询、获取系统时间、订票、退票、保存个人车票信息、显示个人车票信息等功能。 (3)创建主程序,将各个子程序有效紧密的链接起来,以实现系统...
  • C语言课程设计火车订票系统实现

    万次阅读 多人点赞 2019-03-16 22:12:40
    课程设计火车订票系统 头文件及宏定义说明。 #include&amp;amp;quot;stdio.h&amp;amp;quot; #include&amp;amp;quot;conio.h&amp;amp;quot; #include&amp;amp;quot;string.h&amp;...

    课程设计之火车订票系统

    1. 头文件及宏定义说明。
    #include"stdio.h"
    #include"conio.h"
    #include"string.h"
    #include"time.h"
    #include"stdlib.h"
    #define STR_LEN  30
    #define MAX 50
    

    2.定义结构体,确保信息标准录入。
    (1)列车结构(包括列车车站号、车票起点、车票终点、出发时间、到达时间、票价、票数等基本信息)

    typedef struct train{
    	int stationId; //车站号
    	char from[STR_LEN]; //车票起点
    	char to[STR_LEN]; //车票终点
        char stime[16];//出发时间
        char rtime[16];//到达时间
    	int money; //票价
    	int ticket;//票数
    }Train;
    

    (2)用户结构体(包括用户姓名、身份证号、用户电话、用户所购列车号、订单号)

    typedef struct user{
    	char name[MAX];//用户姓名 
    	char id[MAX];//身份证号 
    	char tele_num[MAX];//用户电话 
    	int t_id;//用户所购的列车号 
    	int order_no;//订单编号 
    }User;
    
    

    (3)结构体指针定义,实现串联节点。

    typedef struct node  //定义列车节点 
    {
    	Train data;
    	struct node *next;
    }Node,*link;
    
    typedef struct unode	//定义用户链表 
    {
    	User data;
    	struct unode *next;
    }uNode,*ulink;
    

    3.功能函数声明

    void menu();					//菜单显示 
    void luru(link l);//文件信息录入 
    void search_t_to(link l);//按终点站查询 
    void search_t_id(link l);//按列车号查询 
    void search_t_from(link l);//按发车站查询 
    void search(link l);//列车信息查找 
    void save(link l);//文件保存 
    void orderTicket(link l,ulink u);		//订票服务 
    void returnTicket(link l,ulink &u);//退票服务 
    void updateInfo(link l);//列车信息修改 
    void Info(Node *p);//列车信息显示 
    void Judge_ticket(Node *p);		//票数非负判断 
    void Judge_money(Node *p);		//票价非负判断 
    void except_id(Node *p,link l);//列车号录入查重 
    void except_update_id(Node *p);//修改列车号查重 
    void all_show(link l);//查询全部用户 
    void all_user(ulink u);//用户信息查询 
    void load(link l);//文件数据载入
    void uInfo(uNode *p);//用户信息 
    void exitSystem();				//退出系统
    

    4.功能函数定义
    (1)打印菜单列表

    void menu()    //菜单函数 
    {
        printf("\n\t---------------------------------欢迎来到火车订票系统---------------------------------\n");
    	printf("\n\t*********************************\n");
    	printf("\t\t1.录入列车信息\n\t\t2.查询列车情况\n\t\t3.修改列车信息\n\t\t4.订票服务\n\t\t5.退票服务\n\t\t6.保存已录入的信息\n\t\t7.读取已有的列车信息\n\t\t8.退出系统");
    	printf("\n\t*********************************\n\t");
    	printf("输入您所要执行的功能(0-8):");
    }
    

    (2)票数有效值判断

    void Judge_ticket(Node *p)		//票数非负判断 
    {
    	if(p->data.ticket<0)
    	{
    		printf("\t票数输入有误,请重新输入: ");
    		scanf("%d",&p->data.ticket);
    		Judge_ticket(p);
    	}
    }
    

    (3)票价有效值判断

    void Judge_money(Node *p)		//票价非负判断 
    {
    	if(p->data.money<0)
    	{
    		printf("\t票价输入有误,请重新输入: ");
    		scanf("%d",&p->data.money);
    		Judge_money(p);
    	}
    }
    

    (4)列车号录入查重

    void except_id(Node *p,link l)//录入列车号查重 
    {
    	Node *q;
    	q=l;
    	while(q!=NULL)
    	{
    	if(p->data.stationId==q->data.stationId)
    	{
    		printf("\t当前列车班次已存在,请重新输入:"); 
    		scanf("%d",&p->data.stationId);
    		except_id(p,l);
    	}
    	else
    		q = q -> next;
    	}
    }
    

    (5)列车号修改查重

    void except_update_id(Node *p)//修改列车号查重 
    {
    	Node *q,*m;
    	q = p -> next;
    	while(q!=NULL)
    	{
    		if(p->data.stationId == q->data.stationId)
    		{
    			printf("\t当前列车班次已存在,请重新输入:"); 
    			scanf("%d",&p->data.stationId);
    			except_update_id(p);
    		}
    		else
    			q = q -> next;
    	}
    }
    
    

    (6)列车信息录入

    void luru(link l)//文件信息录入 
    {
    	Node *p,*q;
    	while(1)
    	{
    		q = l;
    		while(q->next!=NULL)
    		{
    			q = q -> next;
    		}
    		p = (Node *)malloc(sizeof(Node));
    		printf("\n\t---------------------------------列车信息录入---------------------------------\n");
    		if(!p)
    		{
    			printf("录入出错!");
    			exit(0); 
    		}
    		printf("\n\t1.请输入列车号:");
    		scanf("%d",&p->data.stationId);
    		except_id(p,l);
    		printf("\t2.请输入起点站名称:");
    		scanf("%s",&p->data.from);
    		printf("\t3.请输入终点站名称:");
    		scanf("%s",&p->data.to);
    		printf("\t4.请输入列车出发时间(时分格式为00:00):");
    		scanf("%s",&p->data.stime);
    		printf("\t5.请输入列车到达时间(时分格式为00:00):");
    		scanf("%s",&p->data.rtime);
    		printf("\t6.请输入票价:");
    		scanf("%d",&p->data.money);
    		Judge_money(p); 
    		printf("\t7.请输入票数:");
    		scanf("%d",&p->data.ticket);
    		Judge_ticket(p);
    		p->next=NULL;
    		q->next=p;
    		q = p;
    		printf("\t录入成功!\t");
    		break;
    	}
    }
    
    

    (7)录入信息保存至文件

    void save(link l)//文件保存 
    {
    	Node *p;
    	FILE *fp;
    	p=l->next;
    	if((fp = fopen("train","wb")) == NULL)
    	{
    		printf("\t********文件打开失败!*********");
    		exit(0);
    	}
    	else
    		printf("\t========文件保存成功!=========");
    	while(p) 
    	{
    		fwrite(p,sizeof(Node),1,fp);
    		p=p->next;
    	}
    	fclose(fp);
    } 
    
    

    (8)文件数据载入程序

    void load(link l)//文件数据载入
    {
    	Node *p,*r;
    	FILE *fp;
    	l->next=NULL; 
    	r = l;
    	if((fp = fopen("train","rb")) == NULL)
    	{
    		printf("\n\t********文件打开失败!*********");
    	}
    	else
    	{
    		printf("\n\t========文件数据导入成功!=========");
    		while(!feof(fp))
    		{
    			p = (Node *)malloc(sizeof(Node));
    			if(fread(p,sizeof(Node),1,fp) != 1)
    				break;
    			else
    			{
    				p -> next = NULL;
    				r -> next = p;
    				r = p;	
    			}
    		}
    	}
    } 
    

    (9)列车信息打印显示

    void Info(Node *p)//列车信息显示 
    {
    	printf("\t%5d",p->data.stationId);
    	printf("%8s",p->data.from);
    	printf("%8s",p->data.to);
    	printf("%10s",p->data.stime);
    	printf("%15s",p->data.rtime);
    	printf("%15d",p->data.money);
    	printf("%15d\n",p->data.ticket);
    }
    

    (10)查询列车信息

    void search_t_id(link l)//按列车号查询 
    {
    	int num_c;
    	Node *p;
    	p = l;
    	printf("请输入您需要查找的列车信息的列车号:");
    	scanf("%d",&num_c);
    	printf("\n\t\t\t\t******-----查询结果-----******\n");
    	printf("\t列车号\t发车站\t到达站\t发车时间\t到达时间\t票价(元)\t票数(张)\n"); 
    	while(p)
    	{
    		if(p->data.stationId == num_c)
    		{
    			Info(p);
    			break;
    		}
    		p = p -> next;
    	}
    	if(!p)
    	{
    		printf("\t\t未找到该列车号的信息!\n");
    	}
    }
    
    void search_t_from(link l)//按发车站查询 
    {
    	Node *p;
    	char pstart[STR_LEN];
    	p = l;
    	int count = 0;
    	printf("请输入您需要查找的列车信息的始发站:") ;
    	scanf("%s",&pstart);
    	printf("\n\t\t\t\t******-----查询结果-----******\n");
    	printf("\t列车号\t发车站\t到达站\t发车时间\t到达时间\t票价(元)\t票数(张)\n"); 
    	while(p)
    	{
    		if(strcmp(p->data.from,pstart)==0)
    		{
    			Info(p);
    			count++;
    			if(p->next==NULL)
    			break;
    			else
    			p=p->next;
    		}
    		if(p->next!=NULL)
    		p = p -> next;
    		else
    		break;
    	}
    	if(p==NULL||count == 0)
    	{
    		 printf("\t\t\t.......未找到该列车信息!");
    	}
    }
    
    void search_t_to(link l)//按终点站查询 
    {
    	Node *p;
    	char preach[STR_LEN];
    	p = l -> next;
    	int count = 0;
    	printf("请输入您需要查找的列车信息的终点站:") ;
    	scanf("%s",&preach);
    	printf("\n\t\t\t\t******-----查询结果-----******\n");
    	printf("\t列车号\t发车站\t到达站\t发车时间\t到达时间\t票价(元)\t票数(张)\n"); 
    	while(p)
    	{
    		if(strcmp(p->data.to,preach)==0)
    		{
    			Info(p);
    			count++;
    		}
    			if(p->next==NULL) 
    				break;
    				else
    		p = p -> next;
    	}
    	if(!p||count==0)
    	{
    		 printf("\t\t\t.......未找到该列车信息!");
    	}
    }
    
    void uInfo(uNode *p)//用户信息 
    {
    	printf("\t%s\t",p->data.id);
    	printf("%s\t",p->data.name);
    	printf("%s\t\t",p->data.tele_num);
    	printf("%d\t",p->data.t_id);
    	printf("%d",p->data.order_no);
    }
    
    void all_show(link l)//查询全部 
    {
    	Node *p;
    	p = l -> next;
    	printf("\n\t\t\t\t******-----查询结果-----******\n");
    	printf("\t列车号\t发车站\t到达站\t发车时间\t到达时间\t票价(元)\t票数(张)\n"); 
    	if(p == NULL)
    	{
    		printf("\t\t\t.......未查询到任何列车信息!");
    	}
    	while(p != NULL)
    	{
    		Info(p);
    		p = p -> next;
    	}
    }
    
    void all_user(ulink u)//用户信息查询 
    {
    	uNode *p;p=u;
    	printf("\n\t\t\t\t******-----查询结果-----******\n");
    	if(p == NULL)
    	{
    		printf("\t\t\t.......未查询到任何列车信息!");
    	}
    	while(p != NULL)
    	{
    		uInfo(p);
    		p = p -> next;
    	}
    }
    
    void search(link l)//列车信息查找 
    {
    	int num_cf;
    	printf("\n\t---------------------------------列车信息查询---------------------------------\n");
    	printf("\t1.按列车号查询\n\t2.按始发站查询\n\t3.按终点站查询\n\t4.查询所有列车信息\n\n");
    	printf("\t请输入您的查询方式:");
    	scanf("%d",&num_cf);
    	printf("\n\t---------------------------------————————-----------------------------\n");
    	if(num_cf == 1)	
    		search_t_id(l);
    	else if(num_cf == 2)
    		search_t_from(l);
    	else if(num_cf == 3)
    		search_t_to(l);
    	else if(num_cf == 4)
    		all_show(l);
    	else
    		printf("\t\t输入错误!!");
    }
    
    

    (11) 列车信息修改

    
    void updateInfo(link l)//列车信息修改 
    {
    	int num;
    	int n;
    	Node *p;
    	p=l;
    	if(p==NULL)
    	{
    		printf("\t**暂时没有可以修改的列车信息**\n"); 
    		
    	}
    	else
    	{
    		printf("请输入需要修改列车信息的列车号:");
    		scanf("%d",&num);
    		while(p->data.stationId!=num)
    		{
    			p=p->next;
    			if(p==NULL)
    			{
    				printf("找不到该列车信息");
    				break; 
    			}
    		}
    		if(p!=NULL)
    		{
    			printf("\n\t---------------------------------列车信息修改---------------------------------\n");
    			printf("\t1.列车号\n\t2.起始站\n\t3.终点站\n\t4.出发时间\n\t5.到达时间\n\t6.票价\n\t7.票数\n");
    			printf("\t---------------------------------——————---------------------------------\n");
    			printf("\t请输入您要修改的信息编号:");
    			scanf("%d",&n);
    			switch(n)
    			{
    				case 1:
    					printf("\t请输入变更后的列车号:");
    					scanf("%d",&p->data.stationId);
    					except_update_id(p);
    					break;
    				case 2:
    					printf("\t请输入变更后的起始站:");
    					scanf("%s",&p->data.from);
    					break;
    				case 3:
    					printf("\t请输入变更后的终点站:");
    					scanf("%s",&p->data.to);
    				break;
    				case 4:
    					printf("\t请输入变更后的出发时间(时分格式为00:00):");
    					scanf("%s",&p->data.stime);
    					break;
    				case 5:
    					printf("\t请输入变更后的到达时间(时分格式为00:00):");
    					scanf("%s",&p->data.rtime);
    					break;
    				case 6:
    					printf("\t请输入变更后的票价:");
    					scanf("%d",&p->data.money);
    					Judge_money(p);
    					break;
    				case 7:
    					printf("\t请输入变更后的票数:");
    					scanf("%d",&p->data.ticket);
    					Judge_ticket(p);
    					break;
    				default:
    					printf("\t输入错误!");
    					system("pause"); 
    			} 
    			if(n>=1&&n<=7)
    				printf("\t**修改成功**"); 
    		}
    	}	
    }
    
    

    (12)订票服务实现

    
    void orderTicket(link l,ulink u)		//订票服务 
    {
    	Node *p;
    	uNode *r,*q;
    	int n;
    	p = l;
    	int t_id;
    	printf("\n\t---------------------------------火车票订单填写---------------------------------\n");
    	printf("\t请输入您需要预订的列车号:");
    	scanf("%d",&t_id); 
    	while(p!=NULL&&p->data.stationId!=t_id)
    	{
    		p = p->next;
    	}
    	if(p==NULL)
    	{
    		printf("\t**暂无相关车票可预订!**"); 
    	}
    	else
    	{
    		if(p->data.ticket<=0)
    		{
    			printf("\t**该列车车票已经售空**"); 
    		} 
    		else
    		{
    			while(1)
    			{
    				q = u;
    				while(q->next!=NULL)
    				{
    					q = q -> next;
    				}
    				r = (uNode *)malloc(sizeof(uNode));
    				printf("\n\t#####请按提示输入您的个人信息#####\n");
    				printf("\t请输入您的姓名:");
    				scanf("%s",&r->data.name); 
    				printf("\t请输入您的身份证号码:");
    				scanf("%s",&r->data.id);
    				printf("\t请输入您的手机号码:");
    				scanf("%s",&r->data.tele_num);
    				r->data.t_id = t_id;
    				p->data.ticket = p->data.ticket-1;
    				srand((int)time(NULL));
    				n = rand()%8999+1000;
    				r -> data.order_no = n;
    				printf("\t订票成功,您已成功预订一张列车号为%d的车票,",r->data.t_id);
    				printf("订单编号为%d",r->data.order_no);
    				r->next=NULL;
    				q->next=r;
    				q = r;
    				break;
    			}
    		} 
    	}
    }
    
    

    (13)退票服务实现

    
    void returnTicket(link l,ulink &u)//退票服务 
    {
    	Node *p,*m;
    	uNode *q,*r;
    	char id[MAX];
    	int ord;
    	q = (uNode *)malloc(sizeof(uNode));
    	p=l;
    	r=u;
    	char s;
    	int input_t_id;
    	printf("\n\t---------------------------------火车票退票界面---------------------------------\n");
    	printf("\t请输入您需要退票的列车号:");
    	scanf("%d",&input_t_id);
    	printf("\t请输入您的身份证号:");
    	scanf("%s",&id);
    	printf("\t请输入您的订单编号:");
    	scanf("%d",&ord); 
    	while(r!=NULL)
    	{
    		if(strcmp(r->data.id,id)==0&&input_t_id==r->data.t_id&&ord==r->data.order_no)
    		{
    			printf("\t您当前的订票信息如下:\n");
    			printf("\t名字:%s\n",r->data.name);
    			printf("\t电话号码为:%s\n",r->data.tele_num);
    			printf("\t列车号码为:%d\n",r->data.t_id); 
    			break;
    		}
    		else if(r==NULL)
    		{
    			printf("\t查询不到您的订票信息");
    		}
    		else
    		{
    			r=r->next;	
    		}
    	}
    	if(r==NULL)
    	{
    		printf("\t**查询不到您的订票信息**");
    	}
    	else
    	{
    		printf("\t您确定要退票吗(Y/N)?");
    		fflush(stdin);
    		scanf("%c",&s);
    		if(s=='y'||s=='Y')
    		{
    			while(p!=NULL&&p->data.stationId!=input_t_id)
    			{
    				p=p->next;
    			}
    			if(p==NULL)
    			{
    				printf("查询不到该车票信息");
    			}
    			else 
    			{
    				p->data.ticket += 1;
    				q = r;
    				r->next=q->next;
    				free(r);
    			}
    			printf("\t**退票成功,感谢使用!**\n");
    		}
    		else
    			printf("\n\t**您已取消退票**");
    	}
    }
    
    

    (14)主函数(程序入口)

    
    int main()
    {
    	link l;
    	int num_f;
    	ulink u;
    	l = (Node *)malloc(sizeof(Node));
    	u = (uNode *)malloc(sizeof(uNode));
    	l -> next = NULL;
    	u -> next = NULL;
    	do
    	{
    		system("date 2018/12/07");
    		system("color F4");
    		menu();
    		scanf("%d",&num_f);
    		system("cls");
    		switch(num_f)
    		{
    			case 1:
    				luru(l);break;
    			case 2:
    				search(l);break;
    			case 3:
    				updateInfo(l);break;
    			case 4:
    				orderTicket(l,u);break;
    			case 5:
    				returnTicket(l,u);break;
    			case 6:
    				save(l);break;
    			case 7:
    				load(l);break;
    			case 8:
    				exit(0);break;
    			/*case 9:
    				all_user(u);break;*/
    			default:
    				continue;
    		}
    	}while(1);
    	return 0;
    }
    
    展开全文
  • 火车信息进行录入、查询、修改等操作,然后可完成订票、退票等功能。 功能要求: (1)录入:可以录入列车情况(数据可以存储在一个数据文件中,每个列车记录包括:列车号、起点站、终点站、出发时间、到达时间、...
  • 1.“火车售票系统”选题 2.python+html5+javascript开发 3.没有实现改签和查询出的结果有中转站(这样讲应该能明白吧。。。)4.mysql数据库 5.下载的话需要自己安装mysql并更新源码里的密码,同时重新运行sql脚本...
  • Java火车票查询系统课程设计
  • 包括 铁路时候管理系统软件使用说明书 系统测试报告 软件设计报告书 需求说明书
  • 数据库课程设计——火车售票系统

    万次阅读 多人点赞 2020-04-26 23:18:34
    火车票预售系统,为购票用户与卖票管理人员之间搭建平台。让用户能够通过该软件对管理人员发布的车次班进行预购与查询,方便旅客的出行。

    摘要

    数据库课程设计的题目,设计了一个火车票售票系统,实现了列车信息查询,车票查询及购买,订单查询,个人信息管理等功能,数据是从12306爬取的真实数据。

    项目链接

    前端项目链接:https://github.com/ccclll777/db_design_web
    后端项目链接:https://github.com/ccclll777/db_design_service
    如果觉得有帮助,请点个star吧

    题目简述

    火车票售票系统

    • 车次管理(车次,起止地点,到达时间,开车时间)
    • 坐席管理(车厢号,座位号)
    • 售票(直达,换乘)改签,退票
    • 余票查询
    • 订单查询
    • 用户管理

    开发环境与技术

    • 开发工具
      工具:WebStorm ,IntelliJ IDEA
      Mysql8.0.12 Tomcat 8.0 Maven Git Redis
    • 前端技术栈
      HTML+CSS+Javascript
      前端框架:Vue.js+ElementUi
    • 后端技术栈
      Spring Boot为框架
      MyBatis操作数据库
      Redis进行用户信息缓存
      Maven作为项目构建工具

    需求分析

    1.用户登录注册
    用户注册登陆后可以使用系统的所有功能,如添加乘客,购买车票,查询订单等等

    2.系统需要提供基础的列车信息查询:
    根据车次查询列车是否正常运行,以及查看列车的基本信息(如列车类型,始发站,终点站,开车时间,到达时间,运行时间,车厢数等等)
    根据车次,查询列车经停站信息(包含这趟列车每一个经停车站的车站名,到达时间,开车时间,运行时间等信息)

    3.系统需要提供根据车次查询列车详细信息的功能:
    根据始发站和终点站,查询可以满足自己行程要求并且正常运行的列车(可以根据开车时或者运行时间进行排序),并且可以进一步查看中间经过的的车站信息,以及开车时间,到达时间等。
    系统需要提供接续换乘一次的查询,根据输入的出发站和终点站,可以查询换乘一次满足条件的列车,并且可以根据开车时间或总运行时间进行排序。

    4.车票购买
    在查询到符合自己出行条件的列车后,可以查询列车的剩余座位以及购买车票。
    首先添加乘客(添加需要购买车票的乘客)——>进行座位选择(为每一位乘客选择座位)——>订单支付——>购票成功
    接续换乘车票购买流程类似,只不过在选座时,需要选择两趟列车的座位。
    5.系统需要提供用户的个人信息修改功能以及修改密码功能。

    6.用户可以给除自己以外别的乘客购买车票,所以提供添加乘客的功能,每个用户下都可以添加多个乘客,从而为别的乘客购买车票。

    7.系统提供订单的查询功能,可以查询到与自己有关的所有订单,比如所有订单,未支付订单,未出行订单。

    8.未支付订单针对下单但是没有支付的订单,可以在规定的时间内进行支付操作,如果在规定时间内没有完成操作,则订单会作废,变成未完成支付的订单。

    9.未出行订单针对已经支付但是没有出行的订单,可以在未出行订单中查看自己的出行计划。未出行订单可以进行改签操作,改签相同出发站和终点站的其他列车。

    10.未出行订单还可以进行退票操作,从而取消订单。

    数据库概念设计

    本系统中一共6个实体集,分别是,用户实体,乘客实体,列车信息实体,列车经停信息实体,订单实体,列车座位信息实体

    (1)用户实体:
    保存注册系统的用户的信息,主码为用户电话号码,用来作为每一个用户的唯一标记,同时电话号码也作为登录系统的用户名来使用。其中存在用户自定义的完整性约束:用户类型(0为学生,1为成人,2为管理员),性别(0为女性,1为男性)
    在这里插入图片描述
    (2)乘客实体:
    每个用户下可以添加多个乘客信息,然后为多个乘客购票。
    在这里插入图片描述
    (3)列车信息实体:
    列车信息存储了列车整体信息,每一趟列车都有一条自己的总的列车信息,表示这趟列车是正常运行,或者是停开的。列车编号作为列车的主码(由于列车编号相同的列车,由于开车方向的不同,在途中可能改变车次,但是列车编号是固定不变的)在这里插入图片描述
    (4)列车经停信息实体:
    每个列车都有经停信息表,存储了列车停靠的不同车站,以车站编号排序。
    在这里插入图片描述
    (5)列车座位信息表,为了简化系统设计的难度,统一固定车次为D,G开头的列车设置特等座,一等座和二等座三个座位类型,其他类型的车设置软卧,硬卧,硬座三个座位类型。并且如果座位类型相同,则车厢的座位数以及布局是相同的。比如:特等座一节车厢18座,一排2座,一等座一节车厢52座,一排4座,二等座一节车厢85座,一排5座。软卧一节车厢36个位置,一列2个位置,分为上下铺。硬卧一节车厢66个位置,一列3个位置,分为上中下铺。硬座一节车厢120个位置,一排6个座位。
    列车座位信息的主码为列车编号,车厢编号。外码为列车编号,参照列车信息实体。
    当车厢号固定时,说明座位类型已经固定,具体的位置是根据座位号对于相应一排的座位数求模运算得到的,比如特等座5号为5/2 +1 =3 3排
    5%2 = 1 A座
    在这里插入图片描述
    (6)订单信息实体:
    存储了系统中所有的订单信息,订单信息实体的主码为订单编号,外码为用户电话号码(用户实体主码),乘客身份证号码(乘客实体主码),列车编号(列车信息主码).
    在这里插入图片描述
    整体E-R图为:
    在这里插入图片描述
    在这里插入图片描述
    说明:
    (1)每个用户可以添加多个乘客
    (2)每个用户可以拥有多个订单
    (3)每个订单属于一个乘客
    (4)每个订单拥有一趟列车的信息
    (5)每个订单拥有一个列车的座位信息
    (6)每个订单拥有两个列车经停的车站信息
    (7)每个列车有多个经停的车站
    (8)每个列车拥有多个车厢的座位信息

    E-R图向关系模式的转化

    (1)实体转化为关系模式
    用户(电话号码,密码,身份证号,邮箱,真实姓名,用户类型,性别,地址)
    乘客(乘客身份证号,乘客真实姓名,乘客电话号码,乘客类型,地址)
    列车信息(列车编号,车次,列车类型,列车车厢数,列车始发站,列车终点站,列车开车时间,列车到达时间,列车到达日期,列车运行时间,列车状态)
    列车座位信息(编号,车厢号,座位类型,座位数)
    列车经停信息(车次,车展编号,车站名,到达时间,总运行时间,开车时间)
    订单信息(订单编号,出发站编号,到达站编号,车厢号,座位编号,订单创建时间,订单状态,开车时间)
    (2)联系转化为关系模式
    用户拥有乘客(用户电话号码,乘客身份证号码)
    用户拥有订单(用户电话号码,订单编号)
    乘客拥有订单(乘客身份证号码,订单编号)
    订单拥有列车(订单编号,列车编号)
    订单拥有座位(订单编号,车厢号,座位号)
    列车信息拥有列车经停站信息(列车编号,车次,车站编号)
    列车拥有座位(列车编号,车厢号)
    (3)实体与联系进行合并,E-R图中的一对一与一对多的联系,通过参照完整性与关系模式进行合并,并进行一定修改,合并。
    用户(电话号码,密码,身份证号,邮箱,真实姓名,用户类型,性别,地址)
    乘客(用户电话号码,乘客身份证号,乘客真实姓名,乘客电话号码,乘客类型,地址)
    列车信息(列车编号,车次,列车类型,列车车厢数,列车始发站,列车终点站,列车开车时间,列车到达时间,列车到达日期,列车运行时间,列车状态)
    列车座位信息(列车编号,车厢号,座位类型,座位数)
    列车经停信息(列车编号,车次,车站编号,车站名,到达时间,总运行时间,开车时间)
    订单信息(订单编号,用户电话号码,乘客身份证号码,列车编号,出发站编号,到达站编号,车厢号,座位编号,订单创建时间,订单状态,开车时间)

    数据库逻辑设计

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述

    数据库物理结构设计

    (1)用户表:
    在用户表中,由于查询以及更新的条件都是用户电话号码,所以将用户电话设置为主码,会相应的建立索引,提高查询的效率。
    (2)乘客表:
    主码为用户电话号码以及乘客身份证号码,由于有许多查询以这两个为条件,所以设置成主码增加查询效率。虽然在更新时比较耗时,但是更新的频率比查询的频率少很多。
    (3)列车信息表:
    以列车编号为主码,会自动建立索引,提高查询效率。
    (4)列车经停信息表:
    这个表的查询量较大,但插入,删除,更新的操作较小,所以在这个表上建立一定的索引时非常合算的。
    由于需要根据车次以及列车编号查询列车经停信息,所以可以在车次与列车编号上建立普通索引即可,提高查询效率。
    在根据出发站以及到达站进行对符合条件的列车进行检索时,需要用到车站名称,所以应该在车站名称上建立普通索引
    (5)列车座位表:
    列车座位表的主码是列车编号以及车厢号,会自动建立索引,查询时也会以这两个为条件,所以不用在增加其他索引。
    (6)订单表:
    由于订单表的插入频率以及查询频率都很高,而建立索引会降低插入的效率,而不建立索引会降低查询的效率,所以需要在两者之间进行取舍。
    由于订单表的主码为订单编号,会自动建立唯一索引。
    用户电话号码,和乘客身份证号码作为外码,常常成为查询的条件,所以应该在外码上建立普通索引。
    在查询剩余车票信息时,需要先在订单列表中查询某辆车在某个时间的那一段路程已经被订购过。查询时的条件需要有出发车站编号,到达车站编号,列车编号,订单状态,开车日期 。
    所以可以考虑在出发车站编号,到达车站编号,列车编号,订单状态,开车日期上建立普通索引。提高查询效率。毕竟查询的次数要远远多余订票的次数,所以查询的次数会多余插入的次数,用空间来换取更快的效率,还是可以接受的。

    项目整体结构

    在这里插入图片描述
    说明:
    (1)用户首先进行账号的注册,然后进行登录操作
    登录之后进入主页,然后有不同的板块进行选择
    (2)列车信息查询板块:
    列车信息:可以查询所有正常运行的列车信息
    列车时刻表:可以根据车次查询列车的经停信息,
    列车查询:可以根据出发站和到达站查询符合条件的列车
    接续换乘:可以根据出发站和到达站查询换乘一次能到达的列车
    (3)车票查询及购买板块:
    余票查询:可以根据出发站和到达站查询符合条件的列车并且查看余票以及订购车票(跳转到车票购买界面)
    车票购买:添加乘客后,可以为乘客选座,然后支付,购票成功。
    接续换乘:可以根据出发站和到达站查询换乘一次能到达的列车,然后进行购票,跳转到接续换乘车票购买界面。
    接续换乘车票购票:添加乘客后,为乘客进行选座操作,然后支付,购票成功
    (4)订单信息板块:
    全部订单:查询用户名下的全部订单状态
    未支付订单:查询用户名下全部未支付的订单,然后可以进行订单的支付操作
    未出行订单:可以查询到已经支付,但是还未出行的订单,可以进行退票以及改签操作。
    订单改签:进行重新的选座已经支付操作。
    (5)个人信息板块:
    查看个人信息:查看用户的个人信息。
    修改个人信息:修改用户的个人信息
    修改密码:修改登录密码
    查看乘客信息:查看此用户名下的所有乘客。
    添加乘客:为此用户名下添加乘客,之后可以为该乘客购票

    界面截图

    (1)列车信息查询界面
    在这里插入图片描述
    (2)列车时刻表查询
    在这里插入图片描述
    (3)列车查询
    在这里插入图片描述

    在这里插入图片描述
    (4)接续换乘查询
    在这里插入图片描述

    在这里插入图片描述

    (5)余票查询以及购买
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    (6)订单列表
    在这里插入图片描述

    关键sql语句设计

    (1)根据车次查询列车所有经停站信息

    select   b.station_no as 车站编号 ,b.station_name as  车站名, 
               b.train_number as 车次 , b.start_time  as 开车时间, 
               b.arrive_time as 到达时间 , b.running_time  as 历时 
                     from train_parking_station(列车经停站信息表) as a ,train_parking_station  as b 
                             where a.train_number = '车次'   and a.train_no = b.train_no 
                                       order by b.station_no
    

    (2)根据起始站,目的站查询符合条件的列车

    select C.train_no as 列车编号 ,C.train_number as 车次 ,
             C.station_name as 起始站 ,D.station_name as 目的站 ,             
             C.station_no as 起始站编号 , D.station_no as  目的站编号  ,
             C.start_time as 开车时间 , D.arrive_time as 到达时间,             
             C.running_time as 到起始站已运行时间 ,D.running_time as 到目的站已运行时间             
             from train_parking_station(列车经停站信息表) as C ,train_parking_station as D 
             where C.train_no = D.train_no 
             and C.station_name ='济南西'
             and D.station_name = '上海虹桥'     
             and C.station_no <  D.station_no        
             and C.train_no in
             (select train_no 
                       from   train_info        
                     where  train_running_type = '正在运行')
    

    (3)根据起始站,目的站查询符合条件的列车

    select C.train_no as 列车编号 ,C.train_number as 车次 ,
             C.station_name as 起始站 ,D.station_name as 目的站 ,             
             C.station_no as 起始站编号 , D.station_no as  目的站编号  ,
             C.start_time as 开车时间 , D.arrive_time as 到达时间,             
             C.running_time as 到起始站已运行时间 ,D.running_time as 到目的站已运行时间             
             from train_parking_station(列车经停站信息表) as C ,train_parking_station as D 
             where C.train_no = D.train_no 
             and C.station_name ='济南西'
             and D.station_name = '上海虹桥'     
             and C.station_no <  D.station_no        
             and C.train_no in
             (select train_no 
                       from   train_info        
                     where  train_running_type = '正在运行')
    

    (4)根据起始站,目的站查询换乘的列车

    select A.train_no as 列车-1编号 ,A.train_number as 列车-1车次, D.train_no as 列车-2编号 ,
             D.train_number as 列车-2车次, A.station_no as 起始站编号,
             A.station_name as 起始站名称, B.station_no as 列车-1换乘站编号 , 
             B.station_name as 列车-1换乘站名称 ,C.station_no as 列车-2换乘站编号,
             D.station_no as 目的站编号,  D.station_name as 目的站名称,
             A.start_time as 列车-1发车时间 , B.arrive_time as 列车-1到达时间, 
             C.start_time as 列车-2发车时间 ,D.arrive_time as 列车-2到达时间 
             from  train_parking_station as A , train_parking_station as B , 
                      train_parking_station as C ,train_parking_station as D 
                      where A.station_name = '哈尔滨' and D.station_name = '广州' 
                               and B.station_name = C.station_name 
                               and   A.train_no = B.train_no  and C.train_no = D.train_no and B.train_no <> C.train_no   
                               and B.arrive_time < C.arrive_time  
                               and  A.station_no <B.station_no and C.station_no<D.station_no
                               and A.train_no  in (select train_no from train_info where train_running_type = '正在运行')
                               and C.train_no in  (select train_no from train_info where train_running_type = '正在运行')
    

    (5)根据起始站编号,目的站编号,列车编号查询列车途中经停车站

    select A.train_no as 列车编号, A.train_number as 车次 ,
             A.station_name as 起始站 ,B.station_name as 目的站, 
             A.station_no as 经停站-1编号 , B.station_no as 经停站-2编号 ,
             A.start_time as 开车时间 , B.arrive_time as 到达时间,
             A.running_time as 到经停站-1已运行时间 ,B.running_time as 到经停站-2已运行时间 
             from train_parking_station as A ,train_parking_station as B 
             where A.station_no between '起始站编号' and '目的站编号'
             and  B.station_no between '起始站编号' and '目的站编号'
             and A.train_no = '列车编号'                
             and A.train_no = B.train_no 
             and B.station_no = A.station_no +1 order by A.station_no ,B.station_no 
    

    (6)根据起始站编号,目的站编号,列车编号,日期查询在这一段行程中已经被占用的座位
    在这里插入图片描述

    select            train_no, carriage_no , seat_no             from order_list     
         where  start_station_no < '起始站编号' and end_station_no > '目的站编号' 
                   and train_no = '列车编号' and left(train_start_date,10) = '日期' 
                   and order_status <> '已退票' and order_status <> '已改签' and order_status <> '未完成支付'
    
    union select      train_no,carriage_no , seat_no             from order_list 
        where  start_station_no < '目的站编号'  and end_station_no > '目的站编号'                                                                                     and  train_no = '列车编号' and left(train_start_date,10) = '日期' 
                  and order_status <> '已退票'  and order_status <> '已改签' and order_status <> '未完成支付'
        
    union select      train_no,carriage_no , seat_no              from order_list                                            
          where start_station_no > '起始站编号' and  end_station_no <'目的站编号'   
                    and order_status <> '已退票' and order_status <> '已改签' and order_status <> '未完成支付' 
                    and train_no = '列车编号' and left(train_start_date,10) = '日期'
     
    union select     train_no,carriage_no , seat_no             from order_list                                                  
                where start_station_no = '起始站编号' and  end_station_no = '目的站编号'   
                         and train_no = '列车编号' and left(train_start_date,10) = '日期'
                        and order_status <> '已退票' and order_status <> '已改签'  and order_status <> '未完成支付'
    

    参考文献

    【1】Database Systems Concepts (第六版) ,Abraham, Silberschatz等著,机械工业出版社,2013
    【2】数据库系统概论(第五版) ,王珊、萨师煊 ,高等教育出版社,2014
    【3】Spring Boot开发实战 陈光剑编著
    【4】Spring Boot+Vue全栈开发实战 王松著
    【5】vue.js2 尤雨溪著

    展开全文
  • 太原理工大学C语言课程设计火车订票系统
  • 一个用c编写的数据结构实验,实现火车票务系统基本功能代码。。希望给你些帮助。。。
  • 实现功能如下: 0:quit the system 1:Insert a train information 2:Search a train information 3:Book a train ticket 4:Modify the train information 5:Show the train information ...
  • 软件工程设计做的关于火车订票系统,包括具体的流程图和代码……
  • 大学C++课程设计任务——火车票管理系统。 随着计算机技术的发展,人们对计算机智能化的需求越来越大,对软件的实用性、速度等性能的要求也越来越高。未来火车站的发展趋势是完全自动化的售票信息查询,网络售票,...
  • 数据库课程设计——MySQL火车售票系统

    万次阅读 多人点赞 2018-09-21 22:21:02
    数据库课程设计——火车售票系统 听所有人很烦数据库课程设计?阅读本篇文章会让你不那么烦躁~ 系统开发平台: 开发工具:eclipse,sublime 开发语言:Java,jsp,css,JavaScript 数据库:MySQL 中间件:...
  • 用C#做火车订票管理系统课程设计汇本.doc
  • 统 一需求分析 在构造系统时首先从需求出发构造数据库表然后再由数据库表结合需求划分系统 功能模块这样就把一个大的系统分解成了几个小系统使整个系统的功能更加详细易 于理解同时易于实现系统的整体设计系统分为...
  • 介绍:https://blog.csdn.net/weixin_45628245/article/details/103877993
  • 数据库课程简单作业 火车售票系统 只有简单的几个表格,内容包括ER图,关系模式,数据字典,建表语句等
  • 期末数据库课程设计火车出行路线规划及售票系统》 利用迪杰斯特拉算法找到最省钱的城市路线(只是城市路线) 采用简单工厂模式进行设计用户操作
  • 题目:火车售票管理系统 需求分析:要求能够实现售票、退票、余票查询等功能 方法设计:可以用结构体和栈模拟买票退票的过程。 车票打印效果如下: +-------------------------------------------------------+ ...
  • C 语言课程设计一---学生管理系统 使使用 C 语言实现学生管理系统系统实现对学生的基本信息和考试成绩的 管理。采用终端命令界面,作为系统的输入输出界面。采用文件作为信息存储介质。 功能描述: 学生...
  • 包括内容: 软件设计说明书 系统需求说明书
  • 火车订票系统

    2014-11-14 21:06:01
    sql课程设计火车订票系统,代码主要是前端的代码,连接的后台数据库只有一些表,自己匹配前端的代码添加上对应的后台数据库的表就可以用了,自己写的可能不是非常好,见谅~

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 654
精华内容 261
关键字:

火车售票系统课程设计