学生信息管理系统(c++,可视化界面,文件操作)

这篇具有很好参考价值的文章主要介绍了学生信息管理系统(c++,可视化界面,文件操作)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大一期末作业,老师要求设计一个学生信息管理系统,还要可视化界面。说实话,之前从来没接触过可视化界面,一直都是黑窗口,还以为可视化界面离我还远,直到我开始去了解,去网上查资料,搜索自学,才发现…额,原来这么简单,只要会写程序就可以做,只是老师从没讲过。好,废话不多说,程序如下:

  • 程序的可视化界面采用的是easyx图形库,如果对easyx不了解,建议大家先去下面其中一个学一下,我就是从这两篇文章中学习easyx的,讲的非常详细。

    EasyX基础入门——这一篇就够啦
    Easyx库基础用法教程

  • 程序流程图

学生信息管理系统gui界面c++,c++,链表,算法
学生信息管理系统gui界面c++,c++,链表,算法

自定义函数名

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()是创建一个小窗口,判断是否继续创建元素。

浏览信息

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包