设计文档:GitHub传送门
C语言代码:
/************************************************************************/
/* 项目名称:列车时刻表信息管理系统
/* 最后修改时间:2016-09-24
/* 开发环境: VC6.0;
/* 作者:QJW
/************************************************************************/
#include <stdio.h>
#include "info.H"
#include <malloc.h>
#include <windows.h>
int main()
{
while(1)
{
Menu();
system("pause");
}
return 0;
}
/**
* 函数名称:Menu
* 函数功能:显示菜单
* 输入参数:无
* 返回值:无
**/
void Menu()
{
int option = 0;
//修改控制台标题
system("title 列车时刻表信息管理系统");
//设置控制台尺寸
system(WIN_SIZE);
//把背景设置为 浅绿色
system("color 3e");
//显示主菜单
showMenu(0);
}
int Scanf(int left,int top)
{
int option;
setTop(top);
setLeft(left);
printf("请选择:");
scanf("%d",&option);
return option;
}
/**
* 函数名称:showMenu
* 函数功能:显示菜单
* 输入参数:option选项值
* 返回值:选项序号
**/
int showMenu(int option)
{
//选项item
int select;
//主菜单list
char *title[]={
"数据管理","数据查询","数据统计","退出系统",""};
//数据管理list
char *title_data[]={
"车次管理","经停车站管理","经停车站信息管理","返回主菜单","退出系统",""};
//车次管理list
char *title_trains[]={
"新增车次","修改车次","删除车次","返回上一级菜单","返回主菜单","退出系统",""};
//经停车站list
char *title_stops[]={
"新增经停车站","修改经停车站","删除经停车站","返回上一级菜单","返回主菜单","退出系统",""};
//经停车站信息
char *title_stops_inf[]={
"新增经停车站信息","修改经停车站信息","删除经停车站信息","返回上一级菜单","返回主菜单","退出系统",""};
//查询
char *query_list[]={
"简单列表","复合查询","返回主菜单","退出系统",""};
//简单列表
char *query_simple_list[]={
"车次列表","车次经停站列表","经停站列表","返回上一级菜单","返回主菜单","退出系统",""};
switch(option) {
case 0:
//主菜单
drawMenu(title,50,10,2,true);
load();//加载数据
select = Scanf(50,0) ;
if(select == 1) showMenu(1);
if(select == 2) showMenu(3);
if(select == 3) tongji();
if(select == 4) exit(0);
break;
case 1:
//数据管理
drawMenu(title_data,50,10,2,true);
select = Scanf(50,0) ;
if(select == 1) showMenu(2);
if(select == 2) showMenu(4);
if(select == 3) showMenu(5);
break;
case 2:
//车次管理
system("cls");
drawMenu(title_trains,50,10,2,true);
select = Scanf(50,0) ;
if(select == 1) add_train();
if(select == 2) change_train();
if(select == 3) delete_train();
if(select == 4) showMenu(1);
if(select == 5) showMenu(0);
if(select == 6) exit(0);
break;
case 3:
drawMenu(query_list,50,10,2,true);
select = Scanf(50,0) ;
if(select == 1) showMenu(6);
if(select == 2) sigle(1);
if(select == 3) showMenu(0);
if(select == 4) exit(0);
break;
case 4:
//经停车站管理
drawMenu(title_stops,50,10,2,true);
select = Scanf(50,0) ;
if(select == 1) add_stop();
if(select == 2) change_stop();
if(select == 3) delete_stop();
if(select == 4) showMenu(1);
if(select == 5) showMenu(0);
if(select == 6) exit(0);
break;
case 5:
//经停车站信息
drawMenu(title_stops_inf,50,10,2,true);
select = Scanf(50,0) ;
if(select == 1) add_stop_inf();
if(select == 2) change_stop_inf();
if(select == 3) delete_stop_inf();
if(select == 4) showMenu(1);
if(select == 5) showMenu(0);
if(select == 6) exit(0);
break;
case 6:
drawMenu(query_simple_list,50,10,2,true);
select = Scanf(50,0) ;
if(select == 1) simple_list(1);
if(select == 2) simple_list(2);
if(select == 3) simple_list(3);
if(select == 4) showMenu(3);
if(select == 5) showMenu(0);
if(select == 6) exit(0);
break;
}
return option;
}
/**
* 函数名称:drawMenu
* 函数功能:绘制一个菜单
* 输入参数:
* str:选项名称 多个选项用空格隔开(如:"数据管理","数据查询","数据统计","退出系统","")
* left(>0): 列表与左边的宽度 按空格计算
* top(>0): 列表离顶端的高度 按行计算
* line_height(>0):行高
* line_flag(true|false):是否显示行标号
* 返回值:列表项目数量
**/
int drawMenu(char *str[],int left,int top,int line_height,bool line_flag)
{
int i = 0,j,k,p;
int count = 1;
int max=0;
int maxStrLength = 0;
int last;
//
while(strcmp(str[i],"")!=0)
{
max = strlen(str[i]);
if(max>maxStrLength)
maxStrLength = max;
i++;
}
i=0;
system("cls");
//控制上间距
setTop(top);
while(strcmp(str[i],"")!=0)
{
//控制左间距
setLeft(left);
if(i==0 )
for(k=1;k<=maxStrLength/2+1;k++)
{
if(k==1)printf("┌");
printf("——");
if(k==maxStrLength/2+1)
printf("┐\n\n\n\n");
}
if(i==0)
{
setLeft(50);
}
if(line_flag) printf("¤ %d.",count);
printf("%s",str[i++]);
count ++;
//控制行高
setTop(line_height);
}
printf("\n\n\n\n");
setLeft(50);
for(k=1;k<=maxStrLength/2+1;k++)
{
if(k==1)printf("└");
printf("——");
if(k==maxStrLength/2+1)
printf("┘\n");
}
return count-1;
}
/**
* 函数名称:setLeft
* 函数功能:控制左间距
* 输入参数:left(>0) 左间距
* 返回值:左间距
**/
int setLeft(int left)
{
for(int j = 0;j<left;j++)
printf(" ");
return left;
}
/**
* 函数名称:setTop
* 函数功能:控制上间距
* 输入参数:top>0) 上间距
* 返回值: 上间距
**/
int setTop(int top)
{
for(int j =0 ;j<top;j++)
printf("\n");
return top;
}
void add_train()
{
PTrainInfo head,p1,p2;
FILE *fp;
head = p1 = (PTrainInfo)malloc(TRAINSIZE);
if((fp = fopen("train.txt","ab+"))==NULL || p1==NULL)
Error();
system("cls");
setTop(10);
setLeft(50); printf(" 车次编号:"); scanf("%s",p1->trainId); printf("\n");
//判断车次编号是否重复
p2 =findTrain(-1,p1->trainId,-1);
if(p2!=NULL)
{
printf("记录重复,录入失败.\n");
system("pause");
return;
}
setLeft(50); printf(" 车次名称:"); scanf("%s",p1->trainName); printf("\n");
setLeft(50); printf(" 车次类型编码:"); scanf("%s",p1->trainCode); printf("\n");
setLeft(50); printf(" 车次类型名称:"); scanf("%s",p1->typeName); printf("\n");
setLeft(50); printf(" 所属路局编号:"); scanf("%s",p1->rodeId); printf("\n");
setLeft(50); printf(" 所属路局名称:"); scanf("%s",p1->rodeName); printf("\n");
setLeft(50); printf(" 始发站:"); scanf("%s",p1->startStaion); printf("\n");
setLeft(50); printf(" 始发时间:"); scanf("%s",p1->startTime); printf("\n");
setLeft(50); printf(" 终到站:"); scanf("%s",p1->endStation); printf("\n");
setLeft(50); printf(" 终到时间:"); scanf("%s",p1->endTime); printf("\n");//float f=0.0;//避免floating not load
setLeft(50); printf(" 硬卧下铺全程票价:"); scanf("%f",&p1->hardLwr); printf("\n");
setLeft(50); printf(" 硬卧中铺全程票价:"); scanf("%f",&p1->hardMid); printf("\n");
setLeft(50); printf(" 硬卧上铺全程票价:"); scanf("%f",&p1->hardUpper); printf("\n");
setLeft(50); printf(" 软卧下铺全程票价:"); scanf("%f",&p1->softLwr); printf("\n");
setLeft(50); printf(" 软卧上铺全程票价:"); scanf("%f",&p1->softUpper); printf("\n");
setLeft(50); printf(" 硬座全程票价:"); scanf("%f",&p1->hardSit); printf("\n");
setLeft(50); printf(" 全程运行时间:"); scanf("%s",p1->fullTime); printf("\n");
setLeft(50); printf(" 全程运行里程:"); scanf("%d",&p1->fullMile); printf("\n");
fwrite(p1,TRAINSIZE,1,fp);