当前位置:网站首页>C语言课设:影院售票管理系统
C语言课设:影院售票管理系统
2022-07-05 03:42:00 【WE-ubytt】
前言
最近刚好在写自己的课设,匆匆忙忙写出来的课设系统,仍有不足,拿出来和大家分享一下,希望能对大家有帮助。
一、概要设计
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语言知识了,嘿嘿,共勉!
边栏推荐
- [move pictures up, down, left and right through the keyboard in JS]
- 优先使用对象组合,而不是类继承
- About MySQL database connection exceptions
- Analysis of glibc strlen implementation mode
- Kubernetes - Multi cluster management
- [an Xun cup 2019] not file upload
- Performance of calling delegates vs methods
- How to use jedis of redis
- NEW:Devart dotConnect ADO. NET
- [groovy] loop control (number injection function implements loop | times function | upto function | downto function | step function | closure can be written outside as the final parameter)
猜你喜欢
UE4 DMX和grandMA2 onPC 3.1.2.5的操作流程
Enterprise level: spire Office for . NET:Platinum|7.7. x
Clickhouse物化视图
为什么百度、阿里这些大厂宁愿花25K招聘应届生,也不愿涨薪5K留住老员工?
Yyds dry goods inventory embedded matrix
Resolved (sqlalchemy+pandas.read_sql) attributeerror: 'engine' object has no attribute 'execution_ options‘
JWT漏洞复现
测试开发是什么?为什么现在那么多公司都要招聘测试开发?
error Couldn‘t find a package. JSON file in "your path“
UI自动化测试从此告别手动下载浏览器驱动
随机推荐
postman和postman interceptor的安装
ABP vNext microservice architecture detailed tutorial - distributed permission framework (Part 1)
Assembly - getting started
Why is there a reincarnation of 60 years instead of 120 years in the tiangan dizhi chronology
[web Audit - source code disclosure] obtain source code methods and use tools
English essential vocabulary 3400
[system security] ten thousand words summary system virtualization container bottom layer principle experiment
花了2晚,拿到了吴恩达@斯坦福大学的机器学习课程证书
Enterprise level: spire Office for . NET:Platinum|7.7. x
【软件逆向-基础知识】分析方法、汇编指令体系结构
Soul 3: what is interface testing, how to play interface testing, and how to play interface automation testing?
NPM introduction link symbolic link
Official announcement! The third cloud native programming challenge is officially launched!
Technology sharing swift defense programming
我就一写代码的,王总整天和我谈格局...
一文带你了解BI的前世今身与企业数字化转型的关系
De debugging (set the main thread as hidden debugging to destroy the debugging Channel & debugger detection)
【刷题】BFS题目精选
ABP vNext microservice architecture detailed tutorial - distributed permission framework (Part 2)
UI自动化测试从此告别手动下载浏览器驱动