1、.XX建筑工程学院课 程 设 计 报 告课程设计名称:C语言课程设计课程设计题目:车票管理系统院(系):理学院专 业:信息与计算科学班 级:信142学 号:姓 名:李嘉星指导教师:李鸿强完成日期:2015-6-1733 / 34目 录前言2第1章概要设计31.1题目的内容与要求31.2总体结构3第2章详细设计4主模块流程图4车票管理系统软件详细设计4第3章调试分析6第4章使用说明与执行结果7参考文献15附录(程序清单)16致谢32前言随着计算机技术的发展,可视编程技术占有了越来越重要的作用。Visual C+6.0 是一种功能强大行之有效的可视化编程工具。因此此软件是在Visual C+6.0
2、环境下编写的。对于我们,随着学习的深入,已经大体掌握了Visual C+6.0环境下的程序开发。为了将我们的编程能力提升到一个更高的水平,深化面向对象的编程思维和解决问题的能力,值此课程设计周期间,进行基于Visual C+6.0环境的软件开发,先以字符统计软件作为开始,对Visual C+6.0环境和面向对象程序设计进行回忆和熟悉,使得在此基础上的下一个员工培训系统软件的开发进行的更加顺利。本文档详细叙述了基于Visual C+6.0环境下的车票管理系统的设计过程以及程序源代码。本文档从概要设计,详细设计,参考源程序代码以及显示程序运行的截屏等方面详尽的介绍了软件开发过程。此次车票管理系统的
3、开发目的是使我们用面向对象的方式来思考和解决问题的能力,并且可以掌握字符数组的使用、字符指针的使用、数据库的设计和文件使用以及C语言语法。程序在设计的过程中遇到的问题已及时更正,但由于编者的能力和水平有限,车票管理系统和文档中不免会出现一些不期待的错误,望文档读者能够理解和体谅,并欢迎提醒和纠正,在此表示感谢以及敬意。第1章 概要设计1.1题目的内容与要求一车站每天有n个发车班次,每个班次都有一班次号(1、2、3n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。如班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数1 8:00 郫县 广汉 2 45
4、 302 6:30 郫县 XX 0.5 40 403 7:00 郫县 XX 0.5 40 204 10:00 郫县 XX 0.5 40 2(一)功能要求:用c/c+设计一系统,能提供下列服务:(1)录入班次信息(信息用文件保存),可不定时地增加班次数据(2)浏览班次信息,可显示出所有班次当前状总。(3)查询路线:可按班次号查询 ,可按终点站查询(4)售票和退票功能 A:当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数B:退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数(二)其它要求:(1) 只能使用C/C+语言,源程序要有适当的注释,使
5、程序容易阅读(2) 至少采用文本菜单界面(如果能采用图形菜单界面更好)(3) 学生可自动增加新功能模块(视情况可另外加分)(4)写出课程设计报告,具体要求见相关说明文档欢迎界面管理员菜单普通登录菜单增加信息查询信息订票保存信息查询信息删除信息退票信息1.2总体结构图1-1 功能模块图第2章 详细设计主模块流程图欢迎界面管理员菜单普通登录菜单增加信息查询信息订票保存信息查询信息删除信息退票密码验证按车次按终到站按车次按终到站图2.1 主模块流程图车票管理系统软件详细设计一个名Timetable的结构体进行定义,包括int no;/班次int hour;/发车时间(时)int minute;/发车
6、时间(分)char Starting_station10;/始发站char Last_station10;/终点站float time;/行车时间int max_number;/最大载客数int sold_number;/已售票数等结构体成员。然后对调用函数进行定义。void add()增加记录,void Cipher()密码验证函数,void del()删除班次信息函数,void find(int s1,char s2) 查找函数,int findnum(int s1)查找班次函数,void Input()信息录入函数,void huanying ()欢迎界面,void land()登录选择
7、界面,void menu1()管理员菜单界面,void menu2()普通菜单界面,void open()调用数据函数,void save()保存函数,void searchesmenu()查询菜单,void ticketdelete()退票函数,void ticketorder()售票函数,int timee(int i)判断时间是否超出函数,void timetable1显示车次函数该系统将这些信息均放在文件中。最后定义main()函数,利用函数调用,实现程序的各种功能。将其放在系统文件车中。第3章调试分析1、 程序陷入死循环解决办法:仔细分析程序间的关系,画程序流程图分析问题所在。利用b
8、reak命令跳出循环2、 程序出现乱码解决办法:利用VC6.0本身的调试功能查找错误的所在,修改源程序。3、 所学知识不能很好的完成程序解决办法:上网查找相关资料,进入一些开源论坛寻求一定的帮助。第4章使用说明与执行结果图4-1欢迎界面图4-2登录菜单图4-3管理员登录的密码机制图4-4密码容错机制图4-5管理员菜单图4-6图4-7班次录入界面图4-8图4-9班次增加界面图4-10时刻表浏览界面图4-11查询界面图4-11注销班次界面图4-12普通登录菜单图4-13图4-14售票窗口图4-15图4-16退票界面参考文献1、C程序设计(第四版) 作者:谭浩强书号:ISBN64:清华大学。2、C语
9、言学习路线图 作者:明日科技书号:ISBN93:清华大学。3、C语言从入门到精通(第2版)作者:明日科技书号:ISBN 20:清华大学。4、21天学通C语言(第7版) 作者:(美)琼斯等著,姜估译 书号:ISBN 79:人民邮电。5、C Primer Plus(第五版)中文版 作者:美StephenPrata 书号:ISBN28:人民邮电。谢鸣:百度文库 百度贴吧 百度百科 C语言之家 Linux开源俱乐部网络资料来源:1、.xuexi111./2、snippets.dzone./tag/c/3、.hotscripts./category/c-cpp/scripts-programs/ Hot
10、scripts 4、https:/.daniweb./software-development/cpp/code/_/8附 录(程序清单)代码/增加记录#include#includenews.h#include#includevoid add() void open();int get();void save();void menu1();int i,j=5;open(); / 调用按班次查询函数system(cls); /清屏printf(1. 增加班次n);printf(2. 返回n);printf(请选择(1-2)n);scanf(%d,&i);if(i=1)system(cls);
11、/清屏printf(1. 请输入要增加的班次:n);scanf(%d,&timetableclass_num.no);for(i=0;iclass_num;i+)if(timetableclass_num.no=timetablei.no)/比较是否相等,判断车次是否重复 printf(输入错误!n);getch(); /收集回车break;if(i=class_num) get(i,j); /修改及增加班次*class_num+; /使班次数加1save(); /调用保存函数elsemenu1();#includevoid Cipher()/密码验证函数int m,n=123;/规定密码vo
12、id menu1(); /上级菜单的声明;容错机制printf(请输入密码:);/输入提示scanf(%d,&m);/密码输入while(1)/容错机制if(m=n)menu1();elseprintf(密码错误请重新输入:);scanf(%d,&m);/删除班次信息#include#include /system(cls)的声明#include /getch()的声明#includenews.hvoid del() void save(); int findnum(int s1);int i,h=0;int num;char or10;system(cls); /清屏printf(1. 删除
13、班次n);printf(2. 返回n);printf(请选择(1-2):n);scanf(%d,&i);if(i=1)system(cls); /清屏printf(请输入要删除的班次:n);scanf(%d,&num);i=findnum(num); /调用班次查询函数if(i=class_num) /全部匹配后但无匹配项printf(输入错误,无此班次!n);getch(); /收集回车del();elseprintf(确定?(y/n)n);/确认机制scanf(%s,or);if(or0=y|or0=Y)for(;iclass_num-1;i+) timetablei=timetablei
14、+1;class_num-; /班次总数减1save(); /调用保存函数/查找函数#include#includenews.h#includevoid find(int s1,char s2)int i,h=0,m;if(s20=0)m=1; /1为无条件执行else m=0;printf(n|-|-|-|-|-|-|-|n); printf(n| 班次 | 发车时间 | 起点站 | 终点站 |行车时间|额定载量| 已售票 |n);for(i=0;iclass_num;i+)if(s1=timetablei.no|strcmp(s2,timetablei.Last_station)=0) /
15、判断字符串比较是否相等 printf(n|-|-|-|-|-|-|-|n);printf(|%10d|%5d:%-4d|%10s|%10s|%8.1f|%8d|%8d|n,timetablei.no,timetablei.hour,timetablei.minute,timetablei.Starting_station,timetablei.Last_station,timetablei.time,timetablei.max_number,timetablei.sold_number);if(m=1)h+;break;printf(n|-|-|-|-|-|-|-|n); if(h=0)/不
16、能break则执行printf(要查找的班次不存在!n);/查找班次 #include#includenews.hint findnum(int s1) int i;printf(n|-|-|-|-|-|-|-|n); for(i=0;iclass_num;i+)if(s1=timetablei.no) /判断字符串比较是否相等,如果符合则输出车次等信息 printf(|-|-|-|-|-|-|-|n);printf(|%10d|%5d:%-4d|%10s|%10s|%8.1f|%8d|%8d|,timetablei.no,timetablei.hour,timetablei.minute,t
17、imetablei.Starting_station,timetablei.Last_station,timetablei.time,timetablei.max_number,timetablei.sold_number);break;printf(n|-|-|-|-|-|-|-|n); return i;/欢迎界面#include void huanying ()printf(nnnn);printf(t*n);printf(nnnn);printf(tttt车票管理系统n);printf(nnnn);printf(ttt设计人:李嘉星;X新月;田宇n);printf(nn);printf
18、(tttt感谢您的使用ntttt按任意键继续n);printf(nn);printf(t*n);/信息录入界面#include #include news.h#include#includevoid Input() int i=0,j=5,h; char s5;void save();void add();void get(int i,int j);FILE *fp; /定义文件型指针变量system(cls); /清屏if(fp=fopen(车票管理系统0.dat,rb)!=NULL) /fopen打开文件 printf(车票信息已经存在!n);printf(任意输入进入添加菜单n);sca
19、nf(%s,s); /收集任意输入i=1; /通过是1add();if(i=0) system(cls); /清屏printf(请输入要录入班次总数:n);scanf(%d,&class_num); /指向班次指针system(cls); /清屏for(i=0;iclass_num;i+) system(cls); /清屏printf(请输入第%d个班次信息:n,i+1);h=-1;for(;h!=i;) /循环输出printf(请输入班次:n);scanf(%d,&timetablei.no);for(h=0;hi;h+)if(timetableh.no=timetablei.no) pri
20、ntf(输入错误!该班次已存在!n);break; /返回get(i,j); /修改及增加班次j=5;save(); /调用保存函数void get(int i,int j) / 修改及增加班次 for(;)printf(请输入发车时间(xx xx);scanf(%d %d,&timetablei.hour,&timetablei.minute);if(timetablei.hour=0&timetablei.minute=0)break;elseprintf(输入错误!n);getch(); /收集回车printf(请输入起点站:n);scanf(%s,timetablei.Starting
21、_station);printf(请输入终点站:n);scanf(%s,timetablei.Last_station);printf(请输入行车时间:n);scanf(%f,&timetablei.time);printf(请输入额定载量:n);scanf(%d,&timetablei.max_number);printf(请输入已售票数:n);scanf(%d,&timetablei.sold_number);/管理员菜单界面#include void menu1()void Input();void timetable1();void save();void del();void sea
22、rchesmenu();void land();void add();int n;printf(tttt1、车次信息录入ntttt2、增加车次信息ntttt3、时刻表浏览ntttt4、车辆信息查询ntttt5、注销车次ntttt6、保存ntttt7、返回n);printf(ttt 请输入需要运行的命令编号n); while(1)/死循环形成菜单scanf(%d,&n);switch(n)case 1:Input();break;/车辆信息录入case 2:add();break;/增加车次信息case 3:timetable1();break;/浏览时刻表case 4:searchesmenu
23、();break;/车辆信息查询case 5:del();break;/注销车次case 6: save();break;/保存命令case 7:land();break;/返回上级菜单default: printf(非法输入n);break;/普通登录菜单#include void menu2()void timetable1();void ticketorder();void ticketdelete();void land(); void searchesmenu();int n;printf(tttt1、时刻表浏览ntttt2、车辆信息查询ntttt3、购买车票ntttt4、退回车票n
24、tttt5、返回n);printf(ttt 请输入需要运行的命令编号n); while(1)scanf(%d,&n);switch(n)case 1:timetable1();break;/时刻表浏览case 2:searchesmenu();break;/车辆信息查询case 3:ticketorder();break;/购买车票case 4:ticketdelete(); break;/退回车票case 5:land();break;/返回上级菜单default: printf(非法输入n);break;#includevoid huanying ();void land();int ma
25、in()char ch;huanying(); ch=getchar( );/收集回车land();return 0;#include #include #include news.h#includevoid open()FILE *fp1,*fp2;if(fp1=fopen(车票管理系统.dat,rb)=NULL)system(cls); /清屏printf(文件打开错误!n);getch(); /收集回车exit(0);if(fp2=fopen(车票管理系统0.dat,rb)=NULL)system(cls); /清屏printf(文件打开错误!n);getch(); /收集回车 exit
26、(0); /退出fread(&class_num,sizeof(int),1,fp2); /读入信息fread(timetable,sizeof(timetable0),class_num,fp1);/读入信息fclose(fp1);fclose(fp2); /文件关闭#include #include #include news.hvoid save() /保存函数void menu1();FILE *fp1,*fp2; /文件行指针if(fp1=fopen(车票管理系统.dat,wb)=NULL) /打开文件、为输出打开一个二进制文件printf(文件打开错误!n);exit(0);if(
27、fp2=fopen(车票管理系统0.dat,wb)=NULL) /打开文件、为输出打开一个二进制文件printf(文件打开错误!n);exit(0);fwrite(&class_num,sizeof(int),1,fp2); /写入文件信息fwrite(timetable,sizeof(timetable0),class_num,fp1);fclose(fp1);fclose(fp2); /关闭文件 printf(保存成功);menu1();/查询菜单#include#include#includevoid searchesmenu()int i;void find(int s1,char s
28、2);char s1=0,s210=0;void open();void land();system(cls); /清屏printf(1. 按班次查询n);printf(2. 按终点站查询n);printf(3. 退出n);printf(请选择(1-3):n);scanf(%d,&i);open(); / 调用按班次查询函数switch(i) /菜单 case 1: printf(请输入要查询的班次:n); /s1为班次scanf(%d,&s1);find(s1,s2); /调用查找函数break;case 2:printf(请输入要查询终点站:n); /s2为终点站scanf(%s,s2);
29、find(s1,s2); /调用查找函数break; case 3:land();break;/返回机制default : printf(输入错误!n);break;printf(按任意键继续.n);getch(); /收集回车/退票函数#include#includenews.h#include#includevoid ticketdelete() int i;int num;char or;int timee();void open(); int findnum(int s1);void save();void menu2();system(cls); /清屏printf(1. 退票n);
30、printf(2. 返回n);printf(请选择(1-2)n:);scanf(%d,&i);if(i=1)system(cls); /清屏open(); / 调用按班次查询函数printf(请输入要退票的班次:n);scanf(%d,&num);i=findnum(num); /调用班次查询函数if(num=timetablei.no) /判断字符串比较是否相等 待比较的字符串 if(timee(i) /判断时间是否超出函数scanf(%c,&or);if(or=y|or=Y)getch();timetablei.sold_number-; /使已售票加1printf(退票成功!n);sav
31、e(); /调用保存函数getch(); /从控制台读取一个字符,但不显示在屏幕上elseprintf(该班车已发出,无法退票!n);getch(); /收集回车/售票函数#include#includenews.h#include#includevoid ticketorder() int i;int num;void save();int timee(int i);void open();void searchesmenu();void land();system(cls); /清屏printf(1. 售票n);printf(2. 返回n);printf(请选择(1-2):n);scanf
32、(%d,&i);if(i=1)open(); / 调用openprintf(请输入要订票的班次(若无请输入0):n);scanf(%d,&num);for(i=0;itimetablei.max_number&timee(i)=1) /判断时间是否超出函数*并且*没超出最大客量timetablei.sold_number+; /使已售的票数+1printf(通向%s班次为%d的票订票成功!n,timetablei.Starting_station,timetablei.no);save(); /调用保存函数getch(); /收集回车break;elseprintf(该班次已满或已发出!n);getch(); /收集回车land();else land();#include#include#includenews.hint timee(int i) /判断时间是否超出函数*struct tm *local; /时间结构体 time_t t; /把当前时间给tt=time(NULL); /NULL在stdio.h中定义为0local=localtime(&t); /获取当前系统时间 if(local-tm_hourtm_hour=timetablei.hour&local-tm_mintimetablei.min