飞机订票系统(c语言)

来源:互联网转载 | 更新日期:2023-09-04 23:56:43

飞机订票系统(c语言)

    • 一、项目背景
    • 二、设计目的
    • 三、项目功能需求
      • 1、添加机票信息
      • 2、查询可预订的机票信息
      • 3、预定机票并输入个人信息
      • 4、修改机票信息
      • 5、退票
      • 6、根据目的地和最早出发时间,系统可以推荐合适的机票信息
      • 7、显示当前时间
    • 四、系统的功能结构图
    • 五、功能模块介绍
      • 1、添加模块
      • 2、查找模块
      • 3、订票模块
      • 4、修改模块
      • 5、退票模块
      • 6、显示模块
      • 7、推荐模块
      • 8、保存模块
      • 9、时间模块
    • 六、详细设计
      • 1、主函数
      • 2、添加模块
      • 3、查找模块
      • 4、订票模块
      • 5、修改模块
      • 6、退票模块
      • 7、显示模块
      • 8、推荐模块
      • 9、保存模块
      • 10、时间模块
    • 七、代码

一、项目背景

​ 为了免去在窗口排队买票的麻烦,飞机订票系统应运而生。用户通过该系统可以快速,详细地了解需要的信息,并提供了一个很好的购票渠道。

二、设计目的

  • 如何合理设计不同数据结构来存储航班信息、旅客信息、订票信息等不同数据
  • 如何合理设计不同的链表节点来封装不同的实体信息;
  • 如何合理设计多个链表结构来管理不同实体的若干记录;
  • 进一步强化学习链表的创建、插入、查找、修改和删除等基本操作;
  • 进一步强化学习内存中链表数据和外部文件之间的存取操作;
  • 如何利用time.h中的函数获取系统日期时间

三、项目功能需求

1、添加机票信息

  • 能够添加机票的航班号、起飞降落时间、目的地、出发地、票价、可定的剩余票数以及折扣信息等。

2、查询可预订的机票信息

  • 能够根据用户的具体需求即航班号或目的地,查询可定的机票并输出相应的机票信息,支持标准格式输出多条机票信息。

3、预定机票并输入个人信息

  • 查询机票后,根据用户的选择,决定是否订票,并输入信息。

4、修改机票信息

  • 能修改已经存在的机票信息。

5、退票

6、根据目的地和最早出发时间,系统可以推荐合适的机票信息

7、显示当前时间

四、系统的功能结构图

五、功能模块介绍

1、添加模块

  • 可以连续添加多条航班信息,包括航班号、出发城市、到达城市、出发时间、到达时间、票价、折扣信息、票数

2、查找模块

  • 用户在订票之前需要先查询满足自己出行需要的机票信息,本功能模块支持按照“航班号”查询和按照“目的地”查询两种方式

3、订票模块

  • 输入目的地信息,可以输出所有满足该目的地的航班信息,并提示用户是否订票

4、修改模块

  • 输入需要修改的航班号,可以修改航班信息

5、退票模块

  • 能支持用户退票操作

6、显示模块

  • 显示模块可以展示所有航班信息,供旅客查看选择

7、推荐模块

  • 推荐模块的功能是根据旅客输入的目的地信息和最早出发时间,向旅客推荐满足要求的航班信息,帮助旅客快速搜索符合时间要求的航班

8、保存模块

  • 能将航班信息和旅客订票信息保存到磁盘文件中,再次启动系统时,则可以自动读取文件中的航班信息和旅客订票信息

9、时间模块

  • 支持实时查询当前时间功能

六、详细设计

1、主函数

功能设计

  • 主函数用于实现主菜单的显示,并响应用户对菜单项的选择。
  • 本系统的主函数主要两大功能:保存信息和菜单选择。
  • 某个功能执行完之后,还能按任意键自动回到主菜单,便于用户进行其他操作。

2、添加模块

功能设计

  • 用于对飞机班次,始发地,目的地,起飞时间,降落时间,票价,折扣以及所剩票数等信息的输入与保存。

添加模块流程图

3、查找模块

功能设计

  • 用于根据输入的飞机班次或到达城市来进行查找,了解航班的信息。
  • 提供了两种查询方式:一是根据飞机班次查询,二是根据到达城市查询。

4、订票模块

功能设计

  • 用于根据用户输入的城市进行查询,在屏幕上显示满足条件的飞机班次信息。
  • 从中选择自己想要预定的机票,并根据提示输入个人信息。

5、修改模块

功能设计

  • 用于对已添加的飞机班次,时间,地点,票价等信息的修改。

6、退票模块

功能设计

  • 用于用户对已经预定的飞机票进行退票。

7、显示模块

功能设计

  • 用于对输入的航班信息和经过修改的航班信息进行整理输出,方便用户查看。

8、推荐模块

功能设计

  • 用于对用户提供的信息,系统检索后提供合适的机票,以便用户选择适合自己时间的班次后进行预订。

9、保存模块

功能设计

  • 应用文件处理来将航班信息和订票人信息保存到指定的磁盘文件中。

10、时间模块

功能设计

  • 为了更好地方便用户订票时的实际需求,本系统提供了查询当地时间的功能。

七、代码

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #include <time.h> #define HEAD1 " *************************Airplane Ticket Booking*****************************\n" #define HEAD2 " | Flight |Start City| Dest City|DepartureTime|ArrivalTime|price | number |\n" #define HEAD3 " |----------|----------|----------|-------------|-----------|-------|--------|\n" #define FORMAT " |%-10s|%-10s|%-10s|%-12s |%-10s | %-.2f| %4d |\n" #define DATA pst->stData.acFlight,pst->stData.acOrigin,pst->stData.acDest,pst->stData.acTakeOffTime,pst->stData.acReceiveTime,pst->stData.fPrice,pst->stData.iNumint iSave = 0; /************************************** 定义飞机票信息以及订票人的信息相关结构体 **************************************//*定义储存机票的结构体*/ struct AirPlane {char acFlight[10]; /*航班号*/char acOrigin[10]; /*出发地*/char acDest[10]; /*目的地*/char acTakeOffTime[10]; /*起飞时间*/char acReceiveTime[10]; /*降落时间*/float fPrice; /*票价*/char acDiscount[4]; /*折扣*/int iNum; /*剩余票数*/};/*定义购票者信息的结构体*/ struct Man {char acName[20]; /*姓名*/char acID[20]; /*身份证号*/char acSex[2]; /*性别*/int iBookNum; /*购票数*/char acBookFlight[10]; /*订购航班号*/ };/*定义机票信息节点的结构体*/ struct PlaneNode {struct AirPlane stData;struct PlaneNode *pstNext; };/*定义订票人信息节点的结构体*/ struct ManNode {struct Man stData;struct ManNode *pstNext; };/*定义相关表头打印函数*/ void PrintHead() {printf(HEAD1);printf(HEAD2);printf(HEAD3); } void PrintData(struct PlaneNode*stLp) {struct PlaneNode *pst = stLp;printf(FORMAT, DATA); }/*菜单界面*/ void Menu() {puts("**************************************************");puts("* Welcome to the airplane tickets booking system *");puts("*------------------------------------------------*");puts("* choose the following operations(0-9); *");puts("*------------------------------------------------*");puts("* 1.Insert flights 2.Search flights *");puts("* 3.Book tickets 4.Modify flight data *");puts("* 5.Show flights 6.Recommend flights *");puts("* 7.Refund tickets 8.Show current time *");puts("* 9.Save to files 0.quit *");puts("**************************************************"); } /*显示时间函数*/ void NowTime() {time_t lt;lt = time(NULL);printf("现在的时间是:%s\n", ctime(&lt)); }/*添加机票函数*/ void Insert(struct PlaneNode* pstPlaneNodeHead) {struct PlaneNode *pstHead,*pstTail, *pstCur, *pstNew;char acFlight[10];pstHead = pstTail = pstPlaneNodeHead;while (pstTail->pstNext != NULL){pstTail = pstTail->pstNext; /*让ptail指向最后一个节点*/}while (1){printf("Input the new flight number(-1 to end):");scanf("%s", acFlight);if (strcmp(acFlight, "-1") == 0)break;pstCur = pstPlaneNodeHead->pstNext;while (pstCur != NULL){if (strcmp(acFlight, pstCur->stData.acFlight) == 0){printf("this flight %s exists!\n", acFlight);return;/*如果航班号已存在,则返回*/}pstCur = pstCur->pstNext;}/*如果航班号没有和现有记录中的航班号重复,则新建一个链表节点*/pstNew = (struct PlaneNode*)malloc(sizeof(struct PlaneNode));strcpy(pstNew->stData.acFlight, acFlight);printf("Input the Start City:\n");scanf("%s", pstNew->stData.acOrigin);printf("Input the Dest City:\n");scanf("%s", pstNew->stData.acDest);printf("Input the Departure Time (Format 00:00):\n");scanf("%s", pstNew->stData.acTakeOffTime);printf("Input the Arrival Time (Format 00:00):\n");scanf("%s", pstNew->stData.acReceiveTime);printf("Input the price of ticket:\n");scanf("%f", &pstNew->stData.fPrice);printf("Input the discount (Format 0.0):\n");scanf("%s", pstNew->stData.acDiscount);printf("Input the number of the tickets:\n");scanf("%d", &pstNew->stData.iNum);pstNew->pstNext = NULL;pstTail->pstNext = pstNew;pstTail = pstNew;iSave = 1;/*有新的航班信息,保存标志置为1,若退出需提示是否保存信息*/} }/*查找机票函数*/ void Search(struct PlaneNode* pstPlaneNodeHead) {struct PlaneNode *pstPlaneNode;int iSel = 0, iCount = 0;char acFlight[10], acDest[10];pstPlaneNode = pstPlaneNodeHead->pstNext;if (pstPlaneNode == NULL){printf("No flight record!\n");return;}printf("Choose one way according to:\n1.flight number;\n2.Dest:\n");scanf("%d", &iSel);if (iSel == 1){printf("Input the flight number:");scanf("%s", acFlight);PrintHead();while (pstPlaneNode != NULL){if (strcmp(pstPlaneNode->stData.acFlight, acFlight) == 0){PrintData(pstPlaneNode);break;/*由于航班号是唯一的,找到一条即可退出*/}elsepstPlaneNode = pstPlaneNode->pstNext;}/*遍历一遍,均没有中途break,则提示用户没有记录*/if (pstPlaneNode == NULL)printf("Sorry, no record!\n");}else if (iSel == 2){printf("Input the Dest City:");scanf("%s", acDest);PrintHead();while (pstPlaneNode != NULL){if (strcmp(pstPlaneNode->stData.acDest, acDest) == 0){/*由于相同目的地的航班可能是多条,所以需要遍历完整个链表*/PrintData(pstPlaneNode);iCount++;}pstPlaneNode = pstPlaneNode->pstNext;}if (iCount == 0)/*如果记录数仍为0,则提示用户没有记录*/printf("Sorry, no record!\n");}else{printf("Sorry, please input right number:1-2\n");return;} }/*订票函数*/void Book(struct ManNode* pstManNodeHead, struct PlaneNode* pstPlaneNodeHead) {struct PlaneNode *pstPlaneNodeCur, *astPlaneNode[10]; /*定义临时指针和指针数组*/struct ManNode *pstManNodeCur, *pstManNodeTemp = 0;char acDest[10], acID[20], acName[20], acSex[2], acDecision[2], acFlight[10];/*iNum表示预定票数,iRecord记录符合要求的航班数*/int iNum = 0, iRecord = 0, k = 0, iFlag = 0;pstManNodeCur = pstManNodeHead;/*接收订票人信息链表的头指针*/while (pstManNodeCur->pstNext != NULL)pstManNodeCur = pstManNodeCur->pstNext;printf("Input the Dest City:\n");scanf("%s", acDest);/*输入目的地*/pstPlaneNodeCur = pstPlaneNodeHead->pstNext;while (pstPlaneNodeCur != NULL)/*循环条件为链表不为空*/{if (strcmp(pstPlaneNodeCur->stData.acDest, acDest) == 0)/*比较目的地*/{astPlaneNode[iRecord++] = pstPlaneNodeCur;/*目的地吻合的节点地址存到指针数组中*/}pstPlaneNodeCur = pstPlaneNodeCur->pstNext;/*指针后移*/}printf("\nthere are %d flight you can choose!\n", iRecord);PrintHead();/*输出表头*/for (k = 0; k < iRecord; k++)/*循环输出指针数组中的指针指向的航班信息*/PrintData(astPlaneNode[k]);if (iRecord == 0)/*若记录为0,表示没有符合条件的航班*/printf("sorry,no flight you can book!\n");else{printf("do you want to book it<y(Y)/n(N)>?\n");/*提示用户是否预定*/scanf("%s", acDecision);getchar(); /*提取多余的回车符,否则下面输入姓名的gets函数将获得一个回车符*/if (strcmp(acDecision, "y") == 0 || strcmp(acDecision, "Y") == 0){printf("Input your information!\n");/*输入订票的详细信息*/pstManNodeTemp = (struct ManNode*)malloc(sizeof(struct ManNode));printf("Input your name:");gets(acName);/*由于姓和名中间会有空格,只能用gets函数,不能用scanf结合%s*/strcpy(pstManNodeTemp->stData.acName, acName);printf("Input your id:");scanf("%s", acID);strcpy(pstManNodeTemp->stData.acID, acID);printf("Input your sex (M/F):");scanf("%s", acSex);strcpy(pstManNodeTemp->stData.acSex, acSex);printf("Input the flight number:");scanf("%s", acFlight);strcpy(pstManNodeTemp->stData.acBookFlight, acFlight);for (k = 0; k<iRecord; k++)if (strcmp(astPlaneNode[k]->stData.acFlight, acFlight) == 0){if (astPlaneNode[k]->stData.iNum < 1)/*判断是否有剩余的票*/{printf("no ticket!");return;}printf("remain %d tickets\n", astPlaneNode[k]->stData.iNum);iFlag = 1;break;}if (iFlag == 0){printf("error");return;}printf("Input the book number:");scanf("%d", &iNum);/*输入预定的票数,剩余票数相应减少*/astPlaneNode[k]->stData.iNum = astPlaneNode[k]->stData.iNum - iNum;pstManNodeTemp->stData.iBookNum = iNum;pstManNodeCur->pstNext = pstManNodeTemp;pstManNodeTemp->pstNext = NULL;pstManNodeCur = pstManNodeTemp;printf("success!\n");iSave = 1;}} } struct ManNode *FindMan(struct ManNode* pstManNodeHead, char acID[20]) {struct ManNode *pstManNodeCur;pstManNodeCur = pstManNodeHead->pstNext;while (pstManNodeCur){if (strcmp(pstManNodeCur->stData.acID, acID) == 0){return pstManNodeCur;}pstManNodeCur = pstManNodeCur->pstNext;}return NULL; }struct PlaneNode *FindPlane(struct PlaneNode* pstPlaneNodeHead, char acFlight[10]) {struct PlaneNode *pstPlaneNodeCur;pstPlaneNodeCur = pstPlaneNodeHead->pstNext;while (pstPlaneNodeCur){if (strcmp(pstPlaneNodeCur->stData.acFlight, acFlight) == 0){//iMark = 1;return pstPlaneNodeCur;}pstPlaneNodeCur = pstPlaneNodeCur->pstNext;}return NULL; }/*退票系统*/ void Refund(struct ManNode* pstManNodeHead, struct PlaneNode* pstPlaneNodeHead) {struct ManNode *pstManNodeCur, *pstManNodeFind = 0;struct PlaneNode *pstPlaneNodeFind = 0;char acID[20], acDecision[2];int iNum, iBookNum;printf("\nInput your ID:");scanf("%s", acID);pstManNodeFind = FindMan(pstManNodeHead, acID);if (pstManNodeFind == NULL)printf("can't find!\n");else /*找到了相应的旅客订票信息*/{printf("\t\tthis is your tickets:\n");printf("id number:%s\n", pstManNodeFind->stData.acID);printf("name:%s\n", pstManNodeFind->stData.acName);printf("sex:%s\n", pstManNodeFind->stData.acSex);printf("book flight:%s\n",pstManNodeFind->stData.acBookFlight);printf("book number:%d\n", pstManNodeFind->stData.iBookNum);printf("do you want to cancel it?<y/n>");scanf("%s", acDecision);if (strcmp(acDecision, "y") == 0 || strcmp(acDecision, "Y") == 0){/*将pstManNodeCur定位到指向pstManNodeFind前面那个节点*/pstManNodeCur = pstManNodeHead;while (pstManNodeCur->pstNext != pstManNodeFind)pstManNodeCur = pstManNodeCur->pstNext;/*找到该旅客订票信息中对应的航班记录*/pstPlaneNodeFind = FindPlane(pstPlaneNodeHead, pstManNodeFind->stData.acBookFlight);if (pstPlaneNodeFind != NULL)/*退票后,对应航班的剩余票数相应增加*/{iNum = pstPlaneNodeFind->stData.iNum;iBookNum = pstManNodeFind->stData.iBookNum;pstPlaneNodeFind->stData.iNum = iNum + iBookNum;} pstManNodeCur->pstNext = pstManNodeFind->pstNext;free(pstManNodeFind);/*释放该乘客订票记录的链表节点空间*/printf("successful!\n");/*航班信息有调整,保存标志置为1,退出系统时提示用户是否保存*/iSave = 1;}} }/*修改机票信息函数*/ void Modify(struct PlaneNode* pstPlaneNodeHead) {struct PlaneNode *pstPlaneNodeCur;char acFlight[10];pstPlaneNodeCur = pstPlaneNodeHead->pstNext;if (pstPlaneNodeCur == NULL){printf("no flight to modify!\n");return;}else{printf("Input the flight number you want to modify:");scanf("%s", acFlight);while (pstPlaneNodeCur != NULL){if (strcmp(pstPlaneNodeCur->stData.acFlight, acFlight) == 0)break;elsepstPlaneNodeCur = pstPlaneNodeCur->pstNext;}if (pstPlaneNodeCur){printf("Input new Start City:\n");scanf("%s", pstPlaneNodeCur->stData.acOrigin);printf("Input new Dest City:\n");scanf("%s", pstPlaneNodeCur->stData.acDest);printf("Input new Departure Time:\n");scanf("%s", pstPlaneNodeCur->stData.acTakeOffTime);printf("Input new Arrival Time:\n");scanf("%s", pstPlaneNodeCur->stData.acReceiveTime);printf("Input new price of ticket:\n");scanf("%f", &pstPlaneNodeCur->stData.fPrice);printf("Input new discount:\n");scanf("%s", pstPlaneNodeCur->stData.acDiscount);printf("Input new number of the tickets:\n");scanf("%d", &pstPlaneNodeCur->stData.iNum);printf("successful!\n");iSave = 1;return;}elseprintf("\tcan't find your ticket!\n");} }/*显示机票信息函数*/ void Show(struct PlaneNode* pstPlaneNodeHead) {struct PlaneNode *pstPlaneNodeCur;pstPlaneNodeCur = pstPlaneNodeHead->pstNext;PrintHead();if (pstPlaneNodeHead->pstNext == NULL){printf("no flight ticket!\n");}else{while (pstPlaneNodeCur != NULL){PrintData(pstPlaneNodeCur);pstPlaneNodeCur = pstPlaneNodeCur->pstNext;}} }/*快速终点站推荐机票函数*/ void Recommend(struct PlaneNode* pstPlaneNodeHead) {struct PlaneNode *pstPlaneNodeCur;char acDest[10],acTime[10];int iNum = 0;pstPlaneNodeCur = pstPlaneNodeHead->pstNext;printf("Input your destination:");scanf("%s", acDest);printf("Input the earliest time you can take:");scanf("%s",acTime);PrintHead();while (pstPlaneNodeCur != NULL){if (strcmp(pstPlaneNodeCur->stData.acDest, acDest) == 0){if (strcmp(acTime, pstPlaneNodeCur->stData.acTakeOffTime) < 0){PrintData(pstPlaneNodeCur);iNum++;}}pstPlaneNodeCur = pstPlaneNodeCur->pstNext;}printf("there are %d flight you can take!\n", iNum);if (iNum != 0){printf("please choose 3rd operation to book it!\n");} }/*保存机票信息函数*/ void SavePlane(struct PlaneNode* pstPlaneNodeHead) {FILE *pfPlane;struct PlaneNode *pstPlaneNodeCur;int iCount = 0, iFlag = 1;pfPlane = fopen("plane.txt", "wb");if (pfPlane == NULL){printf("the file can't be opened!");return;}pstPlaneNodeCur = pstPlaneNodeHead->pstNext;while (pstPlaneNodeCur != NULL){if (fwrite(pstPlaneNodeCur, sizeof(struct PlaneNode), 1, pfPlane) == 1){pstPlaneNodeCur = pstPlaneNodeCur->pstNext;iCount++;}else{iFlag = 0;break;}}if (iFlag){printf("you have save %d flights!\n", iCount);iSave = 0;}fclose(pfPlane); }/*保存订票人信息函数*/ void SaveMan(struct ManNode* pstManNodeHead) {FILE *pfMan;struct ManNode *pstManNodeCur;int iCount = 0, iFlag = 1;pfMan = fopen("man.txt", "wb");if (pfMan == NULL){printf("the file can't bo opened!");return;}pstManNodeCur = pstManNodeHead->pstNext;while (pstManNodeCur != NULL){if (fwrite(pstManNodeCur, sizeof(struct ManNode), 1, pfMan) == 1){pstManNodeCur = pstManNodeCur->pstNext;iCount++;}else{iFlag = 0;break;}} }int main() {FILE *pfPlane, *pfMan;struct PlaneNode *pstPlaneNodeTemp, *pstPlaneNodeHead, *pstPlaneNodeCur;struct ManNode *pstManNodeTemp, *pstManNodeHead, *pstManNodeCur;int iSel = 0;char c1;pstPlaneNodeHead = (struct PlaneNode*)malloc(sizeof(struct PlaneNode));pstPlaneNodeHead->pstNext = NULL;pstPlaneNodeCur = pstPlaneNodeHead;pstManNodeHead = (struct ManNode*)malloc(sizeof(struct ManNode));pstManNodeHead->pstNext = NULL;pstManNodeCur = pstManNodeHead;pfPlane = fopen("plane.txt", "ab+");if (pfPlane == NULL){printf("can't open plane.txt!");return 0;}while (!feof(pfPlane)){pstPlaneNodeTemp = (struct PlaneNode*)malloc(sizeof(struct PlaneNode));if (fread(pstPlaneNodeTemp, sizeof(struct PlaneNode), 1, pfPlane) == 1){pstPlaneNodeTemp->pstNext = NULL;pstPlaneNodeCur->pstNext = pstPlaneNodeTemp;pstPlaneNodeCur = pstPlaneNodeTemp;}}free(pstPlaneNodeTemp);fclose(pfPlane);pfMan = fopen("man.txt", "rb+");if (pfMan == NULL){printf("can't open man.txt!");return 0;}while (!feof(pfMan)){pstManNodeTemp = (struct ManNode*)malloc(sizeof(struct ManNode));if (fread(pstPlaneNodeHead, sizeof(struct ManNode), 1, pfMan) == 1){pstManNodeTemp->pstNext = NULL;pstManNodeCur->pstNext = pstManNodeTemp;pstManNodeCur = pstManNodeTemp;}}free(pstManNodeTemp);fclose(pfMan);while (1){system("cls");Menu();printf("Input 0-9 operations:");scanf("%d", &iSel);getchar();/*取走数字后面多余的回车符*/system("cls");if (iSel == 0){if (iSave == 1){printf("do you want to save?<y/n>");scanf("%c", &c1);if (c1 == 'y' || c1 == 'Y'){SaveMan(pstManNodeHead);SavePlane(pstPlaneNodeHead);}}break;}switch (iSel){case 1:Insert(pstPlaneNodeHead); break;case 2: Search(pstPlaneNodeHead); break;case 3: Book(pstManNodeHead, pstPlaneNodeHead); break;case 4:Modify(pstPlaneNodeHead); break;case 5:Show(pstPlaneNodeHead); break;case 6:Recommend(pstPlaneNodeHead); break;case 7:Refund(pstManNodeHead, pstPlaneNodeHead); break;case 8:NowTime(); break;case 9:SaveMan(pstManNodeHead); SavePlane(pstPlaneNodeHead); break;case 0:return 0;}printf("\nplease press any key to continue.......\n");getch();} }

上一篇:几种常用的命名法

下一篇:elasticsearch bulk批量增删改(超详细)

相关文章

Copyright © 网站出售-网站交易平台 版权信息

网站备案号:黔ICP备2023004141号