当前位置:文档之家› 火车票管理系统——C语言程序设计实训报告

火车票管理系统——C语言程序设计实训报告

题 目: 学生成绩管理系统院 系: 信息科技学院专 业: 计算机科学与技术姓 名: 何荣荣学 号: 1751200204指导教师: 王小琼日 期: 2018年6月28日桂林电子科技大学信息科技学院前 言课程设计环节是应用型本科院校非常重要的一个教学环节,是学完一门课后应用本课知识及以前的知识积累而进行的综合性、开放性的训练。

通过课程设计,不仅能够使学生得到系统的技能训练,巩固和加强所学得专业理论知识,而且能够培养学生工程意识、创新能力、团队精神等综合素质,培养学生的设计能力和解决实际问题的能力。

C语言由于其强大的功能,丰富的表达能力,高效的代码,良好的移植性和灵活性,自1972年问世以来,经久不衰,即使现在出现了面向对象的程序设计方法和开发工具,但它仍然是人们学习程序设计的首选语言,用它训练和提高编程技术,以及开发应用程序等。

我们通过《C语言程序设计》这门课程的学习,已经能编写解决小问题的程序,对程序的开发也有了初步的认识,还掌握了C 语言的基本语法,这一过程确确实实令我们感到欣喜,有点计算机可以完成自我任务的成就感。

但是,对于程序设计而言,学习C 的步伐不应该停留于此。

我们最终的目的应该是掌握开发大型综合程序的方法,即遵循软件工程的开发步骤和结构化程序设计思想,用C 语言开发出解决复杂问题的大型综合程序。

可是对于多数学生来说,学习了C语言后,除了应付各种考试之外,别无它用,对Turbo C语言丰富的函数知之甚少,加上DOS环境所限,因而对C语言兴趣不大,也感到C语言比较难以掌握。

本实训就是为了让学生在学完C语言后进一步了解C语言的知识,掌握C语言在软件开发方面的使用方法,希望通过此次实训,不仅能提高学生学习C语言的兴趣,更为今后学习其它专业知识及开发程序打下坚实的基础。

本指导书中有些内容借鉴了互联网上相关程序的设计思想,在此对相关者表示衷心的感谢。

由于时间、经验及水平的原因,不当、不足之处,请大家提出宝贵意见。

编者目录1、问题定义 (3)2、系统设计 (3)2.1 总体设计 (3)2.2 详细设计 (5)3、程序测试 (5)4、详细程序 (7)5、归纳总结 (19)5.1 开发经验 (19)5.2 实训中遇到的问题及解决方法 (19)5.3 感想和心得体会 (20)6、参考资料 (20)火车票管理系统本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C 语言的文件和单链表的各种基本操作。

本程序中涉及字符数组的使用、字符指针的使用、数据库的设计和文件使用等方面的知识。

通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握利用单链表存储结构实现对学生成绩管理的原理,为进一步开发出高质量的管理信息系统打下坚实的基础。

1、问题定义该系统要求实现一个简单、实用的火车票管理程序,主要功能包括火车票数据的录入、查找、删除、显示、售票、退票等。

所有火车票数据都要利用文件系统保存,以备系统下次运行时使用。

通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基本算法思想的应用。

本火车票管理系统应该具备如下功能:1)录入班次:车次信息包括:班次、发车时间、起点站、终点站、行车时间、额定载量、已售票)2)显示所有班次3)查询班次4)增加班次5)售票6)退票7)修改班次8)(退票)删除班次9)退出2、系统设计2.1 总体设计采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。

需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。

可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。

void save()保存函数void save()保存函数void load()按班次查询函数void search()查询函数void change()修改函数void quit()退出函数void Ticketorder()售票函数void Ticketdelete()删除函数int menu_select()菜单函数int whether(int)判断时间是否超出函数void find(char s1[],char s2[])查询函数//s1为班次//s2为终点站void deletemessage()删除函数int findnum(char s1[])班次查询函数void get(int,int)修改及增加班次char *menu[]菜单函数。

该系统将这些信息均放在文件d:”车票管理系统0”中。

最后定义main()函数,利用函数调用,实现程序的各种功能。

将其放在系统文件d:”车票管理系统0”中。

程序分为多个小模块,通过调用实现各种功能,增强了程序的可建设性。

程序把每种功能分开实现,更简单,实用程序更易理解。

2.2 详细设计主控main()函数执行流程3图3-0 菜单界面如上图所示,该程序为用户提供菜单界面,用户可以对程序的各种功能进行选择,方便用户使用。

选择1-9并按enter键进行操作。

如选择出错,系统将提出警告,并提醒用户重新进行选择。

3.1录入班次功能图3-1输入时的界面如上图所示,该功能实现录入班次信息。

选择1按enter键进入该功能,程序提醒用户输入车次.发车时间.起始站.终点站.行车时间.额定载量.已售票数,输入完毕后按enter键将完成录入班次结果,同时程序将再次提醒用户进行新的选择。

3.2显示所有班次图3-2查询班次界面可以显示所有录入的信息。

3.3查询所有班次功能图3-3选择查询方式的界面该功能将实现程序运行班次的查询。

选择3并按enter键将实现该功能。

分班次和终点站两种方式查询。

3.4增加班次功能图3-4增加班次界面该功能将增加班次信息,帮助用户更新班次信息。

选择4并按enter键将实现该功能,再按提示输入就行。

按任意键返回主菜单。

3.5售票功能图3-5-1选择售票功能界面图3-3-2订票的界面选择5按enter键实现该功能,按任意键关闭程序。

买票程序可提示买票成功否,且自动判断是否可卖。

3.6退票功能图3-6退票界面选择6按enter键实现该功能,按任意键关闭程序。

退票程序可提示退票成功否,且自动判断是否可退。

3.7 修改班次功能图3-7修改界面选择7按enter键实现该功能,按任意键关闭程序。

按提示操作修改班次。

3.8 删除班次功能图3-8删除界面3.9 退出功能图3-9退出界面该功能可退出系统,选择9按enter键实现该功能4、详细程序#include<stdio.h> //宏定义函数#include<string.h> //字符串操作及内存操作函数#include<stdlib.h> //调用系统函数#include<time.h> ///时间库函数#include<conio.h> ///输入输出函数#define N 1000 //宏定义多条记录typedef struct TICKET ////定义新结构体TICKET{char num[10]; //车次编号char hour[3]; //时间:小时char min[3]; //时间:分钟char from[10]; //起始站char to[10]; //终点站float hours; //车程实际时间int max; //最大车载容量int now; //已售票数}CLASS;int class_num=0; //初始班次总数为0CLASS records[N]; // 多条记录int system_time(); //系统时间void NewMessage(); //新纪录*录入函数******void ShowTable1(); //线框调用1,不用每次输void ShowTable2(int i); //线框调用2,不用每次输void Display(); //显示所有函数void add(); //增加记录void save(); //保存函数void load(); //按班次查询函数void search(); //查询函数void change(); //修改函数**void quit(); //退出函数**void Ticketorder(); //售票函数**void Ticketdelete(); //删除函数**int menu_select(); //菜单函数**int whether(int); //判断时间是否超出函数***void find(char s1[],char s2[]); //查询函数//s1为班次//s2为终点站void deletemessage(); //删除函数int findnum(char s1[]); //班次查询函数void get(int,int); //修改及增加班次*char *menu[]={"*****************欢迎使用火车票查询系统*****************", "\n*****************1751200204 何荣荣*********************","\n*******************MENU功能菜单*********************","\n 1. 录入班次","\n 2. 显示所有班次","\n 3. 查询班次","\n 4. 增加班次","\n 5. 售票","\n 6. 退票","\n 7. 修改班次","\n 8. 删除班次","\n 9. 退出"};/**************************主函数*************************/void main(){while(1) //菜单函数循环{switch(menu_select()) //菜单函数*{case 1: NewMessage();break; //新纪录*录入函数******case 2: Display();break; //显示函数****case 3: search();break; //查找函数**case 4: add();break; //增加记录**case 5: Ticketorder();break; //*售票函数***case 6: Ticketdelete();break; //(退票)删除函数*case 7: change();break; //修改函数**case 8: deletemessage();break; //选择调用删除函数case 9: quit();break; //退出函数******}}}/***********************菜单函数**************************/int menu_select() //菜单函数*{char s[5]; //定义要输入的数字功能int c,i;for(i=0;i<11;i++){printf("%s",menu[i]); //输出菜单各项)}i=0;while(c<0||c>9) //判断是否是1到9的命令{printf("\n"); //输出换行printf("******************************************************");printf("\n请选择(1-9):");scanf("%s",s);c=atoi(s); //atoi将字符串转换成一个整数值} ///输出菜单面return c; ////返回请求}/*******************************录入函数************************************/ void NewMessage() //*录入函数*{int i=0,j=5,h;char s[5];FILE *fp; //定义文件型指针变量if((fp=fopen("d:车票管理系统0.dat","rb"))!=NULL) //fopen打开文件{printf("车票信息已经存在请选择4增加功能!\n");printf("任意输入则返回菜单\n");scanf("%s",s);i=1;//通过是1}if(i==0){printf("请输入要录入班次总数:\n");scanf("%d",&class_num); //指向班次指针for(i=0;i<class_num;i++){printf("请输入第%d个班次信息:\n",i+1);h=-1;for(;h!=i;) //循环输出{printf("请输入班次:\n");scanf("%s",records[i].num);for(h=0;h<i;h++)if(strcmp(records[h].num,records[i].num)==0)//判断字符串比较是否相等,待比较的字符串{printf("输入错误!该班次已存在!\n");break; //返回}}get(i,j); //修改及增加班次*j=5;}save(); //调用保存函数}}/*******************************显示所有函数********************************/ void Display() //显示所有函数{int i,j;load(); // 调用按班次查询函数ShowTable1(); //线框调用1,不用每次输for(i=0,j=0;i<class_num;i++,j+=2) /////按班次顺序输出{printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");if(whether(i)) //判断时间是否超出函数***printf("|%10s|%5s:%-4s|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].hour, records[i].min,r ecords[i].from,records[i].to,records[i].hours,records[i].max,records[i].now);elseprintf("|%10s| 已发车|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now);}ShowTable2(j); //线框调用2printf("\n按任意键继续....\n");getch(); /////从控制台读取一个字符,但不显示在屏幕上}/**********************************打印表头***********************************************/void ShowTable1() //线框调用1,不用每次输{int i=2;printf("**************************MESSAGE车程信息**********************************\n");printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");printf("\n| 班次| 发车时间| 起点站| 终点站|行车时间|额定载量| 已售票|\n");}/***************************************打印表尾************************************************/void ShowTable2(int i) //线框调用2,不用每次输。

相关主题