注:受老师许可,本程序内容与活力长者社区稍有不同。但所涉及到的功能、知识点与结构大致相似。 本程序名为 “ 陆零玖酒店管理系统 ” 。
任何疑问欢迎留言。此源码仅供学习,请不要过度借鉴!
目录
一、陆零玖酒店管理系统
1.程序信息
程序名:陆零玖酒店管理程序
开发语言:C语言
程序作者:东北大学软件学院21级学生:YYYwaiwai、梅付坤、郭君朴、陈恳
开发工具:VS2019
需求环境:Easy-X Graphics.h 图形库
源码下载:C语言—东北大学大作业—活力长者社区(图形界面)源码
2.前言
本程序的创新之处为用户端完整的图形界面与鼠标交互功能
肝这个程序肝了整整半个月
因为运用了图形界面,让这个本来就有些复杂的程序变得更加的复杂
程序总共约为6000行,共封装97个函数
真的肝要肝爆了
因看到20级学长分享的文章后,才决定也自己要发一篇CSDN
由于时间原因,程序部分细节没有完全完工,但整体功能已完成。
二、程序使用展示
注:因程序功能较多,本部分仅展示部分内容
1.用户登录
2.用户注册
3.客房预约
4.设施预约
5.接送预约
6.管理端
注:因程序文件内包含他人真实信息,因此演示不予展示管理端具体功能
7.关于界面
三、程序简介
1.头文件
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <graphics.h>
#include <Mmsystem.h>
#pragma comment(lib,"winmm.lib")
2.全局结构体
//鼠标交互结构体
typedef struct button
{
int x;
int y;
int width;
int height;
COLORREF color;
char* ptext;
}button;
//图片按钮结构体
typedef struct picbutt
{
int x;
int y;
int width;
int height;
}picbutt;
//用户结构体
typedef struct user_info
{
char name[10];
char gender[10];
char nickname[30];
char phone[20];
char password[20];
int iVIPlevel;
char cVIPlevel[10];
struct user_info* next;
}user;
//会员结构体
typedef struct VIP_info
{
char name[10];
char gender[10];
char nickname[30];
char phone[20];
char password[20];
int iVIPlevel;
char cVIPlevel[10];
struct VIP_info* next;
}VIP;
//客房结构体
//单人客房
typedef struct single_room_info
{
int number;
user* puser;
char yearmonth[20];
int date;
int day;
int status;
}single_r;
//双人客房
typedef struct double_room_info
{
int number;
user* puser;
char yearmonth[20];
int date;
int day;
int status;
}double_r;
//家庭客房
typedef struct family_room_info
{
int number;
user* puser;
char yearmonth[20];
int date;
int day;
int status;
}family_r;
//豪华客房
typedef struct deluxe_room_info
{
int number;
user* puser;
char yearmonth[20];
int date;
int day;
int status;
}deluxe_r;
//服务结构体
typedef struct service_info
{
user* puser;
char date[30];
int mobile_status;
char mobile_cartype[50];
int mobile_time;
int canteen_status;
int canteen_time;
int fitness_status;
int fitness_time;
int pool_status;
int pool_time;
struct service_info* next;
}service;
3.封装函数
//函数声明
void colour(short);
//鼠标交互函数
button* creat_button(int, int, int, int, COLORREF, const char*);
picbutt* creat_picbutt(int, int, int, int);
void draw_button(button*);
int button_detect(button*, MOUSEMSG, COLORREF);
int picbutt_detect(picbutt*, MOUSEMSG, IMAGE, IMAGE);
//用户端页面函数
void about_page();
int front_page();
int login_page(char[], char[], user*, user*);
user* login_check(char[], char[], user*);
void input_phone(char[]);
void input_password(char[]);
int signin_page();
void signin_hint();
void signin_input(char[], char[], char[], char[], char[], user*);
void signin_name(char[]);
void signin_nickname(char[]);
void signin_gender(char[]);
void signin_phone(char[]);
void signin_password(char[]);
void signin_user(char[], char[], char[], char[], char[], user*);
int detect_user(char[], user*);
user* get_puser(user*, char[]);
int user_page(user*, VIP*);
void user_upgrade_page(user*, VIP*, user*);
void user_upgrade_level0(user*, VIP*, char[]);
void user_upgrade_level1(user*, VIP*, char[]);
void user_upgrade_level2(user*, VIP*, char[]);
void user_upgrade_level3(user*, VIP*, char[]);
void user_upgrade_silver(user*, VIP*);
void user_upgrade_gold(user*, VIP*);
void user_upgrade_diamond(user*, VIP*);
int detect_service_mobile(service*, user*);
service* detect_service(service*, user*);
void user_mobile_page(user*, VIP*, service*);
int user_mobile_normal(user*);
int user_mobile_VIP(user*);
void user_facility_page(user*);
void facility_canteen(user*, IMAGE, IMAGE, IMAGE, IMAGE, IMAGE, IMAGE, IMAGE, picbutt*, picbutt*, picbutt*, button*);
void facility_fitness(user*, IMAGE, IMAGE, IMAGE, IMAGE, IMAGE, IMAGE, IMAGE, picbutt*, picbutt*, picbutt*, button*);
void facility_pool(user*, IMAGE, IMAGE, IMAGE, IMAGE, IMAGE, IMAGE, IMAGE, picbutt*, picbutt*, picbutt*, button*);
void house_page(user*, single_r[], double_r[], family_r[], deluxe_r[]);
int house_page_user();
int house_page_VIP();
int house_distribute_single(single_r[]);
int house_distribute_double(double_r[]);
int house_distribute_family(family_r[]);
int house_distribute_deluxe(deluxe_r[]);
int detect_house_status(user*, single_r[], double_r[], family_r[], deluxe_r[]);
//管理端函数
void admin_page(user*, VIP*, single_r[], double_r[], family_r[], deluxe_r[]);
void admin_user(user*);
void admin_user_add(user*);
void admin_user_delete(user*);
user* admin_user_delete_name(char[], user*);
user* admin_user_delete_phone(char[], user*);
void admin_user_alter(user*);
void admin_user_search(user*);
void admin_user_through(user*);
void admin_VIP(VIP*, user*);
void admin_VIP_add(VIP*, user*);
void admin_VIP_delete(VIP*, user*);
VIP* admin_VIP_delete_name(char[], VIP*);
VIP* admin_VIP_delete_phone(char[], VIP*);
void admin_VIP_alter(VIP*);
void admin_VIP_search(VIP*);
void admin_VIP_through(VIP*);
int detect_VIP(char[], VIP*);
void admin_room(single_r[], double_r[], family_r[], deluxe_r[], user*);
void admin_room_add(single_r[], double_r[], family_r[], deluxe_r[], user*);
void admin_room_delete(single_r[], double_r[], family_r[], deluxe_r[], user*);
void admin_room_change(single_r[], double_r[], family_r[], deluxe_r[], user*);
void admin_room_search(single_r[], double_r[], family_r[], deluxe_r[], user*);
user* get_puser_name(user*, char[]);
//文件操作函数
int read_user(user*);
user* auto_adduser(user*);
user* auto_addnuser(user*);
void delete_r(char[]);
void read_VIP(VIP*, user*);
VIP* auto_addnVIP(VIP*);
int write_user(user*);
void read_house(single_r[], double_r[], family_r[], deluxe_r[], user*);
void read_house_single(single_r[], user*);
void read_house_double(double_r[], user*);
void read_house_family(family_r[], user*);
void read_house_deluxe(deluxe_r[], user*);
int read_service(user*, service*);
service* auto_addservice(service*);
service* auto_addnservice(service*);
void house_write(single_r[], double_r[], family_r[], deluxe_r[]);
void house_write_single(single_r[]);
void house_write_double(double_r[]);
void house_write_family(family_r[]);
void house_write_deluxe(deluxe_r[]);
4.所需文件
以上两个文件夹需放在工程文件根目录下。
info文件夹内包含程序所需读取的文件
file文件夹内包含程序所需读取的媒体文件
四、程序功能
由于程序体量比较庞大,本文挑选部分重要部分展示
1.程序功能结构图
2.主函数
(1)变量声明
int fp_select = 0;
int lp_select = 0;
int sp_select = 0;
int up_select = 0;
int back_flag = 0;
int login_flag = 0;
char login_account[20] = "";
char login_password[20] = "";
char signin_name[10] = "";
char signin_nickname[30] = "";
char signin_gender[10] = "";
char signin_phone[20] = "";
char signin_password[20] = "";
single_r single_room[30] = { 0,NULL,"",0,0 };
double_r double_room[30] = { 0,NULL,"",0,0 };
family_r family_room[30] = { 0,NULL,"",0,0 };
deluxe_r deluxe_room[10] = { 0,NULL,"",0,0 };
(2)链表创建及文件读入
user* puser = NULL;
int user_house_status = 0;
user* user_head;
user_head = (user*)malloc(sizeof(user));
user_head->next = NULL;
VIP* VIP_head;
VIP_head = (VIP*)malloc(sizeof(VIP));
VIP_head->next = NULL;
service* service_head;
service_head = (service*)malloc(sizeof(service));
service_head->next = NULL;
read_user(user_head);
read_VIP(VIP_head, user_head);
read_house(single_room, double_room, family_room, deluxe_room, user_head);
read_service(user_head, service_head);
(3)循环
while (1)
{
fp_select = front_page();
switch (fp_select)
{
case 1:
{
lp_select = login_page(login_account, login_password, user_head, puser);
switch (lp_select)
{
case 1: back_flag = 1; break;
case 2: break;
case 3: admin_page(user_head, VIP_head, single_room, double_room, family_room, deluxe_room); back_flag = 1; break;
case 4: puser = get_puser(user_head, login_account); login_flag = 1; back_flag = 1; break;
}
if (back_flag == 1)
{
back_flag = 0;
break;
}
}
case 2:
{
sp_select = signin_page();
switch (sp_select)
{
case 1: break;
case 2:
{
signin_input(signin_name, signin_nickname, signin_gender, signin_phone, signin_password, user_head);
write_user(user_head);
puser = get_puser(user_head, signin_phone);
if (puser == NULL)
{
system("pause");
break;
}
else
{
login_flag = 1;
signin_hint();
}
}
}
break;
}
case 3: return 0; break;
case 4: about_page(); break;
}
if (login_flag == 1)
{
login_flag = 0;
while (1)
{
user_house_status = detect_house_status(puser, single_room, double_room, family_room, deluxe_room);
up_select = user_page(puser, VIP_head);
switch (up_select)
{
case 0: back_flag = 1; break;
case 1:
{
if (user_house_status == 1)
{
settextstyle(25, 0, "黑体");
settextcolor(RED);
setbkmode(TRANSPARENT);
outtextxy(220, 130, "您已预约,无法再次预约!");
system("pause");
break;
}
house_page(puser, single_room, double_room, family_room, deluxe_room);
house_write(single_room, double_room, family_room, deluxe_room);
break;
}
case 2:
{
if (user_house_status != 1)
{
settextstyle(25, 0, "黑体");
settextcolor(RED);
setbkmode(TRANSPARENT);
outtextxy(220, 130, "入住后才能享受该服务!");
system("pause");
break;
}
else
user_facility_page(puser);
break;
}
case 3:
{
settextstyle(25, 0, "黑体");
settextcolor(RED);
setbkmode(TRANSPARENT);
outtextxy(220, 130, "即将推出!");
system("pause");
break;
}
case 4:
{
if (user_house_status != 1)
{
settextstyle(25, 0, "黑体");
settextcolor(RED);
setbkmode(TRANSPARENT);
outtextxy(220, 130, "入住后才能享受该服务!");
system("pause");
break;
}
if (detect_service_mobile(service_head, puser) == 1)
{
settextstyle(25, 0, "黑体");
settextcolor(RED);
setbkmode(TRANSPARENT);
outtextxy(220, 130, "您已预约,请勿重复操作!");
system("pause");
break;
}
else
user_mobile_page(puser, VIP_head, service_head);
break;
}
case 5: user_upgrade_page(puser, VIP_head, user_head); break;
case 6:;
}
if (back_flag == 1)
{
back_flag = 0;
break;
}
}
}
}
3.文件读入
(1)用户信息读入
用户信息由 info/user_info.txt 内读入,并将信息存入user_info链表
user_info.txt内 包含
可用任意符号间隔不同用户,此处运用" * "号间隔
//读取用户数据
int read_user(user* user_head)
{
char info[1000] = "";
user* fn;
FILE* file = fopen("./info/user_info.txt", "r");
if (file == NULL)
{
printf("文件读取失败,请联系开发者!\n");
return 0;
}
fn = auto_adduser(user_head);
while (1)
{
fgets(info, 1000, file);
strcpy(fn->name, info);
delete_r(fn->name);
fgets(info, 1000, file);
strcpy(fn->gender, info);
delete_r(fn->gender);
fgets(info, 1000, file);
strcpy(fn->nickname, info);
delete_r(fn->nickname);
fgets(info, 1000, file);
strcpy(fn->phone, info);
delete_r(fn->phone);
fgets(info, 1000, file);
strcpy(fn->password, info);
delete_r(fn->password);
fgets(info, 1000, file);
fn->iVIPlevel = atoi(info);
switch (fn->iVIPlevel)
{
case 0: strcpy(fn->cVIPlevel, "普通用户"); break;
case 1: strcpy(fn->cVIPlevel, "白银会员"); break;
case 2: strcpy(fn->cVIPlevel, "黄金会员"); break;
case 3: strcpy(fn->cVIPlevel, "钻石会员"); break;
}
/*
printf("%s\n", fn->name);
printf("%s\n", fn->gender);
printf("%s\n", fn->nickname);
printf("%s\n", fn->phone);
printf("%s\n", fn->password);
printf("%d\n", fn->iVIPlevel);
printf("%s\n\n", fn->cVIPlevel);
*/
if (fgets(info, 1000, file) == NULL)
break;
fn = auto_addnuser(user_head);
}
fclose(file);
}
//第一次读取用户新增信息
user* auto_adduser(user* user_head)
{
user* pn;
pn = (user*)malloc(sizeof(user));
user_head->next = pn;
pn->next = NULL;
return pn;
}
//第n次读取用户新增信息
user* auto_addnuser(user* user_head)
{
user* pn;
user* tem;
pn = (user*)malloc(sizeof(user));
pn->next = NULL;
tem = user_head;
while (1)
{
if (tem->next != NULL)
tem = tem->next;
else
break;
}
tem->next = pn;
return pn;
}
//去文件内换行符
void delete_r(char str[])
{
int i = 0;
for (i = 0; str[i] != '\n'; i++);
str[i] = '\0';
}
(2)会员信息读入
会员信息由user_info链表中读入,并创建VIP_info链表。
//读取会员信息
void read_VIP(VIP* VIP_head, user* user_head)
{
user* pn;
pn = user_head->next;
VIP* fn;
fn = (VIP*)malloc(sizeof(VIP));
VIP_head->next = fn;
fn->next = NULL;
while (pn->next != NULL)
{
if (pn->iVIPlevel != 0)
{
strcpy(fn->name, pn->name);
strcpy(fn->gender, pn->gender);
strcpy(fn->nickname, pn->nickname);
strcpy(fn->phone, pn->phone);
strcpy(fn->password, pn->password);
fn->iVIPlevel = pn->iVIPlevel;
strcpy(fn->cVIPlevel, pn->cVIPlevel);
/*
printf("\n\n%s\n", fn->name);
printf("%s\n", fn->gender);
printf("%s\n", fn->nickname);
printf("%s\n", fn->phone);
printf("%s\n", fn->password);
printf("%d\n", fn->iVIPlevel);
printf("%s\n\n", fn->cVIPlevel);
*/
if (pn-> next == NULL)
break;
fn = auto_addnVIP(VIP_head);
}
pn = pn->next;
}
}
//第n次读取会员信息
VIP* auto_addnVIP(VIP* VIP_head)
{
VIP* pn;
VIP* tem;
pn = (VIP*)malloc(sizeof(VIP));
pn->next = NULL;
tem = VIP_head;
while (1)
{
if (tem->next != NULL)
tem = tem->next;
else
break;
}
tem->next = pn;
return pn;
}
(3)客房信息读入
因代码过长,仅展示部分代码
//客房信息读入
void read_house(single_r single_room[], double_r double_room[], family_r family_room[], deluxe_r deluxe_room[], user* user_head)
{
read_house_single(single_room, user_head);
read_house_double(double_room, user_head);
read_house_family(family_room, user_head);
read_house_deluxe(deluxe_room, user_head);
}
//读入单人房数据
void read_house_single(single_r single_room[], user* user_head)
{
FILE* fp = fopen("./info/single_room.txt", "r");
if (fp == NULL)
{
printf("文件读取失败,请联系开发者!\n");
return;
}
char s[100] = "\0";
int i = 0;
int a = 0;
user* p = NULL;
for (i = 0; i < 30; i++)
{
fgets(s, 100, fp);
delete_r(s);
a = atoi(s);
single_room[i].number = a;
fgets(s, 100, fp);
delete_r(s);
p = get_puser(user_head, s);
single_room[i].puser = p;
fgets(s, 100, fp);
delete_r(s);
strcpy(single_room[i].yearmonth, s);
fgets(s, 100, fp);
delete_r(s);
a = atoi(s);
single_room[i].date = a;
fgets(s, 100, fp);
delete_r(s);
a = atoi(s);
single_room[i].day = a;
fgets(s, 100, fp);
delete_r(s);
a = atoi(s);
single_room[i].status = a;
}
for (i = 0; i < 30; i++)
{
//printf("%d\n%s\n%s\n%d\n%d\n%d\n", single_room[i].number, single_room[i].puser->name, single_room[i].yearmonth, single_room[i].date, single_room[i].day, single_room[i].status);
}
fclose(fp);
}
(4)服务信息读入
//读取服务数据
int read_service(user* user_head, service* service_head)
{
char info[1000] = "";
int tem = 0;
service* fn;
FILE* file = fopen("./info/service_info.txt", "r");
if (file == NULL)
{
printf("文件读取失败,请联系开发者!\n");
return 0;
}
fn = auto_addservice(service_head);
while (1)
{
fgets(info, 1000, file);
delete_r(info);
fn->puser = get_puser(user_head, info);
fgets(info, 1000, file);
strcpy(fn->date, info);
delete_r(fn->date);
fgets(info, 1000, file);
tem = atoi(info);
if (tem == 0)
{
fn->mobile_status = 0;
strcpy(fn->mobile_cartype, "0");
fn->mobile_time = 0;
fgets(info, 1000, file);
fgets(info, 1000, file);
}
else
{
fn->mobile_status = 1;
fgets(info, 1000, file);
strcpy(fn->mobile_cartype, info);
delete_r(fn->mobile_cartype);
fgets(info, 1000, file);
tem = atoi(info);
fn->mobile_time = tem;
}
fgets(info, 1000, file);
tem = atoi(info);
if (tem == 0)
{
fn->canteen_status = 0;
fn->canteen_time = 0;
fgets(info, 1000, file);
}
else
{
fn->canteen_status = 1;
fgets(info, 1000, file);
tem = atoi(info);
fn->canteen_time = tem;
}
fgets(info, 1000, file);
tem = atoi(info);
if (tem == 0)
{
fn->fitness_status = 0;
fn->fitness_time = 0;
fgets(info, 1000, file);
}
else
{
fn->fitness_status = 1;
fgets(info, 1000, file);
tem = atoi(info);
fn->fitness_time = tem;
}
fgets(info, 1000, file);
tem = atoi(info);
if (tem == 0)
{
fn->pool_status = 0;
fn->pool_time = 0;
fgets(info, 1000, file);
}
else
{
fn->pool_status = 1;
fgets(info, 1000, file);
tem = atoi(info);
fn->pool_time = tem;
}
/*
printf("%s\n", fn->puser->name);
printf("%s\n", fn->date);
printf("%d\n", fn->mobile_status);
printf("%s\n", fn->mobile_cartype);
printf("%d\n", fn->mobile_time);
printf("%d\n", fn->canteen_status);
printf("%d\n", fn->canteen_time);
printf("%d\n", fn->fitness_status);
printf("%d\n", fn->fitness_time);
printf("%d\n", fn->pool_status);
printf("%d\n\n", fn->pool_time);
*/
fgets(info, 1000, file);
if (strcmp(info, "&") == 0)
break;
fn = auto_addnservice(service_head);
}
fclose(file);
}
//第一次读取服务信息
service* auto_addservice(service* service_head)
{
service* pn;
pn = (service*)malloc(sizeof(service));
service_head->next = pn;
pn->next = NULL;
return pn;
}
//第n次读取服务信息
service* auto_addnservice(service* service_head)
{
service* pn;
service* tem;
pn = (service*)malloc(sizeof(service));
pn->next = NULL;
tem = service_head;
while (1)
{
if (tem->next != NULL)
tem = tem->next;
else
break;
}
tem->next = pn;
return pn;
}
4.系统首页
int front_page()
{
initgraph(1280, 720);
IMAGE photo;
loadimage(&photo, "./file/front_page.jpg");
putimage(0, 0, &photo);
button* login = creat_button(210, 380, 180, 50, YELLOW, "用户登录");
button* signin = creat_button(210, 450, 180, 50, YELLOW, "用户注册");
button* exit = creat_button(210, 520, 180, 50, YELLOW, "退出系统");
button* about = creat_button(210, 590, 180, 50, YELLOW, "关于系统");
while (1)
{
draw_button(login);
draw_button(signin);
draw_button(exit);
draw_button(about);
MOUSEMSG mouse = GetMouseMsg();
if (button_detect(login, mouse, YELLOW))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 1;
}
if (button_detect(signin, mouse, YELLOW))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 2;
}
if (button_detect(exit, mouse, YELLOW))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 3;
}
if (button_detect(about, mouse, YELLOW))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 4;
}
}
}
5.用户中心
//用户中心页面
int user_page(user* puser, VIP* VIP_head)
{
char call[50] = "欢迎您,";
char male[10] = "先生";
char female[10] = "女士";
int i = 0;
int j = 0;
IMAGE photo;
loadimage(&photo, "./file/user_page.jpg");
putimage(0, 0, &photo);
settextstyle(25, 0, "楷体");
setbkmode(TRANSPARENT);
settextcolor(RED);
if (puser->name[0] >= 'A' && puser->name[0] <= 'Z')
{
strcat(call, puser->name);
}
else
{
strncat(call, puser->name, 2);
}
if (strcmp(puser->gender, male) == 0)
strcat(call, male);
else
strcat(call, female);
outtextxy(1030, 135, call);
IMAGE house_1;
IMAGE house_2;
IMAGE facility_1;
IMAGE facility_2;
IMAGE service_1;
IMAGE service_2;
IMAGE mobile_1;
IMAGE mobile_2;
IMAGE upgrade_1;
IMAGE upgrade_2;
IMAGE alter_1;
IMAGE alter_2;
loadimage(&house_1, "./file/house_1.jpg");
loadimage(&house_2, "./file/house_2.jpg");
picbutt* house = creat_picbutt(140, 190, 490, 150);
loadimage(&facility_1, "./file/facility_1.jpg");
loadimage(&facility_2, "./file/facility_2.jpg");
picbutt* facility = creat_picbutt(660, 190, 490, 150);
loadimage(&service_1, "./file/service_1.jpg");
loadimage(&service_2, "./file/service_2.jpg");
picbutt* service = creat_picbutt(140, 360, 490, 150);
loadimage(&mobile_1, "./file/mobile_1.jpg");
loadimage(&mobile_2, "./file/mobile_2.jpg");
picbutt* mobile = creat_picbutt(660, 360, 490, 150);
loadimage(&upgrade_1, "./file/upgrade_1.jpg");
loadimage(&upgrade_2, "./file/upgrade_2.jpg");
picbutt* upgrade = creat_picbutt(140, 530, 490, 150);
loadimage(&alter_1, "./file/alter_1.jpg");
loadimage(&alter_2, "./file/alter_2.jpg");
picbutt* alter = creat_picbutt(660, 530, 490, 150);
button* back = creat_button(50, 120, 150, 50, YELLOW, "<<登出");
while (1)
{
draw_button(back);
MOUSEMSG mouse = GetMouseMsg();
if (button_detect(back, mouse, YELLOW))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 0;
}
if (picbutt_detect(house, mouse, house_1, house_2))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 1;
}
if (picbutt_detect(facility, mouse, facility_1, facility_2))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 2;
}
if (picbutt_detect(service, mouse, service_1, service_2))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 3;
}
if (picbutt_detect(mobile, mouse, mobile_1, mobile_2))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 4;
}
if (picbutt_detect(upgrade, mouse, upgrade_1, upgrade_2))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 5;
}
if (picbutt_detect(alter, mouse, alter_1, alter_2))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
return 6;
}
}
}
6.设施预约
因代码过长,仅展示部分代码
//设施预约界面
void user_facility_page(user* puser)
{
IMAGE facility;
loadimage(&facility, "./file/facility_page.jpg");
putimage(0, 0, &facility);
IMAGE canteen_1;
IMAGE canteen_2;
IMAGE fitness_1;
IMAGE fitness_2;
IMAGE pool_1;
IMAGE pool_2;
loadimage(&canteen_1, "./file/facility_canteen_1.jpg");
loadimage(&canteen_2, "./file/facility_canteen_2.jpg");
picbutt* canteen = creat_picbutt(115, 190, 330, 186);
loadimage(&fitness_1, "./file/facility_fitness_1.jpg");
loadimage(&fitness_2, "./file/facility_fitness_2.jpg");
picbutt* fitness = creat_picbutt(475, 190, 330, 186);
loadimage(&pool_1, "./file/facility_pool_1.jpg");
loadimage(&pool_2, "./file/facility_pool_2.jpg");
picbutt* pool = creat_picbutt(835, 190, 330, 186);
button* back = creat_button(50, 120, 150, 50, YELLOW, "<<返回");
facility_canteen(puser, facility, canteen_1, canteen_2, fitness_1, fitness_2, pool_1, pool_2, canteen, fitness, pool, back);
}
//餐厅预约界面
void facility_canteen(user* puser, IMAGE facility, IMAGE canteen_1, IMAGE canteen_2, IMAGE fitness_1, IMAGE fitness_2, IMAGE pool_1, IMAGE pool_2, picbutt* canteen, picbutt* fitness, picbutt* pool, button* back)
{
int timei = 8;
char timec[10] = "";
cleardevice();
putimage(0, 0, &facility);
putimage(115, 190, &canteen_2);
setlinecolor(BLACK);
setlinestyle(1, 4);
line(100, 180, 460, 180);
line(460, 180, 460, 395);
line(460, 395, 1180, 395);
line(1180, 395, 1180, 700);
line(100, 700, 1180, 700);
line(100, 180, 100, 700);
setlinestyle(0, 1);
setlinecolor(BLACK);
setfillcolor(WHITE);
fillrectangle(470, 570, 540, 620);
settextcolor(BLACK);
settextstyle(30, 0, "黑体");
setbkmode(TRANSPARENT);
outtextxy(320, 470, "日期:2022年1月18日");
outtextxy(320, 520, "设施:餐厅10F 星露谷餐厅");
outtextxy(320, 580, "时间: 8 时");
button* plus = creat_button(400, 570, 70, 50, WHITE, "+");
button* minus = creat_button(540, 570, 70, 50, WHITE, "-");
button* reserve = creat_button(800, 485, 180, 50, YELLOW, "在线订餐");
button* sure = creat_button(800, 555, 180, 50, YELLOW, "确认预约");
while (1)
{
draw_button(back);
draw_button(plus);
draw_button(minus);
draw_button(reserve);
draw_button(sure);
MOUSEMSG mouse = GetMouseMsg();
if (button_detect(back, mouse, YELLOW))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
break;
}
if (picbutt_detect(fitness, mouse, fitness_1, fitness_2))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
{
facility_fitness(puser, facility, canteen_1, canteen_2, fitness_1, fitness_2, pool_1, pool_2, canteen, fitness, pool, back);
break;
}
}
if (picbutt_detect(pool, mouse, pool_1, pool_2))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
{
facility_pool(puser, facility, canteen_1, canteen_2, fitness_1, fitness_2, pool_1, pool_2, canteen, fitness, pool, back);
break;
}
}
if (button_detect(plus, mouse, WHITE))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
{
setlinecolor(BLACK);
setfillcolor(WHITE);
fillrectangle(470, 570, 540, 620);
settextcolor(BLACK);
settextstyle(30, 0, "黑体");
setbkmode(TRANSPARENT);
if (timei < 20)
timei += 1;
itoa(timei, timec, 10);
outtextxy(490, 580, timec);
}
}
if (button_detect(minus, mouse, WHITE))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
{
setlinecolor(BLACK);
setfillcolor(WHITE);
fillrectangle(470, 570, 540, 620);
settextcolor(BLACK);
settextstyle(30, 0, "黑体");
setbkmode(TRANSPARENT);
if (timei > 8)
timei -= 1;
itoa(timei, timec, 10);
outtextxy(490, 580, timec);
}
}
if (button_detect(reserve, mouse, YELLOW))
strcpy(reserve->ptext, "即将推出");
else
strcpy(reserve->ptext, "在线订餐");
if (button_detect(sure, mouse, YELLOW))
{
if (mouse.uMsg == WM_LBUTTONDOWN)
break;
}
}
}
7.管理端用户管理
因代码过长,仅展示部分代码
//管理用户主页面
void admin_user(user* user_head)
{
char input = '0';
int select = 0;
int flag = 0;
while (1)
{
system("cls");
colour(11);
printf("**************\n");
printf("管理员,你好!\n");
printf("**************\n");
colour(15);
printf("\n你可以进行以下操作:\n1.增加用户信息\n2.删除用户信息\n3.更改用户信息\n4.查询用户信息\n5.遍历用户信息\n6.返回管理员页面\n");
fflush(stdin);
while (1)
{
if (!_kbhit());
else
input = _getch();
if (input >= '1' && input <= '6')
break;
}
select = input - 48;
switch (select)
{
case 1: admin_user_add(user_head); break;
case 2: admin_user_delete(user_head); break;
case 3: admin_user_alter(user_head); break;
case 4: admin_user_search(user_head); break;
case 5: admin_user_through(user_head); break;
case 6: flag = 1; break;
}
input = 0;
if (flag == 1)
{
initgraph(1280, 720);
break;
}
}
}
//管理端增加用户函数
void admin_user_add(user* user_head)
{
char temphone[20] = "";
int detect = 0;
user* p;
p = (user*)malloc(sizeof(user));
while (1)
{
system("cls");
colour(11);
printf("******************\n");
printf("添 加 用 户 界 面\n");
printf("******************\n");
colour(15);
printf("请输入手机号码:");
scanf("%s", temphone);
if (detect_user(temphone, user_head))
{
colour(12);
printf("\n该用户已存在!\n");
colour(15);
system("pause");
}
else
{
strcpy(p->phone, temphone);
printf("请输入您的姓名:");
scanf("%s", &p->name);
printf("请输入性别:");
scanf("%s", &p->gender);
printf("请输入昵称:");
scanf("%s", &p->nickname);
printf("请输入密码:");
scanf("%s", &p->password);
p->iVIPlevel = 0;
strcpy(p->cVIPlevel, "普通用户");
p->next = user_head->next;
user_head->next = p; system("cls");
colour(5);
printf("\n用户已成功添加,请核实信息\n"); colour(8);
printf("用户姓名:%s\n", p->name);
printf("用户性别:%s\n", p->gender);
printf("用户昵称:%s\n", p->nickname);
printf("用户手机号码:%s\n", p->phone);
printf("用户密码:%s\n", p->password);
printf("用户类型:%s\n", p->cVIPlevel);
system("pause");
break;
}
}
}
8.关于界面
本界面中实现了字幕滚动的简易动画制作
//关于系统页面
void about_page()
{
char read[1000] = "";
int i = 0;
int j = 0;
FILE* about = fopen("./info/about.txt", "r");
if (about == NULL)
{
printf("文件读取失败,请联系开发者!\n");
return;
}
initgraph(1280, 720);
IMAGE page;
IMAGE title;
mciSendString("open ./file/about.wav", NULL, 0, NULL);
mciSendString("play ./file/about.wav", NULL, 0, NULL);
loadimage(&page, "./file/about_page.jpg");
loadimage(&title, "./file/about_title.jpg");
settextstyle(30, 0, "黑体");
setbkmode(TRANSPARENT);
settextcolor(BLACK);
for( j = 0; j <= 8200; j += 1)
{
BeginBatchDraw();
putimage(0, 0, &page);
for( i = 0; fgets(read, 1000, about) != NULL; i++)
{
outtextxy(285, 720 + 40 * i - j, read );
if (720 + 40 * i - j > 800)
break;
}
putimage(0, 0, &title);
rewind(about);
Sleep(15);
EndBatchDraw();
if (!_kbhit());
else
if (_getch() == ' ')
break;
cleardevice();
}
fclose(about);
mciSendString("pause ./file/about.wav", NULL, 0, NULL);
}
原理解析:
其他代码请下载源码查看