目录

一、设计目的

二、设计内容与要求

三、自己做的具体项目实现的功能:

四、设计思路

五、实现过程

六、代码:

七、实验报告和ppt:

八、结果展示:

九、我的文档数据:


一、设计目的

1.通过对高铁客运订票系统的程序设计,巩固在数据结构中学习的算法知识,提高对程序的整体设计思路,提高自己的程序设计的能力。同时通过对程序的设计与实现中找出自己在学习上以及在算法的优点和缺点,便于以后的学习与改进。

二、设计内容与要求

  1. 项目设计内容和要求

功能描述

高铁客运订票的业务活动包括:查询客运线和客票预定的信息、

客票预定和办理退票等。设计一个计算机程序,使上述任务能借助计

算机来完成。

【具体要求】

1系统必须存储的数据信息

(1)客运线信息(9个):高铁抵达城市、出发城市、经停站、列车

号、发车时间、票价、总位置和剩余位置、已定票的客户名单。

(2)客户信息(3个):客户姓名、证件号、座位号

A、查询客运线信息:根据列车号,输出列车发车站、目的地点、

经停站、经停时间、票价、剩余票数和位置等信息。

B、查询客户预订信息:根据客户证件号,输出上车城市,目的地,

经停站,列车号和座位号等信息。

  1. 系统能实现的操作和功能
  1. 承办订票业务:

A、基础版:根据客户提出的要求(列车抵达城市、发出时间、订

票数量)查询列车信息(包括票价和余票数量),若满足要求,则为

客户办理订票手续,输出座位号。:

B、进阶版:根据客户提出的要求(列车抵达城市、发出时间、订

票数量)查询列车信息(包括票价和余票数量)列表(所有符合要求

的列车可以选择展示的排列方式:按照价格递增/发车时间递增/总时

间递增)(完成-并入查询功能中).客户可以选择座位号,若满足要

求,则为客户办理订票手续,输出座位号。

  1. 承办退票业务:

A、基础版:根据客户提供的情况(列车号,订票数量),为客户

办理退票手续。

B、进阶版:根据客户提供的情况(列车号,发车时间,身份证

号,订票数量),为客户办理退票手续。

  1. 查询功能:(较高要求)

A、查询客运线信息:根据列车号,输出列车发车站、目的地点、

经停站、经停时间、票价、剩余票数和位置等信息。

B、查询客户预订信息:根据客户证件号,输出上车城市,目的地,

经停站,列车号和座位号等信息。

三、自己做的具体项目实现的功能:

①查询功能:

A、查询客运线信息:根据列车号,输出列车发车站、目的地点、

经停站、经停时间、票价、剩余票数和位置等信息。

B、查询客户预订信息:根据客户证件号,输出上车城市,目的地,

经停站,列车号和座位号等信息。

C、根据客户提出的要求(列车抵达城市、发出时间、订

票数量)查询列车信息(包括票价和余票数量)列表(所有符合要求

的列车可以选择展示的排列方式:按照价格递增/发车时间递增/总时

间递增)(完成-并入查询功能中).

②订票功能:

进阶版:根据客户提出的要求(列车抵达城市、发出时间、订

票数量)查询列车信息(包括票价和余票数量)列表(所有符合要求

的列车可以选择展示的排列方式:按照价格递增/发车时间递增/总时

间递增)(完成-并入查询功能中).客户可以选择座位号,若满足要

求,则为客户办理订票手续,输出座位号。

③退票功能:

A、基础版:根据客户提供的情况(列车号,订票数量),为客户

办理退票手续。

B、进阶版:根据客户提供的情况(列车号,发车时间,身份证

号,订票数量),为客户办理退票手续。如果订购多张票,可以仅退

部分票.(应该采用堆进行存储的,可以方便进行删除

四、设计思路

1、功能设计流程导图:

将订票要求中的进阶要求中的:

“根据客户提出的要求(列车抵达城市、发出时间、订票数量)查询列车信息(包括票价和余票数量)列表(所有符合要求的列车可以选择展示的排列方式:按照价格递增/发车时间递增/总时间递增)”并入查询功能中。

2、数据流程

①对于高铁的信息:

(1)先进行设置高铁的结构:

列车号(字符类型),发车地点,发出时间,目的地点,经停站,剩余票数

位置(座位)。

(2)经停站和终点站采用同一种结构

经停站的顺序位置(终点不需要),经停站的地点名,经停时间(终点不需要),票价。

(3)票价采用一个结构

一等座的票价,二等座的票价,站座的票价。

(4)座位号将一等座和二等座分别进行定义:

标志:进行判断该座位又没有人。

(5)采用文件将高铁的初始信息进行存储。其中数据之间用“!”进行分割,便于读文件

(6)在执行程序时,先将文件读进数组中用数组进行存储高铁的数据。

②对于客户信息

  1. 不用文档进行存储,直接在程序中进行申请空间进行存储客户信息。
  2. 客户的结构:

客户名字,客户的身份证,客户的订票数量,客户的高铁信息。

  1. 客户的高铁信息结构:

所定的列车号,列出的出发点,终点站,出发时间,客户的座位号。

  1. 客户的座位号结构:

座位的级别(用A,B,C进行区分是几等座),座位的数字号。

3、关键技术的解决方法:

  1. 将地铁所有的数据存储在文档中,精准读出各个对应的数据在程序中:

采用“!”做分割符,读到“!”就是一个数据的结束。

(2)用文件读取中文字符时出现乱码:主要是文件的问题

将txt文本编码格式改成ANSI:打开记事本->文件->另存为->更改编码格式为ANSI->保存。

(3)选择展示的排列方式:按照价格递增/发车时间递增/总时间递增

采用冒泡,快速排序算法进行排序。

(4)不同座位的价格计算:

采用一个统一的公式即可。

五、实现过程

1.文件数据:

2.查询功能:

六、代码:

注意我这里用到的是文档的操作,所有的信息都是在文档中,因此要使用该程序请先在主函数中的第一行该文档的名字。(在149行进行修改)

#include #include #include #define MAX 1000//定义票价struct Piao_pay {int first_pay;int second_pay;int stand_pay;};typedef struct Piao_pay piao_pay;//终点+过度点的结构struct Tran_spot {//表示是第几站 :方便进行计算价格int flag_zhang;//地点名char place_name[15];//时间(在终点不用存)int place_time;//单位为分钟//票价(结构)piao_pay tranpay;};typedef struct Tran_spot tran_spot;//定义票数struct Piao_num {int piao_first;int piao_second;int piao_stand;//总的票数之和int piao_sum;};typedef struct Piao_num piao_num;//定义座位号的结构struct Seat {//判断有没有人int seat_flag;//身份证char identify[20];};typedef struct Seat seat;//高铁的整体结构struct high_speed_rail {//标志:表示有没有选到该列车int tran_flag;//列车号char Train_number[10];//常用5个字符//发车地点char begin_place[20]; //中间隔5个空格做分界 每次读入9个中文//发车时间char Train_begintime[10];//结束时间char Tran_finatime[10];//经停站tran_spot tranplace[100];//终点站tran_spot finaplace;//总时间char sumtime[15];//票数piao_num piaonum;//座位号 :一等座的号(以A开头以1~100为数字)seat *first_num;//座位号:二等座的座位号(以B开头1~100的数字)seat *second_num;};typedef struct high_speed_rail Tran;//座位的信息struct Z {char denji;//用于分辨乘坐的那种等级的座位int num;};typedef struct Z zuowei;//定义客户乘坐的高铁的信息struct Gao {char liechenum[10];//列车号char kehuo_place[10];//出发点char kehuo_zongdian[10];//终点站char kehuo_time[10];//出发时间zuowei kehuo_hao[50];//客户乘坐的座位号,注意站座没有座位号};typedef struct Gao gaotie;//定义客户的结构typedef struct Custom {char name[20];//客户名字char identify[20];//客户的身份证int sum_piao; //客户订票的数量gaotie xinxi;//从一开始存};typedef struct Custom custom;//定义退票的空位置struct K {int num;//数量zuowei wezhi[50];//记录空出的位置};//全局变量Tran tran[MAX];FILE *dt;int *jinting;//经停站的个数统计 数组下标从1开始存int tran_sum=0;//总的高铁数int flag_jinting1[500];//通过列车号进行查询的经停数量custom kehou_xinxi[100];//客户结构int kehuo_sum;//统计当前客户的数量方便存入数组从一开始存struct K kong;//函数void duchu(int flag,int i);//读取地铁的文件存入数组中void piao_price(int i,int num);void chaxun();void lieche_hao();void time_fine(Tran *shu,int longer);void piaosum_fine(Tran *shu,int longer) ;void swap(Tran *a,Tran *b);void Printf(Tran *shu,int N);void querry_paixu(Tran *shu, int N) ;void Qsort(Tran *shu,int left,int right);Tran median3(Tran *shu,int left ,int right);void xier_paixu(Tran *shu,int N);void zong_fin(Tran *shu,int longer);void swap1(int *a,int *b);void chufa_zondian();void maopao(Tran *shu,int longer) ;void dinpaio();void chaxun_custom();void tueipiao();int main() {//为什么用16以上的数据不行//先用文件将地铁的数据存入dt=fopen("高铁数据.txt","r");if(dt!=NULL) {kong.num=0;//printf("文件打开成功啦\n");//总的高铁数:不一定是一位数char tran_ch;while((tran_ch=fgetc(dt))!='!') {tran_sum=tran_sum*10;tran_sum=tran_sum+(tran_ch-'0');}//tran_sum=fgetc(dt)-'0';//将字符转化为数字类型//printf("总的高铁数:%d\n",tran_sum);//为什么用这个有问题呢--》而用数组就没有问题//tran=(Tran *)malloc(sizeof(tran)*(tran_sum+1));//从一开始存储高铁jinting=(int *)malloc(sizeof(int)*(tran_sum+1)); //经停站的个数//直接采用有多少个列车存多少次,不需要进行检测换行int flag=1;for(int i=1; i<=tran_sum; i++) {//printf("i==%d",i);//先存入列车号//if(i!=1)fgetc(dt);//读掉换行符号fgets(tran[i].Train_number,6,dt);//printf("列车号:%s。",tran[i].Train_number);//读出发地点flag=1;//读取标志:从出发点开始读duchu(flag,i); //传进当前下标和读取位置的标志//读出结束地点flag++;//2duchu(flag,i);//读发车时间flag++;//3duchu(flag,i);//结束时间flag++;//4duchu(flag,i);//总时间flag++;//5duchu(flag,i);//读入经停站的个数flag++;//6duchu(flag,i);//为什么用这个有问题呢--》而用数组就没有问题//tran[i].tranplace=(tran_spot *)malloc(sizeof(tran_spot)*jinting[i]);//开辟经停站的数组//存经停站并计算各个票价的价钱flag++;//7duchu(flag,i);//计算终点站的票价tran[i].finaplace.tranpay.first_pay=50*(tran[i].tranplace[jinting[i]-1].flag_zhang+1);tran[i].finaplace.tranpay.second_pay=tran[i].finaplace.tranpay.stand_pay=tran[i].finaplace.tranpay.first_pay/2;//存票数flag++;//8duchu(flag,i);//printf("\n");}} else {printf("文件打开失败");return 0;}//存完数据后进行页面的设置int chose;while(1) {printf("\t\t高铁客运系统");printf("\n\t\t**************************************\n");printf("\n\t\t*1------查询*\n");printf("\n\t\t*2------订票业务*\n");printf("\n\t\t*3------退票业务*\n");printf("\n\t\t*0------结束*\n");printf("\n\t\t**************************************\n");printf("\t\t请选择菜单号(0--3):");scanf("%d",&chose);//功能选择调用switch(chose) {case 1: {chaxun();break;}case 2: {dinpaio();break;}case 3: {tueipiao(); break;}case 0: {fclose(dt);return 0;}default:{printf("输入错误,没有该选项\n");break;}}}}//读取地铁的文件存入数组中//用switch比if更好:更快void duchu(int flag,int i) {int k=0;//下标char ch;//过度字符switch(flag) {//读出发地点case 1: {fgetc(dt);while((ch=fgetc(dt))!='!') {tran[i].begin_place[k++]=ch;}tran[i].begin_place[k]='\0';//printf("出发点:%s。",tran[i].begin_place);tran[i].tran_flag=0;break;}//读出结束地点:不用存时间,但没有存票价case 2 : {//fgetc(dt);不需要在读取一次!。因为它作为上一次的结束标志while((ch=fgetc(dt))!='!') {tran[i].finaplace.place_name[k++]=ch;}tran[i].finaplace.place_name[k]='\0';//printf("结束点:%s。",tran[i].finaplace.place_name);break;}case 3: {while((ch=fgetc(dt))!='!') {tran[i].Train_begintime[k++]=ch;}tran[i].Train_begintime[k]='\0';//printf("出发时间:%s。",tran[i].Train_begintime);break;}//结束时间case 4: {while((ch=fgetc(dt))!='!') {tran[i].Tran_finatime[k++]=ch;}tran[i].Tran_finatime[k]='\0';//printf("结束时间:%s。",tran[i].Tran_finatime);break;}//总时间case 5: {while((ch=fgetc(dt))!='!') {tran[i].sumtime[k++]=ch;}tran[i].sumtime[k]='\0';//printf("总时间:%s。",tran[i].sumtime);break;}//统计经过的经停站有几个case 6: {int sum=0;while((ch=fgetc(dt))!='!') {sum=sum*10;sum=sum+(ch-'0');}jinting[i]=sum;//printf("列测车%d的经停站共有%d个:",i,jinting[i]);break;}//存经停站case 7: {printf("\n");int num=0; //经停站的下标int flag=1;//经停站的顺序标志while((ch=fgetc(dt))!='!') {if(ch=='(') {//将停留时间存完int sum=0;while((ch=fgetc(dt))!=')') {sum=sum*10;sum=sum+(ch-'0');}//经停站经停时间tran[i].tranplace[num].place_time=sum;//printf("%d",tran[i].tranplace[num].place_time);//标志tran[i].tranplace[num].flag_zhang=flag;//该价钱计算piao_price(i,num);tran[i].tranplace[num].place_name[k]='\0';//printf("%s-》",tran[i].tranplace[num].place_name);k=0;flag++;num++;} else {tran[i].tranplace[num].place_name[k++]=ch;}}break;}//存票数case 8: {int sum=0;while((ch=fgetc(dt))!='!') {sum=sum*10;sum=sum+(ch-'0');}tran[i].piaonum.piao_sum=sum;//printf("总的票数:%d",tran[i].piaonum.piao_sum);sum=0;while((ch=fgetc(dt))!='!') {sum=sum*10;sum=sum+(ch-'0');}tran[i].piaonum.piao_first=sum;//printf("一等座票数:%d",tran[i].piaonum.piao_first);tran[i].first_num=(seat *)malloc(sizeof(seat)*(tran[i].piaonum.piao_first+10));if(tran[i].first_num==NULL)exit(0);sum=0;while((ch=fgetc(dt))!='!') {sum=sum*10;sum=sum+(ch-'0');}tran[i].piaonum.piao_second=sum;//printf("二等座票数:%d",tran[i].piaonum.piao_second);tran[i].second_num=(seat *)malloc(sizeof(seat)*(tran[i].piaonum.piao_second+10));if(tran[i].second_num==NULL)exit(0);sum=0;while((ch=fgetc(dt))!='!') {sum=sum*10;sum=sum+(ch-'0');}tran[i].piaonum.piao_stand=sum;//printf("站座票数:%d",tran[i].piaonum.piao_stand);break;}}}//每一站的不同等级座位的价钱的换算void piao_price(int i,int num) {tran[i].tranplace[num].tranpay.first_pay=50*tran[i].tranplace[num].flag_zhang;tran[i].tranplace[num].tranpay.second_pay=tran[i].tranplace[num].tranpay.stand_pay=tran[i].tranplace[num].tranpay.first_pay/2;}//查询函数void chaxun() {int xuanzhe;while(1) {printf("\n\t\t高铁客运查询系统");printf("\n\t\t**************************************\n");printf("\n\t\t*1------查询列车号*\n");printf("\n\t\t*2------出发地-目的地 *\n");printf("\n\t\t*3------查询客户预定信息*\n");printf("\n\t\t*0------退出查询*\n");printf("\n\t\t**************************************\n");printf("\t\t请选择菜单号(0--3):");scanf("%d", &xuanzhe);switch(xuanzhe) {case 1: {lieche_hao();break;}case 2: {chufa_zondian();break;}case 3: {chaxun_custom();break;}case 0: {return ;break;}default: {printf("\n\t\t----------------------------------------------------------没有该选项,请重新输入----------------------------------------------------------\n");printf("\n");break;}}}}//通过列车号进行查询void lieche_hao() {int chose;char cha[10];printf("请输入要查询的列车号:");scanf("%s",cha);printf("\t\t----------------------------------------------------------以下为%s列车的信息-----------------------------------------------------------------\n",cha);//printf("列车号\t\t出发点\t\t终点站\t\t出发时间\t\t到达时间\t\t经停站(经停时间,到达时间)\t\t\t\t\t\t\t一等座票数(价格)\t\t二等座票数(价格)\t\t站座票数(价格)");//输出for(int i=1; i<=tran_sum; i++) {if(stricmp(cha,tran[i].Train_number)==0) {tran[i].tran_flag=1;//标记查询的列车号printf("\t\t列车号:%s。出发点:%s。终点站:%s。出发时间:%s。到达时间:%s。总时长:%s。\n",tran[i].Train_number,tran[i].begin_place,tran[i].finaplace.place_name,tran[i].Train_begintime,tran[i].Tran_finatime,tran[i].sumtime);printf("\t\t\t经停站(经停时间):");for(int j=1; j<=jinting[i]; j++) {printf("%s(%d分钟)",tran[i].tranplace[j-1].place_name,tran[i].tranplace[j-1].place_time);}printf("\n");printf("\t\t\t一等座票数(价格):%d(%d元)\n",tran[i].piaonum.piao_first,tran[i].finaplace.tranpay.first_pay);printf("\t\t\t二等座票数(价格):%d(%d元)\n",tran[i].piaonum.piao_second,tran[i].finaplace.tranpay.second_pay);printf("\t\t\t站座票数(价格):%d(%d元)\n",tran[i].piaonum.piao_stand,tran[i].finaplace.tranpay.stand_pay);}}//输出结束//将标记的数存进数组里方便进行用算法优化int longer=0;int tran_long=0;Tran shu[500];for(int i=1; i<=tran_sum; i++) {if(tran[i].tran_flag==1) {flag_jinting1[++tran_long]=jinting[i];//printf("%d+",flag_jinting1[tran_long]);shu[++longer]=tran[i];//printf("%s++",shu[longer].Train_number);}}while(1) {//这一部分是共同函数一定用共同的函数来写printf("\n\t\t******************************************************\n");printf("\n\t\t*1------根据出发时间查询%s列车 *\n",cha);printf("\n\t\t*2------根据订票数量查询%s列车 *\n",cha);printf("\n\t\t*3------按照价格递增显示%s列车 *\n",cha);printf("\n\t\t*4------按照时间递增显示%s列车 *\n",cha);printf("\n\t\t*5------按照总时间递增显示%s列车 *\n",cha);printf("\n\t\t*0------退出查询%s列车信息 *\n",cha);printf("\n\t\t******************************************************\n");printf("\t\t请选择菜单号(0--5):");scanf("%d",&chose);switch(chose) {case 1: {time_fine(shu,longer);break;}case 2: {piaosum_fine(shu,longer);break;}case 3: {querry_paixu(shu,longer);printf("\t\t----------------------------------------------------------按照价格递增显示列车如下----------------------------------------------------------\n");Printf(shu,longer);break;}case 4: {xier_paixu(shu,longer);printf("\t\t----------------------------------------------------------按照时间递增显示列车如下----------------------------------------------------------\n");Printf(shu,longer);break;}case 5: {zong_fin(shu,longer);printf("\t\t----------------------------------------------------------按照总时间递增显示列车如下----------------------------------------------------------\n");Printf(shu,longer);break;}//记得把标记清零case 0: {for(int i=1; i<=tran_sum; i++) {if(tran[i].tran_flag!=0)tran[i].tran_flag=0;}return;}default: {printf("\n\t\t----------------------------------------------------------没有该选项,请重新输入----------------------------------------------------------\n");printf("\n");break;}}}}//出发地-目的地进行查询的void chufa_zondian() {int chose;char cha1[12];char cha2[12];printf("请输入出发点:");scanf("%s",cha1);printf("请输入目的地:");scanf("%s",cha2);printf("\n\t\t----------------------------------------------------------以下为从%s到%s的列车的信息-----------------------------------------------------------------\n",cha1,cha2);//输出for(int i=1; i<=tran_sum; i++) {if(stricmp(cha1,tran[i].begin_place)==0 && stricmp(cha2,tran[i].finaplace.place_name)==0) {tran[i].tran_flag=1;//标记查询的列车号printf("\t\t列车号:%s。出发点:%s。终点站:%s。出发时间:%s。到达时间:%s。总时长:%s。\n",tran[i].Train_number,tran[i].begin_place,tran[i].finaplace.place_name,tran[i].Train_begintime,tran[i].Tran_finatime,tran[i].sumtime);printf("\t\t\t经停站(经停时间):");for(int j=1; j<=jinting[i]; j++) {printf("%s(%d分钟)",tran[i].tranplace[j-1].place_name,tran[i].tranplace[j-1].place_time);}printf("\n");printf("\t\t\t一等座票数(价格):%d(%d元)\n",tran[i].piaonum.piao_first,tran[i].finaplace.tranpay.first_pay);printf("\t\t\t二等座票数(价格):%d(%d元)\n",tran[i].piaonum.piao_second,tran[i].finaplace.tranpay.second_pay);printf("\t\t\t站座票数(价格):%d(%d元)\n",tran[i].piaonum.piao_stand,tran[i].finaplace.tranpay.stand_pay);}}//输出结束//将标记的数存进数组里方便进行用算法优化int longer=0;int tran_long=0;Tran shu[500];for(int i=1; i<=tran_sum; i++) {if(tran[i].tran_flag==1) {flag_jinting1[++tran_long]=jinting[i];//printf("%d+",flag_jinting1[tran_long]);shu[++longer]=tran[i];//printf("%s++",shu[longer].Train_number);}}while(1) {//这一部分是共同函数一定用共同的函数来写printf("\n\t\t****************************************************************\n");printf("\n\t\t*1------根据出发时间查询从%s到%s的列车 *\n",cha1,cha2);printf("\n\t\t*2------根据订票数量查询从%s到%s的列车 *\n",cha1,cha2);printf("\n\t\t*3------按照价格递增显示从%s到%s的列车 *\n",cha1,cha2);printf("\n\t\t*4------按照时间递增显示从%s到%s的列车 *\n",cha1,cha2);printf("\n\t\t*5------按照总时间递增显示从%s到%s的列车 *\n",cha1,cha2);printf("\n\t\t*0------退出查询从%s到%s的列车信息 *\n",cha1,cha2);printf("\n\t\t****************************************************************\n");printf("\t\t请选择菜单号(0--5):");scanf("%d",&chose);switch(chose) {case 1: {time_fine(shu,longer);break;}case 2: {piaosum_fine(shu,longer);break;}case 3: {maopao(shu,longer);printf("\t\t----------------------------------------------------------按照价格递增显示列车如下----------------------------------------------------------\n");Printf(shu,longer);break;}case 4: {xier_paixu(shu,longer);printf("\t\t----------------------------------------------------------按照时间递增显示列车如下----------------------------------------------------------\n");Printf(shu,longer);break;}case 5: {zong_fin(shu,longer);printf("\t\t----------------------------------------------------------按照总时间递增显示列车如下----------------------------------------------------------\n");Printf(shu,longer);break;}//记得把标记清零case 0: {for(int i=1; i<=tran_sum; i++) {if(tran[i].tran_flag!=0)tran[i].tran_flag=0;}for(int i=1; i<=longer; i++) {flag_jinting1[i]=0;}return;}default: {printf("\n\t\t----------------------------------------------------------没有该选项,请重新输入----------------------------------------------------------\n");printf("\n");break;}}}}//根据出发时间查找void time_fine(Tran *shu,int longer) {charfine_time[10];printf("请输入要查找的出发时间(格式为xx:xx):");scanf("%s",fine_time);printf("\t\t----------------------------------------------------------以下为出发时间为%s的列车信息----------------------------------------------------------\n",fine_time);for(int i=1; i<=longer; i++) {if(stricmp(shu[i].Train_begintime,fine_time)==0) {printf("\t\t列车号:%s。出发点:%s。终点站:%s。出发时间:%s。到达时间:%s。总时长:%s。\n",shu[i].Train_number,shu[i].begin_place,tran[i].finaplace.place_name,shu[i].Train_begintime,shu[i].Tran_finatime,shu[i].sumtime);printf("\t\t\t经停站(经停时间):");for(int j=1; j<=flag_jinting1[i]; j++) {printf("%s(%d分钟)",shu[i].tranplace[j-1].place_name,shu[i].tranplace[j-1].place_time);}printf("\n");printf("\t\t\t一等座票数(价格):%d(%d元)\n",shu[i].piaonum.piao_first,shu[i].finaplace.tranpay.first_pay);printf("\t\t\t二等座票数(价格):%d(%d元)\n",shu[i].piaonum.piao_second,shu[i].finaplace.tranpay.second_pay);printf("\t\t\t站座票数(价格):%d(%d元)\n",shu[i].piaonum.piao_stand,shu[i].finaplace.tranpay.stand_pay);}}}//根据订票数量进行查找void piaosum_fine(Tran *shu,int longer) {int sum;printf("请输入你要定票的数量:");scanf("%d",&sum);printf("\t\t----------------------------------------------------------以下为票数大于%d的列车信息----------------------------------------------------------\n",sum);for(int i=1; i=sum) {printf("\t\t列车号:%s。出发点:%s。终点站:%s。出发时间:%s。到达时间:%s。总时长:%s。\n",shu[i].Train_number,shu[i].begin_place,tran[i].finaplace.place_name,shu[i].Train_begintime,shu[i].Tran_finatime,shu[i].sumtime);printf("\t\t\t经停站(经停时间):");for(int j=1; j1; i--) {flag=0;for(int j=1; jshu[j+1].finaplace.tranpay.first_pay) {swap(&shu[j],&shu[j+1]);swap1(&flag_jinting1[j],&flag_jinting1[j+1]);flag=1;}}if(flag==0)break;}}//交换函数void swap(Tran *a,Tran *b) {Tran c;c=*a;*a=*b;*b=c;}void swap1(int *a,int *b) {int c;c=*a;*a=*b;*b=c;}//采用冒泡排序对出发时间进行排序void xier_paixu(Tran *shu,int N) {int i,j,flag=0;int tran1,tran2;int num1,num2;for(i=N; i>1; i--) {flag=0;for(j=1; jtran2) {swap1(&flag_jinting1[j],&flag_jinting1[j+1]);swap(&shu[j],&shu[j+1]);flag=1;}//分钟比较else if(tran1==tran2) {num1=(shu[j].Train_begintime[3]-'0')*10+(shu[j].Train_begintime[4]-'0');num2=(shu[j+1].Train_begintime[3]-'0')*10+(shu[j+1].Train_begintime[4]-'0');if(num1>num2) {swap1(&flag_jinting1[j],&flag_jinting1[j+1]);swap(&shu[j],&shu[j+1]);flag=1;}}}if(flag==0)break;}}//采用冒泡排序void zong_fin(Tran *shu,int longer) {int i,j,flag;int xiaoshi1,xiaoshi2;int fenzhong1,fenzhong2;for(i=longer; i>=1; i--) {flag=0;for(j=1; jxiaoshi2) {flag=1;swap(&shu[j],&shu[j+1]);swap1(&flag_jinting1[j],&flag_jinting1[j+1]);} else if(xiaoshi1==xiaoshi2) {fenzhong1=(shu[j].sumtime[4]-'0')*10+(shu[j].sumtime[5]-'0');fenzhong2=(shu[j+1].sumtime[4]-'0')*10+(shu[j+1].sumtime[5]-'0');if(fenzhong1>fenzhong2) {flag=1;swap(&shu[j],&shu[j+1]);swap1(&flag_jinting1[j],&flag_jinting1[j+1]);}}}if(flag==0)break;}}//排序的输出:输出有问题void Printf(Tran *shu,int N) {for(int i=1; i<=N; i++) {printf("\t\t列车号:%s。出发点:%s。终点站:%s。出发时间:%s。到达时间:%s。总时长:%s。\n",shu[i].Train_number,shu[i].begin_place,shu[i].finaplace.place_name,shu[i].Train_begintime,shu[i].Tran_finatime,shu[i].sumtime);printf("\t\t\t经停站(经停时间):");for(int j=1; j=right)return;Tran pivot;//主元int sum=1000;//主元选取if (right>sum) {pivot=median3(shu,left,right);int low,High;low=left;High=right-1;while(1) {//为什么相等时进行交换就不行while(shu[low].finaplace.tranpay.first_pay<=pivot.finaplace.tranpay.first_pay && low=pivot.finaplace.tranpay.first_pay && low<High)High--;if(low<High) {swap(&shu[low],&shu[High]);swap1(&flag_jinting1[low],&flag_jinting1[High]);} elsebreak;}swap(&shu[low],&shu[right]);swap1(&flag_jinting1[low],&flag_jinting1[right]);Qsort(shu,left,low-1);Qsort(shu,low+1,right);} elsemaopao(shu,right);}//主元选取Tran median3(Tran *shu,int left ,int right) {int midiume;midiume=(left+right)/2;if(shu[midiume].finaplace.tranpay.first_payshu[right].finaplace.tranpay.first_pay) {swap1(&flag_jinting1[left],&flag_jinting1[right]);swap(&shu[left],&tran[right]);}if(shu[midiume].finaplace.tranpay.first_pay>shu[right].finaplace.tranpay.first_pay) {swap(&shu[midiume],&shu[right]);swap1(&flag_jinting1[midiume],&flag_jinting1[right]);}swap(&shu[midiume],&shu[right]);swap1(&flag_jinting1[midiume],&flag_jinting1[right]);return shu[right];}//定票 :kehou_xinxi,kehuo_sumvoid dinpaio() {int chose,jilu,flag=0;kehuo_sum++;printf("请输入出发点:");scanf("%s",kehou_xinxi[kehuo_sum].xinxi.kehuo_place);printf("请输入终点:");scanf("%s",kehou_xinxi[kehuo_sum].xinxi.kehuo_zongdian);printf("请输入出发时间(格式为xx:xx):");scanf("%s",kehou_xinxi[kehuo_sum].xinxi.kehuo_time);printf("请输入你的名字:");scanf("%s",kehou_xinxi[kehuo_sum].name);printf("请输入你的身份证号:");scanf("%s",kehou_xinxi[kehuo_sum].identify);//先找到该列车并记录在去顶座位号for(jilu=1; jilu<=tran_sum; jilu++) {if(stricmp(kehou_xinxi[kehuo_sum].xinxi.kehuo_place,tran[jilu].begin_place)==0) {if(stricmp(kehou_xinxi[kehuo_sum].xinxi.kehuo_zongdian,tran[jilu].finaplace.place_name)==0) {if(stricmp(kehou_xinxi[kehuo_sum].xinxi.kehuo_time,tran[jilu].Train_begintime)==0) {flag=1;strcpy(kehou_xinxi[kehuo_sum].xinxi.liechenum,tran[jilu].Train_number);break;}}}}if(flag==0){kehuo_sum--;printf("没有该列车,请重新选择\n");return;}printf("该列车号为:%s\n",tran[jilu].Train_number);printf("请输入要定的票数:");scanf("%d",&kehou_xinxi[kehuo_sum].sum_piao);int k=1;while(k<=kehou_xinxi[kehuo_sum].sum_piao) {printf("\n");if(kehou_xinxi[kehuo_sum].sum_piao!=1) {printf("\n\t------------------------------------------请选择第%d张票的座位-----------------------------------------------------\n",k);}printf("\n\t\t座位号选择");printf("\n\t\t********************************************\n");printf("\n\t\t*1------一等座*\n");printf("\n\t\t*2------二等座*\n");printf("\n\t\t*3------站座*\n");printf("\n\t\t*0------退出订票*\n");printf("\n\t\t********************************************\n");printf("\t\t请选择菜单号(0--3):");scanf("%d",&chose);switch(chose) {case 1: {int num;kehou_xinxi[kehuo_sum].xinxi.kehuo_hao[k].denji='A';printf("请输入你想选择的一等座的座位号(数字1到%d):",tran[jilu].piaonum.piao_first);scanf("%d",&num);if(tran[jilu].first_num[num].seat_flag==1) {printf("该位置已有人,请重新输入选择\n");continue;} else {printf("选择成功\n");tran[jilu].first_num[num].seat_flag=1;kehou_xinxi[kehuo_sum].xinxi.kehuo_hao[k].num=num;tran[jilu].piaonum.piao_first--;tran[jilu].piaonum.piao_sum--;printf("你的座位号为:%c%d",kehou_xinxi[kehuo_sum].xinxi.kehuo_hao[k].denji,kehou_xinxi[kehuo_sum].xinxi.kehuo_hao[k].num);}break;}case 2: {int num;kehou_xinxi[kehuo_sum].xinxi.kehuo_hao[k].denji='B';printf("请输入你想选择的二等座的座位号(数字1到%d):",tran[jilu].piaonum.piao_second);scanf("%d",&num);if(tran[jilu].second_num[num].seat_flag==1) {printf("该位置已有人,请重新输入选择\n");continue;} else {printf("选择成功\n");tran[jilu].second_num[num].seat_flag=1;kehou_xinxi[kehuo_sum].xinxi.kehuo_hao[k].num=num;tran[jilu].piaonum.piao_second--;tran[jilu].piaonum.piao_sum--;printf("你的座位号为:%c%d",kehou_xinxi[kehuo_sum].xinxi.kehuo_hao[k].denji,kehou_xinxi[kehuo_sum].xinxi.kehuo_hao[k].num);}break;}case 3: {printf("选择成功\n");tran[jilu].piaonum.piao_stand--;tran[jilu].piaonum.piao_sum--;kehou_xinxi[kehuo_sum].xinxi.kehuo_hao[k].denji='C';//站座没有座位号break;}//记得清空该客户的信息case 0: {kehuo_sum--;break;}default: {printf("没有该选项,请重新输入\n");continue;break;}}k++;}}//查询客户信息void chaxun_custom() {char sheng[20];int i,flag=0;printf("请输入你的身份证进行查询:");scanf("%s",sheng);for(i=1; i<=kehuo_sum; i++) {if(stricmp(sheng,kehou_xinxi[i].identify)==0) {flag=1;break;}}if(flag==0) {printf("没有该身份证客户信息");} else {printf("用户名:%s\n",kehou_xinxi[i].name);printf("身份证信息:%s\n",kehou_xinxi[i].identify);printf("列车号为:%s\n",kehou_xinxi[i].xinxi.liechenum);printf("出发点为:%s\n",kehou_xinxi[i].xinxi.kehuo_place);printf("终点站为:%s\n",kehou_xinxi[i].xinxi.kehuo_zongdian);printf("发车时间为:%s\n",kehou_xinxi[i].xinxi.kehuo_time);printf("你定的票数为:%d\n",kehou_xinxi[i].sum_piao);if(kehou_xinxi[i].sum_piao!=1) {int k=kehou_xinxi[i].sum_piao;for(int j=1; j<=kehou_xinxi[i].sum_piao; j++) {printf("你的第%d张票:",j);if(kehou_xinxi[i].xinxi.kehuo_hao[j].denji=='C') {printf("你买的是站票,没有座位号\n");} elseprintf("你的座位号为:%c%d\n",kehou_xinxi[i].xinxi.kehuo_hao[j].denji,kehou_xinxi[i].xinxi.kehuo_hao[j].num);}} else {if(kehou_xinxi[i].xinxi.kehuo_hao[1].denji=='C') {printf("你买的是站票,没有座位号\n");} elseprintf("你的座位号为:%c%d\n",kehou_xinxi[i].xinxi.kehuo_hao[1].denji,kehou_xinxi[i].xinxi.kehuo_hao[1].num);}//还要输出经过的站int jilu;for(jilu=1; jilu<=tran_sum; jilu++) {if(stricmp(kehou_xinxi[i].xinxi.kehuo_place , tran[jilu].begin_place)==0) {if(stricmp(kehou_xinxi[i].xinxi.kehuo_zongdian , tran[jilu].finaplace.place_name)==0) {if(stricmp(kehou_xinxi[i].xinxi.kehuo_time , tran[jilu].Train_begintime)==0) {strcpy(kehou_xinxi[i].xinxi.liechenum , tran[jilu].Train_number);break;}}}}printf("经停站:");for(int m=0; m");}}}//退票功能 struct Kong kong;kehuo_sumvoid tueipiao() {int use_flag;char tran_gaonum[10];char tran_time[10];char shenfeng_tran[20];printf("请输入要退票的列车号:");scanf("%s",tran_gaonum);printf("请输入列车的发车时间:");scanf("%s",tran_time);printf("请输入列车的你的身份证号:");scanf("%s",shenfeng_tran) ;//找到客户的位置for(use_flag=1; use_flag<=kehuo_sum; use_flag++) {if(stricmp(shenfeng_tran,kehou_xinxi[use_flag].identify)==0)break;}//找到高铁的位置int jilu;for(jilu=1; jilu1) {int xuanzhe;int sum;printf("\n\t\t以下是你座位信息:\n");for(int i=1; i<=kehou_xinxi[use_flag].sum_piao; i++) {printf("\n列车号:%s,第%d个座位的座位号:%c%d\n",kehou_xinxi[use_flag].xinxi.liechenum , i , kehou_xinxi[use_flag].xinxi.kehuo_hao[i].denji ,kehou_xinxi[use_flag].xinxi.kehuo_hao[i].num );}printf("你最多退%d张票\n",kehou_xinxi[use_flag].sum_piao-(kehou_xinxi[use_flag].sum_piao-1)) ;printf("请输入你要退票的数量:");scanf("%d",&sum); int shuru;char shuru2;int flag_shuru;for(int i=1; i<=sum; i++) {printf("请输入你要退的座位号:");getchar();scanf("%c%d",&shuru2,&shuru);//printf("输入座的数字号码:");//scanf("%d",&shuru); if(shuru2=='A') {//相同步骤 :移动客户的座位的数组for(int j=1; j<=kehou_xinxi[use_flag].sum_piao; j++) {if(kehou_xinxi[use_flag].xinxi.kehuo_hao[j].denji=='A') {if(kehou_xinxi[use_flag].xinxi.kehuo_hao[j].num==shuru) {for(int k=j; k<kehou_xinxi[use_flag].sum_piao; k++) {kehou_xinxi[use_flag].xinxi.kehuo_hao[j]=kehou_xinxi[use_flag].xinxi.kehuo_hao[j+1];}break;}}}kehou_xinxi[use_flag].sum_piao--;tran[jilu].first_num[shuru].seat_flag=0;tran[jilu].piaonum.piao_first++;} else if(shuru2=='B') {for(int j=1; j<=kehou_xinxi[use_flag].sum_piao; j++) {if(kehou_xinxi[use_flag].xinxi.kehuo_hao[j].denji=='B') {if(kehou_xinxi[use_flag].xinxi.kehuo_hao[j].num==shuru) {for(int k=j; k<kehou_xinxi[use_flag].sum_piao; k++) {kehou_xinxi[use_flag].xinxi.kehuo_hao[j]=kehou_xinxi[use_flag].xinxi.kehuo_hao[j+1];}break;}}}kehou_xinxi[use_flag].sum_piao--;tran[jilu].second_num[shuru].seat_flag=0;tran[jilu].piaonum.piao_second++;} else {for(int j=1; j<=kehou_xinxi[use_flag].sum_piao; j++) {if(kehou_xinxi[use_flag].xinxi.kehuo_hao[j].denji=='C') {if(kehou_xinxi[use_flag].xinxi.kehuo_hao[j].num==shuru) {for(int k=j; k<kehou_xinxi[use_flag].sum_piao; k++) {kehou_xinxi[use_flag].xinxi.kehuo_hao[j]=kehou_xinxi[use_flag].xinxi.kehuo_hao[j+1];}break;}}}kehou_xinxi[use_flag].sum_piao--;tran[jilu].piaonum.piao_stand++;}printf("退票成功\n");}}}

七、实验报告和ppt:

用C语言实现高铁客运订票系统ppt:

来自

八、结果展示:

1、查询

(1)查询列车号

(2)快速排序:

(3)冒泡排序进行排序出发时间和总时间

(4)通过出发点和终点进行查询:

(5)客户信息查询:

2.订票功能:

3.退票功能:

九、我的文档数据:

14!
G6083!湛江西站!佛山!08:10!14:16!10时37分!10!茂名(2)阳江(2)江门(2)广州南(2)虎门(2)深圳北(4)惠州南(2)汕尾(2)普宁(2)潮汕(4)!1500!700!500!300!
G6083!湛江西站!汕头!05:10!14:16!07时37分!9!茂名(2)阳江(2)江门(2)广州南(2)虎门(2)深圳北(4)惠州南(2)汕尾(2)普宁(2)!1500!700!500!300!
G6083!湛江西站!汕头!06:10!14:16!03时37分!8!茂名(2)阳江(2)江门(2)广州南(2)虎门(2)深圳北(4)惠州南(2)汕尾(2)!1500!700!500!300!
G6083!湛江西站!汕头!01:10!14:16!05时37分!6!茂名(2)阳江(2)江门(2)广州南(2)虎门(2)深圳北(4)!1500!700!500!300!
G6083!湛江西站!汕头!03:10!14:16!02时37分!7!茂名(2)阳江(2)江门(2)广州南(2)虎门(2)深圳北(4)惠州南(2)!1500!700!500!300!
G6083!湛江西站!汕头!08:10!14:16!01时37分!5!茂名(2)阳江(2)江门(2)广州南(2)虎门(2)!1500!700!500!300!
G6083!湛江西站!汕头!08:11!14:16!00时37分!3!茂名(2)阳江(2)江门(2)!1500!700!500!300!
G6083!湛江西站!汕头!08:15!14:16!08时45分!6!茂名(2)阳江(2)江门(2)广州南(2)虎门(2)深圳北(4)!1500!700!500!300!
G6083!湛江西站!汕头!08:09!14:16!05时59分!2!茂名(2)阳江(2)!1500!700!500!300!
G6083!湛江西站!汕头!08:01!14:16!08时50分!1!茂名(2)!1500!700!500!300!
G6083!湛江西站!汕头!08:05!14:16!03时40分!10!茂名(2)阳江(2)江门(2)广州南(2)虎门(2)深圳北(4)惠州南(2)汕尾(2)普宁(2)潮汕(4)!1500!700!500!300!
G6083!湛江西站!汕头!08:06!14:16!03时39分!10!茂名(2)阳江(2)江门(2)广州南(2)虎门(2)深圳北(4)惠州南(2)汕尾(2)普宁(2)潮汕(4)!1500!700!500!300!
G6083!湛江西站!汕头!08:09!14:16!03时38分!9!茂名(2)阳江(2)广州南(2)虎门(2)深圳北(4)惠州南(2)汕尾(2)普宁(2)潮汕(4)!1500!700!500!300!
G6083!湛江西站!汕头!08:10!14:16!03时39分!10!茂名(2)阳江(2)江门(2)广州南(2)虎门(2)深圳北(4)惠州南(2)汕尾(2)普宁(2)潮汕(4)!1500!700!500!300!

注意:

①写入文档的数据一定要按照我的格式写,后面的感叹号是每一类数据的分割符,方便数据的输入。

②注意数据信息写的的顺序,否则会读错。