




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、誤差理論與測量平差上機指導書遼寧工程技術大學測繪與地理科學學院 測繪工程系目錄Visual C+ 6.0開發(fā)平臺簡介1MFC概述1實驗1 矩陣加法與乘法運算3實驗2 矩陣轉置與求逆運算6實驗3 誤差橢圓元素計算13實驗4 水準網間接平差程序設計15Visual C+ 6.0開發(fā)平臺簡介Visual C+提供了一個支持可視化編程的集成開發(fā)環(huán)境:Visual Studio(又名Developer Studio)。Developer Studio是一個通用的應用程序集成開發(fā)環(huán)境,它不僅支持Visual C+,還支持Visual Basic,Visual J+,Visual InterDev等Micr
2、osoft系列開發(fā)工具。Developer Studio包含了一個文本編輯器、資源編輯器、工程編譯工具、一個增量連接器、源代碼瀏覽器、集成調試工具,以及一套聯(lián)機文檔。使用Developer Studio,可以完成創(chuàng)建、調試、修改應用程序等的各種操作。Developer Studio采用標準的多窗口Windows用戶界面,并增加了一些新特性,使得開發(fā)環(huán)境更易于使用,用戶很容易學會它的使用方法。由于Developer Studio是一個可視化的開發(fā)工具,在介紹Developer Studio的各個組成部分之前,首先了解一下可視化編程的概念。可視化技術是當前發(fā)展迅速并引人注目的技術之一,它的特點是把
3、原來抽象的數字、表格、功能邏輯等用直觀的圖形、圖象的形式表現出來。可視化編程是它的重要應用之一。所謂可視化編程,就是指:在軟件開發(fā)過程中,用直觀的具有一定含義的圖標按鈕、圖形化的對象取代原來手工的抽象的編輯、運行、瀏覽操作,軟件開發(fā)過程表現為鼠標點擊按鈕和拖放圖形化的對象以及指定對象的屬性、行為的過程。這種可視化的編程方法易學易用,而且大大提高了工作效率。Visual C+的集成開發(fā)環(huán)境Developer Studio提供了大量的實用工具以支持可視化編程特性,它們包括:項目工作區(qū)、ClassWizard、AppWizard、WizardBar、Component Gallery等。MFC概述M
4、FC是一個編程框架。MFC (Microsoft Foundation Class Library) 中的各種類結合起來構成了一個應用程序框架,它的目的就是讓程序員在此基礎上來建立Windows下的應用程序,這是一種相對SDK來說更為簡單的方法。因為總體上,MFC框架定義了應用程序的輪廓,并提供了用戶接口的標準實現方法,程序員所要做的就是通過預定義的接口把具體應用程序特有的東西填入這個輪廓。Microsoft Visual C+提供了相應的工具來完成這個工作:AppWizard可以用來生成初步的框架文件(代碼和資源等);資源編輯器用于幫助直觀地設計用戶接口;ClassWizard用來協(xié)助添加代
5、碼到框架文件;最后,編譯,則通過類庫實現了應用程序特定的邏輯。 1 封裝 構成MFC框架的是MFC類庫。MFC類庫是C+類庫。這些類或者封裝了Win32應用程序編程接口,或者封裝了應用程序的概念,或者封裝了OLE特性,或者封裝了ODBC和DAO數據訪問的功能,等等。 2 繼承 首先,MFC抽象出眾多類的共同特性,設計出一些基類作為實現其他類的基礎。這些類中,最重要的類是CObject和CCmdTarget。CObject是MFC的根類,絕大多數MFC類是其派生的,包括CCmdTarget。CObject 實現了一些重要的特性,包括動態(tài)類信息、動態(tài)創(chuàng)建、對象序列化、對程序調試的支持,等等。所有從
6、CObject派生的類都將具備或者可以具備CObject所擁有的特性。CCmdTarget通過封裝一些屬性和方法,提供了消息處理的架構。MFC中,任何可以處理消息的類都從CCmdTarget派生。 針對每種不同的對象,MFC都設計了一組類對這些對象進行封裝,每一組類都有一個基類,從基類派生出眾多更具體的類。這些對象包括以下種類:窗口對象,基類是CWnd;應用程序對象,基類是CwinThread;文檔對象,基類是Cdocument,等等。程序員將結合自己的實際,從適當的MFC類中派生出自己的類,實現特定的功能,達到自己的編程目的。 3 虛擬函數和動態(tài)約束 MFC以“C+”為基礎,自然支持虛擬函數
7、和動態(tài)約束。但是作為一個編程框架,有一個問題必須解決:如果僅僅通過虛擬函數來支持動態(tài)約束,必然導致虛擬函數表過于臃腫,消耗內存,效率低下。例如,CWnd封裝 Windows窗口對象時,每一條Windows消息對應一個成員函數,這些成員函數為派生類所繼承。如果這些函數都設計成虛擬函數,由于數量太多,實現起來不現實。于是,MFC建立了消息映射機制,以一種富有效率、便于使用的手段解決消息處理函數的動態(tài)約束問題。 這樣,通過虛擬函數和消息映射,MFC類提供了豐富的編程接口。程序員繼承基類的同時,把自己實現的虛擬函數和消息處理函數嵌入MFC的編程框架。MFC編程框架將在適當的時候、適當的地方來調用程序的
8、代碼。4 MFC的宏觀框架體系 如前所述,MFC實現了對應用程序概念的封裝,把類、類的繼承、動態(tài)約束、類的關系和相互作用等封裝起來。這樣封裝的結果對程序員來說,是一套開發(fā)模板(或者說模式)。針對不同的應用和目的,程序員采用不同的模板。例如,SDI應用程序的模板,MDI應用程序的模板,規(guī)則DLL應用程序的模板,擴展DLL應用程序的模板,OLE/ACTIVEX應用程序的模板,等等。這些模板都采用了以文檔-視為中心的思想,每一個模板都包含一組特定的類。為了支持對應用程序概念的封裝,MFC內部必須作大量的工作。例如,為了實現消息映射機制,MFC編程框架必須要保證首先得到消息,然后按既定的方法進行處理。
9、又如,為了實現對DLL編程的支持和多線程編程的支持,MFC內部使用了特別的處理方法,使用模塊狀態(tài)、線程狀態(tài)等來管理一些重要信息。雖然,這些內部處理對程序員來說是透明的,但是,懂得和理解MFC內部機制有助于寫出功能靈活而強大的程序。 總之,MFC封裝了Win32 API,OLE API,ODBC API等底層函數的功能,并提供更高一層的接口,簡化了Windows編程。同時,MFC支持對底層API的直接調用。MFC提供了一個Windows應用程序開發(fā)模式,對程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,預定義或實現了許多事件和消息處理,等等。框架或者由其本身處理事件,不依賴程
10、序員的代碼;或者調用程序員的代碼來處理應用程序特定的事件。MFC是C+類庫,程序員就是通過使用、繼承和擴展適當的類來實現特定的目的。例如,繼承時,應用程序特定的事件由程序員的派生類來處理,不感興趣的由基類處理。實現這種功能的基礎是C+對繼承的支持,對虛擬函數的支持,以及MFC實現的消息映射機制。 實驗1 矩陣加法與乘法運算一、 實驗名稱:矩陣加法與乘法運算。二、 實驗目的和任務:掌握矩陣加法與乘法通用程序的編寫。三、 實驗要求:1 每人獨立編寫出矩陣加法與乘法的程序,并上機調試通過;2 采用VC+6.0開發(fā)平臺,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.h"void matrixMultiply(double a1415,double b1513, double c1413,long m,long n,long k) for (long i = 0; i<= m-1; i+
12、)for (long j=0; j<=k-1; j+)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;i<n;i+)fo
13、r(j=0;j<m;j+)fscanf(stream,"%lf",&aij);fscanf(stream,"%ld %ld",&m,&k);for(i=0;i<m;i+)for(j=0;j<k;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
14、(j=0;j<=2;j+)fprintf(stream,"%16.7e ",cij);fprintf(stream,"n");fprintf(stream,"n");fclose(stream); return 0;實驗2 矩陣轉置與求逆運算一、 實驗名稱:矩陣轉置與求逆運算。二、 實驗目的和任務:掌握矩陣轉置的編寫,會調用矩陣求逆函數。三、 實驗要求:1 每人獨立編寫出矩陣轉置的程序,并上機調試通過;2 每人獨立完成矩陣求逆函數的調用,并調試通過;3 采用VC+6.0開發(fā)平臺,C或者C+語言編寫程序;4 寫出矩陣運算的結果。四
15、、 實驗內容:i. 矩陣的轉置示例函數(C語言)double JZzhuanzhi(double a1515, double b1515, int m,int n) for(int i=0;i<m;i+) for(int j=0;j<n;j+) bji=aij; return 0.0; ii. 矩陣求逆的示例函數(C語言)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
16、<=n-1;k+)d=0.0;for(i=k;i<=n-1;i+)for(j=k;j<=n-1;j+)l=i*n+j;p=fabs(aij);if(p>d)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+) u=i*n+k;v
17、=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<=n-1;i+) if(i!=k) u=i*n+k;aik=-aik*akk; for(k=n-1;k>=0;k-) if(jsk!=k) for(j=0;j<=n-1;
18、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); 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
19、;for(i=k;i<=n-1;i+)for(j=k;j<=n-1;j+)l=i*n+j;p=fabs(aij);if(p>d)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+) u=i*n+k;v=i*n+jsk; p=aik;a
20、ik=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<=n-1;i+) if(i!=k) u=i*n+k;aik=-aik*akk; for(k=n-1;k>=0;k-) if(jsk!=k) for(j=0;j<=n-1;j+) u=k*n+j;v=jsk
21、*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 <stdio.h>#include <stdlib.h>#include <math.h>int invGJ(double *a,int n);void main() int i,j;double *AA;/首先對二維指針Naa分配內存,采用
22、C語言的方法/*AA=(double *)malloc(sizeof(double)*2);for(i=0;i<2;i+)AAi=(double *)mallo(sizeof(double)*2);*/首先對二維指針Naa分配內存,采用C+語言的方法AA=new double * 2;for(i=0;i<2;i+) AAi=new double2;double BB22=1,2,3,4;for(i=0;i<2;i+)for(j=0;j<2;j+)AAij=BBij;/調用矩陣求逆函數invGJ(AA,2);printf("矩陣AA的逆陣如下n");f
23、or(i=0;i<2;i+)for(j=0;j<2;j+)printf("%10.4lf",AAij);printf("n");double CC22;printf("AA與其逆陣的乘積如下(理論上是單位陣)n");for(i=0;i<2;i+)for(j=0;j<2;j+)CCij=0.0;for(int k=0;k<2;k+)CCij+=AAik*BBkj;printf("%10.4lf",CCij);printf("n");/C語言釋放AA二維指針的方法/*f
24、or(i=0;i<2;i+)free(AAi);free(AA); */C+語言釋放AA二維指針的方法for(i=0;i<2;i+)delete AAi;delete AA;實驗3 誤差橢圓元素計算一、 實驗名稱:誤差橢圓元素計算。二、 實驗目的和任務:掌握誤差橢圓和相對誤差橢圓元素的計算公式,并采用C或者C+語言變成實現。三、 實驗要求:1 每人獨立編寫出誤差橢圓和相對誤差橢圓元素的計算程序,并調試通過;2 采用VC+6.0開發(fā)平臺,C或者C+語言編寫程序;3 寫出計算的結果。4 本實驗屬于綜合性,設計性實驗,對學生的要求比較高,會綜合使用矩陣加法,乘法以及轉置和求逆的程序。5
25、注意事項:坐標方位角計算時必須考慮X與Y 所在的象限。四、 實驗內容:參考教材測量平差P103-P112。具體的例子可以參考P111頁的例題,進行程序的調試。(一) 誤差橢圓元素計算公式:(二) 相對誤差橢圓元素計算公式:五、 例子(P111)在某三角網中插入P1及P2兩個新點。設用間接平差法平差。平差之后這兩點之間的協(xié)因數陣如下:根據以上的公式,分別計算出未知點P1和P2的誤差橢圓元素以及這兩點之間的相對誤差橢圓元素。實驗4 水準網間接平差程序設計一、 實驗名稱:水準網間接平差程序設計二、 實驗目的:掌握用間接平差法對任意網形的水準網進行平差的算法設計以及程序編制;并學習采用讀文件處理數據的
26、方法。三、 實驗任務:用C/C+編寫水準網間接平差程序,并調試通過,用實測數據實算分析;同時評定精度。四、 實驗要求:1 個人獨立編寫程序,原始數據存放于文本文件或者數據庫文件中;2 程序應該具有通用性,即任意網形都可以平差;3 用實測的數據進行計算分析。4 評定待定點的高程精度。五、 實驗內容1 數據文件的編制格式總點數 未知點數 測段數(觀測高差的個數)已知點1點名 高程已知點2點名 高程未知點3點名 0未知點4點名 0未知點5點名 0。起點點號 終點點號 觀測高差 路線長度(km)起點點號 終點點號 觀測高差 路線長度(km)起點點號 終點點號 觀測高差 路線長度(km)。2 平差原理由
27、觀測值的起始和終點號或者水準網網形,形成誤差方程的系數矩陣B(也叫設計矩陣),由觀測的路線長度形成觀測高差的權陣P(觀測值獨立,P為對角陣),原理如下: (C為任意常數)3 法方程系數矩陣與閉合差的自動累加由于N和W具有可加性,即每讀取一個高差觀測值,即可得到一個誤差方程的系數向量,然后累加到法方程系數矩陣與閉合差中;當高差觀測值讀取完畢的時候,法方程系數矩陣與閉合差也累加完畢;此時可用公式直接計算待定點高程的改正數,加上高程近似值,就得到了高程的平差值。4 精度評定 驗后單位權中誤差:待定點高程(未知參數)的協(xié)因數陣:待定點高程的方差:改正數V的協(xié)因數陣:高差平差值的協(xié)因數陣:5 例子1(P
28、79)(1)in.txt文件4 3 51 A 237.4832 B 0.03 C 0.04 D 0.01 2 5.835 3.52 3 3.782 2.71 3 9.640 4.04 3 7.384 3.01 4 2.270 2.5(2)源程序/Gckzwpc.h頭文件代碼class CGckzwpc public:CGckzwpc();virtual CGckzwpc();public:bool ReadData(CString filename); /讀水準網平差數據文件void pc(); /平差函數void jdpd(); /精度評定函數int invGJ(double *a,int
29、n); /求逆函數int nz,nw,ne,nn; /文件頭信息:總點數,未知點數,已知點數,測段數int n120,n220; /存放高差起點與終點的點號double H50,h50,W20,X20,B5020,V50,VPV;double *Nbb,S50,l50,P50,ph50;CString dm20; /控制點點名double SIG0,DX2020;/Gckzwpc.cpp代碼bool CGckzwpc:ReadData(CString filename)int i;int MAXLINE =512;char buff513,ch115;CStdioFile fp;if( !fp
30、.Open(filename,CFile:modeRead|CFile:typeText,NULL)AfxGetApp()->m_pMainWnd->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
31、(i=0;i<nz;i+)fp.ReadString(buff,MAXLINE);sscanf(buff,"%d%s%lf",&dh,ch1,&gc);dmi=ch1;Hi=gc;for(i=0;i<nn;i+)fp.ReadString(buff,MAXLINE);sscanf(buff,"%d%d%lf%lf",&n1i,&n2i,&hi,&Si);fp.Close(); return TRUE;void CGckzwpc:pc()int i,j,k;/double Nbb12020;Nbb
32、 = new double * nw;for(i=0;i<nw;i+)Nbbi = new double nw;for(i=0;i<nn;i+)Pi=0.0;li=0.0;for(j=0;j<nw;j+)Bij=0.0;for(i=0;i<nn;i+)if(n1i>ne) Bin1i-ne-1=-1;if(n2i>ne) Bin2i-ne-1=+1;Pi=1/Si;li=Hn1i-1+hi-Hn2i-1;for(i=0;i<nw;i+)for(j=0;j<nw;j+)Nbbij=0.0;for(k=0;k<nn;k+)Nbbij+=Bki*
33、Bkj*Pk;for(i=0;i<nw;i+)Wi=0.0;for(k=0;k<nn;k+)Wi+=Bki*Pk*lk;invGJ(Nbb,nw);for(i=0;i<nw;i+)Xi=0.0;for(k=0;k<nw;k+)Xi+=Nbbik*Wk;/精度評定函數void CGckzwpc:jdpd()int i,j,k;FILE *fp;fp=fopen("out.txt","w");VPV =0.0;for(i=0;i<nn;i+)Vi=0.0;for(k=0;k<nw;k+)Vi+=Bik*Xk;Vi+=-li
34、;VPV+=Vi*Vi*Pi;phi=hi+Vi;/計算驗后單位權中誤差SIG0=sqrt(VPV/(nn-nw);/計算未知參數的方差for(i=0;i<nw;i+)for(j=0;j<nw;j+)DXij=SIG0*SIG0*Nbbij;double QLL5050,SIGL5050;/計算觀測值的平差值的中誤差 QLL=B*inv(Nbb)*BT DLL=SIG0*SIG0*QLLfor(i=0;i<nn;i+)for(j=0;j<nn;j+)QLLij =0.0;SIGLij=0.0;for(k=0;k<nw;k+)for(int m=0;m<nw;
35、m+)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;i<nn;i+)fprintf(fp," %3d %3d %8.4lf %8.4lf %8.2lf %8.4lf %8.2lfn",n1i,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六一活動憶童年活動方案
- 六一活動游街活動方案
- 六一活動踢球活動方案
- 六一游園手工活動方案
- 六一玩具團隊活動方案
- 六一結對活動方案
- 六一節(jié)團委活動方案
- 六一節(jié)景區(qū)活動方案
- 六一葵花義賣活動方案
- 醫(yī)生的考試試題及答案
- 2022年長春中醫(yī)藥大學輔導員招聘考試筆試試題及答案解析
- 企業(yè)家刑事法律風險及其防范(課件)
- 實用文檔2021近四年小米公司財務報表分析
- 部編版小學道德與法治三年級下冊期末質量檢測試卷【含答案】5套
- 立式圓筒形儲罐罐底真空試驗記錄
- 小學生勞動教育評價細則
- 民法典案例解讀PPT
- 質 量 管 理 體 系 認 證審核報告(模板)
- 腫瘤科新護士入科培訓和護理常規(guī)
- 第4章 頜位(雙語)
- 塔吊負荷試驗方案
評論
0/150
提交評論