"<
return0;
}
5.用户使用说明:
Step1:
打开程序;
Step2:
输入要求的整数;
Step3:
得出结果
6.测试分析:
输入2038
输入1046
分析:
经过多次输入测试试验后得到了预期值,说明程序的正确性。
7.设计体会:
通过实验体会了设计程序的方法与步骤,加深了对do-while循环使用方法的的了解。
第四题:
1.题目:
编程序,输入正整数m,它代表一个人民币钱数(元数)。
求取这样一个方案,使用最少张数的人民币纸币,凑成上述的钱数m,并输出求取结果。
注意,现在共有7种元以上面值的人民币纸币,分别为:
100,50,20,10,5,2,1。
2.需求分析:
设计一个程序,可以实现输入一个人民币钱数输出使用最少的人民币纸币的张数。
根据题目要求,规定如下:
测试数据:
输入数据:
150
输出数据:
2
输入数据:
176
输出数据:
5
3.设计概要:
(1)定义正型变量n为用户输入值;
(2)定义数组a存放人民币纸币的不同面值;
(3)定义整型变量s并求和;
(4)输出s的值;
(5)主程序流程:
Step1:
让用户输入一个钱数n;
Step2:
用for循环求和;
Step3:
输出s的值;
4.详细设计与编码:
(1)流程图:
用户输入n
进入for循环
Yes
判断条件
no
输出结果s
(2)源程序:
#include
usingnamespacestd;
inta[8]={0,100,50,20,10,5,2,1};//定义数组a存放7种不同人民币纸币的面值
intmain()
{
intn,i,s=0;
cout<<"pleaseenterthenumberofmoney:
";
cin>>n;//输入要求的钱数a
for(i=1;i<=7;i++)//求使用最少的人民币纸币的张数s
{
s+=n/a[i];
n%=a[i];
}
cout<
return0;
}
5.用户使用说明:
Step1:
打开程序;
Step2:
输入要求的钱数;
Step3:
得出结果
6.测试分析:
输入数据:
150
输入数据:
176
分析:
经过多次输入测试试验后得到了预期值,说明程序的正确性。
7.设计体会:
通过实验锻炼了编辑程序的思维过程,熟悉了for循环的使用方法。
第二阶段面向对象
第一题:
1.题目:
自定义一个示意性的复数类型complex,其中含有若干个成员函数,使用该类可以完成复数的加法以及对复数的输出。
请完成类定义,并编制主函数,说明complex类对象,对定义的各成员函数进行调用。
进一步,在类中添加对复数进行其他基本运算(如,复数减、乘、除、取模等)的相应成员函数,并通过主函数处的调用来验证各函数的使用正确性。
2.需求分析:
设计一个程序,可以实现对复数进行加、减、乘、除、取模等基本运算。
根据题目要求,规定如下:
测试数据:
输入数据:
c1=(3,4i),c2=(5,-10i)
输出数据:
|c1|=5
|c2|=11.1803
c1+c2=(8,-6i)
c1-c2=(-2,14i)
c1*c2=(55,-10i)
c1/c2=(-0.2,0.4i)
3.设计概要:
(1)定义一个complex类作为复数类型;
(2)定义成员函数addCom(),minCom(),multCom(),diviCom(),outCom()来分别实现加、减、乘、除、取模等基本运算以及复数的输出操作;
(3)定义成员变量real和image作为复数的实部和虚部;
(4)在主函数中通过complex类来定义对象并调用相关成员函数完成相应操作;
(5)主程序流程:
Step1:
让用户输入一个钱数n;
Step2:
用for循环求和;
Step3:
输出s的值;
4.详细设计与编码:
(1)流程图:
定义complex类
进入主函数
定义对象并调用成员函数
输出结果
(2)源程序:
#include
#include
usingnamespacestd;
classcomplex
{
public:
complex();//无参构造函数
complex(doubler,doublei):
real(r),image(i){}//2参构造函数
complexaddCom(complex&c2);//调用者对象与对象c2相加,返回complex类对象
complexminCom(complex&c3);//调用者对象与对象c2相减,返回complex类对象
complexmultCom(complex&c4);//调用者对象与对象c2相乘,返回complex类对象
complexdiviCom(complex&c5);//调用者对象与对象c2相除,返回complex类对象
doublelenCom();//对调用者对象进行取模运算,返回double类型
voidoutCom();//输出调用者对象的有关数据(各分量)
private:
doublereal;//复数实部
doubleimage;//复数虚部
};
complex:
:
complex()
{
real=0;
image=0;
}
complexcomplex:
:
addCom(complex&c2)
{
complexc;
c.real=real+c2.real;
c.image=image+c2.image;
returnc;
}
complexcomplex:
:
minCom(complex&c3)
{
complexc;
c.real=real-c3.real;
c.image=image-c3.image;
returnc;
}
complexcomplex:
:
multCom(complex&c4)
{
complexc;
c.real=real*c4.real-image*c4.image;
c.image=image*c4.real+real*c4.image;
returnc;
}
complexcomplex:
:
diviCom(complex&c5)
{
complexc;
c.real=(real*c5.real+image*c5.image)/(c5.real*c5.real+c5.image*c5.image);
c.image=(image*c5.real-real*c5.image)/(c5.real*c5.real+c5.image*c5.image);
returnc;
}
doublecomplex:
:
lenCom()
{
doublel;
l=sqrt(real*real+image*image);
returnl;
}
voidcomplex:
:
outCom()
{cout<<"("<intmain()
{
complexc1(3,4),c2(5,-10),c3,c4,c5,c6;
cout<<"c1=";c1.outCom();
cout<<"c2=";c2.outCom();
cout<<"|c1|="<cout<<"|c2|="<c3=c1.addCom(c2);
c4=c1.minCom(c2);
c5=c1.multCom(c2);
c6=c1.diviCom(c2);
cout<<"c1+c2=";c3.outCom();
cout<<"c1-c2=";c4.outCom();
cout<<"c1*c2=";c5.outCom();
cout<<"c1/c2=";c6.outCom();
return0;
}
5.用户使用说明:
Step1:
打开程序;
Step2:
输入测试数据;
Step3:
得出结果
6.测试分析:
输入数据:
c1=(3,4i),c2=(5,-10i)
分析:
测试试验后得到了预期值,说明程序的正确性。
7.设计体会:
通过此题的编写加深了对面向对象中类的了解,熟练了类的构造过程以及对类成员函数的调用。
第六题:
1.题目:
编写一个具有如下样式的类模板tmplt,用于实现所谓的反序输出问题,其中使用了类型参数T(使所处理的元素类型可变化)以及普通参数n(元素个数也可变化):
templateclasstmplt{
Tarr[n]; //n个T类型的数据存放于数组arr之中
public:
voiddataIn(); //从键盘输入n个T类型数据放入arr数组中
voidreverseOut(); //将arr数组中的数据按输入的相反顺序输出
};
而后编制主函数,将类模板实例化为某个具体的类并说明类对象,之后通过对象调用其负责输入数据的成员函数,再通过对象调用另一成员函数按反序输出那些输入数据。
2.需求分析:
设计一个程序,可以实现将类模板实例化为某个具体的类并通过对象调用其负责输入数据的成员函数,再通过对象调用另一成员函数按反序输出那些输入数据。
根据题目要求,规定如下:
测试数据:
输入数据:
0123456789
输出数据:
9876543210
输入数据:
1.11.21.31.41.51.61.71.81.91.0
输出数据:
11.91.81.71.61.51.41.31.21.1
输入数据:
abcdefghij
输出数据:
jihgfedcba
3.设计概要:
(1)定义一个类模板tmplt;
(2)定义成员函数dataIn()和reverseOut()来实现n个T类型数据的输入与输出;
(3)定义成员变量arr[]数组来存放n个T类型的数据;
(4)在主函数中通过tmplt类模板的实例化来调用相关成员函数完成相关操作;
(5)主程序流程:
Step1:
输入十个数据;
Step2:
在主函数中调用成员函数;
Step3:
输出十个数据的反序;
4.详细设计与编码:
(1)流程图:
定义complex类
进入主函数
输入数据并调用成员函数
输出结果
(2)源程序:
#include
usingnamespacestd;
template
classtmplt
{
public:
voiddataIn()//从键盘输入n个T类型数据放入arr数组中
{
for(inti=0;icin>>arr[i];
}
voidreverseOut()//将arr数组中的数据按输入的相反顺序输出
{
for(inti=n-1;i>=0;i--)
cout<cout<}
private:
numtypearr[n];//n个T类型的数据存放于数组arr之中
};
intmain()
{
tmplttmp1;
cout<<"pleaseenter10intnumbers:
"<tmp1.dataIn();
cout<<"theoppositeorderofthe10numbersis:
"<tmp1.reverseOut();
tmplttmp2;
cout<<"pleaseenter10floatnumbers:
"<tmp2.dataIn();
cout<<"theoppositeorderofthe10numbersis:
"<tmp2.reverseOut();
tmplttmp3;
cout<<"pleaseenter10charnumbers:
"<tmp3.dataIn();
cout<<"theoppositeorderofthe10numbersis:
"<tmp3.reverseOut();
return0;
}
5.用户使用说明:
Step1:
打开程序;
Step2:
输入测试数据;
Step3:
得出结果
6.测试分析:
输入数据:
0123456789
1.11.21.31.41.51.61.71.81.91.0
abcdefghij
分析:
测试试验后得到了预期的结果,说明程序的正确性。
7.设计体会:
通过熟悉了对类模板的使用,进一步熟练了如何通过类模板的实例化来定义对象以及对类成员函数的调用等。
第三阶段可视化编程
可视化实现面向过程中的第五题:
1.题目:
编程序,使用户任意输入一个年份以及该年的1月1日是星期几,而后任意指定某一天(再输入该年的任意一个月份日期),由程序计算出这一天是星期几。
注意,2月份闰年为29天,非闰年为28天;可被4整除而不可被100整除的年份、或者可被400整除的年份均为闰年。
2.需求分析:
设计一个程序,实现一个年份以及该年的1月1日是星期几,然后再输入该年的任意一个月份日期由程序计算出这一天是星期几。
根据题目要求,规定如下:
测试数据:
输入数据:
2011星期六2011/1/4
输出数据:
您要查询的日期是星期二
输入数据:
2011星期六2011/1/15
输出数据:
您要查询的日期是星期六
3.设计概要:
(1)设计如下对话框:
(2)给相应编辑框分别关联变量为year1,string,year,month,day,str;
(3)给“查询”按钮添加函数OnSearch();
(4)在SEARDlg.cpp源文件中的voidCSEARDlg:
:
OnSearch()添加代码。
4.详细设计与编码:
(1)根据概要设计中描述的进行设计:
在上图中一次添加编辑框和按钮并关联变量,完成后如下:
在voidCSEARDlg:
:
OnSearch()中添加如下代码:
inta[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
inti,s=7,n;
UpdateData(TRUE);
if(string=="星期一")n=1;
if(string=="星期二")n=2;
if(string=="星期三")n=3;
if(string=="星期四")n=4;
if(string=="星期五")n=5;
if(string=="星期六")n=6;
if(string=="星期日")n=7;
if((year%4==0&&year%100!
=0)||year%400==0)a[2]=29;
for(i=1;is+=day;
s%=7;
s+=n;
s%=7;
if(s==0||s==1)s+=6;
elses=s-1;
switch(s)
{
case1:
str="您要查询的日期是星期一";UpdateData(FALSE);break;
case2:
str="您要查询的日期是星期二";UpdateData(FALSE);break;
case3:
str="您要查询的日期是星期三";UpdateData(FALSE);break;
case4:
str="您要查询的日期是星期四";UpdateData(FALSE);break;
case5:
str="您要查询的日期是星期五";UpdateData(FALSE);break;
case6:
str="您要查询的日期是星期六";UpdateData(FALSE);break;
case7:
str="您要查询的日期是星期日";UpdateData(FALSE);break;
default:
str="error\n";UpdateData(FALSE);break;
}
完成后如下图:
(2)源程序:
//SEARDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"SEAR.h"
#include"SEARDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CSEARDlgdialog
CSEARDlg:
:
CSEARDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CSEARDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CSEARDlg)
year1=0;
year=0;
month=0;
day=0;
str=_T("");
string=_T("");
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCSEARDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSEARDlg)
DDX_Text(pDX,IDC_YEAR1,year1);
DDX_Text(pDX,IDC_YEAR,year);
DDX_Text(pDX,IDC_MONTH,month);
DDV_MinMaxInt(pDX,month,1,12);
DDX_Text(pDX,IDC_DAY,day);
DDV_MinMaxInt(pDX,day,1,31);
DDX_Text(pDX,IDC_RESULT