**影院管理系统基本运行图**
下面是实现全部功能的函数与解析与思路
**结构体与预定义**
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
typedef struct accout
{
char pass[20];
char name[20];
struct accout* next;
}mm, * MM;
typedef struct movie
{
char number[20];//电影序号
char name[20];//电影名称
int price;//电影价格
int grade;//电影评分
int time;//电影时长
struct movie* next;
} Linklist;
基本知识点
下面基本分为三大部分
一.登录与注册
1.注册函数
void Register(MM head)//注册
{
system("cls");//清屏
char username[20] = "";
char password[13] = "";
char pass[13] = "";
char q;
int i;
FILE* fp;
printf("\n\n\n");
printf("\t\t\t\t账号:");
scanf("%s", username);
getchar();
printf("\t\t\t\t密码:");
i = 0;
while (1)
{
q = getch();
if (q == '\r')
{
password[i] = '\0';
break;
}
else if (q == '\b')
{
printf("\b \b");
password[i++] = q;
}
else
{
password[i++] = q;
printf("*");
}
}
printf("\n");
printf("\t\t\t\t请确认密码");
i = 0;
while (1)
{
q = getch();
if (q != 13)
{
printf("*");
pass[i++] = q;
}
else
{
pass[i] = '\0';
printf("\n");
break;
}
}
if (strcmp(pass, password) == 0)
{
fp = fopen("d:\\课设\\accout.txt", "ab+");
fprintf(fp, "%s %s", username, password);//把内存中的文件输入到硬盘之中
fclose(fp);
system("cls");
printf("\n\n\n注册成功\n\n");
system("pause");
}
}
2.判断函数
MM judge(mm * head)//判断密码是否输入正确
{
char name1[20] = "", pass1[20] = "";
char q;
MM p1;
int i = 0, j = 0;
system("cls");
printf("\n\n\n\n");
while (1)
{
j++;
p1 = head->next;
printf("\t\t\t\t账号");
scanf("%s", name1);
getchar();
printf("\t\t\t\t密码");
i = 0;
while (1)
{
j++;
q = getch();
if (q == '\r')
{
pass1[i] = '\0';
break;
}
else if (q == '\b')
{
printf("\b \b");
pass1[i++] = q;
}
else
{
pass1[i++] = q;
printf("*");
}
}
while (p1 != NULL)
{
if (strcmp(name1, p1->name) == 0)
{
if (strcmp(pass1, p1->pass) == 0)
{
printf("\n\n\t\t登录成功");
system("pause");
return head;
}
else
{
printf("登陆失败");
system("pause");
}
}
else
{
p1 = p1->next;
}
}
if (p1 == NULL)
{
printf("\n\n\n\n\t\t\t\t输入有误");
system("cls");
break;
}
}
return head;
}
3./打开读取文件之前注册的账号和密码,
放到链表里面操作
MM AccountLibrary(MM head)//打开读取注册的账号和密码,放到链表里面
{ //用户数据库
FILE* fp1 = fopen("d:\\课设\\accout.txt", "r");
while (!feof(fp1))
//feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0
{
MM q = (MM)malloc(sizeof(mm));
fscanf(fp1, "\n%s%s\n", q->name, q->pass);
q->next = head;
head = q;
}
fclose(fp1);
return head;
}
4.用户或者管理员进行注册或者登录操作
以下代码为具体部分操作函数
int E=judge(head);//将E作为判断judge函数返回值的标志
if (!E)
guanliyuan();/user()
5.
5.登录主函数
void login()
{
system("cls");
int bk = 0;
int bb = 0;
MM head = 0, p1 = 0;
// char a[10]={0};
head = (mm*)malloc(sizeof(mm));
head->next = NULL;
while (1)
{
// char a[200];
// char b[200];
int a, b;
printf_d();
printf("请输入 ");
scanf("%d", &a);
switch (a)
{
case 1:
{//登录
printf1();
printf("请输入 ");
scanf("%d", &b);
switch (b)
{
case 1: {
AccountLibrary(head);//在文件中查找注册过的账号和密码
int E=judge(head);
if (!E)
guanliyuan();
}
case 2: {
//judge(head);//用户登录
AccountLibrary(head);
int E=judge(head);
if(!E)
user();
break;
}
case 0: {
printf("再见");
exit(0);
break;
}
default:printf("输入错误");
}
case 2:
{//注册
Register(head);
break;
}
case 0:
{//退出
printf("再见");
break;
}
}
}
}
}
二.管理员系统操作
管理员系统登录之后函数
void guanliyuan()//管理员系统
{
Linklist* head;
head = (Linklist*)malloc(sizeof(Linklist));
head->next = NULL;//创建头结点
//录入信息
int a = 0, b = 0;
while (1)
{
system("cls");
fflush(stdin);
printf2();
printf("请输入指令");
scanf("%d", &a);
fflush(stdin);
switch (a)
{
case 1://录入信息
{
head = Input();
Foutput(head);
system("cls");
break;
}
case 2://修改
{
head = read();
change(head);
Foutput(head);
system("cls");
break;
}
case 3://删除
{
head = read();
delete_1(head);
Foutput(head);
system("cls");
break;
}
case 4://排序
{
head = read();
sort(head);
output(head);
//Foutput(head);
system("cls");
break;
}
case 5://添加
{
head = read();
insert(head);
Foutput(head);
system("cls");
break;
}
case 6://查找
{
head = read();
fflush(stdin);
search(head);
system("cls");
break;
}
case 7://预览
preview();
break;
/*case 8://修改密码//砍掉的功能
{
MM head;
head = NULL;
printf("\t\t\t欢迎修改密码\n");
//head=duqu_cipher(head);
head = AccountLibrary(head);
change_cipher(head);
luru_cipher(head);
break;
}*/
case 0://退出系统
{
printf("感谢使用\n");
exit(1);
}
default: {
printf("输入错误!请重新输入");
system("pause");
break;
}
}
}
free(head);
}
1.录入信息
录入信息分为两部分
void Input_1(Linklist* pNew)//输入结点的值
{
int i = 0, j = 0, num = 0, sum = 0;
char ch = 0;
fflush(stdin);
//pNew = (Linklist*)malloc(sizeof(Linklist));
printf("请输入电影序号\n");
scanf("%s", pNew->number);
fflush(stdin);//清除缓存区数据
if (pNew->number[0] == '#')
return;
printf("请输入电影名称\n");
scanf("%s", pNew->name);
fflush(stdin);
printf("请输入电影价格\n");
scanf("%d", &pNew->price);
fflush(stdin);
printf("请输入电影评分\n");
scanf("%d", &pNew->grade);
fflush(stdin);
printf("请输入电影时长\n");
scanf("%d", &pNew->time);
fflush(stdin);
printf("\n");
}
Linklist* Input()//手动输入,录入信息链表
{
Linklist* head = NULL, * pEnd, * pNew;
pEnd = head = (Linklist*)malloc(sizeof(Linklist));
printf("电影序号输入#时停止输入");
pNew = (Linklist*)malloc(sizeof(Linklist));
Input_1(pNew);
while (pNew->number[0] != '#')//尾插法
{
pEnd->next = pNew;
pNew->next = NULL;
pEnd = pNew;
pNew = (Linklist*)malloc(sizeof(Linklist));
Input_1(pNew);
printf("\n");
}
Foutput(head);
free(pNew);//最后一个pNew是没有数据所以释放掉
return head;
}
2.修改
void change(Linklist* head)//修改
{
read();
int n, j, k, l, y;
char m[20] = "";
char i = 0;
Linklist* p = head;
printf("1.名称2.评分3.价格4.时长5.编号");
printf("请输入要修改的项目");
scanf("%d", &n);
switch (n)
{
case 1:
{
printf("请输入要修改的电影名称");
scanf("%s", m);
while (p != NULL)
{
if (strcmp(p->number, m) == 0)
{
printf("输入修改之后的名称");
scanf("%s", &p->name);
//strcpy()
printf("修改完成");
}
p = p->next;
}
}
case 2:
{
printf("请输入要修改的的电影评分");
scanf("%d", &j);
while (p != NULL)
{
if (p->grade == j)
{
printf("请输入修改之后的评分");
scanf("%d", &p->grade);
printf("修改成功");
}
}
}
case 3:
{
printf("请输入要修改的电影价格");
scanf("%d", &l);
while (p != NULL)
{
if (p->price == l)
{
printf("请输入修改之后的价格");
scanf("%d", &p->price);
printf("修改成功");
}
}
}
case 4:
{
printf("请输入要修改电影时长");
scanf("%d", &k);
while (p != NULL)
{
if (p->time == k)
{
printf("请输入修改之后的电影时长");
scanf("%d", &p->time);
printf("修改成功");
}
}
}
case 5:
{
printf("请输入要修改电影编号");
scanf("%d", &y);
while (p != NULL)
{
if (p->time == y)
{
printf("请输入修改之后的电影时长");
scanf("%d", &p->time);
printf("修改成功");
}
}
}
}
}
3.删除
void delete_1(Linklist* head)//删除
{
Linklist* p, * p1 = head;
p = p1->next;
int n, i;
char a[20];
printf("请输入1确认删除");
scanf("%d", &i);
switch (i)
{
case 1:
{
printf("请输入要删除的电影编号\n");
scanf("%s", a);
while (p != NULL)
{
if ((strcmp(p->number, a)) == 0)
{
printf("\t\t以下是要删除的电影信息\n\n");
printf("%s\t%s\t%d\t%d\t%d\n\n", p->number, p->name, p->price, p->grade, p->time);
p1->next = p->next;
free(p);
printf("删除完毕");
}
p1 = p;
p = p->next;
}
}
default:
{
printf("输入错误.....");
break;
}
}
}
4.排序
这里用得是链表冒泡排序
有点难理解,附图
void sort(Linklist* head)//单链表冒泡排序
{
int n;
Linklist* p, * q, * p1;
p1 = NULL;
printf("1.按票价从低到高排序2.按评分从低到高排序3.按时长从短到长排序\n");
printf("请选择排序方式");
scanf("%d", &n);
switch (n)
{
case 1:
{
while ((head->next->next) != p1)//相当于数组第一层循环
{
p = head;//一个数据
q = head->next;//下一个数据
while (q->next != p1)
{
if (q->price > q->next->price)
{
p->next = q->next; //第一步
q->next = q->next->next;//第二步
p->next->next = q;//第三步
q = p->next;//第四补3
}
q = q->next;//接着往后走
p = p->next;
}
p1 = q;//相当于数组比较的下一个外层
}
printf("排序完成");
output(head);
system("pause");
break;
}
case 2:
{
while ((head->next->next) != p1)//相当于数组第一层循环
{
p = head;//一个数据
q = head->next;//下一个数据
while (q->next != p1)
{
if (q->grade > q->next->grade)
{
p->next = q->next; //第一步
q->next = q->next->next;//第二步
p->next->next = q;//第三步
q = p->next;//第四补3
}
q = q->next;//接着往后走
p = p->next;
}
p1 = q;//相当于数组比较的下一个外层
}
printf("排序完成");
output(head);
break;
}
case 3:
{
while ((head->next->next) != p1)//相当于数组第一层循环
{
p = head;//一个数据
q = head->next;//下一个数据
while (q->next != p1)
{
if (q->time > q->next->time)
{
p->next = q->next; //第一步
q->next = q->next->next;//第二步
p->next->next = q;//第三步
q = p->next;//第四补3
}
q = q->next;//接着往后走
p = p->next;
}
p1 = q;//相当于数组比较的下一个外层
}
printf("排序完成");
output(head);
break;
}
}
}
5.添加
void insert(Linklist* head)//添加新的电影信息
{
Linklist* p = head, * p1;
//p=p1->next;
int n, i;
printf("请输入1进行添加信息操作");
scanf("%d", &n);
switch (n)
{
case 1:
{
printf("请输入要插入信息前面的电影编号");
scanf("%d", &i);
while (p != NULL)
{
if (atoi(p->number) == i)
{
p1 = (Linklist*)malloc(sizeof(Linklist));//开辟新的空间
printf("请输入电影编号");
scanf("%s", p->number);
printf("请输入电影名称");
scanf("%s", p->name);
printf("请输入电影价格");
scanf("%d", &p->price);
printf("请输入电影评分");
scanf("%d", &p->grade);
printf("请输入电影时长");
scanf("%d", &p->time);
printf("电影信息添加完毕");
p1->next = p->next;//
p->next = p;
}
p = p->next;//遍历
}
}
default:
{
printf("输入错误。。。。");
}
}
Foutput(head);
}
*6.查找
void search(Linklist* head) //查询
{
Linklist* p = head;
//int n;
char a[20] = "";
printf("请输入要查询电影编号");
scanf("%s", a);
while (p != NULL)
{
if ((strcmp(p->number, a)) == 0)
{
printf("编号\t名称\t价格\t评分\t时长\n");
printf("%s\t%s\t%d\t%d\t%d\t\t", p->number, p->name, p->price, p->grade, p->time);
break;
}
p = p->next;
}
system("pause");
}
三.用户操作系统
用户登录主函数
void user()
{
fflush("stdin");
Linklist* head;
head = (Linklist*)malloc(sizeof(Linklist));
head->next = NULL;
int n;
printf3();
printf("请输入要选择的操作");
scanf("%d", &n);
system("pause");
char c[20] = "";
// printf("")
switch (n)
{
case 1:
{
printf("\t\t\t欢迎预览\n");
preview();
system("pause");
break;
}
case 2:
{
printf("\t\t欢迎来到查询系统\n");
head = read();
fflush(stdin);
search(head);
system("cls");
break;
}
case 3:
{
printf("\t\t\t欢迎来到购票系统\n");
head = read();
fflush(stdin);
Linklist* p = head;
//p = (Linklist*)malloc(sizeof(Linklist));
printf("\t\t\t请输入要购买电影的编号\n");
scanf("%s", c);
//printf("ggdggd");
while (p)
{
if ((strcmp(p->number, c)) == 0)
{
printf("*****************************");
printf("|--------电影名字%s----------|\n", p->name);
printf("|--------电影价格%d----------|\n", p->price);
printf("|--------电影时间%d----------|\n", p->time);
printf("|--------恭喜购票成功--------|\n");
printf("|----------------------------|\n");
printf("*****************************");
system("pause");
break;
}
p = p->next;
}
break;
}
case 4:
{
printf("感谢使用");
exit(1);
}
}
}
预览
void preview()
{
printf("\t\t***********************************************\n");
printf("\t\t| 电影名称:Captain America 价格: 35 |\n");
printf("\t\t| 评分:9 时长: 135 |\n");
printf("\t\t***********************************************\n");
printf("\t\t***********************************************\n");
printf("\t\t| 电影名称:The Shawshank Redemption 价格:36 |\n");
printf("\t\t| 评分:8 时长:126 |\n");
printf("\t\t***********************************************\n");
printf("\t\t***********************************************\n");
printf("\t\t| 电影名称:Citizen Kane Redemption 价格:34 \n");
printf("\t\t| 评分:10 时长:123 |\n");
printf("\t\t***********************************************\n");
printf("\t\t***********************************************\n");
printf("\t\t| 电影名称:Casablanca 价格:32 |\n");
printf("\t\t| 评分:6 时长:157 |\n");
printf("\t\t***********************************************\n");
printf("\t\t***********************************************\n");
printf("\t\t| 电影名称:The Godfather Part II 价格:31 |\n");
printf("\t\t| 评分:5 时长:134 |\n");
printf("\t\t***********************************************\n");
}
四.文件操作
void Foutput(Linklist* head)//电影信息录入文件
{
Linklist* pt = head;
FILE* fp;
pt = pt->next;
fp = fopen("d:\\课设\\dgw.txt", "wt+");
if (fp == NULL)
{
printf("文件打开失败");
exit(1);
}
while (pt)
{
fprintf(fp, "%s %s %d %d %d", pt->number, pt->name, pt->price, pt->grade, pt->time);
pt = pt->next;
}
fclose(fp);
}
五.打印函数实现
void printf2()
{
system("cls");
printf("\t\t\t|*******************************|\n");
printf("\t\t\t| 欢迎来到影院管理系统(管理员) |\n");
printf("\t\t\t|*******************************|\n");
printf("\t\t\t| 1.录入信息 |\n");
printf("\t\t\t| 2.修改 |\n");
printf("\t\t\t| 3.删除 |\n");
printf("\t\t\t| 4.排序 |\n");
printf("\t\t\t| 5.添加 |\n");
printf("\t\t\t| 6.查询 |\n");
printf("\t\t\t| 7.预览 |\n");
printf("\t\t\t|-------------------------------|\n");
printf("\t\t\t|-------------------------------|\n");
printf("\t\t\t| 0.退出程序 |\n");
printf("\t\t\t|===============================|\n");
printf("\t\t\t请选择你需要的操作\t\t");
}//管理员系统菜单
void printf3()//用户登录界面
{
system("cls");
printf("\t\t\t|*******************************|\n");
printf("\t\t\t| 欢迎来到影院管理系统(个人用户)|\n");
printf("\t\t\t|*******************************|\n");
printf("\t\t\t| 1.预览 |\n");
printf("\t\t\t| 2.查询 |\n");
printf("\t\t\t| 3.购票并打印报表 |\n");
printf("\t\t\t| 0.退出程序 |\n");
printf("\t\t\t|===============================|\n");
}
void printf_d()
{
system("cls");
printf("\n\n\n\n");
printf("\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆\n");
printf("\t\t\t☆ ★\n");
printf("\t\t\t☆ 1.登录 ★\n");
printf("\t\t\t☆ 2.注册 ★\n");
printf("\t\t\t★ 0.退出 ☆\n");
printf("\t\t\t☆ ★\n");
printf("\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆\n");
}//登录
void printf1()//不同用户登录
{
system("cls");
printf("\n\n\n\n");
printf("\t\t\t********************************\n");
printf("\t\t\t|| ||\n");
printf("\t\t\t|| 1.管理员登录 ||\n");
printf("\t\t\t|| 2.用户登录 ||\n");
printf("\t\t\t|| 0.退出 ||\n");
printf("\t\t\t|| ||\n");
printf("\t\t\t********************************\n");
}