学生信息管理系统(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()代替。

查询信息

void Serch_message()//查询信息
{
   
	serch_interface();//查询界面
	char str[20];//用于储存要查询学生的学号或姓名
	student* t = nullptr;//用于记录所查询学生的对应节点
	ExMessage ma;
	while (1)
	{
   
		ma = getmessage(EM_MOUSE);
		if (ma.x >= 470 && ma.x <= 770 && ma
  • 26
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值