程序设计实验报告.docx
- 文档编号:4632751
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:15
- 大小:19.43KB
程序设计实验报告.docx
《程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《程序设计实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
程序设计实验报告
学生实验报告
院系:
测绘学院
专业班级:
测绘13级3班
学号:
17
学生姓名:
王泽
指导教师:
郭辉老师
2016年05月20日
安徽理工大学实验报告
实验课程名称:
数据结构与软件开发上机实验
开课院系及实验室:
测绘学院红楼二楼机房
院系
测绘学院
专业班级
测绘13-3班
姓名
王泽
成绩
实验项目名称
测量程序设计课程实验
指导教师
郭辉老师
实验1编程基本知识练习
实验目的:
通过该实验课内容的练习,学生应掌握VB编程的基本语法、变量的定义、数组(动态数组)的定义、VB语言中子过程与函数的定义以及文本文件的读写等知识。
实验内容:
1)变量的定义动态数组的定义与应用;
2)矩阵的加、减、乘运算(定义Sub()子过程或Function()来实现);
3)数据文件的建立、数据的读取与写入。
实验步骤:
1.编辑界面
打开VB编程工具,进入编程主界面。
在窗体上新建“读入数据”和“输出数据”两个按钮。
双击“窗体”进入代码输入界面,进行代码编辑。
2.用VB编写的源代码
矩阵基本运算源码详见附录一。
(1)两矩阵相加
(2)两矩阵相减
(3)矩阵转置
(4)两矩阵相乘
(5)矩阵求逆
文本文件(本实验中的读取源代码
(1)建立文本文件并输入数据
在桌面上新建一“”(文本文件路径为C:
\Users\WH\Desktop\练习\”)。
输入以下内容:
6,7,4,
A,
B,
C,
D,
在桌面上新建一“”(文本文件路径为C:
\Users\WH\Desktop\练习\”)。
(2)从文本文件中读数据
Dimlinedataasstring,m_GaochaNasinteger,m_Pnumberas
integer,m_knPnumberasinteger,MasDouble,k1asinteger
'linedata为存储文本文件一行信息的字符串变量
Dima()asString,H()asDouble
'a()为存储点名,H()存储高程
Open“C:
\Users\WH\Desktop\练习\”ForInputAs#1
LineInput#1,linedata
k=Split(linedata,",")
m_GaochaN=Val(k(0))
m_Pnumber=Val(k
(1))
m_knPnumber=Val(k
(2))
M=CDbl(k(3))
Fork1=1Tom_knPnumber
LineInput#1,linedata
k=Split(linedata,",")
a(k1)=k(0)
GetstationNumber(a)
H(k1)=CDbl(k
(1))
Next
Close#1
(3)将读入点名存储到点名数组中,且返回该点名所对应编号
FunctionGetstationNumber(nameAsString)
DimiAsInteger
Fori=1Tom_Pnumber
IfP_Name(i)<>""Then
'将待查点名与已经存入点名数组的点比较
IfP_Name(i)=nameThen
GetstationNumber=i
ExitFor
EndIf
Else'待查点是新的点名,将新点名放到P_Name数组中
P_Name(i)=name
GetstationNumber=i
ExitFor
EndIf
Nexti
EndFunction
(4)从文本文件中写数据(将从读入的数据,写入到文件中)
Open“C:
\Users\WH\Desktop\练习\”ForOutputAs#1
outstring=outstring+str(m_GaochaN)+","
outstring=outstring+str(m_Pnumber)+","
outstring=outstring+str(m_knPnumber)+","
outstring=outstring+str(M)+vbCrLf
Fork1=1Tom_knPnumber
outstring=outstring+a(k1)+","+Format(H(k1),"##")+
vbCrLf
Next
Print#1,outstring
实验2水准网平差程序设计
实验目的:
通过本次实验的练习,使学生掌握水准网平差中近似高程计算算法、组成误差方程系数阵B、组成误差方程常数项L及权阵生成算法。
掌握法方程的组建参数改正值的计算以及单位权中误差的计算。
掌握水准网平差中输出高程平差值和高程中误差、输出观测值及其改正数与平差值等信息并保存为平差成果文件的方法。
实验内容:
1)在读入水准网数据后,进行待定点近似坐标的计算;
2)基于间接平差的思想,以观测的测段高差为观测值,组成误差方程系数矩阵B及常数项矩阵L;
3)基于水准网平差中定权的方法(测段长或测站数定权),生成权阵P。
4)利用矩阵的基本运算(调用矩阵运算函数即可)得到法方程系数矩阵及常数项矩阵。
该实验的内容其实质就是调用矩阵运算函数。
5)熟悉VB中输出函数Print的用法,及控制输出格式的函数的用法,如Space()、String()
6)水准网平差结束后,将变量及数组中的数据输出到平差结果文件中。
实验步骤:
1.读入水准网数据
(1)建立文本文件并输入数据
在桌面上新建一“”(文本文件路径为C:
\Users\WH\Desktop\练习1\”)。
输入以下内容:
10,7,2,
A,
F,
A,B,,
A,D,,
A,G,,
C,B,,
D,B,,
C,D,,
C,E,,
F,E,,
G,E,,
D,G,,
在桌面上新建一“”(文本文件路径为C:
\Users\WH\Desktop\练习1\”)。
PrivateSubCommand1_Click()
(2)读入水准网数据
Open"C:
\Users\WH\Desktop\练习1\"ForInputAs#1
LineInput#1,linedata
k=Split(linedata,",")
m_GaochaN=Val(k(0))
m_Pnumber=Val(k
(1))
m_knPnumber=Val(k
(2))
M=CDbl(k(3))
ReDimA(1Tom_knPnumber),H(1Tom_knPnumber)
Fork1=1Tom_knPnumber
LineInput#1,linedata
k=Split(linedata,",")
A(k1)=k(0)
H(k1)=CDbl(k
(1))
Next
ReDimStartP(1Tom_GaochaN),EndP(1Tom_GaochaN),gaocha(1Tom_GaochaN),Li(1Tom_GaochaN)
Fork2=1Tom_GaochaN
LineInput#1,linedata
k=Split(linedata,",")
StartP(k2)=k(0)
EndP(k2)=k
(1)
gaocha(k2)=CDbl(k
(2))
Li(k2)=CDbl(k(3))
Next
Close#1
EndSub
2.编辑界面
打开VB编程工具,进入编程主界面。
在窗体上利用控件新建“载入数据”、“开始计算”、“导出结果”、“清空”四个按钮和一个文本框。
3.定义相应变量、数组和实现各功能的函数(过程)详见附录二
(1)水准网中近似坐标计算
(2)生成误差方程系数矩阵B及常数项矩阵L
(3)生成权阵P
(4)残差及中误差计算函数
(5)组成法方程及平差计算
(6)平差结果输出
附件1矩阵基本运算源码
(1)两矩阵相加
PrivateFunctionMsum(MAsInteger,nAsInteger,Matrixsum()AsDouble,Matrix1()AsDouble,Matrix2()AsDouble)'矩阵求和函数
Dimi1AsInteger,i2AsInteger
ReDimMatrixsum(1ToM,1Ton)
Fori1=1ToM
Fori2=1Ton
Matrixsum(i1,i2)=Matrix1(i1,i2)+Matrix2(i1,i2)
Nexti2
Nexti1
EndFunction
(2)两矩阵相减
FunctionMminus(MAsInteger,nAsInteger,MatrixMinus()As
Double,Matrix1()AsDouble,Matrix2()AsDouble)'矩阵求差函数
Dimi1AsInteger,i2AsInteger
ReDimMatrixMinus(1ToM,1Ton)
Fori1=1ToM
Fori2=1Ton
MatrixMinus(i1,i2)=Matrix1(i1,i2)-Matrix2(i1,i2)
Nexti2
Nexti1
EndFunction
(3)矩阵转置
FunctionMchange(MAsInteger,nAsInteger,Matrixchange()AsDouble,Matrix1()AsDouble)
'矩阵转置函数Matrix1()需转置的矩阵,Matrixchange()为转置后的矩阵
Dimi1AsInteger,i2AsInteger
ReDimMatrixchange(1Ton,1ToM)'动态分配用来存储转置后的矩阵
Fori1=1ToM
Fori2=1Ton
Matrixchange(i2,i1)=Matrix1(i1,i2)
Nexti2
Nexti1
EndFunction
(4)两矩阵相乘
'矩阵相乘函数,MatrixMultiply()为存储AB后的矩阵,Matrix1()为A矩阵,Matrix2()为B矩阵,注意矩阵相乘的顺序
'Mi为行,Ni为列,i=1,2
FunctionMmultiply(M1AsInteger,n1AsInteger,M2AsInteger,
n2AsInteger,MatrixMultiply()AsDouble,Matrix1()AsDouble,
Matrix2()AsDouble)
Dimi1AsInteger,i2AsInteger,i3AsInteger
Ifn1<>M2Then
MsgBox"两矩阵不能相乘,请检查!
",vbOKCancel+vbCritical+vbDefaultButton1
ExitFunction
EndIf
ReDimMatrixMultiply(1ToM1,1Ton2)
Fori1=1ToM1
Fori2=1Ton2
MatrixMultiply(i1,i2)=0
Fori3=1Ton1
MatrixMultiply(i1,i2)=MatrixMultiply(i1,i2)+
Matrix1(i1,i3)*Matrix2(i3,i2)
Nexti3
Nexti2
Nexti1
EndFunction
(5)矩阵求逆
FunctionMRinv(nAsInteger,mtxA()AsDouble)AsBoolean
'功能:
实矩阵求逆的全选主元高斯-约当法
'参数:
n-Integer型变量,矩阵的阶数
'mtxA-Double型二维数组,体积为nxn。
存放原矩阵A;返回时存放其逆矩阵A-1。
'返回值:
Boolean型,失败为False,成功为True
ReDimnIs(n)AsInteger,nJs(n)AsInteger
DimiAsInteger,jAsInteger,kAsInteger
DimDAsDouble,PAsDouble
'全选主元,消元
Fork=1Ton
D=0#
Fori=kTon
Forj=kTon
P=Abs(mtxA(i,j))
If(P>D)Then
D=P
nIs(k)=i
nJs(k)=j
EndIf
Nextj
Nexti
'求解失败
If(D+1#=1#)Then
MRinv=False
ExitFunction
EndIf
If(nIs(k)<>k)Then
Forj=1Ton
P=mtxA(k,j)
mtxA(k,j)=mtxA(nIs(k),j)
mtxA(nIs(k),j)=P
Nextj
EndIf
If(nJs(k)<>k)Then
Fori=1Ton
P=mtxA(i,k)
mtxA(i,k)=mtxA(i,nJs(k))
mtxA(i,nJs(k))=P
Nexti
EndIf
mtxA(k,k)=1#/mtxA(k,k)
Forj=1Ton
If(j<>k)ThenmtxA(k,j)=mtxA(k,j)*mtxA(k,k)
Nextj
Fori=1Ton
If(i<>k)Then
Forj=1Ton
If(j<>k)ThenmtxA(i,j)=mtxA(i,j)-mtxA(i,k)*
mtxA(k,j)
Nextj
EndIf
Nexti
Fori=1Ton
If(i<>k)ThenmtxA(i,k)=-mtxA(i,k)*mtxA(k,k)
Nexti
Nextk
'调整恢复行列次序
Fork=nTo1Step-1
If(nJs(k)<>k)Then
Forj=1Ton
P=mtxA(k,j)
mtxA(k,j)=mtxA(nJs(k),j)
mtxA(nJs(k),j)=P
Nextj
EndIf
If(nIs(k)<>k)Then
Fori=1Ton
P=mtxA(i,k)
mtxA(i,k)=mtxA(i,nIs(k))
mtxA(i,nIs(k))=P
Nexti
EndIf
Nextk
'求解成功
MRinv=True
EndFunction
附件2水准网平差程序计算源码
(1)水准网中近似坐标计算
Subca_H()'水准网中待定点近似高程计算
Dimk1AsInteger,H_NAsInteger'H_N为计算出近似高程点个数
Dimc1AsInteger,c2AsInteger
H_N=0
DoWhileH_N<(m_Pnumber-m_knPnumber)
Fork1=1Tom_GaochaN
c1=StartP(k1)'观测高差起点
c2=EndP(k1)'观测高差终点
IfH(c1)=0AndH(c2)<>0Then
H(c1)=H(c2)-gaocha(k1)
H_N=H_N+1
EndIf
IfH(c1)<>0AndH(c2)=0Then
H(c2)=H(c1)+gaocha(k1)
H_N=H_N+1
EndIf
Next
Loop
EndSub
(2)生成误差方程系数矩阵B及常数项矩阵L
SubGouJianBL(H()AsDouble,StartP()AsInteger,EndP()As
Integer)'构建误差方程系数矩阵B与L
'H()为近似高程数组,StatP()为起点点号数组,EndP()为终点点号数组
Dimk1AsInteger,k2AsInteger,k3AsInteger,c1AsInteger,c2
AsInteger
Fork1=1Tom_GaochaN
Fork2=1To(m_Pnumber-m_knPnumber)
B(k1,k2)=0
Next
Next
Fork1=1Tom_GaochaN
c1=StartP(k1)'观测高差起点
c2=EndP(k1)'观测高差终点
Ifc1>m_knPnumberAndc2>m_knPnumberThen
B(k1,c2-m_knPnumber)=1
B(k1,c1-m_knPnumber)=-1
EndIf
Ifc1>m_knPnumberAndc2<=m_knPnumberThen
B(k1,c1-m_knPnumber)=-1
EndIf
Ifc1<=m_knPnumberAndc2>m_knPnumberThen
B(k1,c2-m_knPnumber)=1
EndIf
L(k1,1)=gaocha(k1)-(H(c2)-H(c1))
Next
EndSub
(3)生成权阵P
SubgoujianP()'构建P
Dimk1AsInteger,k2AsInteger
Fork1=1Tom_GaochaN
Fork2=1Tom_GaochaN
P(k1,k2)=0
Next
Next
Fork1=1Tom_GaochaN
Fork2=1Tom_GaochaN
IfLi(k1)=0Then
MsgBox(第+Str(k1)+"测段长为0!
")
EndIf
Ifk1=k2Then
P(k1,k2)=1/Sqr(Li(k1))
EndIf
Next
Next
EndSub
(4)残差及中误差计算函数
Subca_V()'残差计算
Dimk1AsInteger,vvAsDouble,c1AsInteger,c2AsInteger
p_vv=0
Fork1=1Tom_GaochaN
c1=StartP(k1)
c2=EndP(k1)
vv=H(c2)-H(c1)-gaocha(k1)
v(k1,1)=vv
p_vv=p_vv+P(k1,k1)*vv*vv
m_mu=Sqr(p_vv/(m_GaochaN-(m_Pnumber-
m_knPnumber)))
Next
EndSub
(5)组成法方程及平差计算
PrivateSubCommand2_Click()'平差计算及结果输出按钮
ca_H
GouJianBLH,StartP,EndP
goujianP
Mchangem_GaochaN,m_Pnumber-m_knPnumber,Matrixchange,
B'B转置的计算
Mmultiply(m_Pnumber-m_knPnumber),m_GaochaN,
m_GaochaN,m_GaochaN,MatrixMultiply,Matrixchange,P
Mmultiply(m_Pnumber-m_knPnumber),m_GaochaN,
m_GaochaN,(m_Pnumber-m_knPnumber),Q,MatrixMultiply,B
'MRinv(m_Pnumber-m_knPnumber),MatrixMultiply1
MRinv(m_Pnumber-m_knPnumber),Q
Mmultiply(m_Pnumber-m_knPnumber),(m_Pnumber-
m_knPnumber),(m_Pnumber-m_knPnumber),m_GaochaN,
MatrixMultiply2,Q,Matrixchange
Mmultiply(m_Pnumber-m_knPnumber),m_GaochaN,
m_GaochaN,m_GaochaN,MatrixMultiply3,MatrixMultiply2,P
Mmultiply(m_Pnumber-m_knPnumber),m_GaochaN,
m_GaochaN,1,dx,MatrixMultiply3,L
ca_V
PrintResult
EndSub
(6)平差结果输出
SubPrintResult()'平差结果输出
DimoutstringAsString'存储保存的信息
DimqiiAsDouble,qjjAsDouble,qijAsDouble'存储法方程系数矩阵对交线上元素
Dimk1AsInteger,c1AsInteger,c2AsInteger,mlAsDouble
'ml存储观测高程中误差,m_mu单位权中误差
="AllFiles(*.*)|*.*|TextFiles(*.txt)|*.txt|BatchFiles(*.bat)|*.bat"
If<>"*.txt"And
<>""Then
OpenForOutputAs#1
outstring=Space(10)&String(4,"=")+"高程平差值及其精度"+String(4,"=")+vbCrLf
Print#1,outstring
Print#1,"点名近似高程改正数高程平差值中误差"+vbCrLf
outstring=""
Fork1=1Tom_Pnumber-m_knPnumber
outstrin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 实验 报告