C++实验报告.docx
《C++实验报告.docx》由会员分享,可在线阅读,更多相关《C++实验报告.docx(80页珍藏版)》请在冰点文库上搜索。
C++实验报告
《测绘程序设计(VC.net)》
上机实验报告
(VisualC++.Net)
班级:
学号:
姓名:
序号:
二零一五年六月
实验2控制结构程序设计…………………………………………………………….................5验3数组与指针、函数…………………………………………………………………………18
实验4类的创建………………………………………………………………………………….26
实验5文件……………………………………………………………………………………30
实验6图形程序设计…………………………………………………………………………….36
实验7点云数据处理……………………………………………………………………………44
实验8平差程序设计基础……………………………………………………………………….50
.
实验1VisualC++.net环境和简单程序设计
一、实验目的
∙掌握VisualS的安装和启动。
∙了解VC++2008的菜单系统、工具栏和各种基本窗体。
∙理解VC++.net开发应用程序的步骤。
∙掌握基于对话框的程序设计。
∙掌握按钮、文本框和标签框的基本使用方法
∙掌握使用MSDN帮助文档
设计思路:
在按钮下面添加程序。
根据海伦公式添加4个变量a.b.c.s的编辑框。
界面设计:
主要代码:
classCMyGJJ_0145130602_ex1Dlg:
publicCDialog
{
//构造
public:
CMyGJJ_0145130602_ex1Dlg(CWnd*pParent=NULL);//标准构造函数
//对话框数据
enum{IDD=IDD_MYGJJ_0145130602_ex1_DIALOG};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msgvoidOnBnClickedOk();
afx_msgvoidOnBnClickedCancel();
doublem_a;
doublem_b;
doublem_c;
doublem_s;
afx_msgvoidOnBnClickedButton1();
};
HCURSORCMyGJJ_0145130602_ex1Dlg:
:
OnQueryDragIcon()
{
returnstatic_cast(m_hIcon);
}
doubleculsjx(doublex,doubley,doublez)
{
doubleret,p;
p=(x+y+z)/2;
ret=sqrt(p*(p-x)*(p-y)*(p-z));
returnret;
}
voidCMyGJJ_0145130602_ex1Dlg:
:
OnBnClickedOk()
{
//TODO:
在此添加控件通知处理程序代码
//OnOK();
UpdateData(TRUE);
m_s=culsjx(m_a,m_b,m_c);
UpdateData(FALSE);
}
voidCMyGJJ_0145130602_ex1Dlg:
:
OnBnClickedCancel()
{
//TODO:
在此添加控件通知处理程序代码
//OnCancel();
m_a=0;
m_b=0;
m_c=0;
m_s=0;
UpdateData(FALSE);
}
voidCMyGJJ_0145130602_ex1Dlg:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
exit(0);
}
运行结果:
实验2控制结构程序设计
一、实验目的
∙掌握VC++.net语言的基本语法;
∙理解顺序结构、选择结构和循环结构程序设计的特点及应用;
∙掌握对基于对话框的MFC应用程序设计方法;
∙掌握一些简单算法。
1.编写一个方位角计算程序。
提示:
先使用反正切函数计算,然后利用坐标增量的符号来判断所在的象限。
∙
设计思路:
x,y同时大于0在第一象限,方位角等于arctan(y/x);X>0,Y<0在第二象限,方位角等于arctan(y/x)+90;X<0,Y<0在第三象限,方位角等于arctan(y/x)+180;X<0,Y>0在第四象限,方位角等于arctan(y/x)+270;
界面设计:
主要代码:
classCGJJ_0602_ex21Dlg:
publicCDialog
{
//构造
public:
CGJJ_0602_ex21Dlg(CWnd*pParent=NULL);//标准构造函数
//对话框数据
enum{IDD=IDD_GJJ_0602_EX21_DIALOG};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
doublex1;
doublex2;
afx_msgvoidOnEnChangeEdit4();
doubley1;
doubley2;
doubleA;
double象限;
afx_msgvoidOnEnChangeEdit1();
afx_msgvoidOnBnClickedOk();
afx_msgvoidOnBnClickedCancel();
afx_msgvoidOnBnClickedButton1();
afx_msgvoidOnEnChangeEdit3();
};
voidCGJJ_0602_ex21Dlg:
:
OnBnClickedOk()
{
x1=0;
y1=0;
x2=0;
y2=0;
UpdateData(0);
}
voidCGJJ_0602_ex21Dlg:
:
OnBnClickedCancel()
{
//TODO:
在此添加控件通知处理程序代码
OnCancel();
}
voidCGJJ_0602_ex21Dlg:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData
(1);
A=((y2-y1)/(x2-x1));
if((y2-y1)>0&&(x2-x1)>0)
象限=1;
elseif((y2-y1)>0&&(x2-x1)<0)
象限=2;
elseif((y2-y1)<0&&(x2-x1)<0)
象限=3;
else
象限=4;
UpdateData(0);
}
运行结果:
2.设计同一参考椭球下的三维地心坐标(笛卡儿坐标系)与大地坐标系转换的程序。
(提示:
用do…while迭代,B、H初始为0进行迭代,直到H的精度达到0.00001米)
注意:
东经0~180(Y>0),西经:
0~-180(Y<0)
式中,B、L、H为椭球面上的大地纬度、大地经度、大地高;X、Y、Z为空间直角坐标;N为卯酉圈曲率半径,e为椭球的偏心率,a为椭球的长半径,b为椭球的短半径。
(WGS84椭球参数:
长半径a=6378137m,扁率α=1/298.257223563)
设计思路:
先设计好对话框,根据以上公式添加变量然后根据公式编写代码。
界面设计:
主要代码:
classCGJJ_0602_ex22Dlg:
publicCDialog
{
//构造
public:
CGJJ_0602_ex22Dlg(CWnd*pParent=NULL);//标准构造函数
//对话框数据
enum{IDD=IDD_GJJ_0602_EX22_DIALOG};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
doubleB;
doubleL;
doubleH;
doubleX;
doubleY;
doubleZ;
afx_msgvoidOnBnClickedButton2();
afx_msgvoidOnBnClickedButton1();
};
#definePI3.14159265358979323846
constdoublef=1/298.257223563;
doubleN,e=sqrt(2*f-f*f);//扁率f,第一偏心率e,卯酉圈半径N
doublea=6378137;
voidCGJJ_0602_ex22Dlg:
:
OnBnClickedButton1()
{
UpdateData(TRUE);//笛卡尔坐标转换为大地坐标
doubledH,H0;
doubleB2,L2,S,S1;
intD,M,D1,M1;
if(fabs(X)>=1e-5)
L=atan(Y/X)*180/PI;
elseL=0;
if(X>0)
{
L=L;
}
elseif(X<0&&Y>0)//计算经度
{
L=L+180;
}
else
{
L=L-180;
}
if((fabs(X)>=(1e-5))||(fabs(Y)>=(1e-5)))
{
B=atan(Z/sqrt(X*X+Y*Y));
H=0;
do
{
N=a/sqrt(1-e*e*sin(B)*sin(B));
H0=sqrt(X*X+Y*Y)/cos(B)-N;
B=atan(Z/(sqrt(X*X+Y*Y)*(1-e*e*N/(N+H))));//迭代运算得到H,B
dH=H0-H;
H=H0;
}
while(fabs(dH)>=(1e-5));//当H的精度达到.00001时跳出循环
}
else
{
B=0;
N=a/sqrt(1-e*e*sin(B)*sin(B));
H=sqrt(X*X+Y*Y)/cos(B)-N;
}
B=B*180/PI;
B=B+(1e-10);
L=L+(1e-10);
D=int(B);
D1=int(L);
B2=(B-D)*60;//弧度转换成度分秒格式
L2=(L-D1)*60;
M=int(B2);
M1=int(L2);
S=(B2-M)*60;
S1=(L2-M1)*60;
B=D+M/100+S/(1e4);
L=D1+M1/100+S1/(1e4);
UpdateData(FALSE);
}
voidCGJJ_0602_ex22Dlg:
:
OnBnClickedButton2()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
doubleb,l,b1,l1;
intD,M,D1,M1;
doubleS,S1;
D=int(B);
D1=int(L);
M=int((B-D)*100);
M1=int((L-D1)*100);
S=((B-D)*100-M)*100;
S1=((L-D1)*100-M1)*100;
b1=D+M/60+S/3600;//度分秒转化为弧度
l1=D1+M/60+S1/3600;
b=(b1/180)*PI;
l=(l1/180)*PI;
N=a/sqrt(1-e*e*sin(b)*sin(b));
X=(N+H)*cos(b)*cos(l);//大地测量坐标转化为笛卡尔坐标
Y=(N+H)*cos(b)*sin(l);
Z=(N*(1-e*e)+H)*sin(b);
UpdateData(FALSE);
}
运行结果:
3.编写一个后方交会计算程序。
3.1基本原理及计算公式
若将Pa、Pb、Pc看成权,则P点的坐标即为三个已知点的加权平均值
设计思路:
用于输入3个已知点的坐标和三个观测角、和,以及用于输出待定点坐标的文本框(12个)、静态标签框和Button按钮。
根据公式以上公式编写代码。
界面设计:
主要代码:
classCGJJ_0602_ex23Dlg:
publicCDialog
{
//构造
public:
CGJJ_0602_ex23Dlg(CWnd*pParent=NULL);//标准构造函数
//对话框数据
enum{IDD=IDD_GJJ_0602_EX23_DIALOG};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
doubleXA;
doubleXB;
doubleYB;
doubleYA;
doubleXC;
doubleYC;
doubleXP;
doubleYP;
doubleα;
doubleγ;
doubleβ;
afx_msgvoidOnBnClickedButton1();
};
#definePI3.14159265358979323846
voidCGJJ_0602_ex23Dlg:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
doubleafAB,afAC,afBC,afBA,afCA,afCB,A,B,C,Pa,Pb,Pc;
intD1,M1,D2,M2;
doubleS1,S2,α,β,γ,α,β,γ;
//将alfa转换成度
D1=int(α);
M1=int((α-D1)*100);
S1=((α-D1)*100-M1)*100;
α=D1+M1/60+S1/3600;
α=α*PI/180;
//将bet转换成度
D2=int(β);
M2=int((β-D2)*100);
S2=((β-D2)*100-M2)*100;
β=D2+M2/60+S2/3600;
β=β*PI/180;
//计算gama1的值
γ=180-β-α;
γ=γ*PI/180;//将gama1的值转换成弧度
//计算已知点的三个内角
afAB=atan((YB-YA)/(XB-XA));
afAC=atan((YC-YA)/(XC-XA));
afBA=atan((YA-YB)/(XA-XB));
afBC=atan((YC-YB)/(XC-XB));
afCA=atan((YA-YC)/(XA-XC));
afCB=atan((YB-YC)/(XB-XC));
A=afAB-afAC;
B=afBC-afBA;
C=afCA-afCB;
//判断点是否在危险圆上若不在则计算P点坐标
if(α+β+C<170||α+β+C>190)
{
Pa=(tan(α)*tan(A))/(tan(α)-tan(A));
Pb=(tan(β)*tan(B))/(tan(β)-tan(B));
Pc=(tan(γ)*tan(C))/(tan(γ)-tan(C));
XP=(XA*Pa+XB*Pb+XC*Pc)/(Pa+Pb+Pc);
YP=(YA*Pa+YB*Pb+YC*Pc)/(Pa+Pb+Pc);
}
else//若在则弹出“该点位于危险圆上”
MessageBox(_T("该点位于危险圆上"));
UpdateData(FALSE);
//OnCancel();
}
运行结果:
实验3数组与指针、函数
一、实验目的
∙掌握函数的定义、引用及应用方法。
二、实验内容
1.编写一个求任意多边形面积的程序。
提示:
通过界面输入数据,并把数据保存在一个二维数组或一个一维的自定义结构体类型的数组中,然后再进行计算。
要求计算部分写成函数的形式,使计算程序与界面无关。
动态数组
创建动态数组
●结构体的定义
多边形面积计算原理及算法
计算原理:
例如上图:
面积计算的算法:
经整理后得:
2高斯投影正反算计算函数设计
编写高斯投影正算与反算的两个函数,并设计简单界面对函数计算的正确性进行测试。
正算公式:
反算公式:
注意:
高斯投影正反算公式比较复杂,编写程序时变量定义一定要十分的清晰
设计思路:
首先根据以上公式确定变量个数。
将实现操作的写在按钮上。
添加顶点按钮上面实现创建动态数组,确认按钮实现返回数组大小值并将添加的数据显示到显示框中去,通过计算按钮实现多边形面积的计算,清除按钮实现清除输入的数据。
界面设计:
主要代码:
classCGJJ_0602_ex3Dlg:
publicCDialog
{
//构造
public:
CGJJ_0602_ex3Dlg(CWnd*pParent=NULL);//标准构造函数
//对话框数据
enum{IDD=IDD_GJJ_0602_EX3_DIALOG};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持
//实现
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msgvoidOnBnClickedCancel();
afx_msgvoidOnBnClickedButton4();
afx_msgvoidOnBnClickedButton2();
afx_msgvoidOnBnClickedButton3();
afx_msgvoidOnBnClickedOk();
doublex;
doubley;
intn;
double*px;
double*py;
doubleresult;
CEditm_strdis;
};
voidCGJJ_0602_ex3Dlg:
:
OnBnClickedButton4()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
result=calarea(px,py,n);
UpdateData(FALSE);
}
voidCGJJ_0602_ex3Dlg:
:
OnBnClickedButton2()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
px=newdouble[n];
py=newdouble[n];
UpdateData(FALSE);
}
voidCGJJ_0602_ex3Dlg:
:
OnBnClickedButton3()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
delete[]px;
delete[]py;
px=NULL;
py=NULL;
n=0;
result=0;
UpdateData(FALSE);
}
intt=0;
voidCGJJ_0602_ex3Dlg:
:
OnBnClickedOk()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
CStringstr;
t+=1;
if(t>n)
{
MessageBox(_T("Warning!
"));
};
str.Format(_T("No.%d%lf%lf\r