**影院管理系统基本运行图**

电影院管理系统课程设计java 电影院系统数据流程图_数据

下面是实现全部功能的函数与解析与思路
**结构体与预定义**
#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.排序

这里用得是链表冒泡排序

有点难理解,附图

电影院管理系统课程设计java 电影院系统数据流程图_电影院管理系统课程设计java_02

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");
}

电影院管理系统课程设计java 电影院系统数据流程图_#include_03