程序设计报告Word下载.docx
《程序设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《程序设计报告Word下载.docx(29页珍藏版)》请在冰豆网上搜索。
然而,随着时代的发展,传统的效率低下,速度慢的人工售票方式已经跟不上时代的潮流。
为了方便人们的出行,开发出一款车票管理系统已经迫在眉睫。
2.2设计内容
一车站每天有n个发车班次,每个班次都有一班次号(1、2、3…n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。
如:
班次发车时间起点站终点站行车时间额定载量已定票人数
18:
00郫县广汉24530
26:
30郫县成都0.54040
37:
00郫县成都0.54020
410:
00郫县成都0.5402
…
程序基本要求:
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据;
(2)浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息);
(3)查询路线:
可按班次号查询,可按终点站查询;
(4)售票和退票功能:
A:
当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数
B:
退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数;
(5)采用文本菜单界面。
2.3系统总体设计框架
程序总体的功能如下图所示:
程序包含了8个功能,除了课程设计要求的录入数据、显示数据、查询数据、增加数据、售票服务、退票服务这6个功能,我们另外加入了修改程序已经录入的数据和删除数据。
相应的的函数实现算法,在之后的篇幅中详细介绍。
3程序设计过程
根据程序设计的模块化思想,我们将程序进行功能的模块化,以下是我们的程序设计过程:
3.1主函数的设计
3.1.1主函数内部应该设计一个死循环,里面将有一个控制变量函数,由其返回值确定主函数调用哪种功能,这里我们选用switch语句,控制变量是menu_select的返回值,menu_select是菜单选择函数。
}
voidmain()
{
system("
cls"
);
while
(1)//循环
{
/*intk;
k=mimaa();
if(k)*/
switch(menu_select())
case1:
newmessage();
break;
//录入函数
case2:
display();
//显示
case3:
search();
//查找函数
case4:
add();
//增加记录
case5:
ticketorder();
//售票函数
case6:
ticketdelete();
//删除函数
case7:
change();
//修改函数
case8:
deletemessage();
//选择调用删除函数
case9:
quit();
//退出函数
}
3.1.2menu_select函数有校准功能,当输入无效字符时会显示提醒语句,程序
如下:
intmenu_select()
chars[5];
intc,i;
//charmenu[20];
color73"
//改变颜色
for(i=0;
i<
11;
i++)
printf("
%s"
menu[i]);
//输出菜单各项
scanf("
%d"
&
c);
i=0;
while(c>
0||c<
9)
\n"
&
"
\n请选择(1--9):
"
s);
c=atoi(s);
//转化为整数值
break;
returnc;
3.2录入功能函数的设计
3.2.1预约班次信息的录入
录入的多个车票信息有多个数据类型,所以我们采用结构体数组为传递变量,每个结构体包含一个车次的信息,调用的函数为newmessage函数,结构体records[N]如下:
#defineN1000
typedefstructticket
charnum[10];
//车次
charhour[3];
//发车时间
charmin[3];
//起点
charfrom[10];
//终点
charto[10];
//目的地
floathours;
//行车时间
intmax;
//载客量
intnow;
//已订票数
}CLASS;
CLASSrecords[N];
3.2.2newmessage函数程序如下:
voidnewmessage()
inti=0,j=5,h;
FILE*fp;
if((fp=fopen("
车票管理系统0.txt"
"
r"
))!
=NULL)
车票信息已经存在请选择增加功能!
任意输入则返回菜单\n"
i=1;
//通过是1
if(i==0)
请输入要录入班次总数:
class_num);
class_num;
请输入第%d个班次信息\n:
i+1);
h=-1;
for(;
h!
=i;
)//先检验错误
请输入班次\n:
records[i].num);
for(h=0;
h<
i;
h++)
if(strcmp(records[h].num,records[i].num)==0)
{
printf("
输入错误!
该班次已经存在!
break;
}
get(i,j);
//内部函数,存放到结构体
j=5;
}
save();
//保存,若有错误,查看此处
3.2.3newmessage函数内部还有进行子函数get的嵌套处理,它把录入的数据存放到结构体,再通过文件指针函数save对输入的数据进行文件的保存。
get函数程序如下:
voidget(inti,intj)
;
)
请输入发车时间(xx:
xx)"
scanf("
%s%s"
records[i].hour,records[i].min);
if((atoi(records[i].hour)<
24&
atoi(records[i].hour)>
=0)&
(atoi(records[i].min)<
60&
atoi(records[i].min)>
=0))
else
{
printf("
输入错误!
getch();
/////从控制台读取一个字符,但不显示在屏幕上
请输入起点站:
records[i].from);
请输入终点站:
records[i].to);
请输入行车时间:
%f"
records[i].hours);
请输入载客量:
scanf("
records[i].max);
请输入已售车票:
records[i].now);
save函数程序如下:
voidsave()
FILE*fp3,*fp4;
if((fp3=fopen("
1车票管理系统.txt"
w"
))==NULL)
文件打开错误!
exit(0);
if((fp4=fopen("
1车票管理系统0.txt"
fwrite(&
class_num,sizeof(int),1,fp4);
//写出一个整形数据class_num给fp2指向的车票管理系统0.txt
fwrite(records,sizeof(CLASS),class_num,fp3);
//写出class_num这么多个CLASS类型的数据给fp1
fclose(fp3);
fclose(fp4);
3.3显示所有班次功能
调用的函数是display函数,在display函数里除了调用打印表头表尾函数,最主要的一个函数是load函数,它的功能是对已经录入数据的文件进行读入数据,是在完成第一步之后的下一个步骤,具体程序如下:
3.3.1load函数程序如下:
voidload()//查找班次
FILE*fp1,*fp2;
if((fp1=fopen("
system("
文件打开错误!
if((fp2=fopen("
fread(&
class_num,sizeof(int),1,fp2);
fread(records,sizeof(CLASS),class_num,fp1);
fclose(fp1);
fclose(fp2);
3.3.2display函数程序如下:
voiddisplay()
inti;
load();
//会显示所有的班次
showtable1();
20;
i++)//class_num
\n||----------||----------||----------||----------||----------||----------||----------\n"
if(whether(i))
{
printf("
|%10s|%5s:
%-4s|%10s|%10s|%8.1f|%8d|%8d|"
records[i].num,records[i].hour,records[i].min,records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now);
else
printf("
|%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();
\n按任意键继续\n"
getch();
3.4查询班次功能
查询班次功能search函数内部进行了子函数嵌套,嵌套的函数是find函数,它的两个形参分别代指“班次查询”和“终点站”查询,从而对结构体进行搜寻,之后返回输出。
3.4.1search函数程序如下:
voidsearch()
chars1[10]={'
\0'
},s2[10]={'
};
1.按班次查询\n"
2.按终点查询\n"
3.退出\n"
4.请选择(1~3):
i);
switch(i)
{case1:
printf("
请输入要查询的班次:
scanf("
s1);
find(s1,s2);
break;
请输入要查询的终点站:
s2);
case3:
default:
break;
按任意键继续。
。
3.4.2find函数程序如下:
voidfind(chars1[],chars2[])//
inti,h=0,m;
if(s2[0]=='
)
m=1;
elsem=0;
if(strcmp(s1,records[i].num)==0||strcmp(s2,records[i].to)==0)
\n|----------|----------|----------|----------|----------|----------|----------|\n"
%-4s|%10s|%10s|%10.1f|%10d|%10d|"
h+=2;
if(m==1)
showtable2(h);
}
if(h==0)
要查找的班次不存在\n"
3.5增加班次功能
增加函数功能由add函数实现,嵌套了get函数和save函数进行新增的数据保存,由于get函数和save函数的代码在上面的部分已经给出,所以这里不重复展示。
3.5.1add函数程序如下
voidadd()
inti,j=5;
1.增加班次\n"
2.返回\n"
请选择(1~2)\n"
if(i==1)
1.请输入要增加的班次:
records[class_num].num);
for(i=0;
if(strcmp(records[class_num].num,records[i].num)==0)
{
getch();
}
if(i==class_num)
class_num++;
save();
}
3.6售票功能
售票函数功能由ticketorder函数实现,其中嵌套了search函数、get函数和save函数进行新增的数据保存,由于get函数和save函数的代码在上面的部分已经给出,所以这里不重复展示。
3.6.1ticketorder函数程序如下:
voidticketorder()
1.售票\n"
load();
search();
请输入要订票的班次(若无请输入0):
num);
if(strcmp(num,records[i].num)==0)
if((int)records[i].max>
(int)records[i].now&
whether(i)==1)
{
records[i].now++;
printf("
通向%s班次为%s的票订票成功!
records[i].to,records[i].num);
save();
getch();
break;
}
else
该班次已满或已经出发\n"
3.6.2search函数程序如下:
case1:
3.7退票功能
退票函数功能由ticketdelete函数实现,其中嵌套了load函数、findnum函数和save函数进行新增的数据保存,由于load函数和save函数的代码在上面的部分已经给出,所以这里不重复展示。
3.7.1ticketdelete函数程序如下:
voidticketdelete()
1.退票\n"
//调用按班次查询函数
请输入要退票的班次:
i=findnum(num);
if(strcmp(num,records[i].num)==0)
if(whether(i))
确定(Y/N)?
if(num[0]=='
y'
||num[0]=='
Y'
rec