这里给到大家介绍一个自己写的C语言课设的代码,代码功能不是很完善,只有很基础的增删改查
题目 :电影院选票系统
功能 :放映厅 ,电影信息的 增删改查,以及排序
系统要求实现以下功能:
1、输入功能:录入电影/放映厅 信息(包括放映厅编号,名称,初始位置,行列,和电影编号,名称,所在放映厅 等);
2、显示功能:完成管理员记录的显示。
3、查找功能:完成按编号或位置查找放映厅/电影的相关记录,并显示。
分步实施:1、初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数。2、完成信息的录入和显示(即通过编程创建文件,输入电影/放映厅 信息并可将文件内容显示出来)3、完成修改功能,即输入编号,可修改该电影的信息4、进一步要求,在使用修改功能时要求输入密码,密码正确才能修改信息否则不行。
要求:1、用C语言实现程序设计;
2、利用结构体数组、链表等实现学生信息表达、查询等,充分体现数据结构的知识;
3、系统的各个功能模块要求用函数的形式实现;
4、界面友好(良好的人机交互),程序要有注释。
5、程序中所用到的排序查找方法需采用数据结构中所学方法实现,要求方法实用效率高。、
头文件
每一个头文件都有不同的用处:<stdio.h>就是我们必须要写的头文件,包括这输入和输出函数
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <windows.h>
下面来看一看,这里是我定义的所有结构体
定义出需要的结构体,后面的代码会用到这里的结构体
// 先定义需要定义的东西
struct movieHouse
{
char houseNum[20]; // 放映厅编号
char houseName[20]; // 放映厅名称
int housrow; //放映厅行数
int housecol; // 放映厅列数
char houseState [101]; // 放映厅初始位置
movieHouse * next;
};// 定义一个放映厅
struct Movie
{
char movieNum[20]; //电影编号
char movieName[20]; //电影名称
double price ; //电影单价
char date[20]; // 电影放映日期
char time[20]; // 放映时间
char movieHouse[20]; //所在放映厅编号
char setState[101]; //当前状态
Movie *next;
}; //电影信息
struct Order
{
char custName[20]; //顾客用户名
char movieName[20]; //电影名称
int ticketNum; // 购买数量
char set[40]; // 所选座位
double ticketCost; // 总价格
char OrderDate[20]; //购买日期
Order *next;
};// 定义顾客订单
struct Customer{
char CustName[20]; //顾客名称
char CustCode[20]; // 密码
}; // 顾客
// 定义结束
这里是我用到的函数
我们知道需要声明函数,而函数也可以帮你理清楚自己的思维,可以在码代码前想一想自己想要实现的功能,以此就可以编写出自己需要的函数,函数的功能,这样码代码的时候就会轻松很多,当然,也可以自己先画一个思维图,在哪个模块要实现什么功能。
void ManageLogin(); //管理员登录
void CustomerLogin(); // 用户登录
//int ReadManagerFile (FILE *fp,Manager s[]); // manager.txt 中的管理员个数
int ReadCustomerFile (FILE *fp,Customer t[]); //customer.txt 中用户名的个数
void HouseControl(); //放映厅管理
void MovieControl(); // 电影场次管理
Order * MovieOrder(Order *ohead,char name[]);//电影订票
void Ordercheck(Order *ohead, char name[]);//查看订票
movieHouse *Create_House_Doc(); // 创建放映厅链表
movieHouse *Insert_House_Doc(movieHouse *head,movieHouse *p); // 放映厅链表的插入 增加放映厅数据
void print_House_Doc(movieHouse *head); // 遍历链表 ,输出放映厅信息
movieHouse* Delete_House_Doc(movieHouse * head,char houseNum[]) ;// 删除放映厅数据
void After_House_Doc(movieHouse *head); // 修改已有放映厅的信息
void InHouseFile(movieHouse *head); // 将修改的信息写入文件
Movie *Creat_Movie_Doc(); // 创建电影场次信息链
void Printf_Movie_Doc(Movie *mhead); // 输出电影场次信息
Movie *Insert_movie_Doc(Movie *mhead); //插入链表,增加电影数目
Movie *Delete_Movie_Doc(Movie *mhead); //删除电影场次信息
void After_Movie_Doc(Movie *mhead); //修改电影场次信息
void InMoviefile(Movie * mhead); // 将电影信息写入movie.txt 文件
Order *Create_Order_Doc(); // 创建订单链表 和文件进入链表
void InorderFile(Order *ohead,Order *p);// 将订单链表导入文件
void printf_After_movie(Movie *mhead); // 显示当前时间之后的电影
void printf_moviechoice(Movie *mhead,char cheng[]);// 用于打印用户所选场次的电影的场次信息
//int setSurplus(movieHouse* head,Order *ohead); // 计算影厅还有多少座位
Order *Insert_Order_Doc(Order *ohead,Order *p); // 将顾客的选择插入链表中
void sortMovie(Movie *mhead); // 对电影编号进行升序排列排序
void sortmovieHouse(movieHouse *head); // 对影厅的编号进行降序排序
下面正式介绍代码
这里是主函数,主函数里面我有两个功能,一个是选择进行管理员登录,(管理员登陆这一块我只设定了一个管理员,对应了一个密码)需要的可以自己增加管理员的个数,增加的形式,和用户的是一样的)或者是用户登录。 刚开始会输入日期,这样我们就可以看到这天及以后的所有已经输入的电影。
system("color f5"); 这行代码是改变了运行页面的颜色,这样更加美观一点。
int main (void)
{
int x;
Movie *mhead;
mhead = Creat_Movie_Doc();
sortMovie(mhead);
printf_After_movie(mhead);
onceagain:
system("color f5");
printf("\n\t\t\t==================================\n");
printf("\n");
printf("\t\t\t 请输入登录类型 \n");
printf("\n");
printf("\t\t\t 1.管理员\t 2.用户 \n");
printf("\n");
printf("\t\t\t==================================\n");
printf("\n\t\t\t请输入您想要进行的操作: ");
scanf("%d",&x);
system ("cls");
switch (x)
{
case 1:ManageLogin(); // 管理员登录
break;
case 2:CustomerLogin(); // 用户登录
break;
default:
{
printf("\n\n\t\t\t您的输入有误,请重新选择\n");
Sleep(1000);
system ("cls");
goto onceagain;
}
}
return 0;
}
下面是管理员登录的页面
管理员登陆的密码和账号都是111111,也可以自己进行修改。只有五次机会,不然就会自动跳出程序。
void ManageLogin() //管理员登录的页面
{
/* FILE *fp =fopen("manager.txt","w");
if ((fp =fopen("manager.txt","r")) == NULL)
{
printf("File open error");
exit(0);
}*/
int time=0;
int name;
int code;
int admCount;
// Manager man[10];
again_1: // 后面goto again_1 可以使程序跳到这块 ,两个语句相当于一个循环
int i,flag= 1;\
printf("\n\t\t\t请输入管理员账号: ");
scanf("%d",&name);
printf("\n\t\t\t请输入密码 : ");
scanf("%d",&code);
// admCount = ReadManagerFile(fp,man);
for (i=0;i<3;i++)
{
if ((name== 111111) && (code==111111)) // strcmp 函数比较两个数 ,相同返回零,前者大返回正数,后者大返回负数
{
flag =0;
break;
}
}
if (flag)
{
printf("\t\t\t账号或密码错误,请重新输入!\n");
time++;
printf("\t\t\t你还有%d 次输入次数",(5-time));
system("pause"); // 可以实现冻结屏幕,便于观察程序执行结果
system ("cls"); // 清屏命令
if (time<5) goto again_1;
else exit(0);
}
else
{
printf("登录成功!\n");
}
system("pause"); // 可以实现冻结屏幕,便于观察程序执行结果 =
system ("cls");
/* if(fclose(fp))
{
printf("Cannot close thr file \n");
exit(0);
}*/
again_5:
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");
int choice;
printf("\t\t\t请输入你想要进行的操作: ");
scanf("%d",&choice);
system ("cls");
switch(choice)
{
case 1:
HouseControl();
goto again_5;
break; // 进行放映厅的管理
case 2:
MovieControl();
goto again_5;
break; // 电影场次管理
case 0: exit(0);break;
default : goto again_5; break;
}
}
下面这块是客户登录的页面
进入页面,你可以选择登录/注册, 只有注册过后才可以登录。
这里有客户文件的创建,以及将信息写入到文件中
FILE *fp;//=fopen("customer.txt","w"); 这段是由于创建文件经常会不成功,所以运用这行代码可以成功创建文件,但是“W”形式打开会将文件中的内容清空,所以创建成功之后一定要注释掉这串代码,不然文件之前有的内容就会找不到。
void CustomerLogin() // 客户登录的页面
{
FILE *fp;//=fopen("customer.txt","w");
if ((fp =fopen("customer.txt","a+")) == NULL)
if (fp==NULL)
{
printf(" file open error!\n");
exit (0);
}
char name[20];
char code[20];
int custCount;
int choice;
Customer cust[200];
custCount = ReadCustomerFile(fp,cust); //admCount = ReadManagerFile(fp,man)
again_2:
printf("\n\n\t\t*******************************\n");
printf(" \n\t\t 欢迎来到倪家大剧院 \n");
printf("\n");
printf(" \n\t\t 1. 登录\t 2.注册 \n");
printf("\n");
printf("\n\t\t*******************************\n");
printf("请输入您的选择: ");
scanf("%d",&choice);
system("cls");
int i,flag;
int time =0;
switch (choice)
{
case 1:
again_3:
flag =1;
printf("请输入用户名: ");
scanf("%s",name);
printf("请输入密码: ");
scanf("%s",code);
for (i=0;i<custCount;i++)
{
if ((strcmp(name,cust[i].CustName)==0) && (strcmp(code,cust[i].CustCode) == 0))
{
flag =0;
break;
}
}
if (flag)
{
printf("账号或密码错误,请重新输入! \n");
time++;
printf("你还有%d 次输入次数",(5-time));
system("pause"); // 可以实现冻结屏幕,便于观察程序执行结果
system ("cls");
goto again_3;
}
else
{
printf("登录成功!\n");
system("pause"); // 可以实现冻结屏幕,便于观察程序执行结果
system ("cls"); // 清屏命令
}
break;
case 2:
again_4:
printf("请输入您的用户名: ");
scanf("%s",name);
for (i=0;i<custCount;i++)
{
if (strcmp(name,cust[i].CustName) == 0) // 比较两个参数的大小,相同返回零
{
printf("该用户名已存在");
system("pause"); // 可以实现冻结屏幕,便于观察程序执行结果
system ("cls");
goto again_4;
}
}
printf("请输入密码: ");
scanf("%s",code);
strcpy (cust[custCount].CustName,name);
strcpy (cust[custCount].CustCode,code); //fscanf 从文件中读取数据保存到前面的链表中去
fprintf(fp,"%s %s\n",cust[custCount].CustName,cust[custCount].CustCode); // 将新增加的用户的用户名和密码写入文件中去
printf("注册成功!\n");
system("pause"); // 可以实现冻结屏幕,便于观察程序执行结果
system ("cls");
break;
default :
printf("您的输入有误,请重新选择想要操作的内容 : ");
Sleep(1000);
system ("cls");
goto again_2;
break;
}
if (fclose(fp))
{
printf("can not close the file \n");
exit(0);
}
Order *ohead;
ohead = Create_Order_Doc();
again_9:
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");
int select;
printf("\t\t\t 请输入您的选择: ");
scanf("%d",&select);
system ("cls");
switch (select)
{
case 1:
ohead = MovieOrder(ohead,name);
// InorderFile(ohead);
goto again_9;
break; // 电影订票
case 2:
Ordercheck(ohead,name);
system("pause");
system("cls");
int choice;
printf("\t\t\t======================\n");
printf("\t\t\t请问是否选择付钱: \n");
printf("\t\t\t1.YES 2.NO \n");
printf("\t\t\t======================\n");
printf("\t\t\t请选择: ");
scanf("%d",&choice);
printf("\n");
if (choice==1)
{
printf("\t\t\t您已支付!\n");
printf("\t\t\t");
system("pause");
return;
}
else
{
goto again_9;
}
break; // 查看订票
case 0:return;break;
default:
{
printf("\t\t\t 您的输入错误,请重新选择! ");
Sleep(1000);
system ("cls");
goto again_9;
break;
}
}
}
计算顾客的数目,便于上一个函数中顾客的遍历
int ReadCustomerFile(FILE *fp, Customer t[]) //customer 中顾客的个数
{
int number=0;
rewind(fp);
while(!feof(fp)) // 判断文件有没有走到末尾;
{
fscanf(fp,"%s%s",t[number].CustName,t[number].CustCode);
number ++;
}
return number;
}
这里是对放映厅进行管理,前面管理员登录的页面会用到这个
void HouseControl() // 放映厅的管理
{
movieHouse * head;
// head = (movieHouse *)malloc (sizeof (movieHouse));
// head->next = NULL;
head = Create_House_Doc();
again_6:
printf("---------------------------------------\n");
printf("1. 增加放映厅 \n");
printf("2. 删除放映厅 \n");
printf("3. 对已有放映厅进行改变\n");
printf("4. 查看放映厅 \n");
printf("0. 退出\n");
printf("---------------------------------------\n");
int choice;
printf("请输入你想要进行的操作: ");
scanf("%d",&choice);
system ("cls");
switch (choice)
{
case 1:
printf("请输入你想要增加的放映厅的编号,名字,行,列,位置:\n");
movieHouse * p;
p=(struct movieHouse*)malloc(sizeof(struct movieHouse));
scanf("%s %s %d %d %s",p->houseNum,p->houseName,&p->housrow,&p->housecol,p->houseState);
system ("cls");
head =Insert_House_Doc(head,p);
InHouseFile(head);
print_House_Doc(head);
goto again_6;
break;
case 2:
print_House_Doc(head);
printf("请输入你想去掉的放映厅的编号:");
char housenum[20];
scanf("%s",housenum);
system("cls");
head = Delete_House_Doc(head,housenum);
InHouseFile(head);
print_House_Doc(head);
goto again_6;
break;
case 3:
After_House_Doc(head);
InHouseFile(head);
break;
case 4:
sortmovieHouse(head);
print_House_Doc(head);
system("pause");
system("cls");
goto again_6;
break;
case 0: return;
default: goto again_6;break;
}
}
这里开始有了链表,这块创建链表,同时可以实现文件中的内容导入到链表中。
这里我用的是尾插法,因为我在将文件导入链表的时候加入了以空格结束的,防止最后会出现乱码,遍历到倒数第二个节点,让他指向NULL,这样就不会出现多处的空格变成乱码的情况了。
movieHouse *Create_House_Doc() // 创建放映厅链表链表,实现文件导入链表
{
FILE *fp=fopen("movie_house.txt","rt");
if (fp==NULL)
{
printf("file open error");
exit(-1);
}
movieHouse *head;
head = (movieHouse *)malloc (sizeof (movieHouse));
head->next =NULL;
movieHouse *p,*p1,*q;
p = (movieHouse *)malloc (sizeof (movieHouse));
p=head;
p1 = (movieHouse *)malloc (sizeof (movieHouse));
p1->next =NULL;
if (fscanf(fp,"%s %s %d %d %s",p1->houseNum,p1->houseName,&p1->housrow,&p1->housecol,p1->houseState)!=EOF)
{
p->next =p1;
while(p->next)
{
p = p->next;
}
while (fgetc(fp)!=EOF) // 判断文件是否到末尾 s是否为空
{
q = (movieHouse *)malloc (sizeof (movieHouse));
fscanf(fp,"%s %s %d %d %s",q->houseNum,q->houseName,&q->housrow,&q->housecol,q->houseState);
p->next = q; // 尾插法
q->next =NULL;
p = p->next;
}
movieHouse *p2 = (movieHouse *)malloc (sizeof (movieHouse));
p2 = head; // 删除最后一个节点
while (p2->next->next)
{
p2 = p2->next;
}
p2->next = NULL;
}
else
return NULL;
fclose(fp);
return head;
}
前面有放映厅场次,那后面就是电影场次的管理
和放映厅场次方法几乎一样
void MovieControl() // 电影场次的管理
{
Movie * mhead;
// mhead = (Movie*)malloc(sizeof(Movie));
// mhead->next =NULL;
mhead = Creat_Movie_Doc();
sortMovie(mhead);
/// 此处需要一个建立头节点的链表 同时导入电影文件
again_0:
printf("****************************************\n");
printf("1.增加电影\n");
printf("2.删除已存在的电影\n");
printf("3.修改电影信息\n");
printf("4.输出电影场次信息\n");
printf("0.退出\n");
printf("****************************************\n");
int choice;
printf("请输入您的选择:\n");
scanf("%d",&choice);
system("cls");
switch (choice)
{
case 1:
Insert_movie_Doc(mhead);
system("cls");
InMoviefile(mhead);
Printf_Movie_Doc(mhead);
goto again_0;
break;
case 2:
Printf_Movie_Doc(mhead);
system("cls");
Delete_Movie_Doc(mhead);
system("cls");
Printf_Movie_Doc(mhead);
// InMoviefile(mhead);
goto again_0;
break;
case 3:
Printf_Movie_Doc(mhead);
After_Movie_Doc(mhead);
system("cls");
Printf_Movie_Doc(mhead);
goto again_0;
break;
case 4:
Printf_Movie_Doc(mhead);
system("pause");
system("cls");
goto again_0;
break;
case 0: return;break;
}
}
下面就是电影的增删改查
增利用了头插法
Movie *Insert_movie_Doc(Movie *mhead) //插入链表,增加电影数目
{
Movie *ptr,*ptr1,*p;
ptr = (Movie *)malloc (sizeof (Movie));
ptr = mhead;
int n;
printf("\n\n\t\t\t请输入你想要增加的电影场数:\n ");
scanf("%d",&n);
while (n)
{
p = (Movie *)malloc (sizeof (Movie));
printf("\n\n\t\t请输入电影的 编号,名字,价格,放映日期,放映时间,放映地点,现在状态\n");
printf("\t\t\t");
scanf("%s %s %ld %s %s %s %s",p->movieNum,p->movieName,&p->price,p->date,p->time,p->movieHouse,p->setState);
if (ptr->next ==NULL)
{
ptr->next =p;
p->next = NULL;
}
else
{
p->next = ptr ->next;
ptr->next = p;
}
n--;
}
return mhead;
}
Movie *Delete_Movie_Doc(Movie *mhead) //删除电影场次信息
{
Movie *ptr1,*ptr2;
int n;
printf("\n\n\t\t\t请输入你想要删除的电影的数目: ");
scanf("%d",&n);
ptr1 = (Movie *)malloc (sizeof (Movie));
ptr2 = (Movie *)malloc (sizeof (Movie));
ptr1 = mhead;
ptr2 = mhead->next;
char num[20];
while(n)
{
printf("\n\n\t\t\t请输入你想要删除的电影的编号: ");
scanf("%s",num);
while(ptr2!=NULL)
{
if ((strcmp(ptr2->movieNum,num))==0)
{
ptr1->next = ptr2->next;
free(ptr2);
}
ptr1 = ptr2; // 判断编号不相同,ptr1 移动到ptr2 的位置
ptr2= ptr2->next; //ptr2 往后移动一个结点
}
n--;
}
return mhead;
}
void After_Movie_Doc(Movie *mhead) //修改电影场次信息
{
int choice;
char name[20];
Movie *ptr,*p;
movieHouse* ptr1;
printf("\t\t\t请输入你想要修改的电影名称: ");
scanf("%s",name);
printf("\t\t\t===========================\n");
printf("\t\t\t1.价格\n");
printf("\t\t\t2.所在放映厅编号\n");
printf("\t\t\t3.放映时间\n");
printf("\t\t\t===========================\n");
printf("\n\t\t\t请输入你想要修改的信息: ");
scanf("%d",&choice);
for (ptr=mhead->next;ptr!=NULL;ptr=ptr->next)
{
if (strcmp(ptr->movieName,name)==0)
{
p=ptr;
break;
}
}
switch(choice)
{
case 1:
double price;
printf("\t\t\t请输入你想要修改成为的价格:");
scanf("%ld",&price);
p->price = price;
break;
case 2:
char num[20];
printf("\t\t\t请输入你想要修改成的编号: ");
scanf("%s",num);
strcpy(p->movieHouse,num);
/// memcpy(p->movieHouse,num);
break;
case 3:
char time[20];
printf("\t\t\t请输入你想要改成的时间: ");
scanf("%s",time);
strcpy(p->time,time);
// p->time=time[20];
// memcpy(p->time,time);
break;
}
InMoviefile(mhead);
}
下面利用头插法将链表电影信息写入文件(放映厅的方法也是这样的)
void InMoviefile(Movie * mhead) // 将电影信息写入文件,实现文件的更新
{
FILE * fp;
if ((fp=fopen("movie.txt","w"))==NULL)
{
printf("file open error");
exit(0);
}
Movie *ptr;
for (ptr= mhead ->next;ptr!=NULL;ptr=ptr->next)
{
fprintf(fp,"%s %s %ld %s %s %s %s\n",ptr->movieNum,ptr->movieName,ptr->price,ptr->date,ptr->time,ptr->movieHouse,ptr->setState);
}
if (fclose(fp))
{
printf("con not close the file\n ");
exit(0);
}
}
这里是main 函数中显示当天及之后的电影
void printf_After_movie(Movie *head) // 显示当天及2之后的电影
{
char date[30];
printf("请输入当前日期:\n");
scanf("%s",date);
Sleep(2000);
system("cls");
Movie *ptr;
printf("*********************************************************************************************|\n");
printf("|电影编号 | 电影名称 | 电影单价 | 电影放映日期 | 放映时间 | 所在放映厅 |\n");
printf("*********************************************************************************************|\n");
for (ptr=head->next;ptr!=NULL;ptr=ptr->next)
{
if (strcmp(ptr->date,date)>=0)
{
printf("|%-9s |%-14s|%-11d|%-13s |%-8s | %-10s |\n",ptr->movieNum,ptr->movieName,ptr->price,ptr->date,ptr->time,ptr->movieHouse);
printf("*********************************************************************************************|\n");
}
}
}
利用冒泡排序对电影编号进行升序排列
void sortMovie(Movie *mhead) // 对电影编号进行升序
{
Movie *p,*q,*r;
r = NULL;
while (r!=mhead->next)
{
p=mhead;
q = p->next;
while (q->next != r)
{
if (strcmp(p->next->movieNum,q->next->movieNum)==1)
{
p->next = q->next;
q->next = q->next->next;
p->next->next = q;
}
p = p->next;
q = p->next;
}
r = q;
}
}
做出了电影,放映厅的功能,还有顾客订单的功能,可以所有的代码都感觉是一个样子,就一摸一样的,不过就是换了结构体而已,所以这里也就不放出来了。
谢谢你的观看,希望可以对你有所帮助