课设影院信息管理系统
一.影院具体信息介绍:
1.人员分类:
负责人,管理者,售票者,顾客
2.人员涉及的功能:
负责人:注册管理者和售票者账号信息
管理者:管理影片信息,增删修改
售票者:查询影片信息
顾客:排序票价,查阅电影信息,统计票价信息
二.代码分块功能
调用的函数:
/*页面显示函数*/
void menu();//系统主页面
void menu1();//管理者系统的页面显示
void menu2();//售票人员的页面显示
void menu3();//顾客人员的页面显示
void menu4();//负责人员的页面显示
void ad();
/*用户的登录和注册*/
void Input();//登录注册
int Input_login();//登录
/*文件函数*/
void save(film *head);//文件保存
film *read();//文件读写
/*链表创建增删改查*/
film *creat_Film();//链表的创建
void Delete(film *head);//链表的删除
void add_film(film *head);//链表的添加
void change(film *head);//链表的修改
void output(film *head);//遍历子函数
void output_film();//遍历主函数
/*链表查询*/
void search(film *head);//单项查询子函数,两种查询方式
void search_film();//单项查询主函数
void Search_film();//组合查询
/*链表统计*/
void statistic(film *head);//统计票价
void sort(film *head);//按票价排序
int len(film *head);//求链表长度
/*影院不同类型人员函数*/
void charge(); //影院负责人员
void manger();//影院管理人员
void sale_people();//影院售票人员
void buy_people();//顾客人员
主要功能代码块:
1.注册用户信息
//登录注册
void Input()
{
system("read"); //暂停
system("cls");
users a,b;//结构体 The_users 重命名定义
FILE *fp;
char temp[20];
printf("\t\t\t\t -------------欢迎来到注册界面!-----------------\n");
Sleep(1000);
printf("\t\t\t\t 请输入用户名:");
scanf("\t\t\t\t\t\t\t%s",a.id);
printf("\t\t\t\t 请输入密码:");
scanf("\t\t\t\t\t\t\t%s",a.pwd);
printf("\t\t\t\t 请确认密码:");
scanf("\t\t\t\t\t\t\t%s",temp);
do
{
if(!strcmp(a.pwd,temp)){
fp = fopen("D:\\user.text","a");
fwrite(&a, sizeof(struct The_users), 1, fp);
printf("\t\t\t\t 账号注册成功,请登录!\n");
Sleep(500);
fclose(fp);
system("read"); //暂停
system("cls");
return;
}else
{
printf("\t\t\t\t 两次密码不匹配!请重新输入!\n");
scanf("\t\t\t\t\t\t%s",a.pwd);
printf("\t\t\t\t 请确认密码:\n");
scanf("\t\t\t\t\t\t%s",temp);
}
}while(1);
}
2.用户登录信息:
int Input_login()
{
system("read");
system("cls");
users a,b;//定义结构体The_users别名
FILE *fp;
printf("\t\t\t\t ----------- 欢迎来到登录界面! -----------------\n");
Sleep(1000);
fp = fopen("D:\\user.text","r");
fread(&b, sizeof(struct The_users), 1, fp);
printf("\t\t\t\t 请输入账号:");
scanf("\t\t\t\t\t\t\t\t%s",a.id);
while (1)
{
if (strcmp(a.id, b.id)==0) //如果有此用户名
{
break;
}
else
{
if (!feof(fp)) //如果文件没有读完
{
fread(&b, sizeof(struct The_users), 1, fp);
}
else
{
printf("\t\t\t\t 此用户名不存在,请重新输入!\n");
Sleep(500);
fclose(fp);
return 0;
}
}
}
printf("\t\t\t\t 请输入密码:");
scanf("\t\t\t\t\t\t\t\t\t%s",a.pwd);
do
{
if (strcmp(a.pwd, b.pwd)==0) /*如果密码匹配*/
{
fclose(fp);
printf("\t\t\t\t 登录成功,欢迎使用!");
Sleep(500);
return 1;
}
else
{ printf("\t\t\t\t 密码不正确!请重新输入密码:");
scanf("\t\t\t\t\t\t\t\t%s",&a.pwd);
}
}while(strcmp(a.pwd, b.pwd)==0);
}
3.文件保存
//文件的保存
void save(film *head)
{
film *p;
FILE *fp;
char str[40];
printf("\n\t\t\t\t 请输入要保存的文件名:");
scanf("\t\t\t\t\t\t\t\t\t\t\t\t%s",str);
if((fp=fopen(str,"wt"))==NULL)
{
printf("\t\t\t\t 写文件出错,按任意键退出!");
getchar();
exit(1);
}
for(p=head->next;p!=NULL;p=p->next)//
{
fprintf(fp,"%s\t%s\t%d\t%.2lf\t ",p->num,p->name,p->money,p->score);
}
printf("\n\t\t\t\t 文件已成功保存,按任意键返回!\n");
getchar();
fclose(fp);
return;
}
4.文件读写
//文件的读写
film *read()
{
film *ghead=NULL,*r=NULL,*p;
FILE *fp;
char name[40];
printf("\n\t\t\t\t 请输入要打开的文件名:");
scanf("%s",name);
if((fp=fopen(name,"rt"))==NULL)
{
printf("\n\t\t\t\t 写文件出错,按任意键退出!\n");
printf("\t\t\t\t 请创建链表\n");
system("read");
return 0;
}
while(!feof(fp))
{
p=(film *)malloc(sizeof(film)); //开辟空间
fscanf(fp,"%s\t%s\t%d\t%lf ",p->num,p->name,&p->money,&p->score);
if(ghead==NULL)
{
ghead=p;
ghead->next=NULL;
}
else
{
r->next=p;
p->next=NULL;
}
r=p;
}
fclose(fp);
printf("\n\t\t\t\t 文件信息正确读入,按任意键退出!\n");
getchar();
return ghead;
}
5.影片信息录入
//录入信息
film *creat_Film()
{
int n,i;
film *head, *node, *end;
head=(film*)malloc(sizeof(film)); //开辟空间 ,初始化头指针
end=head;
do
{
node=(film*)malloc(sizeof(film));//每读入一个数,都会创建一个新的空间
printf("\t\t\t\t ***********************************************\n");
printf("\t\t\t\t * 欢迎进入电影信息录入界面 *\n");
printf("\t\t\t\t ***********************************************\n");
printf("\t\t\t\t * 输入电影编号 *\n");
printf("\t\t\t\t\t\t ");
scanf("%s",node->num);
printf("\t\t\t\t * 录入电影名称 *\n");
printf("\t\t\t\t\t\t ");
scanf("%s",node->name);
printf("\t\t\t\t * 录入电影票价 *\n");
printf("\t\t\t\t\t\t ");
scanf("%d",&node->money);
printf("\t\t\t\t * 录入电影评价 *\n");
printf("\t\t\t\t\t\t ");
scanf("%lf",&node->score);
printf("\t\t\t\t ---------------【录入电影信息完成】-----------*\n");
printf("\t\t\t\t ***********************************************\n");
end->next=node; //尾插新节点
end=node; //指向尾结点
printf("\t\t\t\t * 1.是\t2.否 *\n");
printf("\t\t\t\t * 请输入是否要录入数据: *\n");
printf("\t\t\t\t\t\t ");
scanf("%d",&n);
}while(n==1);
end->next=NULL;//尾节点的指针域指向空
return head;
}
6.影片信息的删除
//删除信息
void Delete(film *head)
{
int n;
char i[20];
film *p,*p1=head;
p=p1->next;
printf("\t\t\t\t * 请输入 1 进行删除操作:");
scanf("%d",&n);
switch(n)
{
case 1:
printf("\t\t\t\t * 请输入要删除的编号:");
scanf("%s",i);
while(p!=NULL)
{
if(strcmp(p->num,i)==0) //比较要删除的编号与p所指的编号
{
printf("\t\t\t\t * 【以下是你要删除的电影信息】\n\n");
printf("\t\t\t\t *%s\t%s\t%d\t%.2lf\t\n",p->num,p->name,p->money,p->score);
p1->next=p->next; //将p所指的下一个结点的地址赋值给上一个结点
free(p); //释放空间
printf("\t\t\t\t -----------------【已经安全删除】--------------\n");
}
p1=p;
p=p->next;
}
break;
default:
printf("\t\t\t\t ------------【输入非法!请重新输入】------------\n");
break;
}
}
7.影片信息的添加
//添加电影信息
void add_film(film *head)
{
int n;
char i[20];
film *p=head,*p1;
printf("\t\t\t\t * 请输入 1 进行插入操作:");
scanf("%d",&n);
switch(n)
{
case 1:
printf("\t\t\t\t * 请输入编号(会插入在其后):");
scanf("%s",i);
while(p!=NULL)
{
if(strcmp(p->num,i)==0)//比较要添加处的编号与p所指的编号
{
p1=(film*)malloc(sizeof(film)); //开辟空间
printf("\t\t\t\t * 输入电影编号 *\n");
printf("\t\t\t\t\t\t ");
scanf("%s",p1->num);
printf("\t\t\t\t * 录入电影名称 *\n");
printf("\t\t\t\t\t\t ");
scanf("%s",p1->name);
printf("\t\t\t\t * 录入电影票价 *\n");
printf("\t\t\t\t\t\t ");
scanf("%d",&p1->money);
printf("\t\t\t\t * 录入电影评价 *\n");
printf("\t\t\t\t\t\t ");
scanf("%lf",&p1->score);
printf("\t\t\t\t *添加电影信息完成 *\n");
p1->next=p->next;//将p点的下一个结点的地址赋值给新建的结点的next
p->next=p1;//将新节点的地址值赋值给p点所指的next
}
p=p->next;
}
break;
default:
printf("\t\t\t\t ---------【输入非法!请重新输入】--------------\n");
break;
}
}
8.影片信息的修改
//修改电影信息
void change(film *head)
{
int n,j;
film *p;
char i[20];
printf("\t\t\t\t 1.编号\t2.票价\n");
printf("\t\t\t\t 请输入你要修改的项目:");
scanf("%d",&n);
switch(n)
{
case 1:
p=head;
printf("\t\t\t\t 请输入要修改的编号:");
scanf("%s",i);
while(p!=NULL)
{
if(strcmp(p->num,i)==0)//比较读入的编号与想要修改的编号
{
printf("\t\t\t\t 输入想修改为的编号:");
scanf("%s",p->num);
printf("\t\t\t\t ------------【修改完成】----------------------\n");
}
p=p->next;
}
break;
case 2:
p=head;
printf("\t\t\t\t 请输入要修改的编号:");
scanf("%s",&i);
printf("\t\t\t\t 请输入要修改的票价:");
scanf("%d",&j);
while(p!=NULL)
{
if(p->money==j&&strcmp(p->num,i)==0)//比较想要修改的价格和修改的编号是否一致
{
printf("\t\t\t\t 输入想修改为的票价是:");
scanf("%d",&p->money);
printf("\t\t\t\t ------------【修改完成】----------------------\n");
}
p=p->next;
}
break;
}
}
9.链表的遍历输出
void output(film *head)
{
film *p=head;
//system("clear");
printf("\t\t\t\t *********************************************************\n");
printf("\t\t\t\t *\t\t 影院影片列表 \t\t\t*\n");
printf("\t\t\t\t ********************************************************\n");
printf("\t\t\t\t *编号\t名称\t票价\t评价\t*\n");
while(p!=NULL) //遍历链表
{
printf("\t\t\t\t *%s\t%s\t%d\t%lf\t*\n",p->num,p->ame,p->money,p->score);
p=p->next;//每次指向下一个
}
printf("\t\t\t\t *********************************************************\n\n");
}
void output_film()
{
film *q;
q=read();//打开文件,读出所储存的数据,重新创建一个链表并返回头指针
output(q);
printf("\t\t\t\t ------------------【影片遍历完成】-----------------------\n");
}
10.链表信息单项查询
//单项查询
void search(film *head)
{
int n,j,flag=0;
char i[40];
film *p=head;
printf("\t\t\t\t 1.编号\t2.名称\t3.票价\t4.评价\t\n");
printf("\t\t\t\t 请输入你要查询的项目:");
scanf("%d",&n);
switch(n)
{
case 1:
printf("\t\t\t\t 请输入编号:");
scanf("%s",i);
printf("\t\t\t\t 1.编号\t2.名称\t3.票价\t4.评价\t\n");
while(p!=NULL)
{
if(strcmp(p->num,i)==0)
{
printf("\t\t\t\t *%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
}
p=p->next;
}
break;
case 2:
printf("\t\t\t\t 请输入名称:");
scanf("\t\t\t\t\t\t%s",&i);
printf("\t\t\t\t 1.编号\t2.名称\t3.票价\t4.评价\t\n");
while(p!=NULL)
{
if(strcmp(p->name,i)==0)
{
printf("\t\t\t\t *%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
flag=1;
}
p=p->next;
}
if(flag==0)
printf("\t\t\t\t *输入信息错误*\n");
break;
}
}
11.信息组合查询
//组合查询主函数
void search_film()
{
film *q;
q=read();
search(q);
printf("\t\t\t\t ----------------【定向查询完成】------------------\n");
}
//组合查询
void Search_film()
{
film *p;
int flag=0;
p=read();
char i[100],a[100];
printf("\t\t\t\t 请输入编号:");
scanf("%s",i);
printf("\n\t\t\t\t 请输入名称:");
scanf("%s",a);
printf("\t\t\t\t 1.编号\t2.名称\t3.票价\t4.评价\t\n");
while(p!=NULL)
{
if(strcmp(p->name,a)==0&&strcmp(p->num,i)==0)
{
printf("*\t\t\t\t\t\t%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
flag=1;
}
p=p->next;
}
if(flag==0)
printf("\t\t\t\t *输入信息错误*\n");
}
12.链表信息统计
//统计
void statistic(film *head)
{
int count1=0,count2=0,n;
film *p;
printf("\t\t\t\t 1.票价50元以下\t2.票价票价50元以下,评分5.0以上\n");
printf("\t\t\t\t 请选择统计方式:");
scanf("%d",&n);
switch(n)
{
case 1:
p=head;
while(p!=NULL)
{
if(p->money<50)
count1++;
p=p->next;
}
printf("\t\t\t\t 票价50元一下的有%d种\n",count1);
break;
case 2:
p=head;
while(p!=NULL)
{
if(p->money<50&&p->score>5.0)
count2++;
p=p->next;
}
printf("\t\t\t\t 票价50元一下的,评分5.0以上的有%d种\n",count2);
break;
default :
printf("\t\t\t\t 输入类型错误,结束\n");
break;
}
}
13.链表排序
//求链表长度
int len(film *head)
{
film *p;
int i;
p=head->next;
for(i=1;p!=NULL;i++)//当p不为NULL时,i++
{
p=p->next;
}
return i;//返回链表的长度
}
//链表的排序
void sort(film *head) //采用了冒泡排序
{
int n,j,h,ii,num;
char i;
film *p,*q,*head1;
head1 = (film *)malloc(sizeof(film));//初始化头指针,创建头节点
head1->next = head;
num=len(head1);//接收链表的长度
printf("\t\t\t\t 1.票价从低向高\t2.票价从高到低\n");
printf("\t\t\t\t 请选择排序方式:");
scanf("%d",&n);
switch(n)
{
case 1:
for(ii=0;ii<num-1;ii++)
{
p=head1;//p指向头结点
q=head1->next;//q指向首节点
while(q->next!=NULL)//循环进行的条件
{
if( q->money > q->next->money ) //当q所指的money大于q所指的下一个节点的money时,进入
{
p->next = q->next;//将q所指的下一个节点的地址值赋值给p所指的next
q->next = q->next->next;//将q所指的节点的下一个节点赋值给q所指的next
p->next->next = q;//重新链接两个交换的节点
q=p->next;//重新让p指向q的相邻节点
}
q=q->next;
p=p->next;//q与p均向后移动
}
}
printf("\t\t\t\t --------------【排序已经完成】--------------\n");
p=head1->next;//p指向首节点
while(p!=NULL)//对排序好的链表进行遍历
{
printf("\t\t\t\t *%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
p=p->next;//p向后移动
}
break;
case 2:
for(ii=0;ii<num-1;ii++)
{
p=head1;
q=head1->next;
while(q->next!=NULL)
{
if(q->money < q->next->money)
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=p->next;
//printf("%d %d\n",q->money,p->money);
}
q=q->next;
p=p->next;
}
}
printf("\t\t\t\t --------------【排序已经完成】--------------\n");
p=head1->next;
while(p!=NULL)
{
printf("\t\t\t\t *%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
p=p->next;
}
break;
default:
printf("\t\t\t\t --------【输入异常!!!请重新输入】-------\n");
break;
}
}
三.课设总代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
//定义电影院信息结构
typedef struct Film
{
char num[20];
char name[20];
int money;
double score;
struct Film *next;
}film;
//定义登录人员信息
typedef struct The_users
{
char id[11];
char pwd[20];
}users;
/*页面显示函数*/
void menu();//系统主页面
void menu1();//管理者系统的页面显示
void menu2();//售票人员的页面显示
void menu3();//顾客人员的页面显示
void menu4();//负责人员的页面显示
void ad();
/*用户的登录和注册*/
void Input();//登录注册
int Input_login();//登录
/*文件函数*/
void save(film *head);//文件保存
film *read();//文件读写
/*链表创建增删改查*/
film *creat_Film();//链表的创建
void Delete(film *head);//链表的删除
void add_film(film *head);//链表的添加
void change(film *head);//链表的修改
void output(film *head);//遍历子函数
void output_film();//遍历主函数
/*链表查询*/
void search(film *head);//单项查询子函数,两种查询方式
void search_film();//单项查询主函数
void Search_film();//组合查询
/*链表统计*/
void statistic(film *head);//统计票价
void sort(film *head);//按票价排序
int len(film *head);//求链表长度
/*影院不同类型人员函数*/
void charge(); //影院负责人员
void manger();//影院管理人员
void sale_people();//影院售票人员
void buy_people();//顾客人员
void menu()
{
printf("\t\t\t\t ***********************************************\n");
printf("\t\t\t\t ***************欢迎来到XX影院****************\n");
printf("\t\t\t\t ******************您是*************************\n");
printf("\t\t\t\t ***********************************************\n");
printf("\t\t\t\t ******** 1.影院负责人@_@ ***************\n");
printf("\n");
printf("\t\t\t\t ******* 2.影院管理人员@_@ ***************\n");
printf("\n");
printf("\t\t\t\t ******* 3.影院售票人员@_@ ***************\n");
printf("\n");
printf("\t\t\t\t ******* 4.顾客@_@ ***************\n");
printf("\n");
printf("\t\t\t\t ******* 5.影院宣传 ***************\n");
printf("\n");
printf("\t\t\t\t 选择你的类型:");
}
void menu1()
{
printf("\t\t\t\t ********************************************\n");
printf("\n");
printf("\t\t\t\t ********* 欢迎来到管理页面 ************\n");
printf("\n");
printf("\t\t\t\t ******** 1.录入电影信息@_@ ************\n");
printf("\n");
printf("\t\t\t\t ******** 2.修改电影信息@_@ ************\n");
printf("\n");
printf("\t\t\t\t ******** 3.删除电影信息@_@ ************\n");
printf("\n");
printf("\t\t\t\t ******** 4.添加电影信息@_@ ************\n");
printf("\n");
printf("\t\t\t\t ******** 0.退出当前界面 ************\n");
printf("\n");
printf("\t\t\t\t 选择你的类型:");
}
void menu2()
{
printf("\n\t\t\t\t ***************************************************\n");
printf("\n");
printf("\t\t\t\t ******** 欢迎来到售卖页面 ***********\n");
printf("\n");
printf("\t\t\t\t ******** 1.单项查询某部电影信息@_@ ***********\n");
printf("\n");
printf("\t\t\t\t ******** 2.组合查询某部电影信息@_@ ***********\n");
printf("\n");
printf("\t\t\t\t ******* 3.查阅所有电影信息@_@ ***********\n");
printf("\n");
printf("\t\t\t\t ******* 0.退出当前界面@_@ ***********\n");
printf("\n");
printf("\t\t\t\t 选择你的类型:");
}
void menu3()
{
printf("\t\t\t\t ************************************************\n");
printf("\n");
printf("\t\t\t\t *************顾客你好,欢迎来到青柠影院*********\n");
printf("\t\t\t\t ******气势恢宏的视听效果,给你真的尊贵体验*****\n");
printf("\n");
printf("\t\t\t\t ******** 1.将票价排序 ***********\n");
printf("\n");
printf("\t\t\t\t ******* 2.查阅所有电影信息@_@ ***********\n");
printf("\n");
printf("\t\t\t\t ******* 3.统计票价信息@_@ ***********\n");
printf("\n");
printf("\t\t\t\t ******* 0.退出当前界面@_@ ***********\n");
printf("\n");
printf("\t\t\t\t 选择你的类型:");
}
void menu4()
{
printf("\t\t\t\t *************************************************\n");
printf("\n");
printf("\t\t\t\t *************欢迎来到管理高层页面****************\n");
printf("\n");
printf("\t\t\t\t ******** 1.增加管理人员 ********************\n");
printf("\n");
printf("\t\t\t\t ******* 2.增加售票人员 ********************\n");
printf("\n");
printf("\t\t\t\t ******* 0.退出当前界面 ********************\n");
printf("\n");
printf("\t\t\t\t 选择你的类型:");
}
void ad()
{
Sleep(1);
printf("\t\t\t\t ******** 在我的心里 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 其实一直有座电影院 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 放映着我的心情 我的梦 我的渴望 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 有的是我的亲人 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 我的朋友 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 或者陌生人 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 拥有入场卷的人 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 有的是我的亲人 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 我的朋友 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 或者陌生人 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 他们纷纷穿梭在我的人生里,来了又去 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 而第一个入场的爱人,去没想到会是你 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 就像许多电影预告片 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 有时看了反而不精彩 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 也许我们都走过许多相同的地方...... ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 看过很多相同的风景...... ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 遇见过很多相同的陌路人...... ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 然后再某个不经意的瞬间, ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 我遇见了你 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 于是我想 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 一切那么的突然 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 突然到像是上天的安排 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 令人感到无限的惊喜 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 邂逅该是多么美丽的语言啊 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 幸福一直静静的存在那里 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 以甜美的莫名的悸动召唤着 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 等待着我 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 我知道终有一天 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 抬起手我就能够触碰到它 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 亲爱的 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 无论是曾经 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 现在还是将来 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 在我都会是你生活的基石 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 是你最坚强的后盾 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 你是美好的未来 ***********\n");
Sleep(1);
printf("\t\t\t\t ******** 我会给你无尽的希望 ***********\n");
Sleep(10000);
}
//登录注册
void Input()
{
system("read"); //暂停
system("cls");
users a,b;//结构体 The_users 重命名定义
FILE *fp;
char temp[20];
printf("\t\t\t\t -------------欢迎来到注册界面!-----------------\n");
Sleep(1000);
printf("\t\t\t\t 请输入用户名:");
scanf("\t\t\t\t\t\t\t%s",a.id);
printf("\t\t\t\t 请输入密码:");
scanf("\t\t\t\t\t\t\t%s",a.pwd);
printf("\t\t\t\t 请确认密码:");
scanf("\t\t\t\t\t\t\t%s",temp);
do
{
if(!strcmp(a.pwd,temp)){
fp = fopen("D:\\user.text","a");
fwrite(&a, sizeof(struct The_users), 1, fp);
printf("\t\t\t\t 账号注册成功,请登录!\n");
Sleep(500);
fclose(fp);
system("read"); //暂停
system("cls");
return;
}else
{
printf("\t\t\t\t 两次密码不匹配!请重新输入!\n");
scanf("\t\t\t\t\t\t%s",a.pwd);
printf("\t\t\t\t 请确认密码:\n");
scanf("\t\t\t\t\t\t%s",temp);
}
}while(1);
}
/*登录系统*/
int Input_login()
{
system("read");
system("cls");
users a,b;//定义结构体The_users别名
FILE *fp;
printf("\t\t\t\t ----------- 欢迎来到登录界面! -----------------\n");
Sleep(1000);
fp = fopen("D:\\user.text","r");
fread(&b, sizeof(struct The_users), 1, fp);
printf("\t\t\t\t 请输入账号:");
scanf("\t\t\t\t\t\t\t\t%s",a.id);
while (1)
{
if (strcmp(a.id, b.id)==0) //如果有此用户名
{
break;
}
else
{
if (!feof(fp)) //如果文件没有读完
{
fread(&b, sizeof(struct The_users), 1, fp);
}
else
{
printf("\t\t\t\t 此用户名不存在,请重新输入!\n");
Sleep(500);
fclose(fp);
return 0;
}
}
}
printf("\t\t\t\t 请输入密码:");
scanf("\t\t\t\t\t\t\t\t\t%s",a.pwd);
do
{
if (strcmp(a.pwd, b.pwd)==0) /*如果密码匹配*/
{
fclose(fp);
printf("\t\t\t\t 登录成功,欢迎使用!");
Sleep(500);
return 1;
}
else
{ printf("\t\t\t\t 密码不正确!请重新输入密码:");
scanf("\t\t\t\t\t\t\t\t%s",&a.pwd);
}
}while(strcmp(a.pwd, b.pwd)==0);
}
//文件的保存
void save(film *head)
{
film *p;
FILE *fp;
char str[40];
printf("\n\t\t\t\t 请输入要保存的文件名:");
scanf("\t\t\t\t\t\t\t\t\t\t\t\t%s",str);
if((fp=fopen(str,"wt"))==NULL)
{
printf("\t\t\t\t 写文件出错,按任意键退出!");
getchar();
exit(1);
}
for(p=head->next;p!=NULL;p=p->next)//
{
fprintf(fp,"%s\t%s\t%d\t%.2lf\t ",p->num,p->name,p->money,p->score);
}
printf("\n\t\t\t\t 文件已成功保存,按任意键返回!\n");
getchar();
fclose(fp);
return;
}
//文件的读写
film *read()
{
film *ghead=NULL,*r=NULL,*p;
FILE *fp;
char name[40];
printf("\n\t\t\t\t 请输入要打开的文件名:");
scanf("%s",name);
if((fp=fopen(name,"rt"))==NULL)
{
printf("\n\t\t\t\t 写文件出错,按任意键退出!\n");
printf("\t\t\t\t 请创建链表\n");
system("read");
return 0;
}
while(!feof(fp))
{
p=(film *)malloc(sizeof(film)); //开辟空间
fscanf(fp,"%s\t%s\t%d\t%lf ",p->num,p->name,&p->money,&p->score);
if(ghead==NULL)
{
ghead=p;
ghead->next=NULL;
}
else
{
r->next=p;
p->next=NULL;
}
r=p;
}
fclose(fp);
printf("\n\t\t\t\t 文件信息正确读入,按任意键退出!\n");
getchar();
return ghead;
}
//录入信息
film *creat_Film()
{
int n,i;
film *head, *node, *end;
head=(film*)malloc(sizeof(film)); //开辟空间 ,初始化头指针
end=head;
do
{
node=(film*)malloc(sizeof(film));//每读入一个数,都会创建一个新的空间
printf("\t\t\t\t ***********************************************\n");
printf("\t\t\t\t * 欢迎进入电影信息录入界面 *\n");
printf("\t\t\t\t ***********************************************\n");
printf("\t\t\t\t * 输入电影编号 *\n");
printf("\t\t\t\t\t\t ");
scanf("%s",node->num);
printf("\t\t\t\t * 录入电影名称 *\n");
printf("\t\t\t\t\t\t ");
scanf("%s",node->name);
printf("\t\t\t\t * 录入电影票价 *\n");
printf("\t\t\t\t\t\t ");
scanf("%d",&node->money);
printf("\t\t\t\t * 录入电影评价 *\n");
printf("\t\t\t\t\t\t ");
scanf("%lf",&node->score);
printf("\t\t\t\t ---------------【录入电影信息完成】-----------*\n");
printf("\t\t\t\t ***********************************************\n");
end->next=node; //尾插新节点
end=node; //指向尾结点
printf("\t\t\t\t * 1.是\t2.否 *\n");
printf("\t\t\t\t * 请输入是否要录入数据: *\n");
printf("\t\t\t\t\t\t ");
scanf("%d",&n);
}while(n==1);
end->next=NULL;//尾节点的指针域指向空
return head;
}
//删除信息
void Delete(film *head)
{
int n;
char i[20];
film *p,*p1=head;
p=p1->next;
printf("\t\t\t\t * 请输入 1 进行删除操作:");
scanf("%d",&n);
switch(n)
{
case 1:
printf("\t\t\t\t * 请输入要删除的编号:");
scanf("%s",i);
while(p!=NULL)
{
if(strcmp(p->num,i)==0) //比较要删除的编号与p所指的编号
{
printf("\t\t\t\t * 【以下是你要删除的电影信息】\n\n");
printf("\t\t\t\t *%s\t%s\t%d\t%.2lf\t\n",p->num,p->name,p->money,p->score);
p1->next=p->next; //将p所指的下一个结点的地址赋值给上一个结点
free(p); //释放空间
printf("\t\t\t\t -----------------【已经安全删除】--------------\n");
}
p1=p;
p=p->next;
}
break;
default:
printf("\t\t\t\t ------------【输入非法!请重新输入】------------\n");
break;
}
}
//添加电影信息
void add_film(film *head)
{
int n;
char i[20];
film *p=head,*p1;
printf("\t\t\t\t * 请输入 1 进行插入操作:");
scanf("%d",&n);
switch(n)
{
case 1:
printf("\t\t\t\t * 请输入编号(会插入在其后):");
scanf("%s",i);
while(p!=NULL)
{
if(strcmp(p->num,i)==0)//比较要添加处的编号与p所指的编号
{
p1=(film*)malloc(sizeof(film)); //开辟空间
printf("\t\t\t\t * 输入电影编号 *\n");
printf("\t\t\t\t\t\t ");
scanf("%s",p1->num);
printf("\t\t\t\t * 录入电影名称 *\n");
printf("\t\t\t\t\t\t ");
scanf("%s",p1->name);
printf("\t\t\t\t * 录入电影票价 *\n");
printf("\t\t\t\t\t\t ");
scanf("%d",&p1->money);
printf("\t\t\t\t * 录入电影评价 *\n");
printf("\t\t\t\t\t\t ");
scanf("%lf",&p1->score);
printf("\t\t\t\t *添加电影信息完成 *\n");
p1->next=p->next;//将p点的下一个结点的地址赋值给新建的结点的next
p->next=p1;//将新节点的地址值赋值给p点所指的next
}
p=p->next;
}
break;
default:
printf("\t\t\t\t ---------【输入非法!请重新输入】--------------\n");
break;
}
}
//修改电影信息
void change(film *head)
{
int n,j;
film *p;
char i[20];
printf("\t\t\t\t 1.编号\t2.票价\n");
printf("\t\t\t\t 请输入你要修改的项目:");
scanf("%d",&n);
switch(n)
{
case 1:
p=head;
printf("\t\t\t\t 请输入要修改的编号:");
scanf("%s",i);
while(p!=NULL)
{
if(strcmp(p->num,i)==0)//比较读入的编号与想要修改的编号
{
printf("\t\t\t\t 输入想修改为的编号:");
scanf("%s",p->num);
printf("\t\t\t\t ------------【修改完成】----------------------\n");
}
p=p->next;
}
break;
case 2:
p=head;
printf("\t\t\t\t 请输入要修改的编号:");
scanf("%s",&i);
printf("\t\t\t\t 请输入要修改的票价:");
scanf("%d",&j);
while(p!=NULL)
{
if(p->money==j&&strcmp(p->num,i)==0)//比较想要修改的价格和修改的编号是否一致
{
printf("\t\t\t\t 输入想修改为的票价是:");
scanf("%d",&p->money);
printf("\t\t\t\t ------------【修改完成】----------------------\n");
}
p=p->next;
}
break;
}
}
//链表输出
void output(film *head)
{
film *p=head;
//system("clear");
printf("\t\t\t\t *********************************************************\n");
printf("\t\t\t\t *\t\t 影院影片列表 \t\t\t*\n");
printf("\t\t\t\t ********************************************************\n");
printf("\t\t\t\t *编号\t名称\t票价\t评价\t*\n");
while(p!=NULL) //遍历链表
{
printf("\t\t\t\t *%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
p=p->next;//每次指向下一个
}
printf("\t\t\t\t *********************************************************\n\n");
}
//链表的遍历
void output_film()
{
film *q;
q=read();//打开文件,读出所储存的数据,重新创建一个链表并返回头指针
output(q);
printf("\t\t\t\t ------------------【影片遍历完成】-----------------------\n");
}
//单项查询
void search(film *head)
{
int n,j,flag=0;
char i[40];
film *p=head;
printf("\t\t\t\t 1.编号\t2.名称\t3.票价\t4.评价\t\n");
printf("\t\t\t\t 请输入你要查询的项目:");
scanf("%d",&n);
switch(n)
{
case 1:
printf("\t\t\t\t 请输入编号:");
scanf("%s",i);
printf("\t\t\t\t 1.编号\t2.名称\t3.票价\t4.评价\t\n");
while(p!=NULL)
{
if(strcmp(p->num,i)==0)
{
printf("\t\t\t\t *%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
}
p=p->next;
}
break;
case 2:
printf("\t\t\t\t 请输入名称:");
scanf("\t\t\t\t\t\t%s",&i);
printf("\t\t\t\t 1.编号\t2.名称\t3.票价\t4.评价\t\n");
while(p!=NULL)
{
if(strcmp(p->name,i)==0)
{
printf("\t\t\t\t *%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
flag=1;
}
p=p->next;
}
if(flag==0)
printf("\t\t\t\t *输入信息错误*\n");
break;
}
}
//组合查询主函数
void search_film()
{
film *q;
q=read();
search(q);
printf("\t\t\t\t ----------------【定向查询完成】------------------\n");
}
//组合查询
void Search_film()
{
film *p;
int flag=0;
p=read();
char i[100],a[100];
printf("\t\t\t\t 请输入编号:");
scanf("%s",i);
printf("\n\t\t\t\t 请输入名称:");
scanf("%s",a);
printf("\t\t\t\t 1.编号\t2.名称\t3.票价\t4.评价\t\n");
while(p!=NULL)
{
if(strcmp(p->name,a)==0&&strcmp(p->num,i)==0)
{
printf("*\t\t\t\t\t\t%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
flag=1;
}
p=p->next;
}
if(flag==0)
printf("\t\t\t\t *输入信息错误*\n");
}
//统计
void statistic(film *head)
{
int count1=0,count2=0,n;
film *p;
printf("\t\t\t\t 1.票价50元以下\t2.票价票价50元以下,评分5.0以上\n");
printf("\t\t\t\t 请选择统计方式:");
scanf("%d",&n);
switch(n)
{
case 1:
p=head;
while(p!=NULL)
{
if(p->money<50)
count1++;
p=p->next;
}
printf("\t\t\t\t 票价50元一下的有%d种\n",count1);
break;
case 2:
p=head;
while(p!=NULL)
{
if(p->money<50&&p->score>5.0)
count2++;
p=p->next;
}
printf("\t\t\t\t 票价50元一下的,评分5.0以上的有%d种\n",count2);
break;
default :
printf("\t\t\t\t 输入类型错误,结束\n");
break;
}
}
//求链表长度
int len(film *head)
{
film *p;
int i;
p=head->next;
for(i=1;p!=NULL;i++)//当p不为NULL时,i++
{
p=p->next;
}
return i;//返回链表的长度
}
//链表的排序
void sort(film *head) //采用了冒泡排序
{
int n,j,h,ii,num;
char i;
film *p,*q,*head1;
head1 = (film *)malloc(sizeof(film));//初始化头指针,创建头节点
head1->next = head;
num=len(head1);//接收链表的长度
printf("\t\t\t\t 1.票价从低向高\t2.票价从高到低\n");
printf("\t\t\t\t 请选择排序方式:");
scanf("%d",&n);
switch(n)
{
case 1:
for(ii=0;ii<num-1;ii++)
{
p=head1;//p指向头结点
q=head1->next;//q指向首节点
while(q->next!=NULL)//循环进行的条件
{
if( q->money > q->next->money ) //当q所指的money大于q所指的下一个节点的money时,进入
{
p->next = q->next;//将q所指的下一个节点的地址值赋值给p所指的next
q->next = q->next->next;//将q所指的节点的下一个节点赋值给q所指的next
p->next->next = q;//重新链接两个交换的节点
q=p->next;//重新让p指向q的相邻节点
}
q=q->next;
p=p->next;//q与p均向后移动
}
}
printf("\t\t\t\t --------------【排序已经完成】--------------\n");
p=head1->next;//p指向首节点
while(p!=NULL)//对排序好的链表进行遍历
{
printf("\t\t\t\t *%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
p=p->next;//p向后移动
}
break;
case 2:
for(ii=0;ii<num-1;ii++)
{
p=head1;
q=head1->next;
while(q->next!=NULL)
{
if(q->money < q->next->money)
{
p->next=q->next;
q->next=q->next->next;
p->next->next=q;
q=p->next;
//printf("%d %d\n",q->money,p->money);
}
q=q->next;
p=p->next;
}
}
printf("\t\t\t\t --------------【排序已经完成】--------------\n");
p=head1->next;
while(p!=NULL)
{
printf("\t\t\t\t *%s\t%s\t%d\t%lf\t*\n",p->num,p->name,p->money,p->score);
p=p->next;
}
break;
default:
printf("\t\t\t\t --------【输入异常!!!请重新输入】-------\n");
break;
}
}
//负责人员主页面
void charge()
{
system("read"); //暂停
system("cls");
char temp[20],c;
int count = 0,n;
printf("\t\t\t\t 输入除0以外任意键,程序开始运行:");
scanf("\t\t\t\t\t\t%c",&c);
while(c!='0')
{
menu4();
scanf("\t\t\t\t\t\t%d",&n);
switch (n)
{
case 1:
Input();
break;
case 2:
Input();
break;
case 0:
break;
default :
printf("输入异常,请重新输入\n");
break;
}
if(n==0)
break;
}
return;
}
void manger()
{
system("read"); //暂停
system("cls");
int i=5,n,count;
film *p1=NULL;
while(1)
{
count=Input_login();
if(count==1) //字符串的比较,在查询功能中起到了作用
{
system("cls"); //清屏,没有这个会重复出现目录界面
do
{
menu1(); //菜单函数
scanf("%d",&n);
switch(n)
{
case 1:
printf("\t\t\t\t --------------【信息的录入】----------------\n");
p1=creat_Film();
break;
case 2:
printf("\t\t\t\t --------------【修改电影信息】--------------\n");
change(p1);
break;
case 3:
printf("\t\t\t\t --------------【删除电影信息】--------------\n");
Delete(p1);
break;
case 4:
printf("\t\t\t\t --------------【添加电影信息】---------------\n");
add_film(p1);
break;
case 0:
printf("\t\t\t\t -----------------结束------------------------\n");
break;
default:
printf("\t\t\t\t --------【输入异常!!!请重新输入】---------\n");
break;
}
}
while(n!=0);
save(p1);
return;
}
else
{
i--;
printf("\t\t\t\t 【输入错误】\n\t\t\t\t 【剩余输入次数为%d】\n",i);
}
}
if(i==0)
{
printf("\t\t\t\t ---------------【系统退出】------------------");
}
}
//售卖人员主函数
void sale_people()
{
system("read"); //暂停
system("cls");
int i=5,n;
int count=0;
while(1)
{
count=Input_login();
if(count==1) //字符串的比较,在查询功能中起到了作用
{
//system("cls"); //清屏,没有这个会重复出现目录界面
do
{
menu2(); //菜单函数
scanf("%d",&n);
switch(n)
{
case 1:
printf("\t\t\t\t --------【单项查询某部电影的信息】------------\n");
search_film();
break;
case 2:
printf("\t\t\t\t --------【组合查询某部电影的信息】------------\n");
Search_film();
break;
case 3:
printf("\t\t\t\t --------【浏览所有电影信息】-----------------\n");
output_film();
break;
case 0:
printf("\t\t\t\t --------------------结束---------------------\n");
break;
default:
printf("\t\t\t\t -------【输入异常!!!请重新输入】----------\n");
break;
}
}
while(n!=0);
return;
}
else
{
i--;
printf("\t\t\t\t 【输入错误】\n\t\t\t\t 【剩余输入次数为%d】\n",i);
}
}
if(i==0)
{
printf("\t\t\t\t ---------------【系统退出】---------------------");
}
return;
}
//顾客主函数
void buy_people()
{
system("read"); //暂停
system("cls");
int n,num;
printf("\t\t\t\t 请输入任意一个除零以外的数:");
scanf("%d",&n);
while(n!=0)
{
menu3();
scanf("%d",&num);
switch (num)
{
case 1:
sort(read());
break;
case 2:
printf("\t\t\t\t --------【浏览所有电影信息】-----------------\n");
output_film();
break;
case 3:
printf("\t\t\t\t --------【统计电影票】-----------------------\n");
statistic(read());
break;
case 0:
printf("\t\t\t\t ----------------【结束】----------------------\n");
break;
default:
printf("\t\t\t\t 输入情况不存在");
break;
}
if(num==0)
break;
}
return;
}
int main()
{
system("color 3E");
int n;
while(1)
{
menu();
scanf("\t\t\t\t %d",&n);
switch (n)
{
case 1:
charge();
break;
case 2:
manger();
break;
case 3:
sale_people();
break;
case 4:
buy_people();
break;
case 5:
ad();
break;
case 0:
break;
default :
printf("\t\t\t\t ************输入异常,请重新输入*******************\n");
break;
}
system("read"); //暂停
system("cls"); //清屏,没有这个会重复出现目录界面
if(n==0)
break;
}
return 0;
}
四.注意事项:
1.课设代码运行,由于管理者不同的功能函数调用之间传递的是头指针,当退出管理页面的时候,才会调用文件保存,一次性保存之后,如果再次调用管理者则之前保存的会被重写。
2.影院还有一个额外的功能,宣传广告
3.附一张函数调用图