第一篇:课程设计一:火车售票系统
数据结构与算法课程实验报告
班级:学号:
课程设计一:火车售票系统设计及实现姓名:
cll
一、实验内容:
火车售票系统在现实中的应用已经非常普遍,目前通常使用可视化的方法实现,例如采用C/S模式下的程序设计或者采用B/S模式下的程序设计,通常都具有较为友好的界面和较为完善的功能。火车售票系统的实现过程中,主要涉及到数据格式的设计,也就是数据结构的设计。通常在采用数据库的情况下,可以运用数据库的设计来实现。在没有采用数据库情况下需要,单独设计相应数据结构和算法。
二、实验目的:
按给定需求,通过查找相关资料,完成火车售票系统设计及实现,在设计过程中充分运用数据结构与算法课程中所学知识,从而熟练地掌握和应用线性表、单链表等重要数据结构和常用算法。提前熟悉软件需求分析,软件测试等环节,运用相应程序设计语言实现该系统,从而进一步提高程序设计能力。
三、问题描述
(1)此系统可以实现售票、退票、车票剩余情况查询等功能。
(2)每张车票包含车次、座位信息。在售票、退票、查询剩余票等环节中,都必须显示出车票的信息,即车次、座位情况。
(3)退票时,必须是车站售出的车票才能退,否则视为无效票,不能退票。(4)演示程序以用户和计算机的对话方式进行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入程序中规定的运算命令;相应的输入数据(滤去输入中的非法字符)和运算结果显示在后。
(5)由订票系统的主要功能使程序的命令包括: 1)查询;2)订票;3)退票 4)退出订票系统
四、问题的实现
4.1所用的数据结构(包括所用数据结构的抽象数据类型定义和说明)typedefstructLNode{ //数据域
char name[10];//订票姓名
intdnum;//订票数量
char dj[50];//证件编号
intzhekou;//1代表折扣对象
float pay;//付费
structLNode *next;//指针域
intzuohao[200];}LNode,*LinkList;//构造单链表(已订票)
typedefstructTickets{ char *endname;//终点站名
char *hnum;//车次名
intfnum;//票价
float discut;//折扣
int day;//日期
intwholenum;//总票额 intlastnum;//余票量
inttuipiao[100];//退票处理,记录退票的座位号 inttpcs;//记录目前退票次数
intmcps;//记录卖出去的票数(包括退票)LinkList la;//已订票链表
}Tickets;//构造结构类型(火车票)
typedefstruct{ struct Tickets *elem;//存储空间的基址
int length;intlistsize;//当前分配的存储容量(以sizeof(Tickets)为单位)}SqList;//构造顺序表
4.2主要实现思路
1、火车站的火车票采用顺序表表示。每趟火车出售的票用链表表示。
2、查询:输入终点站信息,输出该趟火车的票价,日期,余票数等信息; 订票:输入终点站信息,确认有该趟车之后,输入该趟车的基本信息,之后输入购票数,系统查询是否有余票,确认之后,输入个人基本信息;系统查询是否有退票,若有退票则,先售出退票。插入新的结点。
退票:输入终点站的信息,输入个人信息,1、若退出所有票,则删除该结点,若,只退部分票,则更改该结点的购票信息。
退出:退出系统;
【程序演示】
输入2 订票,购买到温州的火车票十张,姓名:a;证件号:a;
退票:输入3退票,输入终点站温州,姓名:a;证件号:a;
退票之后,继续订票3张
【实现代码】
intInitList_L(LinkList *h){//初始化带头结点的单链表
*h =(LinkList)malloc(sizeof(LNode));//生成头结点
if(!h){ printf(“初始化链表错误!n”);
return 0;}
(*h)-> next = NULL;return 1;}
intCreate_Sq(SqList *L){//初始化并创建顺序表
L->elem=(Tickets *)malloc(ListInitSize*sizeof(Tickets));if(!L->elem){ printf(“存储分配失败!”);// 存储分配失败
return 0;} L->length=5;//赋值
L->listsize=ListInitSize;int j;for(j = 0;j < L->length;j++){
L->elem[j].mcps=0;//初始化,记录买出去的票 L->elem[j].tpcs=0;//记录退票数
} inti;for(i = 0;i < L->length;i++){
InitList_L(&L->elem[i].la);}
L->elem[0].endname=“北京”;//终点站名
L->elem[0].hnum=“G2378”;//车次名
L->elem[0].day=1;//日期
L->elem[0].fnum=346;//票价
L->elem[0].discut=0.5;L->elem[0].wholenum=L->elem[0].lastnum=10;
L->elem[1].endname=“温州”;L->elem[1].hnum=“K351”;L->elem[1].day=2;L->elem[1].fnum=254;L->elem[1].discut=0.5;L->elem[1].wholenum=L->elem[1].lastnum=10;
L->elem[2].endname=“合肥”;L->elem[2].hnum=“G782B”;L->elem[2].day=3;L->elem[2].fnum=224;
L->elem[2].discut=0.5;L->elem[2].wholenum=L->elem[2].lastnum=10;L->elem[3].endname=“武汉”;L->elem[3].hnum=“D2903”;L->elem[3].day=4;L->elem[3].fnum=200;L->elem[3].discut=0.5;L->elem[3].wholenum=L->elem[3].lastnum=10;L->elem[4].endname=“厦门”;L->elem[4].hnum=“T112”;L->elem[4].day=5;L->elem[4].fnum=450;L->elem[4].discut=0.5;L->elem[4].wholenum=L->elem[4].lastnum=10;return 1;}//创建顺序表
void Demand(SqList L){ int n1;do{
char endstop[100];
printf(“*******查票窗口********n”);
printf(“请输入终点站名:n”);
do{ gets(endstop);} while(!endstop[0]);inti;for(i=0;i printf(“tt杭州-->%sn”,endstop);printf(“tt车次:%sn”,L.elem[i].hnum);printf(“tt日期:%d日n”,L.elem[i].day);printf(“tt票价:%dn”,L.elem[i].fnum);printf(“tt折扣价(学生/军人等5折):%fn”,L.elem[i].fnum*L.elem[i].discut);printf(“tt总票量:%dn”,L.elem[i].wholenum);printf(“tt余票量:%dn”,L.elem[i].lastnum);} } break;if(i==L.length-1){ printf(“没有找到%s的车票!n”,endstop);} printf(“1.返回主菜单;2.继续n”); scanf(“%d”,&n1);}while(n1==2);} void GetTicket(SqList *L){//订票 int n2=2,zhekou;//n2=1,继续订票;n2=2,返回主菜单;n2=0,确定,即订票成功 intnum;//订票数 float money;//存储应付的总票额 char endstop[100];//记录终点站名 char name[100];char ID[100];//记录证件号 do{ printf(“*******订票窗口********n”);printf(“终点站名:”); do{ gets(endstop);} while(!endstop[0]);inti = 0;for(i=0;i printf(“tt杭州-->%sn”,endstop);printf(“tt车次:%sn”,L->elem[i].hnum);printf(“tt日期:%d日n”,L->elem[i].day);printf(“tt票价:%dn”,L->elem[i].fnum);printf(“tt折扣价(学生/军人等5折):%fn”,L->elem[i].fnum*L->elem[i].discut);printf(“tt总票量:%dn”,L->elem[i].wholenum);printf(“tt余票量:%dn”,L->elem[i].lastnum);printf(“请输入订票数:”); scanf(“%d”,&num); if(L->elem[i].lastnum == 0){ printf(“对不起,到%s的车票已卖完!n”,endstop);printf(“nt1.继续订票;2.返回主菜单;n”); scanf(“%d”,&n2);}else if(num> L->elem[i].lastnum){ printf(“对不起,到%s的车票只剩%d张。n”,endstop);printf(“n1.继续订票;2.返回主菜单;n”);scanf(“%d”,&n2);}else{ printf(“购票请输入个人信息:n”); printf(“姓名:”); do{ gets(name);}while(!name[0]); printf(“是折扣对象吗?若是,请输入相关证件号,不是请输入身份证号(1.是;0.不是)n”); scanf(“%d”,&zhekou);while(zhekou!= 1 &&zhekou!= 0){ printf(“不合法输入,请重输!n”); scanf(“%d”,&zhekou);} printf(“证件号码:”);//fflush(stdin);do{ gets(ID);}while(!ID[0]);//输出订票信息,待客户确认 printf(“t请核对您的订票信息:n”);printf(“t姓名:%sn”,name);printf(“t证件号码:%sn”,ID);printf(“t杭州--%s:n”,endstop);printf(“t车次:%sn”,L->elem[i].hnum);printf(“t日期:12月%d日”,L->elem[i].day);//输出票价(两种情况) if(zhekou==1){ printf(“折扣价(学生/军人等5折):%fn”,L->elem[i].fnum*L->elem[i].discut); money=L->elem[i].fnum*L->elem[i].discut*num;//money用于暂时存储应付的总票额 }else{ printf(“票价:%dn”,L->elem[i].fnum); money = L->elem[i].fnum*num; } printf(“订票数:%dn”,num); printf(“座位号: ”); //如果有退票,优先卖退票 int k=0; //k用于记录买到的票是退票的数目 int data[100];//临时记录座位号,用于后面的保存 int j;//只用于for循环的参数,不保存数据; for(j=L->elem[i].tpcs-1;j>=0;j--){//只需要num张就够了,L.elem[i].jishu1为退票总数 printf(“%dt”,L->elem[i].tuipiao[j]);//退票的座位号tuipioa[j] k++;//买到退票数目+1 if(k>=num)break;//说明买的全部都是退票 } //退票数目不够<买票数目 if(k 此时卖出的票数即为座位号 L->elem[i].mcps += 1;//卖出去票的数目+1(包括退票) data[j]=L->elem[i].mcps; printf(“%dt”,L->elem[i].mcps); } } printf(“n总票额:%fn”,money); printf(“n 0.确认;1.取消;2.返回主菜单n”); scanf(“%d”,&n2);if(n2==0){ printf(“订票成功!n”); L->elem[i].lastnum-=num;//更新余票的数目 //在链表中插入新结点 LinkListp,s;//已订票链表的指针类型 p = L->elem[i].la;//第i趟车的已订票列表(头结点) s =(LinkList)malloc(sizeof(LNode));//新的结点 if(!s){ printf(“内存分配失败!”); }else{ s->next=p->next;//在头部插入 p->next=s; s->dnum=num;//订票数量 s->pay=money;//票价 s->zhekou=zhekou;//折扣信息 strcpy(s->name,name);//姓名 strcpy(s->dj,ID);//证件号 //将座位号记入客户信息 int flag=0; for(j=L->elem[i].tpcs-1;j>=0;j--){//只需要num张就够了,L.elem[i].jishu1为可买退票的张数 } } s->zuohao[flag]=L->elem[i].tuipiao[j];flag++; k++;//买到退票数目+1 if(k>=num)break;//说明买的全部都是退票 } //退票数目不够<买票数目 if(k s->zuohao[flag]=data[j]; flag++;} } } } break; if(i==L->length-1){ printf(“没有到%s的车票!n”,endstop); n2=2; } } }while(n2==1);} void ReturnTicket(SqList *L){ int n3=2,k; //n3=1,继续退票;n3=2,返回主菜单;n3=0,确定,即退票成功,k记录要退的票的数目 LinkList p;char name[100];char ID[100]; char endstop[100];do{ printf(“*******退票窗口********n”); printf(“终点站:”); do{ gets(endstop);} while(!endstop[0]);inti; for(i=0;i printf(“姓名:”); do{ gets(name);}while(!name[0]);printf(“证件号:”);do{ gets(ID);}while(!ID[0]); p = L->elem[i].la;if(!p->next){ printf(“没有客户!”); p->next){ }else{ p = p->next;while(!(strcmp(p->name,name)==0 p=p->next;} &&strcmp(p->dj,ID)==0)&& if(strcmp(p->name,name)==0 &&strcmp(p->dj,ID)==0){ printf(“您的车票信息如下:n”); printf(“t姓名:%sn”,p->name); printf(“t证件号码:%sn”,p->dj); printf(“t杭州-->%sn”,L->elem[i].endname); printf(“t车次:%sn”,L->elem[i].hnum); printf(“t日期:12月%d日n”,L->elem[i].day); if(p->zhekou==0){//非折扣对象 printf(“t票价:%dn”,L->elem[i].fnum); }else{//折扣对象 printf(“t 折价:%fn”,L->elem[i].fnum*L->elem[i].discut); } printf(“t订票数:%dn”,p->dnum); printf(“t座位号为:”); int flag; for(flag = 0;flag dnum;flag++){ printf(“%dt”,p->zuohao[flag]); } printf(“总票额:%fn”,p->pay); printf(“退几张?n”); scanf(“%d”,&k);//k用来记录退票的张数 if(k > p->dnum){ printf(“您只有%d票,请重新确认!n”,p->dnum); printf(“1.重新确定;2.返回主菜单n”); scanf(“%d”,n3); }else{ printf(“0.确认;1.取消;2.返回主菜单n”); scanf(“%d”,&n3); if(n3==0){ printf(“退票成功!n”); int i1 = L->elem[i].tpcs; L->elem[i].tpcs+=k;//更新退票数 for(flag=p->dnum;flag>p->dnum-k;flag--,i1++){ L->elem[i].tuipiao[i1] = p->zuohao[flag-1]; } L->elem[i].lastnum+=k;//更新余票 if(k==p->dnum){ //票全部退完的情况,删除链表中的结点 LinkList q = L->elem[i].la; while(q->next!=p){ 扣 q = q->next; } q->next = p->next;free(p);//释放资源 n3=2;//返回主菜单 折扣票 }else{ if(p->pay == p->dnum*L->elem[i].fnum){ //判断是否是 } p->pay-=L->elem[i].fnum*k;}else{ p->pay-=L->elem[i].fnum*k*L->elem[i].discut; p->dnum-=k; printf(“你还有%d张票”,p->dnum); n3=2; } }//if(n3==0) }// else }else{// if(strcmp(p->name,name)==0&&strcmp(p->zhengjian,zhengjian)==0) printf(“没有该客户买票的信息!请重新确认!”);//最后一个结点也不是要找的结点的情况 n3=2; } } break; }//if(strcmp(L.elem[i].endstop,endstop)==0)if(i==L->length-1){ //查找到了最后一个 printf(“不是本站售出的票,请重新确认!n”); n3=2; } } }while(n3==1);} void Quit(){ printf(“成功退出系统!感谢您的支持!n”);} void main(){ LinkList L0;InitList_L(&L0);SqList L; //顺序表,用于存放车票信息 Create_Sq(&L); //初始化并创建顺序表 int n;do{ printf(“n **************杭州火车站订票系统***************n”); printf(“n ******************本站车票信息******************n”); printf(“ * 车次目的地日期票价 *nn”); inti;for(i=0;i * %s %s 12月%d日 %d * n”,L.elem[i].hnum,L.elem[i].endname,L.elem[i].day,L.elem[i].fnum); } printf(“n * 1.查询 3.退票 *n”);printf(“n * 2.订票 4.退出 *n”); printf(“ ***************************************************n”); printf(“n请按菜单提示输入:n”); } scanf(“%d”,&n); switch(n){ case 1 : Demand(L); break; case 2 :GetTicket(&L); break; case 3 :ReturnTicket(&L); break; case 4 : Quit(); break;} }while(n!=4); 湖北工业大学 工程技术学院 课程设计报告书 课程名称: C语言课程设计 班 级: 物联网一班 小组成员: 范立恒、陈根、聂俊豪、麦灿文、黄文康 组 长: 范立恒 指导教师: 楚惟善 二○一三 年 六 月 C语言课程设计实验报告 课程题目及要求及要求 题目一:火车售票系统 任务:结合C语言中相关知识,设计出火车售票系统。录入北京西站车次信息; 2 旅客按车次买票; 统计某日火车票销售金额。 程序要求: 贯彻结构化的程序设计思想。 用户界面友好,功能明确,操作方便。 用户界面中的菜单至少应包括“车次信息录入”、“旅客买票”、“统计某 日销售 金额”、“退 出”4项。 代码应适当缩进,并给出必要的注释,以增强程序的可读性 为了保证所有的数据可以长期被使用,要求程序能将相关数据存储在外部数据文件中,具体数据格式和文件名、路径等自定; 根据所设计的算法,定义相应函数分别实现系统的各子功能模块,同时由主程序提供友好的用户界面,使用户可通过选择主菜单来调用课程设计中要求完成的各个功能模块,子程序执行完后可返回到主菜单,继续选择其他功能执行。源程序要求书写规范,结构清晰。重点函数的重点变量,重点功能部分均要求给出清晰的程序注释。 程序编译、链接成功后,自己设计实现程序功能的一组或多组测试数据,并严格按照此测试数据进行测试,然后分析测试结果。如果程序不能正常运行或结果不正确,则需对程序进行单步调试,在调试过程中认真查找算法实现中存在的问题,并加以分析和 程序分设计说明 经过对程序设计题目的分析可知,整个程序的设计实现大致分为八个模块,每一个模块对应一个函数。在这些函数当中,添加车次数据函数,售票函数,查询总额函数的实现严格按照题目的要求,而显示时间函数和显示车次函数属于附加功能。读取文件函数和保存信息函数对其它函数的实现起辅助作用,主函数及菜单函数控制程序的整体运行。1.添加车次函数 主要实现程序最初运行时车次的录入; C语言课程设计实验报告 (1)添加学生数据函数add 真以追加方式打开E盘student.txt文件成功?假假输出文件打开失败以追加方式打开E盘student.txt文件成功?真输入添加学生数量n循环变量i=1当i<=n时输入学号、姓名和三门成绩学生信息写入文件 i++关闭文件图2 添加学生数据函数 返回 (2)读取学生数据函数reads 真以读方式打开E盘student.txt文件成功?假循环变量i=0当文件未结束时读取学生信息到数组元素stu[i]中i++关闭文件返回学生人数i图3读取学生数据 输出文件打开失败返回 (3)删除学生记录函数del C语言课程设计实验报告 n=reads(stu)循环变量i=0当i j++图5按总分排 4.程序清单 本程序主要由九个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其它函数来实现要求的所有功能。在这些函数当中,添加学生数据函数、删除数据函数和排序函数是程序中较为核心的部分,下面分别进行说明。1.录入车次信息函数 录入车次信息,首先由程序创建一个新文件,并将录入的车次信息写入该文件(e: rain.txt)当中。具体的程序段如下: if((fp=fopen(“e: rain.txt”,“a”))==NULL)//如果文件已经存在,可以追加车次信息 { if((fp=fopen(“e: rain.txt”,“w”))==NULL)// 文件不存在时,创建新文件,输入车次信息 { C语言课程设计实验报告 scanf(“%d”,&j); tra[i].maipiao=tra[i].maipiao+j; printf(“n购买成功n”); printf(“n%12d%11d%11s%11s%11d%11.2fn”,tra[i].num,tra[i].date,tra[i].from,tra[i].ter,tra[i].maipiao,tra[i].tickeprice); save(tra,n);3.查询销售总额 对于也使用比较日期的方法实现的,这部分程序仍然调用了reads函数,整个排序过程在文件中实现,然后用for循环进行运算,把查询这一天的总额算出。 具体程序如下: if((fp=fopen(“e: rain.txt”,“r”))==NULL) { printf(“读取错误,不能打开该文件!n”); return;} else for(i=0;i fscanf(fp,“ %d %d %s %s %d %fn”,&tra[i].num,&tra[i].date,tra[i].from,tra[i].ter,&tra[i].maipiao,&tra[i].tickeprice); printf(“请输入你要查询的日期:n”); scanf(“%d”,&temp.date); for(i=0;i C语言课程设计实验报告 知识并在此基础上对数据结构的特点和算法有了更深的了解,C语言是计算机程序设计的重要理论技术基础,它不仅是计算机科学的核心课程,而且已经成为其他理工专业的热门选修课。在计算机的研究和应用中已展现出强大的生命力,它兼顾了诸多高级语言的特点,是一种典型的结构化程序设计语言,它处理能力强,使用灵活方便,应用面广,具有良好的可移植性,同时这两周的学习也提高了我适应实际,实践编程的能力.黄文康:首先这一周的学习,使我在巩固了原有的理论知识上,培养了我灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力,使我体会到自身知识和能力在实际中的应用和发挥。其次,激发了我创新意识,开发创造的能力和培养沟通能力。另外,让我进一步熟悉了数据结构的设计应用。每一处编码都是在反复的熟悉数据结构的结构特性,及其语法、函数和程序设计思想的过程,对我数据结构的学习和提高很有益处,并且使我明白了程序设计过程有如解决一实际问题,从解决实际问题的角度,我们可以这样来看:第一要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;第二,从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出,在这个过程中,可确定所需的数据结构的基本类型——线性表、栈、队列、串、数组、树和二叉树以及图等,然后确定处理过程——算法,可得最后结论。最后,在这次课程设计过程中,我们深刻的认识到了自己在学习方面的不足之处,我们知道我们还有太多的基本的思想没有真正的理解,当然我们不会灰心,我们会在以后的日子里努力弥补我们的不足。 麦灿文:一个礼拜的课程设计让我们受益匪浅。要学好一门学科,没有刻苦钻研的精神是不行的,只有在不断的尝试中,不断经历失败,然后又不断的尝试才能获得成功。两个多礼拜中,我们有过山穷水尽的困惑;有过柳暗花明的惊喜;有过唇枪舌剑的辩论;有过相互鼓励的安慰。一个礼拜的时间我们经历了很多,也收获了很多。与其说它是体力与脑力的作业,不如说它是合作精神和毅力的考验。经过这次课程设计,我们不仅学到了很多知识和技能,更重要的是我们学会了如何运用所学知识去解决实际问题。 对于我本人来讲这次课程设计的总体表现,我自己还比较满意,每天做到了按时的出勤,上机遵守机房的管理规定,遵循指导老师的安排并能适时地与老师进行沟通,觉得不足的是不能熟练地掌握c语言的设计技巧使编程的结果缺乏效率,不过我相信这只是我的一个开始,我更应该注重的是这次过程,我坚信我会在以后的学习和训练中不断地弥补自己的不足之处,不断的完善自己的编程能力,因为成功需要一点一点积累。 0 C语言课程设计实验报告 } void menu(){ printf(“ ************************* 武昌站火车订票系统************************ ”); printf(“n 显示当前时间”); printf(“n 车次信息录入”); printf(“n 显示”); printf(“n 旅客买票”);printf(“n 统计某日销售金额”); printf(“n 退出”);} int reads(struct train tra[N])// 读取车次中的内容 { FILE *fp; int i=0; if((fp=fopen(“e: rain.txt”,“r”))==NULL){ printf(“文件打开失败!n”); return 0;} else { for(i=0;!feof(fp);i++) fscanf(fp,“%d %d %s %s %d %fn”,&tra[i].num,&tra[i].date,tra[i].from,tra[i].ter,&tra[i].maipiao,&tra[i].tickeprice); } fclose(fp); return i;} void save(struct train tra[N],int n)// 车次信息改变后更新文件 { FILE *fp; int i=0; if((fp=fopen(“e: rain.txt”,“w”))==NULL){ printf(“文件打开失败!n”); return;} else { for(i=0;i C语言课程设计实验报告 getch();} void sell()// 按顾客要求对车次信息卖票 { struct train tra[N]; int num,n,j; int i; n=reads(tra); printf(“n请输入待查询的车次号,按回车键确认:n”); scanf(“%d”,&num); for(i=0;i if(num==tra[i].num)break; if(i>=n) { printf(“没有找到该车次信息!n”); return; } else printf(“n请输入所买票数,按回车键确认:n”); scanf(“%d”,&j); tra[i].maipiao=tra[i].maipiao+j; printf(“n购买成功n”); printf(“n%12d%11d%11s%11s%11d%11.2fn”,tra[i].num,tra[i].date,tra[i].from,tra[i].ter,tra[i].maipiao,tra[i].tickeprice); save(tra,n);} void all()//统计销售金额 { struct train tra[N],temp;float sum=0;FILE *fp;int i,j=0;if((fp=fopen(“e: rain.txt”,“r”))==NULL) { printf(“读取错误,不能打开该文件!n”); return;} else for(i=0;i fscanf(fp,“ %d %d %s %s %d %fn”,&tra[i].num,&tra[i].date,tra[i].from,tra[i].ter,&tra[i].maipiao,&tra[i].tickeprice); printf(“请输入你要查询的日期:n”); C语言课程设计实验报告 4、调试与测试:调试方法,测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施 5、源程序清单和执行结果(光盘):清单中应有足够的注释 二、具体安排: 学生以2—6人为一组,共同完成一个题目,选出一个组长负责分工和管理,共同完成总体框架设计,然后每个学生分工独立完成各自的功能模块的编程,最后要能集成并测试通过。 每组要以光盘形式上交C源文件和可执行文件(放在组长文件袋中,其他成员在报告本中写明源程序在哪个同学的文件袋中) (注:课程设计报告统一使用学院规定的课程设计报告本和文件袋) 三、备注 每个人可自行附加模块设计心得 及所发现的问题及解决方法 《C语言课程设计报告 火车售票查询系统(完)》的word文档中1.、2、3、4、7是统一一样的 你们需要另外说明 哪个版块是你设计的OK) 车 售 票 系 统 需 求 规 格 说 明 书 作者:李艳亮 2013年11月 火 目录 1.引言.............................................................................................................................................3 1.1编写目的.............................................................................................................................3 1.2项目背景.............................................................................................................................3 1.3定义.....................................................................................................................................3 1.4参考资料.............................................................................................................................3 2.任务概述.....................................................................................................................................3 2.1目标.....................................................................................................................................3 2.2运行环境.............................................................................................................................4 2.3条件与限制.........................................................................................................................4 3.数据描述.....................................................................................................................................4 3.1静态数据.............................................................................................................................4 3.2动态数据.............................................................................................................................4 3.3数据库介绍.........................................................................................................................5 3.4数据词典.............................................................................................................................5 3.5数据采集.............................................................................................................................9 4.功能需求.....................................................................................................................................9 4.1功能划分.............................................................................................................................9 4.2功能描述...........................................................................................................................10 5.性能需求...................................................................................................................................10 5.1数据精确度.......................................................................................................................10 5.2时间特性...........................................................................................................................10 5.3适应性...............................................................................................................................10 6.运行需求...................................................................................................................................11 6.1用户界面...........................................................................................................................11 6.2硬件接口...........................................................................................................................11 6.3软件接口...........................................................................................................................11 6.4故障处理...........................................................................................................................11 7.其它需求...................................................................................................................................11 1.引言 1.1编写目的 本需求分析报告的目的是规范化本软件的编写,旨在于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,同时提出了本火车售票系统的软件开发过程,便于程序员与客户之间的交流、协作,并作为工作成果的原始依据,同时也表明了本软件的共性,以期能够获得更大范围的应用。 1.2项目背景 1、.项目的委托单位:中国铁路局 2、开发单位:湖南安全技术职业学院 3、软件名称:火车售票系统 1.3定义 1、铁路售票应用系统软件:基本元素为构成铁路售票及相关行为所必须的各种部分。 2、需求:用户解决问题或达到目标所需的条件或功能;系统或系统部件要满足合同、标准,规范或其它正式规定文档所需具有的条件或权能。 3、需求分析:包括提炼,分析和仔细审查已收集到的需求,以确保所有的风险承担者都明其含义并找出其中的错误,遗憾或其它不足的地方。 4、模块的独立性:是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他的模块的接口是简单的。 1.4参考资料 1、《实用软件工程》(第二版)郑人杰,殷人昆,陶永雷,清华大学出版社,1997 2、《JAVA网络高级编程》金勇华,曲俊生,人民邮电出版社,2001 3、《JBUILDER培训教程》Borland software corporation,机械工业出版社,2002 2.任务概述 2.1目标 (1)完善目前火车售票系统,使之能跟上时代的发展。同时通过实践来提高自己的动手能 (2)应用范围:理论上能够实现于铁路部门的售票系统,其目的在于在原有的系统基础 使得火车售票便捷化,以期实现完善日常生活中火车售票的各种缺陷。 (3)可实现旅客对于火车票的查询与购买功能,售票员则可实现查询、添加和删除等功能;对于所查询的车次结果提供列表显示输出;有一定的安全机制,普通旅客不能对车次信息随意删改,只有授权的售票员可通过密码识别进行维护。 2.2运行环境 操作系统:Microsoft Windows 2000 Advanced Server 支持环境:IIS 5.0 数 据 库:Microsoft SQL Server 2000 2.3条件与限制 一个更完善的火车售票系统,应提供更为便捷与强大的查询购买功能,如相应的网络操作及服务,由于开发时间和计算机数量有限,该系统并未提供这一功能,对于信息的保护手段仅限制于设置用户级别,以记名提供数据文件的备份,比较简单,不能防止恶意的破坏,安全性能有待进一步完善。 3.数据描述 3.1静态数据 火车票:列车车号 (int SerialNumber) 列车始发时间(struct time SetOut) 列车始发站(char DeparturePoint) 列车终点站(char TerminalPoint)票务:列车车号 (int SerialNumber) 已售出车票票数(int FixedNumber) 额定载量(int FixNumber)售票员:用户名(char name) 密码(char password)3.2动态数据 输入数据:根据界面提示,键盘输入操作; 查询方式:查询车次、查询始发站; 旅客购买时的票务信息,售票员添加、购票、退票时的票务信息; 售票员备份数据恢复所需的数据备份文件; 售票员操作需密码,旅客操作受限; 输出信息:查询车次确定的数据库记录的子集; 统计结果; 车次信息录入、删除(成功或失败); 车次信息查询、购买的操作结果; 数据备份输出的数据备份文件; 内部数据:查询操作建立的索引; 3.3数据库介绍 数据库采用Microsoft Access数据库 3.4数据词典 《火车售票系统》的总体功能如下: 车票的售出; 车票的退还; 车票信息的查询; 车票的增删改; 售票员查询统计车票信息; 售票系统数据备份; 售票管理者口令修改; 1.售票员登陆系统: (1)数据流图 售票退票选择检验错误售票员选择用户名密码身份验证售票员信息密码正确登陆系统选择选择选择授权信息表查询录入新的班次信息 (2)数据词典 数据源点及汇点描述: ① 名称:售票员 简要描述:管理售票员信息 有关数据流:用户名、密码、系统选择:售票系统、退票系统、查询系统、录入信息系统 数目:1 加工逻辑词条描述: ① 加工名:身份检验 加工编号:1 简要描述:检验用户身份 输入数据流:用户名、密码 输出数据流:密码正确、身份验证错误 加工逻辑: IF 用户名为空 THEN 发出“用户名为空错误” ELSE IF 密码为空 THEN 发出“密码为空错误” ELSE IF 用户名和密码不符 THEN 发出“用户名和密码不匹配错误” ENDIF ENDIF ENDIF ENDIF 数据流名词条描述: ① 数据流名:用户名 说明:售票员姓名 数据流来源:售票员 数据流去向:身份检验 数据流组成:用户名=字符型字符串 ② 数据流名:密码 说明:与用户名相匹配的密码 数据流来源:售票员 数据流去向:身份检验 数据流组成:密码=短整型字符串 每个数据量流通量: ③ 数据流名:出错信息 说明:用于指示身份验证错误的信息 数据流来源:身份检验 数据流去向:售票员 数据流组成:出错信息=任意字符串 ④ 数据流名:系统名称 说明:系统的名称 数据流来源: 数据流去向:选择 数据流组成: 数据文件词条描述: ① 数据文件名:授权信息表 简述:存放售票员信息 输入数据: 输出数据:售票员信息 数据文件组成:授权信息表由“售票员信息”组成 2.售票员相关操作(售票、退票、查询、录入) 票务信息表车票信息车票信息售票退票检验错误选择选择用户名售票员密码身份验证密码正确登陆系统选择售票员信息选择选择授权信息表查询录入新的班次信息车票信息车票信息列车信息表(2):数据词典: 数据源点及汇点描述: ○1 名称:售票员 简要描述:管理售票员信息 有关数据流:用户名、密码 数目:1 加工逻辑词条描述: ○1加工名:身份检验 加工编号:1 简要描述:检验用户身份 输入数据流:用户名、密码 输出数据流:密码正确、身份验证错误 ○2加工名:售票 加工编号:2 简要描述:根据所读入的操作信息,售出火车票 输入数据流:操作信息,火车票信息 输出数据流:火车票信息 加工逻辑:根据所读入的操作信息,售出火车票 数据流名词条描述: ○1 数据流名:用户名 说明:售票员的姓名 数据流来源:售票员 数据流去向:身份检验 数据流组成:用户名=字符型字符串 ○2数据流名:密码 说明:与职工名称相匹配的密码 数据流来源:售票员 数据流去向:身份检验 数据流组成:密码=短整型字符串 每个数据量流通量: ○3数据流名:车票信息 说明:车票信息 数据流来源:售票员 数据流去向:列车信息表 数据文件词条描述: ① 数据文件名:列车信息表 简述:车票信息 输入数据:车票信息 输出数据: 数据文件组成:列车信息表由“车票信息”组成 存储方式:关键码 存取频率:频繁 ○2数据文件名:票务信息表 简述:票务信息 输入数据:票务信息 输出数据: 数据文件组成:票务信息表由“列车号、已售票、剩余票”组成存储方式:关键码 存取频率:频繁 3.旅客查询购票过程:(1)数据流图 旅客 登录系统选择选择选择选择订票退票查询(2)数据词典: ● 数据源点及汇点描述: 名称:旅客 简要描述:订票,退票,查询 有关数据流:系统选择:订票系统、退票系统、查询系统 ●数据流名词条描述: ⑤ 数据流名:系统名称 说明:系统的名称 数据流来源: 数据流去向:选择 数据流组成: 3.5数据采集 数据采集采用键盘输入 4.功能需求 4.1功能划分 该软件具有如下主要功能: 1.浏览功能 2.查询功能 3.添加功能 4.修改功能 5.删除功能 6.授权功能 4.2功能描述 1.浏览功能 列出当前数据库文件中车票的所有记录 可选定一项纪录,显示说有域 2.查询功能 车次信息匹配查询 始发站信息匹配查询 3.添加功能 增加一条车票的信息 4.修改功能 修改某一已存在的记录内容,提供确认机制 5.删除功能 删除一条记录,提供确认机制 6.授权功能 授权票务管理人员修改数据的权限 5.性能需求 5.1数据精确度 查询时应保证查全率,所有在相应域中包含查询车次的记录都应能查到,同时保证查准率。 5.2时间特性 一般操作的相应时间应在1~2秒内 5.3适应性 满足运行环境在允许操作系统之间的安全转换和雨其它又能够用软件的独立运行要求。 6.运行需求 6.1用户界面 采取对话框方式,多功能窗口运行 6.2硬件接口 (1)硬件接口:支持x86系列PC机 (2)网络硬件接口要求:现实中要求具有高速以太网组网一实现联网销售,但是在理论实验验证软件本身的目的来看,无需网络通讯接口。 6.3软件接口 运行于Windows2000及更高版本并装有JAVA虚拟机的操作系统之上。 6.4故障处理 正常使用时不用出错,对于用户的输入错误应及时给出适当的改正信息提示,若运行遇到不可恢复的系统错误,也必须保证数据库完好无损。 7.其它需求 (1)可用性:该软件也可以通过单步跟踪的操作进行检查处理。 (2)安全性:由于软件运行数据放在数据库中,所以参数不容易被错改、破坏,万一参数受到破坏也不会影响源程序。 (3)可维护性:该软件利用数据库进行编程,系统结构由程序基本确定,大量的参数及文本内容全部放于数据库中。修改、更新数据只要在数据库进行修改添加,而不需要对系统结构进行修改,这样系统维护性、升级都十分方便。 (4)兼容性:由于尚未测试,故无法对兼容性进行评析。 #include int number;//航班号 int Number;//飞机号 int week;//星期几飞行 int day;//日期 int left;//余票额 int n;//与数组flag一起确定客户订票状态 public: int flag[20];//订票状态数组,-1为预订票,1为已定票,0为初始化状态 Plane()//构造函数 { name[0]=' '; number=0; Number=0; week=0; day=0; left=M; n=0;//数组从0开始计数 for(int i=0;i<20;i++) flag[i]=0;} void init()//初始化每种飞机票 { cout<<“请输入终点站名:”; cin>>name; cout<<“请输入航班号:”; cin>>number; cout<<“请输入飞机号:”; cin>>Number; cout<<“请输入星期几飞行:”; cin>>week; cout<<“请输入航班的日期:”; cin>>day;} ~Plane(){};//析构函数 char *getname(){return name;}//获得终点站名 int getnumber(){return number;}//获得航班号 int getNumber(){return Number;}//获得飞机号 int getweek(){return week;}//获得星期几飞行 int getday(){return day;}//获得日期 int getleft(){return left;}//获得余票额 int getn(){return n;}//获得旅客数目 void inleft(int n){left=left+n;}//余票额增加函数 void deleft(int n){left=left-n;}//余票额减少函数 void inn(){n++;}//旅客数目增加函数 };Plane pl[N];int showmenu();//菜单函数 void start();//初始化函数 void query();//查询函数 void make();//订票函数 void back();//退票函数 int main(){ cout<<“这是民航售票处的计算机系统程序”< int choice; choice=showmenu(); switch(choice) { case 1:query();break; case 2:make();break; case 3:back();break; case 0:return 0; default:cout<<“你敲错了!n”; } } return 0;} int showmenu(){ int ch;cout< pl[i].init(); cout< if(strcmp(name,pl[i].getname())==0) { num++; cout<<“航班号:”< cout<<“飞机号:”< cout<<“星期:”< cout<<“航班日期:”< cout<<“余票额:”< break; } if(num==0) cout<<“没有此航班”< if(number==pl[i].getnumber()) { num++; if(n<=pl[i].getleft()) { cout<<“此航班有票”< pl[i].deleft(n); pl[i].inn(); pl[i].flag[pl[i].getn()]=1; for(i=0;i { cout<<“座位号”; cin>>sitnumber; } } else { cout<<“余票额少于订票额,请重新输入订票数额,”<<“订票数额应该少于或等于”< cin>>nu; if(nu<=pl[i].getleft()) { cout<<“此航班有票”< pl[i].deleft(nu); pl[i].inn(); pl[i].flag[pl[i].getn()]=1; for(i=0;i { cout<<“座位号”; cin>>sitnumber; } } else { cout<<“是否需要预约”< cout<<“是(1) 否(2)”< cin>>ch; switch(ch) { case 1:pl[i].inn();pl[i].flag[pl[i].getn()]=-1;break; case 2:break; default:cout<<“你敲错了!”< } } } } if(num==0) cout<<“没有此航班”< cout<<“请输入日期:”;cin>>day;cout<<“请输入航班:”;cin>>number;for(int i=0;i if((day==pl[i].getday())&&(number==pl[i].getnumber()))//日期与航班是否满足 { num++;//日期与航班满足 cout<<“输入退票数目”; cin>>n; cout<<“退票成功”< pl[i].inleft(n);//该种飞机票增加,即已退票 for(int j=0;j<=pl[i].getn();j++)//顺序查询客户订票状态 { if(pl[i].flag[j]==-1)//客户是否为预定状态 { cout<<“有预约订票,请输入订票数额:”; cin>>nu; if(nu<=pl[i].getleft())//余票额是否满足要求 { cout<<“此航班有票”< pl[i].flag[j]=1; cout<<“订票成功”< pl[i].deleft(nu); for(int k=0;k { } cout<<“座位号”<<“ ”; cin>>sitnumber; } cout<<“余票额为”< } } else cout<<“没有预约订票!”<<“余票额为”< 二.需求分析 经过对程序设计题目的分析可知,整个程序的设计实现大致分为八个模块,每一个模块对应一个函数。在这些函数当中,添加车次数据函数、售票函数、查询总额函数的实现严格按照题目的要求,而显示时间函数和显示车次函数属于附加功能。读取文件函数和保存信息函数对其它函数的实现起辅助作用,主函数及菜单函数控制程序的整体运行。 1.添加车次函数 主要实现程序最初运行时车次的录入 2.旅客买票函数 实现的功能是按照旅客所需车次几所购买车票的数目 3.查询车票总额 按照题目的具体要求实现的是总额的查询 4.显示函数 实现的是显示目前所有的有效车次信息 除上面介绍的功能之外,程序还具有显示当地时间,以及退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。 每一个车次都包含车次、日期,始发、终点以及所受票数和所需费用,在程序当中,将车次类型定义为结构体类型,添加的车次信息直接写入E盘的train.txt文件中,其它函数每次对车次记录的访问,其数据来源都是train.txt文件,这样做不但可以保证学生数据的一致性,而且可以对车次数据进行永保存,保证每次运行程序都可以采用原来的数据 近年来,中国乃至世界的人口急剧增加,人口流动量也随之增加,火车作为一种便捷且相对 比较便宜的交通工具也受到广大出行者的青睐,为了减轻铁道部售票的压力,特此编写此程序,便于乘客在网上购票。 3.1.2 软件项目概述 本系统拥有四大功能,分别是查询、订票、改签和退票。在使用不能系统之前,用户必须注 册用户名,用户名必须包括乘客的身份证号,这样可以实行实名制购票,防止在购票高峰,非法 分子以高价倒卖火车票,以此来保证乘客的利益。用户在利用用户名登陆本系统以后,方可经行 查询、订票、改签和退票的相关操作。其中,查询允许乘客对自己所需乘坐的列车经行查询,来 判断是否有票,如果有票,乘客则可以选择订票,订票以后,用户的信息将被修改,用户信息将 会添加刚才购买的火车票的列车车次以及起始地和目的地。如果乘客已经购票,需要换票,则必 须先查询是否有需要换的票,如果有票,则可以经行换票操作,同样,用户信息将也会被修改。 当乘客已经订票,需要退票,点击退票,则可以退票,但同时会弹出 需要用户支付手续费的窗 口,用户支付完手续费后,退票成功,用户信息将被修改,推掉的车票对应的列车号以及相关信 息将从用户信息中删除。 3.2 订票流程设计 3.2.1 订票流程描述 乘客在使用系统之前,首先注册新用户,需要输入自己相关个人信息,包括自己的身份证号 码,名称,登陆密码等。当已经注册好用户以后,用户可以利用自己的证件号码和登陆密码登陆 火车票订票系统,乘客需先查询自己所需要乘坐的列车,看是否有票,如果有票则可以选择订票,进行订票;如果用户已经购票,需要换票,则需要查询目标票看其是否有剩余,如果有剩余,则 可以进行换票,当用户输入已拥有的火车票的列车号点击退票,则可以经行退票。当然,以上操 作都必须建立在用户已登录的基础上 阶段通过对系统目标的初步调研和分析,提出可行性方案并进行论证。我们在这 里主要从技术可行性、经济可行性和操作可行性三方面进行分析。2.1.1 经济可行性 本系统其他应用软件、硬件系统也易于获得.因此 , 开发成本较低。而引进使用本系 统后,与传统方式相比,具有高效率、低成本、高质量的特点,可以节省不少人力、物 力及财力。所以,从经济的角度来看,该系统可行。2.1.2 技术可行性 开发工具: VS2005 数据库环境: SQL Server 2005 系统环境: Microsoft Windows 2000 或以上版本。 系统实现依靠相对熟悉的 c 语言和 SQL Server2008 数据库系统,其基本操作实质还 是对数据库进行添加、删除、查找等操作。2.1.3 操作可行性 系统采用菜单式,实现用户与数据库的交互,界面简洁友好,操作方便。2.2 需求分析 需求分析是软件设计的一个重要的环节。本阶段对订票系统的应用情况作全面调 查,以确定系统目标,并对系统所需要的基础数据以及数据处理要求进行分析,从而确 定用户的需求。用户对系统的需求我们从以下几方面进行分析。2.2.1 功能需求 本网上售票系统应该具备如下功能: 1.查询 分为对车次信息的查询和客户对已订车票信息的查询。要求: 1)对车次的查询,可以按照发车车次进行查询; 2)车次信息包括:车号、出发 地、目的地、发车日期、开出时刻、票价。3)座位类型设定。4)车次信息只允许用户查询,不能修改。2.添加车票 通过查询系统,客户根据自己的需求找到满意的车次,再输入个人信息后直接通过 网上售票确定已预订选中的车票。要求 : 售票记录应包括:会员名、车号、发车日期、订购票数、总价。3.退票 可退票,通过查询系统,客户可以根据自己的名字找到自己的订票信息,通过退票 模块退去已购车票。2.2.2 数据需求 信息需求,即在系统中需要处理哪些数据。根据对火车站网上订票系统的分析,本 系统的信息需求如表 2-1 所示。表 2-1 信息输入输出 信息输 入 信息 处理 信息 输出 用户输 入所需车次 检索 系统数据库 符合 用户需求的车次及相关 信息 用户输 入个人信息及所需 购的车 票信息 更新 系统中的订票信息,将新 信息存入系统数据库 操作 反馈(如找零)2.2.3 性能需求 为了保证系统能够长期、安全、稳定、可靠、高效的运行,本系统应该满足以下的 性能需求。1.准确性和及时性 系统处理的准确性和及时性是系统的必要性能。系统应能及时而且准确的根据用户 权限及所输入的信息做出响应。 由于本系统的查询功能对于整个系统的功能和性能完成 举足轻重。作为系统的很多数据来源,而车票的数量和时间又影响用户的决策活动,其 准确性和及时性很大程度上决定了系统的成败。在系统开发过程中,必须采用一定的方 法保证系统的准确性和及时性。2.易用性 本系统是直接面对用户的,而用户往往对计算机并不是非常熟悉。这就要求系统能 够提供良好的用户接口,易用的人机交互界面。要实现这一点,就要求系统应该尽量使 用用户熟悉的术语和中文信息的界面,从而保证系统的易用性。第二篇:C语言课程设计报告 火车售票查询系统(完)
第三篇:火车售票系统需求规格说明书
第四篇:航空售票系统+C++课程设计源代码
第五篇:课程设计火车票售票系统的需求分析