大一期末作业,老师要求设计一个学生信息管理系统,还要可视化界面。说实话,之前从来没接触过可视化界面,一直都是黑窗口,还以为可视化界面离我还远,直到我开始去了解,去网上查资料,搜索自学,才发现…额,原来这么简单,只要会写程序就可以做,只是老师从没讲过。好,废话不多说,程序如下:
-
程序的可视化界面采用的是easyx图形库,如果对easyx不了解,建议大家先去下面其中一个学一下,我就是从这两篇文章中学习easyx的,讲的非常详细。
EasyX基础入门——这一篇就够啦
Easyx库基础用法教程 -
程序流程图
自定义函数名
void Main_interface();//主界面函数
void Solt_interface();//排序界面
void browse_interface();//浏览信息界面
void serch_interface(); //查询界面
void Set_message();//建立学生信息
void browse_message();//浏览信息
void Serch_message();//查询信息
void change_message();//修改信息
void Solt_message();//排序
void delete_message();//删除信息
void read_file();//读取文件
void Input_file();//录入文件
void No_interface();//没有找到信息界面
void solt_id();//学号排序
void solt_name();//姓名排序
void solt_birth();//年龄排序
void funish_solt();//排序完成界面
void funish_change();//修改完成界面
void funish_delete();//删除完成界面
void no_soltinterface();//无需排序界面
void id_error_interface();//学号错误界面
void age_error_interface();//年龄错误界面
int judge_id(char id[]);//判断学号是否重复
char* extract_num(char* s);//从字符串中提取数字函数
void sub_list();//处理链表空元素
student* serch(char str[]);//查找
虽说是用c++写的,但是并没有涉及类的知识,我对类学的还不是很明白,。以上都是程序中出现的所有自定义的函数。
主函数
int main()
{
initgraph(1240, 680,EW_NOCLOSE);//设置画布
IMAGE img;
loadimage(&img, "222(1).jpg", 1240, 680);
putimage(0, 0, &img);
HWND hn = GetHWnd();
SetWindowText(hn, "学生信息管理系统");
Main_interface();//主界面函数
read_file();//读取文件
ExMessage ms;//信息结构体
while (1)
{
ms = getmessage(EM_MOUSE);//获取鼠标信息
if (ms.x >= 520 && ms.x <= 720 && ms.y >= 150 && ms.y <= 200)//录入信息
{
setlinecolor(RED);
rectangle(520, 150, 720, 200);
if (ms.message == WM_LBUTTONDOWN)
{
putimage(0, 0, &img);
Set_message();//建立学生信息
Input_file();//录入文件
}
}
else
{
setlinecolor(GREEN);
rectangle(520, 150, 720, 200);
}
if (ms.x >= 520 && ms.x <= 720 && ms.y >= 210 && ms.y <= 260)//浏览信息
{
setlinecolor(RED);
rectangle(520, 210, 720, 260);
if (ms.message == WM_LBUTTONDOWN)
{
putimage(0, 0, &img);
browse_message();//浏览信息函数
}
}
else
{
setlinecolor(GREEN);
rectangle(520, 210, 720, 260);
}
if (ms.x >= 520 && ms.x <= 720 && ms.y >= 270 && ms.y <= 320)//查询信息
{
setlinecolor(RED);
rectangle(520, 270, 720, 320);
if (ms.message == WM_LBUTTONDOWN)
{
putimage(0, 0, &img);
Serch_message();//查询信息
}
}
else
{
setlinecolor(GREEN);
rectangle(520, 270, 720, 320);
}
if (ms.x >= 520 && ms.x <= 720 && ms.y >= 330 && ms.y <= 380)//排序
{
setlinecolor(RED);
rectangle(520, 330, 720, 380);
if (ms.message == WM_LBUTTONDOWN)
{
putimage(0, 0, &img);
Solt_message();//排序
Input_file();//录入文件
}
}
else
{
setlinecolor(GREEN);
rectangle(520, 330, 720, 380);
}
if (ms.x >= 520 && ms.x <= 720 && ms.y >= 390 && ms.y <= 440)//修改信息
{
setlinecolor(RED);
rectangle(520, 390, 720, 440);
if (ms.message == WM_LBUTTONDOWN)
{
putimage(0, 0, &img);
change_message();//修改
Input_file();//录入文件
}
}
else
{
setlinecolor(GREEN);
rectangle(520, 390, 720, 440);
}
if (ms.x >= 520 && ms.x <= 720 && ms.y >= 450 && ms.y <= 500)//删除信息
{
setlinecolor(RED);
rectangle(520, 450, 720, 500);
if (ms.message == WM_LBUTTONDOWN)
{
putimage(0, 0, &img);
delete_message();//删除
Input_file();//录入文件
}
}
else
{
setlinecolor(GREEN);
rectangle(520,450, 720, 500);
}if (ms.x >= 520 && ms.x <= 720 && ms.y >= 510 && ms.y <= 560)//退出
{
setlinecolor(RED);
rectangle(520, 510, 720, 560);
if (ms.message == WM_LBUTTONDOWN)
break;//退出循环
}
else
{
setlinecolor(GREEN);
rectangle(520, 510, 720, 560);
}
}
closegraph();
return 0;
}
在主函数中,我采用ExMessage和getmessage()获取和储存鼠标信息,根据鼠标选择的不同进入对应功能中。需要注意的是:getmessage()要放在循环里一直获取鼠标信息。放在循环外面的话只获取了一次信息后就停止了。
读取文件
void read_file()//读取文件
{
head->next = nullptr;//初始化链表,刚开始为空表
ifstream in("student_message1.txt", ios::in);
if (!in)
{
cout << "打开文件失败" << endl;
exit(0);
}
student* p = head;
while (!in.eof())
{
student* t = new student;
in >> t->id;
in >> t->name;
in >> t->age;
in >> t->sex;
in >> t->birth_date;
in >> t->add;
in >> t->phone;
in >> t->e_mail;
if (in.eof())//如果文件读取到末尾,退出循环
break;
t->next = nullptr;
p->next = t;
p = p->next;
}
in.close();
}
链表为单链表且头结点不含数据,采用尾插法创建链表,读取文件的信息进入链表中。
录入文件
void Input_file()//录入文件
{
ofstream out("student_message1.txt", ios::out);
if (!out)
{
cout << "文件打开失败" << endl;
exit(0);
}
sub_list();//处理链表空元素
student* p = head;
while (p->next)
{
out << p->next->id << "\t"
<< p->next->name << "\t"
<< p->next->age << "\t"
<< p->next->sex << "\t"
<< p->next->birth_date << "\t"
<< p->next->add << "\t"
<< p->next->phone << "\t"
<< p->next->e_mail << "\t"
<< endl;
p = p->next;
}
out.close();
}
处理链表空元素是将空着的信息填为“未知”。
录入信息
void Set_message()//建立学生信息
{
student* p = head;
while (p->next)//循环到链表末尾往后继续创建节点
{
p = p->next;
}
while (1)
{
student* t = new student;
while (1)//判断学号是否重复
{
InputBox(t->id, 20, "请输入学号");
int a = judge_id(t->id);//学号查重函数
if (a == 0)
break;
id_error_interface();//学号重复界面
}
InputBox(t->name, 20, "请输入姓名");
while (1)//判断年龄是否符合实际
{
InputBox(t->age, 5, "请输入年龄");
if (atoi(t->age) >= 10 && atoi(t->age) <= 100)
break;
age_error_interface();//年龄重复界面
}
InputBox(t->sex, 5, "请输入性别");
InputBox(t->birth_date, 12, "请输入出生日期");
InputBox(t->add, 50, "请输入家庭住址");
InputBox(t->phone, 20, "请输入电话号码");
InputBox(t->e_mail, 20, "请输入邮箱");
t->next = nullptr;
p->next = t;
p = p->next;
HWND hwnd= GetHWnd();//初始化元素
int is_ok=MessageBox(hwnd,"是否继续创建?","我是窗口",MB_OKCANCEL);
if (is_ok == IDCANCEL)
{
Main_interface();//主界面函数
break;
}
}
}
HWND和MessageBox()是创建一个小窗口,判断是否继续创建元素。文章来源:https://www.toymoban.com/news/detail-526460.html
浏览信息
void browse_message()//浏览信息
{
browse_interface();//浏览信息界面,将表格打印出来
student* p = head;
int y = 80;
while (p->next)//循环打印链表内数据
{
settextstyle(20, 0, "楷体");
settextcolor(BLACK);
outtextxy(60, y, p->next->name);
outtextxy(130, y, p->next->sex);
outtextxy(190, y, p->next->age);
outtextxy(250, y, p->next->id);
outtextxy(390, y, p->next->birth_date);
outtextxy(505, y, p->next->add);
outtextxy(885, y, p->next->phone);
outtextxy(1010, y, p->next->e_mail);
y += 30;
p = p->next;
}
while (1)
{
if (GetAsyncKeyState(VK_ESCAPE)& 0x8000)
{
Main_interface();//退出前调用主界面函数
break;
}
}
}
GetAsyncKeyState()是获取键盘信息的,按ESC可返回主界面,在这里也可用getch()代替。文章来源地址https://www.toymoban.com/news/detail-526460.html
查询信息
void Serch_message()//查询信息
{
serch_interface();//查询界面
char str[20];//用于储存要查询学生的学号或姓名
student* t = nullptr;//用于记录所查询学生的对应节点
ExMessage ma;
while (1)
{
ma = getmessage
到了这里,关于学生信息管理系统(c++,可视化界面,文件操作)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!