【C言語】ログイン後の異なるロールインターフェースへのジャンプを実現

目次

結果を示す

ソースコードの共有 

1.main.c [プログラムのメインエントリ]

2.Ctool.h [ツールヘッダーファイル]

3.Ctool.c [ツールクラスのソースファイル]

4.Cwindow.h [フォームクラスヘッダファイル]

5.Cwindow.c [フォームクラスソースファイル]

6.loginWin.h [ログインウィンドウと機能実現ヘッダファイル]

7.loginWin.c [ログイン画面と機能実現ソースファイル]

8.Admin.h [管理者ウィンドウのヘッダー ファイル]

9.Admin.c [管理者ウィンドウのソースファイル]

10.Manager.h [マネージャーウィンドウのヘッダーファイル]

11.Manager.c [マネージャーウィンドウのソースファイル]

12.Waiter.h [ウェイターウィンドウヘッダーファイル]

13.Waiter.c [ウェイターウィンドウのソースファイル]

14.user.h [ユーザー構造体および関連関数ヘッダー ファイル]

15.user.c [ユーザー構造体と関連関数のソースファイル]


結果を示す

ユーザー名とパスワードを次のように初期化します。

例: 番号 1001 のユーザー名は admin、パスワードは 123456、ロールは 1 [1 は管理者を表します]

ユーザー名とパスワードを入力してください 

ログインして管理者ロールのインターフェイスにジャンプします 

ログインしてマネージャーロールインターフェイスにジャンプします 

ログインしてサーバーロールインターフェイスにジャンプします 

ソースコードの共有 

1.main.c [プログラムのメインエントリ]

#include<stdio.h>
#include<string.h>
#include"user.h"
#include"loginWin.h"//登录界面使用
#include"Admin.h"//管理员界面使用
#include"Manager.h"//经理界面使用
#include"Waiter.h"//服务员界面使用
int count =3;  //初始化两个用户  全局变量

	//初始化用户结构体数组  做全局变量 其他.c中extern外部引用
	USER_T userArr[10]={	
		{1001,"admin","123456",1},
		{1002,"manager","123456",2},
		{1003,"waiter","123456",3}
	};

int main()
{   
	//数据类型+变量名   部分初始化
	USER_T newuser={0};//定义新用户 用户结构体 
	loginInit();//登录界面绘制显示
	return 0;				
}

2.Ctool.h [ツールヘッダーファイル]

#ifndef CTOOL_H
#define CTOOL_H

/*
函数名:void paintWindow(int startX,int startY,int width,int height)
函数功能:窗口打印函数
函数参数:int startX,int startY窗口起始位置
          int width,int height窗口的宽 高
函数返回值:无
*/
void paintWindow(int startX,int startY,int width,int height);

/*
函数名:void gotoxy(int x,int y)
函数功能:光标定位函数
函数参数:x表示列 y表示行
函数返回值:无
*/
void gotoxy(int x,int y);//形参  

/*
函数名:glb_string(int maxLen,int inputType,int ips,char str[])
函数功能:字符串输入控制
函数参数:int maxLen 允许输入最大长度
          int inputType 允许输入的字符类型  0:数字 1:字母 2:字母+数字
          int ips 数据显示格式  0:密文  1:明文
          char str[] 存储输入字符
函数返回值:无
char str[]    char str[20]    char*str
*/
void glb_string(int maxLen,int inputType,int ips,char str[]); 

#endif

3.Ctool.c [ツールクラスのソースファイル]

#include "Ctool.h"
#include <windows.h>   
#include<stdio.h>
#include<conio.h>

/*
函数名:void gotoxy(int x,int y)
函数功能:光标定位函数
函数参数:x表示列 y表示行
函数返回值:无
*/
void gotoxy(int x,int y)//形参
{
	HANDLE hOut;
	COORD pos= {x,y};
	// 光标的起始位(第1列,第3行) 0是第1列 2是第3行
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
	//printf("定位光标位置搜索(%d,%d)\n",pos.X,pos.Y);
}

/*
函数名:void paintWindow(int startX,int startY,int width,int height)
函数功能:窗口打印函数
函数参数:int startX,int startY窗口起始位置
          int width,int height窗口的宽 高
函数返回值:无
*/
void paintWindow(int startX,int startY,int width,int height)  //打印窗口 可以设置窗口大小  用户登录系统窗口
{	
	int i=0;
	//打印顶部   
	//光标定位 找规律 ┗  ┛ ┏ ┓ ┃ ━
	//顶部 y不变 x 在变 (x-x+w)
	gotoxy(startX,startY);
	printf("┏");
	for(i=0;i<width-2;i++)  //控制循环次数width-2次
	{
		printf("━ ");
	}
	printf("┓");

	//左边 x不变 y在变 (y到y+height)
	for(i=1;i<=height-1;i++)
	{
		gotoxy(startX,startY+i);
		printf("┃");
	}
	
	//右边 x不变 =startx+width-1  y在变 y 到 y+height
	for(i=1;i<=height-1;i++)
	{
		gotoxy(startX+width*2-3,startY+i);
		printf("┃");
	}

	//底部 x在变化    y不变 (x到x+width) ━ 
	gotoxy(startX,startY+height-1);
	printf("┗");
	for(i=0;i<width-2;i++)
	{
		printf("━ ");
	}
	printf("┛");

	gotoxy(startX,startX+height);
}

/*
函数名:glb_string(int maxLen,int inputType,int ips,char str[])
函数功能:字符串输入控制
函数参数:int maxLen 允许输入最大长度
          int inputType 允许输入的字符类型  0:数字 1:字母 2:字母+数字
          int ips 数据显示格式  0:密文  1:明文
          char str[] 存储输入字符
函数返回值:无
char str[]    char str[20]    char*str
*/
void glb_string(int maxLen,int inputType,int ips,char str[])
{
	   char ch=0;
	   int i=0;
	   while(1)
	   {
		   ch=getch();
		   if(ch=='\r'&&i>0)
		   { 
			   break; 
		   }
		   switch(inputType)
		   {
		   case 0:
			   if(ch>='0'&&ch<='9'&&i<maxLen)
			   {
				   if(ips==0)
				   {
					   putch('*');
				   }
				   else{
					   putch(ch);
				   }
				   str[i++]=ch; 
			   }
			   break;
		   case 1:
			   if(i<maxLen&&(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
			   {
				   if(ips==0)
				   {
					   putch('*');
				   }
				   else{
					   putch(ch);
				   }
				   str[i++]=ch;
			   }
			   break;
			case 2:
			   if(i<maxLen&&(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
				{
					if(ips==0)
					{
					  putch('*');						 
					}
					else{	 
					  putch(ch);
					}
					str[i++]=ch;			 
				}
				break;
			default:
				break;						 
		   }
	   }	   
}

4.Cwindow.h [フォームクラスヘッダファイル]

#ifndef CWINDOW_H
#define CWINDOW_H
//描述窗口相关的
#define LABEL 1 //控件使用宏定义  标签文本
#define EDIT 2  //                编辑框
#define BUTTON 3  //              按钮    ctrlType控件类型

//标签结构体的声明
typedef struct label_t
{
	int startx; //标签文本所放位置
	int starty;
	int width;//标签文本自身宽高
	int height;
	char content[20];//标签文本中输入对应的内容 字符数组
};

//编辑框结构体的声明
typedef struct edit_t
{
	int startx;//编辑框所放位置
	int starty;
	int width;//编辑框自身宽高
	int height;
	char content[20];//编辑框中输入的内容  字符数组的使用
	int inputType;//输入类型 0-数字 1-字母 2-数字+字母
	int ips;//显示类型 0-密文 1-明文
	int maxLen;  //最大长度
};

//按钮结构体的声明
typedef struct button_t
{
	int startx;//按钮所放位置
	int starty;
	int width;//按钮自身宽高
	int height;
	char content[20];//按钮中输入的内容
};

//以编辑框为标准统一管控(编辑框要求最多) 
//控件结构体的声明--编辑框 标签 按钮
typedef struct control_t
{
	int startx;//控件所放位置
	int starty;
	int width;//控件自身宽高
	int height;
	int maxLen;//最大长度
	int inputType;//输入类型 0-数字 1-字母 2-数字+字母
	int ips;//显示类型 0-密文 1-明文
	int ctrlType;  //控件类型 1-label 2-edit 3-button  区分控件的使用
	char content[20];//控件中输入的内容
}CONTROL_T;//typedef重命名  简化数据类型

//窗口结构体的声明 控件是要放入窗口当中的
typedef struct win_t
{
    int startx;//窗口所放位置
	int starty;
	int width;//窗口对应宽高
	int height;
	CONTROL_T ctrlArr[20];//存放控件结构体数组  窗口中有多个控件(结构体)
    int ctrlCount;   //记录控件总个数 初始化为0 用于添加控件函数中
}WIN_T;//窗口结构体 简化数据类型

/*  
函数名:int addControl(CONTROL_T ctrl,CONTROL_T ctrlArr[20] , int ctrlCount)
函数作用:添加控件
函数参数:
参数1:CONTROL_T ctrl 控件结构体
参数2:CONTROL_T ctrlArr[20]控件结构体数组
参数3:int ctrlCount控件个数
函数返回:控件总个数
*/
int addControl(CONTROL_T ctrl,CONTROL_T ctrlArr[20] , int ctrlCount);//添加控件到对应窗口中

//窗口显示函数可以绘制整个窗口以及每一个控件 而paintWindow只能画大框 不能显示里面的内容	
void showWindow(WIN_T win);//WIN_T win窗口结构体 数据类型+变量名

#endif

5.Cwindow.c [フォームクラスソースファイル]

#include "Cwindow.h"//添加控件 窗口显示
#include "Ctool.h"

/*  
函数名:int addControl(CONTROL_T ctrl,CONTROL_T ctrlArr[20] , int ctrlCount)
函数作用:添加控件
函数参数:
参数1:CONTROL_T ctrl 控件结构体
参数2:CONTROL_T ctrlArr[20]控件结构体数组
参数3:int ctrlCount控件个数
函数返回:控件总个数
*/
int addControl(CONTROL_T ctrl,CONTROL_T ctrlArr[20] , int ctrlCount)
{
	ctrlArr[ctrlCount++]=ctrl;//通过下标将控件结构体ctrl放到控件数组ctrlArr[20]当中 
//	ctrlCount记录控件总个数 添加控件其下标数
	return ctrlCount;
}

//窗口显示函数 绘制整个窗口以及每一个控件
void showWindow(WIN_T win)
{
	int i=0;//初始化 
	//首先显示大框
	paintWindow(win.startx,win.starty,win.width,win.height);//结构体变量名.属性
	//显示每一个控件win.ctrlArr[i]
	for(i=0;i<win.ctrlCount;i++)//遍历ctrlArr[]数组 长度ctrlCount一个一个获取 控件在窗口里
	{
		//类型 label  edit   button
		//如果是label    直接显示内容即可
		//如果是edit     画框(paintWindow) 显示内容
		//如果是button   画框                显示内容
		if(win.ctrlArr[i].ctrlType==LABEL)
		{  //每一个控件都有自己的起始位置  每一个控件放入相应的内容
			gotoxy(win.ctrlArr[i].startx,win.ctrlArr[i].starty);//光标定位
			puts(win.ctrlArr[i].content);//在控件中放入内容
		}
		else
		{
			//画编辑框 按钮框(小框)  避免小框和放入控件的文字内容镶嵌
			paintWindow(win.ctrlArr[i].startx-2,win.ctrlArr[i].starty-1,win.ctrlArr[i].width,win.ctrlArr[i].height);
		    //每一个控件都有自己的起始位置	每一个控件放入相应的内容
			gotoxy(win.ctrlArr[i].startx,win.ctrlArr[i].starty);//光标定位放入内容
			puts(win.ctrlArr[i].content); //在控件中放入内容
		}
	}
	gotoxy(0,29);//优化显示
}

6.loginWin.h [ログインウィンドウと機能実現ヘッダファイル]

#ifndef LOGINWIN_H
#define LOGINWIN_H

//登录的初始化--登录窗口的展示
void loginInit();

/*  
函数名:int doLogin(char name[],char pwd[])
函数作用:登录输入用户名密码  执行登录操作
函数参数:
参数1:char name[]用户名
参数2:char pwd[]密码
函数返回:角色 1是admin  2是 manager 3 是waiter      -1表示没登录成功
*/
int doLogin(char name[],char pwd[]);//登录输入用户名密码  函数返回:角色role是int 

#endif

7.loginWin.c [ログイン画面と機能実現ソースファイル]

#include"loginWin.h"
#include"Cwindow.h"//窗口 控件工具头文件
#include "Ctool.h"
#include"user.h"//userArr[10] 1是admin  2是 manager 3 是waiter
#include<stdio.h>//使用到printf
#include<string.h>//使用strcmp
#include<stdlib.h>

extern USER_T userArr[10];//引入外部变量 结构体数组定义时做全局变量
extern count;//count在main.c中是全局变量

//登录的初始化
void loginInit()
{
/* 
1.定义一个窗口
2.准备控件
3.组装:把控件结构体放在窗口的控件数组当中
4.展示:整个窗口  每一个控件
*/
	char name[9]={0};//定义用户名  初始化
	char pwd[7]={0}; //定义密码    初始化
	int role= -2;    //初始化登录返回的结果 不能0 1 2 -1(有含义)

/*  int startx;//窗口所放位置
	int starty;
	int width;//窗口对应宽高
	int height;
	CONTROL_T ctrlArr[20];//存放控件结构体数组  窗口中有多个控件
    int ctrlCount;   //记录控件总个数 初始化为0 用于添加控件函数中 */
	WIN_T loginWin={5,5,24,16};//有两个没填 部分初始化 控件结构体数组{0}  ctrlCount=0
	

/*	int maxLen;//最大长度
	int inputType;//输入类型 0-数字 1-字母 2-数字+字母
	int ips;//显示类型 0-密文 1-明文       这三个是编辑框使用 对标签文本和按钮初始化0即可
	int ctrlType;  //控件类型 1-label 2-edit 3-button  区分控件的使用
	char content[20];//控件中输入的内容      共填9个参数*/
	//标签文本控件
	CONTROL_T title={19,7,10,2,0,0,0,LABEL,"点菜系统"};
	CONTROL_T labName={10,9,10,3,0,0,0,LABEL,"请输入账号:"};
	CONTROL_T labPwd={10,12,10,3,0,0,0,LABEL,"请输入密码:"};
	//编辑器控件
	CONTROL_T editName={25,9,10,3,10,2,1,EDIT,""};
	CONTROL_T editPwd={25,12,10,3,8,0,0,EDIT,""};
	//按钮控件
	CONTROL_T btnok={10,15,8,3,0,0,0,BUTTON,"登录"};
	CONTROL_T btncancle={26,15,8,3,0,0,0,BUTTON,"返回"};
	
//3.组装:把控件结构体放在窗口的控件数组当中:
//在登录窗口界面中添加控件
/*  
函数名:int addControl(CONTROL_T ctrl,CONTROL_T ctrlArr[20] , int ctrlCount)
函数作用:添加控件
函数参数:
参数1:CONTROL_T ctrl 控件结构体
参数2:CONTROL_T ctrlArr[20]控件结构体数组
参数3:int ctrlCount控件个数
函数返回:控件总个数
*/
	loginWin.ctrlCount=addControl(title,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(labName,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(labPwd,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(editName,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(editPwd,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(btnok,loginWin.ctrlArr,loginWin.ctrlCount);
	loginWin.ctrlCount=addControl(btncancle,loginWin.ctrlArr,loginWin.ctrlCount);
	printf("控件个数,%d\n",loginWin.ctrlCount);
	
	//4.展示:整个窗口   每一个控件:展示窗口和每一个控件 
    showWindow(loginWin);//把登录窗口显示出来
	
	gotoxy(27,9);//定位到用户名
	// int maxLen最大长度 , int inputType输入类型  ,int ips显示明密文 ,char str[]字符数组
	glb_string(8,2,1,name);//控制字符输入函数
    gotoxy(27,12);//定位到密码
    glb_string(6,0,0,pwd);
	
	//做登录操作
	role= doLogin(name,pwd);
	gotoxy(20,18);
	if(role==-1)//失败
	{
		printf("登录失败\n");	
	}
	else{
		printf("登录成功\n");
		system("cls");

		switch(role){
		case ADMIN:
		adminInit();
			break;
		case MANAGER:
		managerInit();
			break;
		case WAITER:
		waiterInit();
			break;
		default:
			break;
		}		
	}
}

/*  
函数名:int doLogin(char name[],char pwd[])
函数作用:登录输入用户名密码  执行登录操作
函数参数:
参数1:char name[]用户名
参数2:char pwd[]密码
函数返回:角色 1是admin  2是 manager 3 是waiter      -1表示没登录成功
*/
int doLogin(char name[],char pwd[])
{
	int i=0;
	for(;i<count;i++)  // 0 1 2数组下标逐个遍历
	{
		//对比用户名和密码都要相等  结构体数组在main.c中定义是全局变量 extern引用 
		if(strcmp(name,userArr[i].name)==0&&strcmp(pwd,userArr[i].pwd)==0)
		{
			// 用户名密码相等表示登录成功 登录成功返回角色 
			return userArr[i].role;
		}
	}
	//登录失败
	return -1;	
}

8.Admin.h [管理者ウィンドウのヘッダー ファイル]

#ifndef ADMIN_H
#define ADMIN_H

//管理员窗口的初始化
void adminInit();

#endif

9.Admin.c [管理者ウィンドウのソースファイル]

#include"Admin.h"
#include"Cwindow.h"
#include "Ctool.h"
#include<stdio.h>

//登录的初始化
void adminInit()
{
/*   
int startx;//窗口所放位置
int starty;
int width;//窗口对应宽高
int height;
CONTROL_T ctrlArr[20];//存放控件结构体数组  窗口中有多个控件
int ctrlCount;   //记录控件总个数 初始化为0 用于添加控件函数中 
*/
	WIN_T Admin={3,3,25,23};//部分初始化 控件结构体数组{0}  ctrlCount=0
	//控件的使用:控件所放位置 控件自身宽高 以及以下
/*	int maxLen;//最大长度
	int inputType;//输入类型 0-数字 1-字母 2-数字+字母
	int ips;//显示类型 0-密文 1-明文       这三个是编辑框使用 对标签文本和按钮初始化0即可
	int ctrlType;  //控件类型 1-label 2-edit 3-button  区分控件的使用
	char content[20];//控件中输入的内容      共填9个参数*/

	CONTROL_T titleguan={19,5,10,2,0,0,0,LABEL,"管理员界面"};
	
	CONTROL_T btntaizhuo={19,9,8,3,0,0,0,BUTTON,"台桌管理"};
	CONTROL_T btncaipu={19,12,8,3,0,0,0,BUTTON,"菜谱管理"};
	CONTROL_T btnrenyuan={19,15,8,3,0,0,0,BUTTON,"人员管理"};
	CONTROL_T btnzhuxiao={19,18,8,3,0,0,0,BUTTON,"注销"};
	CONTROL_T btntuichu={19,21,8,3,0,0,0,BUTTON,"退出"};

	//添加控件 void addControl(参数1:控件结构体(控件) 参数2:控件数组 参数3:控件个数);	
	//通过下标将控件ctrl放到控件数组ctrlArr[20]当中  在登录窗口界面中添加控件
	Admin.ctrlCount=addControl(titleguan,Admin.ctrlArr,Admin.ctrlCount);
	Admin.ctrlCount=addControl(btntaizhuo,Admin.ctrlArr,Admin.ctrlCount);
	Admin.ctrlCount=addControl(btncaipu,Admin.ctrlArr,Admin.ctrlCount);
	Admin.ctrlCount=addControl(btnrenyuan,Admin.ctrlArr,Admin.ctrlCount);
	Admin.ctrlCount=addControl(btnzhuxiao,Admin.ctrlArr,Admin.ctrlCount);
	Admin.ctrlCount=addControl(btntuichu,Admin.ctrlArr,Admin.ctrlCount);
	
	printf("控件个数,%d\n",Admin.ctrlCount);
    showWindow(Admin);	
}

10.Manager.h [マネージャーウィンドウのヘッダーファイル]

#ifndef MANAGER_H
#define MANAGER_H

//经理窗口的初始化
void managerInit();

#endif

11.Manager.c [マネージャーウィンドウのソースファイル]

#include"Manager.h"
#include"Cwindow.h"
#include "Ctool.h"
#include<stdio.h>

void managerInit()
{
/*  int startx;//窗口所放位置
	int starty;
	int width;//窗口对应宽高
	int height;
	CONTROL_T ctrlArr[20];//存放控件结构体数组  窗口中有多个控件
    int ctrlCount;   //记录控件总个数 初始化为0 用于添加控件函数中 */
	WIN_T Manager={3,3,25,23};//部分初始化 控件结构体数组{0}  ctrlCount=0

/*	int maxLen;//最大长度
	int inputType;//输入类型 0-数字 1-字母 2-数字+字母
	int ips;//显示类型 0-密文 1-明文       这三个是编辑框使用 对标签文本和按钮初始化0即可
	int ctrlType;  //控件类型 1-label 2-edit 3-button  区分控件的使用
	char content[20];//控件中输入的内容      共填9个参数*/
	CONTROL_T titlejingli={19,5,10,2,0,0,0,LABEL,"经理功能界面"};
	
	CONTROL_T btnyingshou={19,9,8,3,0,0,0,BUTTON,"营收汇总"};
	CONTROL_T btnzhuxiao={19,12,8,3,0,0,0,BUTTON,"注销"};
	CONTROL_T btntuichu={19,15,8,3,0,0,0,BUTTON,"退出"};

	//添加控件 void addControl(参数1:控件结构体(控件) 参数2:控件数组 参数3:控件个数);	
	//通过下标将控件ctrl放到控件数组ctrlArr[20]当中  在登录窗口界面中添加控件
	Manager.ctrlCount=addControl(titlejingli,Manager.ctrlArr,Manager.ctrlCount);
	Manager.ctrlCount=addControl(btnyingshou,Manager.ctrlArr,Manager.ctrlCount);
	Manager.ctrlCount=addControl(btnzhuxiao,Manager.ctrlArr,Manager.ctrlCount);
	Manager.ctrlCount=addControl(btntuichu,Manager.ctrlArr,Manager.ctrlCount);

	printf("控件个数,%d\n",Manager.ctrlCount);
    showWindow(Manager);	
}

12.Waiter.h [ウェイターウィンドウヘッダーファイル]

#ifndef WAITER_H
#define WAITER_H

//服务员窗口的初始化
void waiterInit();

#endif

13.Waiter.c [ウェイターウィンドウのソースファイル]

#include"Waiter.h"
#include"Cwindow.h"
#include "Ctool.h"
#include<stdio.h>

void waiterInit()
{
/*  int startx;//窗口所放位置
	int starty;
	int width;//窗口对应宽高
	int height;
	CONTROL_T ctrlArr[20];//存放控件结构体数组  窗口中有多个控件
    int ctrlCount;   //记录控件总个数 初始化为0 用于添加控件函数中 */
	WIN_T Waiter={3,3,25,25};//部分初始化 控件结构体数组{0}  ctrlCount=0

/*	int maxLen;//最大长度
	int inputType;//输入类型 0-数字 1-字母 2-数字+字母
	int ips;//显示类型 0-密文 1-明文       这三个是编辑框使用 对标签文本和按钮初始化0即可
	int ctrlType;  //控件类型 1-label 2-edit 3-button  区分控件的使用
	char content[20];//控件中输入的内容      共填9个参数*/
	CONTROL_T titlefuwu={19,5,10,2,0,0,0,LABEL,"服务员功能界面"};
	
	CONTROL_T btnkaizhuo={19,9,10,3,0,0,0,BUTTON,"开桌"};
	CONTROL_T btndiancai={19,12,10,3,0,0,0,BUTTON,"点菜"};
	CONTROL_T btnyingyee={19,15,10,3,0,0,0,BUTTON,"营业额查询"};
	CONTROL_T btnyi={19,18,10,3,0,0,0,BUTTON,"已买/未买单查询"};
	CONTROL_T btnzhuxiao={19,21,10,3,0,0,0,BUTTON,"注销"};
	CONTROL_T btntuichu={19,24,10,3,0,0,0,BUTTON,"退出"};

//添加控件 void addControl(参数1:控件结构体(控件) 参数2:控件数组 参数3:控件个数);	
//通过下标将控件ctrl放到控件数组ctrlArr[20]当中  在登录窗口界面中添加控件
	Waiter.ctrlCount=addControl(titlefuwu,Waiter.ctrlArr,Waiter.ctrlCount);
	Waiter.ctrlCount=addControl(btnkaizhuo,Waiter.ctrlArr,Waiter.ctrlCount);
	Waiter.ctrlCount=addControl(btndiancai,Waiter.ctrlArr,Waiter.ctrlCount);
	Waiter.ctrlCount=addControl(btnyingyee,Waiter.ctrlArr,Waiter.ctrlCount);
	Waiter.ctrlCount=addControl(btnyi,Waiter.ctrlArr,Waiter.ctrlCount);
	Waiter.ctrlCount=addControl(btnzhuxiao,Waiter.ctrlArr,Waiter.ctrlCount);
	Waiter.ctrlCount=addControl(btntuichu,Waiter.ctrlArr,Waiter.ctrlCount);
	
	printf("控件个数,%d\n",Waiter.ctrlCount);
    showWindow(Waiter);
}

14.user.h [ユーザー構造体および関連関数ヘッダー ファイル]

#ifndef USER_H
#define USER_H
#define ADMIN 1
#define MANAGER 2
#define WAITER 3

//用户结构体声明
typedef struct user_t
{
	int ID;
	char name[20];
	char pwd[20];
	int role;  //数字表示角色 1是admin  2是 manager 3 是waiter
}USER_T;

//打印用户信息     三种写法 userArr[10]  userArr[ ]   userArr*
void printUserInfo(USER_T userArr[10]);

//用户添加 用户结构体添加到用户结构体数组
void addUser(USER_T newuser , USER_T userArr[10]);

#endif

15.user.c [ユーザー構造体と関連関数のソースファイル]

#include"user.h"
#include<stdio.h>
#include<string.h>//memcpy需要头文件

extern count;  //外部引用 引入main.c中的count(全局变量)

//打印用户信息
void printUserInfo(USER_T userArr[10])
{
	int i=0;
	printf("%d\n",count);
	for(i=0;i<count;i++)
	{
		printf("%d\t%s\t%s\t",userArr[i].ID,userArr[i].name,userArr[i].pwd);
		switch(userArr[i].role)
		{
		case ADMIN:
			printf("管理员\n");
			break;
		case MANAGER:
			printf("经理\n");
			break;
		case WAITER:
			printf("服务员\n");
			break;
		default :
			break;
		}
	}
}

//用户添加 用户结构体添加到用户结构体数组
void addUser(USER_T newuser , USER_T userArr[10])//将newuser添加到userArr[10]中
{
	//userArr[count++]=newuser;
	memcpy(&userArr[count++],&newuser,sizeof(USER_T));//地址内存拷贝赋值 取地址 数组 变量名 长度
}


おすすめ

転載: blog.csdn.net/m0_56051805/article/details/124154264#comments_27305133