C语言实现影院售票管理系统

2022-08-12 11:12:17

本文实例为大家分享了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;

实现功能:

C语言实现影院售票管理系统

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;

实现功能:

C语言实现影院售票管理系统

开发环境:VS2019

2、功能模块图

C语言实现影院售票管理系统

3、功能描述

(1)管理员

①增加影片:新增影片至系统中
②显示影片:显示系统中的所有影片信息
③查找影片:通过姓名、类型、编号查询影片信息
④修改影片:通过编号查询影片,修改影片信息
⑤删除影片:通过编号查询影片,删除影片信息
⑥排序影片:按照时长、日期、价格、数量排序影片信息

(2)用户

①购票:排序影片信息,显示影片信息,通过编号查询影片信息,购票后显示票务信息
②取票:显示票务信息,选择是否取票
③退票:显示票务信息,选择是否退票

4、调用关系图

C语言实现影院售票管理系统

二、完整代码

#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)
   {
   javascript 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(phttp://www.cppcns.comfRead); // 打开文件后记得关闭

 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语言知识了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。