版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验 1 Visual C+.Net环境和程序设计初步1. 掌握 VC+.net 语言的基本语法;2. 理解顺序结构、选择结构和循环结构程序设计的特点及应用;3. 掌握对基于对话框的 MFC 应用程序设计方法;4. 掌握一些简单算法。5. 编写一个方位角计算程序。提示:先使用反正切函数计算,然后利用坐标增量 的符号来判断所在的象限。设计思路:在按钮下面添加程序。X 丫同时大于 0 在第一象限,方位角等于 arctan(y/x);X0,Y0 在第二象限,方位角等于 arctan(y/x)+90; X0,Y0 在第三象限,方位角等于arctan(y/x)+180 ; X0 在第四象限,方位角等于
2、arctan(y/x)+270 ;主要代码:/ 0145110615 ymh 2.1Dlg.h :头文件protected:HICON m_hlco n;/生成的了消息映射函数virtual BOOL Onln itDialog();afx_msg void On SysComma nd(UINT nID, LPARAM lParam);afx_msg void On Pai nt();afx_msg HCURSOR On QueryDraglco n();DECLARE_MESSAGE_MAP()界面设计:public:double x;double y;double Q;afx_msg v
3、oid OnBn ClickedOk();afx_msg void OnBn ClickedCa ncel();afx_msg void OnBn ClickedButto n1();double A;/ 0145110615 ymh 2.1Dlg.cpp :实现文件#in clude stdafx.h#i nclude 0145110615 ymh 2.1.h#i nclude 0145110615 ymh 2.1Dlg.h#in clude #ifdef _DEBUG#defi ne new DEBUG_NEW#en difvoid CMy0145110615ymh21Dlg:O nBn
4、ClickedOk() 计算/ TODO:在此添加控件通知处理程序代码UpdateData(TRUE);if(x0)if(y0)Q=1;A=ata n(y /x);/x大于 y 大于在第一象限elseQ=4;A=ata n(y /x)+270;/x大于 y 小于在第四象限else if(y0)Q=2;A=ata n(y /x)+90;/x大于 y 小于在第二象限elseQ=3;A=ata n(y /x)+180;/x小于 y 小于在第三象限UpdateData(FALSE);/On OK();void CMy0145110615ymh21Dlg:O nBn ClickedCa ncel() 清
5、除/ TODO:在此添加控件通知处理程序代码UpdateData(true);x=0;y=o;Q=o;A=0;UpdateData(false);void CMy0145110615ymh21Dlg:0 nBn ClickedButto n1() 退出/ TODO:在此添加控件通知处理程序代码OnCan cel();运行结果:坐标10象眼4方位角269,21460计尊淸除退出第一次做这个实验的时候真的觉得挺难得可是当我经过更难的实验的洗礼之后在返 回来看它真是顿时亲切了许多,其实当时是对这个软件不了解简单的东西把它想得很复 杂绕来绕去都不知道该怎么实现一些很简单的东西了。实验 2.2 .设计同
6、一参考椭球下的三维地心坐标(笛卡儿坐标系)与大地坐标系转换的 程序。曲0145110615 ymh 2.1(提示:用 dowhile 迭代,B H 初始为 0 进行迭代,直到 H 的精度达到 0.00001 米)注意:东经 0180( Y0),西经:0-180(丫0)式中,B、L、H 为椭球面上的大地纬度、大地经度、大地高;X、丫 Z 为空间直角坐标;N 为卯酉圈曲率半径,e 为椭球的偏心率,a 为椭球的长半径,b 为椭球的短半径。(WGS84 椭球参数:长半径 a=6378137m 扁率a=1/298.257223563 )界面设J _E 0145110615 ymh 2.2主要代码:/ 0
7、145110615 ymh 2.2Dlg.h :头文件protected:HICON m_hlco n;/生成的消息映射函数virtual BOOL Onln itDialog();afx_msg void On SysComma nd(UINT nID, LPARAM lParam);afx_msg void On Pai nt();afx_msg HCURSOR On QueryDragIco n();设计思路:在按钮下面设置主程序,按照指导书给的思路编辑公式大地坐标空间直角坐标示例煽辑框示例犒辑框示例编辑框示例漏辑框示版扁辑框退出计:DECLARE_MESSAGE_MAP()public
8、:double B;double L;double H;double X;double Y;double Z;afx_msg void OnBn ClickedOk();/ 0145110615 ymh 2.2Dlg.cpp :实现文件#in clude stdafx.h#i nclude 0145110615 ymh 2.2.h#i nclude 0145110615 ymh 2.2Dlg.h#in clude #ifdef _DEBUG#defi ne new DEBUG_NEW#en difvoid CMy0145110615ymh22Dlg:O nBn ClickedOk() 大地坐标
9、转换为空间直角坐标 / TODO:在此添加控件通知处理程序代码UpdateData(true);double r=1/298.257223563;double e=sqrt(2*r)-(r*r);int a=6378137;double W=sqrt(1-e*e*s in (B)*s in (B);double N=a/W;X=(N+H)*cos(B)*cos(L);Y=(N+H)*cos(B)*cos(L);Z=(N*(1-e*e)+H)*si n( B);UpdateData(false);/OnOK();运行结果:实验 2.3 .编写一个后方交会计算程序。3.1 基本原理及计算公式若将
10、Pa、Pb Pc 看成权,则 P 点的坐标即为三个已知点的加权平均值3.2 计算程序设计步骤(1)设计界面, 用于输入 3 个已知点旳朋栋和一个址测加、和。 以歧匚 于输出待定点坐标的文本框(12个)、静态标签框和 Butt on 按钮;(2)定义文本框控件变量(Value);(3)根据已知点计算三个内角 A、B、C;(4)计算 Tan( Q)、Tan(B)、Tan(丫)、Ta n(A)、Tan (B)、Tan(C);(5)计算 Pa、Pb、Pc;(6)计算待定点坐标 Xp、Ypo界面要求:三个坐标输入框,两个角度输入框HOIZ 2599536. 251204一个坐标结果输出框一个计算按钮,一
11、个清除按钮,一个退出按钮2.由三角形三个边长求内角函数 计算公式:设计思路:通过示例编辑框添加变量,在按钮下面添加程序。先将a、B、的度分秒 之转换成度利用三角形内角和等于 180 算出丫并将丫转换成弧度。接着计算三角形的内 角,判断 P 点是否在危险圆上若不在则计算 P 点坐标若在则弹出“该点在危险圆上”。 界面设计:_fc ds?2-3未知卓坐标xp=示例扁辑框Yp=示例骗辑框计算主要代码:protected:HICON m_hlco n;/生成的消息映射函数virtual BOOL Onln itDialog();afx_msg void On SysComma nd(UINT nID,
12、 LPARAM lParam);afx_msg void On Pai nt();afx_msg HCURSOR On QueryDragIco n();DECLARE_MESSAGE_MAP()A点坐标B点坐标XB-示例编辑僚坐标示弱购曷辑框YA=示例编辑框YB=示例编辑框O示例编辑框0=示例骗辑框p=示框退岀public:afx_msg void OnEn Cha ngeEdit5();double XA;double YA;double XB;double YB;double XC;double YC;double alfa;double bet;double Xp;double Yp;
13、afx_msg void OnBn ClickedButto n1();afx_msg void OnBn ClickedOk(); 一#in elude stdafx.h#i nclude dss2-3.h#i nclude dss2-3Dlg.h#in clude con st double Pl=3.1415926535897932;#ifdef _DEBUG#defi ne new DEBUG_NEW#en difvoid Cdss23Dlg:O nBn ClickedButto n1()/ TODO:在此添加控件通知处理程序代码UpdateData(TRUE);double afAB
14、,afAC,afBC,afBA,afCA,afCB,A,B,C,Pa,Pb,Pc; int D1,M1,D2,M2;double S1,S2,alfa1,bet1,gama1,alfa2,bet2,gama2;/将 alfa 转换成度D 仁 in t(alfa);M1=i nt(alfa-D1)*100);S1=(alfa-D1)*100-M1)*100;alfa 仁 D1+M1/60+S1/3600;alfa2=alfa1*PI/180;/将 bet 转换成度D2=i nt(bet);M2=i nt(bet-D2)*100);S2=(bet-D2)*100-M2)*100;bet 仁 D2+
15、M2/60+S2/3600; bet2=bet*PI/180;/计算 gama 的值gama1=180-bet1-alfa1;gama2=gama1*PI/180;将 gama 的值转换成弧度 /计算已知点的三个内角afAB=ata n(YB-YA)/(XB-XA);afAC=ata n(YC-YA)/(XC-XA);afBA=ata n( YA-YB)/(XA-XB);afBC=ata n(YC-YB)/(XC-XB);afCA=ata n( YA-YC)/(XA-XC);afCB=ata n(YB-YC)/(XB-XC);A=afAB-afAC;B=afBC-afBA;C=afCA-afC
16、B;/判断点是否在危险圆上若不在则计算 P 点坐标if(alfa+bet+C190)Pa=(ta n(alfa2)*ta n( A)/(ta n(alfa2)-ta n( A);Pb=(ta n( bet2)*ta n(B)/(ta n(be t2)-ta n(B);Pc=(ta n( gama2)*ta n(C)/(ta n( gama2)-ta n(C);Xp=(XA*Pa+XB*Pb+XC*Pc)/(Pa+Pb+Pc); Yp=(YA*Pa+YB*Pb+YC*Pc)/(Pa+Pb+Pc);else/若在则弹出 该点位于危险圆上”MessageBox(_T(”该点位于危险圆上);Updat
17、eData(FALSE);/OnCan cel();void Cdss23Dlg:O nBn ClickedOk()/ TODO:在此添加控件通知处理程序代码UpdateData(TRUE);XA=0;YA=0;XB=0;YB=0;XC=0;YC=0;alfa=0;bet=0;Xp=0;Yp=0;UpdateData(FALSE);/On OK();;运行结果:本次实验刚开始还是遇到了很多问题的比如说根本不就不知道该如何用程序来实现后 方交会这个过程,后来经过问同学、上网查资料等大概弄懂了实现步骤可是写完程序后 我发现他根本计算不了点计算按按钮一点反应都没有。又开始找问题才发现是 Update
18、Data( FALSE 和 UpdateData(TRUE 忘写了,还发现程序中没有进行度分秒到 度的转换,就顺便把这个实现也加进去了。这个程序也就算完成了。实验三数组、指针与函数、实验目的掌握数组的定义、引用及应用方法。10掌握指针与动态数组。掌握函数的定义、引用及应用方法。二、实验内容1.编写一个求任意多边形面积的程序。提示:通过界面输入数据,并把数据保存 在一个二维数组或一个一维的自定义结构体类型的数组中,然后再进行计算。要 求计算部分写成函数的形式,使计算程序与界面无关。动态数组创建动态数组结构体的定义多边形面积计算原理及算法计算原理: 面积计算的算法: 提示:显示框用 Cedit 控
19、件变量对每个输入的坐标用 CString str 临时变量格式化,然后用 CEdit 的控件变量插入 设计思路:将实现写在按钮在下面。添加顶点下面实现创建动态数组,确认按钮实现返 回数组大小值并将添加的数据显示到显示框中去,通过计算按钮实现多边形面积的计 算,清除按钮实现清除输入的数据,退出按钮退出程序。主要代 码: 实 现11protected:界面设计:HICON m_hlco n;/生成的消息映射函数virtual BOOL Onln itDialog();afx_msg void On SysComma nd(UINT nID, LPARAM lParam);afx_msg void
20、On Pai nt();afx_msg HCURSOR On QueryDragIco n();DECLARE_MESSAGE_MAP()public:double x;double y;double result;CEdit edit;afx_msg void OnBn ClickedButto n4();afx_msg void OnBn ClickedButto n3();afx_msg void OnBn ClickedButto n2();afx_msg void OnBn ClickedButto n1();afx_msg void OnBn ClickedButto n5();i
21、nt n;double *px;double *py;CEdit m_strdis; 一#in clude stdafx.h#i nclude 0145110615(3).h#i nclude 0145110615(3)Dlg.h#ifdef _DEBUG#defi ne new DEBUG_NEW#en dif/用于应用程序关于”菜单项的 CAboutDlg 对话框double calarea(double x,double y,i nt n)double s=0;int i;for(i=0;i n)MessageBox(_T(Warni ng!);str.Format(_T(No.%d %
22、 lf %lf rn),t,x,y);13m_strdis.ReplaceSel(str);pxt-1=x;pyt-i=y;UpdateData(FALSE);void CMy01451105173Dlg:0 nBn ClickedButto n5()/ TODO:在此添加控件通知处理程序代码exit(0);运行结果总结:这个实验相比前面几个实验感觉难了好多。首先是不知道怎么实现动态数组也不知 道怎样将输入的内容显示到示例编辑框里。总之在眼前的都是一堆问题,但面临的问题 总得解决所以就只能看书、上网查资料、问同学等各种方法来解决问题,最终把问题解 决。实验四类的创建、实验目的 1.掌握面向对象
23、编程基本思想142.掌握 VC+.net 中创建类3.掌握建立和使用对象4.掌握运算符号重载5.理解类的继承和多态性二、实验内容1.设计一个角度类。 要求该类具有度分秒至度的换算、 度至度分秒的换算、 度与 弧度的换算等功能。 提示:设置一个角度大小属性,并设定该属性为缺省属性; 另设一个状态属性,表示当前设置的角度大小的形式;度分秒、度、弧度间的相 互转换的方法;定义运算符号(加、减)方法,使得角度类能够像一种普通的数 据类型样的方便使用。设计思路:设计一个角度类在类的头文件里申明度到度分秒的转换、 度分秒到度的转换、 度到弧度的转换、运算符的重载,在类的.cpp 文件中写出具体的函数实现,
24、在按钮下面 调用类的各个函数来实现角度的转换。界面设清除1-I计:15主要代码:DECLARE_MESSAGE_MAP()public:double dmstodgree(double dmg);声明度分秒到度的转换函数double dgreetodms(double drgree);/声明度到度分秒的转换函数double dgreetohd(double dgree);/声明度到弧度的转换函数;DECLARE_MESSAGE_MAP()public:afx_msg void OnBn ClickedCa ncel();double dgree;double dms;double hd;afx
25、_msg void OnBn ClickedButto n1();afx_msg void OnBn ClickedButto n2();afx_msg void OnBn ClickedButto n3();afx_msg void OnBn ClickedOk(); 一void Cymh4Dlg:O nBn ClickedCa ncel()/ TODO:在此添加控件通知处理程序代码OnCan cel();void Cymh4Dlg:O nBn ClickedButto n1()/ TODO:在此添加控件通知处理程序代码UpdateData(true);An gle sf;sf.dgreet
26、odms(dgree);UpdateData(false);16void Cymh4Dlg:O nBn ClickedButto n2()/ TODO:在此添加控件通知处理程序代码UpdateData(true);An gle sf;sf.dmstodgree(dms);UpdateData(false);void Cymh4Dlg:O nBn ClickedButto n3()/ TODO:在此添加控件通知处理程序代码UpdateData(true);An gle sf;sf.dgreetohd(dgree);UpdateData(false);void Cymh4Dlg:O nBn Cli
27、ckedOk()/ TODO:在此添加控件通知处理程序代码 /On OK();UpdateData(true);dgree=0;dms=0;hd=0;UpdateData(false);运行结果:这个实验调试最终没有通过所以没有结果这个实验给我的最大的感受是细节决定成败,实践总会比想象的困难,虽然我非常清 除实验原理可是但我按照我的思路去写的时候各种调试改还是有错,我不清楚为什么 An gle sf;sf.dgreetodms(dgree);这样的语句在程序七中调试能通过而这个程序中却死活不行实验五文件一、 实验目的掌握文件对话框的使用方法。掌握 C+文件操作的一般步骤及实现方法。 了解 MF
28、C 文件操作的特点及使用方法。二、 实验内容1.编制简单的 Cass 数据文件进行数据整理的程序。整理后的数据文件中要求无 重复点数据,且数据按点号大小的升序进行排序。要求整理后的数据按与原始数 据文件同样的格式保存为另外一个文件示例数据“民用园燃气.dat ”文件数据格式:总点数点号,编码,X,Y,H例如:要求:a. 用 SaveFileDialog 和 OpenFileDialog 控件获取文件打开或保存的文件名。b. 自定义一个测量点数据结构体,其元素包括:点号,编码,X,Y,Hc. 用文本框显示原始数据和整理后的数据d. .按编程规范进行编码a.读数据、保存数据、判断一个点数据是否已经
29、存在、排序、在文本框中 显示文件内容等可以分别定义成一个子过程或函数。c.编程技巧打开文件获得总点数根据点数调整数组的大逐行读取数据,判断该点是否已经存在数组中,若不存在,则把该数据存放在数组中根据删除重复点后的总点数,重新调整数组大小按点号大小的升序排序按原数据格式输出到另外一个文件设计思路:在按钮下面设置主程序。通过打开文件按钮将原文件打开并显示到示例编辑 框内,通过保存文件按钮实现对文件分行、删除重复点、排序、保存更改后的文件并把 它显示到示例编辑框中等操作。18界面设3 0145110517(5.x)S3计:主要代码:实现protected:HICON m_hlco n;原始数捐打开原
30、始数据19整理后数据示例编辑框保存整理后的数据/生成的消息映射函数virtual BOOL Onln itDialog();afx_msg void On SysComma nd(UINT nID, LPARAM IParam);afx_msg void On Pai nt();afx_msg HCURSOR On QueryDragIco n();DECLARE_MESSAGE_MAP()public:afx_msg void OnBn ClickedOk();afx_msg void OnBn ClickedCa ncel();CStri ng yua nshi;CStri ng xiug
31、ai;CStri ng *CMy0145110615ymh5Dlg:Splitstri ng(CStri ng str,char split,i nt&isubstr);/ 0145110615 ymh 5Dlg.cpp :实现文件#in clude stdafx.h#i nclude 0145110615 ymh 5.h#in clude 0145110615 ymh 5Dlg.h#in clude #i nclude #ifdef _DEBUG#defi ne new DEBUG_NEW#en dif/定义结构体里面的数据类型包括点号、编码、X、丫、Hstruct Poi ntin
32、t nu mber;CStri ng coder;double X;double Y;double H;CStri ng*CMy0145110615ymh5Dlg:Splitstri ng(CStri ngstr,charsplit,i nt& substr)/ 分割函数int M=0;/ 分割位置int N=0;/ 分割符的总数CStri ng strLeft=str;CStri ng strRight;/定义两个字符串变量/计算字符串的总数while(M!=-1)M=strLeft.Find(split);/查找分割位置并赋给 MstrRight=strLeft.Mid(M+1,s
33、tr.GetLe ngth();把字符串位置和长度信息赋给 strRight 字符串20strLeft=strRight;N+;字符串总数加一 if(N=O)如果分割符的总数为字符串数就是字符串本身isubstr=1;return NULL;isubstr=N+1;字符串数等于分割符数加CStri ng* pStrSlipt;/创建字符串指针pStrSlipt=new CStri ngisubstr;创建字符串数组strLeft=str;CStri ng strLeftss;for(i nt i=0;iN;i+)M=strLeft.Fi nd(split);strLeftss=strLeft
34、丄 eft(M);strRight=strLeft.Mid(M+1,strLeft.GetLe ngth();把字符串位置和长度信息赋给 strRight 字符串strLeft=strRight; pStrSlipti=strLeftss;pStrSliptN=strLeft;return pStrSlipt;void CMy0145110615ymh5Dlg:0 nBn ClickedOk()/ TODO:在此添加控件通知处理程序代码/On OK();UpdateData(true);CFileDialog dlgFile(TRUE,_T(txt),NULL, OFN_ALLOWMULTIS
35、ELECT|OFN_EXPLORER 文本文件)|*txt);仓 U 建打开文件的对话框if(dlgFile.DoModal()=IDCANCEL)return;如果选择取消按钮则返回CStri ng strFileName=dlgFile.GetPathName();获取打开文件文件全名(含全路径)setlocale(LC_ALL,);/设置语言环境CStdioFile sf;/ 设置文件对象if(!sf.Ope n(strFileName,CFile:modeRead)return;如果没有打开文件则返回CString strLine;定义 CString 变量yua nshi.Empty
36、();文件和显示框建立联系BOOL bEOF=sf.ReadString(strLine);把文件中读取的行之赋给变量 bEOFwhile(bEOF)21yua nshi+=strL ine; bEOF=sf.ReadStri ng(strLi ne); if(bEOF)yua nshi+=_T(n); 判断文件是否结束 sf.Close();关闭文件UpdateData(false); void CMyO14511O615ymh5Dlg:O nBn ClickedCa ncel() / TODO:在此添加控件通知处理程序代码UpdateData(true);CFileDialog dlgFi
37、le(FALSE,_T(dat),NULL,OFN_ALLOWMULTISELECT|OFN_EXPLORE 文本文件)|*dat);仓 U 建保存文件的对话框int TotalPoi nt;总点数CStri ng *strTmp=NULL; 定义字符串数组并初始化 TotalPoi nt=_ttoi(pstrLi ne0); 第一行为总点数if(TotalPoi nt!=aLi ne-1) MessageBox(_T(数据有误);Poi nt *pPoi nt=new Poi ntTotalPoi nt;创建大小为总点数的结构体数组int n;/用 Split 函数将文件逐行分离,给点结构体
38、赋值for(i nt i=0;iTotalPoi nt;i+)strTmp=Splitstri ng(pstrLi nei+1, ,n);/分离的行逐行存入字符串数组中pPoi nti. number=_ttoi(strTmp0);依次给结构体里的元素赋值pPo in ti.coder=strTmp1;pPoi nti.X=_tstof(strTmp2);pPoi nti.Y=_tstof(strTmp3);pPoi nti.H=_tstof(strTmp4);22if(strTmp!=NULL)赋值完毕时释放字符串数组的空间delete strTmp; strTmp=NULL;if(dlgF
39、ile.DoModal()=IDCANCEL)return;CStri ng strFileName=dlgFile.GetPathName(); 径)setlocale(LC_ALL,); 设置语言环境CStdioFile sf;设置文件对象if(!sf.Ope n(strFileName,CFile:modeRead)return;sf.WriteStri ng(yua nshi);/调用文件的写函数sf.Close();int aLi ne;定义行变量CStri ng *pstrLi ne=Splitstri ng(yua nshi,n,aLi ne); 存入字符串数组中如果选择取消按钮
40、则返回获取保存文件的文件全名(含路如果没有保存文件则返回将文件进行分行并以此/判断是否有相同的点号若有则删除点号相同的点for(i nt i=0;iTotalPoi nt;i+)for(i nt j=i+1;jTotalPoi nt;j+)if(pPoi nti. nu mber=pPoi ntj. nu mber)delete pPoi nt;/删除了点后改变结构体数组的大小并重新对其赋值for(i nt m=j;mTotalPoi nt-1;m+)pPoi ntm=pPoi ntm+1;TotalPoi nt-;/按点号的生序排列for(i nt i=0;iTotalPoi nt;i+)f
41、or(i nt j=i+1;jpPoi ntj. nu mber)t=pPo in ti. nu mber;pPo in tj. nu mber=t;pPo in ti. nu mber=pPo in tj. nu mber;/输出调整后的文件xiugai.Format(_T(%drn),TotalPoi nt);第一行输出点的总数CStri ng strOutPut;/定义字符串变量for(i nt i=0;iTotalPoi nt;i+)strOutPut.Format(_T(%d,%s,%lf,%lf,%lf),pPoi nti. number,pPoi nti.code r,pPoi
42、nti.X,pPointi.Y,pPoi nti.H);xiugai=xiugai+strOutPut;/将第一行和其他所有行合并CString strLine;定义 CString 变量xiugai.Empty();文件和显示框建立联系23BOOL bEOF=sf.ReadStri ng(strLi ne);把文件中读取的行之赋给变量while(bEOF)xiugai+=strL ine;bEOF=sf.ReadStri ng(strLi ne);if(bEOF)yua nshi+=_T(n);sf.Close();关闭文件UpdateData(false);/OnCancel();总结:这
43、次实 验的主要问题是遇到主要问题是程序调试花了很多事间。因为要完完整整的自己写出一个程序对 我来说还是有难度的,所以我不得不照着书上和网上的一些写法来写的所以有一些语句 不是特别清楚,所以调试的时候很多错误都觉得很奇怪。尽管如此还是花了很多时间先 把程序的构架和一些语句弄懂了最终才把问题解决实验六图形程序设计一、 实验目的掌握 VC+.net 坐标系和各项设置方法。掌握 GDI 绘图方法。理解交互式图形程序设计二、 实验内容1.下列数据为一变形监测点的 24 期位移监测结果(分别为 X,Y,H),编制程序绘24bEOF判断文件是否结束运行结果:启改殳结构体藪组的大小并翅对其制出该点的变形曲线图
44、,每个方向一个位移序列图。设计思路:用类 DeformationCurve 实现原始文件的读入、文件的拆分、画图等功能,调用类的相关函数来实现相应的功能。界面设计:因为是基于当文本的所以没有界面主要代码:class Deformatio nCurve : public CWndDECLARE_DYNAMIC(Deformatio nCurve)public:Deformatio nCurve();virtual Deformati on Curve();protected:DECLARE_MESSAGE_MAP()public:CStri ng*Deformatio nCurve:Splits
45、tri ng(CStri ngstr,char split, int&isubstr);void Deformatio nCurve:ReadData(double *&X,double *&Y,double *&H);void Deformatio nCurve:Draw(CDC* pDC,CRect & rect);/ Deformatio nCurve.cpp :实现文件#in clude stdafx.h#i nclude 0145110615 ymh 6.h#in clude Deformatio nCurve.h#in clude CStri
46、ng *DeformationCurve:Splitstring(CStringstr,char split,int&isubstr)/分割函数int M=0;/ 分割位置int N=0;/ 分割符的总数CStri ng strLeft=str;CStri ng strRight;/定义两个字符串变量/计算字符串的总数while(M!=-1)M=strLeft.Find(split);/查找分割位置并赋给 MstrRight=strLeft.Mid(M+1,str.GetLe ngth();把字符串位置和长度信息赋给 strRight 字符串strLeft=strRight;N+;/字
47、符串总数加一if(N=0)/如果分割符的总数为字符串数就是字符串本身isubstr=1;return NULL;25isubstr=N+1; 字符串数等于分割符数加CStri ng* pStrSlipt;/创建字符串指针pStrSlipt=new CStri ngisubstr;创建字符串数组strLeft=str;CStri ng strLeftss;for(i nt i=0;iN;i+)M=strLeft.Fi nd(split);strLeftss=strLeft 丄 eft(M);strRight=strLeft.Mid(M+1,strLeft.GetLe ngth();把字符串位置和
48、长度信息赋给 strRight 字符串strLeft=strRight; pStrSlipti=strLeftss;pStrSliptN=strLeft;return pStrSlipt;void Deformatio nCurve:ReadData(double *&X,double *&Y,double *&H)/读取原始文件中的数据CFileDialog dlgFile(TRUE,_T(txt),NULL, OFN_ALLOWMULTISELECT|OFN_EXPLORER 文本文件)|*txt);仓U建打开文件的对话框if(dlgFile.DoModal()=I
49、DCANCEL)return;如果选择取消按钮则返回CStri ng strFileName=dlgFile.GetPathName();获取打开文件文件全名(含全路径)setlocale(LC_ALL,);设置语言环境CStdioFile sf;/ 设置文件对象if(!sf.Ope n(strFileName,CFile:modeRead)return;如果没有打开文件则返回CStri ng str;CStri ng strLi ne;str.Empty();文件和显示框建立联系BOOL bEOF=sf.ReadString(strLine);把文件中读取的行之赋给变量 bEOFwhile(
50、bEOF)str+=strLi ne;bEOF=sf.ReadStri ng(strLi ne);if(bEOF)st 叶=_T(n);判断文件是否结束sf.Close();/ 关闭文件int aLi ne;定义行变量CStri ng *pstrLi ne=Splitstri ng(str,n,aLi ne);将文件进行分行并以此存入字符串数组中if(aL in e2)26MessageBox(_T(”数据不完整); return;CStri ng *strTmp=NULL; 定义字符串数组并初始化int TotalPoi nt=_ttoi(pstrLi ne0);第一行为总点数/建立三个大小
51、为总点数的数组int n;X= new doubleTotalPoi nt;Y= new doubleTotalPoi nt;H= new doubleTotalPo in t;/间原始数据逐行、三个方向分离for(i nt i=1;iSelectObject(&pe n);pDC-Recta ngle(rect);int dOrgX,dOrgY;int dEn dX,dE ndY;dOrgX=rect.left+i nt(0.2*rect.Width();dOrgY=rect.bottom-i nt(0.2*rect.Height();dEn dX=rect.right-i nt(0
52、.1*rect.Width();dEn dY=rect.top+i nt(0.2*rect.Height();pDC-MoveTo(rect.left,rect.top+dOrgY);pDC-Li neTo(rect.right,rect.top+dOrgY);绘制 X 轴pDC-MoveTo(rect.left+dOrgX,rect.bottom);pDC-Li neTo(rect.left+dOrgX,rect.top);绘制 Y 轴int dx,dy;/定义两个变量用来表是 X 轴和 Y 轴的间隔dy=(dOrgY-dEndY)/3;/Y 轴的间隔为 dx=(dOrgX-dEndX)/2
53、4;/X 轴的间隔为/绘制水平线for(i nt i=0;iMoveTo(dOrgX,dE ndY+i*dy); pDC-Li neTo(dE ndX,dE ndY+i*dy);pDC-SelectObject(pOldPe n);画笔回到原点LOGFONT lf;/定义变量memset(&l f,0,sizeof(LOGFONT);lf.lfHeight=16;_tcs ncpy_s(lf.lfFaceName, LF_FACESIZE, _T( 宋体),4);CFo nt font;/创建字体fon t.CreateFo ntl ndirectW(&lf);CFont*pO
54、ldFont=pDC-SelectObject(&font);/创建 CFont 指针指向 fontCStri ng str;/绘制时间刻度for(i nt i=1;iMoveTo(dx*i+dOrgX,dOrgY);pDC-Li neTo(dx*i+dOrgX,dOrgY - 5);str.Format(_T(%d),i);if(i!=0) pDC-TextOutW(dx*i+dOrgX, dOrgY + 10,str);pDC-TextOut(dOrgX+400,dOrgY+30,_T(时间);/ 确定 X 轴和 Y 轴的间隔分别是和 个单位pDC-TextOut(dOrgX+30
55、0,dEndY-50,_T(蓝:X 方向绿:Y 方向红:H 方向);pDC-SelectObject(pOldFo nt);画笔回到原来的位置font.DeleteObject();/删除 font 的对象/绘制坐标 X、Y、H 的刻度CFont fon tA;/ 创建坐标字体fon tA.CreateFo ntln directW( &lf);pOldFo nt=pDC-SelectObject(&fon tA);pDC-TextOut(dOrgX-60,dE ndY-30,_T(X),1);绘制 X 轴的刻度pDC-TextOut(dOrgX-120,dE ndY-30,_
56、T(Y),1);绘制 Ytt的刻度pDC-TextOutW(dOrgX-180,dEndY-30,_T(H),1);绘制诽由的刻度pDC-SelectObject(pOldFo nt);for(i nt i=0;iTextOutW(dOrgX-60,dE ndY+i*dy,str);for(i nt i=0;iTextOutW(dOrgX-120,dE ndY+i*dy,str);for(i nt i=0;iTextOutW(dOrgX=180,dE ndY+i*dy,str);fon tA.DeleteObject();/调用函数读取数据,获得变形数据double *X=NULL;doubl
57、e *Y=NULL;double *H=NULL;ReadData(X,Y,H);/ 创建蓝色画笔CPen pen Blue;pe nBlue.CreatePe n(PS_SOLID,2,RGB(0,0,255);pDC-SelectObject(pe nBlue);POINT ptX256;定义结构体变量/实际坐标与屏幕坐标的转换for(i nt i=0;iPolyli ne(ptX,24);绘制 X 方向的变形曲线/回复原来绘图属性pDC-SelectObject(pOldPe n);pen Blue.DeleteObject();/创建绿色画笔绘制丫方向变形曲线CPen pen Gree
58、 n;pe nGree n.CreatePe n(PS_SOLID,2,RGB(0,255,0);pDC-SelectObject(pe nGree n);POINT ptY256;for(i nt i=0;iPolyli ne(ptY,24);/回复原来的绘图属性pDC-SelectObject(pOldPe n);pen Gree n.DeleteObject();/创建红色画笔绘制 H 方向的变形曲线CPen pen Red;29pe nRed.CreatePe n(PS_SOLID,2,RGB(255,0,0); pDC-SelectObject(pe nRed);POINT ptH2
59、56;for(int i=0;iPolyli ne(ptH,24);/恢复原来绘图属性pDC-SelectObject(pOldPe n);pen Red.CreateObject();运行结这次实验也遇到了实验五同样的问题调试的时间也花了好多,但有了之前实验五的经验做起来稍稍好一些,不过程序运行出来之后我发现前面的折线有三条而后面却只有一 条并且老师给的示例里面也只有一条线。我也不清楚我哪儿弄错了总之改了好多地方还 是这样。每次做完实验我都只想感叹自己的 C+基础是在是太差了很多东西别人轻而易举就弄 出来了而我就是要在哪儿捣鼓好久,效率超级低人家实验八都已近快完成了可我还还停 留在实验六里不
60、停地出错不停的改错, 一次一次的重复着有的时候真的很烦很想放弃可 是想想老师考试会很难的样子,万一挂了就麻烦了还是硬着头皮往下做,最终还是做出 来了。所以还是不能随随便便放弃。30实验七常用测量程序设计一、 实验目的巩固类的创建与使用掌握数组参数的传递掌握常用测绘程序设计的技巧二、 实验内容编写高斯投影正、反算程序设计思路:设计了一个 Transformation 类这个类实现度分秒换成度、度换成度分秒、定义各类坐标的坐标参数、计算 S 计算 Bf、正算和反算的功能。变量从示例编辑框中添加,在按钮下面调用类的各种函数来实现坐标的转换。 界面设|JJLE 0145110615 ymh 7S3计:蠢考坐标系Spktl当地中央子午线经度示例编辑框大地坐祐B-示例编辑框示例骗辑框L.=示例编辑框Y=示例编辑框正算退出31主要代码:#pragma on
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论