目 录
第4章 程序的调试与运行结果说明…………………………………………………………...10
车票管理系统课程设计总结........................................................................................................20
参考文献…………………………………………………………………………………………21
第1章 概述
1.1课程设计的目的
熟练掌握C语言的应用及特点;
掌握函数声明、定义和使用的方法;熟练掌握C语言中的对文件进行操作的基本方法;熟练掌握结构体的使用方法;掌握链表的基本操作。
1.2车票管理系统课程设计的要求
1、录入班次信息(信息用文件保存),可不定时地增加班次数据
2、浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。
3、查询路线:可按班次号查询 ,可按终点站查询
4、售票和退票功能
A:当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数
1. B:退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数
这次设计的车票管理系统,实现了对车票的实时管理,功能包括录入、增加班次信息(信息用文件保存),浏览班次信息,查询路线以及售票和退票功能。主要使用了链表实现了数据的保存和修改,同时使用文件相关函数对文件进行同步。
1.3车票管理系统设计理念
1、利用C语言面向过程的编程思想完成系统设计。
2、突出C语言的函数特征,以多个函数实现每一个子功能。
3、画出功能模块图。
4、进行简单的界面设计。
5、具有清晰的程序流程图和数据结构的详细定义。
6、源码格式规范,要有适当的注释,使程序容易阅读。
1.4 程序整体框图如下:
启动程序
文件是否存在
5增加新班次记录
结构体链表
文件是否为空
否
是
是
修改
3查找班次
4退出系统
数据文件
banci.dat
修改
菜单
1-5
否
关闭文件
将文件读入结构体链表
更新班次日期等
读取
写入
修改
1显示班次
读取
调用
2售票 / 退票
调用
判断是否能够售票/退票(根据时间,已订票人数)
是
修改
第2章 C详细设计
程序结构设计应用的C知识以及各函数的具体功能
main()函数是 整个c程序执行的开始 和 结束,也称主函数! 是一个程序 必须要有的! 没有的话,就 不 符合 c语言。车票管理系统中main主函数可以调用了其他函数。
2.2 循环程序
车票管理系统中运用for、if、switch、do-while循环语句
if语句是指c中用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。本例中运用if进行车票查询、退订等操作。
for语句是c中提供的功能强大的循环语句,一般形式为:
for(表达式1;表达式2; 表达式3;)
switch语句在c中可直接处理多分支选择,并且switch语句条例清晰,结够明了。形式:
switch(表达式)
{
case 常量表达式1:语句1;
case 常量表达式2:语句2;
……
case 常量表达式n:语句n;
default:语句n+1;
}
do while循环先执行循环体里的语句,再进行判断,所以如果不符合while条件时也要执行一次循环体;
do
{
………
………
………
}
while()
车票管理系统程序中switch与do-switch嵌套用于选择执行车票查询、退订等。
数组是在程序设计中, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。在C语言中, 数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
数组说明的一般形式为:
类型说明符 数组名 [常量表达式],……;
其中,类型说明符是任一种基本数据类型或构造数据类型。 数组名是用户定义的数组标识符。 方括号中的常量表达式表示数据元素的个数,也称为数组的长度。
2.4 结构体
结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
在C语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。车票管理系统中用于定义车板次、时间、起始站、终点站等的定义。
C语言中用指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对文件进行各种操作。C语言将文件看作是一个字符(字节)的序列,即一个一个字符(字节)的数据顺序组成。根据数据的组成形式,可分为ASCII文件和二进制文件。
一般形式为:
FILE *fp
第3章 部分函数的算法分析
3.1
班次、发间、起点站、终点站、行车时间、额定载量、已订票人数进行选择调用用于查询车票管理系统信息。程序如下:
do{
printf("-----选择主菜单功能(0~6)\n");
scanf("%d",&b);
switch (b)
{
case 0:
input(); break;
case 1: output();
break;
case 2:
scan(); break;
case 3:
check(); break;
case 4:
book(); break;
case 5:
rback(); break;
case 6:
over(); break;
default: printf("
enter error!\n");
}
}while(1);
该do-while语句中嵌套了switch语句,switch语句根据键入的b的数值指向与其值相对应的case语句,执行命令直至循环条件不满足要求为止。
3.2 结构体该语句可以声明不同的数据类型,相同结构体类型变量可以相互赋值。如下程序:
struct
t_tickets
{int
number;
char begin [10]; char
start[30];
char
loadend[30]; float time;
int people;
int booked;
};
车票管理系统结构体中包括“班次、发车时间、到达时间、行车时间、额定载客量、已订票人数”成员,结构体中分别做了定义。
3.3
车票管理系统中的文件程序分析:
FILE*fp;
struct t_tickets
t[size];
void save()
{
int
i;
if
((fp=fopen("ticket.text","w+"))==NULL)
{
printf("cannot open the file\n");
return;
}
for(i=0;i
if(fwrite(&t[i],sizeof(struct
t_tickets),1,fp)!=1)
printf("
file write error\n");
fclose(fp);
}
文件程序应用必须先进行声明,FILE*fp定义菜单文件指针fp。
3.4 if
((fp=fopen("ticket.text","w+"))==NULL)
fopen是文件打开函数。在该程序中表示打开“ticket.text”文件夹,并且以“读写”方式打开。如果函数返回值不存在或文件已损毁则返回空指针NULL,程序无法输出 "cannot open the file”。
if(fwrite(&t[i],sizeof(struct
t_tickets),1,fp)!=1)
函数:fwerite表示从文件写入一个数据块。fwrite(&t[i],sizeof(struct
t_tickets),1,fp)其中
① &t[i]:表示要写入数据地址地址;
② sizeof(struct t_tickets):表示写入数据字节长度;
③ 1:表示写入1个sizeof(struct t_tickets)字节;
④ fp:表示文件指针。
注:因为写入操作失败时返回0,成功返回1,所以一旦返回非1,就打印错误信息,最后退出文件。
fclose(fp):表示关闭文件。
fread函数表示读入数据块与fwrite函数功能相同。
3.5 strcmp(比较字符串)
if(strcmp (loadend,t[i].loadend)==0)
strcmp()用来比较参数loadend,t[i]和loadend,t[i]字符串。
若参数loadend,t[i] 与loadend,字符串相同返回0。loadend,t[i]
大于loadend返回1,小于返回-1。
第4章
程序的调试与运行结果说明
4.1
启动程序,进入菜单,使用了简单的文本菜单界面。如图1
图1
4.2
选择0,录入信息,如图2
图2
4.3
关闭窗口,重新运行,选择1,浏览班次信息。图3
图3
4.4 按班次查询,如图4
图4
4.5 查询班次信息,按终点站,图5
图5
4.6
预定车票。图6
图6
4.7 退票。图7
图7
4.8 按6退出程序
第5章
车票管理系统程序
源程序:
#include
#include
#include
# define size
10
struct
t_tickets
{
int
number;
char begin
[10];
char start[30];
char
loadend[30];
float
time;
int
people;
int
booked;
}
t[size];
FILE*fp;
struct t_tickets
t[size];
void save()
{
int
i;
if
((fp=fopen("ticket.text","w+"))==NULL)
{
printf("cannot open the file\n");
return;
}
for(i=0;i
if(fwrite(&t[i],sizeof(struct
t_tickets),1,fp)!=1)
printf("
file write error\n");
fclose(fp);
}
void
input()
{
int
i;
printf("----------请录入班次信息----------\n");
printf("\n
班次 发车时间 起点站 终点站 行车时间(小时) 额定载量 已订票人数 \n");
for(i=0;i
{
scanf("%d %s %s %s %f %d
%d",&t[i].number,t[i].begin,
t[i].start,t[i].loadend,&t[i].time,&t[i].people,&t[i].booked);
save();}
}
void
output()
{
int i ;
fp=fopen("ticket.text","r");
printf("\n
班次 发车时间 起点站 终点站 行车时间(小时) 额定载量 已订票人数 \n");
for(i=0;i
{
fread(&t[i],sizeof(struct
t_tickets ),1,fp);
printf("\nM %8s %8s %8s %6.2f � �\n",t[i].number,t[i].begin,
t[i].start,t[i].loadend,t[i].time,t[i].people,t[i].booked);
}
fclose(fp);
}
void scan()
{
int k;int number;
printf("请输入您想要查询的班次号:\n");
scanf("%d",&number);
fp=fopen("ticket.text","r");
for(k=0;k
{
fread(&t[k],sizeof(struct t_tickets),1,fp);
if(number==t[k].number)
{ printf("\n
班次 发车时间 起点站 终点站 行车时间(小时) 额定载量 已订票人数 \n");
printf("\nM %8s %8s %8s %6.2f � �\n",t[k].number,t[k].begin,
t[k].start,t[k].loadend,t[k].time,t[k].people,t[k].booked);
break;
}
}
if(k>=size)
printf("对不起,没有您想要查询的班次,谢谢使用本系统\n");
fclose(fp);
}
void check()
{
int i;
char loadend[30];
printf("请输入你想要查询的终点站的名称:\n");
scanf("%s",loadend);
fp=fopen("ticket.text","r");
for(i=0;i
{
fread(&t[i],sizeof(struct
t_tickets),1,fp);
if(strcmp(loadend,t[i].loadend)==0)
{
printf("\n 班次 发车时间 起点站 终点站 行车时间(小时) 额定载量 已订票人数 \n");
printf("\nM %8s %8s %8s %6.2f � �\n",t[i].number,t[i].begin,
t[i].start,t[i].loadend,t[i].time,t[i].people,t[i].booked);
break;
}
}
if(i>=size)
printf("对不起,没有您想要查询的班次,谢谢使用本系统!\n");
fclose(fp);
}
void
book()
{
int i;int number;int m;char loadend[30];int
ticket=1;
if ((fp=fopen("ticket.text","r"))==NULL)
{
printf("not open the file\n");
return;
}
for(i=0;i<=size;i++)
fread(&t[i],sizeof(struct
t_tickets),1,fp);
printf("\n请输入你想要到达的终点站:\n");
scanf("%s",loadend);
printf("到达此终点站的班次有:\n");
for(i=0;i<=size;i++)
if(strcmp(loadend,t[i].loadend)==0)
{
ticket=2;
printf("\n
班次 发车时间 起点站 终点站 行车时间(小时) 额定载量 已订票人数 \n");
printf("\nM %8s %8s %8s %6.2f � �\n",t[i].number,t[i].begin,
t[i].start,t[i].loadend,t[i].time,t[i].people,t[i].booked);
}
for(i=0;i<=size;i++)
if(strcmp (loadend,t[i].loadend)==0)
if(t[i].booked
{
ticket=3;
printf("请输入订票的张数:\n");
scanf("%d",&m);
for(i=0;i<=size;i++)
if(number=t[i].number);
if
((fp=fopen("ticket.text","w"))==NULL)
{
printf("not open the file\n");
return;
}
{
t[i].booked=t[i].booked+m;
if ((fp=fopen("ticket.text","w"))==NULL)
{
printf("not open the file\n");
return;
}
for(i=0;i<=size;i++)
fwrite(&t[i],sizeof(struct
t_tickets),1,fp);
fclose(fp);
printf(" 您订票成功!谢谢使用本次服务!\n");
}
}
if(ticket==1)
printf("\n 没有你查询的班次,请查询后在输入\n");
if(ticket==2)
printf("\n
你想要购买的票以售完,请购买下一班 \n");
fclose(fp);
if ((fp=fopen("ticket.text","w"))==NULL)
{
printf("not open the file\n");
return;
}
for(i=0;i<=size;i++)
fwrite(&t[i],sizeof(struct t_tickets),1,fp);
fclose(fp);
}
void
rback()
{
int number,i,m;
if((fp=fopen("ticket.text","r"))==NULL)
{
printf("not open the file\n");
return;
}
for(i=0;i<=1;i++)
fread(&t[i],sizeof(struct t_tickets),1,fp);
printf("请输入退票的班次:\n");
scanf("%d",&number);
printf("请输入退票的张数:\n");
scanf("%d",&m);
for(i=0;i<=size;i++)
if(number==t[i].number)
{
t[i].booked=t[i].booked-m;
printf("\n 您退票成功!,谢谢\n");
}
fclose(fp);
if ((fp=fopen("ticket.text","w"))==NULL)
{
printf("not open the file\n");
return;
}
for(i=0;i<=size;i++)
fwrite(&t[i],sizeof(struct
t_tickets),1,fp);
fclose(fp);
}
void over()
{
printf("\n 谢谢您的使用,请按任意键结束!\n");
exit(0);
}
void main()
{
int b;
printf(" 这里是车票管理系统,欢迎你的使用\n");
printf(" 制作: 关志超 \n" );
printf("\n******************************************\n");
printf("
==== 0,录入班次信息\n");
printf("
==== 1,浏览信息\n");
printf("
==== 2,按班次查询\n");
printf("
==== 3,按终点站查询\n");
printf("
==== 4,预定车票\n");
printf("
==== 5,退票 \n");
printf("
==== 6,退出程序\n");
printf("\n******************************************\n");
do{
printf("-----选择主菜单功能(0~6)\n");
scanf("%d",&b);
switch (b)
{
case 0:
input(); break;
case 1: output();
break;
case 2:
scan(); break;
case 3:
check(); break;
case 4:
book(); break;
case 5:
rback(); break;
case 6:
over(); break;
default: printf("
enter error!\n");
}
}while(1);
}
车票管理系统课程设计总结
经过一个星期的忙碌终于完成了C语言设计,也就意味着这个课程设计接近了尾声,的确令人兴奋,看着自己的劳动成果,心里很高兴。
一个星期前看到“车票管理系统”题目时傻了,没一点思路,选择的题目没一点头绪,想换成别的题目,主要是害怕编,后来跟搭档商量下决定不换了,就编这个题目。我们俩当时很失落,想着可能完不成作业,不想做,可视抱怨有什么用,还是不会编,我们只能尽我们自己努力把程序给写出来,虽然当时不知道这么编,只能石着编了,即使很难也得编,没别的选择。课下在网上、图书馆查了很多资料,有类似的题目,可是不一样,我们一次次的失望,网上、图书馆里肯定没现成的。我们只能找些相类似的看人家的设计思路,但是里面很多语句都没见过,更不用说模仿。又遇到一个难题,先是硬着头皮一遍一遍的看,虽然当时看的头都大了,还是坚持看,后来经过分析,看不懂得部分主要是结构体、文件知识点,当时很高兴至少明白了那些不懂。课下首先把课本后面的结构体、文件仔细看了一遍,找几个有解析的例题仔细看了看,这些工作完成后在看程序以前不懂的地方却迎刃而解,整个程序也就看到了。按照别人设计思路构思自己设计框架,我们把框架弄出来了,自从把框架弄好了以后就没有进展了,眼看时间快到了,我们都很急,可是急也没有用,还得慢慢来,功夫不负有心人,我们经过商量、讨论一步一步的把程序编了出来,想到编程时由于意见不同整的耳红面赤,还真有意思。接下来调试,由于程序太大,稍有疏忽,就是errors,看到下面那个errors头都大了,而且越改越errors,当时感觉很“无奈”,只能在一遍遍的调试,记得有次“;”是在中文状态下输入的,一运行就是errors修改别的地方错误更多,怎么也检查不出开错在哪里,后来请教了很多同学才找到,一个小小错误费了那么大劲,感觉到“细节决定成败”,这样的错误调试时出现了很多次,但是经过我们一次次调试、修改运行,程序设计终于完成。
C
语言设计让我体会到了书本知识的重要性,当时感觉不到真正用的时候会感到书本知识的重要;C语言也重在积累平时应该多加练习,知错、改错、记错平时练习中注意细节问题,积累错误,当遇到大型编程时才会很快查出错误所在,节约时间,提高效率;注意积累知识点,一点一滴的积累,知识才会日臻完善,运用时才会得心应手,分析、设计程序才能够统筹全篇;C语言学习平时应该多积累一些经典程序,分析它们设计思路、运用到哪些知识点,还应该尝试用其它语句把它设计处来,在进行比较,举一反三,多角度设计程序。
参考文献
● 《C语言课程设计》 向华 清华大学出版社
● 《C语言程序设计案例教程》 张基温
清华大学出版社
● 《C语言程序设计实践教程》 许晓 电子工业出版社