前言
课程设计终于验收完毕喽!可喜可贺,可喜可贺!
第一次做这样的东西所以不是很熟练,也参考了许多代码,尽管如此代码依然有些粗糙,功能也不全面,甚至还和实际不太相符。请大家多多包涵!
基本功能
- 用户注册
- 用户登录
- 显示全部车票信息
- 查询车票信息
- 订票
- 退票
- 切换账号
- 退出登录
其实还想做一个改签的功能,但是一想到这样的话明天就多了一节早八(那种事情不要啊! ),便放弃了。
源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h> //遮掩密码时使用
#include <windows.h>
int ans;
struct passenger
{
char name[20]; //姓名
char ID[20]; //身份证号
char user_start[50]; //起始站
char user_end[50]; //终点站
char user_begin_time[50]; //出发时间
char user_end_time[50]; //到达时间
char user_data[50]; //出发日期
char user_train_id[50]; //车次信息
char user_time[50]; //运行时间
int ticket_num; //所需票数
}use[10];
typedef struct train
{
char start[20]; //起始站
char end[20]; //终点站
char begin_time[20];//出发时间
char end_time[20]; //到达时间
char data[20]; //出发日期
char train_id[20]; //车次信息
char time[20]; //运行时间
int ticket_lea; //余票数量
int ticket_price; //票价
}TRAIN;
struct node
{
TRAIN item;
struct node *next;
};
#define NODE struct node
void meau(); //菜单页面
void registered(); //注册账号
void login(); // 登录
NODE *read_inf(); //读取车票文件信息
void output(NODE *head); //显示信息
int Listlength(NODE *head); //记录链表长度
void query(NODE *head); //查询车票
int book(NODE *head); //购票
int back(NODE *head); //退票
int Display(); //显示订票信息
void traverse(NODE *head); //遍历链表数据,覆盖文件
int main() //主函数
{
printf("\t\t\t");
system("color 6"); //橙色
printf("欢迎使用车票管理系统!\n\n");
Sleep(1000);
printf("\t\t\t即将进入登陆注册页面请稍候.....");
Sleep(2000);
system("cls"); //清屏
system("color 3"); //浅蓝色
int x;
printf("\t\t1.登录\t\t2.注册并登录\n");
printf("请选择序号:");
reset1:scanf("%d",&x);
if(x==1)
login();
else if(x==2)
{
registered();
login();
}
else
{
printf("请输入正确的命令!\n");
goto reset1;
}
NODE *head;
head=(NODE *)malloc(sizeof(NODE));
head->next=NULL;
int choice;
while(1)
{
meau();
scanf("%d",&choice);
head=read_inf();
switch(choice)
{
case 1:system("cls");output(head);break;
case 2:system("cls");query(head);break;
case 3:system("cls");book(head);break;
case 4:system("cls");back(head);break;
case 5:system("cls");Display(head);break;
case 6:system("cls");login();break;
case 7:system("cls");exit(1);
default:printf("请输入正确的编号!\n");
break;
}
}
return 0;
}
void registered()
{
char user_id[50]; //注册用户名
char user_password[50]; //注册密码
char user_again[50]; //确认密码
printf("请输入您的用户名:");
scanf("%s",user_id);
reset:printf("请设置您的密码:");
scanf("%s",user_password);
printf("请再次输入您的密码:");
scanf("%s",user_again);
if(strcmp(user_password,user_again)==0)
{
FILE *fp;
fp=fopen("register.txt","at"); //追加方式储存多个信息,t表示打开txt
if(fp==NULL)
{
printf("文件不存在!");
exit(1);
}
fprintf(fp,"%s %s\n",user_id,user_password);
printf("\n\t------注册成功------\n");
Sleep(1500);
system("cls");
fclose(fp);
}
else if(strcmp(user_password,user_again)!=0)
{
printf("您两次输入的密码不一致,请重新设置密码!\n");
goto reset;
}
}
void login()
{
int i=0;
char user_id[50]; //注册用户名
char user_password[50]; //注册密码
char user_name[50]; //登陆用户名
char user_passwords[50]; //登陆密码
char ch;
printf("请输入您的用户名:");
scanf("%s",user_name);
printf("请输入您的密码:");
while((ch=getch())!='\r')
{
if(ch=='\b') //backspace的ASCII码为8
{
if(i>0)
{
i--;
printf("\b \b");
}
else
putchar(7); //ASCII码7表示响铃
}
else
{
user_passwords[i++]=ch;
printf("*");
}
}
user_passwords[i]='\0';
FILE *fp;
fp=fopen("register.txt","rt");
if(fp==NULL)
{
printf("文件不存在!");
exit(1);
}
int f=0;
while(fscanf(fp,"%s %s",user_id,user_password)!=EOF)
{
if(strcmp(user_id,user_name)==0&&strcmp(user_password,user_passwords)==0)
{
system("cls");
f=1;
printf("\n\t\t --------登陆成功--------\n");
printf("\t\t ------欢迎进入系统------\n");
return ;
}
}
if(f==0)
{
printf("\n信息输入错误!\n");
login();
}
fclose(fp);
}
void meau()
{
printf("\n");
printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("\t☆==============欢迎使用车票管理系统==============☆\n");
printf("\t☆~~~~~~~~~~~~~~~1.显示车票信息~~~~~~~~~~~~~~~~~~~☆\n");
printf("\t☆~~~~~~~~~~~~~~~2.查询车票信息~~~~~~~~~~~~~~~~~~~☆\n");
printf("\t☆~~~~~~~~~~~~~~~3. 订 票~~~~~~~~~~~~~~~~~~~~~☆\n");
printf("\t☆~~~~~~~~~~~~~~~4. 退 票~~~~~~~~~~~~~~~~~~~~~☆\n");
printf("\t☆~~~~~~~~~~~~~~~5.显示已预定车票~~~~~~~~~~~~~~~~~☆\n");
printf("\t☆~~~~~~~~~~~~~~~6.切换账号登录~~~~~~~~~~~~~~~~~~~☆\n");
printf("\t☆~~~~~~~~~~~~~~~7.退出管理系统~~~~~~~~~~~~~~~~~~~☆\n");
printf("\t☆================================================☆\n");
printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("请选择编号(1-8)选择功能进行相应的操作:");
}
NODE *read_inf()
{
NODE *head,*p,*r;
FILE *fp;
if((fp=fopen("information.txt","rt"))==NULL)
{
printf("读取文件出错,按任意键退出!");
getch();
exit(1);
}
head=(NODE*)malloc(sizeof(NODE));
head->next=NULL;
fscanf(fp,"%s %s %s %s %s %s %s %d %d",head->item.start,head->item.end,head->item.begin_time,head->item.end_time,head->item.data,head->item.train_id,head->item.time,&head->item.ticket_lea,&head->item.ticket_price);
r=head;
while(!feof(fp)) //使用feof之前先读一次文件
{
p=(NODE*)malloc(sizeof(NODE));
fscanf(fp,"%s %s %s %s %s %s %s %d %d",p->item.start,p->item.end,p->item.begin_time,p->item.end_time,p->item.data,p->item.train_id,p->item.time,&p->item.ticket_lea,&p->item.ticket_price);
r->next=p;
r=p;
}
r->next=NULL;
fclose(fp);
//printf("\n\t刷新成功,按任意键退出!\n");
//getch();
system("cls");
return head;
}
void output(NODE *head)
{
int len1,len2=0;
len1=Listlength(head);
NODE *p;
p=head;
printf("\t\t\t******车票信息如下******\n");
printf("起始站 终点站 出发时间 到达时间 出发日期 车次信息 运行时间 余票量 票价\n");
while(p!=NULL)
{
if(len1==len2)
break;
printf("%-10s",p->item.start);
printf("%-10s",p->item.end);
printf("%-10s",p->item.begin_time);
printf(" %-10s",p->item.end_time);
printf(" %-10s",p->item.data);
printf(" %-10s",p->item.train_id);
printf(" %-10s",p->item.time);
printf(" %-d",p->item.ticket_lea);
printf("\t\t%-d",p->item.ticket_price);
printf("\n");
p=p->next;
len2++;
}
printf("\n\t\t\t按任意键返回主菜单!\n");
char ch;
getch();
system("cls");
return 0;
}
int Listlength(NODE *head)
{
NODE *p;
int len=0;
p=head;
while(p!=NULL)
{
len++;
p=p->next;
}
return len-1;
}
void query(NODE *head)
{
char train_go[50];
char train_end[50];
reset8:printf("请输入您查询车票的起始站:");
scanf("%s",train_go);
printf("请输入您查询车票的终点站:");
scanf("%s",train_end);
NODE *p;
p=head;
int f=0,cnt=0;
while(p!=NULL)
{
if(strcmp(p->item.start,train_go)==0&&strcmp(p->item.end,train_end)==0)
{
cnt++;
if(cnt==1)
{
printf("\n\t\t\t******车票信息如下******\n");
printf("起始站 终点站 出发时间 到达时间 出发日期 车次信息 运行时间 余票量 票价\n");
}
f=1;
printf("%-10s",p->item.start);
printf("%-10s",p->item.end);
printf("%-10s",p->item.begin_time);
printf(" %-10s",p->item.end_time);
printf(" %-10s",p->item.data);
printf(" %-10s",p->item.train_id);
printf(" %-10s",p->item.time);
printf(" %-d",p->item.ticket_lea);
printf("\t\t%-d",p->item.ticket_price);
printf("\n");
}
p=p->next;
}
if(f==0)
{
printf("\n\t\t请输入正确的车次信息!\n\n");
Sleep(1000);
system("cls");
goto reset8;
}
printf("\n\t\t\t按任意键返回主菜单!\n");
char ch;
getch();
system("cls");
return 0;
}
int book(NODE *head)
{
char yh_name[50];
char yh_id[50];
char yh_start[50];
char yh_end[50];
char yh_train_id[50];
int number=0;
int sum_cost=0;
NODE *p;
p=head;
printf("请输入您的姓名:");
scanf("%s",yh_name);
reset2:printf("请输入您的身份证号:");
scanf("%s",yh_id);
int f=0;
if(strlen(yh_id)!=18)
f=1;
if(f)
{
printf("请输入正确的身份证号码!\n");
Sleep(500);
goto reset2;
}
else
{
int m=0;
char sex=yh_id[16];
sex=sex-'0';
int sex1=sex;
if(sex1%2==0)
m=1;
reset3:printf("请输入您所购车票的起始站:");
scanf("%s",yh_start);
printf("请输入您所购车票的终点站:");
scanf("%s",yh_end);
printf("请输入您所购车票的车次:");
scanf("%s",yh_train_id);
printf("请输入您所需要的车票数量:");
scanf("%d",&number);
int i;
for(i=0;i<ans;i++)
{
if(strcmp(yh_name,use[i].name)==0&&strcmp(yh_id,use[i].ID)==0)
{
use[i].ticket_num+=number;
}
}
while(p!=NULL)
{
if(strcmp(yh_start,p->item.start)==0&&strcmp(yh_end,p->item.end)==0&&strcmp(yh_train_id,p->item.train_id)==0)
{
if(number < p->item.ticket_lea)
{
printf("找到符合信息的车次:\n");
printf("\t\t\t\t\t******车票信息如下******\n");
printf("起始站 终点站 出发时间 到达时间 出发日期 车次信息 运行时间 余票量 票价\n");
printf("%-10s",p->item.start);
printf("%-10s",p->item.end);
printf("%-10s",p->item.begin_time);
printf(" %-10s",p->item.end_time);
printf(" %-10s",p->item.data);
printf(" %-10s",p->item.train_id);
printf(" %-10s",p->item.time);
printf(" %-d",p->item.ticket_lea);
printf("\t\t%-d",p->item.ticket_price);
printf("\n\n");
strcpy(use[ans].user_start,p->item.start);
strcpy(use[ans].user_end,p->item.end);
strcpy(use[ans].user_begin_time,p->item.begin_time);
strcpy(use[ans].user_end_time,p->item.end_time);
strcpy(use[ans].user_data,p->item.data);
strcpy(use[ans].user_train_id,p->item.train_id);
strcpy(use[ans].user_time,p->item.time);
p->item.ticket_lea-=number;
sum_cost=number*p->item.ticket_price;
use[ans].ticket_num=number;
if(m==1)
{
printf("\t\t尊敬的%s女士,请确认您的订单\n",yh_name);
}
else
{
printf("\t\t尊敬的%s先生,请确认您的订单\n",yh_name);
}
printf("\t\t起始站:%s 终点站:%s 车次:%s 金额:%d元\n",yh_start,yh_end,yh_train_id,sum_cost);
reset4:printf("\t\t1.确认\t\t2.取消\n");
int x;
scanf("%d",&x);
if(x==1)
{
Sleep(1000);
traverse(head);
}
if(x==2)
{
system("cls");
goto reset3;
}
else if(x!=1&&x!=2)
{
printf("\t\t请输入正确命令!\n");
goto reset4;
}
printf("正在办理订票......\n");
Sleep(1000);
printf("恭喜您办理成功!\n");
Sleep(1000);
system("cls");
strcpy(use[ans].ID,yh_id);
strcpy(use[ans].name,yh_name);
ans++;
return 0;
}
else
{
char ch;
printf("您所需要的票数超过余票数,请问是否要继续办理(Y/y || N/n)?\n");
getchar();
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
goto reset3;
else if(ch=='n'||ch=='N')
{
printf("感谢您的使用,按任意键退出!\n");
getch();
return 0;
}
}
}
else
p=p->next;
}
}
printf("\n很遗憾,未找到您需要的车次,请重新订票!\n");
Sleep(1500);
system("cls");
book(head);
return 0;
}
int back(NODE *head)
{
NODE *p;
char ch;
char back_name[50]; //退票人姓名
char back_start[50]; //起始站
char back_end[50]; //终点站
char back_trian_id[50]; //退票车次
int back_num; //退票数
p=head;
reset5:printf("请输入您的姓名:");
scanf("%s",back_name);
printf("请输入您所购买车票的起始站:");
scanf("%s",back_start);
printf("请输入您所购买车票的终点站:");
scanf("%s",back_end);
printf("请输入您所购买车票的车次:");
scanf("%s",back_trian_id);
printf("请输入退票数:");
scanf("%d",&back_num);
while(p!=NULL)
{
if(strcmp(p->item.start,back_start)==0&&strcmp(p->item.end,back_end)==0&&strcmp(p->item.train_id,back_trian_id)==0)
{
int i;
for(i=0;i<ans;i++)
{
if(strcmp(back_name,use[i].name)==0)
{
if(back_num<=use[i].ticket_num)
{
printf("\n\t\t\t退票成功!\n");
p->item.ticket_lea+=back_num;
use[i].ticket_num-=back_num;
traverse(head);
printf("\n\t\t\t按任意键返回主菜单!\n");
char ch;
getch();
system("cls");
return 0;
}
else
{
printf("\n\t\t您输入的退票数有误,是否重新退票(Y/y || N/n):");
getchar();
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
system("cls");
goto reset5;
}
else if(ch=='N'||ch=='n')
{
printf("\n\t\t感谢您的使用!按任意键退出!\n");
getch();
return 0;
}
}
}
else
{
printf("\n\t\t未找到您定的票,请问您是否重输信息继续进行退票(Y/y || N/n):");
getchar();
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
system("cls");
goto reset5;
}
else if(ch=='N'||ch=='n')
{
printf("\n\t\t感谢您的使用!按任意键退出!\n");
getch();
system("cls");
return 0;
}
}
}
}
else
p=p->next;
}
printf("\n\t\t很遗憾,未找到您要退票的车票信息,请重新退票!\n");
system("cls");
back(head);
return 0;
}
int Display()
{
char name[50];
char id[50];
reset7:printf("请输入您的姓名:");
scanf("%s",name);
printf("请输入您的身份证号:");
reset6:scanf("%s",id);
int f=0;
if(strlen(id)!=18)
f=1;
if(f)
{
printf("请输入正确的身份证号码!\n");
goto reset6;
}
int m=0;
int i;
for(i=0;i<ans;i++)
{
if(strcmp(name,use[i].name)==0&&strcmp(id,use[i].ID)==0)
{
if(use[i].ticket_num!=0)
{
m=1;
printf("\n\t\t\t您预定的车票信息如下\n");
printf("\t起始站 终点站 出发时间 到达时间 出发日期 车次信息 运行时间 预定票数\n");
printf("\t%-10s",use[i].user_start);
printf(" %-10s",use[i].user_end);
printf(" %-10s",use[i].user_begin_time);
printf(" %-10s",use[i].user_end_time);
printf(" %-10s",use[i].user_data);
printf(" %-10s",use[i].user_train_id);
printf(" %-10s",use[i].user_time);
printf(" %-10d",use[i].ticket_num);
printf("\n");
char ch;
printf("\n\n\t\t\t按任意键返回主菜单!\n");
getch();
system("cls");
return 0;
}
else
{
printf("\n\t\t\t\您已经没有已预定的车票\n\n");
printf("\t\t\t按任意键返回主菜单!\n");
char ch;
getch();
system("cls");
return 0;
}
}
}
if(!m)
{
char ch;
printf("未找到您的车票信息,是否重新查询(Y/y || N/n):");
getchar();
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
{
system("cls");
goto reset7;
}
else if(ch=='N'||ch=='n')
{
printf("感谢您的使用!按任意键退出!\n");
getch();
system("cls");
return 0;
}
}
}
void traverse(NODE *head)
{
int len1,len2=0;
len1=Listlength(head);
NODE *p;
p=head;
FILE *fp;
fp=fopen("information.txt","wt");
if(fp==NULL)
{
printf("文件不存在!\n");
exit(1);
}
while(p!=NULL)
{ if(len1==len2)
break;
fprintf(fp,"%s %s %s %s %s %s %s %d %d\n",p->item.start,p->item.end,p->item.begin_time,p->item.end_time,p->item.data,p->item.train_id,p->item.time,p->item.ticket_lea,p->item.ticket_price);
p=p->next;
len2++;
}
fclose(fp);
}
实现过程中遇到的问题
读取txt文件汉字乱码
这个问题其实是汉字编码方式的问题,我的电脑txt默认时UTF-8编码,但是使用这个编码方式的话就会出现乱码,我们只需要将UTF-8改为ANSI编码方式即可。
放个链接供大家参考一下:txt文件乱码
虽然这个方法解决了乱码的问题,但是又有了新的问题出现,就是当我显示全部的车票信息的时候在最后一行总会显示出我txt文件的地址,输出链表长度发现也正好多出1,我找了好久没有发现解决办法,只好写了一个记录链表长度的函数,它的返回值时长度减去1,这样的话就能不显示地址了。
如果有大佬知道是怎么回事请务必联系我。
用*号掩盖密码无法退格
这个很容易就找到了解决方案
放几个我参考的博客的链接
退格解决代码
feof的使用
这都要怪我上课没有听课
在使用feof之前一定要先读一次文件!!!
参考链接
feof()原理和使用方法
车票信息文件
给大家留一个我测试时使用的车票信息吧,数据很少,有兴趣的话可以自己去多找一些。提取码:7yzp