c语言车票管理系统实验报告

更新时间:2024-05-31 23:47:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《车票管理系统》课程设计报告

题目: 车票管理系统

专业: 信息与计算科学 班级: 1002

学号:3101301206 3101301216 3101301218

完成日期: 2011年12月23日

1

姓名: 陈婉璐 包忠材 邱振涛 指导教师: 吴选忠 熊保平

一、课程设计目的

本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。 设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。 通过这次设计,要在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

二、课程设计内容

一.系统的主要功能: 1.浏览班次信息 2.查询班次:

①按班次查询;②按终点查询; 3.售票

(1)售票成功(当车票有剩余,且车未发出时) (2)班次不存在

(3)票已售完(当座位数小于等于已定票人数) (4)车已发出 4.退票

退票成功(输入的班次号存在且当前时间比发车时间早) 退票失败(班次不存在或当前时间比发车时间晚)

三、课程设计过程

1.需求分析

(1) 输入的形式和输入值的范围;

录入的班次信息的输入形式和输入值的范围:车次(类型:int) 发车时间小时(类型:int [0,24]) 发车时间分钟(类型:int [0,60]) 起始站及终点站(类型:void wap(int k))行车时间(类型:float times(int k))额定票数(类型:number(int k))已定票人数(类型:nownumber(int k,int i)) (2) 输出的形式;printf (3) 程序所能达到的功能;

①录入详细的班次信息(发车时间,起点,终点站,行车时间,额定票数,订票人数,是否已发车??);

②浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。

③查询功能(分班次查询和终点站查询两种);

④订票功能;(当查询出已定票人数小于额定载量且当前系统时间久小于发车时间才能售票,自动更新已售票人数)

⑤退票功能;(输入所退票的班次,当本班车未发出时才能退票,自动更新已售票人数)

2

⑥临时增加班次功能; 2.概要设计 车票管理系统 进进进 入入入终 班班售退次次点票 一查站票 览询查 询

3.详细设计 进入车票查询界面 按按车票查询 bc 按终班点

次站 查查询询

按提示操作继续查找,按1返回主菜单

进入售票界面

依据提示操作 售票 售班车票次票不已已 成售发

功存在完出

根据提示继续售票,返回主菜单按1 3

增加班次

4.调试分析 内容包括:

a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;

1.我们将一个个功能分为一个个函数,在发车时间上我们遇到了一些阻碍!我本来想通过算法来输出发车时间,没想到一次次的实验不行!于是我们将发车时间的分为小时段和分钟段!使用case函数输出.

int hour(int k) { switch(k) { case 1: return 07;break; case 2: return 10;break; 。。。。。。。。。。。。(省略一部分) case 27: return 19;break; case 28: return 22;break; /*d到罗源一天的发车时间小时段*/ }

} /*开车时间段*/ int minute(int k) { switch(k) { case 1: return 00;break; case 2: return 00;break; 。。。。。。。。。。(省略一部分) case 27: return 30;break; case 28: return 30;break; /*d到罗源一天的发车时间分钟段*/ }

} /*开车时间段*/

2.是终点站的输出,我们一开始是使用字符串的输出,这样以便于按终点站查找时能进行比较。但这种方法我们又没有实现!于是我们干脆用void,使用简便的方法,达到相同的目的.

void wap(int k) { switch(k) { case 1:

4

printf(\闽清\ case 2: printf(\长乐\ case 3: printf(\连江\ case 4: printf(\永泰\ case 5: printf(\福清\ case 6: printf(\罗源\ }

} /*输入终点站的函数*/

3.是时间的问题,这源于要比较发车时间与当前的时间,判断这班车到底有没有发车,和能不能订票与退票,我们用了一个时间函数,输出了当前的时间,但那边有年月日,不好进行提取和比较,于是我们采用输出了时间,然后看着那个时间手动的提取。 int shijian() {

struct tm *ptr; time_t lt;

lt =time(NULL); ptr=gmtime(<); printf(ctime(<)); return 0;

} /*输出当前时间的函数*/ 在主函数中:

printf(\请输入上述时间的时辰:\ scanf(\ printf(\请输入上述时间的分钟:\ scanf(\、

然后再将s和t带入各个需要比较时间的函数中。

4.我们碰到了文件的问题,这是在保存已定票人数中,这需要更新已定票人数和判断能否售票,我们一开始就将这部分留到了最后,一开始我们只写了暂时售票人数为0,在文件的运用上我们感觉比较困难,训练的比较少,也比较少这方面的知识!在这里我们碰到了比较大的困难,我们一开始建立了一个txt的文本文档,准备使用这个来储存这些数据,但后来我们觉得使用一个文档比较复杂,容易出错,于是我们使用比较麻烦,但是简单的办法,我建立了与班次一样多的文档,一个文档保存一班车的数据,这样就不是那么复杂了。

int nownumber(int k,int i) { int n=0; char filename[10]; switch(i) { case 1:

5

strcpy(filename,\ case 2: strcpy(filename,\ 。。。。。。。。。。。 case 27: strcpy(filename,\ case 28: strcpy(filename,\ case 29: strcpy(filename,\ } FILE *fp; if((fp=fopen(filename,\ { printf(\ exit(1); } fscanf(fp,\ n=n+k; rewind(fp); fprintf(fp,\ //将输入数组里面的数据写到文本里 fclose(fp); return n;

} /*现在已定票人数*/

其他都是一些小问题了,我们可以自己一边调试一边就能自己一会儿解决!

b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;

我们车票管理系统使用的语言并不复杂,使用的都是比较常见的,低级的语言,高级的语言和难懂的语言比较少!这是我们小组自己的成果,做出来了,我们挺有成就感的。

我们也使用了很多的while循环。 在主函数中

while(log) /*循环*/ { if(x=='a') banci(s,t); /*调用班次的函数,班次一览的函数*/ if(x=='b') chaxun1(s,t); /*按班次查询的函数*/ if(x=='c') chaxun2(s,t); /*按终点站查询的函数*/ if(x=='d') maipiao(s,t); /*买票的函数*/ if(x=='e') tuipiao(s,t); /*退票的函数*/ if(x=='f')

6

zengban(); /*增加班次*/ printf(\ printf(\返回主界面:请输入1:\\n\ printf(\退出:0\\n\ scanf(\ if(n==1) { system(\ jiemian(); scanf(\ } else if(n==0) break; }

这是在程序运行与退出之间循环 在买票函数中: if(number(k)>=nownumber(0,i)&&log==1) { printf(\请输入你要定的票的数量m:\\n\ scanf(\ nownumber(m,i); while(number(k)0) { k++; n=n-tangci(k); }

if(i>=10)

printf(\ \ else printf(\ \ if(hour(i)>=10) printf(\ \ else

printf(\ \ if(minute(i)>=10) printf(\ else

7

printf(\ printf(\ 闽侯 \ wap(i); printf(\ %f \ printf(\ \ printf(\ \ if(s

else if(t

这是其中一个循环,实现已定人数小于额定数量!当其大于额定数量时继续循环,直至你所选的班次小于额定数量未知!

这些循环都很容易理解,都不是什么难的问题,程序中还有很多循环我就不一一举例了!

我们改进的思想就是尽可能让它变得简单!还有很多的不足和瑕疵需要我们继续去奋斗,希望老师不吝赐教! c.经验和体会等。

这次实验让我们收获良多,这让我们得到了很多经验,又认识了很多的不足,在c语言这方面我们还需要很多的历练!我想通过这次的练习,我们都有所进展,我们现在需要的就是实践。完成了任务我们还是很有成就感的,也增添了我们对c语言的热情!

在今后我们知道,凡事都要有自己的见解,我们可以借鉴别人,但别人是不可复制的,我们要明白只有理解才是自己的,只有通过自己实践我们才能深刻的认识到这一点!

5.用户使用说明

该系统是出于对班车的各种信息进行管理和维护,并可以简单的订票和退票功能,还可适当地增加班次。

1. 系统说明:在程序中直接录入车次信息依次是:车次(类型:int) 发车时间小时(类

型:int [0,24]) 发车时间分钟(类型:int [0,60]) 起始站及终点站(类型:void wap(int k))行车时间(类型:float times(int k))额定票数(类型:number(int k))已定票人数(类型:nownumber(int k,int i));

8

2. 车次信息的操作:

运行程序就会弹出一个界面如下图所示:

根据您的需求任选:a,b,c,d,e,f,中的任一功能选项进入系统,无论进入那一个,里面都有详细的信息提示,只要按步操作即可。

a:详细的班次信息供您浏览;

b:进入后只需输入您所要定的班次,它就会显示出该车的发车时间、终点站、行车时间、是否有票剩余,是否已发车。

c:输入您的终点站序号,就会显示出到达该地的所有车次,供您选择。

d:输入您想买的班次,若有票剩余且未发车,即可订票,程序会显示订票成功;此时再输入您要定的票数;

若车已发出或票卖完了,程序会提示您:此班不能订票。

e: 输入您想退的班次,若未发车,即可退票,程序会显示退票成功;此时再输入您要退的票数,程序会显示退票成功;

若车已发出,程序会提示您无法退票。 f:若想增加班次,则要输入密码(qiu),输入您所要加的班次,及增加的终点站,发车时间。

6.测试结果 主界面:

9

班次查询:

终点站查询:

售票:

退票:

列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。

7.附录

#include

#include /*时间库函数*/

10

#include /*调用系统函数*/ #include /*串操作及内存操作函数*/ #include #include

#define N 80 /*宏定义多条记录*/ void maipiao(int s,int t); /*函数定义*/ float times(int k); int hour(int k) { switch(k) { case 1: return 07;break; case 2: return 10;break; case 3:

return 13;break; case 4:

return 16;break; case 5: return 19;break;

case 6: return 21;break; case 7: return 07;break; case 8: return 11;break; case 9: return 15;break; case 10: return 19;break;

case 11: return 23;break; case 12: return 07;break; case 13: return 11;break; case 14: return 15;break; case 15: return 19;break;

case 16:

return 23;break;

case 17:

/*d到闽清一天的发车时间小时段*/ /*d到长乐一天的发车时间小时段*/ /*d到连江一天的发车时间小时段*/ 11

return 07;break; return 11;break; return 16;break;

return 20;break; /*d到永泰一天的发车时间小时段*/ case 18: case 19: case 20: case 21: return 07;break; case 22: return 12;break; case 23: return 17;break;

case 24: return 22;break; case 25: return 07;break; case 26: return 14;break; case 27: return 19;break;

case 28:

return 22;break;

}

} int minute(int k) { switch(k) { case 1: return 00;break; case 2: return 00;break; case 3:

return 00;break; case 4:

return 00;break; case 5: return 00;break;

case 6: return 00;break; case 7:

return 00;break;

case 8:

/*d到福清一天的发车时间小时段*/ /*d到罗源一天的发车时间小时段*/

/*开车时间段*/ /*d到闽清一天的发车时间分钟段*/ 12

return 00;break; return 00;break; return 00;break;

return 00;break; /*d到长乐一天的发车时间分钟段*/ case 9: case 10: case 11: case 12: return 00;break; case 13: return 00;break; case 14: return 00;break; case 15: return 00;break;

case 16: return 00;break; case 17: return 00;break; case 18: return 30;break; case 19: return 00;break;

case 20: return 30;break; case 21: return 00;break; case 22: return 30;break; case 23: return 00;break;

case 24: return 30;break; case 25: return 30;break; case 26: return 00;break; case 27: return 30;break;

case 28:

return 30;break;

}

} void wap(int k)

/*d到连江一天的发车时间分钟段*/ /*d到永泰一天的发车时间分钟段*/ /*d到福清一天的发车时间分钟段*/ /*d到罗源一天的发车时间分钟段*/

/*开车时间段*/ 13

{ switch(k) { case 1:

printf(\闽清\ case 2:

printf(\长乐\ case 3:

printf(\连江\ case 4:

printf(\永泰\ case 5:

printf(\福清\ case 6:

printf(\罗源\

}

} int shijian() {

struct tm *ptr; time_t lt; lt =time(NULL); ptr=gmtime(<); printf(ctime(<)); return 0;

} float times(int k) { float t; if(k==1)

t=1.5; if(k==2) t=3.0; if(k==3||k==4) t=4.0; if(k==5||k==6)

t=4.5;

return t;

} int number(int k) { int f;

if(k==1||k==2)

f=30;

/*输入终点站的函数*/ /*输出当前时间的函数*/ /*输入行车时间的函数*/ 14

if(k==3||k==4)

f=40; f=45; if(k==5||k==6) return f;

} /*输入最大载客量的函数*/ int nownumber(int k,int i) { int n=0;

char filename[10]; switch(i) { case 1: strcpy(filename,\ case 2: strcpy(filename,\ case 3:

strcpy(filename,\ case 4:

strcpy(filename,\ case 5: strcpy(filename,\ case 6: strcpy(filename,\ case 7: strcpy(filename,\ case 8: strcpy(filename,\ case 9: strcpy(filename,\ case 10: strcpy(filename,\ case 11: strcpy(filename,\ case 12: strcpy(filename,\ case 13: strcpy(filename,\ case 14: strcpy(filename,\ case 15: strcpy(filename,\ case 16:

strcpy(filename,\15

case 17: } FILE *fp;

if((fp=fopen(filename,\{ }

fscanf(fp,\n=n+k;

fprintf(fp,\ //将输入数组里面的数据写到文本里 fclose(fp); return n;

printf(\exit(1);

strcpy(filename,\strcpy(filename,\strcpy(filename,\strcpy(filename,\ strcpy(filename,\strcpy(filename,\strcpy(filename,\strcpy(filename,\ strcpy(filename,\strcpy(filename,\strcpy(filename,\strcpy(filename,\ strcpy(filename,\case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29:

rewind(fp);

} /*现在已定票人数*/ int tangci(int k) {

int x; switch(k)

16

{ case 1: } return x;

x=6;break; x=5;break; x=5;break; x=4;break; x=4;break; x=4;break; x=0;break; case 2: case 3: case 4: case 5: case 6: default:

} /*确定每个地方一天行车趟次的函数*/ void jiemian() {

printf(\printf(\欢迎来到车票查询系统*************************\printf(\

printf(\ ★★★ a: 进入班次一览 ★★★ |\\n\printf(\ ★★★ b: 进入查询班次 ★★★ |\\n\printf(\ ★★★ c: 进入终点站查询 ★★★ |\\n\printf(\ ★★★ d: 售票 ★★★ |\\n\printf(\ ★★★ e: 退票 ★★★ |\\n\printf(\ ★★★ f: 增加班次 ★★★ |\\n\printf(\printf(\请选择(a-e):☆☆☆\

} /*界面函数*/ void banci(int s,int t) { \

printf(\ for(i=1;i<=N;i++) { if(flag)

system(\ /*清屏*/

int i,flag=1,m,k=1,o=0; /*定义一些要用的数据*/

printf(\ 车票管理系统 \ printf(\

printf(\班次 发车时间 起点站 终点站 行车时间 额定数量 已订票人数 状态

17

}

{

m=i+tangci(k)-1; flag=0;

} /*计算同一个终点站的班次范围*/ if(i>=10) else

printf(\ \if(hour(i)>=10)

printf(\ \ /*进行页面的调整,美观*/ else

if(minute(i)>=10) else

printf(\printf(\ 闽侯 \wap(k);

printf(\ %lf \printf(\ \if(s

printf(\已发出\printf(\{ } if(k>6)

break; flag=1; k++;

printf(\未发出\printf(\未发出\

else if(t

printf(\

printf(\ \

printf(\ \

printf(\ \

if(i==m)

} /*班次一览*/ void chaxun1(int s,int t) {

system(\int i,k=0,n,o=0;

printf(\请输入要查询的班次i:\ scanf(\

n=i;

18

while(n>0) { }

k++; n=n-tangci(k);

printf(\班次 发车时间 起点站 终点站 行车时间 额定数量 已订票人数 状态

\\n\ if(i>=10)

printf(\ \ else

printf(\ \ if(hour(i)>=10)

printf(\ \ else

printf(\ \

if(minute(i)>=10)

printf(\

else

printf(\ printf(\ 闽侯 \

wap(k);

printf(\ %f \ printf(\ \ printf(\ \ if(s

printf(\未发出\

else

printf(\已发出\ printf(\

printf(\返回重新查询:3,输入其他返回:\\n\ scanf(\

while(n==3) /*循环*/ { system(\

printf(\请输入要查询的班次i:\

scanf(\

printf(\班次 发车时间 起点站状态\\n\ if(i>=10)

printf(\ \ else

printf(\ \

终点站行车时间额定数量 已订票人数 19

if(hour(i)>=10)

printf(\ \ else

printf(\ \

if(minute(i)>=10) printf(\

else

printf(\ printf(\ 闽侯 \ wap(k);

printf(\ %f \ printf(\ \ printf(\ \

if(s

printf(\未发出\

else

printf(\已发出\

printf(\

printf(\返回重新查询:3,输入其他返回:\\n\ scanf(\

}

} /*按班次查询*/ void chaxun2(int s,int t) {

system(\ int i,k=1,m,j,l=0,o=0;

printf(\请输入你要查询的终点站:\\n\

printf(\闽清.2:长乐.3:连江.4:永泰.5:福清.6:罗源.\\n\ scanf(\ for(j=1;j

l=l+tangci(j); printf(\班次 发车时间 起点站 终点站 行车时间\\n\

for(i=k;i<=l;i++)

{

if(i>=10)

printf(\ \ else

printf(\ \

if(hour(i)>=10) 20

额定数量状态

已订票人数

本文来源:https://www.bwwdw.com/article/4os6.html

Top