C语言实现影院售票管理系统
作者:WE-ubytt
这篇文章主要为大家详细介绍了C语言实现影院售票管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了C语言实现影院售票管理系统的具体代码,供大家参考,具体内容如下
前言
最近刚好在写自己的课设,匆匆忙忙写出来的课设系统,仍有不足,拿出来和大家分享一下,希望能对大家有帮助。
一、概要设计
1、基本信息
数据类型:链表
typedef struct node { char name[N]; // 名称 char type[N]; // 类型 int time; // 时长 char day[N]; // 日期 char start[N]; // 起始时间 char site[N]; // 地点 int price; // 价格 int num; // 数量 int id; // 编号 int seat[N][N]; // 座位 struct node* next; // 指针域 }NODE;
实现功能:
typedef struct ticket { char name[N]; // 名称 char type[N]; // 类型 int time; // 时长 char day[N]; // 日期 char start[N]; // 起始时间 char site[N]; // 地点 int price; // 价格 int id; // 编号 char username[N]; // 用户名 int x; // 行 int y; // 列 int istake; // 是否取票 struct ticket* next; // 指针域 }TICKET;
实现功能:
开发环境:VS2019
2、功能模块图
3、功能描述
(1)管理员
①增加影片:新增影片至系统中
②显示影片:显示系统中的所有影片信息
③查找影片:通过姓名、类型、编号查询影片信息
④修改影片:通过编号查询影片,修改影片信息
⑤删除影片:通过编号查询影片,删除影片信息
⑥排序影片:按照时长、日期、价格、数量排序影片信息
(2)用户
①购票:排序影片信息,显示影片信息,通过编号查询影片信息,购票后显示票务信息
②取票:显示票务信息,选择是否取票
③退票:显示票务信息,选择是否退票
4、调用关系图
二、完整代码
#include<stdio.h> #include<windows.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<conio.h> #define N 100 typedef struct administrator { char id[N]; // 用户名 char password[N]; // 密码 struct administrator* next; // 指针域 }ADMIN; typedef struct user { char id[N]; // 用户名 char password[N]; // 密码 struct user* next; // 指针域 }USER; typedef struct node { char name[N]; // 名称 char type[N]; // 类型 int time; // 时长 char day[N]; // 日期 char start[N]; // 起始时间 char site[N]; // 地点 int price; // 价格 int num; // 数量 int id; // 编号 int seat[N][N]; // 座位 struct node* next; // 指针域 }NODE; typedef struct ticket { char name[N]; // 名称 char type[N]; // 类型 int time; // 时长 char day[N]; // 日期 char start[N]; // 起始时间 char site[N]; // 地点 int price; // 价格 int id; // 编号 char username[N]; // 用户名 int x; // 行 int y; // 列 int istake; // 是否取票 struct ticket* next; // 指针域 }TICKET; ADMIN a; // 管理员信息 USER b; // 用户信息 NODE list; // 影片信息 TICKET c; // 购票 char fusername[N], fpassword[N]; // 用户名/密码(文件) char username[N], password[N]; // 用户名/密码(输入) int flag = 0; // 判断是否登录成功 // 管理员登录 void menu_Login_admin(); // 界面 void fun_Login_admin(); // 功能 void admin_login(); // 登录 int Read_admin_login(); // 文件读取 // 用户登录 void menu_Login_user(); // 界面 void fun_Login_user(); // 功能 void user_login(USER* L); // 登录 int Read_user(USER* L); // 用户登录文件读取 int Read_user_login(USER* L); // 判断 int user_logon(USER* L); // 注册 void Add1(USER* L, USER e); // 插入 // 读取文件 int Read_FILE(NODE* L); // 保存文件 int Save_FILE(NODE* L); // 菜单 void welcome(); // 主菜单 void fun_welcome(); // 主菜单功能 void menu_administrator(); // 管理员界面 void fun_administrator(); // 管理员功能 void menu_user(); // 用户界面 void fun_user(); // 用户功能 // 增加影片 void Add(NODE* L, NODE e); // 功能 void Add_Printf(); // 界面 // 查询影片 void Search_Printf(NODE* L); // 界面 int Search_allname(char name[], NODE* L); // 按名称进行查找 NODE* Search_name(char name[], NODE* L); // 按名称进行查找第一个 int Search_type(char type[], NODE* L); // 按类型进行查找 NODE* Search_id(int id, NODE* L); // 按编号进行查找 // 删除影片 void Delete_Printf(NODE* L); // 界面 void Delete(NODE* s); // 功能 // 修改影片 void Fix(NODE* L); // 显示影片 void Print(NODE* L); // 功能 void Print_Printf(); // 界面 // 排序影片 void Sort(NODE* L); int cmp_big_time(NODE e1, NODE e2); // 时长从大到小 int cmp_big_day(NODE e1, NODE e2); // 日期从大到小 int cmp_big_price(NODE e1, NODE e2); // 价格从大到小 int cmp_big_num(NODE e1, NODE e2); // 数量从大到小 int cmp_small_time(NODE e1, NODE e2); // 时长从小到大 int cmp_small_day(NODE e1, NODE e2); // 日期从小到大 int cmp_small_price(NODE e1, NODE e2); // 价格从小到大 int cmp_small_num(NODE e1, NODE e2); // 数量从小到大 // 购票 void Buy_ticket(); // 功能 int Buy_ticket_Printf(); // 界面 void Add2(TICKET* L, TICKET e); // 保存预定信息 int Save_TICKET(TICKET* L); // 文件保存售票信息 int Read_TICKET(TICKET* L); // 读取售票信息 // 取票 void Collect_ticket(); // 打印票务信息 void Print_ticket(TICKET* L); void Print_ticket_Printf(); // 退票 void Return_ticket(); void Print_ticket1(TICKET* L); // 打印信息 TICKET* Find_ticket(TICKET* L, char username[]); // 查找前驱节点 void Delete_ticket(TICKET* s); // 删除 // 退出系统 void goodbye(); int main() { Read_FILE(&list); Read_TICKET(&c); Read_user(&b); while (1) { fun_welcome(); } return 0; } // 主菜单 void welcome() { system("cls"); printf("****************************************************************\n"); printf("*********** 影院管理系统 ***********\n"); printf("*********** 1 ---- 管理员 ***********\n"); printf("*********** 2 ---- 用户 ***********\n"); printf("*********** 0 ---- 退出 ***********\n"); printf("****************************************************************\n"); printf("【系统】请选择你的身份(数字):"); } // 主菜单功能 void fun_welcome() { int choice = 0; welcome(); scanf("%d", &choice); switch (choice) { case 1:// 管理员 fun_administrator(); break; case 2:// 用户 fun_user(); break; case 0:// 退出 goodbye(); break; } } // 管理员界面 void menu_administrator() { system("cls"); printf("【系统】欢迎%s!!!\n", username); printf("****************************************************************\n"); printf("*********** 欢迎!!! ***********\n"); printf("*********** 1 ---- 增加影片 ***********\n"); printf("*********** 2 ---- 显示影片 ***********\n"); printf("*********** 3 ---- 查找影片 ***********\n"); printf("*********** 4 ---- 修改影片 ***********\n"); printf("*********** 5 ---- 删除影片 ***********\n"); printf("*********** 6 ---- 排序影片 ***********\n"); printf("*********** 0 ---- 退出 ***********\n"); printf("****************************************************************\n"); printf("【系统】请选择你要实现的功能(数字):"); } // 管理员功能 void fun_administrator() { fun_Login_admin(); if (flag == 1) { int choice = 0; while (1) { menu_administrator(); scanf("%d", &choice); switch (choice) { case 1:// 增加影片 Add_Printf(); break; case 2:// 显示影片 Print(&list); break; case 3:// 查找影片 Search_Printf(&list); break; case 4:// 修改影片 Fix(&list); break; case 5:// 删除影片 Delete_Printf(&list); break; case 6:// 排序影片 Sort(&list); break; case 0:// 退出 return; } printf("是否需要继续操作?(Yes:1 / No:0):"); scanf("%d", &choice); if (choice != 1) { if (choice != 0) printf("输入错误!!!\n"); system("pause"); break; } } } } // 用户界面 void menu_user() { system("cls"); printf("【系统】欢迎%s!!!\n", username); printf("****************************************************************\n"); printf("*********** 欢迎光临!! ***********\n"); printf("*********** 1 ---- 购票 ***********\n"); printf("*********** 2 ---- 取票 ***********\n"); printf("*********** 3 ---- 退票 ***********\n"); printf("*********** 0 ---- 退出 ***********\n"); printf("****************************************************************\n"); printf("【系统】请选择您要实现的功能(数字):"); } // 用户功能 void fun_user() { fun_Login_user(); if (flag == 1) { int choice = 0; while (1) { menu_user(); scanf("%d", &choice); switch (choice) { case 1:// 购票 Buy_ticket(); break; case 2:// 取票 Collect_ticket(); break; case 3:// 退票 Return_ticket(); break; case 0:// 退出 return; } system("cls"); printf("【系统】是否需要继续操作?(Yes:1 / No:0):"); scanf("%d", &choice); if (choice != 1) { if (choice != 0) printf("【系统】输入错误!!!\n"); system("pause"); break; } } } } // 管理员登录界面 void menu_Login_admin() { system("cls"); printf("****************************************************************\n"); printf("*********** 管理员登录 ***********\n"); printf("*********** 1 ---- 登录 ***********\n"); printf("*********** 0 ---- 退出 ***********\n"); printf("****************************************************************\n"); printf("【系统】请选择你要实现的功能(数字):"); } // 管理员登录功能 void fun_Login_admin() { int choice = 0; menu_Login_admin(); scanf("%d", &choice); switch (choice) { case 1:// 登录 admin_login(); break; case 0:// 退出 flag = 0; return; } } // 管理员登录 void admin_login() { int cnt = 0; do { printf("【系统】请输入用户名:"); scanf("%s", username); getchar(); printf("【系统】请输入密码:"); char c; int i = 0; while ((c = getch()) != '\r') { password[i] = c; i++; putchar('*'); } printf("\n"); password[i] = '\0'; cnt++; } while (Read_admin_login() == 0 && cnt < 3); } // 管理员登录文件读取 int Read_admin_login() { FILE* fp = fopen("admin.txt", "r"); if (fp == NULL) { return 0; } while (fscanf(fp, "%s %s", fusername, fpassword) != EOF) { fscanf(fp, "\n"); if ((strcmp(fusername, username) == 0) && (strcmp(fpassword, password)) == 0) { printf("【系统】登陆成功\n"); getch(); system("cls"); flag = 1; return 1; } } printf("【系统】用户名或密码错误,请重新输入\n"); getch(); system("pause"); return 0; } // 用户登录界面 void menu_Login_user() { system("cls"); printf("****************************************************************\n"); printf("*********** 用户登录 ***********\n"); printf("*********** 1 ---- 注册 ***********\n"); printf("*********** 2 ---- 登录 ***********\n"); printf("*********** 0 ---- 退出 ***********\n"); printf("****************************************************************\n"); printf("请选择你要实现的功能(数字):"); } // 用户登录功能 void fun_Login_user() { int choice = 0; menu_Login_user(); scanf("%d", &choice); switch (choice) { case 1: user_logon(&b); case 2: user_login(&b); break; case 0: flag = 0; return; } } // 用户登录 void user_login(USER* L) { int cnt = 0; do { printf("【系统】请输入用户名:"); scanf("%s", username); getchar(); printf("【系统】请输入密码:"); char c; int i = 0; while ((c = getch()) != '\r') { password[i] = c; i++; putchar('*'); } printf("\n"); password[i] = '\0'; cnt++; } while (Read_user_login(L) == 0 && cnt < 3); } int Read_user(USER* L) { FILE* fp = fopen("user.txt", "r"); if (fp == NULL) { return 0; } USER st; USER* s = NULL; USER* t = L; while (fscanf(fp, "%s %s", st.id, st.password) != EOF) { s = (USER*)malloc(sizeof(USER)); *s = st; // 尾插法 t->next = s; t = s; t->next = NULL; } fclose(fp); // 打开文件后记得关闭 return 1; } // 用户登录文件读取 int Read_user_login(USER* L) { USER* q = L->next; while (q != NULL) { if ((strcmp(q->id, username) == 0) && (strcmp(q->password, password)) == 0) { printf("登陆成功\n"); getch(); system("cls"); flag = 1; return 1; } q = q->next; } printf("【系统】用户名或密码错误,请重新输入\n"); getch(); system("pause"); return 0; } // 用户注册 int user_logon(USER* L) { FILE* pf = fopen("user.txt", "w"); if (pf == NULL) { return 0; } USER st; printf("请输入用户名:"); scanf("%s", st.id); printf("请输入密码:"); scanf("%s", st.password); Add1(&b, st); USER* p = L->next; while (p != NULL) { fprintf(pf, "%s %s\n", p->id, p->password); p = p->next; } fclose(pf); system("cls"); printf("注册成功!\n"); } // 插入 void Add1(USER* L, USER e) { // 头插法 USER* p = L; USER* s = (USER*)malloc(sizeof(USER)); *s = e; s->next = p->next; p->next = s; } // 读取文件 int Read_FILE(NODE* L) { FILE* pfRead = fopen("ticket.txt", "r"); NODE st; NODE* s = NULL; NODE* t = L; if (pfRead == NULL) { return 0; } while (fscanf(pfRead, "%s %s %d %s %s %s %d %d %d", st.name, st.type, &st.time, st.day, st.start, st.site, &st.price, &st.num, &st.id) != EOF) { // 读取座位表 for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 10; j++) { fscanf(pfRead, "%d ", &st.seat[i][j]); } fscanf(pfRead, "\n"); } s = (NODE*)malloc(sizeof(NODE)); *s = st; // 尾插法 t->next = s; t = s; t->next = NULL; } fclose(pfRead); // 打开文件后记得关闭 return 1; } // 保存文件 int Save_FILE(NODE* L) { FILE* pfWrite = fopen("ticket.txt", "w"); if (pfWrite == NULL) { return 0; } NODE* p = L->next; while (p != NULL) { fprintf(pfWrite, "%s %s %d %s %s %s %d %d %d\n", p->name, p->type, p->time, p->day, p->start, p->site, p->price, p->num, p->id); // 保存座位表 for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 10; j++) { fprintf(pfWrite, "%d ", p->seat[i][j]); } fprintf(pfWrite, "\n"); } p = p->next; } // 打开文件后记得关闭 fclose(pfWrite); return 1; } // 增加影片 void Add_Printf() { system("cls"); NODE st; printf("【系统】请输入新增影片的相关信息:\n"); printf("名称:"); scanf("%s", st.name); printf("类型:"); scanf("%s", st.type); printf("时长:"); scanf("%d", &st.time); printf("日期:"); scanf("%s", st.day); printf("起始时间:"); scanf("%s", st.start); printf("地点:"); scanf("%s", st.site); printf("价格:"); scanf("%d", &st.price); printf("数量:"); scanf("%d", &st.num); printf("编号:"); scanf("%d", &st.id); for (int i = 1; i <= 10; i++) { for (int j = 1; j <= 10; j++) { st.seat[i][j] = 0; } } Add(&list, st); } void Add(NODE* L, NODE e) { // 头插法 NODE* p = L; NODE* s = (NODE*)malloc(sizeof(NODE)); *s = e; s->next = p->next; p->next = s; Save_FILE(L); } // 删除影片 void Delete_Printf(NODE* L) { system("cls"); int id; node* p; printf("【系统】请输入要删除的影片的编号:"); scanf("%d", &id); NODE* st = Search_id(id, L); p = st; if (st == NULL) { printf("找不到该影片!\n"); return; } st = st->next; printf("_________________________________________________________________________________________________________\n"); printf("|\t名称\t\t|类型\t|时长\t|日期\t\t|起始时间\t|地点\t|价格\t|数量\t|编号\t |\n"); printf("_________________________________________________________________________________________________________\n"); printf("_________________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t|%d\t |\n", st->name, st->type, st->time, st->day, st->start, st->site, st->price, st->num, st->id); printf("_________________________________________________________________________________________________________\n"); Delete(p); // 保存信息 Save_FILE(L); } void Delete(NODE* s) { NODE* t = s->next; s->next = t->next; t->next = NULL; free(t); } // 修改影片 void Fix(NODE* L) { system("cls"); int id; printf("【系统】请输入要修改的影片的编号:"); scanf("%d", &id); NODE* st = Search_id(id, L); if (st == NULL) { printf("无法找到该影片!\n"); return; } st = st->next; int choice = 0; while (1) { system("cls"); // 输出一次所要修改的影片信息 printf("_________________________________________________________________________________________________________\n"); printf("|\t名称\t\t|类型\t|时长\t|日期\t\t|起始时间\t|地点\t|价格\t|数量\t|编号\t|\n"); printf("_________________________________________________________________________________________________________\n"); printf("_________________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t|%d\t |\n", st->name, st->type, st->time, st->day, st->start, st->site, st->price, st->num, st->id); printf("_________________________________________________________________________________________________________\n"); printf("_________________________________________________________________________________________________________\n"); printf("|\t修改名称 ---- 1\t|\n"); printf("|\t修改类型 ---- 2\t|\n"); printf("|\t修改时长 ---- 3\t|\n"); printf("|\t修改日期 ---- 4\t|\n"); printf("|\t修改起始时间 ---- 5\t|\n"); printf("|\t修改地点 ---- 6\t|\n"); printf("|\t修改价格 ---- 7\t|\n"); printf("|\t修改数量 ---- 8\t|\n"); printf("|\t修改编号 ---- 9\t|\n"); printf("|\t退出 ---- 0\t|\n"); printf("________________________________\n"); printf("【系统】请输入要修改的信息:"); scanf("%d", &choice); switch (choice) { case 1: printf("【系统】请输入名称:"); scanf("%s", st->name); break; case 2: printf("【系统】请输入类型:"); scanf("%s", st->type); break; case 3: printf("【系统】请输入时长:"); scanf("%d", &st->time); break; case 4: printf("【系统】请输入日期:"); scanf("%s", st->day); break; case 5: printf("【系统】请输入起始时间:"); scanf("%s", st->start); break; case 6: printf("【系统】请输入地点:"); scanf("%s", st->site); break; case 7: printf("【系统】请输入价格:"); scanf("%d", &st->price); break; case 8: printf("【系统】请输入数量:"); scanf("%d", &st->num); break; case 9: printf("【系统】请输入编号:"); scanf("%d", &st->id); break; case 0: break; } printf("是否继续修改该影片信息?(Yes:1 / No:0):"); scanf("%d", &choice); if (choice == 0) { break; } } // 修改完成后该影片的信息 printf("_________________________________________________________________________________________________________\n"); printf("|\t名称\t\t|类型\t|时长\t|日期\t\t|起始时间\t|地点\t|价格\t|数量\t|编号\t|\n"); printf("_________________________________________________________________________________________________________\n"); printf("_________________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t|%d\t |\n", st->name, st->type, st->time, st->day, st->start, st->site, st->price, st->num, st->id); printf("_________________________________________________________________________________________________________\n"); // 保存信息 Save_FILE(L); } // 查询影片 void Search_Printf(NODE* L) { system("cls"); int choice = 0; printf("按照名称查询 ---- 1\n"); printf("按照类型查询 ---- 2\n"); printf("按照编号查询 ---- 3\n"); printf("【系统】请输入查询方式:"); scanf("%d", &choice); node* st; if (choice == 1) { char name[N]; int cnt = 0; printf("【系统】请输入要查询的影片名称:"); scanf("%s", name); cnt = Search_allname(name, L); if (cnt == 0) { printf("无法找到该类型的影片!\n"); } } else if (choice == 2) { char type[N]; int cnt = 0; printf("【系统】请输入要查询的影片类型:"); scanf("%s", type); cnt = Search_type(type, L); if (cnt == 0) { printf("无法找到该类型的影片!\n"); } } else if (choice == 3) { int id; printf("【系统】请输入要查询的影片编号:"); scanf("%d", &id); st = Search_id(id, L); if (st == NULL) { printf("查无此人!\n"); } else { st = st->next; printf("_________________________________________________________________________________________________________\n"); printf("|\t名称\t\t|类型\t|时长\t|日期\t\t|起始时间\t|地点\t|价格\t|数量\t|编号\t |\n"); printf("_________________________________________________________________________________________________________\n"); printf("_________________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t|%d\t |\n", st->name, st->type, st->time, st->day, st->start, st->site, st->price, st->num, st->id); printf("_________________________________________________________________________________________________________\n"); } } } // 按名称进行查找 int Search_allname(char name[], NODE* L) { int cnt = 0; node* p = L; while (p->next != NULL) { p = p->next; if (strcmp(name, p->name) == 0) { cnt++; if (cnt == 1) { printf("_________________________________________________________________________________________________________\n"); printf("|\t名称\t\t|类型\t|时长\t|日期\t\t|起始时间\t|地点\t|价格\t|数量\t|编号\t |\n"); printf("_________________________________________________________________________________________________________\n"); } printf("_________________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t|%d\t |\n", p->name, p->type, p->time, p->day, p->start, p->site, p->price, p->num, p->id); printf("_________________________________________________________________________________________________________\n"); } } return cnt; } // 按名称进行查找第一个 NODE* Search_name(char name[], NODE* L) { NODE* p = L; while (p->next != NULL) { if (strcmp(name, p->next->name) == 0) { return p; } p = p->next; } return NULL; } // 按编号进行查找 NODE* Search_id(int id, NODE* L) { NODE* p = L; while (p->next != NULL) { if (p->next->id == id) { return p; } p = p->next; } return NULL; } // 按类型进行查找 int Search_type(char type[], NODE* L) { int cnt = 0; node* p = L; while (p->next != NULL) { p = p->next; if (strcmp(type, p->type) == 0) { cnt++; if (cnt == 1) { printf("_________________________________________________________________________________________________________\n"); printf("|\t名称\t\t|类型\t|时长\t|日期\t\t|起始时间\t|地点\t|价格\t|数量\t|编号\t |\n"); printf("_________________________________________________________________________________________________________\n"); } printf("_________________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t|%d\t |\n", p->name, p->type, p->time, p->day, p->start, p->site, p->price, p->num, p->id); printf("_________________________________________________________________________________________________________\n"); } } return cnt; } // 显示影片 void Print(NODE* L) { system("cls"); node* p = L->next; Print_Printf(); if (p != NULL) { while (p != NULL) { printf("_________________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t|%d\t |\n", p->name, p->type, p->time, p->day, p->start, p->site, p->price, p->num, p->id); printf("_________________________________________________________________________________________________________\n"); p = p->next; } } } void Print_Printf() { printf("_________________________________________________________________________________________________________\n"); printf("|\t名称\t\t|类型\t|时长\t|日期\t\t|起始时间\t|地点\t|价格\t|数量\t|编号\t |\n"); printf("_________________________________________________________________________________________________________\n"); } // 排序影片 void Sort(NODE* L) { system("cls"); int choice = 0; printf("按照时长从大到小排序 ---- 1\n"); printf("按照时长从小到大排序 ---- 2\n"); printf("按照日期从大到小排序 ---- 3\n"); printf("按照日期从小到大排序 ---- 4\n"); printf("按照价格从大到小排序 ---- 5\n"); printf("按照价格从小到大排序 ---- 6\n"); printf("按照数量从大到小排序 ---- 7\n"); printf("按照数量从小到大排序 ---- 8\n\n"); printf("【系统】请选择排序方式:"); scanf("%d", &choice); int flag = 0; for (node* p = L->next; p != NULL; p = p->next) { for (node* q = p; q != NULL; q = q->next) { switch (choice) { case 1: if (!cmp_big_time(*p, *q)) { flag = 1; } break; case 2: if (!cmp_small_time(*p, *q)) { flag = 1; } break; case 3: if (!cmp_big_day(*p, *q)) { flag = 1; } break; case 4: if (!cmp_small_day(*p, *q)) { flag = 1; } break; case 5: if (!cmp_big_price(*p, *q)) { flag = 1; } break; case 6: if (!cmp_small_price(*p, *q)) { flag = 1; } break; case 7: if (!cmp_big_num(*p, *q)) { flag = 1; } break; case 8: if (!cmp_small_num(*p, *q)) { flag = 1; } break; } if (flag == 1) { // 交换数据域 node t = *p; *p = *q; *q = t; // 处理指针域 t.next = p->next; p->next = q->next; q->next = t.next; flag = 0; } } } printf("【系统】排序成功!\n"); } // 时长从大到小 int cmp_big_time(NODE e1, NODE e2) { return e1.time > e2.time; } // 日期从大到小 int cmp_big_day(NODE e1, NODE e2) { return strcmp(e1.day, e2.day) >= 0 ? 1 : 0; } // 价格从大到小 int cmp_big_price(NODE e1, NODE e2) { return e1.price > e2.price; } // 数量从大到小 int cmp_big_num(NODE e1, NODE e2) { return e1.num > e2.num; } // 时长从小到大 int cmp_small_time(NODE e1, NODE e2) { return e1.time < e2.time; } // 日期从小到大 int cmp_small_day(NODE e1, NODE e2) { return strcmp(e1.day, e2.day) < 0 ? 1 : 0; } // 价格从小到大 int cmp_small_price(NODE e1, NODE e2) { return e1.price < e2.price; } // 数量从小到大 int cmp_small_num(NODE e1, NODE e2) { return e1.num < e2.num; } // 文件保存售票信息 int Save_TICKET(TICKET* L) { FILE* pfWrite = fopen("ticket1.txt", "w"); if (pfWrite == NULL) { return 0; } TICKET* p = L->next; while (p != NULL) { fprintf(pfWrite, "%s %s %d %s %s %s %d %d %s %d %d %d\n", p->name, p->type, p->time, p->day, p->start, p->site, p->price, p->id, p->username, p->x, p->y, p->istake); p = p->next; } // 打开文件后记得关闭 fclose(pfWrite); return 1; } // 读取售票信息 int Read_TICKET(TICKET* L) { FILE* pfRead = fopen("ticket1.txt", "r"); TICKET st; TICKET* s = NULL; TICKET* t = L; if (pfRead == NULL) { return 0; } while (fscanf(pfRead, "%s %s %d %s %s %s %d %d %s %d %d %d\n", st.name, st.type, &st.time, st.day, st.start, st.site, &st.price, &st.id, st.username, &st.x, &st.y, &st.istake) != EOF) { s = (TICKET*)malloc(sizeof(TICKET)); *s = st; // 尾插法 t->next = s; t = s; t->next = NULL; } fclose(pfRead); // 打开文件后记得关闭 return 1; } // 购票 void Buy_ticket() { do { Sort(&list); system("pause"); Print(&list); } while (Buy_ticket_Printf() == 0); } int Buy_ticket_Printf() { TICKET s; // 记录票务信息 int id; printf("【系统】请输入您要购买的影片的编号:"); scanf("%d", &id); system("cls"); node* st = Search_id(id, &list); if (st == NULL) { printf("【系统】无法找到该影片!\n"); int choice; printf("【系统】请选择是否要继续购票?(Yes:1 / No:0):"); scanf("%d", &choice); if (choice == 1) return 0; else if (choice == 0) return 1; else { printf("输入错误\n"); system("pause"); return 1; } } st = st->next; printf("【系统】该影片的信息如下:\n"); printf("_________________________________________________________________________________________________________\n"); printf("|\t名称\t\t|类型\t|时长\t|日期\t\t|起始时间\t|地点\t|价格\t|数量\t|编号\t |\n"); printf("_________________________________________________________________________________________________________\n"); printf("_________________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t|%d\t |\n", st->name, st->type, st->time, st->day, st->start, st->site, st->price, st->num, st->id); printf("_________________________________________________________________________________________________________\n"); printf("【系统】座位示意图如下:(■表示已预定,□表示未预定)\n"); printf(" "); for (int i = 1; i <= 10; i++) { printf("%3d", i); } printf("\n"); for (int i = 1; i <= 10; i++) { printf("%4d", i); for (int j = 1; j <= 10; j++) { if (st->seat[i][j] == 0) printf(" □"); else printf(" ■"); } printf("\n"); } int a; printf("【系统】请选择您要购买的数量:"); scanf("%d", &a); for (int i = 0; i < a; i++) { printf("【系统】请选择您要购买的座位号:\n"); int x, y; printf("行(1-10):"); scanf("%d", &x); printf("列(1-10):"); scanf("%d", &y); if (st->seat[x][y] == 0) { st->seat[x][y] = 1; st->num = st->num - 1; } else { printf("【系统】预定失败,该座位已被预定\n"); int choice; printf("【系统】请选择是否要继续购票?(Yes:1 / No:0):"); scanf("%d", &choice); if (choice == 1) return 0; else if (choice == 0) return 1; else { printf("输入错误\n"); system("pause"); return 1; } } // 记录订单信息 strcpy(s.name, st->name); strcpy(s.type, st->type); s.time = st->time; strcpy(s.day, st->day); strcpy(s.start, st->start); strcpy(s.site, st->site); s.price = st->price; s.id = st->id; strcpy(s.username, username); s.x = x; s.y = y; s.istake = 0; Add2(&c, s); printf("【系统】预定成功\n"); } system("pause"); system("cls"); printf("【系统】您的订单信息如下:\n"); printf("_________________________________________________________________________________________________\n"); printf("|\t名称\t\t|类型\t|时长\t|日期\t\t|起始时间\t|地点\t|价格\t|数量\t|\n"); printf("_________________________________________________________________________________________________\n"); printf("_________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t|\n", st->name, st->type, st->time, st->day, st->start, st->site, st->price * a, a); printf("_________________________________________________________________________________________________\n"); system("pause"); Save_FILE(&list); return 1; } // 保存预定信息 void Add2(TICKET* L, TICKET e) { // 头插法 TICKET* p = L; TICKET* s = (TICKET*)malloc(sizeof(TICKET)); *s = e; s->next = p->next; p->next = s; Save_TICKET(L); } // 取票 void Collect_ticket() { system("cls"); Print_ticket(&c); Save_TICKET(&c); } void Print_ticket(TICKET* L) { TICKET* p = L->next; int cnt = 0, choice = 0; if (p != NULL) { while (p != NULL && strcmp(p->username, username) == 0 && p->istake==0) { printf("【系统】您的订单如下:\n"); Print_ticket_Printf(); printf("______________________________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t |%-10s|%d\t|%-5d|\n", p->name, p->type, p->time, p->day, p->start, p->site, p->price, p->id, p->username, p->x, p->y); printf("______________________________________________________________________________________________________________________\n"); printf("【系统】是否取票?(Yes:1 / No:0):"); scanf("%d", &choice); if (choice != 1) { if (choice != 0) printf("【系统】输入错误!!!\n"); } else { p->istake = 1; printf("【系统】取票成功!!!\n"); } system("pause"); p = p->next; cnt++; } } if (cnt == 0) printf("【系统】抱歉,您当前无票可取。\n"); } void Print_ticket_Printf() { system("cls"); printf("______________________________________________________________________________________________________________________\n"); printf("|\t名称\t\t|类型\t|时长\t|日期\t\t|起始时间\t|地点\t|价格\t|编号\t |购票人 |行\t|列 |\n"); printf("______________________________________________________________________________________________________________________\n"); } // 退票 void Return_ticket() { system("cls"); printf("【系统】您的订单如下:\n"); system("pause"); Print_ticket1(&c); Save_TICKET(&c); } // 打印信息 void Print_ticket1(TICKET* L) { TICKET* s = L; TICKET* p = NULL, * q = NULL; int cnt = 0, choice = 0; while (1) { q = Find_ticket(s, username); if (q == NULL) break; p = q; Print_ticket_Printf(); printf("______________________________________________________________________________________________________________________\n"); printf("|%-15s\t|%s\t|%d\t|%s\t|%s\t\t|%s\t|%d\t|%d\t |%-10s|%d\t|%-5d|\n", q->next->name, q->next->type, q->next->time, q->next->day, q->next->start, q->next->site, q->next->price, q->next->id, q->next->username, q->next->x, q->next->y); printf("______________________________________________________________________________________________________________________\n"); printf("【系统】是否退票?(Yes:1 / No:0):"); scanf("%d", &choice); if (choice != 1) { if (choice != 0) printf("【系统】输入错误!!!\n"); q = q->next; } else if(choice == 1) { NODE* r = Search_id(q->next->id, &list); r->next->num = r->next->num + 1; r->next->seat[q->next->x][q->next->y] = 0; printf("%d,%d\n", r->next->num, r->next->seat[p->next->x][p->next->y]); Save_FILE(&list); Delete_ticket(p); } system("pause"); s = q; cnt++; } if (cnt == 0) printf("【系统】抱歉,您当前无票可退。\n"); } // 查找前驱节点 TICKET* Find_ticket(TICKET* L, char username[]) { TICKET* p = L; while (p->next != NULL) { if (strcmp(username, p->next->username) == 0) { return p; } p = p->next; } return NULL; } // 删除 void Delete_ticket(TICKET* s) { TICKET* t = s->next; s->next = t->next; t->next = NULL; free(t); } // 退出系统 void goodbye() { system("cls"); printf("欢迎下次使用影院售票管理系统!"); exit(0); }
总结
终于写完了课设,耗时蛮久的,不过也算是巩固了一些C语言知识了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。