好久没有动手写过代码了,最近离着高数补考越来越近,代码量却突然增加了起来,一方面是各种各样的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);
}