问题描述
通过此系统可以实现售票、退票、车票剩余情况查询等功能。每张车票包含车次、车厢、座位信息。
问题要求
⑴在售票、退票、查询剩余票等环节中,都必须显示出车票的信息,即车次、车厢、座位情况。
⑵为简单起见,在此假设所有出售的车票均为同一车次的车票。
⑶退票时,必须是车站售出的车票才能退,否则视为无效票,不能退票,而且退票可以再次销售。
一、解题思路
1、总体思路
该程序主要围绕车票的售卖、退票和剩余车票查询等功能展开。通过定义车票结构体和相关数组来存储车票信息;售票函数负责在车票未售罄以及非重复票时接受用户输入并添加新售车票;退票函数根据用户提供的信息在车票库中查找匹配车票并进行退票处理;查询剩余票函数则通过标记已售座位来展示剩余座位情况。主函数提供操作选择界面,根据用户选择调用相应函数以实现不同功能,整体实现了一个简单的车票管理系统的基本操作流程。
2、各函数思路
售票函数 sellTicket()
:
首先检查车票是否售罄。
提示用户输入车厢和座位信息,进行有效性检查,包括检查该票是否已经出售。
若有效,创建车票结构体并添加到车票库数组中,同时增加已售车票数量,并输出售票成功信息。
退票函数 refundTicket()
:
接收用户输入的要退票的车次、车厢和座位信息并进行有效性检查。
通过循环遍历车票库数组,利用字符串比较和其他信息的匹配来查找要退的车票。
若找到匹配的车票,进行替换操作并减少已售车票数量,输出退票成功信息和车票信息;若未找到,输出无效票提示。
查询剩余票函数 queryRemain()
:
创建一个表示座位是否为空的二维数组。
遍历已售车票,标记已售出的座位。
然后按车厢输出未被标记(即剩余)的座位号。
3、主函数
main()
:
提供一个循环,让用户不断选择操作(售票、退票、查余票、退出)。
根据用户选择调用相应函数。
二、代码
1、头文件
typedef struct
{
char trainNumber[10]; //车次
int coach; //车厢
int seat; //座号
}Ticket;
2、售票函数 sellTicket
int ticketCount = 0; //初始化已售车票数量为0
void sellTicket()
{
Ticket ticket; // 声明一个Ticket类型的局部变量以存储新票的信息
printf("Please enter coach (1-3):\n");
scanf("%d", &ticket.coach);
printf("Please enter seat (1-8):\n");
scanf("%d", &ticket.seat);
// 检查输入是否有效
if (ticket.coach < 1 || ticket.coach > 3 || ticket.seat < 1 || ticket.seat > 8)
{
printf("Input error, please re-enter!\n");
return;
}
// 检查是否已经售出相同的票
int found = 0;
strcpy(ticket.trainNumber, "G1234");
for (int i = 0; i < ticketCount; i++)
{
if (strcmp(tickets[i].trainNumber, ticket.trainNumber) == 0 &&
tickets[i].coach == ticket.coach &&
tickets[i].seat == ticket.seat)
{
printf(