?鐵路售票管理系統(tǒng)?? ?
程序中傳遞的有信息有:票務(wù)信息(包括車次,出發(fā)站、到達(dá)站、出發(fā)時間日期,歷時、票數(shù),票價)個人購票信息(姓名,身份信息,車次,出發(fā)時間日期,座位號,票價)
?票務(wù)瀏覽 ? ? ? ?(對票務(wù)系統(tǒng)中的所有票務(wù)信息進(jìn)行瀏覽,獲取不同時間日期的票務(wù)信息。)
購票 ? ? ? ? ? ? 當(dāng)乘客購票成功后,為乘客構(gòu)建購票信息,用于存儲該乘客所有的購票信息,
?? ? ? ? ? ? ? ? ? ? 以便乘客查詢,同時減少票務(wù)系統(tǒng)中的相關(guān)票數(shù)。
退票 ? ? ? ? ? ? 當(dāng)乘客退票成功后,將相關(guān)的購票信息從為乘客構(gòu)建的購票信息系統(tǒng)中刪除,
?? ? ? ? ? ? ? ? ? ? 同時增加票務(wù)系統(tǒng)中的相關(guān)票數(shù)。
信息查看 ? ? ? ? 乘客可隨時查看票務(wù)系統(tǒng)中所有的票務(wù)信息,同時也可提供UI,用于查看個人的所有購票信息。?
?
?
?
用戶界面
?
管理員界面
?
?1.查看票務(wù)
?2.管理票務(wù)
?
?
(詳細(xì)操作暫不展示)
...
main.c文件
#include "slist.h"
#include "menu.h"
#include "file.h"
#include <stdio.h>
int main(void)
{
tNODE* head = NULL; //存放火車信息的鏈表
uNODE* head1 = NULL; //存放乘客信息的鏈表
NODE* head2 = NULL; //存放用戶賬號密碼的鏈表
Welcome(); //歡迎界面
load(&head, &head1); //文件操作
load1(&head2);
while(MainMenu(&head, &head1,&head2)); //主菜單
slist_freeT(&head); //釋放鏈表
slist_freeU(&head1);
slist_free(&head2);
return 0;
}
文件操作
file.h
//file.c文件的頭文件
#ifndef __FILE_H
#define __FILE_H
#include"slist.h"
int load(tNODE** , uNODE**);
int load1(NODE**);
int saveT(tNODE*);
int saveU(uNODE*);
int save(NODE*);
#endif
file.c
#include"file.h"
#include"slist.h"
#include<stdio.h>
int load(tNODE** head, uNODE** head1) //打開車票,與乘客的文件
{
FILE* fp = fopen("ticket.dat", "r");//以只讀方式打開
FILE* fp1 = fopen("user.dat", "r");
if (!fp)
{
puts("ticket.dat打開失敗");
return -1;
}
if (!fp1)
{
puts("user.dat打開失敗");
return -1;
}
Ticket data = { 0 };
User data1 = { 0 };
while (fread((&data), sizeof(Ticket), 1, fp))//將文件中的信息讀取到鏈表中
{
slist_addTicket(head, data);//頭插法,將每次讀取到的信息插入
}
while (fread((&data1), sizeof(User), 1, fp1))
{
slist_addUser(head1, data1);
}
fclose(fp);
fclose(fp1);
return 0;
}
int load1(NODE** head2)
{
FILE *fp = fopen("account.dat","r");//賬號密碼文件
if(!fp )
{
puts("account.dat加載失敗");
return -1;
}
Useract data2 = {0};
while(fread((&data2),sizeof(Useract),1,fp))
{
slist_user(head2,data2);
}
fclose(fp);
return 0;
}
/*將鏈表中的信息保存到對應(yīng)的鏈表中*/
int saveT(tNODE* head)
{
FILE* fp = fopen("ticket.dat", "w");
if (!fp)
{
puts("ticket.dat打開失敗");
return -1;
}
tNODE* p = head;
while (p)
{
fwrite(&(p->data), sizeof(Ticket), 1, fp);
p = p->next;
}
fclose(fp);
return 0;
}
int saveU(uNODE* head1)
{
FILE* fp = fopen("user.dat", "w");
if (!fp)
{
puts("user.dat打開失敗");
return -1;
}
uNODE* p = head1;
while (p)
{
fwrite(&(p->data), sizeof(User), 1, fp);
p = p->next;
}
fclose(fp);
return 0;
}
int save(NODE* head2)
{
FILE* fp = fopen("account.dat", "w");
if (!fp)
{
puts("account.dat打開失敗");
return -1;
}
NODE* p = head2;
while (p)
{
fwrite(&(p->data), sizeof(Useract), 1, fp);
p = p->next;
}
fclose(fp);
return 0;
}
鏈表操作
slist.h
#ifndef __SLIST_H
#define __SLIST_H
typedef struct
{
char num[10]; // 車次
char start[30];//出發(fā)站
char end[30];//到達(dá)站
char date[20];//出發(fā)日期
char time[10];//出發(fā)時間
float take;//歷時
int count;//票數(shù)
float price;//票價
}Ticket;
typedef struct node
{
Ticket data;
struct node *next;
}tNODE;
typedef struct
{
char name[30];// 姓名
char id[20];//身份
char num[10];//車次
char date[20];//出發(fā)日期
char time[10];//出發(fā)時間
char seat[20];//座位號
float price;//票價
}User;
typedef struct
{
char name[20];//用戶名
char password[20];//密碼
char issue[20];//密保問題
char answer[20];//密保答案
int num;//0為用戶,1為管理員
}Useract;
typedef struct node_u
{
Useract data;
struct node_u* next;
}NODE;
typedef struct unode
{
User data;
struct unode *next;
}uNODE;
int slist_addTicket(tNODE**, Ticket);//插入函數(shù)
int slist_addUser(uNODE**,User);
int slist_deleteTicket(tNODE**,User);//刪除函數(shù)
int slist_deleteUser(uNODE**,User);
int slist_user(NODE**, Useract); //添加
void slist_printT(const tNODE*); //遍歷
void slist_printU(const uNODE*);
void slist_freeT(tNODE**); //釋放鏈表
void slist_freeU(uNODE**);
void slist_free(NODE**);
#endif
slist.c
#include"slist.h"
#include<stdio.h>
#include<stdlib.h>
int slist_addTicket(tNODE** head, Ticket data)
{
tNODE* pNew = (tNODE*)malloc(sizeof(tNODE));
if(!pNew)
{
puts("數(shù)據(jù)插入失敗!");
return -1;
}
pNew -> data = data;
pNew -> next = *head;
*head = pNew;
return 0;
}
int slist_addUser(uNODE** head1, User data1)
{
uNODE* pNew = (uNODE*)malloc(sizeof(uNODE));
if(!pNew)
{
puts("數(shù)據(jù)插入失敗!");
return -1;
}
pNew -> data = data1;
pNew -> next = *head1;
*head1 = pNew;
return 0;
}
int slist_user(NODE** head2, Useract data2)
{
NODE* pNew = (NODE*) malloc (sizeof(NODE));
if(!pNew)
{
puts("注冊失敗!");
return -1;
}
pNew -> data = data2;
pNew -> next = *head2;
*head2 = pNew;
return 0;
}
void slist_printT(const tNODE* head)
{
const tNODE* p = head;
printf("=============================================================================\n\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "車次", "出發(fā)站", "到達(dá)站", "出發(fā)日期", "出發(fā)時間", "歷時", "票數(shù)", "票價");
while(p)
{
printf("%s\t%s\t%s\t%s\t%s\t\t%.2f\t%d\t%.2f\n", p->data.num, p->data.start, p->data.end, p->data.date, p->data.time, p->data.take, p->data.count, p->data.price);
p = p -> next;
}
printf("=============================================================================\n\n");
}
void slist_printU(const uNODE* head1)
{
const uNODE* p = head1;
printf("=============================================================================\n\n");
printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間", "座位號", "票價");
while(p)
{
printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
p = p -> next;
}
printf("=============================================================================\n\n");
}
void slist_freeT(tNODE** head)
{
tNODE* p = *head,*q = NULL;
while(p)
{
q = p;
p = p -> next;
free(q);
}
}
void slist_freeU(uNODE** head1)
{
uNODE* p = *head1,*q = NULL;
while(p)
{
q = p;
p = p -> next;
free(q);
}
}
void slist_free(NODE** head2)
{
NODE* p = *head2, *q = NULL;
while(p)
{
q = p;
p = p -> next;
free(q);
}
}
菜單文件
menu.h
#ifndef __MENU_H
#define __MENU_H
#include"slist.h"
#include"file.h"
void Welcome(void);
int MainMenu(tNODE**,uNODE**, NODE**);
int tMenu(tNODE**, uNODE**,NODE**);
int tmenu(tNODE**, uNODE**,NODE**);
int uMenu(tNODE**, uNODE**,NODE**);
int umenu(tNODE**, uNODE**,NODE**);
int Manage(tNODE**, uNODE**);
#endif
menu.c
#include"menu.h"
#include<string.h>
#include"function.h"
#include<stdio.h>
#include"slist.h"
void Welcome(void)
{
printf("\n\n");
puts("|============================|");
puts("| |");
puts("|*** 歡迎使用鐵路購票系統(tǒng) ***|");
puts("| |");
puts("|============================|");
puts("\n");
puts(" =======按任意鍵繼續(xù)======");
getchar();
}
int MainMenu(tNODE** head, uNODE** head1, NODE** head2)
{
puts("======================");
puts("----1. 管理員模式----");
puts("----2. 用戶模式------");
puts("----0. 退出程序------");
puts("======================");
printf("\n請選擇:");
int i = 0;
scanf("%d",&i);
switch(i)
{
case 0:
break;
case 1:
while(tmenu(head, head1, head2));
break;
case 2:
while(umenu(head, head1, head2));
break;
default:
puts("選擇有誤,請重新選擇");
break;
}
return i;
}
int tmenu(tNODE** head, uNODE** head1, NODE** head2)
{
puts("======================");
puts("1. 管理員注冊");
puts("2. 管理員登陸");
puts("3. 修改密碼");
puts("4. 找回密碼");
puts("0. 返回上一級");
puts("======================");
int n = 0;
printf("\n請選擇:");
scanf("%d", &n);
switch(n)
{
case 0:
return n;
case 1:
{
Useract data = {0};
puts("請輸入用戶名:");
scanf("%s", data.name);
puts("請輸入密碼");
printf("\033[8m");
scanf("%s", data.password);
printf("\033[0m");
puts("請輸入密保問題:");
scanf("%s", data.issue);
puts("請輸入答案:");
scanf("%s", data.answer);
data.num = 1;
NODE* p = *head2;
while(p)
{
if(strcmp( data.name, p->data.name) == 0)
{
puts("用戶名已存在!");
return n;
}
p = p -> next;
}
puts("注冊成功");
slist_user(head2,data);
save(*head2);
return n;
}
break;
case 2:
{
char name[20] = { 0 };
char password[20] = { 0 };
NODE* p = NULL;
int count = 0;
while (1)
{
p = *head2;
printf("用戶名:");
scanf("%s", name);
printf("密碼:");
printf("\033[8m");
scanf("%s", password);
printf("\033[0m");
count++;
while (p)
{
if ((strcmp(name, p->data.name) == 0) && (strcmp(password, p->data.password) == 0))
{
if (p->data.num == 1)
{
printf("\n");
puts("登陸中,請稍后... ...");
sleep(2);
printf("\n");
puts("登陸成功!");
while (tMenu(head, head1, head2));
return n;
}
}
p = p->next;
}
if (count == 3)
{
printf("\n");
puts("登陸失敗!");
printf("\n");
break;
}
printf("\n");
puts("用戶名或密碼錯誤請重新輸入");
printf("\n");
}
}
break;
case 3:
change_password(head2);
break;
case 4:
find_password(*head2);
break;
default:
puts("選擇有誤,請重新選擇");
break;
}
return n;
}
int tMenu(tNODE** head, uNODE** head1, NODE** head2)
{
puts("======================");
puts("----1. 查看票務(wù)------");
puts("----2. 管理票務(wù)------");
puts("----0. 返回上一層----");
puts("======================");
printf("\n請選擇:");
int i = 0;
scanf("%d", &i);
switch(i)
{
case 0:
break;
case 1:
while(find(*head, *head1));
break;
case 2:
while(Manage(head, head1));
break;
default:
puts("選擇有誤,請重新選擇");
break;
}
return i;
}
int umenu(tNODE** head, uNODE** head1,NODE** head2)
{
puts("======================");
puts("1. 用戶注冊");
puts("2. 用戶登陸");
puts("3. 修改密碼");
puts("4. 找回密碼");
puts("0. 返回上一級");
puts("======================");
int n = 0;
printf("\n請選擇:");
scanf("%d", &n);
switch(n)
{
case 0:
break;
case 1:
{
Useract data = {0};
puts("請輸入用戶名:");
scanf("%s", data.name);
puts("請輸入密碼");
printf("\033[8m");
scanf("%s", data.password);
printf("\033[0m");
puts("請輸入密保問題:");
scanf("%s", data.issue);
puts("請輸入答案:");
scanf("%s", data.answer);
data.num = 0;
NODE* p = *head2;
while(p)
{
if(strcmp( p -> data.name, data.name) == 0)
{
puts("用戶名已存在!");
return n;
}
p = p -> next;
}
puts("注冊成功");
slist_user(head2,data);
save(*head2);
}
break;
case 2:
{
char name[20] = { 0 };
char password[20] = { 0 };
NODE* p = NULL;
int count = 0;
while (1)
{
p = *head2;
printf("用戶名:");
scanf("%s", name);
printf("密碼:");
printf("\033[8m");
scanf("%s", password);
printf("\033[0m");
count++;
while (p)
{
if ((strcmp(name, p->data.name) == 0) && (strcmp(password, p->data.password) == 0))
{
if (p->data.num == 0)
{
printf("\n");
puts("登陸中,請稍后... ...");
sleep(2);
printf("\n");
puts("登陸成功!");
printf("\n");
while (uMenu(head, head1, head2));
return n;
}
}
p = p->next;
}
if (count == 3)
{
printf("\n");
puts("登陸失??!");
printf("\n");
break;
}
printf("\n");
puts("用戶名或密碼錯誤請重新輸入");
printf("\n");
}
}
break;
case 3:
change_password(head2);
break;
case 4:
find_password(*head2);
break;
default:
puts("輸入錯誤請重新輸入");
break;
}
return n;
}
int uMenu(tNODE** head, uNODE** head1, NODE** head2)
{
puts("=======================");
puts("----1. 購票------------");
puts("----2. 退票------------");
puts("----3. 改簽------------");
puts("----4. 查看信息------");
puts("----5. 查看票務(wù)------");
puts("----0. 返回上一級---");
puts("=======================");
printf("\n請選擇:");
int i = 0;
scanf("%d", &i);
switch(i)
{
case 0:
break;
case 1:
while(buyTicket(head, head1));
break;
case 2:
while(refundTicket(head,head1));
break;
case 3:
while (change_ticket(head, head1));
break;
case 4:
while(findInform(*head1));
break;
case 5:
slist_printT(*head);
break;
default:
puts("輸入有誤請重新輸入!");
break;
}
return i;
}
int Manage(tNODE** head, uNODE** head1)
{
puts("=====================");
puts("----1. 增加票務(wù)-----");
puts("----2. 刪除票務(wù)-----");
puts("----3. 修改票務(wù)----");
puts("----4. 售票-----");
puts("----5. 退票-----");
puts("----6. 改簽-----");
puts("----0. 返回上一級---");
puts("=====================");
printf("\n請選擇:");
int i = 0;
scanf("%d", &i);
switch (i)
{
case 0:
break;
case 1:
while (addTicket(head));
break;
case 2:
while (deletTicket(head));
break;
case 3:
while (change(head));
break;
case 4:
while (buyTicket(head,head1));
break;
case 5:
while (deletUser(head1, head));
break;
case 6:
while (change_ticket(head, head1));
break;
default:
puts("選擇有誤請重新選擇");
break;
}
return i;
}
工程文件
function.h文章來源:http://www.zghlxwxcb.cn/news/detail-519275.html
#ifndef __FUNCTION_H
#define __FUNCTION_H
#include"slist.h"
int change_password(NODE**);
int addTicket(tNODE**);
int deletUser(uNODE**, tNODE**);
int deletTicket(tNODE**);
int buyTicket(tNODE**, uNODE**);
int refundTicket(tNODE**,uNODE**);
int findInform(uNODE*);
int find(tNODE*, uNODE*);
int change_ticket(tNODE**, uNODE**);
int find_password(NODE*);
int change(tNODE**);
#endif
function.c文章來源地址http://www.zghlxwxcb.cn/news/detail-519275.html
#include"function.h"
#include"slist.h"
#include"file.h"
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
static int ticket_print(tNODE* head);
static int user_print(uNODE* head1);
int addTicket(tNODE** head)
{
Ticket tri = {0};
char ch ='\0';
tNODE* p = NULL;
do
{
p = *head;
puts("請輸入車次");
scanf("%s", tri.num);
while (p)
{
if (strcmp(p->data.num, tri.num) == 0 )
{
puts("該車次已存在,請勿重復(fù)添加!");
return 0;
}
p = p->next;
}
puts("請輸入起始站");
scanf("%s", tri.start);
puts("請輸入終點站");
scanf("%s", tri.end);
puts("請輸入出發(fā)日期(例如2022/11/11)");
scanf("%s", tri.date);
puts("請輸入出發(fā)時間(例如12:15)");
scanf("%s", tri.time);
puts("請輸入歷時");
scanf("%f", &tri.take);
puts("請輸入票數(shù)");
scanf("%d", &tri.count);
puts("請輸入票價");
scanf("%f", &tri.price);
slist_addTicket(head,tri);
puts("是否繼續(xù)添加(Y/N)");
while(getchar() != '\n');
ch = getchar();
}while(ch == 'y' || ch == 'Y');
slist_printT(*head);
saveT(*head);
return 0;
}
int deletUser(uNODE** head1, tNODE** head)
{
slist_printU(*head1);
char name[20] = {0};
puts("請輸入要刪除的乘員姓名:");
scanf("%s", name);
char id[20] = {0};
puts("請輸入要刪除的乘員id:");
while (1)
{
scanf("%s", id);
if (strlen(id) == 18)
break;
puts("id錯誤請重新輸入");
}
uNODE* p = *head1, *q = NULL;
tNODE* t = *head;
if(!p)
return -1;
if ((strcmp(p->data.name, name) == 0) && (strcmp(p->data.id, id) == 0))
{
while (t)
{
if (strcmp(p->data.num, t->data.num) == 0)
{
(t->data.count)++;
break;
}
t = t->next;
}
*head1 = p->next;
free(p);
saveU(*head1);
puts("退票成功!");
slist_printU(*head1);
slist_printT(*head);
return 0;
}
while (p)
{
if ((strcmp(p->data.name, name) == 0) && (strcmp(p->data.id, id) == 0))
{
while (t)
{
if (strcmp(p->data.num, t->data.num) == 0)
{
(t->data.count)++;
break;
}
t = t->next;
}
q->next = p->next;
free(p);
saveU(*head1);
puts("退票成功!");
slist_printU(*head1);
slist_printT(*head);
return 0;
}
q = p;
p = p->next;
}
puts("未找到要退票的成員信息");
return 0;
}
int deletTicket(tNODE** head)
{
slist_printT(*head);
char num[20] = {0};
puts("請輸入要刪除的車次:");
scanf("%s", num);
tNODE* p = *head, *q = NULL;
if(!p)
return -1;
if(strcmp(num, p -> data.num) == 0)
{
*head = p -> next;
free(p);
puts("刪除成功!");
saveT(*head);
slist_printT(*head);
return 0;
}
while(p)
{
if(strcmp(num, p -> data.num) == 0 )
{
q -> next = p -> next;
free(p);
puts("刪除成功!");
saveT(*head);
slist_printT(*head);
return 0;
}
q = p;
p = p -> next;
}
printf("\n");
puts("未找到要刪除的車次");
slist_printT(*head);
return 0;
}
int refundTicket(tNODE** head, uNODE** head1)
{
char name[20] = {0};
puts("請輸入要刪除的姓名:");
scanf("%s", name);
char id[30] = {0};
puts("請輸入要刪除的id:");
while (1)
{
scanf("%s", id);
if (strlen(id) == 18)
break;
puts("id錯誤請重新輸入");
}
uNODE* p = *head1, *q = NULL;
tNODE* t = *head;
if(!p)
return -1;
if((strcmp(name, p -> data.name) == 0 )&& (strcmp(id, p -> data.id) == 0))
{
while (q)
{
if (strcmp(p->data.num, t->data.num) == 0)
{
(t->data.count)++;
break;
}
t = t->next;
}
*head1 = p -> next;
free(p);
saveU(*head1);
puts("刪除成功!");
slist_printT(*head);
return 0;
}
while(p)
{
if((strcmp(name, p -> data.name) == 0) && (strcmp(id, p -> data.id) == 0))
{
while (q)
{
if (strcmp(p->data.num, t->data.num) == 0)
{
(t->data.count)++;
break;
}
t = t->next;
}
q -> next = p -> next;
free(p);
puts("退票成功!");
slist_printT(*head);
saveU(*head1);
return 0;
}
q = p;
p = p -> next;
}
puts("未找到要刪除的乘員");
return 0;
}
int buyTicket(tNODE** head,uNODE** head1 )
{
if(*head == NULL)
{
puts("當(dāng)前暫無可購買車票!");
return -1;
}
slist_printT(*head);
char ch = '\0';
User user = {0};
tNODE* p = NULL;
uNODE* q = NULL;
do
{
puts("請輸入要購買的車次");
scanf("%s", user.num);
p = *head;
q = *head1;
int flag = 0;
while(p)
{
if(strcmp(p -> data.num, user.num) == 0)
{
puts("是否為學(xué)生(y/n)");
while (getchar() != '\n');
ch = getchar();
if (ch == 'y' || ch == 'Y')
{
user.price = (p->data.price) * 0.69;
}
else
user.price = p->data.price;
strcpy( user.date, p->data.date);
strcpy(user.time, p->data.time);
(p -> data.count)--;
flag = 1;
break;
}
p = p -> next;
}
if (flag == 0)
{
puts("該車次未運(yùn)行");
return 0;
}
puts("請輸入姓名:");
scanf("%s", user.name);
puts("請輸入身份證號:");
while (1)
{
scanf("%s", user.id );
if (strlen(user.id) == 18)
break;
puts("身份證輸入錯誤,請重新輸入");
}
puts("請輸入座位號:");
scanf("%s", user.seat);
while(q)
{
if(strcmp(q -> data.name, user.name) == 0 && strcmp( q -> data.num, user.num) == 0)
{
puts("購票失敗,請勿重復(fù)購買");
return -1;
}
q = q -> next;
}
puts("購票成功!");
printf("=============================================================================\n\n");
printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間 ", "座位號", "票價");
printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", user.name, user.id, user.num, user.date, user.time, user.seat, user.price);
printf("=============================================================================\n\n");
slist_addUser(head1, user);
saveU(*head1);
saveT(*head);
puts("是否繼續(xù)添加(Y/N)");
while(getchar() != '\n');
ch = getchar();
}while(ch == 'y' || ch == 'Y');
slist_printT(*head);
return 0;
}
int findInform(uNODE* head1)
{
uNODE* p = NULL;
char ch;
do
{
p = head1;
char name[30] = { 0 };
puts("請輸入要查詢的乘客姓名:");
scanf("%s", name);
char id[20] = { 0 };
puts("請輸入要查詢的乘客id");
while (1)
{
scanf("%s", id);
if (strlen(id) == 18)
break;
puts("id錯誤請重新輸入");
}
int flag = 0;
while (p)
{
if ((strcmp(p->data.name, name) == 0) && (strcmp(p->data.id, id) == 0))
{
puts("信息如下:");
printf("=============================================================================\n\n");
printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間 ", "座位號", "票價");
printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
printf("=============================================================================\n\n");
flag = 1;
}
p = p->next;
}
if (flag == 0)
{
puts("未找到乘客信息!");
}
puts("是否繼續(xù)查找(Y/N)");
while (getchar() != '\n');
ch = getchar();
} while (ch == 'Y' || ch == 'y');
return 0;
}
int find(tNODE* head, uNODE* head1)
{
puts("===========================");
puts("1. 查詢車次信息");
puts("2. 售票信息");
puts("0. 返回上一級");
puts("===========================");
printf("\n");
int i = 0;
printf("請選擇:");
scanf("%d", &i);
switch(i)
{
case 0:
break;
case 1:
while (ticket_print(head));
break;
case 2:
while (user_print(head1));
break;
default :
puts("輸入錯誤請重新輸入!");
break;
}
return i;
}
int change_ticket(tNODE** head, uNODE** head1)
{
char ch;
int flag = 0;
uNODE* p = *head1;
tNODE* q = *head, * t = *head;
char name[20] = { 0 };
char num[10] = { 0 };
char new_num[10] = { 0 };
puts("請輸入乘客姓名:");
scanf("%s", name);
puts("請輸入的車次:");
scanf("%s", num);
while (p)
{
if ((strcmp(name, p->data.name) == 0) && (strcmp(num, p -> data.num) == 0))
{
flag = 1;
break;
}
p = p->next;
}
if (flag == 0)
{
puts("未找到該乘客信息");
return 0;
}
slist_printT(*head);
while (q)
{
if (strcmp(num, q->data.num) == 0)
{
(q->data.count)++;
saveT(*head);
break;
}
q = q->next;
}
puts("請輸入要改簽的車次:");
scanf("%s", new_num);
while (t)
{
if (strcmp(new_num, t->data.num) == 0)
{
strcpy(p->data.num, new_num);
strcpy(p->data.date, t->data.date);
strcpy(p->data.time, t->data.time);
puts("是否為學(xué)生(y/n)");
while (getchar() != '\n');
ch = getchar();
if (ch == 'y' || ch == 'Y')
{
p->data.price = (t->data.price) * 0.69;
}
else
p->data.price = t->data.price;
(t->data.count)--;
puts("請稍后... ...");
sleep(2);
puts("改簽成功!");
printf("=============================================================================\n\n");
printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間 ", "座位號", "票價");
printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
printf("=============================================================================\n\n");
saveT(*head);
saveU(*head1);
return 0;
}
t = t->next;
}
puts("改簽失敗");
return 0;
}
int find_password(NODE* head2)
{
Useract data = { 0 };
puts("請輸入用戶名:");
scanf("%s", data.name);
NODE* p = head2;
while (p)
{
if (strcmp( p->data.name, data.name) == 0)
{
printf("%s\n", p->data.issue);
puts("請輸入答案:");
scanf("%s", data.answer );
if (strcmp( data.answer, p->data.answer) == 0)
{
printf("您所查詢的密碼為:%s\n", p->data.password);
return 0;
}
else
{
puts("答案錯誤,查詢失?。?);
return -1;
}
}
p = p->next;
}
puts("查無此人!");
return -1;
}
int change_password(NODE** head2)
{
Useract data = { 0 };
puts("請輸入用戶名:");
scanf("%s", data.name);
puts("請輸入密碼:");
printf("\033[8m");
scanf("%s", data.password);
printf("\033[0m");
NODE* p = *head2;
while (p)
{
if ((strcmp( data.name, p->data.name) == 0) && (strcmp( data.password, p->data.password) == 0))
{
puts("請輸入要修改的密碼:");
printf("\033[8m");
scanf("%s", p->data.password);
printf("\033[0m");
puts("修改成功");
save(*head2);
return 0;
}
p = p->next;
}
puts("用戶或密碼錯誤!");
return -1;
}
static int ticket_print(tNODE* head)
{
puts("===========================");
puts("1. 查看全部");
puts("2. 按日期查詢");
puts("3. 按終點站查詢");
puts("0. 返回上一級");
puts("===========================");
printf("\n");
int i = 0;
printf("請選擇:");
scanf("%d", &i);
switch (i)
{
case 0:
return i;
case 1:
slist_printT(head);
break;
case 2:
{
char date[30] = { 0 };
printf("請輸入要查詢的日期:");
scanf("%s", date);
tNODE* p = head;
printf("=============================================================================\n\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "車次", "出發(fā)站", "到達(dá)站", "出發(fā)日期","出發(fā)時間", "歷時", "票數(shù)", "票價");
while (p)
{
if (strcmp(p->data.date, date) == 0)
{
printf("%s\t%s\t%s\t%s\t%s\t\t%.2f\t%d\t%.2f\n", p->data.num, p->data.start, p->data.end, p->data.date, p-> data.time , p->data.take, p->data.count, p->data.price);
}
p = p->next;
}
printf("=============================================================================\n\n");
}
break;
case 3:
{
char end[30] = { 0 };
printf("請輸入要查詢的終點站:");
scanf("%s", end);
tNODE* p = head;
printf("=============================================================================\n\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "車次", "出發(fā)站", "到達(dá)站", "出發(fā)日期", "出發(fā)時間", "歷時", "票數(shù)", "票價");
while (p)
{
if (strcmp(p->data.end, end) == 0)
{
printf("%s\t%s\t%s\t%s\t%s\t\t%.2f\t%d\t%.2f\n", p->data.num, p->data.start, p->data.end, p->data.date, p->data.time, p->data.take, p->data.count, p->data.price);
}
p = p->next;
}
printf("=============================================================================\n\n");
}
break;
default:
puts("輸入錯誤請重新輸入!");
break;
}
return i;
}
static int user_print(uNODE* head1)
{
puts("===========================");
puts("1. 查看全部");
puts("2. 按車次查詢");
puts("3. 按日期查詢");
puts("4. 按姓名查詢");
puts("0. 返回上一級");
puts("===========================");
printf("\n");
int i = 0;
printf("請選擇:");
scanf("%d", &i);
switch (i)
{
case 0:
return i;
case 1:
slist_printU(head1);
break;
case 2:
{
char num[30] = { 0 };
printf("請輸入要查詢的車次:");
scanf("%s", num);
uNODE* p = head1;
printf("=============================================================================\n\n");
printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間", "座位號", "票價");
while (p)
{
if (strcmp(p->data.num, num) == 0)
{
printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
}
p = p->next;
}
printf("=============================================================================\n\n");
}
break;
case 3:
{
char date[30] = { 0 };
printf("請輸入要查詢的日期:");
scanf("%s", date);
uNODE* p = head1;
printf("=============================================================================\n\n");
printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間", "座位號", "票價");
while (p)
{
if (strcmp(p->data.date, date) == 0)
{
printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
}
p = p->next;
}
printf("=============================================================================\n\n");
}
break;
case 4:
{
char name[30] = { 0 };
printf("請輸入要查詢的名字:");
scanf("%s", name);
uNODE* p = head1;
printf("=============================================================================\n\n");
printf("%s\t%s\t\t\t%s\t%s\t%s\t%s\t%s\n", "姓名", "身份", "車次", "出發(fā)日期", "出發(fā)時間", "座位號", "票價");
while (p)
{
if (strcmp(p->data.name, name) == 0)
{
printf("%s\t%s\t%s\t%s\t%s\t\t%s\t%.2f\n", p->data.name, p->data.id, p->data.num, p->data.date, p->data.time, p->data.seat, p->data.price);
}
p = p->next;
}
printf("=============================================================================\n\n");
}
break;
default:
puts("輸入錯誤請重新輸入!");
break;
}
return i;
}
int change(tNODE** head)
{
slist_printT(*head);
char num[20] = { 0 };
puts("請輸入要修改的車次:");
scanf("%s", num);
tNODE* p = *head, * q = *head;
while (p)
{
if (strcmp(p->data.num, num) == 0)
{
char new_num[20] = { 0 };
puts("請輸入修改后的車次:");
scanf("%s", new_num);
while (q)
{
if (strcmp(new_num, q->data.num) == 0)
{
puts("車次已存在,修改失?。?);
return 0;
}
q = q->next;
}
strcpy( p->data.num, new_num);
puts("請輸入修改后的起始站");
scanf("%s", p->data.start);
puts("請輸入修改后的終點站");
scanf("%s", p->data.end);
puts("請輸入修改后的出發(fā)日期(例如2022/11/11)");
scanf("%s", p->data.date);
puts("請輸入修改后的出發(fā)時間(例如12:15)");
scanf("%s", p->data.time);
float take = 0, price = 0;
int count = 0;
puts("請輸入修改后的歷時");
scanf("%f", &take);
p->data.take = take;
puts("請輸入修改后的票數(shù)");
scanf("%d", &count);
p->data.count = count;
puts("請輸入修改后的票價");
scanf("%f", &price);
p->data.price = price;
saveT(*head);
puts("請稍后... ...");
sleep(1);
puts("修改成功!");
printf("=============================================================================\n\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", "車次", "出發(fā)站", "到達(dá)站", "出發(fā)日期", "出發(fā)時間", "歷時", "票數(shù)", "票價");
printf("%s\t%s\t%s\t%s\t%s\t\t%.2f\t%d\t%.2f\n", p->data.num, p->data.start, p->data.end, p->data.date, p->data.time, p->data.take, p->data.count, p->data.price);
printf("=============================================================================\n\n");
return 0;
}
p = p->next;
}
puts("未找到該車次");
return 0;
}
到了這里,關(guān)于C語言階段小項目(火車購票系統(tǒng))的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!