C语言实现车票管理系统

前言

C语言期末实训作业,分享一波。

设计要求

一车站每天有 n 个发车班次,每个班次都有一班次号(1、2、3...n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。如:

班次 发车时间 起点站 终点站 行车时间 额定载量 已订票人数

1 8:00 玉溪 普洱 2 45 30

2 6:30 玉溪 江川 0.5 40 40

3 7:00 玉溪 华宁 1 40 20

4 10:00 玉溪 元江 1.5 40 2

1、录入班次信息(信息用文件保存),可不定时地增加班次数据。

2、浏览班次信息,显示出所有班次当前状态(如果当前系统时间超过了某班次的发车时间,则显示“此班次已发出”的提示信息)。

3、查询路线:可按班次号查询,可按终点站查询。

4、售票和退票功能:

A:当查询出已订票人数小于额定载量且当前系统时间小于发车时间时才能

售票,自动更新已售票人数。

B:退票时,输入退票的班次,当班车未发出时才能退票,自动更新已售票人数,否则给出相应的提示信息。

系统的界面设计

详细设计

主函数

int main()
{
    int iItem;
    ShowMainMenu();     /*调用ShowMainMenu函数绘制界面*/
    scanf("%d", &iItem);/*提示用户输入数字*/
    getchar();
    while (iItem)
    {
        switch (iItem)
        {
        case 1:
            ManageTicket();      /* 录入班次信息函数 */
            break;
        case 2:
            listPeopleInfo();    /* 录入乘客信息  */
            break;
        case 3:
            queryRoute();  /* 查询路线 */
            break;
        case 4:
            peopleBus();  /* 售票和退票 */
            break;
        default:
            printf("\t\t请输入正确的数字!\n\t\t程序将于3秒后跳转到主菜单");
            Sleep(3000); //Sleep()函数
        }
        ShowMainMenu();
        scanf("%d", &iItem);
        getchar();
    }
    return 0;
}

文件读取

/*读取车票信息转存至astBus数组中,公共函数*/
int ReadTicketFile(char* pcMode)
{
    int iTicketRecord = 0;

    FILE* pfTicket;   /*文件指针*/
    pfTicket = fopen("Bus.txt", pcMode);
    if (pfTicket == NULL)
        return -1;
    while (!feof(pfTicket))
    {
        if (fread(&astBus[iTicketRecord], LEN_Bus, 1, pfTicket))
            iTicketRecord++;
    }
    fclose(pfTicket);
    return iTicketRecord;
}

文件保存

/*车票信息存入文件中*/
void SaveTicketFile(int iTicketId)
{
    FILE* pfTicket;
    /*读写方式打开文件,文件必须已经存在,指针指向文件首部,wb会删掉原有文件,ab指针指向文件尾部*/
    pfTicket = fopen("Bus.txt", "rb+");
    if (pfTicket != NULL)
    {
        fseek(pfTicket, LEN_Bus * iTicketId, SEEK_SET);
        if (fwrite(&astBus[iTicketId], LEN_Bus, 1, pfTicket) != 1)
            printf("无法保存该信息!\n");
    }
    fclose(pfTicket);
}


添加班次信息函数

void AddTicket()
{
    FILE* pfTicket;/*文件指针*/
    int iTicketRecord1, iFlagExist, i;
    char cFlag1;

    system("cls");

    iTicketRecord1 = ReadTicketFile("ab+");  /*ab+追加方式打开或新建二进制文件*/
    if (iTicketRecord1 == -1)
    {
        printf("文件打开失败!\n");
        return;
    }
    else if (iTicketRecord1 == 0)
        printf("没有班次记录!\n");
    else
        ShowTicket();/*如果班次记录不为零则调用showTicket显示所有班次*/

    /*以下代码为循环录入班次信息*/
    printf("请选择是否键入信息(y/n):");
    cFlag1 = getchar();
    getchar();
    if (cFlag1 == 'n')
        return;
    /*键入'y'则开始进行写入,首先输入班次号,遍历数组并判断是否已存在该班次,若存在提示用户重新输入*/
    pfTicket = fopen("Bus.txt", "ab+");
    if (pfTicket == NULL)
    {
        printf("文件打开失败!\n");
        return;
    }

    while (cFlag1 == 'y')
    {
        if (iTicketRecord1 >= Bus_NUM1)/*若超过M容量范围则不能继续写入*/
        {
            printf("记录已满!");
            fclose(pfTicket);
            return;
        }

        printf("请输入班次:");
        do {
            iFlagExist = 0;
            scanf("%d", &astBus[iTicketRecord1].number);
            getchar();
            for (i = 0; i < iTicketRecord1; i++)
            {
                if (astBus[i].number == astBus[iTicketRecord1].number)
                {
                    iFlagExist = 1;
                    printf("该班次已存在,请重新输入:");
                    break;
                }
            }
        } while (iFlagExist == 1);

        //  班次 发车时间 起点站 终点站 行车时间 额定载量 已订票人数
        /* 新增 班次 的基本信息 */

        printf("请输入发车时间(小时):");
        scanf("%d", &astBus[iTicketRecord1].departureTime1);
        printf("请输入发车时间(分钟):");
        scanf("%d", &astBus[iTicketRecord1].departureTime2);
        printf("请输入起点站:");
        scanf("%s", &astBus[iTicketRecord1].startPoint);
        printf("请输入终点站:");
        scanf("%s", &astBus[iTicketRecord1].endPoint);
        printf("请输入行车时间:");
        scanf("%lf", &astBus[iTicketRecord1].drivingTime);
        printf("请输入额定载量:");
        scanf("%d", &astBus[iTicketRecord1].capacity);
        printf("请输入已订票人数:");
        scanf("%d", &astBus[iTicketRecord1].TicketedPassengers);
        getchar();

        /*将新增的班次信息写入文件中*/
        if (fwrite(&astBus[iTicketRecord1], LEN_Bus, 1, pfTicket) != 1)
        {
            printf("无法保存该信息!\n");
            return;
        }
        else
        {
            printf("%d号班次信息已保存!\n", astBus[iTicketRecord1].number);
            iTicketRecord1++;
        }
        printf("继续输入信息吗(y/n)");
        cFlag1 = getchar();
        getchar();
    }
    fclose(pfTicket);
    printf("添加班次执行完毕!\n");
}

售票函数

void Borrowpeople()
{
    int iReaderId, j, iReaderId1, sum1;
    char cFlag;
    time_t t;
    time(&t);
    st = localtime(&t);
    system("cls");
    /*,判断乘客是否存在,显示该乘客的信息*/
    iReaderId = Searchpeople();
    if (iReaderId == -1)
        return;

    int iReaderRecord, iTicketRecord;
    iReaderRecord = ReadpeopleFile("rb");

    if (people[iReaderId].number1 != 0) {
        printf("该乘客已经购票,需要重新购票请先退票!");
        return;
    }

    /*,判断乘客车票信息,显示该乘客需要的班次信息*/
    iReaderId1 = SearchBusTo();
    if (iReaderId1 == -1)
        return;

    iTicketRecord = ReadTicketFile("rb");
    datatime();
    if (astBus[iReaderId1].departureTime1 < st->tm_hour) {
        printf("\n当前班次在 %d:%d 已经发车了,请查看其它班次!\n", astBus[iReaderId1].departureTime1, astBus[iReaderId1].departureTime2);
        return;
    }
    if (astBus[iReaderId1].departureTime1 = st->tm_hour) {
        if (astBus[iReaderId1].departureTime2 <= st->tm_min) {
            printf("\n当前班次在 %d:%d 已经发车了,请查看其它班次!\n", astBus[iReaderId1].departureTime1, astBus[iReaderId1].departureTime2);
            return;
        }
    }
    sum1 = astBus[iReaderId1].capacity - astBus[iReaderId1].TicketedPassengers;
    printf("\n该班次剩余 %d 票\n", sum1);

    if (sum1 <= 0) {
        printf("该班次已满员,请查看其它班次!");
        return;
    }

    printf("乘客所需要的班次信息车票充足,是否需要购票?(y/n)");
    cFlag = getchar();
    getchar();
    if (cFlag == 'n')
        return;
    else if (cFlag == 'y')
    {
        printf("请输入所订班次:");
        scanf("%d", &people[iReaderId].number1);
        printf("请输入起始站:");
        scanf("%s", &people[iReaderId].startPoint1);
        printf("请输入终点站:");
        scanf("%s", &people[iReaderId].endPoint1);
        getchar();

        SavepeopleFile(iReaderId);
        printf("==========乘客信息修改成功!==========\n");

        astBus[iReaderId1].TicketedPassengers++;
        SaveTicketFile(iReaderId1);
        printf("==========对应班次更新成功!==========\n");
    }
    printf("==========  购票成功!==========\n");
}

售票和退票模块的测试及分析

总结

C语言学习就应该多积累经典程序,多多练习。

其它的内容代码太多就省略了.....

资源包含任务书以及说明书还有项目源码 设计要求: (1) 只能使用C语言,源程序要有适当的注释,使程序容易阅读 (2) 至少采用文本菜单界面(如果能采用图形菜单界面更好) (3) 写出课程设计报告,具体要求见相关说明文档 功能要求: 一车站每天有n个发车班次每个班次都有一班次(1、2、3…n),定的发车时间,定的路线(起始站、终点站),大致的行车时间,定的额定载客量。如 班次 发车时间 起点站 终点站 行车时间 额定载量 已订票人数 1 8:00 太原 广汉 2 45 30 2 6:30 太原 成都 0.5 40 40 3 7:00 太原 成都 0.5 40 20 4 10:00 太原 成都 0.5 40 2 (1)录入班次信息(信息用文件保存),可不定时地增加班次数据 (2)浏览班次信息,显示出所有班次当前状总(如果当前系统时间超过了某班次发车时间,则显示“此班已发出”的提示信息)。 (3)查询路线:可按班次查询,,可按终点站查询 设计要求: (1) 只能使用C语言,源程序要有适当的注释,使程序容易阅读 (2) 至少采用文本菜单界面(如果能采用图形菜单界面更好) (3) 写出课程设计报告,具体要求见相关说明文档 功能要求: 一车站每天有n个发车班次每个班次都有一班次(1、2、3…n),定的发车时间,定的路线(起始站、终点站),大致的行车时间,定的额定载客量。如 班次 发车时间 起点站 终点站 行车时间 额定载量 已订票人数 1 8:00 太原 广汉 2 45 30 2 6:30 太原 成都 0.5 40 40 3 7:00 太原 成都 0.5 40 20 4 10:00 太原 成都 0.5 40 2 (1)录入班次信息(信息用文件保存),可不定时地增加班次数据 (2)浏览班次信息,显示出所有班次当前状总(如果当前系统时间超过了某班次发车时间,则显示“此班已发出”的提示信息)。 (3)查询路线:可按班次查询,,可按终点站查询 (4)售票和退票功能 A:当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数 B:退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数
MFC(Microsoft Foundation Classes)是微软公司提供的一个用于构建Windows应用程序的C++库。MFC提供了一系列类,这些类封装了Windows API的许多功能,使得开发者可以更加容易地创建Windows风格的图形用户界面(GUI)。 一个MFC车票管理系统通常是一个基于Windows平台的应用程序,使用MFC框架来实现。这样的系统可以包含多种功能,比如车票查询、预订、购买、打印、退票和管理等。以下是一些该系统可能包含的典型特点和功能: 1. 用户界面:通过MFC创建的窗口,菜单栏,按钮,列表视图,编辑框等控件,提供直观的用户交互界面。 2. 数据管理:系统需要连接到数据库,比如SQLite或者SQL Server,来存储车次信息、车票信息、用户信息等数据。 3. 车票查询:用户可以输入车次、出发地、目的地和日期等条件,系统根据这些条件查询数据库并显示符合条件的车票信息。 4. 车票预订和购买:用户可以选择需要的车票,系统处理支付流程,并在购买成功后提供电子车票。 5. 打印功能:用户可以打印自己的车票信息,以便于乘车时使用。 6. 用户管理:对于不同级别的用户(如管理员和普通用户),系统会提供相应的权限管理。 7. 日志记录:系统会记录用户的操作日志,便于后续的查询和审计。 8. 安全性:系统会采取措施保护数据安全,防止未授权访问和数据泄露。
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值