测绘程序设计基础实验报告(共78页).docx

上传人:飞****2 文档编号:16299032 上传时间:2022-05-16 格式:DOCX 页数:78 大小:725.52KB
返回 下载 相关 举报
测绘程序设计基础实验报告(共78页).docx_第1页
第1页 / 共78页
测绘程序设计基础实验报告(共78页).docx_第2页
第2页 / 共78页
点击查看更多>>
资源描述

《测绘程序设计基础实验报告(共78页).docx》由会员分享,可在线阅读,更多相关《测绘程序设计基础实验报告(共78页).docx(78页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上测绘程序设计(VC.net)上机实验报告(Visual C+.Net)班 级: 测绘1101 学 号: 姓 名: 龚自飞 序 号: 二零一四年六月专心-专注-专业目录实验1 Visual C+.Net环境和程序设计初步实验内容:1. 启动与退出VC+.net,熟悉VC+.net的开发环境,通过向导生成基于对话框的应用程序。使用MSDN查看命令按钮、标签和文本框的主要属性和方法。2. 打开Microsoft visual studio 2008 文档,浏览“Visual studio 文档”目录下的内容,并从“Visual studio 文档-Visual C+-示例”

2、目录下下载一个程序,编译并运行之。3. 设计一个已知三边边长计算三角形面积的程序。计算模型如下:海伦公式:,其中设计思路:(1)、创建名为“gzf1”的 MFC应用程序;(2)、在窗体上放置4 个文本框、4 个静态框、3 个命令按钮(其中两个缺省);(3)、设置控件属性,如Static1 的Caption 属性设置成“a=”,用于提示Edit框的输入边长a;(4)、把“取消”按钮的Caption 属性改为“退出”;双击前两个按钮,生成Click 消息函数,注释掉重载函数“OnOK()”。(5)、为4 个Edit 控件添加绑定变量。(6)、在相应的函数中添加代码;(7)、运行和调试程序;(8)、

3、保存应用程序。界面设计:主要代码: gzf1void Cproject01Dlg:OnBnClickedOk()/ TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);double p;p=(a+b+c)/2;S=sqrt(p*(p-a)*(p-b)*(p-c);UpdateData(FALSE);/OnOK();void Cproject01Dlg:OnBnClickedOk2()/ TODO: 在此添加控件通知处理程序代码a=0;b=0;c=0;S=0;UpdateData(FALSE);void Cproject01Dlg:OnBnClickedCancel()/

4、TODO: 在此添加控件通知处理程序代码OnCancel(); 运行结果:总 结总结的书写要求:这是我这学期编写的第一个MFC程序,在这次课前,我们在大一课程设计的时候有接触到相关的MFC编程,不过时隔两年,也陌生了不少。以前编程的时候都不知道为什么每次都要写UpdateData(TRUE)、UpdateData(FALSE),通过这次编程知道了它的作用分别的把控件的值赋给变量、将变量的值赋给控件;同时这次编程让我找回来了编程的感觉,觉得其实自己也是很不错的。目录实验2 控制结构程序设计实验内容:4. 编写一个方位角计算程序。先使用反正切函数计算,然后利用坐标增量的符号来判断所在的象限;5.

5、设计同一参考椭球下的三维地心坐标(笛卡尔坐标系)与大地坐标系转换的程序;6. 编写一个后方交会程序。设计思路:1(1)、设计程序界面,并且给控件添加变量;(2)、计算dx、dy;(3)、编写程序;为相应的控件编写相应的程序,“计算”首先是方位角在坐标轴上的情况,其次就是不在坐标轴上的情况,然后再将输出的弧度转换为度分秒的形式;(4)、调试运行程序。2.(1)、设计程序界面,并且给控件添加变量; (2)、先编写BLH转换到XYZ代码; (3)、再编写XYZ转换到BLH代码(注意L在不同象限的计算公式不同,B、H在循环体内只要H满足条件B就一定满足); (4)、调试运行程序;3(1)、设计程序界面

6、; (2)、判断危险圆的范围; (3)、计算三边的边长,然后计算三角形的三个内角; (4)、计算出三个观测角和三个内角的正切值,再将其带人公式计算相应的权,最后计算出观测点的坐标位置; (5)、调试运行。界面设计:主要代码: Project201void Cproject201Dlg:OnBnClickedOk()/ TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);const double PI=3.;double AB;double dx,dy;dx=Xb-Xa;dy=Yb-Ya;AB=0.0;if (dx=0&dy0)AB=PI/2;/在Y轴正半轴MessageB

7、ox(_T(该方位角在Y轴正半轴);else if (dx=0&dy0&dy=0)AB=0;/在X轴正半轴MessageBox(_T(该方位角在X轴正半轴);else if (dx0&dy0)AB=atan2(dy,dx);/第一象限m=1;else if (dx0)AB=atan2(dy,dx);/第二象限AB=PI-AB;m=2;else if (dx0)AB=atan2(dy,dx);/第三象限AB=PI+AB;m=3;else if (dx0&dy 0)L = 90;else if( X =0 & Y 0 & Y = 0)L = 0;else if( X 0 & Y 0)L = L_R

8、AD/pi*180;else if( X 0 & Y 0)L = (2*pi + L_RAD)/pi*180;else if( X 0 & Y = 0)L = 180;else if( X 0)L = (pi + L_RAD)/pi*180;else if( X 0 & Y =0.00001);B=57.3*B;double Bdeg,Bmin,Bsec;Bdeg=int(B+0.);Bmin=int(B-Bdeg)*60+0.);Bsec=(B-Bdeg)*60-Bmin)*60;B=Bdeg+Bmin/100+Bsec/10000;/B的度转换为度分秒double Ldeg,Lmin,Ls

9、ec;Ldeg=int(L+0.);Lmin=int(L-Ldeg)*60+0.);Lsec=(L-Ldeg)*60-Lmin)*60;L=Ldeg+Lmin/100+Lsec/10000;/L的度转换为度分秒UpdateData(FALSE);void Cproject202Dlg:OnBnClickedOk2()/ TODO: 在此添加控件通知处理程序代码X=0;Y=0;Z=0;B=0;L=0;H=0;UpdateData(FALSE); Project203void Cproject203Dlg:OnBnClickedOk()/ TODO: 在此添加控件通知处理程序代码UpdateDat

10、a(TRUE);double A,B,C,z;z=f+g+C;if(z=2.965&z=3.315)MessageBox(_T(危险圆)/危险圆的判定elsedouble A1,B1,C1,a,b,c;a=sqrt(xB-xC)*(xB-xC)+(yB-yC)*(yB-yC);/角A对应的边a b=sqrt(xA-xC)*(xA-xC)+(yA-yC)*(yA-yC);/角B对应的边b c=sqrt(xB-xC)*(xB-xC)+(yB-yC)*(yB-yC);/角C对应的边c A1=(b*b+c*c-a*a)/(2*b*c);/A1=cosA B1=(a*a+c*c-b*b)/(2*a*c)

11、;/B1=cosBC1=(a*a+b*b-c*c)/(2*a*b);/C1=cosCA=acos(A1);B=acos(B1);C=acos(C1);/计算三角形的三个内角A、B、Cdouble A2,B2,C2,f2,g2,h2;A2=tan(A);B2=tan(B);C2=tan(C);f2=tan(f);g2=tan(g);h2=tan(h);/计算三角形的三个内角和三个观测角的正切值double Pa,Pb,Pc;/定义三个已知点的权Pa=f2*A2/(f2-A2);Pb=g2*B2/(g2-B2);Pc=h2*C2/(h2-C2);double m,n,k;/将待定的计算公式分三部分

12、m=Pa*xA+Pb*xB+Pc*xC;n=Pa*yA+Pb*yB+Pc*yC;k=Pa+Pb+Pc;xP=m/k;yP=n/k;UpdateData(FALSE);/OnOK();void Cproject203Dlg:OnBnClickedOk2()/ TODO: 在此添加控件通知处理程序代码xA=0;xB=0;xC=0;yA=0;yB=0;yC=0;f=0;g=0;h=0;xP=0;yP=0;UpdateData(FALSE);void Cproject203Dlg:OnBnClickedCancel()/ TODO: 在此添加控件通知处理程序代码OnCancel();运行结果:设计技巧

13、:1、 程序调试的时候可以将要输入的数据预先输入初始化处,这样调试运行的时候就不用再花时间在对话框中输入数据了;2、 长的表达式尽量分成几个小部分,一方面调试比较方便,另一方面程序比较清晰;3、 在编写程序之前最好还是先把主要程序的大致思路写在草稿纸上。 总 结这个实验包含三个内容,当我在做第一个内容的时候花了两个小时,当时编好了这个程序后超级有成就感的,刚编好的时候没有添加是在哪个象限,只计算了方位角,而且方位角还是弧度,然后后来慢慢添加进去象限的计算和弧度的转换。第二个内容比较难,我个人基础又不是很好,大概花了两天的时间来编写它,主要是那个循环没有弄好,对于循环的理解不够透彻。然后角度转换

14、这一部分是在三个实验都编写好了在机房调试的时候再添加进去的。完成了第二个实验再做第三个实验就像如鱼得水似得很快就完成了,大概也就花了一个多小时而已。实验3 数组、指针与函数实验内容1. 编写一个求任意多边形面积的程序。提示:通过界面输入数据,并把数据保存在一个二维数组或一个一维的自定义结构体类型的数组中,然后再进行计算。要求计算部分写成函数的形式,使计算程序与界面无关;设计思路:(1)、设计程序界面,并且给控件添加变量;(2)、进行字符串的分割;(3)、进行多边形面积的计算(注意两条边不组成多变形、内存的释放);(4)、调试运行界面设计:主要代码: void Cproject301Dlg:On

15、BnClickedOk()/ TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);int iline;/定义字符串的数量CString *pInput;/定义输入字符串指针pInput=SplitString(str_Input , 13 , iline);/13是Enter是二进制码 存储分割好的字符串if (iline=2)MessageBox(_T(多边形的边数不能少于三);return ;double *x=new double iline;double *y=new double iline;/定义存储X、Y的动态数组CString *strTMP=NULL;/

16、定义中间指针变量for (int i=0;iiline;i+)int n;strTMP=SplitString(pInputi , , , n);/分割开每一行的字符串xi=_tstof(strTMP1);/分别将输入的字符串以double的形式存储到xy数组中yi=_tstof(strTMP2);/把字符串转换为double型数据利用_tstof /释放内存if (strTMP!=NULL)delete strTMP;strTMP=NULL;/进行计算double p=0;for (int i=0;iiline;i+)p=fabs(p+0.5*(xi+1+xi)*(yi+1-yi);p=p+

17、0.5*(xiline+x0)*(y0-yiline);if (x!=NULL)delete x;x=NULL;if(y!=NULL)delete y;y=NULL;str_Result.Format(_T(%s%urn%srn%f),/.Format格式化输出 %s是字符串%u是整型rn换行%f是输出浮点型_T(多边形的边长数目:),iline,_T(多边形的面积:),p);UpdateData(FALSE);/OnOK();CString * Cproject301Dlg:SplitString(CString str, char split, int& iSubStrs)/分割字符串,分

18、隔符,返回的分隔的字符串数/void CSingleLevelingDlg:OnBnClickedBtncompute() int iPos = 0; /分割符位置 int iNums = 0; /分割符的总数 CString strTemp = str; CString strRight; /先计算子字符串的数量 while (iPos != -1) iPos = strTemp.Find(split);/找分隔符的位置 if (iPos = -1) break; strRight = strTemp.Mid(iPos + 1, str.GetLength();/Mid返回右边的字符串 st

19、rTemp = strRight; iNums+; if (iNums = 0) /没有找到分割符 /子字符串数就是字符串本身 iSubStrs = 1; return NULL; /子字符串数组 iSubStrs = iNums + 1; /子串的数量= 分割符数量+ 1 CString* pStrSplit; pStrSplit = new CStringiSubStrs; strTemp = str; CString strLeft; for (int i = 0; i iNums; i+) iPos = strTemp.Find(split); /左子串 strLeft = strTe

20、mp.Left(iPos); /右子串 strRight = strTemp.Mid(iPos + 1, strTemp.GetLength(); strTemp = strRight; pStrSpliti = strLeft; pStrSplitiNums = strTemp; return pStrSplit;运行结果:设计技巧:(1)、在有相同的计算方法的 时候尽量使用函数的形式再进行引用;(2)、在利用除法的时候(如1/2改用0.5这样避免出现不必要的麻烦);总结在C+编程中,我最害怕的一块就是数组与指针,而本次实验正是数组与指针的应用,害怕是无用的,我们能做的只是面对它。通过编写锻

21、炼,自己对数组和指针的含义有了更加深刻的了解,也基本掌握了数组与指针的应用。 实验4 类的创建1. 角度类的创建设计思路:根据实验要求,角度具有两个属性,即角度值的大小dValue和角度类型AngleStyle(包括DEG、DMS和RAD),重载“()”运算符,使其具有转换角度类型的功能,重载运算符“+”和“-”,使类的对象之间可以直接进行加减运算,并且返回同一类型角度(如DMS)。角度类完成以后,在主程序中随便写一些类的对象之间的运算,验证类的功能。界面设计:主界面很简单,只有“确定”和“取消”按钮,“确定”按钮执行主程序用于验证角度类的应用情况。主要代码:角度类头文件代码#pragma o

22、nceenum AngleStyleDEG,DMS,RAD;class CAnglepublic:CAngle(double value=0,AngleStyle style=DMS);CAngle(void);private:double dValue;/角度值AngleStyle nCurStyle;/当前角度值类型private:/设置常成员函数的作用:.类成员不会被改变/2.可以被常类变量调用double Deg(double dDms) const;double Dms(double dDeg) const;public:/获取指定的类型获取角度值, /由于返回的是dValue的引用

23、,所以该值大小可以改变,即可以进行赋值double& operator() (AngleStyle style);/重载,获取指定的类型获取角度值,该值不可改变,const CAngle类型变量调用double operator() (AngleStyle style) const;/重载运算符+/- friend CAngle operator + (const CAngle& m1,const CAngle& m2);friend CAngle operator - (const CAngle& m1,const CAngle& m2);角度类文件#include StdAfx.h#inc

24、lude Angle.h#include math.hconst double EPSILON=1.0E-12;const double PI=4.0*atan(1.0);/重载构造函数,有缺省值CAngle:CAngle(double value,AngleStyle style)dValue=value;nCurStyle=style;CAngle:CAngle(void)/重载()函数double& CAngle:operator() (AngleStyle style) /指定的类型获取角度值/double dAngleValue; if(style=DMS)if(nCurStyle=

25、DEG) dValue=Dms(dValue);else if(nCurStyle=RAD)dValue=Dms(dValue*180.0/PI);nCurStyle=DMS; else if(style=DEG) if(nCurStyle=DMS) dValue=Deg(dValue);else if(nCurStyle=RAD)dValue=dValue*180.0/PI; nCurStyle=DEG;else if(nCurStyle=DMS) dValue=Deg(dValue)*PI/180;else if(nCurStyle=DEG)dValue=dValue*PI/180; nC

26、urStyle=RAD;return dValue;/重载()函数,该函数是常函数,只能被常CAngle对象使用double CAngle:operator() (AngleStyle style) const /指定的类型获取角度值double dAngleValue; if(style=DMS)if(nCurStyle=DEG) dAngleValue=Dms(dValue);else if(nCurStyle=RAD)dAngleValue=Dms(dValue*180.0/PI);elsedAngleValue=dValue; else if(style=DEG) if(nCurSty

27、le=DMS) dAngleValue=Deg(dValue);else if(nCurStyle=RAD)dAngleValue=dValue*180.0/PI; elsedAngleValue=dValue;else if(nCurStyle=DMS) dAngleValue=Deg(dValue)*PI/180;else if(nCurStyle=DEG)dAngleValue=dValue*PI/180; elsedAngleValue=dValue;return dAngleValue;/私有成员,度分秒向十进制度转换double CAngle:Deg(double dDms) co

28、nstint iDeg,iMin;double dSec;iDeg = int(dDms + EPSILON);/度/加一个很小的数,以防止取整时的出错iMin = int(dDms - iDeg) * 100+ EPSILON);/分dSec = (dDms - iDeg) * 100 - iMin) * 100 ;/秒return iDeg + (double)iMin / 60 + dSec / 3600;/私有成员,十进制度向度分秒转换double CAngle:Dms(double dDeg) constint iDeg,iMin;double dSec;double dTmp;iD

29、eg = int(dDeg + EPSILON);/整数部分度dTmp = (dDeg - iDeg) * 60;/小数部分转换成分iMin = int(dTmp+ EPSILON);/取分的整数部分dSec = (dTmp - iMin) * 60;/截取秒return iDeg + (double)iMin / 100 + dSec / 10000;/友元重载+函数CAngle operator + (const CAngle& m1,const CAngle& m2) CAngle addAngle(0,RAD); addAngle(RAD)=m1(RAD)+m2(RAD); retur

30、n addAngle;/友元重载-函数CAngle operator - (const CAngle& m1,const CAngle& m2) CAngle subAngle(0,DMS); subAngle(DMS)=m1(DMS)-m2(DMS); return subAngle;主程序代码void CAngleClassDlg:OnBnClickedOk()/ TODO: 在此添加控件通知处理程序代码/定义类的对象a1,a2和a3,并用构造函数为a1,a2初始化CAngle a1(60.5623,DMS),a2(90.9325,DEG),a3;a3=a2+a1;/用重载后的加号完成对象

31、间的加法运算/调用OutputAngleBox函数显示结果OutputAngleBox(a1(DEG);OutputAngleBox(a3);double s;s=sin(a2(RAD);/用重载后的括号将a2转换为弧度形式并参与三角函数运算OutputAngleBox(s);void CAngleClassDlg:OnBnClickedCancel()/ TODO: 在此添加控件通知处理程序代码OnCancel();/用于显示结果的函数void CAngleClassDlg:OutputAngleBox(CAngle a)CString strOutput;CString strTmp; s

32、trTmp.Format(_T(%.5f ),a);strOutput+=strTmp;MessageBox(strOutput);void CAngleClassDlg:OutputBox(double a)CString strOutput;CString strTmp; strTmp.Format(_T(%.5f ),a);strOutput+=strTmp;MessageBox(strOutput);运行结果:a1转化为DEG类型显示结果如下 总结这次实验面临的主要问题是面向对象编程思想的建立,由于之前的实验都是面向过程进行程序设计,所以这种思想的建立有点困难。实验5 文件Cass 数

33、据文件进行数据整理的程序设计思路:首先定义一个测量点数据结构体,其元素包括:点号num,编码coding和X,Y,H;然后打开文件,利用Split函数分离数据并将测量点的数据值赋给点的结构体数组,通过比较点号的异同删除重复点,获得新的总点数,比较点号的大小并按点号大小的升序排列;最后将新排好的数据输出到另一个文本框中,并保存于文件中。 界面设计:由2个编辑框、2个Group Box控件和2个命令按钮组成。其中编辑框的属性列表为:IDMultilineWant Return添加变量名IDC_EDITOriDataTrueTruestrOriDataIDC_EDITTidyDataTrueTruestrTidyData主要代码:/定义测量点数据结构体#define

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁