概要
可以简单注册用户和登录的订票系统,这是我大一期末的作业供大家参考
整体架构流程
源代码
#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;
}
小结
感谢大家的阅读,求点赞关注。大司马会为大家带来更好玩的代码。下一期《俄罗斯方块》