【C语言课程设计】学生成绩管理系统——结合2024最新版easyx实现图形化页面详细教程


前言:

         前阵子正好做课程设计的时候,正好需要用c语言结合用easyx来实现一个带有图形化界面的学生成绩管理系统。但是正好遇见easyx库更新还没一周,而且实际操作中也发现一些之前的函数之类的发生了变化或者有些直接被废置或替代了,因此自己结合相关的参考文档,进行了一些改进,因此在这里记录一下。

        基础的功能的相关部分,我在代码的注释部分都进行了相关的解释,暂时不作过多的赘述,有问题的朋友,欢迎在讨论区留下自己的问题,也欢迎各位积极讨论,提出相关的改进建议。

        注:本文仅介绍成绩管理系统中最基本的几个功能。


一、环境配置

1、安装vs2022,这个的教程很多也很全面了,这里就只提供官网下载地址,不会下载的可以搜搜网上的其他教程。

Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com)

2、EasyX_20240601.exe

可自行去官网进行下载,官网地址:EasyX Graphics Library for C++

这是一款针对 Visual C++ 的免费绘图库,支持 VC6.0 ~ VC2022,简单易用,学习成本极低,应用领域广泛。

点击“下载EasyX”后,等待下载,下载好后,双击下载好的exe文件:

点击下一步

选择自己电脑上有的VS版本(有多个的话,可以选自己喜欢的)后,点击安装

显示安装完成后,点击确定,然后关掉就可以了,这样就已经表明安装好了

如果担心没装好,可以尝试输入以下代码,如果能正常显示下面的效果图,那就是装好了,如果不行,可以再次尝试安装EasyX,或者检查一下是不是哪里的配置出现了问题:

#include <graphics.h>
#include <conio.h>

int main()
{
	// 初始化绘图窗口
	initgraph(640, 480);

	// 设置背景色:黄色
	setbkcolor(YELLOW);
	// 用背景色清空屏幕
	cleardevice();

	// 设置边框:黑色
	setcolor(BLACK);
	// 画圆形(x,y,r)
	circle(150, 150, 100);

	// 按任意键退出
	_getch();
	closegraph();

	return 0;
}

效果图:

——至此,我们的基础环境就已经全部配置好了。

二、功能实现

1、成绩录入

//录入信息
void InputInfor()
{
	//通过循环来检查是否有重复的

	//输入学号
	while (1)
	{
		InputBox((LPTSTR)s[nowstu_num].s_Num, 9, _T("请输入该学生的学号"));

		int FlagInput2 = 0;
		//计算输入的字符串长度
		int nums = strlen(s[nowstu_num].s_Num);

		if (FlagInput2 == 0)
		{
			//判断是否输入重复
			int FlagInput1 = 0;
			for (int i = 0; i < nowstu_num; i++)
			{
				if (strcmp(s[nowstu_num].s_Num, s[i].s_Num) == 0)
				{
					FlagInput1 = 1;
				}
			}
			if (FlagInput1 == 1)
			{
				HWND hwndInput1 = GetHWnd();
				int isok = MessageBox(hwndInput1, _T("该学生已经存在,请重新输入"), _T("提示"), MB_OK);
			}
			if (FlagInput1 == 0)
			{
				break;
			}
		}
	}

	InputBox((LPTSTR)s[nowstu_num].s_Name, 10, _T("请输入该学生的姓名"));
	InputBox((LPTSTR)s[nowstu_num].s_Math, 4, _T("请输入该学生的数学成绩"));
	InputBox((LPTSTR)s[nowstu_num].s_computer, 4, _T("请输入该学生的计算机成绩"));

	SaveInfor();//保存数据
}

2、数据的保存与读取

//保存数据到文件中
void SaveInfor()
{
	//如果学号和姓名都不是空的才写入文件
	if (strlen(s[nowstu_num].s_Num) != 0 && strlen(s[nowstu_num].s_Name) != 0)
	{
		FILE* fp = fopen("StudentInfo.txt", "a");//追加
		if (fp == NULL)
		{
			return;
		}
		fprintf(fp, "%s\t%s\t%s\t%s\n",
			s[nowstu_num].s_Num,
			s[nowstu_num].s_Name,
			s[nowstu_num].s_Math,
			s[nowstu_num].s_computer);
		fclose(fp);
		//保存完毕人数++
		nowstu_num++;
	}
}
//读取文件中的信息
void ReadInfor()
{
	FILE* fp = fopen("StudentInfo.txt", "r");
	if (fp == NULL)
	{
		return;
	}
	//将文件中的数据读取到当前的结构体数组中
	for (int i = 0; i < 15; i++)
	{

		fscanf(fp, "%s\t%s\t%s\t%s\t\n",
			s[i].s_Num,
			s[i].s_Name,
			s[i].s_computer,
			s[i].s_Math);
	}

	int FileStudentNums = 0;
	//读取出文件中数据的人数个数
	for (int j = 0; j < 15; j++)
	{
		if (strlen(s[j].s_Name) != 0)
		{
			nowstu_num = ++FileStudentNums;
		}
	}
	fclose(fp);
}

3、成绩查询


int cha()//查找
{
	char Input[30];
	InputBox((LPTSTR)Input, 10, _T("请输入学生的姓名或学号"));
	for (int k = 0; k < nowstu_num; k++)
	{
		if (strcmp(s[k].s_Name, Input) == 0 || strcmp(s[k].s_Num, Input) == 0)//两个字符串相等
		{
			return k;
		}
	}

	return -1;
}

(查找学号):

或者(查找名字):

4、成绩修改


void ModiInfor()
{
	int fan2 = cha();//返回值
	if (fan2 == -1)//没找到
	{
		HWND hndtipsM = GetHWnd();//获取窗口句柄
		int isok = MessageBox(hndtipsM, _T("查无此人!"), _T("提示"), MB_OK);
	}
	else//找到
	{
		while (1)
		{
			wchar_t modi[30];

			InputBox(modi, 9, _T("请输入需要修改的学生的学号"));

			if (strcmp((const char*)modi, s[fan2].s_Num) == 0)//输入的学号与原来的学号相同
			{
				break;
			}
			else//不同
			{
				int flag = 0;
				int nums = strlen((const char*)modi);
				for (int i = 0; i < nowstu_num; i++)
				{
					if (strcmp((const char*)modi, s[i].s_Num) == 0)
					{
						flag = 1;
						break;
					}
				}
				if (flag == 1)
				{
					HWND hwndInput4 = GetHWnd();
					int isok = MessageBox(hwndInput4, _T("该学生已经存在,请重新输入"), _T("提示"), MB_OK);
				}
				else if (flag == 0)
				{
					memcpy(s[fan2].s_Num, modi, nums);//把新输入的学号复制到学生信息数组
					break;
				}
			}

		}
		InputBox((LPTSTR)s[fan2].s_Name, 8, _T("请输入该学生的姓名"));
		InputBox((LPTSTR)s[fan2].s_computer, 10, _T("请输入该学生的计算机成绩"));
		InputBox((LPTSTR)s[fan2].s_Math, 10, _T("请输入该学生的数学成绩"));
	}

	SaveInforModi();
}

改学号or成绩or名字:

全部修改好后,再次查找该学生,发现全部数据已经更新了:

5、成绩删除


void Dele()
{
	int dele = cha();
	if (dele == -1)//没找到
	{
		HWND hndtipsD = GetHWnd();
		int isok = MessageBox(hndtipsD, _T("查无此人!"), _T("提示"), MB_OK);
	}
	else
	{
		HWND hndtipsDS = GetHWnd();
		int isok = MessageBox(hndtipsDS, _T("确定删除?"), _T("提示"), MB_OKCANCEL);
		if (isok == IDOK)
		{
			//确定删除操作
			//将这个元素的后一个依次迁移
			for (int n = dele; n < nowstu_num; n++)
			{
				s[n] = s[n + 1];
			}
			nowstu_num--;
			//更新到文件中
			SaveInforModi();//对文件进重写
		}
		else if (isok == IDCANCEL)
		{

		}
	}
}

删除信息后,再次查找,系统会自动提示:查无此人!

6、所有学生的成绩打印

void Showall() //打印所有成绩
{
	ExMessage m3;
	initgraph(640, 480);
	IMAGE img2;
	//loadimage(&img2, _T("C:\\Users\\14844\\Pictures\\Screenshots\\33.png"), 640, 480);
	loadimage(&img2, _T("C:\\Users\\14844\\Pictures\\Screenshots\\33.png"), 640, 480);
	putimage(0, 0, &img2);
	setfillcolor(WHITE);
	fillrectangle(300, 430, 380, 460);
	setbkmode(TRANSPARENT);
	settextcolor(BLACK);

	settextstyle(20, 0, _T("黑体"));
	outtextxy(40, 20, _T("学号"));
	outtextxy(200, 20, _T("姓名"));
	outtextxy(300, 20, _T("计算机"));
	outtextxy(380, 20, _T("数学"));
	outtextxy(320, 440, _T("返回"));//返回按钮

	for (int q = 0; q <= nowstu_num; q++) {
		outtextxy(40, 60 + q * 20, (LPCTSTR)s[q].s_Num);
		outtextxy(200, 60 + q * 20, (LPCTSTR)s[q].s_Name);
		outtextxy(300, 60 + q * 20, (LPCTSTR)s[q].s_computer);
		outtextxy(380, 60 + q * 20, (LPCTSTR)s[q].s_Math);
	}


	while (1) {
		m3 = getmessage();
		if (m3.x > 300 && m3.x < 430 && m3.y>380 && m3.y < 460) {
			setlinecolor(RED);
			rectangle(300, 430, 380, 460);
		}
		else {
			setlinecolor(WHITE);
			rectangle(300, 430, 380, 460);
		}
		if (m3.message == WM_LBUTTONDOWN) {
			menu();//返回主菜单
		}
	}

}

7、退出系统

else if (m1.x >= r4[0] && m1.x <= r4[2] && m1.y >= r4[1] && m1.y <= r4[3]) {
			setlinecolor(RED);
			rectangle(r4[0], r4[1], r4[2], r4[3]);
			if (m1.message == WM_LBUTTONDOWN) {
				Dele();//删除

			}
		}

8、主界面

//进入主界面选项操作界面
	while (1)
	{
		m1 = getmessage();//获取鼠标操作
		if (m1.x > r1[0] && m1.x < r1[2] && m1.y>r1[1] && m1.y < r1[3]) {
			setlinecolor(RED);
			rectangle(r1[0], r1[1], r1[2], r1[3]);
			if (m1.message == WM_LBUTTONDOWN)
			{
				InputInfor();//录入
			}
		}
		else if (m1.x >= r2[0] && m1.x <= r2[2] && m1.y >= r2[1] && m1.y <= r2[3]) {
			setlinecolor(RED);
			rectangle(r2[0], r2[1], r2[2], r2[3]);
			if (m1.message == WM_LBUTTONDOWN)
			{
				Printfind();//查询
			}
		}
		else if (m1.x >= r3[0] && m1.x <= r3[2] && m1.y >= r3[1] && m1.y <= r3[3]) {
			setlinecolor(RED);
			rectangle(r3[0], r3[1], r3[2], r3[3]);
			if (m1.message == WM_LBUTTONDOWN)
			{
				ModiInfor();//修改
			}
		}

		else if (m1.x >= r4[0] && m1.x <= r4[2] && m1.y >= r4[1] && m1.y <= r4[3]) {
			setlinecolor(RED);
			rectangle(r4[0], r4[1], r4[2], r4[3]);
			if (m1.message == WM_LBUTTONDOWN) {
				Dele();//删除

			}
		}
		else if (m1.x >= r5[0] && m1.x <= r5[2] && m1.y >= r5[1] && m1.y <= r5[3]) {
			setlinecolor(RED);
			rectangle(r5[0], r5[1], r5[2], r5[3]);
			if (m1.message == WM_LBUTTONDOWN) {
				Showall();//打印
			}
		}
		else if (m1.x >= r6[0] && m1.x <= r6[2] && m1.y >= r6[1] && m1.y <= r6[3]) {
			setlinecolor(RED);
			rectangle(r6[0], r6[1], r6[2], r6[3]);
			if (m1.message == WM_LBUTTONDOWN) {
				closegraph();//退出
			}
		}
		else {
			setlinecolor(WHITE);
			rectangle(r1[0], r1[1], r1[2], r1[3]);
			rectangle(r2[0], r2[1], r2[2], r2[3]);
			rectangle(r3[0], r3[1], r3[2], r3[3]);
			rectangle(r4[0], r4[1], r4[2], r4[3]);
			rectangle(r5[0], r5[1], r5[2], r5[3]);
			rectangle(r6[0], r6[1], r6[2], r6[3]);
		}
	}

}

9、图形化界面的相关基础配置代码部分


int nowstu_num = 0;//当前学生人数

typedef struct Student
{
	char s_Num[30];//学号
	char s_Name[30];//姓名
	char s_computer[30]; //计
	char s_Math[30];//数
}Student;


//创建学生结构体数组
Student s[30];

void SaveInfor();
void ReadInfor();
void Showall();
void InputInfor();
void ModiInfor();
void PrintUI();
void Dele();
void Printfind();
void SaveInforModi();

//定义按钮的大小数组
int R[] = { 150,50,650,150 };
int r1[] = { 200,200,600,250 };
int r2[] = { 200,270,600,320 };
int r3[] = { 200,340,600,390 };
int r4[] = { 200,410,600,460 };
int r5[] = { 200,480,600,530 };
int r6[] = { 200,550,600,600 };

//主菜单
void menu()
{
	//进入程序就读取数据,获取当前nowstu_num
	ReadInfor();
	initgraph(800, 620);//绘图窗口初始化

	//鼠标操作1
	ExMessage m1;
	cleardevice();

	//背景图
	IMAGE img;
	//loadimage(&img, _T("C:\\Users\\14844\\Pictures\\Screenshots\\33.png"),800,620);
	loadimage(&img, _T("C:\\Users\\14844\\Pictures\\Screenshots\\33.png"), 800, 620);
	putimage(0, 0, &img);


	setbkmode(TRANSPARENT);
	setfillcolor(WHITE);
	fillrectangle(r1[0], r1[1], r1[2], r1[3]);//画矩形,即按钮
	fillrectangle(r2[0], r2[1], r2[2], r2[3]);
	fillrectangle(r3[0], r3[1], r3[2], r3[3]);
	fillrectangle(r4[0], r4[1], r4[2], r4[3]);
	fillrectangle(r5[0], r5[1], r5[2], r5[3]);
	fillrectangle(r6[0], r6[1], r6[2], r6[3]);

	RECT R1 = { R[0],R[1],R[2],R[3] };//矩形指针R1,方便后面在里面写字,不用计算字的位置
	RECT R2 = { r1[0],r1[1],r1[2],r1[3] };
	RECT R3 = { r2[0],r2[1],r2[2],r2[3] };
	RECT R4 = { r3[0],r3[1],r3[2],r3[3] };
	RECT R5 = { r4[0],r4[1],r4[2],r4[3] };
	RECT R6 = { r5[0],r5[1],r5[2],r5[3] };
	RECT R7 = { r6[0],r6[1],r6[2],r6[3] };

	LOGFONT f;                          //字体样式指针
	gettextstyle(&f);					//获取字体样式
	f.lfHeight = 40;					//调整字体大小
	_tcscpy(f.lfFaceName, _T("宋体"));	//宋体
	f.lfQuality = ANTIALIASED_QUALITY;  // 抗锯齿 
	settextstyle(&f);                   // 设置字体样式
	setbkmode(TRANSPARENT);             //字体背景透明
	settextcolor(BLACK);
	drawtext(_T("学生成绩管理系统"), &R1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示
	drawtext(_T("成绩录入"), &R2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	drawtext(_T("成绩查询"), &R3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	drawtext(_T("成绩修改"), &R4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	drawtext(_T("成绩删除"), &R5, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	drawtext(_T("成绩打印"), &R6, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	drawtext(_T("退出系统"), &R7, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
  • ps:

        版本更新导致相关参数冲突:

                1、方法在库进行更新迭代中改变过大,导致报错,settextstyle(20, 0, _T("Consolas"));原本函数可以直接将字符串输入就可以适配,更新过后的函数需要通过 _T()来才能进行函数的适配和运行。

               2、MOUSEMSG该结构体在原本库中存在,在最新的版本中,将这个结构体移除,导致结构体不能够很好的初始化。

                3、GetMouseMsg()过时了,用不了,该换成getmessage()用getmessage()来实现GetMouseMsg()。

三、完整代码

#define _CRT_SECURE_NO_WARNINGS //一些老函数报错
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h> //Easyx的图形库头文件
#include<string.h>
#include<ctype.h>//检测字符


#include <assert.h>


int nowstu_num = 0;//当前学生人数

typedef struct Student
{
	char s_Num[30];//学号
	char s_Name[30];//姓名
	char s_computer[30]; //计
	char s_Math[30];//数
}Student;


//创建学生结构体数组
Student s[30];

void SaveInfor();
void ReadInfor();
void Showall();
void InputInfor();
void ModiInfor();
void PrintUI();
void Dele();
void Printfind();
void SaveInforModi();

//定义按钮的大小数组
int R[] = { 150,50,650,150 };
int r1[] = { 200,200,600,250 };
int r2[] = { 200,270,600,320 };
int r3[] = { 200,340,600,390 };
int r4[] = { 200,410,600,460 };
int r5[] = { 200,480,600,530 };
int r6[] = { 200,550,600,600 };

//主菜单
void menu()
{
	//进入程序就读取数据,获取当前nowstu_num
	ReadInfor();
	initgraph(800, 620);//绘图窗口初始化

	//鼠标操作1
	ExMessage m1;
	cleardevice();

	//背景图
	IMAGE img;
	//loadimage(&img, _T("C:\\Users\\14844\\Pictures\\Screenshots\\33.png"),800,620);
	loadimage(&img, _T("C:\\Users\\14844\\Pictures\\Screenshots\\33.png"), 800, 620);
	putimage(0, 0, &img);


	setbkmode(TRANSPARENT);
	setfillcolor(WHITE);
	fillrectangle(r1[0], r1[1], r1[2], r1[3]);//画矩形,即按钮
	fillrectangle(r2[0], r2[1], r2[2], r2[3]);
	fillrectangle(r3[0], r3[1], r3[2], r3[3]);
	fillrectangle(r4[0], r4[1], r4[2], r4[3]);
	fillrectangle(r5[0], r5[1], r5[2], r5[3]);
	fillrectangle(r6[0], r6[1], r6[2], r6[3]);

	RECT R1 = { R[0],R[1],R[2],R[3] };//矩形指针R1,方便后面在里面写字,不用计算字的位置
	RECT R2 = { r1[0],r1[1],r1[2],r1[3] };
	RECT R3 = { r2[0],r2[1],r2[2],r2[3] };
	RECT R4 = { r3[0],r3[1],r3[2],r3[3] };
	RECT R5 = { r4[0],r4[1],r4[2],r4[3] };
	RECT R6 = { r5[0],r5[1],r5[2],r5[3] };
	RECT R7 = { r6[0],r6[1],r6[2],r6[3] };

	LOGFONT f;                          //字体样式指针
	gettextstyle(&f);					//获取字体样式
	f.lfHeight = 40;                    //调整字体大小
	_tcscpy(f.lfFaceName, _T("宋体"));	//宋体
	f.lfQuality = ANTIALIASED_QUALITY;  // 抗锯齿 
	settextstyle(&f);                   // 设置字体样式
	setbkmode(TRANSPARENT);             //字体背景透明
	settextcolor(BLACK);
	drawtext(_T("学生成绩管理系统"), &R1, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//在矩形区域R1内输入文字,水平居中,垂直居中,单行显示
	drawtext(_T("成绩录入"), &R2, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	drawtext(_T("成绩查询"), &R3, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	drawtext(_T("成绩修改"), &R4, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	drawtext(_T("成绩删除"), &R5, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	drawtext(_T("成绩打印"), &R6, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	drawtext(_T("退出系统"), &R7, DT_CENTER | DT_VCENTER | DT_SINGLELINE);

	//进入主界面选项操作界面
	while (1)
	{
		m1 = getmessage();//获取鼠标操作
		if (m1.x > r1[0] && m1.x < r1[2] && m1.y>r1[1] && m1.y < r1[3]) {
			setlinecolor(RED);
			rectangle(r1[0], r1[1], r1[2], r1[3]);
			if (m1.message == WM_LBUTTONDOWN)
			{
				InputInfor();//录入
			}
		}
		else if (m1.x >= r2[0] && m1.x <= r2[2] && m1.y >= r2[1] && m1.y <= r2[3]) {
			setlinecolor(RED);
			rectangle(r2[0], r2[1], r2[2], r2[3]);
			if (m1.message == WM_LBUTTONDOWN)
			{
				Printfind();//查询
			}
		}
		else if (m1.x >= r3[0] && m1.x <= r3[2] && m1.y >= r3[1] && m1.y <= r3[3]) {
			setlinecolor(RED);
			rectangle(r3[0], r3[1], r3[2], r3[3]);
			if (m1.message == WM_LBUTTONDOWN)
			{
				ModiInfor();//修改
			}
		}

		else if (m1.x >= r4[0] && m1.x <= r4[2] && m1.y >= r4[1] && m1.y <= r4[3]) {
			setlinecolor(RED);
			rectangle(r4[0], r4[1], r4[2], r4[3]);
			if (m1.message == WM_LBUTTONDOWN) {
				Dele();//删除

			}
		}
		else if (m1.x >= r5[0] && m1.x <= r5[2] && m1.y >= r5[1] && m1.y <= r5[3]) {
			setlinecolor(RED);
			rectangle(r5[0], r5[1], r5[2], r5[3]);
			if (m1.message == WM_LBUTTONDOWN) {
				Showall();//打印
			}
		}
		else if (m1.x >= r6[0] && m1.x <= r6[2] && m1.y >= r6[1] && m1.y <= r6[3]) {
			setlinecolor(RED);
			rectangle(r6[0], r6[1], r6[2], r6[3]);
			if (m1.message == WM_LBUTTONDOWN) {
				closegraph();//退出
			}
		}
		else {
			setlinecolor(WHITE);
			rectangle(r1[0], r1[1], r1[2], r1[3]);
			rectangle(r2[0], r2[1], r2[2], r2[3]);
			rectangle(r3[0], r3[1], r3[2], r3[3]);
			rectangle(r4[0], r4[1], r4[2], r4[3]);
			rectangle(r5[0], r5[1], r5[2], r5[3]);
			rectangle(r6[0], r6[1], r6[2], r6[3]);
		}
	}

}

//录入信息
void InputInfor()
{
	//通过循环来检查是否有重复的

	//输入学号
	while (1)
	{
		InputBox((LPTSTR)s[nowstu_num].s_Num, 9, _T("请输入该学生的学号"));

		int FlagInput2 = 0;
		//计算输入的字符串长度
		int nums = strlen(s[nowstu_num].s_Num);

		if (FlagInput2 == 0)
		{
			//判断是否输入重复
			int FlagInput1 = 0;
			for (int i = 0; i < nowstu_num; i++)
			{
				if (strcmp(s[nowstu_num].s_Num, s[i].s_Num) == 0)
				{
					FlagInput1 = 1;
				}
			}
			if (FlagInput1 == 1)
			{
				HWND hwndInput1 = GetHWnd();
				int isok = MessageBox(hwndInput1, _T("该学生已经存在,请重新输入"), _T("提示"), MB_OK);
			}
			if (FlagInput1 == 0)
			{
				break;
			}
		}
	}

	InputBox((LPTSTR)s[nowstu_num].s_Name, 10, _T("请输入该学生的姓名"));
	InputBox((LPTSTR)s[nowstu_num].s_Math, 4, _T("请输入该学生的数学成绩"));
	InputBox((LPTSTR)s[nowstu_num].s_computer, 4, _T("请输入该学生的计算机成绩"));

	SaveInfor();//保存数据
}

//保存数据到文件中
void SaveInfor()
{
	//如果学号和姓名都不是空的才写入文件
	if (strlen(s[nowstu_num].s_Num) != 0 && strlen(s[nowstu_num].s_Name) != 0)
	{
		FILE* fp = fopen("StudentInfo.txt", "a");//追加
		if (fp == NULL)
		{
			return;
		}
		fprintf(fp, "%s\t%s\t%s\t%s\n",
			s[nowstu_num].s_Num,
			s[nowstu_num].s_Name,
			s[nowstu_num].s_Math,
			s[nowstu_num].s_computer);
		fclose(fp);
		//保存完毕人数++
		nowstu_num++;
	}
}
//读取文件中的信息
void ReadInfor()
{
	FILE* fp = fopen("StudentInfo.txt", "r");
	if (fp == NULL)
	{
		return;
	}
	//将文件中的数据读取到当前的结构体数组中
	for (int i = 0; i < 15; i++)
	{

		fscanf(fp, "%s\t%s\t%s\t%s\t\n",
			s[i].s_Num,
			s[i].s_Name,
			s[i].s_computer,
			s[i].s_Math);
	}

	int FileStudentNums = 0;
	//读取出文件中数据的人数个数
	for (int j = 0; j < 15; j++)
	{
		if (strlen(s[j].s_Name) != 0)
		{
			nowstu_num = ++FileStudentNums;
		}
	}
	fclose(fp);
}

int cha()//查找
{
	char Input[30];
	InputBox((LPTSTR)Input, 10, _T("请输入学生的姓名或学号"));
	for (int k = 0; k < nowstu_num; k++)
	{
		if (strcmp(s[k].s_Name, Input) == 0 || strcmp(s[k].s_Num, Input) == 0)//两个字符串相等
		{
			return k;
		}
	}

	return -1;
}

void PrintUI(int q)//输出成绩界面
{
	ExMessage m2;
	initgraph(640, 480);
	IMAGE img1;
	//loadimage(&img1, _T("C:\\Users\\14844\\Pictures\\Screenshots\\33.png"), 640, 480);
	loadimage(&img1, _T("C:\\Users\\14844\\Pictures\\Screenshots\\33.png"), 640, 480);
	putimage(0, 0, &img1);
	setfillcolor(WHITE);
	fillrectangle(300, 380, 380, 410);
	setbkmode(TRANSPARENT);
	settextcolor(BLACK);

	settextstyle(20, 0, _T("黑体"));
	outtextxy(40, 100, _T("学号"));//outtextxy:用于在指定位置输出字符串
	outtextxy(200, 100, _T("姓名"));
	outtextxy(300, 100, _T("计算机"));
	outtextxy(380, 100, _T("数学"));
	outtextxy(320, 380, _T("返回"));

	outtextxy(40, 140, (LPCTSTR)s[q].s_Num);
	outtextxy(200, 140, (LPCTSTR)s[q].s_Name);
	outtextxy(300, 140, (LPCTSTR)s[q].s_computer);
	outtextxy(380, 140, (LPCTSTR)s[q].s_Math);
	while (1) {
		m2 = getmessage();
		if (m2.x > 300 && m2.x < 380 && m2.y>380 && m2.y < 410) {
			setlinecolor(RED);
			rectangle(300, 380, 380, 410);
		}
		else {
			setlinecolor(WHITE);
			rectangle(300, 380, 380, 410);
		}
		if (m2.message == WM_LBUTTONDOWN) {
			menu();//返回到主菜单
		}
	}
}

void Printfind()//调用cha()
{
	int fan1 = cha();//返回值
	if (fan1 == -1)//没找到
	{
		//获取窗口句柄
		HWND hndtipsF = GetHWnd();
		int isok = MessageBox(hndtipsF, _T("查无此人!"), _T("提示"), MB_OK);
	}
	else
	{
		PrintUI(fan1);
	}
}

void ModiInfor()
{
	int fan2 = cha();//返回值
	if (fan2 == -1)//没找到
	{
		HWND hndtipsM = GetHWnd();//获取窗口句柄
		int isok = MessageBox(hndtipsM, _T("查无此人!"), _T("提示"), MB_OK);
	}
	else//找到
	{
		while (1)
		{
			wchar_t modi[30];

			InputBox(modi, 9, _T("请输入需要修改的学生的学号"));

			if (strcmp((const char*)modi, s[fan2].s_Num) == 0)//输入的学号与原来的学号相同
			{
				break;
			}
			else//不同
			{
				int flag = 0;
				int nums = strlen((const char*)modi);
				for (int i = 0; i < nowstu_num; i++)
				{
					if (strcmp((const char*)modi, s[i].s_Num) == 0)
					{
						flag = 1;
						break;
					}
				}
				if (flag == 1)
				{
					HWND hwndInput4 = GetHWnd();
					int isok = MessageBox(hwndInput4, _T("该学生已经存在,请重新输入"), _T("提示"), MB_OK);
				}
				else if (flag == 0)
				{
					memcpy(s[fan2].s_Num, modi, nums);//把新输入的学号复制到学生信息数组
					break;
				}
			}

		}
		InputBox((LPTSTR)s[fan2].s_Name, 8, _T("请输入该学生的姓名"));
		InputBox((LPTSTR)s[fan2].s_computer, 10, _T("请输入该学生的计算机成绩"));
		InputBox((LPTSTR)s[fan2].s_Math, 10, _T("请输入该学生的数学成绩"));
	}

	SaveInforModi();
}

void Dele()
{
	int dele = cha();
	if (dele == -1)//没找到
	{
		HWND hndtipsD = GetHWnd();
		int isok = MessageBox(hndtipsD, _T("查无此人!"), _T("提示"), MB_OK);
	}
	else
	{
		HWND hndtipsDS = GetHWnd();
		int isok = MessageBox(hndtipsDS, _T("确定删除?"), _T("提示"), MB_OKCANCEL);
		if (isok == IDOK)
		{
			//确定删除操作
			//将这个元素的后一个依次迁移
			for (int n = dele; n < nowstu_num; n++)
			{
				s[n] = s[n + 1];
			}
			nowstu_num--;
			//更新到文件中
			SaveInforModi();//对文件进重写
		}
		else if (isok == IDCANCEL)
		{

		}
	}
}

void SaveInforModi()
{
	//先删掉
	remove("StudentInfo.txt");
	FILE* fp = fopen("StudentInfo.txt", "a");
	if (fp == NULL)
	{
		return;
	}
	//再重写
	for (int i = 0; i < nowstu_num; i++)
	{
		if (strlen(s[i].s_Num) != 0 && strlen(s[i].s_Name) != 0)
		{
			fprintf(fp, "%s\t%s\t%s\t%s\n",
				s[i].s_Num,
				s[i].s_Name,
				s[i].s_computer,
				s[i].s_Math);
		}
	}

	fclose(fp);
}

void Showall() //打印所有成绩
{
	ExMessage m3;
	initgraph(640, 480);
	IMAGE img2;
	//loadimage(&img2, _T("C:\\Users\\14844\\Pictures\\Screenshots\\33.png"), 640, 480);
	loadimage(&img2, _T("C:\\Users\\14844\\Pictures\\Screenshots\\33.png"), 640, 480);
	putimage(0, 0, &img2);
	setfillcolor(WHITE);
	fillrectangle(300, 430, 380, 460);
	setbkmode(TRANSPARENT);
	settextcolor(BLACK);

	settextstyle(20, 0, _T("黑体"));
	outtextxy(40, 20, _T("学号"));
	outtextxy(200, 20, _T("姓名"));
	outtextxy(300, 20, _T("计算机"));
	outtextxy(380, 20, _T("数学"));
	outtextxy(320, 440, _T("返回"));//返回按钮

	for (int q = 0; q <= nowstu_num; q++) {
		outtextxy(40, 60 + q * 20, (LPCTSTR)s[q].s_Num);
		outtextxy(200, 60 + q * 20, (LPCTSTR)s[q].s_Name);
		outtextxy(300, 60 + q * 20, (LPCTSTR)s[q].s_computer);
		outtextxy(380, 60 + q * 20, (LPCTSTR)s[q].s_Math);
	}


	while (1) {
		m3 = getmessage();
		if (m3.x > 300 && m3.x < 430 && m3.y>380 && m3.y < 460) {
			setlinecolor(RED);
			rectangle(300, 430, 380, 460);
		}
		else {
			setlinecolor(WHITE);
			rectangle(300, 430, 380, 460);
		}
		if (m3.message == WM_LBUTTONDOWN) {
			menu();//返回主菜单
		}
	}

}

int main(void)//主函数调用
{
	menu();
	return 0;
}



四、最终效果

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值