测绘程序设计课程实习报告Word文档格式.docx
《测绘程序设计课程实习报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《测绘程序设计课程实习报告Word文档格式.docx(37页珍藏版)》请在冰豆网上搜索。
#include<
math.h>
string>
usingnamespacestd;
constdoublepi=;
intmain()
{
fstreamfile("
a.txt"
);
//概念文件操作对象
stringaa;
file>
>
aa;
cout<
aa<
endl;
//输出文件中的内容
inta=1;
//概念重复输入利用的变量
while(a)//限制循环,重复输入
{
floata1,a2,a3;
cout<
doubledeg;
"
输入度"
cin>
a1;
输入分"
a2;
输入秒"
a3;
角度为"
a1<
°
"
a2<
′"
a3<
″"
if(a1>
=0)//判定输入度数的正负
deg=a1+a2/60+a3/3600;
else
deg=a1-a2/60-a3/3600;
doubleradian;
radian=deg/180*pi;
转换得弧度为"
radian<
输入弧度:
cin>
radian;
booltm=0;
deg=radian*180/pi;
if(deg<
0)
{
tm=1;
deg=-deg;
}
a1=int(deg);
a2=int((deg-a1)*60);
a3=((deg-a1-a2/60)*3600);
if(tm==1)
{
a1=-a1;
tm=0;
}
转换后角度为"
″"
}
return0;
3.运行结果
输入度
20
输入分
55
输入秒
32
角度为20°
55′32″
转化后角度为179°
54′″
Pressanykeytocontinue
4.显现的问题
角度转换进程中需要考虑角度的正负号问题,角度转化能够添加是不是超过59的判定。
(二)实习2(概率计算)
1.预备
在误差查验、粗差探测等平差计算中常常需要计算某些特定散布函数的反函数值,为知足计算需要,利用CProbability类对相关计算进行封装。
2.代码及运行结果与书上相同。
(三)实习3(矩阵大体运算)
矩阵的运算有加法、减法、乘法、转置、求逆,封装在一个类中。
为了方便以后的计算与利用,类中还添加了从文件中读入矩阵、输出矩阵,向操纵台输入输出矩阵的函数。
代入运算的矩阵均用动态的一维数组表示。
先概念double型指针,在确信矩阵大小后动态申请空间,row行col列的矩阵概念为:
double*mat=newdouble[row*col];
第i行j列的元素为mat[i*col+j]。
矩阵的加法、减法只需遍历两个矩阵的每一个元素,相加以后放到结果矩阵中(如有必要先判定相加的两矩阵行数与列数是不是相等)。
乘法计算中设相成的两个矩阵mat一、mat2的行列别离为row一、col,col、col2,那么所求结果矩阵第i行j列的元素
用三个循环即可计算矩阵中所有的元素。
矩阵转置将结果矩阵中的i行j列元素赋值为需要计算的矩阵中的j行i列个元素即可。
矩阵求逆,由于平差计算中需要求逆的矩阵一样为实对称正定矩阵,为了提高大型矩阵的计算效率,能够利用对实对称正定矩阵求逆的方式。
设C为n阶对称正定矩阵,y、x为n维向量,其关系式为:
y=C·
x(3-1)
确信了
上的一个映像,如能写出逆关系:
x=B·
y(3-2)
那么B为C的逆阵,即B=
现将式(3-1)写成
......
......(3-3)
.......
......
因C对称正定,必有
0,用
除式(3-3)第一个方程的两头,解出
,把
和
的位置互换,并将
代入其他各式得
......
......(3-4)
事实上式(3-4)能够改写为
......+
........(3-5)
若是对式(3-5)中的变量按如下规那么从头编号
(3-6)
经n次变换后恢恢复状,采纳变量循环从头编号法的计算公式如下:
关于
由于变量循环从头编号法求逆均在下三角阵(包括对角元素)进行,因此运行速快,在大型矩阵的计算中能够专门好的适用。
矩阵运算的函数封装在类mat中,函数在mat.h中概念,在mat.cpp中实现。
2.代码
文件mat.h:
#include<
classmat
public:
voidadd(introw,intcol,doublem[],doublen[],doubleresult[]);
//加法
voidsub(introw,intcol,doublem[],doublen[],doubleresult[]);
//减法
double*multiply(introw,intcol,intcol2,doublem[],doublen[]);
//乘法
voidtrans(introw,intcol,doublem[],doubleresult[]);
//转置
boolinverse(doublea[],intn);
//求逆
voidfileIn(ifstream&
in,intsize,double*mat);
//从文件中读入
voidfileOut(ofstreamout,introw,intcol,double*mat);
//向文件输出
voidoutPut(introw,intcol,double*mat);
//向操纵台输出
voidinPut(introw,intcol,double*mat);
//从操纵台输入
intij(inti,intj)//下三角矩阵元素判定
return(i>
=j)?
i*(i+1)/2+j:
j*(j+1)/2+i;
};
文件mat.cpp:
#include"
mat.h"
voidmat:
:
add(introw,intcol,doublem[],doublen[],doubleresult[])
for(inti=0;
i<
row*col;
i++)
result[i]=m[i]+n[i];
sub(introw,intcol,doublem[],doublen[],doubleresult[])
result[i]=m[i]-n[i];
double*mat:
multiply(introw,intcol,intcol2,doublem[],doublen[])
inti,j,k;
double*result=newdouble[row*col2];
for(i=0;
row;
for(j=0;
j<
col2;
j++)
result[i*col2+j]=0;
for(k=0;
k<
col;
k++)
result[i*col2+j]+=m[i*col+k]*n[k*col2+j];
returnresult;
trans(introw,intcol,doublem[],doubleresult[])
inti,j;
double*temp=newdouble[row*col];
result[i*row+j]=m[j*col+i];
boolmat:
inverse(doublemat[],intn)
inti;
intj;
intk;
double*c=newdouble[n];
for(k=0;
n;
doublec11=mat[0];
if(c11+==)
delete[]c;
returnfalse;
for(i=1;
doubleai0=mat[i*(i+1)/2];
if(i<
=n-k-1)
c[i]=-ai0/c11;
else
c[i]=ai0/c11;
for(j=1;
=i;
mat[(i-1)*i/2+j-1]=mat[i*(i+1)/2+j]+ai0*c[j];
}
mat[(n-1)*n/2+i-1]=c[i];
mat[n*(n+1)/2-1]=