测量平差编程_第1页
测量平差编程_第2页
测量平差编程_第3页
测量平差编程_第4页
测量平差编程_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、误差理论与测量平差上机指导书辽宁工程技术大学测绘与地理科学学院 测绘工程系目录Visual C+ 6.0开发平台简介1MFC概述1实验1 矩阵加法与乘法运算3实验2 矩阵转置与求逆运算6实验3 误差椭圆元素计算13实验4 水准网间接平差程序设计15Visual C+ 6.0开发平台简介Visual C+提供了一个支持可视化编程的集成开发环境:Visual Studio(又名Developer Studio)。Developer Studio是一个通用的应用程序集成开发环境,它不仅支持Visual C+,还支持Visual Basic,Visual J+,Visual InterDev等Micr

2、osoft系列开发工具。Developer Studio包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。使用Developer Studio,可以完成创建、调试、修改应用程序等的各种操作。Developer Studio采用标准的多窗口Windows用户界面,并增加了一些新特性,使得开发环境更易于使用,用户很容易学会它的使用方法。由于Developer Studio是一个可视化的开发工具,在介绍Developer Studio的各个组成部分之前,首先了解一下可视化编程的概念。可视化技术是当前发展迅速并引人注目的技术之一,它的特点是把

3、原来抽象的数字、表格、功能逻辑等用直观的图形、图象的形式表现出来。可视化编程是它的重要应用之一。所谓可视化编程,就是指:在软件开发过程中,用直观的具有一定含义的图标按钮、图形化的对象取代原来手工的抽象的编辑、运行、浏览操作,软件开发过程表现为鼠标点击按钮和拖放图形化的对象以及指定对象的属性、行为的过程。这种可视化的编程方法易学易用,而且大大提高了工作效率。Visual C+的集成开发环境Developer Studio提供了大量的实用工具以支持可视化编程特性,它们包括:项目工作区、ClassWizard、AppWizard、WizardBar、Component Gallery等。MFC概述M

4、FC是一个编程框架。MFC (Microsoft Foundation Class Library) 中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代

5、码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。 1 封装 构成MFC框架的是MFC类库。MFC类库是C+类库。这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等。 2 继承 首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中,最重要的类是CObject和CCmdTarget。CObject是MFC的根类,绝大多数MFC类是其派生的,包括CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从

6、CObject派生的类都将具备或者可以具备CObject所拥有的特性。CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。MFC中,任何可以处理消息的类都从CCmdTarget派生。 针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是CwinThread;文档对象,基类是Cdocument,等等。程序员将结合自己的实际,从适当的MFC类中派生出自己的类,实现特定的功能,达到自己的编程目的。 3 虚拟函数和动态约束 MFC以“C+”为基础,自然支持虚拟函数

7、和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。例如,CWnd封装 Windows窗口对象时,每一条Windows消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。 这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口。程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。MFC编程框架将在适当的时候、适当的地方来调用程序的

8、代码。4 MFC的宏观框架体系 如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等等。这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。为了支持对应用程序概念的封装,MFC内部必须作大量的工作。例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。

9、又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。 总之,MFC封装了Win32 API,OLE API,ODBC API等底层函数的功能,并提供更高一层的接口,简化了Windows编程。同时,MFC支持对底层API的直接调用。MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程

10、序员的代码;或者调用程序员的代码来处理应用程序特定的事件。MFC是C+类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C+对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。 实验1 矩阵加法与乘法运算一、 实验名称:矩阵加法与乘法运算。二、 实验目的和任务:掌握矩阵加法与乘法通用程序的编写。三、 实验要求:1 每人独立编写出矩阵加法与乘法的程序,并上机调试通过;2 采用VC+6.0开发平台,C或者C+语言编写程序;3 写出矩阵运算的结果。四、 实验内容:1 矩阵加法的示例

11、函数(C语言)void JZjiafa(double a1515,double b1515,double c1515,int m,int n)for (int i=0;i=m-1;i+)for(int j=0;j=n-1;j+)cij=aij+bij; return;2 矩阵乘法的示例程序(C语言)#include stdafx.hvoid matrixMultiply(double a1415,double b1513, double c1413,long m,long n,long k) for (long i = 0; i= m-1; i+)for (long j=0; j=k-1; j

12、+)cij =0.0;for (long q=0; q=n-1;q+)cij = cij + aiq * bqj;return;int main(int argc, char* argv)long n,m,k,i,j;double a1415,c1413,b1513;FILE *stream;stream = fopen(矩阵输入.txt,r);fscanf(stream,%ld %ld,&n,&m);for (i=0;in;i+)for(j=0;jm;j+)fscanf(stream,%lf,&aij);fscanf(stream,%ld %ld,&m,&k);for(i=0;im;i+)f

13、or(j=0;jk;j+)fscanf(stream,%lf,&bij);fclose(stream);matrixMultiply(a,b,c,4,5,3);stream = fopen(矩阵计算结果.txt,w);for (i=0;i=3;i+)for(j=0;j=2;j+)fprintf(stream,%16.7e ,cij);fprintf(stream,n);fprintf(stream,n);fclose(stream); return 0;实验2 矩阵转置与求逆运算一、 实验名称:矩阵转置与求逆运算。二、 实验目的和任务:掌握矩阵转置的编写,会调用矩阵求逆函数。三、 实验要求:1

14、 每人独立编写出矩阵转置的程序,并上机调试通过;2 每人独立完成矩阵求逆函数的调用,并调试通过;3 采用VC+6.0开发平台,C或者C+语言编写程序;4 写出矩阵运算的结果。四、 实验内容:i. 矩阵的转置示例函数(C语言)double JZzhuanzhi(double a1515, double b1515, int m,int n) for(int i=0;im;i+) for(int j=0;jn;j+) bji=aij; return 0.0; ii. 矩阵求逆的示例函数(C语言)int invGJ(double *a,int n)int *is,*js,i,j,k,l,u,v;do

15、uble d,p;is=(int *)malloc(n*sizeof(int);js=(int *)malloc(n*sizeof(int);for(k=0;k=n-1;k+)d=0.0;for(i=k;i=n-1;i+)for(j=k;jd)d=p;isk=i;jsk=j; if(d+1.0=1.0)free(is);free(js);printf(error not invn);return (0);if(isk!=k)for(j=0;j=n-1;j+)u=k*n+j;v=isk*n+j;p=akj;akj=aiskj;aiskj=p; if(jsk!=k) for(i=0;i=n-1;i

16、+) u=i*n+k;v=i*n+jsk; p=aik;aik=aijsk;aijsk=p; l=k*n+k; akk=1.0/akk; for(j=0;j=n-1;j+) if(j!=k) u=k*n+j;akj=akj*akk; for(i=0;i=n-1;i+)if(i!=k) for(j=0;j=n-1;j+) if(j!=k) u=i*n+j; aij=aij-aik*akj; for(i=0;i=0;k-) if(jsk!=k) for(j=0;j=n-1;j+) u=k*n+j;v=jsk*n+j; p=akj;akj=ajskj;ajskj=p; if(isk!=k)for(i

17、=0;i=n-1;i+)u=i*n+k;v=i*n+isk;p=aik;aik=aiisk;aiisk=p;free(is);free(js);return (1); int invGJ(double *a,int n)int *is,*js,i,j,k,l,u,v;double d,p;is=(int *)malloc(n*sizeof(int);js=(int *)malloc(n*sizeof(int);for(k=0;k=n-1;k+)d=0.0;for(i=k;i=n-1;i+)for(j=k;jd)d=p;isk=i;jsk=j; if(d+1.0=1.0)free(is);fre

18、e(js);printf(error not invn);return (0);if(isk!=k)for(j=0;j=n-1;j+)u=k*n+j;v=isk*n+j;p=akj;akj=aiskj;aiskj=p; if(jsk!=k) for(i=0;i=n-1;i+) u=i*n+k;v=i*n+jsk; p=aik;aik=aijsk;aijsk=p; l=k*n+k; akk=1.0/akk; for(j=0;j=n-1;j+) if(j!=k) u=k*n+j;akj=akj*akk; for(i=0;i=n-1;i+)if(i!=k) for(j=0;j=n-1;j+) if(

19、j!=k) u=i*n+j; aij=aij-aik*akj; for(i=0;i=0;k-) if(jsk!=k) for(j=0;j=n-1;j+) u=k*n+j;v=jsk*n+j; p=akj;akj=ajskj;ajskj=p; if(isk!=k)for(i=0;i=n-1;i+)u=i*n+k;v=i*n+isk;p=aik;aik=aiisk;aiisk=p;free(is);free(js);return (1);iii. 矩阵求逆函数的调用(C语言)#include #include #include int invGJ(double *a,int n);void mai

20、n() int i,j;double *AA;/首先对二维指针Naa分配内存,采用C语言的方法/*AA=(double *)malloc(sizeof(double)*2);for(i=0;i2;i+)AAi=(double *)mallo(sizeof(double)*2);*/首先对二维指针Naa分配内存,采用C+语言的方法AA=new double * 2;for(i=0;i2;i+) AAi=new double2;double BB22=1,2,3,4;for(i=0;i2;i+)for(j=0;j2;j+)AAij=BBij;/调用矩阵求逆函数invGJ(AA,2);printf(

21、矩阵AA的逆阵如下n);for(i=0;i2;i+)for(j=0;j2;j+)printf(%10.4lf,AAij);printf(n);double CC22;printf(AA与其逆阵的乘积如下(理论上是单位阵)n);for(i=0;i2;i+)for(j=0;j2;j+)CCij=0.0;for(int k=0;k2;k+)CCij+=AAik*BBkj;printf(%10.4lf,CCij);printf(n);/C语言释放AA二维指针的方法/*for(i=0;i2;i+)free(AAi);free(AA); */C+语言释放AA二维指针的方法for(i=0;im_pMainW

22、nd-MessageBox(数据文件不存在或数据文件错!,进程. . . . . .!,MB_OK|MB_ICONSTOP);_exit(1);return FALSE;fp.ReadString(buff,MAXLINE);sscanf(buff,%d%d%d,&nz,&nw,&nn);ne=nz-nw;int dh;double gc;for(i=0;inz;i+)fp.ReadString(buff,MAXLINE);sscanf(buff,%d%s%lf,&dh,ch1,&gc);dmi=ch1;Hi=gc;for(i=0;inn;i+)fp.ReadString(buff,MAXLI

23、NE);sscanf(buff,%d%d%lf%lf,&n1i,&n2i,&hi,&Si);fp.Close(); return TRUE;void CGckzwpc:pc()int i,j,k;/double Nbb12020;Nbb = new double * nw;for(i=0;inw;i+)Nbbi = new double nw;for(i=0;inn;i+)Pi=0.0;li=0.0;for(j=0;jnw;j+)Bij=0.0;for(i=0;ine) Bin1i-ne-1=-1;if(n2ine) Bin2i-ne-1=+1;Pi=1/Si;li=Hn1i-1+hi-Hn2

24、i-1;for(i=0;inw;i+)for(j=0;jnw;j+)Nbbij=0.0;for(k=0;knn;k+)Nbbij+=Bki*Bkj*Pk;for(i=0;inw;i+)Wi=0.0;for(k=0;knn;k+)Wi+=Bki*Pk*lk;invGJ(Nbb,nw);for(i=0;inw;i+)Xi=0.0;for(k=0;knw;k+)Xi+=Nbbik*Wk;/精度评定函数void CGckzwpc:jdpd()int i,j,k;FILE *fp;fp=fopen(out.txt,w);VPV =0.0;for(i=0;inn;i+)Vi=0.0;for(k=0;knw

25、;k+)Vi+=Bik*Xk;Vi+=-li;VPV+=Vi*Vi*Pi;phi=hi+Vi;/计算验后单位权中误差SIG0=sqrt(VPV/(nn-nw);/计算未知参数的方差for(i=0;inw;i+)for(j=0;jnw;j+)DXij=SIG0*SIG0*Nbbij;double QLL5050,SIGL5050;/计算观测值的平差值的中误差 QLL=B*inv(Nbb)*BT DLL=SIG0*SIG0*QLLfor(i=0;inn;i+)for(j=0;jnn;j+)QLLij =0.0;SIGLij=0.0;for(k=0;knw;k+)for(int m=0;mnw;m+

26、)QLLij+=Nbbkm*Bik*Bjm;SIGLij=SIG0*sqrt(QLLij);fprintf(fp,*水准网间接平差结果*nn);fprintf(fp, 总点数%3d 未知点数%3d 测段数%3dn,nz,nw,nn);fprintf(fp,n 验后单位权中误差%6.2lf(mm)nn,SIG0*1000);fprintf(fp,n 起点号 终点号 观测高差(m) 路线长(km) 改正数(mm) 平差高差(m) 中误差(mm)n);for(i=0;inn;i+)fprintf(fp, %3d %3d %8.4lf %8.4lf %8.2lf %8.4lf %8.2lfn,n1i,

27、n2i,hi,Si,Vi*1000,phi,SIGLii*1000);fprintf(fp,nn 已知点 已知高程(m)n);for(i=0;ine;i+)fprintf(fp,%10s %10.4lf n,dmi,Hi);fprintf(fp,n 待定点 平差高程(m) 高程中误差(mm)n);for(i=0;inw;i+)fprintf(fp, %10s %10.4lf %5.2lfn,dmi+ne,Xi,sqrt(DXii)*1000);for(i=0;inw;i+)delete Nbbi;delete Nbb;fclose(fp);/菜单驱动打开文件源代码(放在View中)void CSurveyView:OnMenuGcwpc() CGckzwpc m_pc;CFileDialog FileDlg(TRUE,NULL,*.txt,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,水准网平差数据文件名(*.txt)|*.txt|所有文件(*.*)|*.*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论