VC++课程设计GPA计算器的设计.docx
《VC++课程设计GPA计算器的设计.docx》由会员分享,可在线阅读,更多相关《VC++课程设计GPA计算器的设计.docx(27页珍藏版)》请在冰豆网上搜索。
VC++课程设计GPA计算器的设计
课程设计说明书
题目:
GPA计算器的设计
课程:
VC++程序设计基础课程设计
院(部):
专业:
班级:
学生姓名:
学号:
指导教师:
完成日期:
摘要········································································································
正文·········································································································1
1设计目的································································································1
2设计要求································································································1
3设计内容································································································1
3.1系统分析·····························································································1
3.2项目创建·····························································································2
3.3界面设计·····························································································3
3.4代码实现·····························································································5
3.4.1添加菜单控制···················································································5
3.4.2添加分数存储代码·············································································6
3.4.3添加功能函数代码·············································································7
3.4.4添加控件事件代码············································································11
3.4.5设置界面外观··················································································13
3.5设计结果及使用说明·············································································14
总结与致谢·····························································································17
参考文献································································································18
附录······································································································19
摘要
GPA英语全称是GradePointAverage,意思就是平均成绩点数(平均分数、平均绩点),美国的GPA满分是4分,即A=4,B=3,C=2,D=1。
GPA的精确度往往达到小数点后1到2位,如:
3.0、3.45。
GPA的计算一般是将每门课程的成绩乘以学分,加起来以后除以总的学分,得出平均分。
中国高校的分数设置最常见的为五分制或四分制,具体的折合方式视各个学校规定而有所不同。
一般来讲,百分制中的90分以上可视为4分,80分以上为3分,70分以上为2分,60分以上为1分,五分制中的5分为4分,4分为3分,3分为2分,2分为1分。
关键词:
GPA;VC++;MFC;控件;
正文
1设计目的
GPA,意思是成绩点数与学分的加权平均值。
GPA对于申请留学而言,是所有硬件条件中最为重要的。
我国大学成绩一般是百分制,而在美国90%的学校成绩的计算方法为4分制,我国学生在申请留学美国时,就应将自己原先的成绩转换成要申请学校的GPA。
GPA计算器的出现,是为了方便学生进行GPA换算。
2设计要求
设计GPA计算器实现以下功能:
(1)学生成绩可以由文件导入。
(2)获GPA标准可以选择,也可以手动输入。
(3)GPA的计算过程易于监督控制。
(4)计算结果的可读性强。
3设计内容
3.1系统分析
本次设计要求导入成绩文件,还涉及文件的输入输出控制,界面操作相对频繁,所以对对话框的控件的编程有一定的要求。
为了使本次设计更加方便,不容易出错误,设计时应注意:
使界面人性化,这样可以减少用户的误操作提高程序的健壮性;界面人性化一般要通过屏蔽当前无效的界面和信息来实现的。
系统设计通过VC6.0来实现,用到了庞大的MFC库。
MFC库支持三种不同应用程序:
单文档、多文档和基于对话框。
本次课程设计用到的是基于对话框的这种情况。
这些应用程序模型为我们提供了统一的编程方法和界面基础。
GPA计算器可以简单地分为三个模块,如下图1所示。
3.2项目创建
1、在Visualc++中,新建MFCAppWizard(exe),命名为GPACalculator。
如图2所示。
图2单文档工程的创建
2、在MFCAppWizard第一步中设置应用程序的类型为基本对话模式,然后单击“确定”按钮,应用程序GPACalculator就建立了。
如图3和图4所示。
图3基本对话框类型选择
图4新建工程信息
3.3界面设计
打开对话框资源,为各个控件添加ID,进行属性设计;添加完控件后,打开ClassWizard,针对IDD_GPACALCULATOR_DIALOG所指向的类CCPACalculatorDlg,为该类添加成员变量。
(1)打开对话框资源IDD_GPACALCULATOR_DIALOG,该对话框是程序运行时的主界面,按要求完成控件的添加。
例如,组框的添加及属性设置如图5所示。
其它控件包括按钮、静态文本框、编辑框、组合框、列表框等的添加与此类似。
控件添加完成后效果图如图6所示。
控件列表见附录1。
图5控件属性设置
图6控件添加完成效果图
(2)通过类向导为CCPACalculatorDlg类添加成员变量。
为所有的控件添加成员变量。
例如控件IDC_EDIT_01的成员变量的添加如图7所示。
成员变量列表见附录2。
图7控件的成员变量添加举例
3.4代码实现
3.4.1添加菜单控制
(1)制作菜单资源。
在‘GPACalcularorresources’文件夹下建立一个‘Menu’文件。
如图8所示。
图8Menu文件的添加
为Menu文件添加文件、帮助两个菜单,再为文件添加一个‘退出’菜单,为帮助添加使用‘使用说明’、‘关于’两个菜单。
并设置菜单的属性,为其设置ID和标明。
菜单资源如下图9所示。
菜单项目属性设置如图10所示。
图9菜单资源
图10菜单项目属性设置
(2)装载菜单。
如图11所示。
图11菜单的装载
(3)添加菜单代码
通过“建立类向导”,分别为退出、使用说明、关于菜单添加响应函数,代码如下:
voidCGPACalculatorDlg:
:
OnMenuitemExit()
{
//TODO:
Addyourcommandhandlercodehere
DestroyWindow();
voidCGPACalculatorDlg:
:
OnMenuitemMan()
{
//TODO:
Addyourcommandhandlercodehere
WinExec("notepad.exeEXPLAIN.HEP",SW_SHOW);
}
voidCGPACalculatorDlg:
:
OnMenuitemAbout()
{
//TODO:
Addyourcommandhandlercodehere
CAboutDlgdlg;
dlg.DoModal();
}
3.4.2添加分数存储代码
分数是由磁盘文件导入的,在程序中应该有相应的内存存储结构来存储分数,当需要用分数来进行计算等操作时,则从这个存储结构中读出。
当磁盘文件内容变化时,则应更新这个存储结构。
(1)在类选项卡下,点击‘CGPACalculatorDlg’在其中加入如下结构代码。
typedefstructstScore
{
doubledOPoint;//原始分
doubledSPoint;//标准分
doubledNum;//学分
}stScore;
(2)通常在MFC编程中,为了使用集合、数组类,要在StdAfx.h中加入下面语句:
#include。
在文件选项卡下,双击‘HeaderFiles->StdAfx.h’,在其中加入以下头文件:
#include
(3)在类选项卡下,双击‘CGPACalculatorDlg’加入私有对象‘arScore’,用作分数存储。
代码如下:
private:
CArrayarScore;
3.4.3添加功能函数代码
(1)添加GetSDPoint函数。
在‘CGPACalculatorDlg’中进行函数的定义:
private:
doubleGetSDPoint(doubledPoint);
在‘CAboutDlg’中添加函数的代码如下:
doubleCGPACalculatorDlg:
:
GetSDPoint(doubledPoint)
{
UpdateData();
CArrayarOPoint;
CArrayarSPoint;
arOPoint.Add(m_dO1);
arOPoint.Add(m_dO2);
arOPoint.Add(m_dO3);
arOPoint.Add(m_dO4);
arOPoint.Add(m_dO5);
arOPoint.Add(m_dO6);
arOPoint.Add(m_dO7);
arOPoint.Add(m_dO8);
arSPoint.Add(m_dS1);
arSPoint.Add(m_dS2);
arSPoint.Add(m_dS3);
arSPoint.Add(m_dS4);
arSPoint.Add(m_dS5);
arSPoint.Add(m_dS6);
arSPoint.Add(m_dS7);
if(dPoint>=arOPoint[0])
returnarSPoint[0];
for(inti=0;i{
if(dPoint>=arOPoint[i])
returnarSPoint[i-1];
}
return0;
}
(2)添加SpliterString函数。
分数文件是以‘原始分学分’的方式给出的,需要一个功能函数来将这个字符串拆分成两个double型的原始分和学分。
函数定义如下:
voidSpliterString(CStringstr,double&a,double&b);
函数代码如下:
voidCGPACalculatorDlg:
:
SpliterString(CStringstr,double&a,double&b)
{
CStringstrOne,strTwo;
intifind;
str.TrimLeft('');
str.TrimRight('');
ifind=str.Find('');
strOne=str.Left(ifind);
strTwo=str.Right(str.GetLength()-ifind-1);
a=atof(LPCTSTR(strOne));
b=atof(LPCTSTR(strTwo));
}
(3)添加GatherData函数。
这个函数的作用是将分数文件的信息导入到分数存储及结构,当m_sPathName=“”,即无分数文件时,则导入失败。
定义如下:
voidGatherData();
代码如下:
voidCGPACalculatorDlg:
:
GatherData()
{
CStringstr;
stScoretemp;
if(m_sPathName=="")
return;
arScore.RemoveAll();
CFilefile(m_sPathName,CFile:
:
modeRead);
CArchivear(&file,CArchive:
:
load);
ar.ReadString(str);
while(str!
="")
{
SpliterString(str,temp.dOPoint,temp.dNum);
temp.dSPoint=GetSDPoint(temp.dOPoint);
arScore.Add(temp);
ar.ReadString(str);
};
}
(4)添加ChangeType函数。
可以实现根据不同的输入值,转变成不同的参比标准。
定义如下:
voidChangeType(intnType);
代码如下:
voidCGPACalculatorDlg:
:
ChangeType(intnType)
{
switch(nType)
{
case0:
case4:
m_dS1=m_dS2=m_dS3=m_dS4=m_dS5=m_dS6=m_dS7=0;
m_dO1=m_dO2=m_dO3=m_dO4=m_dO5=m_dO6=m_dO7=m_dO8=0;
break;
case1:
m_dS1=4;
m_dS2=3;
m_dS3=2;
m_dS4=1;
m_dS5=m_dO6=m_dO7=0;
m_dO1=100;
m_dO2=90;
m_dO3=80;
m_dO4=70;
m_dO5=60;
m_dO6=m_dO7=m_dO8=0;
break;
case2:
m_dS1=4.3;
m_dS2=4;
m_dS3=3.7;
m_dS4=3.3;
m_dS5=3.0;
m_dO6=2.7;
m_dO7=2.3;
m_dO1=100;
m_dO2=90;
m_dO3=85;
m_dO4=80;
m_dO5=75;
m_dO6=70;
m_dO7=65;
m_dO8=60;
break;
case3:
m_dS1=4;
m_dS2=3;
m_dS3=2;
m_dS4=m_dS5=m_dO6=m_dO7=0;
m_dO1=100;
m_dO2=85;
m_dO3=70;
m_dO4=60;
m_dO5=m_dO6=m_dO7=m_dO8=0;
break;
}
}
(5)添加SetEditRead函数。
输入为‘真’时,参比标准的编辑框将被设为只读模式,而输入为‘假’时,参比标准的编辑框将被设为可写模式。
定义如下:
voidSetEditRead(boolbReadOnly);
代码如下:
voidCGPACalculatorDlg:
:
SetEditRead(boolbReadOnly)
{
((CEdit*)GetDlgItem(IDC_EDIT_S1))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_S2))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_S3))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_S4))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_S5))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_S6))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_S7))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_O1))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_O2))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_O3))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_O4))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_O5))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_O6))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_O7))->SetReadOnly(bReadOnly);
((CEdit*)GetDlgItem(IDC_EDIT_O8))->SetReadOnly(bReadOnly);
}
3.4.4添加控件事件代码
(1)组合框。
通过组合框(IDC_COMBO_STANDARD)可以选择不同的参比标准,相应的编辑框会随着组合框的选择不同而随之改变。
添加的处理函数如下:
voidCGPACalculatorDlg:
:
OnSelchangeComboStandard()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
intnIndex=m_cmbStandard.GetCurSel();
if(4==nIndex)
SetEditRead(false);
else
SetEditRead(true);
ChangeType(nIndex);
UpdateData(false);
}
(2)[浏览]按钮。
单击该按钮可以弹出‘打开’对话框以供选择打开磁盘上的分数文件。
添加的处理函数如下:
voidCGPACalculatorDlg:
:
OnButtonOpen()
{
CFileDialogfdlg(true,NULL,NULL,OFN_OVERWRITEPROMPT,"成绩文件|*.dat;*.txt|",NULL);
if(fdlg.DoModal()==IDOK){
m_sPathName=fdlg.GetPathName();
}
UpdateData(false);
//TODO:
Addyourcontrolnotificationhandlercodehere
}
(3)[统计]按钮。
单击该按钮计算各项参数值,并可以把分数显示在列表框。
添加的处理函数如下:
voidCGPACalculatorDlg:
:
OnButtonOk()
{
doubledGPAall=0;
doubledAvgall=0;
GatherData();
inti=0;
intsize=arScore.GetSize();
if(size==0)
{
return;
}
m_ListScore.ResetContent();
m_ListScore.AddString("序号成绩学分标准");
m_ListScore.AddString("---------------------------");
m_dTotal=0;
while(i{
CStringstr;
m_dTotal+=arScore.GetAt(i).dNum;
dGPAall+=arScore.GetAt(i).dSPoint*arScore.GetAt(i).dNum;
dAvgall+=arScore.GetAt(i).dOPoint*arScore.GetAt(i).dNum;
str.Format("%d%0.2f%0.2f%0.2f",i+1,arScore.GetAt(i).dOPoint,arScore.GetAt(i).dNum,arScore.GetAt(i).dSPoint);
i++;
m_ListScore.AddString(str);
}
m_strGPA.Format("%.2f",dGPAall/m_dTotal);
m_strAverage.Format("%.2f",dAvgall/m_dTotal);
UpdateData(false);
}
3.4.5设置界面外观
如果对界面的外观不满意,可以截取消息加以控制。
本程序截取‘WM_CTCOLOR’函数来达到修改控件外观眼色的目的。
添加的函数代码如下:
HBRUSHCGPACalculatorDlg: