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