#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<conio.h>
#include<stdbool.h>
//用户信息
typedef struct user{
char username[50];//账号
char password[50];//密码
char name[50];//电影名字
char type[20];//类型
int min;//时长分钟
int year, month, day;//年月日
int hour, minute;//放映时间
char num[10];//放映影厅
float price;//电影票价
int seatx,seaty;//座位号
struct user* next;
}User,adUser;
// 定义电影票
typedef struct ticket {
char name[50];//名字
char type[20];//类型
int min;//时长分钟
int year, month, day;//年月日
int hour, minute;//放映时间
char num[10];//放映影厅
float price;//电影票价
float discount;//折扣
int rest;//剩余票数
int seat[10][10];//座位
struct ticket *next;
}Ticket;
int usermenu(User *userhead,adUser *adhead); //登录页面
User* login(User *userhead);//登录页面
bool ad_login(adUser *adhead);//管理员登录
void regi(User *userhead);//注册页面
void clean(User *current);//初始化
void user_read(User *userhead);//读取用户信息
void ad_read(adUser *adhead);//读取管理员信息
void user_write(User *userhead);//写入用户信息
User* check(User *userhead,char username[],char password[]);//比对用户信息
bool adcheck(adUser *adhead,char username[],char password[]);//比对管理员信息
bool user_check(User *userhead,char username[]);
//操作员
void menu();//管理员操作面板
void input(Ticket *head);//录入电影
void display(Ticket *head);//输出全部影片信息
void Print(Ticket *head);//尝试表格形式输出
void print(Ticket *p);//读取精准影片信息
void write(Ticket *head);//写入文件
void read(Ticket *head);//读取文件数据
void change(Ticket *head);//更改文件
void mohu(Ticket *head);//模糊查询 -> 随后进行精准查询
Ticket* Search(Ticket *head);//精准查询
void Sum(Ticket *head);
void Esc();//退出系统循环
//用户端
void user_menu();//用户端页面
void buy(Ticket *head,User *U);//用户购买
void user_print(Ticket *current);//读取精准影片信息
void sure(Ticket *p,User *U);//储存用户影票信息
void U_print(User *U);//展示用户影票信息
void S_print(Ticket *head);//用户选择怎样显示影片信息
void get(User *U);//用户进行取票
void Send(Ticket *head,User *current);//用户进行退票
void clean(User *current); //对用户数据进行清零
void yuan(Ticket *head,User *current);//对于用户退票所进行的查询,用于还原影院座位
void Sort(Ticket *head);//排序输出
bool sort1(Ticket *p1,Ticket *p2);
bool sort2(Ticket *p1,Ticket *p2);
bool sort3(Ticket *p1,Ticket *p2);
bool sort4(Ticket *p1,Ticket *p2);
int main()
{
User *userhead = (User*)malloc(sizeof(User));
userhead->next = NULL;
user_read(userhead);
adUser *adhead = (adUser*)malloc(sizeof(adUser));
adhead->next = NULL;
ad_read(adhead);
int flag=0;
while(1){
HUAN:
flag = usermenu(userhead,adhead);
if(flag==1||flag==2){
break;
}else{
printf("错误");
}
}
if(flag == 1){
Ticket *head = (Ticket *)malloc(sizeof(Ticket));
head->next = NULL;
user_read(userhead);
system("pause");
User *U = userhead->next;
read(head);
while(1){
user_menu();
printf("\t\t\t请进行您的选择:");
int flag;
scanf("%d",&flag);
switch(flag){
case 1:
buy(head,U);
write(head);
user_write(userhead);
break;
case 2:
get(U);
break;
case 3:
Send(head,U);
write(head);
user_write(userhead);
break;
case 4:
Sort(head);
system("pause");
break;
case 0:
goto HUAN;
break;
default:
printf("错误!----请重新输入\n");
break;
}
}
}else {
Ticket *head = (Ticket*)malloc(sizeof(Ticket));
head->next = NULL;
read(head);
Ticket *t;
while(1){
menu();
printf("\t\t\t请进行您的选择:");
int choice;
scanf("%d",&choice);
switch(choice){
case 1:
input(head);
write(head);
break;
case 2:
change(head);
write(head);
break;
case 3:
mohu(head);
printf("是否查看相应座位(1 or 0)\n");
int flag;
scanf("%d",&flag);
if(flag == 1){
Ticket * current = Search(head);
printf("座位信息:\n");
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(current->seat[i][j]==0){
printf("□ ");
}else{
printf("■ ");
}
}
printf("\n");
}
}
system("pause");
break;
case 4:
Print(head);
break;
case 5:
Sum(head);
break;
case 0:
goto HUAN;
break;
}
}
}
return 0;
}
int usermenu(User *userhead,adUser *adhead){
system("cls");
printf("\n\n");
printf("\n");
printf("\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 1.用户登录 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 2.新用户注册 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 3.管理员登录 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 0.退 出 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
printf("\t\t\t请选择:");
int flag,index;
scanf("%d",&index);
User* U = (User*)malloc(sizeof(User));
U->next = NULL;
switch(index){
case 1:
U = login(userhead);
if(U!=NULL){
flag = 1;
}else{
flag = 0;
}
break;
case 2:
regi(userhead);
break;
case 3:
flag = ad_login(adhead)+1;
break;
case 0:
printf("欢迎下次使用!");
exit(0);
default:
printf("输入错误,请重新输入....");
system("pause");
break;
}
return flag;
}
User* login(User *userhead){
system("cls");
printf("*************************************************\n");
printf("*****************用户登录************************\n");
printf(" 账号:");
char username[50],password[50];
int index = 0;
char input;
scanf("%s",username);
printf("\n 密码: ");
//密码隐藏
while((input = getch())!='\r'){
if(input == '\b'){
if(index<0){
continue;
}
if(index > 0){
putchar('\b');
putchar(' ');
putchar('\b');
index--;
}
}else{
printf("*");
password[index++] = input;
}
}
//比对
User *U = (User*)malloc(sizeof(User));
U->next = NULL;
U = check(userhead,username,password);
if(U != NULL){
printf("\n登录成功----");
system("pause");
return U;
}else{
printf("\n用户名或密码错误----");
system("pause");
return 0;
}
}
User* check(User *userhead,char username[],char password[]){
User *p = userhead->next;
while(p){
if(strcmp(username,p->username)==0&&strcmp(password,p->password)==0){
return p;
}
p = p->next;
}
return 0;
}
void regi(User *userhead){
User *p = (User*)malloc(sizeof(User));
p->next = NULL;
printf("************************************************\n");
printf(" 用户注册 \n");
printf(" 用户名:");
scanf("%s",p->username);
printf(" 密码:");
scanf("%s",p->password);
int flag = 0;
user_read(userhead);
flag = user_check(userhead,p->username);
clean(p);
if(flag==0){
p->next = userhead->next;
userhead->next = p;
user_write(userhead);
printf("注册完成!");
}else{
printf("该用户名已存在!");
}
system("pause");
}
bool user_check(User *userhead,char username[]){
User *p = userhead->next;
while(p){
if(strcmp(p->username,username)==0){
return 1;
}
p = p->next;
}
return 0;
}
bool ad_login(adUser *adhead){
system("cls");
printf("*************************************************\n");
printf("*****************管理员登录************************\n");
printf(" 账号:");
char username[50],password[50];
int index = 0;
char input;
scanf("%s",username);
printf("\n 密码: ");
//密码隐藏
while((input = getch())!='\r'){
if(input == '\b'){
if(index<0){
continue;
}
if(index > 0){
putchar('\b');
putchar(' ');
putchar('\b');
index--;
}
}else{
printf("*");
password[index++] = input;
}
}
//比对
if(adcheck(adhead,username,password)){
printf("\n登录成功----");
system("pause");
return 1;
}else{
printf("\n用户名或密码错误----");
system("pause");
return 0;
}
}
bool adcheck(adUser *adhead,char username[],char password[]){
adUser *p = adhead->next;
while(p){
if(strcmp(username,p->username)==0&&strcmp(password,p->password)==0){
return 1;
}
p = p->next;
}
return 0;
}
//读取用户信息
void user_read(User *userhead){
FILE *fp = fopen("users.txt","r");
if(fp==NULL){
return ;
}
User current;
User *p = userhead;
User *q;
while(fscanf(fp,"%s %s %s %s %d %d-%02d-%02d %02d:%02d %s %f %d %d\n",current.username,current.password,
current.name, current.type, ¤t.min, ¤t.year, ¤t.month, ¤t.day,
¤t.hour, ¤t.minute, current.num, ¤t.price,¤t.seatx,¤t.seaty) != EOF) {
q = (User*)malloc(sizeof(User));
*q = current;
q->next = NULL;
p->next = q;
p = q;
}
fclose(fp);
}
//读取管理员信息
void ad_read(adUser *adhead){
FILE *fp = fopen("admin.txt","r");
if(fp == NULL){
return ;
}
adUser t;
adUser *p = adhead,*q;
while(fscanf(fp,"%s %s",t.username,t.password)!=EOF){
q = (adUser*)malloc(sizeof(adUser));
*q = t;
q->next = NULL;
p->next = q;
p = q;
}
fclose(fp);
}
//写入用户信息
void user_write(User*userhead){
FILE *fp = fopen("users.txt","w");
if(fp == NULL){
return ;
}
User *current = userhead->next;
while(current){
fprintf(fp, "%s %s %s %s %d %d-%02d-%02d %02d:%02d %s %.2f %d %d\n", current->username,current->password,
current->name, current->type, current->min, current->year, current->month, current->day,
current->hour, current->minute, current->num, current->price,current->seatx,current->seaty);
current = current->next;
}
fclose(fp);
}
void menu()
{
system("cls");
printf("\n\n");
printf("\n");
printf("\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 1.录入影片 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 2.修改影片 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 3.查找影片 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 4.显示影片 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 5.票房统计 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 0.退 出 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
}
// 录入信息函数
void input(Ticket *head) {
system("cls");
printf("\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 录 入 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
char ch;
Ticket *tick = (Ticket*)malloc(sizeof(Ticket));
while(1) {
printf("---------------------------------------------------------------------------------\n");
printf("\n【系统提示】影片名称:");
scanf("%s", tick->name);
printf("\n【系统提示】影片类型(国语2D):");
scanf("%s", tick->type);
printf("\n【系统提示】影片时长(150):");
scanf("%d", &tick->min);
printf("\n【系统提示】放映日期 (2011-11-11) :");
scanf("%d-%d-%d", &tick->year, &tick->month, &tick->day);
printf("\n【系统提示】放映时间 (12:30) :");
scanf("%d:%d", &tick->hour, &tick->minute);
printf("\n【系统提示】放映影厅:");
scanf("%s",tick->num);
printf("\n【系统提示】电影票价:");
scanf("%f", &tick->price);
printf("\n【系统提示】会员价:");
scanf("%f", &tick->discount);
tick->rest = 100;
for (int m = 0; m < 10; m++) {
for (int n = 0; n < 10; n++) {
tick->seat[m][n] = 0;
}
}
tick->next = head->next;
head->next = tick;
printf("\n【系统提示】是否继续录入(Y/N):");
while (1) {
scanf(" %c", &ch);
if (ch == 'y' || ch == 'Y' || ch == 'n' || ch == 'N') {
break;
} else {
printf("【系统提示】输入格式错误,请重新输入:");
}
}
if (ch == 'n' || ch == 'N') {
break;
}
}
}
void change(Ticket *head){
system("cls");
printf("\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 修 改 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
char name[50];
while(1)
{
mohu(head);
Ticket tick;
Ticket *p = (Ticket *)malloc(sizeof(Ticket));
while(1){
p = Search(head);
if(p != NULL){
print(p);
break;
}
}
printf("\n");
printf("\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 1.修改影片名称 2.修改影片类型 ┃\t\n");
printf("\t\t\t┃ 3.修改影片时长 4.修改放映日期 ┃\t\n");
printf("\t\t\t┃ 5.修改放映时间 6.修改放映影厅 ┃\t\n");
printf("\t\t\t┃ 7.修改影片票价 8.修改会员票价 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
printf("\t\t\t【系统提示】请输入你的选择(1-8):");
int choice;
scanf("%d",&choice);
if(choice<1||choice>8){
printf("\t\t\t【系统提示】输入格式错误,请重新输入:");
scanf("%d",&choice);
}
char ch;
switch(choice){
case 1:
printf("\n【系统提示】影片名称:");
scanf("%s", tick.name);
strcpy(p->name,tick.name);
break;
case 2:
printf("\n【系统提示】影片类型(国语2D):");
scanf("%s", tick.type);
strcpy(p->type,tick.type);
break;
case 3:
printf("\n【系统提示】影片时长:");
scanf("%d", &tick.min);
p->min = tick.min;
break;
case 4:
printf("\n【系统提示】放映日期(2020-11-11):");
scanf("%d-%d-%d", &tick.year, &tick.month, &tick.day);
p->year = tick.year;
p->month = tick.month;
p->day = tick.month;
break;
case 5:
printf("\n【系统提示】放映时间(12:15):");
scanf("%d-%d", &tick.hour, &tick.minute);
p->hour = tick.hour;
p->minute = tick.minute;
break;
case 6:
printf("\n【系统提示】放映影厅:");
scanf("%s", tick.num);
strcpy(p->num,tick.num);
break;
case 7:
printf("\n【系统提示】票价:");
scanf("%f", &tick.price);
p->price = tick.price;
break;
case 8:
printf("\n【系统提示】会员价:");
scanf("%f", &tick.discount);
p->discount = tick.discount;
break;
case 0:
break;
default:
printf("\t\t\t【系统提示】输入格式错误,请重新输入:\n");
continue;
break;
}
XY:
printf("\n【系统提示】是否继续录入(Y/N):");
scanf(" %c",&ch);
system("cls");
if(ch == 'N'||ch == 'n'){
printf("【系统提示】影片信息修改成功!\n");
printf(" --------------------------------------------------------------------------------------------------------------- \n");
printf("|影片名称\t\t|类型\t|时长\t|放映日期\t|放映时间\t|放映影厅\t|票价\t|会员价\t|余票\t|\n");
printf("|---------------------------------------------------------------------------------------------------------------|\n");
print(p);
system("pause");
break;
}else if(ch == 'Y'||ch == 'y'){
printf("【系统提示】继续进行修改...");
system("pause");
break;
}else{
printf("信息录入错误.....\n");
printf("请重新进行选择:");
goto XY;
}
}
}
//void display(Ticket *head) {
// system("cls");
// Ticket *current = head->next;
//
// printf("\n-------------------------------------\n");
// printf("影片信息列表:\n");
//
// while (current != NULL) {
// print(current);
// current = current->next;
// }
// system("pause");
//}
void Print(Ticket *head){
system("cls");
Ticket *current = head->next;
printf("【系统提示】查询结果如下:\n");
printf(" --------------------------------------------------------------------------------------------------------------- \n");
printf("|影片名称\t\t|类型\t|时长\t|放映日期\t|放映时间\t|放映影厅\t|票价\t|会员价\t|余票\t|\n");
printf("|---------------------------------------------------------------------------------------------------------------|\n");
while (current != NULL) {
print(current);
current = current->next;
}
system("pause");
}
void print(Ticket *current){
if(strlen(current->name)<8){
printf("|%s\t\t\t",current->name);
}else{
printf("|%s\t\t",current->name);
}
printf("|%s\t|%d\t|%d-%d-%d\t|%02d:%02d\t\t|%s\t\t|%.2f\t|%.2f\t|%d\t|\n",current->type,current->min,current->year,
current->month,current->day,current->hour,current->minute,current->num,current->price,current->discount,current->rest);
printf("|---------------------------------------------------------------------------------------------------------------|\n");
}
void read(Ticket *head){
FILE *fp = fopen("movie.txt","r");
if(fp==NULL){
printf("打开失败\n");
return ;
}
Ticket current;
Ticket *p = head,*q;
while(fscanf(fp,"%s %s %d %d-%02d-%02d %02d:%02d %s %f %f %d\n",
current.name, current.type, ¤t.min, ¤t.year, ¤t.month, ¤t.day,
¤t.hour, ¤t.minute, current.num, ¤t.price, ¤t.discount, ¤t.rest) != EOF) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
fscanf(fp, "%d", ¤t.seat[i][j]);
}
}
q = (Ticket*)malloc(sizeof(Ticket));
*q = current;
q->next = p->next;
p->next = q;
}
fclose(fp);
}
void write(Ticket* head) {
FILE* fp = fopen("movie.txt", "w");
if (fp == NULL) {
printf("打开失败\n");
return;
}
Ticket* current = head->next;
while (current != NULL) {
fprintf(fp, "%s %s %d %d-%02d-%02d %02d:%02d %s %.2f %.2f %d\n",
current->name, current->type, current->min, current->year, current->month, current->day,
current->hour, current->minute, current->num, current->price, current->discount, current->rest);
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
fprintf(fp, "%d ", current->seat[i][j]);
}
fprintf(fp,"\n");
}
fprintf(fp, "\n");
current = current->next;
}
// 关闭文件
fclose(fp);
}
void mohu(Ticket *head)
{
int i,j,n = 0;
Ticket *r = head->next;
char name[50]; //模糊查找的字符串
printf("模糊 -- 请输入你要查找的影片名字:");
scanf("%s",name);
char Listname[50]; //接收链表中的名字
int flag = 0;
while(r)
{
strcpy(Listname,r->name);
for(i = 0;i<strlen(Listname);i+=2)
{
for(j = 0;j<strlen(name);j+=2)
{
if(Listname[i] == name[j]&&Listname[i+1] == name[j+1])
{
n++;
}
}
}
if(n == strlen(name)/2)
{
print(r);
flag = 1;
}
n=0;
r = r->next;
}
if(flag == 0){
printf("没有查询到相关影片信息---\n\n");
}
}
Ticket* Search(Ticket *head){
char name[50];
printf("精准查找 -- 请输入你要查找的影片名字:");
scanf("%s",name);
Ticket *p = head->next;
while(p)
{
if(strcmp(p->name,name)==0){
return p;
}
p = p->next;
}
if(p==NULL){
printf("没有相关电影信息,请重新输入");
system("pause");
}
return 0;
}
void Sum(Ticket *head){
system("cls");
printf("\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 票房统计 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
Ticket *p = Search(head);
if(p == NULL){
return ;
}
double sum;
sum = p->price * (100-p->rest);
printf("\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 总计: %.2lf ┃\t\n",sum);
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
system("pause");
}
//退出系统
void Esc(){
system("cls");
printf("欢迎下次使用!\n");
system("pause");
exit(0);
}
//用户进行退票操作
void Send(Ticket *head,User *current){
system("cls");
printf("\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 退 票 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
system("pause");
//暂停后重新
if(current->price==0){
printf("【系统提示】您没有电影票----\n");
system("pause");
return ;
}
printf("【系统提示】您的订单:\n");
U_print(current);
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 1.确 认 2. 取 消 ┃\t\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
int flag;
scanf("%d",&flag);
if(flag == 1){
printf("【系统提示】订单信息确认:\n");
printf(" -------------------------------------------------------------------------------------------------------- \n");
printf("|影片名称\t\t|类型\t|时长\t|放映日期\t|放映时间\t|放映影厅\t|座位号\t|返还\t|\n");
printf("|-------------------------------------------------------------------------------------------------------|\n");
if(strlen(current->name)<8){
printf("|%s\t\t\t",current->name);
}else{
printf("|%s\t\t",current->name);
}
printf("|%s\t|%d\t|%d-%d-%d\t|%02d:%02d\t\t|%s\t\t|%d排%d号\t|%d\t|\n",current->type,current->min,current->year,
current->month,current->day,current->hour,current->minute,current->num,current->seatx,current->seaty,current->price);
printf("|------------------------------------------------------------------ -----------------------------------|\n");
printf("\n");
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 1.确 认 2. 取 消 ┃\t\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("【系统提示】请确认您的选择:");
int p;
scanf("%d",&p);
if(p==1){
// yuan(head,current);
Ticket *p = head->next;
while(p)
{
if(strcmp(p->name,current->name) == 0){
p->rest++;
p->seat[current->seatx-1][current->seaty-1] = 0;
write(head);
break;
}
p = p->next;
}
clean(current);
printf("已退票....\n");
system("pause");
return ;
}else{
printf("取消选择------\n");
system("pause");
return ;
}
}else{
printf("取消选择-------\n");
system("pause");
return ;
}
}
//退票时还原影片座位信息
//void yuan(Ticket *head,User *current){
// Ticket *p = head->next;
// while(p)
// {
// if(strcmp(p->name,current->name) == 0){
// p->rest++;
// p->seat[current->seatx-1][current->seaty-1] = 0;
// write(head);
// break;
// }
// p = p->next;
// }
//}
//清空用户影片信息
void clean(User *current){
strcpy(current->name,"000");
strcpy(current->type,"000");
strcpy(current->num,"000");
current->min = 0;
current->year = 0;
current->month = 0;
current->minute= 0;
current->hour = 0;
current->day = 0;
current->seatx=0;
current->seaty = 0;
current->price = 0;
}
//用户进行取票操作
void get(User *current){
system("cls");
printf("\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 取 票 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
// printf("【系统提示】请输入预定手机号:");
// char ch[30];
// scanf("%s",ch);
printf("【系统提示】您的订单:\n");
U_print(current);
printf("【系统提示】是否打印您的电影票:\n");
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃ 1.确 认 2. 取 消 ┃\t\n");
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
int flag;
scanf("%d",&flag);
if(flag == 1){
printf("正在打印....");
system("pause");
printf("打印成功! 请取走您的影票!");
system("pause");
return ;
}else{
printf("返回主页面!");
system("pause");
return ;
}
}
//用户进行购票操作
void buy(Ticket *head,User *U){
Ticket *p = Search(head);
if(p!=NULL){
user_print(p);
}else{
printf("没有相关电影信息,请重新输入");
system("pause");
return ;
}
int seatx,seaty;
ZUO:
printf("\t\t\t请输入您要选择的座位号(例如:3排3列):");
scanf("%d %d",&seatx,&seaty);
if(seatx<1||seatx>10||seaty<1||seaty>10){
printf("不存在该座位....\n");
system("pause");
return ;
}else{
if(p->seat[seatx-1][seaty-1]==1) {
printf("该座位无法选择!请重新选择!...\n");
goto ZUO;
}else{
p->seat[seatx-1][seaty-1] = 1;
p->rest--;
U->seatx = seatx;
U->seaty = seaty;
U->price = p->price;
printf("%.2lf",U->price);
printf("\n确认电影票信息:\n");
sure(p,U);//储存用户信息——关于影票
U_print(U);//显示用户信息
system("pause");
write(head);//
}
}
}
//储存用户影片信息
void sure(Ticket *p,User *U){
strcpy(U->name,p->name);
strcpy(U->type,p->type);
strcpy(U->num,p->num);
U->month = p->month;
U->day = p->day;
U->hour = p->hour;
U->minute = p->minute;
U->year = p->year;
U->min = p->min;
}
//
void U_print(User *current){
printf(" ------------------------------------------------------------------------------------------------ \n");
printf("|影片名称\t\t|类型\t|时长\t|放映日期\t|放映时间\t|放映影厅\t|座位号\t|\n");
printf("|-----------------------------------------------------------------------------------------------|\n");
if(strlen(current->name)<8){
printf("|%s\t\t\t",current->name);
}else{
printf("|%s\t\t",current->name);
}
printf("|%s\t|%d\t|%d-%d-%d\t|%02d:%02d\t\t|%s\t\t|%d排%d号\t|\n",current->type,current->min,current->year,
current->month,current->day,current->hour,current->minute,current->num,current->seatx,current->seaty);
printf("|------------------------------------------------------------------ ----------------------------|\n");
}
//
void user_menu(){
system("cls");
printf("\n\n");
printf("\n");
printf("\t\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 1.购 票 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 2.取 票 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 3.退 票 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 4.显示影片 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┃ 0.退 出 ┃\t\n");
printf("\t\t\t┃ ┃\t\n");
printf("\t\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
printf("\n");
}
void user_print(Ticket *current){
system("cls");
printf("【系统提示】查询结果如下:\n");
printf(" --------------------------------------------------------------------------------------------------------------- \n");
printf("|影片名称\t\t|类型\t|时长\t|放映日期\t|放映时间\t|放映影厅\t|票价\t|会员价\t|余票\t|\n");
printf("|---------------------------------------------------------------------------------------------------------------|\n");
if(strlen(current->name)<8){
printf("|%s\t\t\t",current->name);
}else{
printf("|%s\t\t",current->name);
}
printf("|%s\t|%d\t|%d-%d-%d\t|%02d:%02d\t\t|%s\t\t|%.2f\t|%.2f\t|%d\t|\n",current->type,current->min,current->year,
current->month,current->day,current->hour,current->minute,current->num,current->price,current->discount,current->rest);
printf("|---------------------------------------------------------------------------------------------------------------|\n");
printf("座位信息:\n");
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(current->seat[i][j]==0){
printf("□ ");
}else{
printf("■ ");
}
}
printf("\n");
}
printf("|---------------------------------------------------------------------------------------------------------------|\n");
}
void Sort(Ticket *head)
{
XS:
system("cls");
printf("-------------------------------\n");
printf(" 1 ---- 通过时长排序(升序)\n");
printf(" 2 ---- 通过时长排序(降序)\n");
printf(" 3 ---- 通过价格排序(升序)\n");
printf(" 4 ---- 通过价格排序(降序)\n");
printf("请选择排序方式:");
int choice=0;
scanf("%d",&choice);
Ticket *p;
Ticket *q=NULL;
int flag=0; //判断是否交换数据
for(p=head->next;p->next;p=p->next){
for(q=p->next;q;q=q->next){//链表的双层循环
switch(choice){
case 1:
flag=sort1(p,q);
break;
case 2:
flag=sort2(p,q);
break;
case 3:
flag=sort3(p,q);
break;
case 4:
flag=sort4(p,q);
break;
case 0:
return;
default:
printf("错误,请重新选择......\n");
system("pause");
goto XS;
}
if(flag==1){
//交换结构体的内容
Ticket t=*p;
*p=*q;
*q=t;
//将指针域还原
t.next=p->next;
p->next=q->next;
q->next=t.next;
}
}
}
int flag1;
printf("排序成功!\n");
printf("是否打印排序后的电影信息? 是(1)/否(0)");
scanf("%d",&flag1);
if(flag1==1){
Print(head);
}else{
printf("即将退出排序界面!");
system("pause");
}
}
bool sort1(Ticket *p1,Ticket *p2){
return p1->min>p2->min;
}
bool sort2(Ticket *p1,Ticket *p2){
return p1->min<p2->min;
}
bool sort3(Ticket *p1,Ticket *p2){
return p1->price>p2->price;
}
bool sort4(Ticket *p1,Ticket *p2){
return p1->price<p2->price;
}