火车票订票系统.docx
火车票订票系统火车订票系统 一.课题内容与要求 火车时刻表的数据项及存储结构自行设定。所设计的系统要有简单的DOS界面,方便用户进行操作,完成以下功能: 从文本文件中输入数据,构建火车时刻表。 对火车时刻表进行插入、删除、修改等功能 订票。订票情况保存在一个文件中。如果已经无票,可以提供相关可选择火车信息。 退票。退票后修改和保存相关文件。 退出系统。退出系统时保存航班情况表,订票情况表。 二需求分析 1) 提供可操作的主菜单:输出个菜单,用于显示以从文件中加载的列车信息和若干个可选的功能选项。根据车次输入的选项来运行不同的功能,运行不同的函数。 2) 进行文本信息的载入:从指定的文件中以数组形式加载列车信息. 调用save函数保持输入数据。 3) 查找车次功能:以乘客输入的车次号进行查找对应的车次信息或者通过对应的终点站查找列车信息并将它们输出。通过数组与for循环得以实现。 4) 5) 删除一个车次的功能:将乘客希望删除的某个车次信息删除。 添加一个新的车次:将车次添加到指定的车次之后。应提示乘客按照正确的格式输入。 6) 进行车次信息的修改:根据车次提供的名称,找到对应的数组,将数组中的信息重置。内容应有车次输入,由一系列读写函数实现。 7) 8) 退票系统。 对现有信息的保存:保存内存中的最新的记录输出到磁盘文件中。这里默认的是保存到原读取文件中并覆盖原来的信息。 三、概要设计 1)主要结构体 struct train int num; char start30;/始发站 char over30;/终点站 char time20;/时间 int count;/票数 sN; 主程序 input print search Delete bookmodify 重新选择终点 查 询 订 票 退 票 订票名单查询 菜单 修改信息 输入输入订票信息 输入退票信息 查询结果 选择修改方式 车次错误 订票结果 输入客户信息 退票结果 按车次 按终点四,详细设计 #include<stdio.h> /标准输入、输出头文件 #include<string.h> /包含字符串函数处理头文件 #include<stdlib.h> /定义输出格式 /包含动态存储与释放函数头文件 #define PRINT "%-d%10s%10s%10s%10dn ",si.num,si.start,si.over,si.time,si.count #define N 10000 int i; int m=0; void input; void print; void search; void Delete; void Booking; void Modify; void Return; void save; void read; struct train /定义结构体数组 int num; char start30; char over30; char time20; int count; sN; void save/保存模块程序 FILE *fp;/定义文件指针 if(fp=fopen("D:C+火车票系统数据保存.txt","w")=NULL)/打开文件并判断是否出错 printf("file open failure! ");/打印出错提示 else fprintf( fp,"number start terminal time count n"); fprintf( fp,"*n "); for(i=0;i<m;i+) fprintf(fp,"%-d%12s%12s%10s%12dn ",si.num,si.start,si.over,si.time,si.count); fclose(fp);/关闭文件 void read/从文件读取信息模块 FILE *fp;/定义文件指针 if(fp=fopen("D:/C+/火车票系统数据保存.txt","r")=NULL)/打开文件,并判断是否出错 printf("set up file failure! ");/打印出错提示 else for(i=0;i<m;i+) fscanf(fp,"%-d%12s%12s%10s%12dn ",&si.num,si.start,si.over,si.time,&si.count ); printf(PRINT); fclose(fp);/关闭文件 void main int a; do printf(" Train ticket booking management system n"); printf("*n"); printf(" 1.input information n" " 2.scan information n" " 3.search information n" " 4.delete information n" " 5.ticket-booking n" " 6.modify n" " 7.return n" " 8.out n"); printf("*n "); scanf("%d",&a); switch(a) case 1: input;/调用输入模块 break; case 2:print;/调用打印模块 break; case 3:search;/调用查询模块 break; case 4:Delete;/调用删除模块 break; case 5:Booking;/调用订票模块 break; case 6:Modify;/调用修改模块 break; case 7:Return;/调用退票模块 break; case 8:break; while(a=!0); void input int x; printf("Please enter a train information: "); printf("* n"); for(i=0;i<N;i+) printf("Please input the train: "); scanf("%d",&si.num); /读取车次 printf("please input the start: "); scanf("%s",si.start);/读取起始站 printf("please input the terminal: "); scanf("%s",si.over);/读取终点站 printf("please input the time: "); scanf("%s",si.time);/读取时间 printf("please input the count: ",m); scanf("%d",&si.count);/读取车票数 m+; printf("%d information has inputed?press any button continue,enter 1 over",m); scanf("%d",&x);/在此需输入任意一个整数值数值,程序才能继续执行 if(x=1) break; save;/保持输入数据 void print/打印模块 char o10; printf("number start over time count n"); read;/调用读取文件函数 printf("please press any button to back : n"); scanf("%s",o); void search/查询模块 char size120; char size220; char I10; int n,no; do printf("Please select search mode: "); printf("1.by number " "2.by terminal " "0.back "); printf("please select 0-2: " "According to other key to end the enter key to return to the main menu:n "); scanf("%d",&n); if(n=0) break; switch(n) case 1: printf("please input number: "); scanf("%d",&no); break; case 2: printf("please input terminal: "); scanf("%s",size2); break; printf("number start over time count n"); read;/调用读取函数 for(i=0;i<m;i+) if(strcmp(si.over,size2)=0) printf("number start over time count n"); printf(PRINT);/打印信息 break; if(si.num=no) printf(" find number success!n "); printf("number start over time countn"); printf(PRINT);/打印信息 break; no=0;/将车次赋值为0 printf("no information:n " "continal? Y or Nn "); scanf("%s",I); while(strcmp(I,"Y")=0|strcmp(I,"N")=0);/判断结束 void Delete/删除模块 char size120; char size220; char I10; int C,n; do printf("select delete way :n ");/打印删除方式菜单 printf("*1.by number " "*2.by line " "*0.back "); printf("select0-2: n"); scanf("%d",&n);/读取删除方式 if(n=0) break; /跳出循环 switch(n) case 1: printf("please input number: "); scanf("%d",&C);/读取车次 read;/调用读取函数 break;/跳出循环 case 2: printf("please input start: "); scanf("%s",size1);/读取起始站 printf("please input terminal: "); scanf("%s",size2);/读取终点站 read;/调用读取函数 break;/跳出循环 for(i=0;i<m;i+) if(si.num=C)/按车次删除 printf("number start over time count n"); for(int j=i;j<m;j+) sj=sj+1; m-; for(int i=0;i<m;i+) printf(PRINT); if(strcmp(si.start,size1)=0&&strcmp(si.over,size2)=0) printf("number start over time count n"); for(int k=i;k<m;k+) sk=sk+1; m-; for(int i=0;i<m;i+) printf(PRINT); printf("no information "); printf("continal delete? n"); printf("Y or N n"); scanf("%s",I); /读取是否继续信息 save; /调用读取函数 if(!strcmp(I,"Y") /判断是否继续删除 printf("please press any button to back : "); break; while(n!=1&&n!=2&&n!=0); /判断结束 void Booking/订票模块 int n; char a10; do search;/调用查询模块 printf("please press booking count:n "); scanf("%d",&n);/读取所订车票数 if(n<0|si.count<n) printf("please press effective count! ");/判断车票数是否出错 if(si.count!=0&&si.count>=n)/判断是否出错 si.count=si.count-n; save;/调用保存函数 printf("book success!nn "); printf("continal? Y or N: n");/判断是否继续订票 scanf("%s",a); while(!strcmp(a,"Y");/判断结束 void Return/退票模块 int n; char a10; do search;/调用查询模块 printf("please press your return count: "); scanf("%d",&n);/输入所退票数 if(n<0) /判断票数是否有效 printf("please press effective count! "); else si.count=si.count+n; save; /调用保存模块 printf("return success! "); printf("continal? Y or N: ");/判断是否继续退票 scanf("%s",a); while(!strcmp(a,"Y");/判断并跳出循环 void Modify /修改模块 struct modify /定义结构体 int mo; char start120; char over120; char time120; int count1; M1; char j10; int n; printf("number start over time countn"); read;/调用读取模块 do printf( "Please choose the modified method:n " "1,by number modifie: n" "2,by line modify:n "); printf("selest1-2: n"); scanf("%d",&n);/读取修改方式 switch(n) case 1:printf("please input number: "); scanf("%d",&M0.mo);/读取车次 break; case 2:printf("please input start: "); scanf("%s",M0.start1);/读取起始站 printf("please input terminal: "); scanf("%s",M0.over1);/读取终点站 break; for(int i=0;i<m;i+) if(strcmp(si.start,M0.start1)=0&&strcmp(si.over,M0.over1)=0)/判断输出条件 printf("number start over time count n"); printf(PRINT); break; if(si.num=M0.mo)/判断输出条件 printf("number start over time countn"); printf(PRINT); break; M0.mo=0; /将结构体中的号为零 printf("please input new number.new start.ner terminal.new time.new count:n "); printf("new number new start ner terminal new time new count n"); scanf("%dt%st%st%st%d",&M0.mo,M0.start1,M0.over1,M0.time1,&M0.count1);/定义输入格式 si.num=M0.mo;/替换车次 strcpy(si.start,M0.start1);/替换其始站 strcpy(si.over,M0.over1);/替换终点站 strcpy(si.time,M0.time1);/替换时间 si.count=M0.count1;/替换车票数 save;/调用保存模块 printf("continual?Y or N:n "); scanf("%s",j); while(strcmp(j,"Y")=0|strcmp(j,"N")=0); /判断结束 五、测试数据及其结果分析 六、调试过程中的问题 进入信息输入模块时,进行多次重复输入有覆盖信息的BUG,一直还没有解决,语句执行判断逻辑混乱,有待改进。 进行删除和修改模块时,想通过单链表实现,在对大量的数据进行删除和修改时效率会更高,可是在实现时,麻烦重重,错误多多,就采用数组的方法,虽然低端了一点,能够实现还是很成功。 做功能模块时,信息总是得不到保存,需要调用save函数,实现运行每个功能之后,信息得以保存。 void save/保存模块程序 FILE *fp;/定义文件指针 if(fp=fopen("D:C+火车票系统数据保存.txt","w")=NULL)/打开文件并判断是否出错 printf("file open failure! ");/打印出错提示 else fprintf( fp,"number start terminal time count n"); fprintf( fp,"*n "); for(i=0;i<m;i+) fprintf(fp,"%-d%12s%12s%10s%12dn ",si.num,si.start,si.over,si.time,si.count); 在进行信息录入的时候,因为存储路径不对,找不到相应的文本,导致不能信息无法录入,困惑很久,解决方法,在路径中断建立文本。 七、课程设计总结 一周的时间转瞬即逝,我最终完成了算法与数据结构课程设计-“火车预定系统” 。从程序的运行结果来看,我们的订票系统实现了课题的任务要求:录入信息 查询信息 实现订票、修改信息,删除信息和退票业务的六种基本功能。 这次程序设计试验增加了我对程序设计在实践上的认识,熟练了数组以及循环控制的使用,考虑到大量数据时插入删除操作此种数据结构对运行时间上的节省和方便,用链表可能会更好些。 加深了对模块化的认识,模块之间应达到高内聚低耦合。C没有面向对象的直接应用,但是模块化依然是非常明确的方向。这样可以提高代码重用和方便修改。 程序中用到的获取系统时间的函数,需要上网查找或去图书馆找资料,其过程提高了自学能力。 编写时效率不高,经常出错;大大降低了程序的整体思维性、连贯性,在以后编程时这一点将会给我莫大的帮助。此外,诸如字符串的输入和字符串的比较,字符串的输入可以用数组或用指针来实现,而字符串的比较必须用strcmp系统函数来实现,而不可以直接比较。在对程序进行调试的过程中,我分别设计多种测试用例对系统进行测试。就是在这种不断查漏补缺的过程中,系统不断地完善,最终实现了诸多功能。与此同时,程序的其他模块也经过了多次的调试分析。 由于时间的仓促和水平有限,我设计的不足之处还望老师提出意见。同时也相信通过对数据结构的进一步学习与应用,随着学习的逐渐深入,更多的成功经验,学习兴趣会更加浓厚。