您的位置:首页 > 编程语言 > C语言/C++

C语言火车售票系统

2010-10-30 00:55 288 查看
#include<stdio.h>
#include<string.h>
#include<conio.h>//getch
#include<stdlib.h>//动态分配

typedef struct route//路线
{
char num[30];//车次
char start[40];//起点
char end[40];//终点
char time[10];//时间
struct route *next;
}r;

typedef struct ticket//车票
{

char num[30];//车次
int n;//总数量
int n1;//剩余数
float price;//票价

struct ticket *next;
}t;

r * rhead=NULL,*ri=NULL;//全局指针
t * thead=NULL,*ti=NULL;//全局指针

void initialr()
{
FILE *fp;
fp=fopen("route.txt","r");
if(!fp){ printf("/n/n火车路线文件不存在!/n/n"); return ; }

fseek(fp,0,SEEK_END);
int n=ftell(fp)/sizeof(r);
rewind(fp);

int i=0;
for(;i<n;i++)
{
r *p;
p=(r*)malloc(sizeof(r));
p->next=NULL;

fread(p,sizeof(r),1,fp);

if(rhead==NULL)rhead=ri=p;
else{ ri->next=p;ri=p; }

}

fclose(fp);
printf("/n/n初始化%d个火车路线信息成功!/n/n",n);
}

void initialt()
{
FILE *fp;
fp=fopen("ticket.txt","r");
if(!fp){ printf("/n/n车票文件不存在!/n/n"); return; }

fseek(fp,0,SEEK_END);
int n=ftell(fp)/sizeof(t);
rewind(fp);

int i=0;
for(;i<n;i++)
{
t *p;
p=(t*)malloc(sizeof(t));
p->next=NULL;

fread(p,sizeof(t),1,fp);

if(thead==NULL)thead=ti=p;
else{ ti->next=p;ti=p; }

}

fclose(fp);
printf("/n/n初始化%d个车票信息成功!/n/n",n);
}

void newr()
{

printf("/n/n/n█新建火车路线█/n/n");

loop:

r *p;
p=(r *)malloc(sizeof(r));
p->next=NULL;

loop1:

printf("/n请输入火车号/n/n");
scanf("%s",p->num);
//检验
r *pj=rhead;
while(pj)
{
if(strcmp(pj->num,p->num)==0){ printf("/n/n错误,该火车号已经存在,请重新输入!/n"); goto loop1; }
pj=pj->next;
}
//检验

printf("/n请输入起始站/n/n");
scanf("%s",p->start);
printf("/n请输入终点站/n/n");
scanf("%s",&p->end);
printf("/n请输入发车时间(时:分)/n/n");
scanf("%s",&p->time);

if(rhead==NULL)rhead=ri=p;
else{ ri->next=p; ri=p; }

printf("/n/n创建新火车路线成功!/n/n");

char c;
printf("/n/n您想---继续新建(A)--退出新建(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop; else return;

}

void newt()
{

printf("/n/n/n█新建车票█/n/n");

loop:

t *p;
p=(t *)malloc(sizeof(t));
p->next=NULL;

printf("/n请输入要新建车票的火车号/n/n");
scanf("%s",p->num);
//检验是否已经售票
int y=0;
t *pt=thead;
while(pt)
{
if(strcmp(pt->num,p->num)==0){y=1;break;}
pt=pt->next;
}

if(y) { printf("/n错误,该火车号已经开始售票!/n/n");goto loop;}

//检验是否存在
y=1;
r *pj=rhead;
while(pj)
{
if(strcmp(pj->num,p->num)==0){y=0;break;}
pj=pj->next;
}
if(y) { printf("/n错误,无该火车号!/n/n");goto loop;}
//-----------------------------------------------------------

printf("/n请输入总票数:/n/n");
scanf("%d",&p->n);
p->n1=p->n;
printf("/n请输入票价:(元)/n/n");
scanf("%f",&p->price);

if(thead==NULL)thead=ti=p;
else{ ti->next=p; ti=p; }

printf("/n/n创建火车票成功!/n/n");

char c;
printf("/n/n您想---继续新建(A)--退出新建(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop; else return;

}

void showr()
{

r *p;
p=rhead;

printf("/n/n/n      █火车信息数据库█        ");
printf("/n|--------------------------------------------------------------------------|");
int i=0;

while(p)
{
i++;
printf("/n|车号:%s 路线: %s---------->%s 发车时间:%s",p->num ,p->start ,p->end ,p->time);

//-----------------------
int jy=1;
t*p1=thead;
while(p1)
{ if(strcmp(p1->num,p->num)==0) {printf("/t[已售票]"); jy=0; } p1=p1->next; }

if(jy) printf("/t[未售票]");
//-----------------------

printf("/n|--------------------------------------------------------------------------|");
p=p->next;
}

printf("/n█火车总数: %d ",i);
printf("/n|--------------------------------------------------------------------------|/n/n/n/n/n/n");

}

void showt()
{
printf("/n/n/n      █火车票信息数据库█        ");
printf("/n|--------------------------------------------------------------------------|");

int i=0;
t*p=thead;
while(p)
{ i++;
printf("/n|车号:%s 票价:%f 剩余:%d 总数:%d 已卖:%d",p->num ,p->price ,p->n1 ,p->n,p->n-p->n1);
printf("/n|--------------------------------------------------------------------------|");
p=p->next;
}

}

void modifyr()
{

printf("/n/n/n █修改路线█        ");

loop:
printf("/n/n/n请输入要修改的火车号:");
char n[20];
scanf("%s",n);

r *p=rhead;

int y=1;
while(p)
{
if(strcmp(n,p->num)==0)
{y=0;
printf("/n请输入新起始点/n/n");
scanf("%s",p->start);

printf("/n请输入新终点站/n/n");
scanf("%s",p->end);

printf("/n请输入新发车时间/n/n");
scanf("%s",p->time); }

p=p->next;

}

if(y)printf("/n/n错误,要修改的车号不存在!/n/n");
else printf("/n/n修改成功!/n/n");
char c;
printf("/n/n您想---继续修改(A)--退出修改(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop;else return;
}

void delr()
{

printf("/n/n/n █删除路线█        ");

loop:
printf("/n/n/n请输入要删除的火车号:");
char n[20];
scanf("%s",n);

r *p=rhead,*p1=rhead;

int y=0;
int jy=1;
while(p)
{

if(strcmp(n,p->num)==0)
{

//检验-----------------------------------------------------------
t *p2=thead;
while(p2)
{
if(strcmp(p->num,p2->num)==0&&p2->n!=p2->n1)
printf("/n/n错误,已售票,无法删除!!/n/n");

p2=p2->next;
}
//检验---------------------------------------------------------

jy=0;
if(p==rhead)rhead=rhead->next;
else p1->next=p->next;
break;
}

y++;
if(y>1)p1=p1->next;
p=p->next;

}

if(jy)printf("/n/n错误,要删除的车号不存在!/n/n");
else printf("/n/n删除成功!/n/n");
char c;
printf("/n/n您想---继续删除(A)--退出删除(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop;else return;

}

void lookr()
{

char c,m[20];

do
{//do的开始。

printf("/n/n/n [火车查询菜单]");
printf("/n|----------------------------------|");
printf("/n| 请选择查询方式: |");
printf("/n|----------------------------------|");
printf("/n| A[ 火车号查询 ] |");
printf("/n|----------------------------------|");
printf("/n| B[ 起始地查询 ] |");
printf("/n|----------------------------------|");
printf("/n| C[ 目的地查询 ] |");
printf("/n|----------------------------------|");
printf("/n| D[ 退 出 ] |");
printf("/n|----------------------------------|");

r *p=rhead;
c=getch();
int y;

switch (c)
{
//switch的开始

case 'A':
case'a':

y=1;
printf("/n/n请输入要查找的火车号/n/n");
scanf("%s",m);

while(p)
{

if(strcmp(p->num,m)==0)
{y=0;

printf("/n|--------------------------------------------------------------------------|");
printf("/n|车号:%s 路线: %s---------->%s 发车时间:%s",p->num ,p->start ,p->end ,p->time);

//检验
int jy=1;
t*p1=thead;
while(p1)
{

if(strcmp(p1->num,p->num)==0) { printf("/n 总票数: %d 剩余票数 %d 已卖票数:%d ",p1->n ,p1->n1 ,p1->n-p1->n1 ); jy=0; }
p1=p1->next; }

if(jy) printf("/t[未售票]");
//检验
printf("/n|--------------------------------------------------------------------------|");
}

p=p->next;
}

if(y) printf("失败,您查询的火车不存在!/n/n");
break;

case'B':
case'b':

y=0;
printf("/n/n请输入要查找的起始地/n/n");
scanf("%s",m);

while(p)
{

if(strcmp(p->start,m)==0)
{y=0;

printf("/n|--------------------------------------------------------------------------|");
printf("/n|车号:%s 路线: %s---------->%s 发车时间:%s",p->num ,p->start ,p->end ,p->time);

//检验
int jy=1;
t*p1=thead;
while(p1)
{

if(strcmp(p1->num,p->num)==0) { printf("/n 总票数: %d 剩余票数 %d 已卖票数:%d ",p1->n ,p1->n1 ,p1->n-p1->n1 ); jy=0; }
p1=p1->next; }

if(jy) printf("/t[未售票]");
//检验
printf("/n|--------------------------------------------------------------------------|");
}

p=p->next;
}

if(y) printf("失败,您查询的火车不存在!/n/n");
break;

case'C':
case'c':

y=0;
printf("/n/n请输入要查找的终点站/n/n");
scanf("%s",m);

while(p)
{

if(strcmp(p->end,m)==0)
{y=0;

printf("/n|--------------------------------------------------------------------------|");
printf("/n|车号:%s 路线: %s---------->%s 发车时间:%s",p->num ,p->start ,p->end ,p->time);

//检验
int jy=1;
t*p1=thead;
while(p1)
{

if(strcmp(p1->num,p->num)==0) { printf("/n 总票数: %d 剩余票数 %d 已卖票数:%d ",p1->n ,p1->n1 ,p1->n-p1->n1 ); jy=0; }
p1=p1->next; }

if(jy) printf("/t[未售票]");
//检验
printf("/n|--------------------------------------------------------------------------|");
}

p=p->next;
}

if(y) printf("失败,您查询的火车不存在!/n/n");
break;

}//switch的结束

}while(c!='D'&&c!='d');

}

void sell()
{
printf("/n/n/n [火车售票]");

char m[20];
int y=1;
printf("/n/n请输入要购买的火车号/n/n");
scanf("%s",m);
r *p=rhead;
while(p)
{
if(strcmp(p->num,m)==0)
{y=0;

printf("/n|--------------------------------------------------------------------------|");
printf("/n|车号:%s 路线: %s---------->%s 发车时间:%s",p->num ,p->start ,p->end ,p->time);

int jy=1;
t*p1=thead;
while(p1)
{
if(strcmp(p1->num,p->num)==0)
{
printf("/n 总票数: %d 剩余票数 %d 已卖票数:%d ",p1->n ,p1->n1 ,p1->n-p1->n1 ); jy=0;
if(p1->n1==0){printf("/n/n错误,您要购买的火车号已经售完!/n/n");goto loop;}
loop1:
printf("/n/n请输入要购买的数量:/n/n");
int nn;
scanf("%d",&nn);
if(nn>p1->n1){printf("/n/n错误,您要购买的数量不足!/n/n");goto loop1;}
else{p1->n1-=nn;printf("/n/n请付%f元!",p1->price*nn);printf("/n/n买票操作成功!/n/n");goto loop;}
}
p1=p1->next; }

if(jy) printf("/t[未售票]");
//检验
printf("/n|--------------------------------------------------------------------------|");
}

p=p->next;
}

if(y) printf("失败,您查询的火车不存在!/n/n");
loop:;
}

void back()
{
printf("/n/n/n [火车退票]");

char m[20];
int y=1;
printf("/n/n请输入要退票的火车号/n/n");
scanf("%s",m);
r *p=rhead;
while(p)
{
if(strcmp(p->num,m)==0)
{y=0;

printf("/n|--------------------------------------------------------------------------|");
printf("/n|车号:%s 路线: %s---------->%s 发车时间:%s",p->num ,p->start ,p->end ,p->time);

int jy=1;
t*p1=thead;
while(p1)
{
if(strcmp(p1->num,p->num)==0)
{
printf("/n 总票数: %d 剩余票数 %d 已卖票数:%d ",p1->n ,p1->n1 ,p1->n-p1->n1 ); jy=0;
if(p1->n1==p1->n){printf("/n/n错误,您要退的火车号未起售!/n/n");goto loop;}
loop1:
printf("/n/n请输入要退票的数量:/n/n");
int nn;
scanf("%d",&nn);
if(nn+p1->n1>p1->n){printf("/n/n错误,您要退的数量有误!/n/n");goto loop1;}
else{p1->n1+=nn;printf("/n/n请收%f元!",p1->price*nn);printf("/n/n退票操作成功!/n/n");goto loop;}
}
p1=p1->next; }

if(jy) printf("/t[未售票]");
//检验
printf("/n|--------------------------------------------------------------------------|");
}

p=p->next;
}

if(y) printf("失败,您查询的火车不存在!/n/n");
loop:;
}

void add()
{
printf("/n/n/n      [添加车票]        ");
char m[20];
printf("/n/n请输入要增加的火车号/n/n");
scanf("%s",m);
int y=1;
t*p=thead;
while(p)
{
if(strcmp(m,p->num)==0)
{ y=0;
printf("/n 总票数: %d 剩余票数 %d 已卖票数:%d ",p->n ,p->n1 ,p->n-p->n1 );
loop1:
printf("/n/n请输入要增加的数量:/n/n");
int nn;
scanf("%d",&nn);
if(nn<0){printf("/n/n错误,您的输入为负!/n/n");goto loop1;}
else{p->n1+=nn;p->n+=nn;printf("/n/n增加后总票数为%d,剩余票数为%d!/n/n",p->n,p->n1);printf("/n/n增加车票操作成功!/n/n");break;}
}
p=p->next;
}

}

void stop()
{
printf("/n/n/n      [停止售票]        ");

char m[20];
printf("/n/n请输入要停止售票的火车号/n/n");
scanf("%s",m);
int y=1;
t*p=thead,*q;
if(p==NULL) {printf("/n/n无该文件!/n/n");goto loop;}
if(strcmp(m,p->num)==0){thead=thead->next;free(p);goto loop;}//为首结点时
while(p)
{
if(strcmp(m,p->next->num)==0)
{ q=p->next;break;}

p=p->next;
}

p->next=q->next;

free(q);

loop:;
printf("/n/n%s停止售票成功/n/n",m);

}

void saver()
{

FILE * fp;
fp=fopen("route.txt","w");

r *p=rhead;
int i=0;
while(p)
{
i++;
fwrite(p,sizeof(r),1,fp);
p=p->next;
}

fclose(fp);
printf("/n/n保存%d个火车信息成功!/n",i);

}

void savet()
{

FILE * fp;
fp=fopen("ticket.txt","w");

t *p=thead;
int i=0;
while(p)
{
i++;
fwrite(p,sizeof(t),1,fp);
p=p->next;
}

fclose(fp);
printf("/n/n保存%d个火车票信息成功!/n",i);

}

void clear()
{

r *p=rhead;
while(p)
{
r *temp=p->next;
free(p);
p=temp;

}
rhead=NULL;
printf("/n/n清空火车票路线信息成功!/n");

r *p1=rhead;
while(p1)
{
r *temp=p1->next;
free(p1);
p1=temp;
}
rhead=NULL;
printf("/n/n清空火车票信息成功!/n");

}
void show1()
{

printf("/n |----------------------------------------|");
printf("/n | █主 菜 单 █ |");
printf("/n |----------------------------------------|");
printf("/n | A 火 车 查 询 |");
printf("/n |----------------------------------------|");
printf("/n | B 购 买 车 票 |");
printf("/n |----------------------------------------|");
printf("/n | C 退 回 车 票 |");
printf("/n |----------------------------------------|");
printf("/n | D 系 统 管 理 |");
printf("/n |----------------------------------------|");
printf("/n | E 清 空 数 据 |");
printf("/n |----------------------------------------|");
printf("/n | F 退 出 程 序 |");
printf("/n |----------------------------------------|");
printf("/n | 请您选择一个任务 |");
printf("/n |----------------------------------------|/n/n/n");
}

void show2()
{

printf("/n |--------------------------- -|");
printf("/n | █管 理 菜 单█ |");
printf("/n |-----------------------------|");
printf("/n | A 增 加 路 线 |");
printf("/n |-----------------------------|");
printf("/n | B 修 改 路 线 |");
printf("/n |-----------------------------|");
printf("/n | C 新 建 车 票 |");
printf("/n |-----------------------------|");
printf("/n | D 增 加 车 票 |");
printf("/n |-----------------------------|");
printf("/n | E 取 消 路 线 |");
printf("/n |--------------------------- -|");
printf("/n | F 退 出 程 序 |");
printf("/n |----------------------------|");
printf("/n | 请您选择一个任务 |");
printf("/n |----------------------------|/n/n/n");
}

void show()
{

printf("/n |--------------------------- -|");
printf("/n | █查 询 菜 单█ |");
printf("/n |-----------------------------|");
printf("/n | A 查 询 火 车 |");
printf("/n |-----------------------------|");
printf("/n | B 查 询 车 票 |");
printf("/n |-----------------------------|");
printf("/n | C 具 体 查 询 |");
printf("/n |-----------------------------|");
printf("/n | D 退 出 程 序 |");
printf("/n |-----------------------------|/n/n");
}

void main()
{
initialr();
initialt();
char c1;
do {//do 1

show1();

c1=getch();

switch ( c1 )
{//switch

case 'a':
case 'A':

char c;
do{

show();
c=getch();
switch(c)
{
case 'a':
case 'A':showr();break;
case 'b':
case 'B':showt();break;
case 'c':
case 'C':lookr();break;

case 'd':
case 'D':break;

}

}while(c!='D'&&c!='d');

break;

case 'b':
case 'B':sell();break;

case 'c':
case 'C':back();break;

case 'd':
case 'D':

char c2;

do{
show2();

c2=getch();

switch ( c2)

{
case 'a':
case 'A':newr();break;

case 'b':
case 'B':modifyr();break;

case 'c':
case 'C':newt();break;

case 'd':
case 'D':add();break;

case 'e':
case 'E': stop();break;

case 'f':
case 'F': break;

}

}while(c2!='f'&&c2!='F');
break;

case 'e':
case 'E':clear();break;

case 'f':
case 'F': break;

}//switch

}//do1
while(c1!='f'&&c1!='F');

saver();
savet();

printf("/n/n ★ 谢谢您的使用!★");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: