基于数组的班级成绩管理系统

本文介绍了一个使用C++和Win32 GUI实现的学生信息及成绩管理系统。该系统能够录入学生基本信息和成绩,并提供查询功能,包括按学号查询、按科目查询等,同时还能展示学生的最高分、最低分和平均分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好久没有动手写过代码了,最近离着高数补考越来越近,代码量却突然增加了起来,一方面是各种各样的C++实验报告,数据结构的课程设计,另一方面是学长们和其他同学们的课程设计.越来越发现我高数没怎么学好,程序设计却有点比以前熟练了,什么东西都是练出来的.

一直都没有想到这个东西都要做两个版本,呵呵,同学说第一个版本是Win32 GUI的,老师不接受,必须要用控制台的,于是乎就出现了返工的任务.

算了,不说啥了,放到博客里面吧,也算是点东西.

最终效果如图所示 学生成绩计算器预览图

XD  下次希望做出比这个好100倍的程序来

//这个是GUI版本的程序文件

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

#include "windows.h"

#include "commctrl.h"

#include "resource.h"



#include "This.h"



#pragma comment(lib,"comctl32.lib")





//循环变量,单选框变量,已输入学生人数

int i,iRadio,stuNum = 0;

//存储实例句柄的变量

HANDLE hInst = NULL;

//存储列表框句柄的变量

HWND hList  = NULL;

HWND hList2 = NULL;

//列表框记录的属性

LVITEM LvItem;

//列表框字段的属性

LVCOLUMN LvCol;

//最好成绩存储数组

double maxScore[3] = {0,0,0};

//最差成绩存储数组

double minScore[3] = {100,100,100};

//平均成绩存储数组

double aveScore[3];

//学生成绩记录数组

double stuScore[30][4];

//学生姓名学号数组

wchar_t stuNameId[30][2][255];

//定义字符缓冲区

wchar_t tmpBuf[255];

//列表记录存储数组

wchar_t itemRec[6][255];





void SetItemData(HANDLE hList)

{

	int i = 0;

	memset(&LvItem,0,sizeof(LvItem)); //将列表框结构体清零



	LvItem.mask = LVIF_TEXT;	//设定列表显示内容为文本

	LvItem.cchTextMax = 256;	//最大文本数量

	LvItem.iItem = 0;			//选择第0条记录

	LvItem.iSubItem = 0;		//放在第一列

	LvItem.pszText = itemRec[0];//显示的内容



	SendMessage(hList,LVM_INSERTITEM,0,(LPARAM)&LvItem); //发信息到控件,让其显示



	for(i=1;i<=5;i++) //用一个循环来添加记录

	{

		LvItem.iSubItem=i;

		LvItem.pszText=itemRec[i];

		SendMessage(hList,LVM_SETITEM,0,(LPARAM)&LvItem);

	}

}



void SetIdRec(wchar_t *pszStuID,wchar_t *pszStuName,double dMath ,double dMacDraw,

					double dProgram,double dAverage)

{

	wcscpy(itemRec[0],pszStuID);

	wcscpy(itemRec[1],pszStuName);



	swprintf(itemRec[2],L"%5.2lf",dMath);

	swprintf(itemRec[3],L"%5.2lf",dMacDraw);

	swprintf(itemRec[4],L"%5.2lf",dProgram);

	swprintf(itemRec[5],L"%5.2lf",dAverage);



	SetItemData(hList);

}



void SetSubRec(wchar_t *pszSubName,double daveScore,double dmaxScore,double dminScore)

{

	wchar_t Scores[3][255];

	memset(Scores,0,sizeof(Scores));



	swprintf(Scores[0],L"%lf",daveScore);

	swprintf(Scores[1],L"%lf",dmaxScore);

	swprintf(Scores[2],L"%lf",dminScore);



	memset(&LvItem,0,sizeof(LvItem)); 

	

	LvItem.mask = LVIF_TEXT; 

	LvItem.cchTextMax = 256;

	LvItem.iItem = 0;        

	LvItem.iSubItem = 0;       

	LvItem.pszText = pszSubName; 

	SendMessage(hList2,LVM_INSERTITEM,0,(LPARAM)&LvItem); 



	for(i = 0; i<3 ; i++)

	{

		LvItem.iSubItem=i+1;

		LvItem.pszText=Scores[i];

		SendMessage(hList2,LVM_SETITEM,0,(LPARAM)&LvItem); 

	}

}



void SetListImage(wchar_t *pos)

{

	LVBKIMAGE plvbki={0};   

	plvbki.ulFlags=LVBKIF_SOURCE_URL;		// 从路径读取图像

	plvbki.pszImage=pos;					// 设定图像路径

	plvbki.xOffsetPercent=40;				// x坐标

	plvbki.yOffsetPercent=15;				// y坐标

	OleInitialize(NULL);					// 初始化OLE控件以读取JPG图像

	SendMessage(hList,LVM_SETTEXTBKCOLOR,	//设定背景 

					0,(LPARAM)CLR_NONE);

	SendMessage(hList,LVM_SETBKIMAGE,0,

					(LPARAM)(LPLVBKIMAGE)&plvbki); //通知控件执行绘图

}



void SetListColumn(HANDLE hList,HANDLE hList2)

{



	memset(&LvCol,0,sizeof(LvCol));                  

	LvCol.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;			//成员属性

	LvCol.pszText=L"学生学号";								// 表头文字

	LvCol.cx= 0x55;											// 表项宽度

	SendMessage(hList,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol);	// 插入表项



	LvCol.pszText=L"学生姓名";								// 下个字段

	SendMessage(hList,LVM_INSERTCOLUMN,1,(LPARAM)&LvCol);	// ...

	LvCol.pszText=L"高等数学";								//

	SendMessage(hList,LVM_INSERTCOLUMN,2,(LPARAM)&LvCol);	//

	LvCol.pszText=L"机械制图";								//

	SendMessage(hList,LVM_INSERTCOLUMN,3,(LPARAM)&LvCol);	//

	LvCol.pszText=L"程序设计";								//

	SendMessage(hList,LVM_INSERTCOLUMN,4,(LPARAM)&LvCol);	//

	LvCol.pszText=L"平均成绩";								//

	SendMessage(hList,LVM_INSERTCOLUMN,5,(LPARAM)&LvCol);	// ...跟上面一样



	SendMessage(hList,LVM_SETEXTENDEDLISTVIEWSTYLE,

							0,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); // 设置风格





	LvCol.cx= 0x7C;

	LvCol.pszText=L"考试科目";								// 跟上面一样

	SendMessage(hList2,LVM_INSERTCOLUMN,0,(LPARAM)&LvCol); 



	LvCol.pszText=L"平均成绩";                            

	SendMessage(hList2,LVM_INSERTCOLUMN,3,(LPARAM)&LvCol); 

	LvCol.pszText=L"最高成绩";                            

	SendMessage(hList2,LVM_INSERTCOLUMN,4,(LPARAM)&LvCol); 

	LvCol.pszText=L"最低成绩";                            

	SendMessage(hList2,LVM_INSERTCOLUMN,5,(LPARAM)&LvCol); 



	SendMessage(hList2,LVM_SETEXTENDEDLISTVIEWSTYLE,

							0,LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

	return;

}



BOOL CALLBACK DialogProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)

{

  switch(Message)

  {

        case WM_CLOSE:

			{

				PostQuitMessage(0);

				EndDialog(hWnd,0);

				return TRUE;

			}

		case WM_INITDIALOG:

			{   

				//获取列表框句柄

				hList  = GetDlgItem(hWnd,IDC_LIST3);

				hList2 = GetDlgItem(hWnd,IDC_LIST1);



				//设置列表框字段值

				SetListColumn(hList,hList2);

				//设置列表框背景图

				SetListImage(L"C://RES.dll");

				

				//选定第一个单选按钮

				CheckDlgButton(hWnd, IDC_RADIO1, BST_CHECKED);

				iRadio = 1;

				

				//设定所有的列表框最多可写不超过12个字符

				for(i= 1003; i<=1008; i++)

					SendDlgItemMessage(hWnd,i,EM_LIMITTEXT,12,0);



				return TRUE;

			}

		case WM_COMMAND:

			{

				//当确定按钮被按下的时候

				if(LOWORD(wParam) == IDC_BUTTON1)

				{

					SaveRecord(hWnd);

					return TRUE;

				}

				//当查询按钮被按下的时候

				if(LOWORD(wParam) == IDC_BUTTON3)

				{

					QueryScore(hWnd);

					return TRUE;

				}

				//当单选钮全部科目被按下

				if(LOWORD(wParam) == IDC_RADIO3)

				{

					SetDlgItemText(hWnd,IDC_EDIT7,L"");							//清空关键字框

					SendDlgItemMessage(hWnd,IDC_EDIT7,EM_SETREADONLY,TRUE,0);	//置为只读

					iRadio = 3;													//设定单选按钮标志

					return TRUE;

				}

				//当单选按钮全部学生被按下

				if(LOWORD(wParam) == IDC_RADIO4)

				{

					SetDlgItemText(hWnd,IDC_EDIT7,L"");							//同上

					SendDlgItemMessage(hWnd,IDC_EDIT7,EM_SETREADONLY,TRUE,0);

					iRadio = 4;

					return TRUE;

				}

				//当单选按钮按学号被按下

				if(LOWORD(wParam) == IDC_RADIO1)

				{

					SendDlgItemMessage(hWnd,IDC_EDIT7,EM_SETREADONLY,FALSE,0);	//还原关键字框

					iRadio = 1;

					return TRUE;

				}

				if(LOWORD(wParam) == IDC_RADIO2)

				{

					SendDlgItemMessage(hWnd,IDC_EDIT7,EM_SETREADONLY,FALSE,0);	//同上

					iRadio = 2;

					return TRUE;

				}

				return TRUE;

			}

  }

  return FALSE;

}



int WINAPI WinMain (HINSTANCE hInstance,

                    HINSTANCE hPrevInstance,

                    LPSTR lpszArgument,

                    int nFunsterStil)

{

	INITCOMMONCONTROLSEX InitCtrls;															//注册并初始化控件库

    InitCtrls.dwICC = ICC_LISTVIEW_CLASSES;

    InitCtrls.dwSize = sizeof(INITCOMMONCONTROLSEX);

	InitCommonControlsEx(&InitCtrls);

	

	hInst = hInstance;																		//保存实例句柄

				

	DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DialogProc,0);	//指定对话框处理过程,创建对话框

	return 0;

}



double   GetDlgItemDouble(HWND hDlg, int nlDDlgItem, BOOL* lpTranslated) 

{   

	TCHAR   szBuffer[256]; 

    TCHAR*   endptr; 

    if(GetDlgItemText(hDlg,   nlDDlgItem,   szBuffer,   sizeof(szBuffer))) 

    {   const   double   dValue   =   wcstod(szBuffer,   &endptr); 

        if   (lpTranslated)   *lpTranslated   =   (*endptr== '/0 '); 

        return   dValue; 

    } 

    else 

    {   if   (lpTranslated)   *lpTranslated=FALSE; 

        return   0; 

    } 

} 



void SaveRecord(HANDLE hWnd)

{

	//建立映射获取存储索引位置

	int index = 0;

	BOOL ret = FALSE;

	GetDlgItemText(hWnd,IDC_EDIT1,tmpBuf,250);

	swscanf(tmpBuf, L"%*10s%d",&index);



	index--;



	if(index<0 || index>29)

	{

		MessageBox(NULL,L"错误的学号范围,请检查后重新输入",L"错误",MB_OK);

		return;

	}

	

	stuNum++;

	

	//存储学号

	wcscpy(stuNameId[index][0],tmpBuf);

	

	//存储姓名

	GetDlgItemText(hWnd,IDC_EDIT2,tmpBuf,250);

	wcscpy(stuNameId[index][1],tmpBuf);

	

	//存储成绩

	stuScore[index][0] = GetDlgItemDouble(hWnd,IDC_EDIT3,&ret);

	stuScore[index][1] = GetDlgItemDouble(hWnd,IDC_EDIT4,&ret);

	stuScore[index][2] = GetDlgItemDouble(hWnd,IDC_EDIT5,&ret);

	stuScore[index][3] = (stuScore[index][0]+stuScore[index][1]+stuScore[index][2])/3.0;

	

	//设定最高成绩

	maxScore[0] = stuScore[index][0]>maxScore[0]?stuScore[index][0]:maxScore[0];

	maxScore[1] = stuScore[index][1]>maxScore[1]?stuScore[index][1]:maxScore[1];

	maxScore[2] = stuScore[index][2]>maxScore[2]?stuScore[index][2]:maxScore[2];

	

	//设定最低成绩

	minScore[0] = stuScore[index][0]<minScore[0]?stuScore[index][0]:minScore[0];

	minScore[1] = stuScore[index][1]<minScore[1]?stuScore[index][1]:minScore[1];

	minScore[2] = stuScore[index][2]<minScore[2]?stuScore[index][2]:minScore[2];

	

	//设定平均成绩

	aveScore[0] = GetAveScore(0);

	aveScore[1] = GetAveScore(1);

	aveScore[2] = GetAveScore(2);

	

	//通知列表显示

	SetIdRec(stuNameId[index][0],stuNameId[index][1],stuScore[index][0],stuScore[index][1],

		stuScore[index][2],stuScore[index][3]);

	

	//清空文本框

	for(i = 1003 ; i<=1008 ; i++)

		SetDlgItemText(hWnd,i,L"");



	return;

}



void QueryScore(HANDLE hWnd)

{

	int index = 0;

	BOOL ret = FALSE;

	switch(iRadio)

	{

	case 1:

		{

			GetDlgItemText(hWnd, IDC_EDIT7, tmpBuf, 250);

			swscanf(tmpBuf, L"%*10s%d",&index);



			index--;



			if(index)

			{

				SendMessage(hList,LVM_DELETEALLITEMS,0,0);

				SetIdRec(stuNameId[index][0],stuNameId[index][1],stuScore[index][0],stuScore[index][1],

					stuScore[index][2],stuScore[index][3]);

				return;

			}

			else

			{

				MessageBox(NULL,L"请输入正确的学号!",L"出错",MB_OK);

				return;

			}

		}

	case 2:

		{

			GetDlgItemText(hWnd, IDC_EDIT7, tmpBuf, 250);

			

			if(!wcscmp(tmpBuf,L"高等代数"))

			{

				SendMessage(hList2,LVM_DELETEALLITEMS,0,0);

				SetSubRec(L"高等代数",aveScore[0],maxScore[0],minScore[0]);

				return;

			}

			else if(!wcscmp(tmpBuf,L"机械制图"))

			{

				SendMessage(hList2,LVM_DELETEALLITEMS,0,0);

				SetSubRec(L"机械制图",aveScore[1],maxScore[1],minScore[1]);

				return;

			}

			else if(!wcscmp(tmpBuf,L"程序设计"))

			{

				SendMessage(hList2,LVM_DELETEALLITEMS,0,0);

				SetSubRec(L"程序设计",aveScore[2],maxScore[2],minScore[2]);

				return;

			}

			else

			{

				MessageBox(NULL,L"错误的科目名称!",L"错误",MB_OK);

				return;

			}

		}

	case 3:

		{

			SendMessage(hList2,LVM_DELETEALLITEMS,0,0);

			SetSubRec(L"机械制图",aveScore[1],maxScore[1],minScore[1]);

			SetSubRec(L"程序设计",aveScore[2],maxScore[2],minScore[2]);

			SetSubRec(L"高等代数",aveScore[0],maxScore[0],minScore[0]);

			return;

		}

	case 4:

		{

			SendMessage(hList,LVM_DELETEALLITEMS,0,0);

			for(i=30;i>0;i--)

				if((int)stuNameId[i][0][0] == (int)stuNameId[i][0][1] == 0)

					SetIdRec(stuNameId[i][0],stuNameId[i][1],stuScore[i][0],stuScore[i][1],

							stuScore[i][2],stuScore[i][3]);	

			return;

		}

	}

}



double GetAveScore(int isubId)

{

	double result = 0;



	for(i = 0;i<30;i++)

	{

		result += stuScore[i][isubId];

	}



	return (result/stuNum);

}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值