向量类的设计与实现Word格式文档下载.docx
《向量类的设计与实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《向量类的设计与实现Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
第18周:
程序的设计、调试与实现;
第19周:
程序测试与分析,撰写课程设计报告,进行答辩验收。
指导教师:
201年月日
专业负责人:
201年月日
学院教学副院长:
摘要
很多自然科学和工程技术中的问题的解决最终都归结到向量问题的处理,向量在解物理中的许多问题例如物理中力、速度、加速度、位移都是利用向量解决合力、合速度之类的问题。
本文采用C++语言实现了对向量的基本操作,采用VisualC++6.0的控制台工程和MFC工程分别实现了对向量的处理。
关键词:
队列;
类模板;
控制台工程;
MFC工程
1.需求分析
1.向量英文:
Vector,又叫矢量,顾名思义,有方向的量。
但是在计算机里vector又可以翻译为容器,或者说理解为容器,其实这不是一种很好的理解么,纯数学上的向量可以由2维3维推广到多维,实际上它不就是一个实数的容器,在推广到其他领域,向量即一个若干相关因素的容器,也就是说向量可以应用在很多领域中,可以轻松直观的描述事物的信息,也可以存放信息,例如,二维三维中可以描述点(坐标),物体的位置,描述颜色(RGB,红绿蓝,),在多维的话,可描述的范围就更广了,最简单的如描述一个人的性格,或者能力。
2.类是C++中十分重要的概念。
它是实现面向对象程序设计的基础。
C++对C的改进。
最重要的就是增加了“类”这样一种类型。
类是所有面向对象的语言的共同特征。
所有面向对象的语言都提供了这种类型。
如果一种计算机语言中不包含类。
它就不能称为面向对象的语言。
2.算法基本原理
1.初始化一个名叫XiangL的类。
为了便于类中的成员更改及操作。
将要用的两个向量数组设为public型。
即x[N]和y[N]。
另外由于n维向量的n值需要多次重复利用。
可以把n设为全局变量。
2.析构函数为了实现向量动态存储释放。
其实可以直接让其函数体内为空。
为了方便实现。
用了一个选择语句让用户选择要拷贝的是x还是y向量。
为了方便返回值。
定义了一个XLAdd类。
其类里有个公有成员数组。
便于实现赋值后的输出。
利用for循环实现对两个向量的内积求和。
6.编写成员函数求两个向量外积。
由于内积=|a|*|b|*cosa。
而外积=|a|*|b|*sina。
而上面已经求了内积。
根据上面的关系可推导出外积。
利用for循环实现。
8.编写成员函数求两个向量的差。
为了简化判断。
选择向量的前几项进行判断。
另外如果内积为零的话。
直接表示为两个向量是垂直的关系。
3.类设计
1.对于基类XiangL来讲。
为了方便实现操作。
我们只是设了公有成员。
有公有成员数据x[N]、y[N]用于存放向量。
其余则为公有函数。
XingL()为构造函数。
XLCopy(inta[],intb[],intd)为拷贝函数。
XLAddoperator=(inta[])为运算符”=”的重载。
XLNeiJi(inta[],intb[],intd)为求两个向量的内积的函数。
XLWaiJi(inta[],intb[],intc,intd)为求两个向量的外积的函数。
XLPlus(inta[],intb[],intd)为求两个向量的和的函数。
XLRedu(inta[],intb[],intd)为求两个向量的差的函数。
XLPanDuan(inta[],intb[],intc);
为判断两个向量的线性关系的函数。
~XiangL()析构函数。
2.至于外加的类XLAdd。
了额方便进行对于”=”重载后能有很好的一个返回值而加的。
其含有一个公有成员数据d[N]。
用于存放一个向量。
便于其的输出与处理。
4.基于控制台的应用程序
整个程序分为三个大部分。
第一个部分即为对类XiangL的定义。
第二个部分则是对类XiangL中的各个成员函数进行定义。
第三个部分即为主函数,主函数中用了switch语句让用户选择要执行的函数。
4.1类的初始定义
#include<
iostream>
cmath>
usingnamespacestd;
#defineN100
intn;
classXLAdd{//备用的向量类。
public:
intd[N];
};
classXiangL{//类XiangL的声明。
intx[N],y[N];
XiangL();
//构造函数。
voidXLCopy(inta[],intb[],intd);
//拷贝函数。
XLAddoperator=(inta[]);
//运算符”=”的重载。
intXLNeiJi(inta[],intb[],intd);
//求两个向量的内积。
floatXLWaiJi(inta[],intb[],intc,intd);
//求两个向量的外积。
voidXLPlus(inta[],intb[],intd);
//求两个向量的和。
voidXLRedu(inta[],intb[],intd);
//求两个向量的差。
voidXLPanDuan(inta[],intb[],intc);
//判断两个向量的线性关系
~XiangL();
//析构函数。
}s;
4.2类的实现
XiangL:
:
XiangL(){}
~XiangL(){}
voidXiangL:
XLCopy(inta[],intb[],intd){//拷贝函数。
inti;
charc;
intz[N];
cout<
<
"
选择要拷贝的向量。
选x或y。
endl;
cin>
>
c;
switch(c){
case'
x'
{for(i=0;
i<
d;
i++){z[i]=a[i];
}}break;
y'
i++){z[i]=b[i];
default:
break;
}
XLaddPrint(z,d);
}
XLAddXiangL:
operator=(inta[]){//重载=。
XLAddb;
for(i=0;
n;
i++){b.d[i]=a[i];
returnb;
intXiangL:
XLNeiJi(inta[],intb[],intd){//求内积。
inti,c;
c=0;
i++){c+=(a[i]*b[i]);
returnc;
floatXiangL:
XLWaiJi(inta[],intb[],intc,intd){//求外积。
inti,sx,sy;
sx=0;
sy=0;
doubles1,s2,z,y;
i++){
sx+=(a[i]*a[i]);
sy+=(b[i]*b[i]);
s1=sqrt((float)sx);
s2=sqrt((float)sy);
z=(float)acos(c/(s1*s2));
y=(float)sin(z)*(s1*s2);
returny;
VoidXiangL:
XLPlus(inta[],intb[],intd){//求和。
inty[N];
y[i]=a[i]+b[i];
XLaddPrint(y,d);
VoidXiangL:
XLRedu(inta[],intb[],intd){//求差。
y[i]=a[i]-b[i];
VoidXiangL:
XLPanDuan(inta[],intb[],intc){//判断线性关系。
if(c==0)cout<
垂直。
elseif((a[0]/a[0])==(b[1]/b[1])){
cout<
平行或在一条线。
elsecout<
无线性关系。
voidXLaddPrint(intr[],intb){//输出向量。
向量为。
("
;
b;
r[i]<
"
)"
intIfContinue(){//判断是否继续执行函数的函数。
chari;
继续执行函数请输入Y/y:
i;
if(i=='
Y'
||i=='
)return0;
elseexit
(1);
4.3主函数的设计
voidmain(){
inti,c,n;
XiangLz;
inta[N],b[N];
while
(1){
1初始化。
2进行拷贝。
3重载=。
"
4求内积。
5求外积。
6求和。
7求差。
8表示线性相关性。
i=s.XLNeiJi(a,b,n);
case1:
{cout<
请输入n维向量的n值:
cout<
请输入x向量其向量有"
n<
个值。
//输入值。
i++){cin>
a[i];
请输入y向量其向量有"
b[i];
IfContinue();
}break;
case2:
{s.XLCopy(a,b,n);
IfContinue();
}break;
case3:
{z=a;
XLaddPrint(a,n);
IfContinue();
case4:
{cout<
内积为。
s.XLNeiJi(a,b,n)<
case5:
外积为。
s.XLWaiJi(a,b,i,n)<
case6:
{s.XLPlus(a,b,n);
case7:
{s.XLRedu(a,b,n);
case8:
{s.XLPanDuan(a,b,i);
default:
break;
4.4基于控制台的应用程序测试
程序运行结果如图1~3所示。
图1
图2
图3
5.1基于MFC的应用程序设计
5.1.1MFC程序界面设计
首先在VC中建立MFCAppWizard(exe)工程,名称为向量,并在向导的Step1中选择Dialogbased,即建立基于对话框的应用程序,如下图4~5所示。
图4建立MFCAppWizard(exe)工程
图5建立基于对话框的应用程序
将对话框资源中的默认对话框利用工具箱改造成如下界面,如图6所示。
图6所示的界面中包含了2个StaticText控件,4个Button控件,和14个EditBox控件,控件的基本信息列表如下表1所示。
表1控件基本信息
控件类别
控件ID
控件Caption
说明
StaticText
IDC_STATIC
向量x:
向量y:
IDC_BUTTON_Plus
计算向量相加
Button
IDC_BUTTON_Redu
计算向量相减
IDC_BUTTON_NeiJi
计算两个向量的内积
IDC_BUTTON_WaiJi
计算两个向量的外积
EditBox
IDC_EDIT_A00~IDC_EDIT_A11
用于存放向量
IDC_EDIT_b0
用于存放内积
IDC_EDIT_c0
用于存放外积
5.1.2MFC程序代码设计
为了能够将对话框界面上的控件能够与代码联系起来,需要为14个EditBox控件建立MemberVariables,按Ctrl+w键进入MFCClassWizard界面,选择MemberVariables选项卡,可显示成员变量设置界面。
通过该界面设置与14个EditBox控件对应的成员变量,具体如表2所示。
表2控件基本信息
成员变量类型
成员变量名称
IDC_EDIT_A01~IDC_EDIT_A3
int
x_1~x_3
IDC_EDIT_A04~IDC_EDIT_A6
y_1~y_3
IDC_EDIT_A07~IDC_EDIT_A9
h_1~h_3
IDC_EDIT_A10~IDC_EDIT_A12
c_1~c_3
i_NJ
float
f_WJ
下面是编写代码的重要阶段,可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写的步骤与内容如下。
1.编写求和的消息处理函数,实现向量求和,具体代码如下
voidCMyDlg:
OnAddPlus()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
h_1=x_1+y_1;
h_2=x_2+y_2;
h_3=x_3+y_3;
UpdateData(false);
2.编写求差的消息处理函数,实现向量求差,具体代码如下
OnReduceXL()
c_1=x_1-y_1;
c_2=x_2-y_2;
c_3=x_3-y_3;
3.编写求内积的消息处理函数,实现求两个向量的内积,具体代码如下
OnNeiJiXL()
i_NJ=(x_1*y_1)+(x_2*y_2)+(x_3*y_3);
4.编写求外积的消息处理函数,实现求两个向量的外积,具体代码如下
OnWaiJiXL()
intsx,sy;
doubles1,s2,z;
sx=(x_1*x_1)+(x_2*x_2)+(x_3*x_3);
sy=(y_1*y_1)+(y_2*y_2)+(y_3*y_3);
z=(float)acos(i_NJ/(s1*s2));
f_WJ=(float)sin(z)*(s1*s2);
5.1.3基于MFC的应用程序测试
运行程序后,首先出现的界面如图8所示。
图8程序初始运行界面
进行输入数据后,再单击求和按钮,实现求差并将结果显示出来,如图9所示。
图9求和后的界面
单击求差按钮,实现求差并将结果显示出来,如图10所示。
图10求差后的界面
单击求内积数据按钮,实现求内积并将结果显示出来,如图11所示
图11求内积后的界面
单击求外积数据按钮,实现求外积并将结果显示出来,如图12所示
图12求外积后的界面
结论
本次程序围绕基类XiangL展开。
利用其成员函数进行了对向量的基本操作。
基本满足了题目所给的要求。
实现了对这个向量类的设计与实现。
本次课程设计作为编写Windows程序的初步尝试,能够实现程序的主要功能,可以说是取得了成功,然而好的程序绝不仅仅是只有功能性这一个指标,本此编写的MFC程序虽然能实现所需功能,但从面向对象程序设计理念和图形界面设计要求来说,尚存在不足,主要包括以下几个方面。
1.在控制台的程序上。
我们没有考虑n维向量n的可变性。
只是设了两个三维的向量进行相加。
相减。
求内外积的运算。
程序的可用性及广泛性值得加强。
2.在MFC的程序设计中。
我们只是象征性的表示了一下向量。
而且赋予了一定的初始化。
所以整体程序的可变性不是很强。
3.对于MFC的应用程序。
由于MFC是依赖图形而存在的。
而我们所做的MFC的图形界面过于简单单一化了。
而且处理的灵活性不够。
对于这一点。
希望在以后学习中得到适当的加强。
参考文献
[1]谭浩强.C++面向对象程序设计.北京:
清华大学出版社,2006.1
[2]马秀丽,刘志妩,李筠.C语言程序设计.北京:
清华大学出版社,2008.3
[3]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,2007
(注:
文档可能无法思考全面,请浏览后下载,供参考。
可复制、编制,期待你的好评与关注)