C语言课设 -- 影院管理系统

 

#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, &current.min, &current.year, &current.month, &current.day, 
                &current.hour, &current.minute, current.num, &current.price,&current.seatx,&current.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, &current.min, &current.year, &current.month, &current.day, 
                &current.hour, &current.minute, current.num, &current.price, &current.discount, &current.rest) != EOF) {
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                fscanf(fp, "%d", &current.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;
}

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值