程序设计要求用C语言写一个简单的火车售票系统,主要实现的功能为:
● 录入班次信息
● 浏览班次信息
● 按班次号查询
● 按终点站查询
● 按余票数量排序保存
● 售票
● 退票
● 更新班次信息
● 退出系统
所有的班次信息保存在number.dat文件中,排序过后的保存在sort.dat中(.dat是一种二进制文件)。
在编写的过程中我觉得在判断火车的状态比较值得深究。这里假设火车主要有四种状态:
1、未发车
2、已发车
3、停止检票
4、停止退票
在程序中,思路是将代表发车时间的字符串转化为整型,再和系统现在的时间进行大小比较,主要采用if判断各种情况。其中atime代表的是发车时间的整型数,btime代表的是系统时间的整型数,具体实现如下:
在判断退票时如果两个时间的小时数是一样的,则它们的分钟数如果相差在30之内即半小时之内或者发车时间的小时和系统时间的小时相差一个1,并且发车时间的分钟数小于30,系统时间的分钟大于30,则它们之间也就相差在30之内,此时代表停止退票。
判断检票和上面思想大致相同。
为了参考研究,贴上代码:
#include
#include
#include
#include
#include "time.h"
//班次信息表
#define SIZELIMIT 10 //每班次的具体信息的字符个数限制在10以内
#define MAXNUM 1000 //设定最多只能录入1000个车次信息
typedef struct cardbase //定义一个关于班次信息的结构体,取名为CardBase
{
char C_ID[SIZELIMIT];//班次
char C_TIME[SIZELIMIT];//发车时间
char C_ANAME[SIZELIMIT];//起点站
char C_BNAME[SIZELIMIT];//终点站
char C_USETIME[SIZELIMIT];//行车时间
char C_MAXNUM[SIZELIMIT];//额定载量
char C_REMAINNUM[SIZELIMIT];//余票数量
}CardBase;
int cbNum=0;//记录班次数
CardBase cBList[MAXNUM];//班次列表
//读取班次信息
void readcardbasefile()
{
FILE *fp;
//打开文件失败则创建文件
if((fp=fopen("./number.dat","r"))==NULL)
{
//初次运行创建文件
if ((fp=fopen("./number.dat","w"))==NULL)
{
exit(0); //返回
}
else
{
fclose(fp);
}
return ;
}
/*文件位置指针移动到文件末尾*/
fseek(fp,0,2);//重定位文件内部位置指针
/* int fseek( FILE *stream, long offset, int origin );
第一个参数stream为文件指针
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
简言之:
fseek(fp,100L,0);把stream指针移动到离文件开头100字节处;
fseek(fp,100L,1);把stream指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);把stream指针退回到离文件结尾100字节处。 */
if (ftell(fp)>0)//文件不为空
/*ftell函数用于得到文件位置指针当前位置相对于文件首的偏移字节数
也就是得到文件所包含的字节数,如果大于0,则代表文件非空*/
{
//文件位置指针移动到文件开始
rewind(fp);
char buff[10]={0};
for (cbNum=0;!feof(fp) && fread(&cBList[cbNum],sizeof(CardBase),1,fp);cbNum++)
/*对于feof函数,如果遇到文件结束,函数feof(fp)的值为非零值,否则为0。
即如果文件结束,!feof(fp)为0,跳出循环
对于fread函数,是从一个文件流中读数据,如果调用成功返回实际读取到的项个数,
如果不成功或读到文件末尾返回 0*/
fgets(buff,10,fp);
/*char *fgets(char *buf, int bufsize, FILE *stream);
从文件结构体指针stream中读取数据&#