爱玩粥的有福了,带图形界面的明日方舟皮肤的员工管理系统,数据结构期末实训满分。

news2024/9/28 9:24:52

 💯 博客内容:复习数据结构

😀 作  者:陈大大陈

🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信!

💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

这个程序底层是easyx图形库,通过在easyx上封装的一个工具类(即输入框、按钮、label等),是在此基础上开发的这个系统。

我们期末的数据结构实训已经结束了,我凭借着一手粥批图形界面员工管理系统给老师整不会了,

也是顺利得到优秀,接下来就给大家展示一下我一周的成果! 

大家记得三连加关注,接下来我会一直改进这个代码,把它改造的越来越好的。

目录

运行截图

源码分享

  employ.h

 employ.c

 DK_DUI.cpp

DK_DUI.h

main.cpp

程序插入的图片

运行截图

会有一个从零到百分之一百的加载动画,这里就不展示了。  

点击职工管理会进入职工管理界面。

 我手动添加了几个干员信息。

接下来点击排序职工可以按不同方式排序。

 下图是点击ID倒序排序的结果:

 可以按ID和姓名两种方式查询:

下图是查找ID为1的职工的结果。 

 也可添加职工,添加如下干员的信息。

 点击添加:

 点击删除可以删除该条职工信息。

删除星熊的信息。 

删除成功。

点击编辑,可以编辑干员的信息。

如图,将诗怀雅的职位从吉祥物改为龙门高级警司。

点击修改。

 可以看到诗怀雅的职位成功被改变。高级警司捏!

 点击退出系统,会弹出上面的窗口,点击确定程序自动保存并退出。

信息会保存在一个文本文档里,下次可以直接读取。

第一个数据是职工的个数。

源码分享

  employ.h

#pragma once
#ifdef _cplusplus
Extern "C"{
#endif
	typedef struct Employee
	{
		char id[10];
		char name[15];
		char sex[10];
		char birt[9];
		char educ[20];
		char job[15];
		char tele[15];
		char addr[20];
		struct Employee* pNext;
	
	}Employee;
	Employee* CreateEmployee();
	Employee* CreateEmployeeForm(char* id, char* name, char* sex, char* birt, char* educ, char* job, char* tele, char* addr);
#ifdef _cplusplus
}
#endif

 employ.c

#define _CRT_SECURE_NO_WARNINGS
#include "Employee.h"
#include<malloc.h>
#include<assert.h>
#include<string.h>
#include<stdio.h>
Employee* CreateEmployee()
{
    Employee* emp = (Employee*)calloc(1, sizeof(Employee));
    assert(emp);
    return emp;
}
Employee* CreateEmployeeForm(char* id, char* name, char* sex, char* birt, char* educ, char* job,char* tele, char* addr)
{
    Employee* emp = CreateEmployee();
    strcpy(emp->id, id);
    strcpy(emp->name, name); 
    strcpy(emp->sex, sex);
    strcpy(emp->birt, birt);
    strcpy(emp->educ, educ);
    strcpy(emp->job, job);
    strcpy(emp->tele, tele);
    strcpy(emp->addr, addr);
    return emp;
}
const char** emp_toStringArray(Employee* emp)
{
    static const char* info[8];
    static char buf[8][20];
  
    sprintf(buf[0], "%s", emp->id);
    sprintf(buf[1], "%s", emp->name);
    sprintf(buf[2], "%s", emp->sex);
    sprintf(buf[3], "%s", emp->birt);
    sprintf(buf[4], "%s", emp->educ);
    sprintf(buf[5], "%s", emp->job);
    sprintf(buf[6], "%s", emp->addr);
    sprintf(buf[7], "%s", emp->tele);
    for (int i = 0; i < 8; i++)
    {
        info[i] = buf[i];
    }
    return info;
}

 DK_DUI.cpp

#include "DK_GUI.h"
#include <malloc.h>
#include <stdio.h>
/*palette*/
//按钮调色板
Palette ButtonPalette = { RGB(240,240,240),RGB(166,166,166),BLACK ,BLACK ,RGB(179,202,234),RGB(179,202,234) ,RGB(196,213,255) };
//编辑框调色板
Palette EditPalette = { RGB(242,245,252),RGB(252,252,252),BLACK ,BLACK ,RGB(133,145,162),RGB(32,61,119),RGB(252,252,252) };
void drawRoundRect(Rect* rect);
void drawRoundRect2(Rect* rect)
{
	roundrect(rect->x, rect->y, rect->x + rect->w, rect->y + rect->h, 10, 10);
}
DrawShapeCallBack gDrawFunc = drawRoundRect2;//绘制圆角矩形//



const int bufferSize = 100;
struct GUIState /*UI状态*/
{
	//Mouse
	int mx;
	int my; //鼠标当前的坐标//
	bool mouseDown;
	int hotItem;	//鼠标当前悬停的item
	int activeItem;	//拥有鼠标焦点的item

	//key
	int kbdItem;		//拥有键盘焦点的item
	int keyEntered;		//按下的按键
	int keyModifier;	//修饰符按键

	//char
	char ch[bufferSize];
	int lastWidget;


}state = { 0,0,false };

/*控件*/
bool GUI_button(int id, Rect rect, const char* text)
{
	//第一步//
	if (pointInRect({ state.mx, state.my }, rect))
	{
		state.hotItem = id;
		//如果没有获取焦点的item,并且鼠标按下了,就获取焦点
		if (state.activeItem == 0 && state.mouseDown)
			state.activeItem = id;
	}

	//第二步//
	if (state.hotItem == id) //如果鼠标在当前按钮上悬停
	{

		if (state.activeItem == id)//有焦点,焦点变色
		{
			setfillcolor(ButtonPalette.focusColor);
			setlinecolor(ButtonPalette.focusColor);
		}
		else//鼠标所在位置变色
		{
			setfillcolor(ButtonPalette.bgHoverColor);
			setlinecolor(ButtonPalette.borderHoverColor);
		}
		settextcolor(ButtonPalette.fgHoverColor);//前景颜色
	}
	else
	{
		setfillcolor(ButtonPalette.bgNormalColor);//背景颜色
		setlinecolor(ButtonPalette.borderNormalColor);//前景平时颜色
		settextcolor(ButtonPalette.fgNormalColor);//前景文字颜色
	}

	//绘制按钮
	gDrawFunc(&rect);//绘制圆角矩形//
	//绘制文本
	outtextxy(rect.x + (rect.w - textwidth(text)) / 2, rect.y + (rect.h - textheight(text)) / 2, text);


	//鼠标悬停在项目上时触发该代码 返回true
	if (state.mouseDown == false && state.hotItem == id && state.activeItem == id)
		return true;

	return false;
}

/*bool GUI_button(int id, Rect rect, const char* text)
{
	//如果没有控件有键盘焦点,获取它
	if (state.kbdItem == 0)
		state.kbdItem = id;

	if (pointInRect({ state.mx, state.my }, rect))
	{
		state.hotItem = id;
		//如果没有获取焦点的item,并且鼠标按下了,就获取焦点
		if (state.activeItem == 0 && state.mouseDown)
			state.activeItem = id;
	}


	//如果鼠标在当前按钮上悬停
	if(state.hotItem == id)
	{
		//并且有焦点
		if (state.activeItem == id)
		{
			setfillcolor(BROWN);
			setlinecolor(ButtonPalette.focusColor);
			//setfillcolor(BLACK);
			//setlinestyle(PS_DASHDOT, 1);
			//setlinecolor(RED);
			//Rect r = { rect.x - 1,rect.y - 1,rect.w + 2,rect.h + 2 };
			//gDrawFunc(&r);
			//setlinestyle(PS_SOLID, 1);
		}
		else
		{
			setfillcolor(ButtonPalette.bgHoverColor);
			setlinecolor(ButtonPalette.borderHoverColor);
			//setfillcolor(gTheme->bgHoverColor);
			//setlinecolor(gTheme->borderHoverColor);
			//settextcolor(gTheme->fgHoverColor);
		}
		settextcolor(ButtonPalette.fgHoverColor);
	}
	else
	{
		setfillcolor(ButtonPalette.bgNormalColor);
		setlinecolor(ButtonPalette.borderNormalColor);
		settextcolor(ButtonPalette.fgNormalColor);
		//setfillcolor(gTheme->bgNormalColor);
		//setlinecolor(gTheme->borderNormalColor);
		//settextcolor(gTheme->fgNormalColor);
	}

	if (state.kbdItem == 0)
		state.kbdItem = id;

	if (state.kbdItem == id)
	{
		setfillcolor(ButtonPalette.bgNormalColor);
		setlinecolor(ButtonPalette.focusColor);
		//setfillcolor(BLACK);
		//setlinestyle(PS_DASHDOT, 1);
		//setlinecolor(RED);
		//Rect r = { rect.x - 1,rect.y - 1,rect.w + 2,rect.h + 2 };
		//gDrawFunc(&r);
		//setlinestyle(PS_SOLID, 1);
	}

	//绘制按钮
	gDrawFunc(&rect);
	//绘制文本
	outtextxy(rect.x + (rect.w - textwidth(text)) / 2,
		rect.y + (rect.h - textheight(text)) / 2, text);

	if (state.kbdItem == id)
	{
		switch (state.keyEntered)
		{
		case VK_TAB:
			state.kbdItem = 0;

			if (state.keyModifier == 1)
				state.kbdItem = state.lastWidget;

			state.keyEntered = 0;

			break;
		case VK_RETURN:
			return true;
			break;
		}
	}
	state.lastWidget = id;

	//鼠标弹起时触发点击
	if (state.mouseDown == false && state.hotItem == id && state.activeItem == id)
		return true;

	return false;
}*/

void drawImg(int x, int y, IMAGE* src)
{
	// 变量初始化
	DWORD* pwin = GetImageBuffer();			//窗口缓冲区指针
	DWORD* psrc = GetImageBuffer(src);		//图片缓冲区指针

	int win_w = getwidth();				//窗口宽高
	int win_h = getheight();

	int src_w = src->getwidth();				//图片宽高
	int src_h = src->getheight();

	// 计算贴图的实际长宽
	int real_w = (x + src_w > win_w) ? win_w - x : src_w;			// 处理超出右边界
	int real_h = (y + src_h > win_h) ? win_h - y : src_h;			// 处理超出下边界
	if (x < 0) { psrc += -x;			real_w -= -x;	x = 0; }	// 处理超出左边界
	if (y < 0) { psrc += (src_w * -y);	real_h -= -y;	y = 0; }	// 处理超出上边界


	// 修正贴图起始位置
	pwin += (win_w * y + x);

	// 实现透明贴图
	for (int iy = 0; iy < real_h; iy++)
	{
		for (int ix = 0; ix < real_w; ix++)
		{
			byte a = (byte)(psrc[ix] >> 24);//计算透明通道的值[0,256) 0为完全透明 255为完全不透明
			if (a > 100)
			{
				pwin[ix] = psrc[ix];
			}
		}
		//换到下一行
		pwin += win_w;
		psrc += src_w;
	}
}

void drawImg(int x, int y, int dstW, int dstH, IMAGE* src, int srcX, int srcY)
{
	// 变量初始化
	DWORD* pwin = GetImageBuffer();			//窗口缓冲区指针
	DWORD* psrc = GetImageBuffer(src);		//图片缓冲区指针

	int win_w = getwidth();				//窗口宽高
	int win_h = getheight();

	int src_w = src->getwidth();				//图片宽高
	int src_h = src->getheight();


	// 计算贴图的实际长宽
	int real_w = (x + dstW > win_w) ? win_w - x : dstW;			// 处理超出右边界
	int real_h = (y + dstH > win_h) ? win_h - y : dstH;			// 处理超出下边界
	if (x < 0) { psrc += -x;			real_w -= -x;	x = 0; }	// 处理超出左边界
	if (y < 0) { psrc += (dstW * -y);	real_h -= -y;	y = 0; }	// 处理超出上边界

	//printf("realw,h(%d,%d)\n", real_w, real_h);
	// 修正贴图起始位置
	pwin += (win_w * y + x);

	// 实现透明贴图
	for (int iy = 0; iy < real_h; iy++)
	{
		for (int ix = 0; ix < real_w; ix++)
		{
			byte a = (byte)(psrc[ix + srcX + srcY * src_w] >> 24);//计算透明通道的值[0,256) 0为完全透明 255为完全不透明
			if (a > 100)
			{
				pwin[ix] = psrc[ix + srcX + srcY * src_w];
			}
		}
		//换到下一行
		pwin += win_w;
		psrc += src_w;
	}
}



//绘制img图像
bool GUI_button(int id, Point pos, IMAGE* normalImg, IMAGE* hoverImg)//buttom:按钮
{
	bool inRect = pointInRect({ state.mx, state.my }, { pos.x,pos.y,normalImg->getwidth(),normalImg->getheight() });
	//判断点是否在矩形范围内

	if (inRect)
	{
		drawImg(pos.x, pos.y, normalImg);//平时显示的效果
	}
	else
	{
		drawImg(pos.x, pos.y, hoverImg);//hoverimg:悬停时显示的效果
	}
	if (inRect && state.mouseDown)//按下鼠标时创建inRect(可变形矩形)//
		return true;
	return false;
}

bool GUI_edit(int id, Rect rect, char* buffer, size_t size)
{
	if (pointInRect({ state.mx, state.my }, rect))//点击输入框时
	{
		state.hotItem = id;//鼠标移动到项目上
		if (state.activeItem == 0 && state.mouseDown)//鼠标选中设为焦点
			state.activeItem = id;
	}


	if (state.activeItem == id || state.hotItem == id)//鼠标移动到被设为焦点的项目上
	{
		setfillcolor(EditPalette.bgHoverColor);//鼠标悬停时项目显示的颜色
		setlinecolor(EditPalette.borderHoverColor);//该边框显示的颜色
		settextcolor(EditPalette.fgHoverColor);//前景颜色
	}
	else//无焦点,颜色不变
	{
		setfillcolor(EditPalette.bgNormalColor);
		setlinecolor(EditPalette.borderNormalColor);
		settextcolor(EditPalette.fgNormalColor);
	}

	//绘制按钮
	gDrawFunc(&rect);
	//绘制文本
	outtextxy(rect.x + 5, rect.y + (rect.h - textheight(buffer)) / 2, buffer);//在指定位置输出字符串

	int len = strlen(buffer);//Buffer:缓冲区
	bool changed = false;

	if (state.kbdItem == id && (GetTickCount() >> 9) & 1)
		outtextxy(rect.x + 5 + textwidth(buffer), rect.y + (rect.h - textheight("|")) / 2, "|");//在指定位置输出字符串

	if (state.kbdItem == id)//键盘设定焦点
	{
		switch (state.keyEntered)//判断按下的案件
		{
		case VK_TAB:
			state.kbdItem = 0;
			//按tab键,让焦点切换到下一个输入框
			if (state.keyModifier == 1)
				state.kbdItem = state.lastWidget;
			state.keyEntered = 0;
			break;

		case '\b'://光标向左移动两个字符,  例:  输入:我喜欢用C语言写\b\b\b程序  输出:我喜欢用C程序写
			if (len > 1 && buffer[len - 1] < 0 && buffer[len - 2] < 0)
			{
				buffer[len - 2] = '\0';
				changed = true;
			}
			//删除一个字符
			else if (len > 0)
			{
				buffer[len - 1] = '\0';
				changed = true;
			}
			break;

		case '\r'://换行
		case '\n':
			state.kbdItem = -1;	//清除焦点
			return changed;
			break;

		default:
			//最多只能输入size-1长度
			if (len < size)
			{
				//只能输入数字2~9、字母、符号、中文
				for (int i = 0; i < bufferSize; i++) {
					if (state.ch[i] != '\0') {
						buffer[len++] = state.ch[i];
						buffer[len] = '\0';
						changed = true;
					}
					else {
						break;
					}
				}

			}
			break;
		}
	}

	if (state.mouseDown == false && state.hotItem == id && state.activeItem == id)//鼠标悬停在项目上时触发该代码
	{
		state.kbdItem = id;//使用键盘输入
	}
	state.lastWidget = id;
	return changed;
}

//文本框
void GUI_label(Rect rect, const char* text, bool center)
{
	if (center)
	{
		outtextxy(rect.x + (rect.w - textwidth(text)) / 2, rect.y + (rect.h - textheight(text)), text);
	}
	else
	{
		outtextxy(rect.x, rect.y, text);
	}
}

bool pointInRect(Point pos, Rect rect)//判断点的位置
{
	return pos.x > rect.x && pos.x<rect.x + rect.w && pos.y>rect.y && pos.y < rect.y + rect.h;
}

void setDrawShapeCallBack(DrawShapeCallBack fun)//自定义绘图控件
{
	gDrawFunc = fun;
}

void unsetDrawShapeCallBack()
{
	gDrawFunc = drawRoundRect;
}

void drawRoundRect(Rect* rect)//绘制圆角矩阵
{
	fillroundrect(rect->x, rect->y, rect->x + rect->w, rect->y + rect->h, 10, 10);
}

bool loadTexture(IMAGE* img, const char* filename, int w, int h)//加载图片
{
	loadimage(img, filename, w, h);
	if (img->getwidth() == 0 || img->getheight() == 0)//图片错误,报错
	{
		printf("<%s> load failed:%s", filename, "请检查路径或文件名是否正确\n");
		return false;
	}
	return true;
}

void GUI_stateInit()
{
	setbkmode(TRANSPARENT);//透明背景
}

/*状态函数*/
void GUI_stateUpdate(ExMessage* msg)
{
	if (msg->message == WM_MOUSEMOVE)//鼠标移动,坐标变化
	{
		state.mx = msg->x;
		state.my = msg->y;
	}
	else if (msg->message == WM_LBUTTONDOWN)//点击鼠标左键
	{
		state.mouseDown = true;
	}
	else if (msg->message == WM_LBUTTONUP)//左键弹起
	{
		state.mouseDown = false;
	}
	else if (msg->message == WM_CHAR)//输入
	{
		for (int i = 0; i < bufferSize; i++) {
			if (state.ch[i] == '\0') {
				state.ch[i] = msg->ch;
				break;
			}
		}

	}
	else if (msg->message == WM_KEYDOWN)//按下键盘
	{
		state.keyEntered = msg->vkcode;
		state.keyModifier = msg->ctrl ? 1 : (msg->shift ? 2 : 0);
	}
	else if (msg->message == WM_KEYUP)//按键弹起
	{
	}
}

void GUI_stateBegin()
{
	
	setbkcolor(WHITE);
	BeginBatchDraw();
	cleardevice();

	//每帧开始时,重置鼠标悬停
	state.hotItem = 0;
}

void GUI_stateEnd()
{
	EndBatchDraw();// 结束批量绘制,并执行未完成的绘制任务

	//如果鼠标没有按下
	if (!state.mouseDown)
	{
		//取消焦点
		state.activeItem = 0;
	}

	//如果鼠标按下了
	else
	{
		if (state.activeItem == 0)//设置焦点
			state.activeItem = -1;
	}

	if (state.keyEntered == VK_TAB)//按下tab键
		state.kbdItem = 0;
	state.keyEntered = 0;
	memset(state.ch, '\0', sizeof(state.ch));
}


DK_DUI.h

#ifndef DK_GUI_H_
#define DK_GUI_H_
#include "DK_GUI.h"
#include <malloc.h>
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS

#ifdef UNICODE
#undef UNICODE
#endif // UNICODE
#include<easyx.h>

#ifdef _START_ID_
#define GUID __LINE__ + _START_ID_
#else
#define GUID __LINE__
#endif // !_START_ID_



struct Rect
{
	int x;
	int y;
	int w;
	int h;
};
struct Point
{
	int x;
	int y;
};

/*按钮*/
bool GUI_button(int id, Rect rect, const char* text);
bool GUI_button(int id, Point pos, IMAGE* normalImg, IMAGE* hoverImg);

/*输入框*/
bool GUI_edit(int id, Rect rect, char* buffer, size_t len);

/*文本框*/
void GUI_label(Rect rect, const char* text, bool center);

/*对话框*/
#define GUI_DialogEx(title,width,height) \
Rect rect = { (getwidth() - width) / 2,(getheight() - height) / 2,width,height };\
setfillcolor(ButtonPalette.bgNormalColor);\
drawRoundRect(&rect);\
\
settextcolor(BLACK);\
GUI_label({ rect.x + 5,rect.y + 5,0,0 }, title, false);\
\
if (GUI_button(GUID, { rect.x + rect.w - 32,rect.y,32,32 }, "X"))

#define GUI_Dialog(title) GUI_DialogEx(title,350,250)


/*helper*/
bool pointInRect(Point pos, Rect rect);
void drawImg(int x, int y, IMAGE* src);
void drawImg(int x, int y, int dstW, int dstH, IMAGE* src, int srcX, int srcY);
void drawRoundRect(Rect* rect);

/*自定义控件绘图*/
typedef void (*DrawShapeCallBack)(Rect* rect);
void setDrawShapeCallBack(DrawShapeCallBack fun);
void unsetDrawShapeCallBack();

/*加载图片*/
bool loadTexture(IMAGE* img, const char* filenmae, int w = 0, int h = 0);

/*UIState*/
void GUI_stateInit();
void GUI_stateUpdate(ExMessage* msg);
void GUI_stateBegin();
void GUI_stateEnd();


/*Palette 调色板*/
struct Palette
{
	//背景
	COLORREF bgNormalColor;		//背景颜色
	COLORREF bgHoverColor;		//鼠标悬停背景颜色
	//前景(文本)
	COLORREF fgNormalColor;		//前景颜色(文本)
	COLORREF fgHoverColor;		//前景颜色(鼠标悬停)
	//边框
	COLORREF borderNormalColor;	//边框正常颜色
	COLORREF borderHoverColor;	//边框鼠标悬停颜色
	//焦点
	COLORREF focusColor;
};
extern Palette ButtonPalette;
extern Palette EditPalette;

#endif // !DK_GUI_H_

main.cpp

#define _CRT_SECURE_NO_WARNINGS
#include"GUI/DK_GUI.h"
#include "Employee.h"
#include"Employee.c"
#include<stdio.h>
#include<Windows.h>
#include<easyx.h>
/*
*课题内容:图形界面版本管理系统
*开发环境:vs2019 + easyx
*/
int g_nValue = 0;
int editButton = 10100;
int deleteButton = 10200;
int editInput = 10300;
int newInput = 10400;

char id[10];
char name[15];
char sex[10];
char birt[9];
char educ[20];
char job[15];
char tele[15];
char addr[20];

char editId[10];
char editName[15];
char editSex[10];
char editBirt[9];
char editEduc[20];
char editJob[15];
char editTele[15];
char editAddr[20];

enum Page
{
	MenuPage,//菜单界面
	ShowStudentPage, //显示学生界面
	AddStudentPage,  //添加学生界面
	EditStudentPage, //编辑学生界面
	SearchStudentPage,//查找学生界面
	SortStudentPage,
	QuitSystemPage
};
Page page = MenuPage;
//创建员工
Employee* emp[20];
int emp_size = 0;
void write()//写入数据
{
	FILE* fp;
	int i = 0;
	if ((fp = fopen("F:\\date2.txt", "w")) == NULL)
	{
		printf("无法打开文件!\n");
		return;
	}
	fprintf(fp, "%d\n", emp_size);
	while (i < emp_size)
	{
		fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", emp[i]->id, emp[i]->name, emp[i]->sex, emp[i]->birt, emp[i]->educ, emp[i]->job, emp[i]->tele, emp[i]->addr);
		i++;
	}
	fclose(fp);
}

void read()//读入数据
{
	FILE* fp;
	int i = 0;
	if ((fp = fopen("F:\\date2.txt", "r")) == NULL)
	{
		printf("请您先在F盘根目录下新建一个文本文件,文件名为date2\n\n\n");
		system("pause");
		system("cls");
		return;
	}

	fscanf(fp, "%d\n", &emp_size);

	printf("%d", emp_size);
	while (i < emp_size)
	{
		emp[i] = { CreateEmployeeForm("001","陈一","男","20040615","大学本科","校长","邯郸市","15831701156") };
		fscanf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", emp[i]->id, emp[i]->name, emp[i]->sex, emp[i]->birt, emp[i]->educ, emp[i]->job, emp[i]->tele, emp[i]->addr);
		i++;
	}
	fclose(fp);
}
void swap()
{
	int i, j;
	if (emp_size == 0)
	{
		printf("无记录!\n");
	}
	int a;

	FILE* fp = fopen("F:\\date2.txt", "w+");
	fseek(fp, 1, SEEK_CUR);

	//fscanf(fp, "%d\n", &a);
	//printf("%d", a);
	for (i = 0; i < emp_size; i++)
	{
		for (j = 0; j < emp_size - i - 1; j++)
		{
			if (atoi(emp[j]->id) < atoi(emp[j + 1]->id))
			{
				Employee* kingdom;
				kingdom = emp[j];
				emp[j] = emp[j + 1];
				emp[j + 1] = kingdom;

			}
		}

	}
	//fprintf(fp, "%d\n", a);
	fputs("\n", fp);;
	for (i = 0; i < emp_size; i++)
	{
		fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", emp[i]->id, emp[i]->name, emp[i]->sex, emp[i]->birt, emp[i]->educ, emp[i]->job, emp[i]->tele, emp[i]->addr);
	}
	printf("排序成功");
	write();
}
void swap2()
{
	int i, j;
	if (emp_size == 0)
	{
		printf("无记录!\n");
	}
	int a;

	FILE* fp = fopen("F:\\date2.txt", "w+");
	fseek(fp, 1, SEEK_CUR);

	//fscanf(fp, "%d\n", &a);
	//printf("%d", a);
	for (i = 0; i < emp_size; i++)
	{
		for (j = 0; j < emp_size - i - 1; j++)
		{
			if (atoi(emp[j]->id) > atoi(emp[j + 1]->id))
			{
				Employee* kingdom;
				kingdom = emp[j];
				emp[j] = emp[j + 1];
				emp[j + 1] = kingdom;

			}
		}

	}
	//fprintf(fp, "%d\n", a);
	fputs("\n", fp);;
	for (i = 0; i < emp_size; i++)
	{
		fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", emp[i]->id, emp[i]->name, emp[i]->sex, emp[i]->birt, emp[i]->educ, emp[i]->job, emp[i]->tele, emp[i]->addr);
	}
	printf("排序成功");
	write();
}
void swap3()
{
	int i, j = 0;
	FILE* fp = fopen("F:\\date2.txt", "w+");
	fseek(fp, 1, SEEK_CUR);
	for (i = 0; i < emp_size; i++)
	{
		for (j = 0; j < emp_size - i - 1; j++)
		{
			if (strcmp(emp[j]->name, emp[j + 1]->name) < 0)
			{
				Employee* kingdom;
				kingdom = emp[j];
				emp[j] = emp[j + 1];
				emp[j + 1] = kingdom;
			}

		}

	}
	fputs("\n", fp);;
	for (i = 0; i < emp_size; i++)
	{
		fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", emp[i]->id, emp[i]->name, emp[i]->sex, emp[i]->birt, emp[i]->educ, emp[i]->job, emp[i]->tele, emp[i]->addr);
	}
	printf("排序成功");
	write();

}
void swap4()
{
	int i, j = 0;
	FILE* fp = fopen("F:\\date2.txt", "w");
	fseek(fp, 1, SEEK_CUR);
	for (i = 0; i < emp_size; i++)
	{
		for (j = 0; j < emp_size - i - 1; j++)
		{
			if (strcmp(emp[j]->name, emp[j + 1]->name) > 0)
			{
				Employee* kingdom;
				kingdom = emp[j];
				emp[j] = emp[j + 1];
				emp[j + 1] = kingdom;
			}

		}

	}
	fputs("\n", fp);;
	for (i = 0; i < emp_size; i++)
	{
		fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", emp[i]->id, emp[i]->name, emp[i]->sex, emp[i]->birt, emp[i]->educ, emp[i]->job, emp[i]->tele, emp[i]->addr);
	}
	printf("排序成功");
	write();

}
void test()
{
	//IMAGE img, enter, exitimg;
	int btnx = (getwidth() - 150) / 2;
	int btny = (getheight() - 5 * 35) / 2;
	LOGFONT font;
	gettextstyle(&font);
	settextstyle(36, 0, "黑体");
	GUI_label({ 0,btny - 60,getwidth(),0 }, "图形界面职工管理系统", true);
	EditPalette.fgNormalColor = RGB(255, 255, 255);
	EditPalette.fgHoverColor = RGB(255, 255, 255);
	settextstyle(&font);
	static const char* btnText[3] = { "职工管理", "退出系统" };
	/*所有的按钮和编辑框都要写在begin和end中间*/
	//菜单选择
	for (int i = 0; i < 2; i++)
	{
		if (GUI_button(GUID + i, { btnx,btny + i * 55,150,35 }, btnText[i]) && page == MenuPage)
		{
			//read();
			switch (i)
			{
			case 0:

				read();


				page = ShowStudentPage;


				break;
			case 1:
				page = QuitSystemPage;

				break;
			}
		}
	}

	//printf("refresh - %d\n", page);

	if (page == ShowStudentPage)
	{

		if (GUI_button(1678, { 450 ,10,80,30 }, "排序职工"))
		{
			page = SortStudentPage;
		}


		if (GUI_button(1000, { 900 ,10,80,30 }, "添加职工")) {

			memset(editId, '\0', sizeof(id));
			memset(editName, '\0', sizeof(name));
			memset(editSex, '\0', sizeof(sex));
			memset(editBirt, '\0', sizeof(birt));
			memset(editEduc, '\0', sizeof(educ));
			memset(editJob, '\0', sizeof(job));
			memset(editTele, '\0', sizeof(tele));
			memset(editAddr, '\0', sizeof(addr));

			page = AddStudentPage;
			return;
		}

		GUI_DialogEx("显示学生", 950, 500)
		{

			page = MenuPage;
		}
		static const char* headers[9] = { "编号","姓名","性别","生日","学历","职务","电话","住址" , "操作" };

		for (int i = 0; i < 9; i++)
		{
			GUI_label({ rect.x + 100 * i + 20 ,rect.y + 35 }, headers[i], false);
		}

		Employee* filterEmp[20];
		int show_size = 0;
		// todo 4 查询过滤,示例
		for (int i = 0; i < emp_size; i++) {
			Employee* e = emp[i];
			//if (strcmp(e->name, "陈一") == 0) {
			filterEmp[show_size++] = e;
			//}
		}

		// todo 5 排序


		int height = 40;
		for (int i = 0; i < show_size; i++)
		{
			Employee* aim = filterEmp[i];

			const char** infos = emp_toStringArray(aim);
			for (int j = 0; j < 8; j++)
			{
				GUI_label({ rect.x + 100 * j + 20 ,rect.y + height * (i + 2) }, infos[j], false);
			}

			// 编辑按钮 及 点击触发的事件
			if (GUI_button(editButton + i, { rect.x + 100 * 8 - 10,rect.y + height * (i + 2) - 10,50,30 }, "编辑"))
			{
				g_nValue = i;
				memcpy(id, aim->id, strlen(aim->id));
				memcpy(name, aim->name, strlen(aim->name));
				memcpy(sex, aim->sex, strlen(aim->sex));
				memcpy(birt, aim->birt, strlen(aim->birt));
				memcpy(educ, aim->educ, strlen(aim->educ));
				memcpy(job, aim->job, strlen(aim->job));
				memcpy(tele, aim->tele, strlen(aim->tele));
				memcpy(addr, aim->addr, strlen(aim->addr));
				GUI_DialogEx("编辑职工", 400, 420)
				{
					page = ShowStudentPage;
				}
				//page = AddStudentPage;
				page = EditStudentPage;
				printf("删除编号为 %s 的职工\n", emp[i]->id);
				// todo 3 根据编号删除记录
				int x = rect.x + (rect.w - 150) / 2 + 20;
				int y = rect.y + (rect.h - 5 * 40) / 2 - 70;

				GUI_label({ x - 50,y + 10 }, "编号", false);
				GUI_label({ x - 50,y + 50 }, "姓名", false);
				GUI_label({ x - 50,y + 90 }, "性别", false);
				GUI_label({ x - 50,y + 130 }, "生日", false);
				GUI_label({ x - 50,y + 170 }, "学历", false);
				GUI_label({ x - 50,y + 210 }, "职务", false);
				GUI_label({ x - 50,y + 250 }, "电话", false);
				GUI_label({ x - 50,y + 290 }, "住址", false);

				GUI_edit(newInput + 100, { x,y,150,40 }, id, 20);
				GUI_edit(newInput + 200, { x,y + 40,150,40 }, name, 20);
				GUI_edit(newInput + 300, { x,y + 80,150,40 }, sex, 20);
				GUI_edit(newInput + 400, { x,y + 120,150,40 }, birt, 20);
				GUI_edit(newInput + 500, { x,y + 160,150,40 }, educ, 20);
				GUI_edit(newInput + 600, { x,y + 200,150,40 }, job, 20);
				GUI_edit(newInput + 700, { x,y + 240,150,40 }, tele, 20);
				GUI_edit(newInput + 800, { x,y + 280,150,40 }, addr, 20);
				if (GUI_button(GUID + 2, { x + 150,y + 40,150,40 }, "编辑"))
				{
					printf("触发添加\n");
					printf("id - %s\n", id);
					printf("name - %s\n", name);
					printf("sex - %s\n", sex);
					printf("birt - %s\n", birt);
					printf("educ - %s\n", educ);
					printf("job - %s\n", job);
					printf("tele - %s\n", tele);
					printf("addr - %s\n", addr);
					// todo 1 创建记录

					emp[emp_size++] = CreateEmployeeForm(id, name, sex, birt, educ, job, tele, addr);
					for (int j = i; j < emp_size - 1; j++)
					{
						emp[j] = emp[j + 1];
					}
					emp_size--;

				}
				//emp[emp_size++] = CreateEmployeeForm(editId, editName, editSex, editBirt, editEduc, editJob, editTele, editAddr);


			}
			if (GUI_button(850, { 25 ,10,80,30 }, "查询职工"))
			{
				//initgraph(1000, 600, EX_SHOWCONSOLE);
				page = SearchStudentPage;
			}
			//排序

			// 删除按钮 及 点击触发的事件
			if (GUI_button(deleteButton + i, { rect.x + 100 * 8 + 60 ,rect.y + height * (i + 2) - 10,50,30 }, "删除"))
			{
				printf("删除编号为 %s 的职工\n", emp[i]->id);
				// todo 3 根据编号删除记录
				for (int j = i; j < emp_size - 1; j++)
				{
					emp[j] = emp[j + 1];
				}
				emp_size--;
				write();
			}
		}
	}

	else if (page == AddStudentPage)
	{

		//settextcolor(YELLOW);
		GUI_DialogEx("添加职工", 400, 420)
		{
			page = ShowStudentPage;
		}
		//输入框
		int x = rect.x + (rect.w - 150) / 2 + 20;
		int y = rect.y + (rect.h - 5 * 40) / 2 - 70;

		GUI_label({ x - 50,y + 10 }, "编号", false);
		GUI_label({ x - 50,y + 50 }, "姓名", false);
		GUI_label({ x - 50,y + 90 }, "性别", false);
		GUI_label({ x - 50,y + 130 }, "生日", false);
		GUI_label({ x - 50,y + 170 }, "学历", false);
		GUI_label({ x - 50,y + 210 }, "职务", false);
		GUI_label({ x - 50,y + 250 }, "电话", false);
		GUI_label({ x - 50,y + 290 }, "住址", false);

		GUI_edit(newInput + 1, { x,y,150,40 }, id, 20);
		GUI_edit(newInput + 2, { x,y + 40,150,40 }, name, 20);
		GUI_edit(newInput + 3, { x,y + 80,150,40 }, sex, 20);
		GUI_edit(newInput + 4, { x,y + 120,150,40 }, birt, 20);
		GUI_edit(newInput + 5, { x,y + 160,150,40 }, educ, 20);
		GUI_edit(newInput + 6, { x,y + 200,150,40 }, job, 20);
		GUI_edit(newInput + 7, { x,y + 240,150,40 }, tele, 20);
		GUI_edit(newInput + 8, { x,y + 280,150,40 }, addr, 20);
		if (GUI_button(GUID, { x,y + 340,150,40 }, "添加"))
		{
			printf("触发添加\n");
			printf("id - %s\n", id);
			printf("name - %s\n", name);
			printf("sex - %s\n", sex);
			printf("birt - %s\n", birt);
			printf("educ - %s\n", educ);
			printf("job - %s\n", job);
			printf("tele - %s\n", tele);
			printf("addr - %s\n", addr);
			// todo 1 创建记录

			emp[emp_size++] = CreateEmployeeForm(id, name, sex, birt, educ, job, addr, tele);
			write();
		}

		//emp[emp_size++] = { emp_toStringArray(id,name,sex,birt,educ,job,tele,addr) };
	}
	else if (page == SortStudentPage)
	{

		GUI_DialogEx("排序职工", 200, 220)
		{
			page = ShowStudentPage;
		}
		if (GUI_button(1679, { 460 ,280,95,30 }, "ID正序排序"))
		{
			swap2();
		}
		else if (GUI_button(1680, { 460 ,320,95,30 }, "ID倒序排序"))
		{
			swap();
		}
		if (GUI_button(1671, { 460 ,365,95,30 }, "姓名倒序排序"))
		{
			swap3();
		}
		else if (GUI_button(1681, { 460 ,240,95,30 }, "姓名正序排序"))
		{
			swap4();
		}
	}
	else if (page == SearchStudentPage)
	{

		//输入框
		GUI_DialogEx("查询职工", 400, 420)
		{
			page = ShowStudentPage;
		}
		//编辑框
		int x = rect.x + (rect.w - 150) / 2 + 20;
		int y = rect.y + (rect.h - 5 * 40) / 2 - 70;

		GUI_label({ x - 50,y + 10 }, "编号", false);
		GUI_label({ x - 50,y + 50 }, "姓名", false);
		GUI_label({ x - 50,y + 90 }, "性别", false);
		GUI_label({ x - 50,y + 130 }, "生日", false);
		GUI_label({ x - 50,y + 170 }, "学历", false);
		GUI_label({ x - 50,y + 210 }, "职务", false);
		GUI_label({ x - 50,y + 250 }, "电话", false);
		GUI_label({ x - 50,y + 290 }, "住址", false);
		GUI_edit(editInput + 9, { x,y,150,40 }, editId, 20);
		GUI_edit(editInput + 11, { x,y + 40,150,40 }, editName, 20);
		GUI_edit(editInput + 12, { x,y + 80,150,40 }, editSex, 20);
		GUI_edit(editInput + 13, { x,y + 120,150,40 }, editBirt, 20);
		GUI_edit(editInput + 14, { x,y + 160,150,40 }, editEduc, 20);
		GUI_edit(editInput + 15, { x,y + 200,150,40 }, editJob, 20);
		GUI_edit(editInput + 16, { x,y + 240,150,40 }, editTele, 20);
		GUI_edit(editInput + 17, { x,y + 280,150,40 }, editAddr, 20);
		/*if (GUI_button(GUID, { x,y + 340,150,40 }, "查询"))
		{
			emp[10] = CreateEmployeeForm(id, name, sex, birt, educ, job, tele, addr);
		}*/
		for (int i = 0; i < emp_size; i++)
		{
			if (strcmp(emp[i]->id, editId) == 0)
			{
				GUI_DialogEx("显示学生", 950, 500)
				{
					page = MenuPage;
				}
				static const char* headers[8] = { "编号","姓名","性别","生日","学历","职务","电话","住址" };

				for (int i = 0; i < 8; i++)
				{
					GUI_label({ rect.x + 100 * i + 20 ,rect.y + 35 }, headers[i], false);
				}

				Employee* filterEmp[20];
				int show_size = 0;
				// todo 4 查询过滤,示例

				for (int i = 0; i < emp_size; i++) {
					Employee* e = emp[i];
					if (strcmp(e->name, editName) == 0) {
						filterEmp[show_size++] = e;
					}
					else if (strcmp(e->id, editId) == 0) {
						filterEmp[show_size++] = e;
					}

				}


				// todo 5 排序


				int height = 40;
				for (int i = 0; i < show_size; i++)
				{
					Employee* aim = filterEmp[i];

					const char** infos = emp_toStringArray(aim);
					for (int j = 0; j < 8; j++)
					{
						GUI_label({ rect.x + 100 * j + 20 ,rect.y + height * (i + 2) }, infos[j], false);
					}
				}

			}

		}

	}
	else if (page == EditStudentPage)
	{
		ButtonPalette.bgHoverColor = RGB(44, 44, 44);//按钮鼠标停留颜色
		{
			GUI_DialogEx("编辑职工", 400, 420)
			{
				ButtonPalette.bgHoverColor = RGB(44, 44, 44);//按钮鼠标停留颜色
				page = ShowStudentPage;
			}
			//编辑框
			int x = rect.x + (rect.w - 150) / 2 + 20;
			int y = rect.y + (rect.h - 5 * 40) / 2 - 70;

			GUI_label({ x - 50,y + 10 }, "编号", false);
			GUI_label({ x - 50,y + 50 }, "姓名", false);
			GUI_label({ x - 50,y + 90 }, "性别", false);
			GUI_label({ x - 50,y + 130 }, "生日", false);
			GUI_label({ x - 50,y + 170 }, "学历", false);
			GUI_label({ x - 50,y + 210 }, "职务", false);
			GUI_label({ x - 50,y + 250 }, "电话", false);
			GUI_label({ x - 50,y + 290 }, "住址", false);

			GUI_edit(editInput + 1, { x,y ,150,40 }, editId, 20);
			GUI_edit(editInput + 2, { x,y + 40,150,40 }, editName, 20);
			GUI_edit(editInput + 3, { x,y + 80,150,40 }, editSex, 20);
			GUI_edit(editInput + 4, { x,y + 120,150,40 }, editBirt, 20);
			GUI_edit(editInput + 5, { x,y + 160,150,40 }, editEduc, 20);
			GUI_edit(editInput + 6, { x,y + 200,150,40 }, editJob, 20);
			GUI_edit(editInput + 7, { x,y + 240,150,40 }, editTele, 20);
			GUI_edit(editInput + 8, { x,y + 280,150,40 }, editAddr, 20);
			if (GUI_button(GUID, { x,y + 340,150,40 }, "修改"))
			{
				printf("触发修改\n");
				printf("id - %s 不可编辑\n", editId);
				printf("name - %s\n", editName);
				printf("sex - %s\n", editSex);
				printf("birt - %s\n", editBirt);
				printf("educ - %s\n", editEduc);
				printf("job - %s\n", editJob);
				printf("tele - %s\n", editTele);
				printf("addr - %s\n", editAddr);
				// todo 2 根据编号修改记录
				emp[emp_size++] = CreateEmployeeForm(editId, editName, editSex, editBirt, editEduc, editJob, editTele, editAddr);
				for (int j = g_nValue; j < emp_size - 1; j++)
				{
					emp[j] = emp[j + 1];
				}
				emp_size--;
				write();
			}
		}
	}

	else if (page == QuitSystemPage)
	{
		GUI_Dialog("退出系统")
		{
			page = MenuPage;
		}
		GUI_label({ rect.x,rect.y + 120,rect.w,0 }, "确定退出管理系统吗?", true);
		if (GUI_button(GUID, { rect.x + 80,rect.y + 180 ,75,35 }, "取消"))
		{
			page = MenuPage;
		}
		Palette btnp = ButtonPalette;
		ButtonPalette.fgHoverColor = YELLOW;
		ButtonPalette.fgNormalColor = WHITE;
		ButtonPalette.bgNormalColor = RGB(100, 200, 250);
		ButtonPalette.bgHoverColor = RGB(5, 159, 255);
		if (GUI_button(GUID, { rect.x + 180,rect.y + 180 ,75,35 }, "确定"))
		{
			write();
			exit(0);
		}
		ButtonPalette = btnp;
	}
	//write;
}


int main()
{
	initgraph(1000, 600, EX_SHOWCONSOLE);
	GUI_stateInit();
	IMAGE img10, img30, img60, img73, img85, img97, img100, enter, exitimg;
	int btnx = (getwidth() - 150) / 2;
	int btny = (getheight() - 5 * 35) / 2;
	LOGFONT font;
	gettextstyle(&font);
	settextstyle(36, 0, "黑体");
	GUI_label({ 0,btny - 60,getwidth(),0 }, "图形界面员工管理系统", true);
	ButtonPalette.bgNormalColor = TRANSPARENT;//所有窗口去掉背景色,换成黑色
	ButtonPalette.borderNormalColor = RGB(255, 240, 0);//边框平时颜色
	ButtonPalette.bgHoverColor = RGB(44, 44, 44);//按钮鼠标停留颜色
	ButtonPalette.borderHoverColor = RGB(255, 240, 0);//边框鼠标停留颜色
	ButtonPalette.fgHoverColor = RGB(255, 255, 255);//文本颜色
	settextstyle(&font);
	ButtonPalette.fgNormalColor = RGB(255, 255, 255);//文本鼠标停留颜色
	settextstyle(&font);
	int s = 0;
	loadimage(&img10, "./picture/启动界面10%.jpg");
	putimage(0, 0, &img10);
	Sleep(200);

	loadimage(&img30, "./picture/启动界面30%.jpg");
	putimage(0, 0, &img30);
	Sleep(200);

	loadimage(&img60, "./picture/启动界面60%.jpg");
	putimage(0, 0, &img60);
	Sleep(200);

	loadimage(&img73, "./picture/启动界面73%.jpg");
	putimage(0, 0, &img73);
	Sleep(200);

	loadimage(&img85, "./picture/启动界面85%.jpg");
	putimage(0, 0, &img85);
	Sleep(200);

	loadimage(&img97, "./picture/启动界面97%.jpg");
	putimage(0, 0, &img97);
	Sleep(200);



	while (true)
	{
		//每帧调用开始
		GUI_stateBegin();
		//添加初始页面背景
		loadimage(&img100, "./picture/启动界面100%.jpg");
		putimage(0, 0, &img100);
		//添加进入系统按钮背景图像
		loadimage(&enter, "./picture/进入系统.jpg", 150, 35);
		putimage(btnx, btny, &enter);
		//添加退出系统按钮背景图像
		loadimage(&exitimg, "./picture/退出系统.jpg", 150, 35);
		putimage(btnx, btny + 55, &exitimg);
		test();
		//每帧调用结束
		GUI_stateEnd();
		//处理消息
		ExMessage msg = { 0 };
		while (peekmessage(&msg))
		{
			GUI_stateUpdate(&msg);
		}
	}
	return 0;
}

 代码的解释都写到注释里面了,有不懂的可以私信问我,我看到就会回你。

程序插入的图片

 

 

 

 

 

 

 

 

 

 命名的方式照着上面的代码来就好。

其实职工管理系统和学生管理系统什么的也都差不多,改一下字就行。

希望明年能开发出来明日方舟战斗界面,哈哈哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE学习的第三部分(重点在第四个知识点,SSM框架整合)

一、拦截器 Spring MVC的拦截器(Interceptor) 类似于Java Servlet的过滤器&#xff08;Filter&#xff09;。前面学习Java Web学过一点过滤器。 拦截器的作用 是拦截用户的请求&#xff0c;并做相应的处理 。例如在JSP提交表单数据给Controller&#xff0c;先是提交给拦截器的…

计算机毕业论文内容参考|基于Python的高校二手网络交易平台的设计与实现

文章目录 导文摘要前言绪论1课题背景2国内外现状与趋势3课题内容相关技术与方法介绍系统分析系统设计系统实现系统测试总结与展望1本文总结2后续工作展望导文 计算机毕业论文内容参考|基于Python的高校二手网络交易平台的设计与实现 摘要 本文设计并实现了一种基于Python的高校…

3、boostrap图片视频上传展示

boostrap图片视频上传展示 1、展示效果2、html代码 1、展示效果 项目目录结构 2、html代码 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--<link rel"st…

免费使用!国产品牌JoySSL为中国高校网站(edu.cn)提供专属SSL证书

去年9月份&#xff0c;西北工业大学遭受境外网络攻击&#xff0c;目标就是为了窃取重要隐私信息。高校校园信息安全非常重要&#xff0c;因为高校网站是学校的重要门户之一&#xff0c;也是学生、教职工、家长等与学校沟通交流的重要平台。如果高校网站存在安全问题&#xff0c…

Python Dataframe-B更新Dataframe-A

假设现在有两个dataframe&#xff0c;分别是A和B&#xff0c;它们有相同的列text和label。现在想使用B的label来更新A的label&#xff0c;基于它们共同的text。 数据示例 import pandas as pd# Sample DataFrames A and B data_A {text: [text1, text2, text3, text4], labe…

【Nacos 学习记录】

Nacos学习 笔记记录 1. 什么是配置中心&#xff1f;2. 什么是Nacos3. Nacos两大特点3.1 配置管理3.2 服务发现 4. 安装Nacos Server4.1 启动服务器4.2 Java SDK拉取配置4.2.1 添加配置4.2.2 拉取配置4.1.1 OPEN API配置管理API 4.2 post发布配置4.3 get获得配置 1. 什么是配置中…

【C语言】杨辉三角和练习

前言 &#x1f388;大家好&#xff0c;我是何小侠&#x1f388; &#x1f343;大家可以叫我小何或者小侠&#x1f343; &#x1f490;希望能通过写博客加深自己对于学习内容的理解&#x1f490; &#x1f338;也能帮助更多人理解和学习&#x1f338; 君子慎独&#xff0c;不欺…

Echarts区域面积areaStyle用图片进行纹理填充

React DOM结构代码&#xff1a; import fillImg from xx/fillImg.png; // 填充纹理图片...... {/* 趋势图填充纹理图片 */} <img id"fillImg" src{fillImg} style{{ width: 0 }} /> <div id"line" style{{ width: 100%, height: 300 }}></…

2023年5月 少儿编程 中国电子学会图形化编程等级考试Scratch编程一级真题解析(判断题)

2023年5月scratch编程等级考试一级真题 判断题(共10题,每题2分,共20分) 26、默认小猫角色,运行下列程序后,可以看到小猫面向右边,先向右转了30度,又向左转了30度 答案:错 考点分析:考查积木综合使用,由于电脑计算的速度非常快,所以上面的程序看不到右转效果,…

Linux--设置目录或文件的默认权限:umask权限掩码

目录起始权限是从777&#xff0c;普通文件起始权限从666 为何我们创建一个目录或文件&#xff0c;默认权限是你所看到的样子&#xff1f; 因为凡是在umask中出现的权限&#xff0c;都不应该在最终权限中出现&#xff01; 最终权限起始权限&&#xff08;~umask&#xff09…

中间件——统一白名单配置

目录 背景 方案设计 技术点 代码实现 1.切面 2.配置类 3.切面 测试 总结 背景 上线初期提供可配置的白名单用户进行访问验证&#xff0c;把控整体运行风险。 解决痛点&#xff1a; APOLLO企业控制也可以&#xff0c;多个业务功能&#xff0c;要配置多个apollo&…

linux docker安装及报错处理

一、Linux安装docker 1.1 前提 要求Linux内核&#xff08;kernel&#xff09; 版本大于等于3.8。&#xff08;kernel version >3.8&#xff09;。 查看当前系统内核版本 uname -a | awk {split($3,arr,"-");print arr[1]} 1.2 linux 安装docker Centos安装doc…

基于Python所写的火车票分析助手设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87964234 《火车票分析助手》程序使用说明 在PyCharm中运行《火车票分析助手》即可进入如图1所示的系统主界面。 图1 系统主界面 具体的操作步骤如下&#xff1a; &#xff08;1&…

什么是KubeEdge?

什么是Kubernetes&#xff1f; Kubernetes&#xff08;K8s&#xff09;是一款由谷歌开源的容器集群管理系统。它基于容器技术&#xff0c;为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列功能。 什么是KubeEdge&#xff1f; KubeEdge做的是基于k8s构建&a…

数据结构C语言第二版读书笔记--阿兴版本。

文章目录 第一章 绪论1.1 数据结构的研究内容1.2 基本概念和术语1.2.1 数据、 数据元素、 数据项和数据对象1.2.2 数据结构 阿兴觉得很有必要在读书的时候做些读书笔记&#xff0c;我个人比较懒&#xff0c;还是写下来效果会好些。 本次所读的书是这本书。 第一章 绪论 1.1 数…

详解python之re库使用方法2

目录 参考资料前言二、使用 re 模块匹配字符串0. re 子函数 1. re.split()1.实例演示 2. re.search() 和 re.match()对比3.re.search()4.re.findall()5.re.escape()6. 正则表达式的简单说明8. re.compilere.match() 方法进行匹配参考链接&#xff1a; 参考资料 [1] Python之正…

Appium: Windows系统桌面应用自动化测试(二)

Appium: Windows系统桌面应用自动化测试二 一、关于自动化过程中&#xff0c;打开了应用&#xff0c;但获取不到操作句柄的问题1、问题描述2、问题分析3、问题解决 二、尝试回归问题本身&#xff0c;去解决问题1、目标应用日志3、查看WinAppDriver日志&#xff08;1&#xff09…

YOLO系列正负样本分配策略

1、YOLOv3 使用MaxIoUAssigner策略来给gt分配样本&#xff0c;基本上保证每个gt都有唯一的anchor对应&#xff0c;匹配的原则是该anchor与gt的IOU最大且大于FG_THRESH&#xff0c;这种分配制度会导致正样本比较少&#xff0c;cls和bbox分支训练起来可能比较慢。在剩余的anchor…

(三)Flask前置知识栈——装饰器

在后续的讲解中&#xff0c;对大家对装饰器的掌握程度要求较高&#xff0c;所以此文来深入讲解一下&#xff0c;有看过《Python全栈系列教程》专栏的小伙伴可能会说&#xff0c;装饰器已经出过文章讲的很详细了。饶是如此&#xff0c;深究过装饰器的小伙伴们就权当复习一遍&…

荣耀笔记本怎么重装Win10系统?荣耀笔记本用U盘重装系统Win10教程

随着时间的推移&#xff0c;荣耀笔记本系统可能会变得缓慢、不稳定&#xff0c;甚至出现故障&#xff0c;这时候&#xff0c;重装操作系统就成为了一个必要的选择&#xff0c;那么怎么给荣耀笔记本电脑重装Win10系统呢&#xff0c;可以按照系统之家小编分享的荣耀笔记本用U盘重…