前言
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语言学习就应该多积累经典程序,多多练习。
其它的内容代码太多就省略了.....