C语言实现火车票管理系统

本文为大家分享了C语言实现火车票管理系统课程设计的具体代码,供大家参考,具体内容如下
1、前言 这是大一刚学C语言一个学期完成的课设项目,里面的功能还可以进一步的完善,仅供分享、参考、记录使用,加油!
2、设计目的 随着社会的发展,为了满足人们的订车票需求,所以设计了一个车票管理系统,让用户可以查询到车票的余数,乘车时间,以及为用户提供一个订票和退票的平台,同时管理员也可以借用此系统进行对车票进行操作。
3、设计内容 1.对车票的各类信息进行采集并录入;
2.从磁盘文件中读取车辆信息;
3.对所有车票信息的个数进行统计
4.对车票信息进行增加;
5.对特定的车票进行查询
6.对所有车辆的旅程总时长进行排序;
7.乘客输入自己的信息订票;
8.乘客输入自己的信息退票;
9.注册账号以及登录账号进入系统。
4、概要设计 采用链表实现系统,同时设置了密码,用户进入系统输入密码时,给密码进行了加密操作,而且该管理系统实现了查票、订票、退票、增加票、排序等功能。
5、各函数功能 登录功能: void enroll(),int land();
包括注册和登录,新用户需要先注册登录,并且登录的时候密码用*进行覆盖;
车票功能:①struct node *read_inf();
从文件中读取信息,在文件中书写好车票信息,然后调用函数,将文件中的信息读取并显示出来。
②void save_inf(struct node *pHead);
将从键盘输入的车票信息保存到文件中,最后可以在文件中查看所保存的信息。
③struct node *add(struct node *pHead);
增加车票信息,采用头插法或者尾插法增加车票信息并且显示出所有的车票信息。
④int listlength(struct node *pHead);
统计所以的车票信息数,通过链表的遍历的方法,用count计数,最后count的值即为车票信息数。
⑤int inquire(struct node *pHead);
查询所需的车票信息,通过链表遍历,查找起点站和终点站和所需相一致的进而实现此功能。
⑥void Sort(struct node *pHead);
对车票的时长进行排序,通过链表的遍历,采用冒泡排序,让时长从短到长的排序,也可以把时长变量换成余票数等等变量名进行排序,借用中间变量进行交换值。
⑦void output(struct node *pHead);
输出显示车票信息,采用链表的遍历方法,将所存储的链表信息打印显示出来。
⑧int buy(struct node *pHead);
订票,输入姓名,以及所需的订票数,查询起始站与终点站,最后票数会得到相应的减少。
⑨int back(struct node *pHead);
退票,输入姓名,以及所想的退票数,最后此票数会得到相应的增加。
6、源代码

#include#include#include#include#include#include#define n 5int len=0; //乘客信息struct passenge{char name[10]; //姓名intnum; //所需票量}lg[n]; //结构体变量名 //车票信息typedef struct train{char start_stat[20]; //起始站char end_stat[20]; //终点站char go_time[16]; //出发时间 char go_data[16]; //出发日期char train_num[15]; //车次信息char all_time[16]; //旅途时间intticket_lea; //余票数量}Train; //把结构体struct train 叫做 Train typedef Train Item; //又把Train 叫做 Item,目的让链表更通用链表里只有2 个东西 项目和指针struct node{//node是一个节点节点包括项目和指针 Item item; struct node *next; }; //注册信息void enroll(){char a[100]; //注册用户名char b[100]; //注册密码char s[100]; //再次确定密码intlen; printf("请输入您的用户名:"); scanf("%s",a); printf("请设置您的密码:"); reset: scanf("%s",b); //用到了if goto语句 len=strlen(b); //读取密码长度 if(len>9){printf("密码长度过长,请重新设置:"); goto reset; //if goto 语句}printf("请再次输入您设置的密码:"); scanf("%s",s); if(strcmp(b,s) == 0)//字符串比较函数 {FILE *fp; fp=fopen("register.txt","at"); //选用追加方式,可以存多个信息if(fp == NULL){printf("文件不存在!"); exit(1); }fprintf(fp,"%s %s\n",a,b); //字符串写入函数进行写入操作printf("\n\t------注册成功------\n"); fclose(fp); }else if(strcmp(b,s) != 0){printf("您两次输入的密码不一致,请重新设置密码!\n"); goto reset; //if goto 语句 }}//登陆页面int land(){inti=0; //i是为了判断密码长度 并加密 char a[10]; char b[10]; char user_name[10]; char user_passwords[10]; printf("请输入您的用户名:"); scanf("%s",user_name); printf("请输入您的密码:"); while(i<9 && (user_passwords[i] = getch()) && user_passwords[i] != '\r')//如果输入超限 或者 遇到换行符就跳出循环{printf("*"); //掩饰密码 i++; }user_passwords[i]=0; //字符串结束标志 '/0' FILE *fp; fp=fopen("register.txt","rt"); //又打开文件 if(fp==NULL){printf("文件不存在!"); exit(1); }while(fscanf(fp,"%s %s",a,b)!=EOF)//读文件判断账号密码是否正确 {if(strcmp(a,user_name)==0&&strcmp(b,user_passwords)==0)//字符串比较函数,看是否正确 {printf("\n\t--------登陆成功--------\n"); printf("\t------欢迎进入系统------\n"); return 0; } }if(1){printf("\n信息输入错误!\n"); land(); }fclose(fp); }//将信息保存到文件 void save_inf(struct node *pHead)//将链表中的信息保存到制定文件中{//头指针不能移动 struct node *pTemp; //因为要一个节点移动 所以定义为pTemp移动 FILE *fp; fp=fopen("information.txt","at"); //打开文件 if(fp==NULL){printf("打开文件失败,文件可能不存在!\n"); exit(1); }//遍历输入 for(pTemp=pHead ; pTemp != NULL; pTemp=pTemp->next)//节点先指向项目,项目里面再找成员 fprintf(fp,"%s %s %s %s %s %s %d\n",pTemp->item.start_stat,pTemp->item.end_stat,pTemp->item.go_time,pTemp->item.go_data,pTemp->item.train_num,pTemp->item.all_time,pTemp->item.ticket_lea); fclose(fp); } //增加 struct node *add(struct node *pHead){struct node *pNew; struct node *current; pNew=(struct node *)malloc(sizeof(struct node)); //再次分配结点的内存空间pNew->next=pHead; //新结点指向原来的首节点 pHead=pNew; //头指针指向新结点//尾插法; /*current=pHead; while(current->next!=NULL){current=current->next; } current->next=pNew; pNew->next=NULL; */printf("\n请输入起始站:"); scanf("%s",pNew->item.start_stat); printf("请输入终点站:"); scanf("%s",pNew->item.end_stat); printf("请输入出发时间:"); scanf("%s",pNew->item.go_time); printf("请输入出发日期:"); scanf("%s",pNew->item.go_data); printf("请输入车次信息:"); scanf("%s",pNew->item.train_num); printf("请输入旅途时间:"); scanf( "%s",pNew->item.all_time); printf("请输入余票数量:"); scanf("%d",&pNew->item.ticket_lea); current=pHead; while(current!=NULL){printf("%-10s",current->item.start_stat); printf("%-10s",current->item.end_stat); printf("%-12s",current->item.go_time); printf("%-14s",current->item.go_data); printf("%-12s",current->item.train_num); printf("%-13s",current->item.all_time); printf("%-d",current->item.ticket_lea); printf("\n"); current=current->next; }return pHead; //返回头指针 } //输出显示模块void output(struct node *pHead){struct node *pTemp; //循环所用的临时指针pTemp=pHead; //指针的到首结点的指针printf("\t******车票信息如下******\n"); printf("起始站终点站出发时间出发日期车次信息旅途时间余票量\n"); while((pTemp!=NULL)){printf("%-10s",pTemp->item.start_stat); printf("%-10s",pTemp->item.end_stat); printf("%-12s",pTemp->item.go_time); printf("%-14s",pTemp->item.go_data); printf("%-12s",pTemp->item.train_num); printf("%-13s",pTemp->item.all_time); printf("%-d",pTemp->item.ticket_lea); printf("\n"); pTemp=pTemp->next; //移动临时指针到下一个结点}}//查询车票信息int inquire(struct node *pHead){int flag = 0; struct node *pTemp; char inquire_start[20],inquire_end[20]; //查询选择的起始站和终点站printf("请输入要查询车票的起始站和终点站:"); scanf("%s %s",inquire_start,inquire_end); pTemp=pHead; while(pTemp!=NULL){if((strcmp(pTemp->item.start_stat,inquire_start)==0) && (strcmp(pTemp->item.end_stat,inquire_end)==0)){flag = 1; printf("\n车票信息结果如下:\n"); printf("起始站终点站出发时间出发日期车次旅途时间余票量\n"); printf("%-10s",pTemp->item.start_stat); printf("%-10s",pTemp->item.end_stat); printf("%-12s",pTemp->item.go_time); printf("%-14s",pTemp->item.go_data); printf("%-12s",pTemp->item.train_num); printf("%-13s",pTemp->item.all_time); printf("%-d",pTemp->item.ticket_lea); }pTemp=pTemp->next; continue; }if(flag == 0){printf("输入错误!\n"); inquire(pHead); }return 0; } //订票int buy(struct node *pHead){struct node *pTemp; charchoice_start[20],choice_end[20]; /*购票选择的起始和终点站*/intnumbers; /*购买数量*/charbuy_name[10]; /*购买人姓名*/charwy; pTemp=pHead; printf("请输入所购买车票的起始站、终点站和票数:"); scanf("%s %s %d",choice_start,choice_end,&numbers); while(pTemp!=NULL){if((strcmp(pTemp->item.start_stat,choice_start)==0)&&(strcmp(pTemp->item.end_stat,choice_end)==0))/*找到起始终点均相同的站*/{if(numbers<=pTemp->item.ticket_lea)/*若小于余票量进行办理*/{printf("找到符合信息的车次:\n"); printf("起始站终点站出发时间出发日期车次旅途时间余票量\n"); printf("%-10s",pTemp->item.start_stat); printf("%-10s",pTemp->item.end_stat); printf("%-11s",pTemp->item.go_time); printf("%-12s",pTemp->item.go_data); printf("%-10s",pTemp->item.train_num); printf("%-13s",pTemp->item.all_time); printf("%-d",pTemp->item.ticket_lea); printf("\n"); printf("请您输入姓名:"); scanf("%s",buy_name); printf("正在办理订票......\n"); printf("恭喜您办理成功!\n"); pTemp->item.ticket_lea=pTemp->item.ticket_lea - numbers; /*办理成功,该车次票量减少*/strcpy(lg[len].name,buy_name); lg[len].num=numbers; len++; return 0; /*订票成功返回主菜单*/}else {printf("您所需要的票数超过余票数,请问是否继续办理(Y/y || N/n)?\n"); getchar(); scanf("%c",&wy); if(wy == 'Y' || wy == 'y')buy(pHead); else if(wy == 'N' || wy=='n' ){printf("谢谢使用,按任意键返回!\n"); getch(); return 0; }}}elsepTemp=pTemp->next; }printf("\n很遗憾,未找到您需要的车次,请重新订票!\n"); buy(pHead); return 0; }//退票int back(struct node *pHead){struct node *pTemp; int i; char wy; //判断yes or no char back_name[10]; //退票人姓名int back_num; //退票数char back_start[20]; //退票起始站char back_end[20]; //退票终点站printf("请输入要退票人姓名和退票数:"); scanf("%s%d",back_name,&back_num); printf("请输入退票的起始站和终点站:"); scanf("%s%s",back_start,back_end); pTemp=pHead; while(pTemp!=NULL){if((strcmp(pTemp->item.start_stat,back_start)==0)&&(strcmp(pTemp->item.end_stat,back_end)==0))/*找到起始终点均相同的站*/{for(i=0; iitem.ticket_lea=pTemp->item.ticket_lea + back_num; //办理成功,该车次票数增加return 0; }else{printf("未找到您定的票,请问您是否重输信息继续进行退票(Y/y || N/n):"); getchar(); scanf("%c",&wy); if(wy=='Y' || wy =='y')back(pHead); else if(wy=='N' || wy == 'n'){printf("谢谢使用,按任意键返回!\n"); getch(); return 0; }}}}elsepTemp=pTemp->next; }printf("\n很遗憾,未找到您要退票的车次,请重新退票!\n"); back(pHead); return 0; }//从文件中读取信息struct node *read_inf() //从磁盘文件中读取信息并存入单链表 {struct node *head, *r, *train; //定义结构体指针变量struct node是类型 //head为头结点(头结点中有信息),r为尾节点, train为当前节点 FILE *fp; if((fp=fopen("information.txt","rt"))==NULL){printf("读文件出错,按任意键退出"); getch(); exit(1); }head=(struct node *)malloc(sizeof(struct node)); //初始化 head->next=NULL; fscanf(fp,"%s %s %s %s %s %s %d",head->item.start_stat,head->item.end_stat,head->item.go_time,head->item.go_data,head->item.train_num,head->item.all_time,&head->item.ticket_lea); r=head; //r是尾节点 while(!feof(fp))//文件末结束 {train=(struct node *)malloc(sizeof(struct node)); //建立链表 fscanf(fp,"%s %s %s %s %s %s %d",train->item.start_stat,train->item.end_stat,train->item.go_time,train->item.go_data,train->item.train_num,train->item.all_time,&train->item.ticket_lea); r->next=train; //链表节点 r=train; }r->next=NULL; fclose(fp); printf("\n文件中信息以正确读出,按任意键返回!"); getch(); //清除缓冲区 system("cls"); return head; }//主界面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☆~~~~~~~~~~~~~~~8.切换账号登录~~~~~~~~~~~~~~~~~~~☆\n"); printf("\t☆~~~~~~~~~~~~~~~9.退出管理系统~~~~~~~~~~~~~~~~~~~☆\n"); printf("\t☆================================================☆\n"); printf("\t☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n"); printf("请选择编号(1-9)选择功能进行相应的操作:"); }//链表长度,为了更好的排序 int listlength(struct node *pHead)//判断链表的长度 进而知道循环次数 {struct node *current; int len=0; current=pHead; while(current!=NULL){len++; //遍历一篇 len自增 表示最后链表的长度 current=current->next; } return len; }//排统计序 void Sort(struct node *pHead){int len; struct node *current; current=pHead; len=listlength(pHead); //上面一个函数的功能判断链表的长度 printf("共有%d个信息\n", len); while(len>1){//冒泡排序 while(current->next != NULL){if(strcmp(current->item.all_time, current->next->item.all_time)>0)//比较时间 {Item temp; //定义一个交换变量 temp=current->item; current->item=current->next->item; current->next->item=temp; }current=current->next; }len--; current=pHead; //每次从头开始遍历 }output(pHead); //进去输出函数 return; } //主函数int main(){system("color 4"); printf("欢"); sleep(0); printf("迎"); sleep(1); system("color 3"); printf("使"); sleep(0); printf("用"); sleep(1); system("color 2"); printf("车"); sleep(0); printf("票"); sleep(1); system("color 1"); printf("管"); sleep(0); printf("理"); sleep(1); system("color 6"); printf("系"); sleep(0); printf("统\n"); sleep(2); printf("\t\t"); printf("\n"); system("color 8"); printf("\t\t\t即将进入登陆注册页面请稍候....."); sleep(3); system("cls"); system("color 3"); int x; printf("\t\t1.登陆\t\t\t2.注册并登录\n"); printf("请选择序号:"); scanf("%d",&x); if(x==1)land(); else if(x==2){enroll(); land(); }else{printf("输入无效,即将退出系统!\n"); exit(1); }int choice=8; struct node *pHead; //定义头结点//选择编号while(choice != 10){meau(); scanf("%d",&choice); switch(choice){case 1:system("cls"); pHead=read_inf(); break; case 2:system("cls"); output(pHead); break; case 3:system("cls"); inquire(pHead); break; case 4:system("cls"); add(pHead); save_inf(pHead); break; case 5:system("cls"); Sort(pHead); break; case 6:system("cls"); buy(pHead); break; case 7:system("cls"); back(pHead); break; case 8:land(); break; case 9:exit(1); default:printf("请输入正确的编号!\n"); break; }}}

【C语言实现火车票管理系统】以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读