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

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

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


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


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


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


运行截图


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


553486d1d7efd68f39aed4ee5c2e3e85_da74df9007454f1489285a3bf8a96be1.png


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


c1fe5026a6a342053ae53ccb8a274789_e21175b8b5e74b53845209b18ef1bb2c.png


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


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


de721a58991eeea53b838d1806f67953_2d0e6147f61547618b09d697d1a25c99.png


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


2d7ec6d6922a06e8d3d4241a5c85165d_36a3477f4d72424daec7d8f494cb2b68.png


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


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


849df92efe0b2e1a2f68f8f178558e0d_06c21bd4b2964131a6cb70bc975e643e.png


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


bcd6dee61d539911a97f9b76b9309952_c6e1cd8995b24b8899b06e46e73283f2.png


点击添加:


a7e4f837c1ec366029237e09989e2d9b_bafbea4788fd47069406763ad9124df8.png


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


删除星熊的信息。


f83b28bce33a98556bbde008ec299453_28a79d156e794dddbbb76675a7ed0f36.png


删除成功。


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


2b6a1e4d67656517c348f07b79373f10_fd1557d9ccaa43da81f79ce32ff37a5b.png


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


点击修改。


a6b19470b85dd04bb5a52e96052b10f3_839657acb3a54704ba2fe1bc14398491.png


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


bd5de7fc4437c92503ff883f99ff5338_b7f9c1cf94ed4dca8da17bb15b065c48.png


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


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


5c2209b9478bd412197eec72ba1251d2_a5f4fcaec6dc45ac9e6b39ee84695b9b.png


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


源码分享


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;
}


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


程序插入的图片


a25a9ae96412c819657c71f72554aeba_8921f090c0c54d0fb027d5c3daf1242d.jpeg

01c8d785cd27e8ccaecf24cd0ebeb616_e58b1af385c84d0fa2e386ce742e17eb.jpeg

60fd24a93879f02fb31d9cc3d7936f18_8f7f91abafcc47cb8625b44157d9ccd1.jpeg

a95c425be2379292517a9640a42c8496_75c38bf818674a3b9a613768699d7011.jpeg

8b9d9296dfa60bc434abd3bb68e66f19_5109ee252a324fe6bfe6adff58a4e74b.jpeg

86e03c14fe04f5e2805e58032d4dd637_57eea2a9d1f34abea49222a128cb5e46.jpeg

f3c80029068c8b600d7ccbf060c066a0_80968df954eb45fab691a9eaf44e249f.jpeg

image.png

c2e7bf01c41e4af46239e8c60f62939f_bda6b68ed1894702b98bd9d963fd9dfe.jpeg

b89c4c59b519438af95475edff6e5159_d366d12b1899421a90c77d553861ad13.jpeg

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


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


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


相关文章
|
1月前
|
存储 机器学习/深度学习 NoSQL
【数据结构】——期末复习题题库(8)
【数据结构】——期末复习题题库(8)
28 2
【数据结构】——期末复习题题库(8)
|
1月前
|
算法 存储 机器学习/深度学习
【数据结构】——期末复习题库(6)
【数据结构】——期末复习题库(6)
30 3
【数据结构】——期末复习题库(6)
|
1月前
|
存储 算法
【数据结构】——期末复习题题库(4)
【数据结构】——期末复习题题库(4)
23 1
|
1月前
|
存储 人工智能
【数据结构】——期末复习题题库(3)
【数据结构】——期末复习题题库(3)
31 6
|
1月前
|
存储 算法 索引
【数据结构】——期末复习题题库(10)
【数据结构】——期末复习题题库(10)
21 4
|
1月前
|
存储 机器学习/深度学习 算法
【数据结构】——期末复习题题库(5)
【数据结构】——期末复习题题库(5)
16 0
|
1月前
|
存储 算法 索引
【数据结构】——期末复习题题库(2)
【数据结构】——期末复习题题库(2)
33 0
【数据结构】——期末复习题题库(2)
|
1月前
|
存储 机器学习/深度学习 人工智能
【数据结构】——期末复习题题库(1)
【数据结构】——期末复习题题库(1)
49 0
【数据结构】——期末复习题题库(1)
|
1月前
|
机器学习/深度学习 存储
【数据结构】——期末复习题题库(7)
【数据结构】——期末复习题题库(7)
26 1
【数据结构】——期末复习题题库(7)
|
13天前
|
存储 算法 搜索推荐
数据结构期末复习(fengkao课堂)
数据结构期末复习(fengkao课堂)
108 0