资源描述
个人收集整理 勿做商业用途
沈 阳 航 空 工 业 学 院
课程设计
学 号 200504061274
班 级 5406108
姓 名 胡乃杰
指导教师 尹航
2007年 7 月 17 日
沈阳航空工业学院
课程设计任务书
机械与汽车学院 机械设计制造及其自动化专业 5406108班 学号200504061274
一、课程设计题目:简单的汽车站售票系统
二、课程设计工作自2007年7月9日起至2007年7月17日止
三、课程设计内容:
用C语言编写软件完成以下任务:
每天“沈阳→植物园"有5个班次的汽车(假设),具体的数据如下:
班次 发车时间 载客量 已售票数
1 06:40 50 0
2 09:30 40 0
3 13:00 40 0
4 16:00 40 0
5 20:00 50 0
请你为售票员开发一个小程序,以完成每天的“沈阳→植物园”的售票业务.要求:
①能够售票和退票.
②某个班次已经过了开车时间,则该班次今天不再售票。
③可以随时显示售票现状,并以文件(myfile.txt)形式保存当天各个车次的售票情况。
四、课程设计要求:
程序质量:
●贯彻结构化程序设计思想。
●用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。
●用户界面中的菜单至少应包括“售票”、“退票”、“显示当前售票情况”、“保存当天数据”、“退出”5项。
●代码应适当缩进,并给出必要的注释,以增强程序的可读性.
课程设计说明书:
课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:
●封面
●课程设计任务书
●目录
●需求分析(分析题目的要求)
●程序流程图(总体流程图和主要功能模块流程图)
●核心技术的实现说明及相应程序段
●个人总结
●参考资料
●源程序及适当的注释
指导教师:________________ 学生签名:________________
目录
一、需求分析 1
二、程序流程图 2
三、核心技术的实现说明及相应程序段 5
四、个人总结 9
五、参考文献 10
六、源程序 10
15
一、需求分析
根据对程序设计题目的分析可知,整个程序的设计实现大致可分为五大模块。其中每一个模块对应一个函数,他们的功能分别是:查询当前时间(localtimes),查询当前的售票情况(search),买票(sell),退票(return)和保存数据(save)。在这几个函数中,除第一个外其他都按照题目要求编写。
1、查询当前时间 主要用于查询时间,以防止汽车已经发出还继续进行售票。
2、查询当前售票情况 主要用于查询当前的卖票情况。
3、买票 对顾客出售各车次车票。
4、退票 对顾客需要返退的车票进行处理.
5、保存数据 对当前的车票出售情况进行保存,生成myfile.txt文件,以便查询。
除此之外,程序还设立了退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。并且每一次售票或退票都会提示是否成功,并且将文件自动保存到myfile。txt中,以便查询。
二、程序流程图
1、程序总体结构图
图1 总体结构图
2、查询车次函数search结构图
图2 查询车次函数search结构图
3、售票函数sell结构图
图3 售票函数sell结构图
4、退票函数return结构图
图4 退票函数return结构图
5、保存文件函数save结构图
图5 保存文件函数save图
三、核心技术的实现说明及相应程序段
本程序主要由五个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能.在这些函数当中,查询当前售票情况函数、售票函数、退票函数和保存当天售票记录函数是程序中较为核心的部分,下面分别进行说明。
1、查询当前售票情况函数(search)
查询当前时间是通过一个循环命令,使结构体内的容依次输出,这样就可以看到当天全部的售票情况.具体程序如下:
void search() /*查询当前的车次及售票数*/ {
int i;
printf("\n\n**********Search Result**********\n”);
printf(" NO. Time Total Sell Leave \n");
for(i=0;i<K;i++) /*无限循环*/
printf("%4s %10s %10s %8d %8d\n", QC[i]。NO,QC[i].time,QC[i]。total,QC[i].sell,QC[i]。leave);
printf(” \n”);
}
2、售票函数(sell)
售票函数是先用循环语句输出当前的售票情况,然后依次输入需要购买的车号b以及要购买的票数m,然后将结构体中的车号QC[i].NO与b进行比较,成功后原售票数数组QC[i]。sell+m,原剩余票数数组QC[i]。leave—m,依次输出结构体中的内容,最后运行保存程序(save)。具体程序如下:
void sell() /*售票*/
{
int i,m;
char b[15];
{
printf(”\n\n**********Sell Result**********\n”);
printf(” NO。 Time Total Sell Leave \n");
for(i=0;i<K;i++) /*无限循环*/
printf("%4s %10s %10s %8d %8d\n", QC[i].NO,QC[i].time,QC[i]。total,QC[i].sell,QC[i]。leave);
}
printf("Please enter the carNO。 you want to buy!(For
Example:02):\n”);
scanf(”%s”,b); /*输入的值给b*/
printf(”Please enter the ticketNO. you want to buy!(For Example:5):\n");
scanf(”%d”,&m); /*输入的值给m*/
for(i=0;i<K;i++)
if(strcmp(QC[i]。NO,b)==0) /*对QC[i]。NO和b进行比较*/
{
QC[i].sell=QC[i].sell+m;
QC[i]。leave=QC[i]。leave-m;
printf("******Purchase Success!******\n”);
printf("\n\n**********Sell Result**********\n”);
printf(" NO. Time Total Sell Leave \n”);
for(i=0;i〈K;i++)
printf(”%4s %10s %10s %8d %8d\n”, QC[i].NO,QC[i].time,QC[i]。total,QC[i].sell,QC[i].leave);
save();
}
}
3、退票函数(leave)
退票函数是先用循环语句输出当前的售票情况,然后依次输入需要购买的车号b以及要购买的票数m,然后将结构体中的车号QC[i].NO与b进行比较,如果售票数大于m则原售票数数组QC[i]。sell—m,原剩余票数数组QC[i]。leave+m,依次输出结构体中的内容,最后运行保存程序(save)。具体程序如下:
void leave() /*退票*/
{
int i,m;
char b[15];
{
printf("\n\n**********Present Situation**********\n”);
printf(” NO。 Time Total Sell Leave \n”);
for(i=0;i<K;i++)
printf("%4s %10s %10s %8d %8d\n”, QC[i]。NO,QC[i]。time,QC[i]。total,QC[i].sell,QC[i].leave);
}
printf("Please enter the carNO. you want to return!(For Example:02):\n");
scanf("%s”,b); /*输入的值给b*/
printf("Please enter the ticketNO。 you want to return!(For Example:3):\n");
scanf("%d",&m); /*输入的值给m*/
for(i=0;i<K;i++)
if(strcmp(QC[i]。NO,b)==0) /*对QC[i].NO和b进行比较*/
if(QC[i].sell—m>=0) /*判断能否退票*/
{
QC[i]。sell=QC[i].sell—m;
QC[i]。leave=QC[i].leave+m;
printf("******Return Success!******\n”);
printf("\n\n**********Return Result**********\n”);
printf(” NO。 Time Total Sell Leave \n”);
for(i=0;i〈K;i++)
printf("%4s %10s %10s %8d %8d\n", QC[i].NO,QC[i]。time,QC[i].total,QC[i]。sell,QC[i].leave);
save();
}
}
4、保存函数(leave)
打开名字是myfile.txt的文件,使用文件方式为读写,用循环语句将结构体中的内容依次写入文件,完成对售票情况的保存。具体程序如下:
void save() /*对当前售票情况进行保存*/
{
FILE *fp; /*打开文件*/
int i;
if((fp=fopen("myfile。txt”,"w+"))==NULL)
{
printf("******Can not open infile!******\n");
exit(0);
}
for(i=0;i<K;i++)
fwrite(&QC[i],sizeof(struct record),1,fp); /*写入文件*/
fclose(fp); /*关闭文件*/
printf(”\n”);
printf("******Save Success!******\n\n”);
}
四、个人总结
这次课程设计基本上含盖了大学一年纪学习到的C 语言知识点,课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力.这次课设使我了解我编程思想和编程技巧,也认识了软件生命周期的各个环境,包括构思、设计、编写、调试、文档化和修订。编程的风格也很重要,只关心程序运行的结果,而对程序代码的结构的良好丝毫不在意。这是非常不可取的,如果我希望将来从事编程工作,在这一点上该引起足够的重视。这是严谨的态度,很重要.
做课设不仅让我修补了以前学习的漏洞,也让我知道一个道理:编程需要兴趣和实际动手.创新思维也至关重要,这不仅让我们写出精简的代码,也有助于开发出高效的程序。
这次程序的设计基本完成了题目的要求,只有一项是关于如何在时间到达后不能继续售票问题没有解决,我于是想到查询当前时间来解决。
最后我要感谢帮助过我的同学和老师,让我能够在有限的时间内完成题目。
五、参考文献
1 谭浩强.C程序设计.北京:清华大学出版社,2005
2 刘成等.C语言程序设计实验指导与习题集.北京:中国铁道出版社,2006
六、源程序
#include 〈stdio。h>
#include <stdlib.h〉
#include <string。h>
#include <conio。h>
#include 〈time。h>
#define K 5 /*起用宏定义变量K*/
struct record /*定义结构体类型变量*/
{
char NO[10];
char time[20];
char total[20];
int sell;
int leave;
}QC[K]={ /*用QC[K]表示*/ /*给数组QC[K]赋值*/
{"01",”06:40","50",0,50},
{"02”,"09:30”,"40",0,40},
{"03",”13:00","40”,0,40},
{”04",”16:00","40”,0,40},
{"05”,”20:00”,"50”,0,50},
};
void search();
void save();
void sell();
void localtimes();
void leave();
int menu();
int menu() /*定义菜单*/
{
int c;
printf(" 1。Time。\n”);
printf(" 2。Serch。\n");
printf(” 3。Sell。\n");
printf(” 4。Return。\n”);
printf(” 5.Save。\n");
printf(" 6。Exit。\n”);
do
{
printf(" Please choose(1-6) to begin!:");
scanf("%d”,&c); /*把输入的值赋给c*/
if(c<1||c〉6)
printf( ”\n*******Error!********\n”);
}
while(c〈1||c〉6);
return (c);
}
main()
{
for(;;)
{
switch(menu())
{
case 1:localtimes();break;
case 2:search(); break;
case 3:sell();break;
case 4:leave();break;
case 5:save();break;
case 6:exit(0);
}
}
}
void localtimes() /*显示当前时间*/
{
time_t rawtime;
struct tm *timeinfo;
time(&rawtime);
timeinfo=localtime(&rawtime);
printf(” The current date/time is: %s\n”, asctime(timeinfo));
}
void search() /*查询当前的车次及售票数*/ {
int i;
printf(”\n\n**********Search Result**********\n");
printf(” NO。 Time Total Sell Leave \n”);
for(i=0;i〈K;i++)
printf("%4s %10s %10s %8d %8d\n”, QC[i]。NO,QC[i].time,QC[i].total,QC[i]。sell,QC[i].leave);
printf(" \n");
}
void sell() /*售票*/
{
int i,m;
char b[15];
{
printf("\n\n**********Sell Result**********\n”);
printf(" NO。 Time Total Sell Leave \n”);
for(i=0;i<K;i++)
printf(”%4s %10s %10s %8d %8d\n”, QC[i]。NO,QC[i].time,QC[i]。total,QC[i]。sell,QC[i].leave);
}
printf("Please enter the carNO。 you want to buy!(For Example:02):\n”);
scanf("%s",b); /*输入的值给b*/
printf("Please enter the ticketNO. you want to buy!(For Example:5):\n");
scanf("%d",&m); /*输入的值给m*/
for(i=0;i〈K;i++)
if(strcmp(QC[i].NO,b)==0) /*对QC[i].NO和b进行比较*/
{
QC[i].sell=QC[i].sell+m;
QC[i].leave=QC[i].leave-m;
printf("******Purchase Success!******\n”);
printf(”\n\n**********Sell Result**********\n”);
printf(" NO. Time Total Sell Leave \n”);
for(i=0;i<K;i++)
printf(”%4s %10s %10s %8d %8d\n”, QC[i].NO,QC[i].time,QC[i].total,QC[i].sell,QC[i]。leave);
save();
}
}
void leave() /*退票*/
{
int i,m;
char b[15];
{
printf(”\n\n**********Present Situation**********\n”);
printf(" NO。 Time Total Sell Leave \n”);
for(i=0;i〈K;i++)
printf(”%4s %10s %10s %8d %8d\n", QC[i]。NO,QC[i].time,QC[i].total,QC[i].sell,QC[i].leave);
}
printf("Please enter the carNO. you want to return!(For Example:02):\n");
scanf("%s",b); /*输入的值给b*/
printf("Please enter the ticketNO。 you want to return!(For Example:3):\n”);
scanf("%d”,&m); /*输入的值给m*/
for(i=0;i<K;i++)
if(strcmp(QC[i].NO,b)==0) /*对QC[i]。NO和b进行比较*/ if(QC[i].sell—m〉=0) /*判断能否退票*/
{
QC[i].sell=QC[i]。sell-m;
QC[i]。leave=QC[i]。leave+m;
printf("******Return Success!******\n");
printf("\n\n**********Return Result**********\n");
printf(” NO。 Time Total Sell Leave \n”);
for(i=0;i〈K;i++)
printf("%4s %10s %10s %8d %8d\n”, QC[i]。NO,QC[i].time,QC[i]。total,QC[i]。sell,QC[i].leave);
save();
}
}
void save() /*对当前售票情况进行保存*/
{
FILE *fp; /*打开文件*/
int i;
if((fp=fopen("myfile.txt”,"w+”))==NULL)
{
printf("******Can not open infile!******\n”);
exit(0);
}
for(i=0;i<K;i++)
fwrite(&QC[i],sizeof(struct record),1,fp); /*写入文件*/
fclose(fp); /*关闭文件*/
printf("\n");
printf(”******Save Success!******\n\n");
}
展开阅读全文