本例题根据教材第3章习题3扩展而成,希望同学们先搞懂该题目的基本编程思路。
程序最终用户界面如下图所示:
下面我们分步骤来实现:
1、建立一个基于对话框的MFC应用程序,指定好目录,工程名可以取students,这一步没问题了吧?
2、删除对话框上的3个系统给的控件后,再添加一个命令按钮控件,并把标题改为“打开”,ID改为IDC_OPEN,如下图所示:
3、现在我们来定义学生类,这是程序的核心部分。打开studentDlg.cpp文件,在下图所示的位置添加学生类的定义代码和部分变量声明代码:
要添加的代码如下(你可以直接粘贴过去!,别说你不会粘贴啊)
//自己编写的程序
char ch[100],inumb[50]; //存放学生名和学号的字符数组
int ii=0,sid;
double math,english,computer,sum=0,class_aver;
double s_average,smax=0,smin=100;
CString open_fname;
//上面这几句是定义变量,看懂没问题吧?
// 下面是学生类的定义,一定要看懂啊!
class Student{
protected:
CString name;
CString id;
double s_math,s_english,s_computer;
public:
void set_stu_inf(char* pName,char* ssId ,double s_m,double s_e,double s_c)
{
name=pName;
id = ssId;
s_math=s_m;
s_english=s_e;
s_computer=s_c;
}
double sum( );
double average( );
void print();
CString get_id(){return id;}
CString getname(){return name;}
double getmath(){return s_math;}
double geteng(){return s_english;}
double getcom(){return s_computer;}
}; Student cla[20]; //这里声明cla为student类的对象数组!
double Student::average(){
return (sum()/3);
}
double Student::sum(){
return (s_math+s_english+s_computer);}
另外,请在程序的最上头添加一句包含,因为我们要用到文件!:
#include "fstream.h"
粘贴好了吗?编译一下,看有问题不?没问题再继续!
4、点击下拉菜单“查看”—“建立类向导”,打开“建立类向导对话框”,在对话框中选取“Message Map”页,按下图选“IDC_OPEN\\BN_CLICK”,再点“Add Function”按钮,点,再点按钮。
5、我们又自动进入代码编写窗口,如下图:
在黑条语句下面添加如下代码:
CFileDialog cdlg(TRUE);
if(cdlg.DoModal()==IDOK)
{
open_fname=cdlg.GetPathName();
ifstream infp(open_fname);
if(!infp)
{MessageBox("cannot open the file!\\n");
exit(0);
}
//读入数据并处理
while (!infp.eof())
{ infp>>ch>>inumb>>math>>english>>computer;//使用c++语句
cla[ii].set_stu_inf(ch,inumb,math,english,computer);
s_average=cla[ii].average(); //计算每个学生平均成绩
if(s_average>smax) smax=s_average;
if(s_average ii++; } infp.close(); class_aver=sum/(ii); //全班平均成绩 char tbuf[100]; sprintf(tbuf,"全班最高分:%8.2f,全班最低分:%8.2f,全班平均成绩:%8.2f",smax,smin,class_aver); MessageBox(tbuf); } 请认真读一下上面的代码,它的作用是:点击“打开”按钮,程序就显示“打开文件”对话框,用户选择文件后,程序打开文件,把文件中的数据读入并调用成员函数给对象赋值。同时,程序还计算全班的平均成绩以及班级中学生的最高平均成绩和最低平均成绩,用MessageBox把结果显示一下。看懂了,再继续啊! 编译、运行,看看对不? 6、下面我们把上面的计算结果显示在文本编辑框里。在回到对话框设计界面,添加三个静态文本框,三个编辑框和一个组框,并修改属性,如下图所示: 7、现在我们为三个文本编辑框连接变量,用来显示前面的计算结果。点击下拉菜单“查看”—“建立类向导”,打开“建立类向导对话框”,在对话框中选取“Members Variables”页,按下图添加变量,完成后,再点按钮。 注意:变量名分别是:m_max,m_min,m_average,都是double型! 8、现在添加代码,实现在文本框显示,代码如下: m_max=smax; m_min=smin; m_average=class_aver; UpdateData(FALSE); 注意上面4句代码,一定要加在MessageBox(tbuf);语句后面,见下图: OK!编译运行,看看对不?没问题我们再继续啊。 9、再回到对话框设计界面,添加一个静态文本框,静态文本框的属性设置为“请选择学号”,再一个组合列表框,先把style(样式)属性设置为“simple(简单)”修改属性,如下图所示: 10、下面为组合列表框连接两个内存变量m_idnum和m_SID,一个是CString型,一个是控件型。请注意,只有把组合列表框的样式属性设为“简单”,才能连接CString型变量! 点击下拉菜单“查看”—“建立类向导”,打开“建立类向导对话框”,在对话框中选取“Members Variables”页,按下图添加变量,完成后,再点按钮。 11、再回到对话框设计界面, 把组合列表框的style(样式)属性设置为“drop down(下拉列表)”,如下图所示。 12、在步骤8添加的代码后面添加如下代码: m_SID.ResetContent(); for(int i=0;i m_SID.AddString(cla[i].get_id()); } 这几句代码的作用是把学号数据添加到组合列表框中,请注意添加的位置: 编译运行,打开数据文件后,得到的结果应该和下图一样! 13、选择学号后,本程序应该能把该学号对应的学生信息显示出来,为此,我们再在对话框中添加4个静态文本框和4个编辑文本框,并按下图修改静态文本框的标题属性: 14、让我们按下图为4个新添加的编辑框连接内存变量: 变量名分别是:m_sname, m_math, m_english, m_computer。 15、下面为组合列表框的选择改变事件添加映射函数。点击下拉菜单“查看”—“建立类向导”,打开“建立类向导对话框”,在对话框中选取“Message Map”页,按下图选“CBN_SELCHANGE”,再点“Add Function”按钮,点,再点按钮。进入代码界面。 16、在下图的黑条下面添加代码: int nIndex=m_SID.GetCurSel();//获取用户在组合列表框中点的序号 m_SID.GetLBText(nIndex,m_idnum); //根据序号,取文字(学号) for(int i=0;i<10;i++) // 循环来查找该学号 { CString aa=cla[i].get_id(); //如果查到就显示 if(m_idnum==aa){ m_sname=cla[i].getname(); m_math=cla[i].getmath(); m_english=cla[i].geteng(); m_computer=cla[i].getcom();} UpdateData(FALSE); } 编译运行,打开数据文件后,再选择学号,得到的结果应该和下图一样! 我就做到这里了,请同学们想想再扩展这个程序的功能,比如: (1)可以再添加一个列表框,用来选择不同班级数据; (2)试试看如何实现显示某个同学的成绩名次; (3)把全班同学的成绩排序,显示在一个列表框里; 等等。。。