1.程序结构
设计语言与运行环境:使用C语言与Easyx图形库,编程环境为VS2022,字符集为使用多字符集,所有文件的路径都在当前路径下
实现设计一个面向工业数据的分析、处理、管理系统,系统可以实现用户注册与登录,注册模块进行输入检查与身份验证;登录模块进行密码验证,单个文件处理,新建文件,查询文件,整体文件处理与退出登录;其中单个文件处理操作包括:删除文件,显示图像,显示数据与返回功能;整体文件处理包括默认排序,按照方差顺序与按照均值顺序的排序功能;整体离不开数据文件的读取,数据预处理,数据分析,数据可视化,数据文件管理,文件信息统计等。
工业数据分析与文件信息管理系统组成框图如下:
2.数据结构
定义六个结构体类型,从上至下分别表示数据文件信息,绘图区域,选择类按钮信息,文件选项显示类按钮信息,用户信息,包含用户结构体并计数。用结构体一维数组存储数据文件信息与文件显示按钮信息,动态开辟内存存储选择类按钮信息,文件选项显示类按钮信息,用户信息,包含用户结构体并计数,并将用户信息写入文件contact.txt中。结构体具体类型定义如下:
typedef struct
{
char filename[20]; //数据文件名
int col; //数据列数
int row; //数据行数
float mean; //均值
float variance; //方差
char status; //文件状态:是否处理过
}FILEINFO; //文件信息结构体类型
typedef struct
{
int x0, y0, x1, y1; // 左上角与右下角的xy坐标
}PLOTAREA; //绘图区域
struct Button //封装按钮
{
int x; //按钮放置的x坐标
int y; //按钮放置的y坐标
int w; //按钮的宽度
int h; //按钮的高度
unsigned long curColor; //按钮当前颜色
unsigned long oldColor; //按钮初始颜色
char* str; //按钮上显示的字符串
};
struct Buttonfile
{
int x;//文件按钮放置的x坐标
int y;//文件按钮放置的y坐标
int w;//文件按钮的宽度
int h;//文件按钮的高度
unsigned long curColor; //文件按钮当前颜色
unsigned long oldColor; //文件按钮初始颜色
char str[Q];//文件按钮上显示的文件名
};
struct User
{
char account[LEN];//账号
char passnumber[LEN2];//密码
char phonenumber[LEN3];//手机号
};
struct Contact
{
struct User* data;//用户信息
int currentsize;//当前已经有的用户个数
int maxsize;//当前的最大容量
};
int nowfilenum=0; /*文件当前个数全局变量*/
int page=1; /*当前页面全局变量*/
3.设计难点
查看数据信息设计时,由于数据较多,仅靠一个页面无法完全展示,在设计翻页时遇到设计难点。原本设计想法是,在ShowPage函数的while循环中通过检测鼠标消息,如果鼠标左键收到消息,则页面page加或减一,但是获取鼠标事件和while循环是异步处理,无法准确对page加减1。对此我的处理方法是:增加一个选择变量p,在检测到不同按钮的鼠标消息后给p赋不同的值,然后跳出循环执行AddPage函数(进行辅助翻页)。以下是ShowPage函数与AddPage函数的程序段:
void ShowPage(char* s,int flag,float* a,int b)
{
IMAGE bk;
ExMessage msg;
int xx, yy;
int n, m,i;
int p;
char d[6] = { 0 };
initgraph(1000, 700);
loadimage(&bk, "显示界面.jpg", 1000, 700);
struct Button* show1 = createbutton(880, 50, 80, 30, RGB(192, 192, 192), RGB(192, 192, 192), "返回");
struct Button* show2 = createbutton(880, 100, 80, 30, RGB(192, 192, 192), RGB(192, 192, 192), "上一页");
struct Button* show3 = createbutton(880, 150, 80, 30, RGB(192, 192, 192), RGB(192, 192, 192), "下一页");
BeginBatchDraw();
while (1)
{
peekmessage(&msg);
putimage(0, 0, &bk);
Show(show1);
setbkmode(TRANSPARENT);
settextstyle(25, 0, "宋体");
settextcolor(BLACK);
outtextxy(20, 40, s);
for (i = 0 + 100 * (page - 1); (i < 100 * page) && (i < b); i++)
{
n = (i - (page - 1) * 100) / 20;
m = (i - (page - 1) * 100) % 20;
if (m == 0)
{yy = 80;}
else
yy = 80 + m * (20 + 10);
xx = 60 + n * (100 + 40);
sprintf(d, "%f", a[i]);//把浮点数转换成字符串才能用outtextxy函数输出
setbkmode(TRANSPARENT);
settextstyle(20, 0, "宋体");
settextcolor(BLACK);
outtextxy(xx, yy, d);
}
if ((page == 1) && (flag != 1))//如果在第一页且还有页面
{
Show(show3);
}
else if ((page == 1)&&(flag==1))//如果总共只有一页
{
}
else if ((page == flag)&&(flag!=1))//最后一页
{
Show(show2);
}
else
{
Show(show2);
Show(show3);
}
if (InButton(show1, msg) || InButton(show2, msg) || InButton(show3, msg))
{
}
if (InButton(show1, msg) && msg.message == WM_LBUTTONDOWN)
{
closegraph();
Handlemenu(s);
}
if (InButton(show3, msg) && msg.message == WM_LBUTTONDOWN)
{
p = 1;
break;
}
if (InButton(show2, msg) && msg.message == WM_LBUTTONDOWN)
{
p = 2;
break;
}
FlushBatchDraw();
}
EndBatchDraw();
AddPage(p,s,flag,a,b);
}
/*辅助翻页*/
void AddPage(int p, char* s, int flag, float* a, int b)
{
switch (p)
{
case 1:
page += 1;
break;
case 2:
page -= 1;
break;
}
ShowPage(s, flag, a, b);
}
4.最终成果
系统运行典型效果图,如图所示。
写在最后
欢迎大家一起交流讨论!需要源码可以给我留评论或者私我。