vs程序编写实验报告数组指针与函数Word下载.docx

上传人:b****4 文档编号:16674162 上传时间:2022-11-25 格式:DOCX 页数:27 大小:246.32KB
下载 相关 举报
vs程序编写实验报告数组指针与函数Word下载.docx_第1页
第1页 / 共27页
vs程序编写实验报告数组指针与函数Word下载.docx_第2页
第2页 / 共27页
vs程序编写实验报告数组指针与函数Word下载.docx_第3页
第3页 / 共27页
vs程序编写实验报告数组指针与函数Word下载.docx_第4页
第4页 / 共27页
vs程序编写实验报告数组指针与函数Word下载.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

vs程序编写实验报告数组指针与函数Word下载.docx

《vs程序编写实验报告数组指针与函数Word下载.docx》由会员分享,可在线阅读,更多相关《vs程序编写实验报告数组指针与函数Word下载.docx(27页珍藏版)》请在冰豆网上搜索。

vs程序编写实验报告数组指针与函数Word下载.docx

IDC_EDIT1

True

strCoordData

IDC_EDIT2

strResult

具体见运行结果的输出界面

主要代码:

ComAreaDlg.cpp

voidCComAreaDlg:

:

OnBnClickedCancel()

{

//TODO:

在此添加控件通知处理程序代码

OnCancel();

}

CString*CComAreaDlg:

SplitString(CStringstr,charsplit,int&

iSubStrs)

intiPos=0;

//分割符位置

intiNums=0;

//分割符的总数

CStringstrTemp=str;

CStringstrRight;

//先计算子字符串的数量

while(iPos!

=-1)

{

iPos=strTemp.Find(split);

if(iPos==-1)

break;

}

strRight=strTemp.Mid(iPos+1,str.GetLength());

strTemp=strRight;

iNums++;

if(iNums==0)//没有找到分割符

//子字符串数就是字符串本身

iSubStrs=1;

returnNULL;

//子字符串数组

iSubStrs=iNums+1;

//子串的数量=分割符数量+1

CString*pStrSplit;

pStrSplit=newCString[iSubStrs];

strTemp=str;

CStringstrLeft;

for(inti=0;

i<

iNums;

i++)

//左子串

strLeft=strTemp.Left(iPos);

//右子串

strRight=strTemp.Mid(iPos+1,strTemp.GetLength());

pStrSplit[i]=strLeft;

pStrSplit[iNums]=strTemp;

returnpStrSplit;

voidCComAreaDlg:

OnBnClickedButton1()

UpdateData(TRUE);

intiLine;

//分行并存入字符串数组

CString*pstrLine=SplitString(strCoordData,13,iLine);

if(iLine<

4)

MessageBox(_T("

输入的数据不完整!

"

));

return;

intiApexCount=iLine-1;

//多边形顶点个数

shortnpolygonType;

//多边形类型,

double(*cApex)[2];

cApex=newdouble[iApexCount][2];

//顶点坐标值

CString*strTmp=NULL;

intn;

npolygonType=_ttoi(pstrLine[0]);

//第一行为多边形类型

//逐行用Split函数分离,获取各顶点坐标数据

for(inti=0;

i<

iApexCount;

i++)

strTmp=SplitString(pstrLine[i+1],'

'

n);

//分割第三行

cApex[i][0]=_tstof(strTmp[0]);

cApex[i][1]=_tstof(strTmp[1]);

if(strTmp!

=NULL)//释放内存

{

delete[]strTmp;

strTmp=NULL;

}

if(strTmp!

delete[]strTmp;

strTmp=NULL;

doubleArea=0.0;

//多边形面积

if(i==iApexCount-1)

//i+1=0;

Area=Area+(0.5)*(cApex[0][0]+cApex[i][0])*(cApex[0][1]-cApex[i][1]);

else

Area=Area+(0.5)*(cApex[i+1][0]+cApex[i][0])*(cApex[i+1][1]-cApex[i][1]);

//计算面积

//输出结果

strResult.Format(_T("

%s%.1fmm\r\n"

),

_T("

面积S=:

),Area);

//_T("

序号"

),_T("

调整后H(m)"

UpdateData(FALSE);

//释放内存

if(cApex!

=NULL)

delete[]cApex;

cApex=NULL;

运行结果:

2.由三角形三个边长求内角函数

计算公式:

已知三角形三个边长求三角形三个内角算法简单,需要的数据也少,顺序结构即可实现。

为了更加熟悉函数的调用,我编写了一个函数计算三内角,在计算的主程序中调用它就可以达到效果。

函数的返回值不能为多值,因此形参中我用了引用做函数参数。

界面很简单,三个文本框输入已知的三条边长,三个文本框输出所求结果。

具体见运行结果的输出界面

主要代码

文件SolveTriangleDlg.cpp

constdoublePI=3.1415926;

//将弧度转化成度分秒形式

doubleRad_To_Dms(doubleRad)

doubledDeg,dDms;

//十进制角度及度分秒格式角度,控制变量

//用于存放度分秒三个值的变量

intiDegree,iMin;

doubledSec;

doubledTmp;

dDeg=Rad*180/PI;

//弧度转化为度

//度转化成度分秒

iDegree=int(dDeg);

dTmp=(dDeg-iDegree)*60;

iMin=int(dTmp);

dSec=(dTmp-iMin)*60;

dDms=iDegree+double(iMin)/100+dSec/10000;

returndDms;

//已知三角形三边长,求三内角

voidSolveTriangle(doublea,doubleb,doublec,double&

A,double&

B,double&

C)

///doubledAngle[3]={0,0,0};

A=acos((b*b+c*c-a*a)/(2*b*c));

B=acos((a*a+c*c-b*b)/(2*a*c));

C=acos((a*a+b*b-c*c)/(2*a*b));

voidCSolveTriangleDlg:

/*double*dAngle;

dAngle=*/

SolveTriangle(a,b,c,A,B,C);

A=Rad_To_Dms(A);

B=Rad_To_Dms(B);

C=Rad_To_Dms(C);

OnBnClickedOk()

OnOK();

3.由已知平面外接圆上三点坐标计算圆心坐标函数

计算公式为:

文件ComputeCoordinateDlg.cpp

voidCComputeCoordinateDlg:

doublea,b,c;

doubleg;

a=X1*X1+Y1*Y1;

b=X2*X2+Y2*Y2;

c=X3*X3+Y3*Y3;

g=(Y3-Y2)*X1+(Y1-Y3)*X2+(Y2-Y1)*X3;

Xo=((b-c)*Y1+(c-a)*Y2+(a-b)*Y3)/(2*g);

Yo=-((b-c)*X1+(c-a)*X2+(a-b)*X3)/(2*g);

输入位于圆上的三个点的坐标,求圆心坐标。

4.极坐标法求待定点坐标函数

1)编写度分秒及弧度之间相互转换的函数、方位角计算的函数。

2)求线段AB的方位角。

3)求线段AP的方位角,并转化为弧度。

4)根据极坐标法求待定点P的坐标。

界面很简单,8个文本框,8个静态框和三个命令按钮。

文件PolarCoordinatesDlg.cpp

//将度分秒形式转化为弧度

doubleDms_To_Rad(doubledDms)

//分别用于存放度、分、秒值的变量

doubledDeg;

//十进制角度,控制变量

doubledRad;

//弧度

iDegree=int(dDms);

//截取度

iMin=int((dDms-iDegree)*100);

//截取分

dSec=((dDms-iDegree)*100-iMin)*100;

//获取秒

dDeg=iDegree+double(iMin)/60+dSec/3600;

//先把分秒转化成度,再相加

dRad=dDeg*PI/180;

//转化为弧度

returndRad;

//计算方位角的函数

doubleTriAzimuth(doubleX1,doubleY1,doubleX2,doubleY2)

doubledx,dy;

doubleA;

//角度,控制变量

dx=X2-X1;

dy=Y2-Y1;

if(dx>

0)

if(dy>

A=atan(dy/dx);

//A为第一象限角

elseif(dy<

A=atan(dy/dx)+2*PI;

//A为第四象限角

else

A=0;

//A=0度

elseif(dx<

A=atan(dy/dx)+PI;

//A为第二象限角

//A为第三象限角

else

A=2*PI;

//A=180度

A=PI;

//A=90度

A=3*PI;

//A=270度

//将弧度转化为度分秒形式

returnA;

voidCPolarCoordinatesDlg:

doubleαab,αap;

αab=TriAzimuth(Xa,Ya,Xb,Yb);

//反算AB的方位角

αap=αab+β;

//求AP的方位角

αap=Dms_To_Rad(αap);

Xp=Xa+Dap*cos(αap);

Yp=Ya+Dap*sin(αap);

5.交会定点计算函数设计

把前面学过的前方交会、测边交会、后方交会程序写成函数的形式,然后再通过主程序调用

该程序内容多,代码繁琐,应用的函数也多,因此先添加了一个项,用来存储功能函数,如度分秒向度转换的函数、计算前方交会的函数、计算测边交会的函数、计算后方交会的的函数。

该程序需实现三种交会方式,因此要用到选择结构。

定义一个变量iMethod,当它分别为1、2、3时分别执行前方交会、测边交会、后方交会。

调用Split函数分离,获取观测数据。

界面比较复杂,有四个文本框,一个文本框添加了double型变量iMethod,用来选择交会方式,一个文本框用来输入观测数据,其具体属性为:

strObsData

其它两个文本框用来输出待定点坐标,添加的变量皆为double型。

文件1Fun.h

#pragmaonce

doubleDms_To_Rad(doubledDms);

voidForwardIntersection(doubleX1,doubleY1,doubleX2,doubleY2,doubleα,doubleβ,double&

X,double&

Y);

voidSideIntersection(doubleXa,doubleYa,doubleXb,doubleYb,doubleDap,doubleDbp,double&

voidResection(doubleXa,doubleYa,doubleXb,doubleYb,doubleXc,doubleYc,doubleα,doubleβ,doubleγ,double&

文件2Fun.cpp

#include"

stdafx.h"

#include"

Fun.h"

#include<

math.h>

constdoublePI=3.1415926;

//前方交会函数

Y)

α=Dms_To_Rad(α);

//将度分秒转化为弧度

β=Dms_To_Rad(β);

X=(X1/tan(β)+X2/tan(α)+(Y2-Y1))/(1/tan(α)-1/tan(β));

Y=(Y1/tan(β)+Y2/tan(α)+(X1-X2))/(1/tan(α)-1/tan(β));

//测方交会程序

doubleα,β;

//角度变量,存储角度BAP的弧度值

doubleDab;

//AB两点间的距离

Dab=sqrt((Xb-Xa)*(Xb-Xa)+(Yb-Ya)*(Yb-Ya));

α=acos((Dab*Dab+Dap*Dap-Dbp*Dbp)/(2*Dab*Dap));

β=acos((Dab*Dab+Dbp*Dbp-Dbp*Dbp)/(2*Dab*Dbp));

X=(Xa/tan(β)+Xb/tan(α)+(Yb-Ya))/(1/tan(α)-1/tan(β));

Y=(Ya/tan(β)+Yb/tan(α)+(Xa-Xb))/(1/tan(α)-1/tan(β));

//后方交会

//边长

doublePa,Pb,Pc;

//权值变量

doubleA,B,C;

//存储三个内角值的变量

γ=Dms_To_Rad(γ);

//P1,P2,P3为观测角

//求三角形边长

a=sqrt((Xc-Xb)*(Xc-Xb)+(Yc-Yb)*(Yc-Yb));

b=sqrt((Xc-Xa)*(Xc-Xa)+(Yc-Ya)*(Yc-Ya));

c=sqrt((Xb-Xa)*(Xb-Xa)+(Yb-Ya)*(Yb-Ya));

//求三角形三内角

//求权值

Pa=tan(α)*tan(A)/(tan(α)-tan(A));

Pb=tan(β)*tan(B)/(tan(β)-tan(B));

Pc=tan(γ)*tan(C)/(tan(γ)-tan(C));

//求待测点坐标

X=(Pa*Xa+Pb*Xb+Pc*Xc)/(Pa+Pb+Pc);

Y=(Pa*Ya+Pb*Yb+Pc*Yc)/(Pa+Pb+Pc);

文件3IntersectionDlg.cpp

voidCIntersectionDlg:

CString*pstrLine=SplitString(strObsData,13,iLine);

/*iLine=3;

*/

doubleXa,Ya,Xb,Yb,Xc,Yc;

//已知坐标值

//前方交会角度观测值

doubleα,β,γ;

//后方交会角度观测值

doubleDap,Dbp;

//测边交会距离观测值

//分割第一行获得A点坐标

strTmp=SplitString(pstrLine[0],'

Xa=_tstof(strTmp[0]

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1