前言
最近刚好在写自己的课设,匆匆忙忙写出来的课设系统,仍有不足,拿出来和大家分享一下,希望能对大家有帮助。
一、概要设计
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语言知识了,嘿嘿,共勉!