《 火车订票管理系统》

概要

可以简单注册用户和登录的订票系统,这是我大一期末的作业供大家参考

整体架构流程

源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h> 
#define A "BANCI.txt"
#define B "YONGHU.txt"
#define C "DINDAN.txt"
//用户信息储存
typedef struct zhanghu
{
    char name[20];//名称 
    char zhanghao[20];//账号 
	char mima[20];//密码 
	struct zhanghu*nvp; 
}erus;
 erus*head1=NULL;

//订单信息 
typedef struct huoche
{
char name[20];//用户名称
char dd[20];//发站
char da[20];//到站
char time[20];//发车时间 
char Hname[100];//车次名称 
int ps;//票数 
float jg;//价格 
struct huoche*xia;
}ordr;
ordr*head2=NULL;

//车次信息
typedef struct op
{
 char Hname[100];//车次名称
 char dd[100];//发车地点
 char da[100];//终点站 
 char time1[100];//发车时间
 char time2[100];//到站时间 
 int ps;//票数  
 float pj;//票价
 struct op*next; 
}infor;
infor*head3=NULL;

//全局变量 
char qiao[20];//保存当前登录的用户名 
char nm[20];//订票车次暂存 
int zi;//订票的票数暂存 


//loge界面和菜单界面模块 

//设置控制台输出的文本颜色和背景颜色的函数
void SetColor(int ForeColor,int BackGroundColor)  
{  
    HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);//获取一个标准输出句柄  
    SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColor%16*16));  //是一个Windows API函数,用于设置控制台文本的颜色和背景。
} 
void qqq()//展示区一个动态的加载进度条 
{    
    int i;
        printf("加载中:"); 
    for(i = 1;i <= 50;i++)    
    {
        SetColor(0,14);    
        printf(" ");    
        printf("%d%%",2*i);
        Sleep(101-1*i);
        printf("\b\b\b");//删除最后一个打印的数字,使其在控制台上移动,模拟进度条的动态效果。
    }  
    SetColor(15,0); 
}
void welcome(){//欢迎界面 
	system("color 5");
puts("              $$\\                                            $$\\");                                        
puts("              $$ |                                            $$ |");                                       
puts("$$\\   $$\\  $$\\ $$$$$$$\\   $$$$$$\\   $$$$$$\\   $$$$$$\\        $$$$$$\\    $$$$$$\\         $$$$$$\\   $$$$$$\\ "); 
puts("$$ | $$ | $$ |$$  __$$\\ $$  __$$\\ $$  __$$\\ $$  __$$\\       \\_$$  _|  $$  __$$\       $$  __$$\\ $$  __$$\\");
puts("$$ | $$ | $$ |$$ |  $$ |$$$$$$$$ |$$ |  \\__|$$$$$$$$ |        $$ |    $$ /  $$ |      $$ /  $$ |$$ /  $$ |");
puts("$$ | $$ | $$ |$$ |  $$ |$$   ____|$$ |      $$   ____|        $$ |$$\\ $$ |  $$ |      $$ |  $$ |$$ |  $$ |");
puts("\\$$$$$\$$$$ |$$ |  $$ |\\$$$$$$$\ $$ |      \\$$$$$$$\\           \\$$$$  |\\$$$$$$  |      \\$$$$$$$ |\\$$$$$$  |");
puts(" \\_____\\____/ \\__|  \\__| \\_______|\\__|       \\_______|         \\____/  \______/        \\____$$ | \\______/ ");
puts("                                                                                      $$\\   $$ |");        
puts("                                                                                      \\$$$$$$  |");     
puts("                                                                                       \\______/");
puts("\033[33m            __");
puts("     />  フ");
puts("     |  _  _ ");
puts("     /`ミ_xノ");
puts("     /     |");
puts("    /  ヽ   |");
puts("    |  |  |   |");
puts(" / ̄|   |  |  |");
puts(" | ( ̄ヽ__ヽ_)__)");
printf("\二つ\033[0m");
return;
}

int menu()//一级菜单
{
	system("cls");//清屏 
	int n;
    puts("\t\t|------------------------------------------------------|");
    puts("\t\t|                      \033[32m身份确认\033[0m                        |");
    puts("\t\t|------------------------------------------------------|");
    puts("\t\t|                     1.用户                           |");
    puts("\t\t|                     2.管理员                         |");
    puts("\t\t|                     0.退出系统                       |");
    puts("\t\t|------------------------------------------------------|");
    printf("\t\t请输入菜单序号:");
	scanf("%d",&n);
	return n;
}

void menu1(){//二级菜单 
	system("cls");//清屏 
	int n;
    puts("\t\t|------------------------------------------------------|");
    puts("\t\t|                      \033[33m尊敬的用户\033[0m                      |");
    puts("\t\t|------------------------------------------------------|");
    puts("\t\t|                     1.登录系统                       |");
    puts("\t\t|                     2.注册账号                       |");
    puts("\t\t|                     0.返回                           |");
    puts("\t\t|                    11.退出系统                       |");
    puts("\t\t|------------------------------------------------------|");
}

void menu2()//三级级菜单
{
	system("cls");//清屏 
    puts("\t\t|------------------------------------------------------|");
    puts("\t\t|                    \033[36m火车订票系统\033[0m                      |");
    puts("\t\t|------------------------------------------------------|");
    puts("\t\t|                     1.订票                           |");
    puts("\t\t|                     2.查看订单                       |");
    puts("\t\t|                     3.退票                           |");
    puts("\t\t|                     0.返回                           |");
    puts("\t\t|                    11.退出系统                       |");
    puts("\t\t|------------------------------------------------------|");
}

//用户模块
void denglu(){//用户登录
	erus*p=head1;
    int g, f;
    char d[20], e[20];
    printf("账号:");
    scanf("%s", d);
    printf("\n");
    printf("密码:");
    scanf("%s",e);
    printf("\n");
    for (;p!=NULL;p=p->nvp)
    {
        if (strcmp(p->zhanghao, d) == 0)
        {
            f = strcmp(p->mima, e);
            if(f==0)
            {
            		system("cls");//清屏 
                 printf("\n\n\n\t\t\t\t\t\033[33m用户%s欢迎回来!!!\033[0m\n\n", p->name);
                 strcpy(qiao,p->name);
                 sleep(1);
                 zsd();//转到三级菜单操作 
                 return;
            }
        }
    } 
}

void zhuce(){//用户注册
	int c=2;//用户注册保存传参 
	char l[20];
	char v[20];
	  erus*p=(erus*)malloc(sizeof(erus));
     printf("用户名:");
     scanf("%s",&l);
     printf("账号:");
     scanf("%s",&v);
     printf("\n");
     again(l,v);//检测函数 
     strcpy(p->name, l);
     strcpy(p->zhanghao, v);
     printf("密码:");
     scanf("%s",p->mima);
     printf("\n");
     p->nvp=head1;
	 head1=p; 
	 save(c);
	 system("cls");//清屏 
     printf("\t\t\t\t\t\t\033[33m创建成功!\n\033[0m");
     printf("\t\t\t\t\t\t你好\033[33m%s\033[0m\n\t\t\t\t\t\t你的账户:\033[33m%s\033[0m\n", p->name, p->zhanghao);
     system("pause");
}
void again(char l[20],char v[20])//检测模块
{
	erus*p=head1;
    char z[20];
    char f[20];
    strcpy(z, l);
    strcpy(f,v);
    for (p=head1;p!=NULL;p=p->nvp)//判断用户名是否已被注册过 
    {
        while (strcmp(p->name, z) == 0)
        {
            printf("\033[36m该用户名已被注册!!!\033[0m\n");
            printf("\033[33m重新输入用户名:\033[0m");
            scanf("%s", &z);
        }
        strcpy(l, z);
    }
    for (p=head1;p!=NULL;p=p->nvp)//判断用账号是否已被注册过
    {
         while (strcmp(p->zhanghao, f) == 0)
        {
            printf("\033[36m该账号已被注册!!!\033[0m\n");
            printf("\033[33m重新输入账号:\033[0m");
            scanf("%s", &f);
        }
        strcpy(v, f);
    }
}

//管理员模块
void gl(){//管理员登录
	int glh,glm;
	puts("输入管理员账号:");
	 scanf("%d",&glh);
	puts("输入密码:");
	 scanf("%d",&glm);
	 if(glh==777&&glm==777){
	 		  int g;
	      do{
	      	system("cls");
	      	 show1();//车次信息展示 
		puts("1.\033[31m添加车次\033[0m");
		puts("2.\033[31m删除车次\033[0m");
		puts("0.\033[31m退出\033[0m");
		puts("\033[32m输入功能数字:\033[0m"); 
		scanf("%d",&g);
		switch(g){
			case 1:
				add_banci();//添加车次 
				break;
			case 2:
				 del();//删除车次 
				break;
            case 0:
            	break;
			default:
				printf("输入错误!\n");	
				break;						
		}
	}while(g);
	 }
}
void add_banci(){//班次信息添加 
    int c=1;//调用save函数的车次保存功能 
infor*op=(infor*)malloc(sizeof(infor));
	 puts("\033[36m请输入车次:\033[0m");
	 scanf("%s",op->Hname);
	 puts("\033[36m输入出发地点:\033[0m");
	 scanf("%s",op->dd);
	 puts("\033[36m输入终点站:\033[0m");
	 scanf("%s",op->da); 
	 puts("\033[36m输入出发时间:\033[0m");
	 scanf("%s",op->time1);
	 puts("\033[36m输入到站时间:\033[0m");
	 scanf("%s",op->time2);
	 puts("\033[36m输入票价:\033[0m"); 
	 scanf("%f",&op->pj);
	 puts("\033[36m输入票数:\033[0m");
	 scanf("%d",&op->ps); 
	 op->next=head3;
	 head3=op;
	 save(c);
}
void show1(){//班次信息展示 
    system("cls");
	infor*op=head3;
	if(!head3){
		printf("\033[36m当前没有班次!\033[0m\n");
			system("pause");
		return;
	}
	printf("\t\t\t\t  班次信息\n");
	    puts("        |--------------------------------------------------------------|");
	    puts(" \t 车次\t  出发站      终点站   出发时间  到站时间   票数   票价    "); 
	    puts("        |--------------------------------------------------------------|");
	while(op!=NULL){ 
		printf("\t \033[31m%s\033[0m   %s站    %s站   %s\t  %s  \033[32m   %d\033[0m  \033[33m %.1f\033[0m\n",op->Hname,op->dd,op->da,op->time1,op->time2,op->ps,op->pj);
		op=op->next;
	}
	    puts("        |--------------------------------------------------------------|");
}
void del(){//车次信息删除 
    int c=1;//传参用于车次保存 
	infor *op=head3;
	infor *prev=NULL;
	char Hname[10];
	int choise;
	if(!head3){
		printf("\033[31m当前没有车次!\033[0m\n");
		return;
	}
	printf("\033[36m请输入车次:\033[0m");
	scanf("%s",Hname);
	for(;op!=NULL;prev=op,op=op->next){
		if(strcmp(op->Hname,Hname)==0){
		printf("\033[36m你是否要删除?(1是,0否):\033[0m");
		scanf("%d",&choise);
		if(choise==0){
	   	printf("\033[31m已取消删除返回主菜单!!!\033[0m\n"); 
	   	system("pause");
	   	return;
	    }
		if(choise==1){
			if(op==head3){
			head3=op->next;
			free(op);
			printf("\033[31m删除成功!\033[0m\n");
			save(c);	
			return;
			}
		else{
			prev->next=op->next;
			free(op);
			printf("\033[36m取消删除!\033[0m\n");
			save(c);	
			return;
		       }
		   	}
		}
	}
	if(op==NULL){
		printf("\033[31m班次不存在\033[0m\n");
	}
	system("pause");
}

//订票操作模块

void add(){//订票
    int c=3; 
    int n;
	show1();
	puts("是否需要始末地点查询订票\033[36m(按1即可按0取消)\033[0m");
	scanf("%d",&n);
	 if(n==1){
	  cz();//地点查询订票 
	 } 
	infor*op=head3;
	int vc; 
	char m[20] = "N";
	char ml[20];
	puts("输入你要订票的车次\033[36m(输入N取消)\033[0m:");
	 ordr*x=NULL;
	 x=(ordr*)malloc(sizeof(ordr));
	 scanf("%s",ml);
	  if(strcmp(m,ml) == 0){//如果ml==N不执行订票 
	 	puts("\033[36m你将退出订票\033[0m");
		 sleep(1);
		 return;
	 }
	 if(strcmp(m,ml) != 0){
	     strcpy(nm,ml);//输入的是车次名暂存到nm全局变量 
	 puts("输入你的姓名:");
	 scanf("%s",x->name);
	 puts("输入购买票数:");
	 scanf("%d",&vc); 
	 zi=vc;//购买暂存到zi用于票数更新函数调用 
	 for(;op!=NULL;op=op->next){
	 	if(strcmp(op->Hname,ml) == 0){
	 			if(op->ps>0){
	 				 jian(vc,ml);//将票数和车次名传入票数更新函数 
	                  strcpy(x->Hname,ml);//自动将车次部分信息传输到订单 
	                  strcpy(x->time,op->time1);
	                  strcpy(x->dd,op->dd);
	                  strcpy(x->da,op->da);
	                  x->jg=(op->pj)*vc;//该车次票价和用户购买票数相乘算出订单总价格 
	                  x->ps=vc;
	                  x->xia=head2;
	                  head2=x;
	                  save(c);
				 }
				 if(op->ps==0){
				 printf("\033[36m无法购买!!!\033[0m"); 
				 sleep(1);
				 }
		 }
	 } 
	 }
}
void cz(){//购票行程查找
	infor*op=head3;
	char bv[20];//起始地 
	char zd[20];//目的地 
	printf("输入起始地:\n");
	scanf("%s",bv);
	printf("目的地:\n");
	scanf("%s",zd);
	     system("cls");
	    puts("\t\t\t\t查询结果");
		puts("        |----------------------------------------------------------|");
	     puts(" \t 车次\t  出发站    终点站   出发时间  到站时间  票数  票价      ");
	    puts("        |----------------------------------------------------------|");
	for(;op!=NULL;op=op->next){
		if(strcmp(op->dd,bv)==0&&strcmp(op->da,zd)==0){
		printf(" \t\033[31m %s\033[0m   %s站  %s站   %s      %s\033[33m   %d\033[0m  \033[32m %.1f\033[0m\n",op->Hname,op->dd,op->da,op->time1,op->time2,op->ps,op->pj);
		}
}
	 puts("        |----------------------------------------------------------|");
}
void dina(){//订单信息
	ordr*x=head2;
	if(!head2){
		printf("\033[36m当前没有车次!\033[0m\n");
			system("pause");
		return;
	}
	system("cls");//清屏 
	printf("\t\t\t\t\t        \033[36m订单信息\033[0m\n");
	          puts("\t\t\t|--------------------------------------------------------|");
	          puts("\t\t\t|   车次    票数   出发时间    始发地     目的地    价格 |"); 
	          puts("\t\t\t|--------------------------------------------------------|");
	for(;x!=NULL;x=x->xia){
		if(strcmp(x->name,qiao)==0)
	     	printf("\t\t\t    \033[34m%s\033[0m     \033[32m%d\033[0m     \033[36m%s\033[0m     %s站   %s站   \033[33m%2.f\033[0m\n",x->Hname,x->ps,x->time,x->dd,x->da,x->jg);
	}
	          puts("\t\t\t|--------------------------------------------------------|");
	system("pause");
}
void jian(int vc,char ml[20]){//票数更新
	int p1;
	char p2[20]; 
	infor*op=head3;
	if(!head3){
		return;
	}
	for(;op!=NULL;op=op->next){
		if(strcmp(op->Hname,nm)==0){//按车次名查找 
			if(op->ps>0){//如果当前车次票数大于零可购买 
				op->ps=op->ps-zi;
			}
		    if(op->ps==0){
		    	strcpy(p2,ml);
		    	p1=vc;
		    	puts("\033[36m票已卖完!!!\033[0m");
		    	return;
			} 
		}
	}
}
//退票模块
void dis(){
	int c=3;//调用save函数 
	infor*p=head3;//用于遍历车次信息 
	ordr*prev=NULL;
	ordr*x=head2;
	if(!head2){
		puts("\033[36m没有订单!!!\033[0m");
		 system("pause");
		 return;
	}
	char a[20];//退票班次名 
	int ps;//退票数量 
	puts("输入退票的班次\033[36m(输入0取消)\033[0m:\n");
	scanf("%s",a);
	for(;x!=NULL;prev=x,x=x->xia){//查找该车次订单 
		if(strcmp(x->Hname,a)==0){
			puts("输入你要退票的票数");
			scanf("%d",&ps);
			if(x->ps>=ps){//退票数小于车次票数 
			 x->ps=x->ps-ps;//更新票数信息
			 if(x->ps==0){//
			   if(x==head2){
			head2=x->xia;
			free(x);
			 save(c);
			return;
			}
		else{
			prev->xia=x->xia;
			free(x);
			 save(c);
			return;
		       }
			 }
			  for(;p!=NULL;p=p->next){
		    	if(strcmp(p->Hname,a)==0){
		    		x->jg=(p->pj)*ps;
		    		 save(c);
		    		 return; 
				}
			}
			}
			 if(x->ps<ps){
			 		puts("\033[36m退票数超过购买数\033[0m"); 
			 }
			}
		}
	}

void dina1(){//退票前展示订单 
	ordr*x=head2;
	if(!head2){
		return;
	}
	system("cls");//清屏 
	printf("\t\t\t\t\t    订单信息\n");
	          puts("\t\t\t|--------------------------------------------------------|");
	          puts("\t\t\t|  车次   票数   出发时间   始发地      目的地      价格 |"); 
	          puts("\t\t\t|--------------------------------------------------------|");
	for(;x!=NULL;x=x->xia){
		if(strcmp(x->name,qiao)==0)
	     	printf("\t\t\t   \033[34m%s\033[0m   \033[32m%d\033[0m     \033[36m%s\033[0m     %s站    %s站     \033[33m%2.f\033[0m\n",x->Hname,x->ps,x->time,x->dd,x->da,x->jg);
	}
	          puts("\t\t\t|--------------------------------------------------------|");
}

//数据读出模块
void read(){
	FILE *fp;//车次的读取 
	if((fp=fopen(A,"a+"))==NULL){
		perror("文件错误\n");
		return;
	}
	fseek(fp,0,SEEK_END); 
	int size=ftell(fp); 
	fseek(fp,0,SEEK_SET);
	while(ftell(fp)<size){
		infor *op=(infor *)malloc(sizeof(infor));
		fread(op,sizeof(infor),1,fp); 
		op->next=head3;
		head3=op;
	} 
}
void read2(){
	FILE *fp;//用户信息的读取 
	if((fp=fopen(B,"a+"))==NULL){
		perror("文件错误\n");
		return;
	}
	fseek(fp,0,SEEK_END); 
	int size=ftell(fp); 
	fseek(fp,0,SEEK_SET);
	while(ftell(fp)<size){
		erus*p=(erus*)malloc(sizeof(erus));
		fread(p,sizeof(erus),1,fp); 
		p->nvp=head1;
		head1=p;
	} 
}
void read3(){
	FILE *fp;//订单的读取 
	if((fp=fopen(C,"a+"))==NULL){
		perror("文件错误\n");
		return;
	}
	fseek(fp,0,SEEK_END); 
	int size=ftell(fp); 
	fseek(fp,0,SEEK_SET);
	while(ftell(fp)<size){
		ordr*x=(ordr *)malloc(sizeof(ordr));
		fread(x,sizeof(ordr),1,fp); 
		x->xia=head2;
		head2=x;
	} 
}

//数据写入模块
void save(int c){//三合一 
	FILE *fp;
	switch(c){
		case 1://车次信息写入 
		  if((fp=fopen(A,"wb+"))==NULL){
		printf("文件错误!\n");
		   return;
		   
		}
		  	infor *op=head3;
	      for(;op!=NULL;op=op->next){
		     if(fwrite(op,sizeof(infor),1,fp)!=1){
			   printf("文件保存失败!\n");
			   system("pause"); 
			    return;
		}
   	}
		case 2://用户信息写入 
		  if((fp=fopen(B,"wb+"))==NULL){
		printf("文件错误!\n");
		   return;
		}
		erus*p=head1;
	      for(;p!=NULL;p=p->nvp){
		     if(fwrite(p,sizeof(erus),1,fp)!=1){
			   printf("文件保存失败!\n");
			   system("pause"); 
			    return;
			}
			}
		case 3://订单信息写入 
		  if((fp=fopen(C,"wb+"))==NULL){
		printf("文件错误!\n");
			return;
		}
			ordr*x=head2;
	      for(;x!=NULL;x=x->xia){
		     if(fwrite(x,sizeof(ordr),1,fp)!=1){
			   printf("文件保存失败!\n");
			   system("pause"); 
			    return;
			}
			}
}
	fclose(fp); 
	printf("文件保存成功!\n");
	return;
}

//菜单操作模块 

void zsd(){//三级菜单操作函数 
	int cc=0;
	int n;
	 do{ 
	    menu2();
        printf("\t\t请输入菜单序号:");
	    scanf("%d",&n);
switch(n){
	case 1:
		add();//订票 
	break;
		case 2:
	    dina();//订单 
		break;
	case 3://退票 
		dina1();
		dis();
		break;
    case 0://返回 
        return;
    case 11://退出系统 
        main(cc);
        return;
		default:
	 printf("输入错误!\n");	
		break;						
	        }
    }while(n);
} 

void yh(){//二级菜单操作函数 
	int d;
do{ 
	menu1();
    printf("\t\t请输入菜单序号:");
	scanf("%d",&d);
	switch(d){
		case 1:
			read2();
			denglu();//登录 
			 break;
		case 2:
		    zhuce();//注册       
			 break;
        case 0:
            return;
        case 11:
			exit(0);//退出系统 
		default:
			printf("输入错误!\n");	
			break;						
      }
     }while(d);
}

int main(int cc){//主函数同时也是一级菜单操作函数 
	if(cc==0){
		exit(0); 
	}
	int c=1;
	welcome();
	 qqq();
      read();
      read2();
      read3();
	  int n; 
	do{
		n=menu();
		switch(n){
			case 1:
				yh(c);//用户 
				break;
			case 2:
				 gl(); //管理员 
				break;
            case 0:
            	break;
			default:
				printf("输入错误!\n");	
				break;						
		}
	}while(n);
	return 0;
}

小结

感谢大家的阅读,求点赞关注。大司马会为大家带来更好玩的代码。下一期《俄罗斯方块》

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值