测绘程序设计课程实习报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

一、实习目的在测绘工作与科学研究中,很多情况都需要用计算机,测绘工程所涉及的数据计算、绘图、数据库管理、数据分析等,都可以用计算机来完成。因此,本次课程实习的内容主要集中在测绘工程的相关计算上,其中,主要学习关于平差计算的程序设计问题上。实习目的在于增强我们对误差理论与测量平差基础理论的理解,牢固掌握测量平差的基本原理和基本公式,熟悉测量数据处理的基本技能和计算方法,灵活准确地应用于解决各类数据处理的实际问题,并能用所学的计算机理论知识,编制简单的计算程序。二、实习内容(一)高级程序语言应用1.编译软件安装,输出“Hello,World”2.角度与弧度互化3.文件读写操作4.矩阵加、减、乘及转置程序5.矩阵求逆程序(二)测量平差模型实现1.间接平差模型公式及程序实现,实例验证。2.条件平差模型公式及程序实现,实例验证。(三)测量综合实例解算1.水准网平差三、实习过程(一)实习1(角度与弧度互化)1.准备(1)第一步分析设计:使用double类型数据表示角度制数和弧度制数。例如:120度40分56秒,用double类型表示为120.4056,其中分、秒根据小数位确定。(2)第二步角度化为弧度的公式为:弧度值=角度值/180×π,角度值=弧度值×180÷π2.实现编写代码,实现角度与弧度互化功能。3.改善角度转换过程中需要考虑角度的正负号问题,角度转化可以添加是否超过59的判断。4.计算结果(二)实习2(文件读写操作)1.准备C++文件流:fstream文件流,ofstream输出文件流,ifstream输入文件流。在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:voidopen(constchar*filename,intmode,intaccess);参数:filename:要打开的文件名mode:要打开文件的方式access:打开文件的属性打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:ios::app:以追加的方式打开文件ios::ate:文件打开后定位到文件尾,ios:app就包含有此属性ios::binary:以二进制方式打开文件,缺省的方式是文本方式。ios::in:文件以输入方式打开ios::out:文件以输出方式打开ios::nocreate:不建立文件,所以文件不存在时打开失败ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败ios::trunc:如果文件存在,把文件长度设为0可以用“或”把以上属性连接起来,如ios::out|ios::binary打开文件的属性取值是:0:普通文件,打开访问1:只读文件2:隐含文件4:系统文件可以用“或”或者“+”把以上属性连接起来,如3或1|2就是以只读和隐含属性打开文件。例如:以二进制输入方式打开文件c:\config.sysfstreamfile1;file1.open(c:\\config.sys,ios::binary|ios::in,0);如果open函数只有文件名一个参数,则是以读/写普通文件打开,即:file1.open(c:\\config.sys);=file1.open(c:\\config.sys,ios::in|ios::out,0);另外,fstream还有和open()一样的构造函数,对于上例,在定义的时侯就可以打开文件了:fstreamfile1(c:\\config.sys);特别提出的是,fstream有两个子类ifstream(inputfilestream)和ofstream(outputfilestream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。ifstreamfile2(c:\\pdos.def);//以输入方式打开文件ofstreamfile3(c:\\x.123);//以输出方式打开文件所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。2.实现编写代码,实现从一个文本文件中读取矩阵,并输出矩阵在另一个文本文件中。(三)实习3(概率计算)1.准备(1)第一步误差检验时,需要用到一些数学方面的函数。有如下函数:正态分布函数、F分布函数、t分布函数及chi2分布函数。函数的定义及代码等由老师给出。我们只需要调用函数进行计算。(2)第二步函数调用:调用函数前先要在主调函数中声明函数原型。按如下形式声明:类型说明符被调函数名(含类型说明的形参表)如果是在所有函数之前声明了函数原型,那么该函数原型在本程序文件中任何地方都有效,也就是说在本程序文件中任何地方都可以依照该原型调用相应的函数。如果是在某个主调函数内部声明了被调函数原型,那么该原型就只能在这个函数内部有效。声明了函数原型之后,以如下形式调用子函数:函数名(实参列表)实参列表中应给出与函数原型形参个数相同、类型相符的实参。函数调用可以作为一条语句,这时函数可以没有返回值。函数调用也可以出现在表达式中,这是就必须有一个明确的返回值。与变量的声明和定义类似,声明一个函数只是将函数的有关信息(如函数名、参数、返回值类型等)告诉编译器,此时并不产生任何代码;定义一个函数时除了同样要给出函数的有关信息外,主要是写出函数的代码。2.编写代码3.运行结果(四)实习4(矩阵的基本运算)1.准备(1)第一步为实现矩阵的加、减、乘、转置、赋值运算必须弄清楚矩阵的具体运算规则。①矩阵的加减法运算:矩阵的加减法必须俩个矩阵的行列数相同,然后对应位置的行列进行相加减。②矩阵的乘法运算:矩阵的乘法运算必须运算的矩阵的第一个矩阵的列数与运算的第二个矩阵的行数相同,否则不能运算。运算时,第一个矩阵的第i行第j列的数与第二个矩阵第i列元素分别相乘为新矩阵的第i行第j列的数。③矩阵的赋值运算:矩阵的赋值运算即俩个矩阵的元素完全相同。④矩阵的转置运算:矩阵的转置运算即为转置前的第i行第j列的数即为转置后的矩阵的第j行第i列的数。(2)第二步引用:引用是对一个变量取的别名,也就是给一个变量取的第二个名字。例如:inti;int&j=i;这里,i是一个变量,定义j为i的引用。系统不再为j分配存储空间,而让j与i使用相同的存储空间。这时,在程序中任何对j的访问就是对i的访问。引用的主要作用在于函数参数的传递,也就是定义函数的参数为引用类型。矩阵的动态存储:new和delete操作符New用来动态分配存储空间,delete用来释放new分配的空间。①new的语法格式:类型指针=new类型(类型初始化值);类型可以是系统定义的基本数据类型,也可以是用户定义的结构体或者类。例如:int*s=newint;double*p=newdouble(3.1415926);double*A=newdouble[100];动态分配了一个整形存储空间,并把地址返回给s;动态分配一个double类型空间,初始化为3.1415926,并把地址返回给p,动态分配一个double类型数组空间,并把地址返回给A。这些动态分配的空间从分配后开始存在,知道delete释放它们。②delete的语法格式:delete类型指针;对于上面的动态空间,可以这样释放:deletes;deletep;delete[]A;释放数组空间时不用给出数组的大小。(3)第三步①类的说明:类描述了具有共同特征的一组对象,这组对象的属性和行为相同,只不过具体对象的属性值等有所区别。C++中类的定义一般分为类的说明部分和类的实现部分。其中类说明的格式如下:classClassName{private:私有数据和函数public:受保护数据和函数};其中,class是关键字。<ClassName>是用户自定义的C++标识符,VisualC++中类名的风格是所有类的名字都以大写字母C开头,表示这是个类的名字,例如CBOOK,CStudent等。被花括号括起来的部分称作类体。注意,类说明是以分号作为结束的。类体主要由一些变量和函数说明组成,分别称为类的数据成员和函数成员,统称为类成员。它们被分成3类,一类叫做公有成员,一类叫做私有成员,另一类叫做受保护成员,分别由关键字public,private和protected指明,这几个关键字被称为访问说明符(accessspecifier),用来控制相应成员在程序中的可访问性,使得信息封装和模块化的风格更好。访问说明符说明了对该说明符与下一个说明符之间出现的类成员的访问限制。类体中可以出现多个说明符,每个说明符也可出现多次,不同说明符的出现次序没有限制。当从类体开始处到某些类成员前没有访问说明符,或类体中根本没有访问说明符时,这些成员被默认是私有成员。除了类的友元可以访问类的任何成员外,类的私有成员只能被其自身成员所访问。即私有成员的名字只能出现在所属类类体、成员函数中,不能出现在其他函数中;而对于一个类的公有成员而言,在程序的任何位置都能够以正确的方式引用它;类的保护成员只能在该类的派生类类体中使用。②成员函数的定义:成员函数的定义格式如下:ReturnTypeClassName::FunctionName(ArgumentList){...}与一般函数定义不同的是这里多出了类名ClassName>和域运算符::用来指明所定义的函数属于哪个类,这是必需的,因为不同类中的成员函数可能重名,这种情况在客观世界中十分常见,不指定成员函数所属的类就无法知道要定义的是哪一个类的成员函数。花括号括起来的部分是函数体,它属于类体的一部分,其中可以直接调用类的所有成员,就如同它们是在函数体内定义的自动变量一样,包括数据成员和成员函数,而不用再显式地指明所属类体。注意,在函数中所调用的属性和其他成员函数为当前对象所具有的属性和成员函数。③本代码通过矩阵类Matrix来实现,并运用Matrix类的重载做运算。Matrix的数据成员有:行line、列col、指向矩阵的元素的指针int*elems。它的成员函数有:①构造函数;②析构函数;③复制构造函数;④对属性进行修改的set方法;⑤对属性进行读取的get方法;⑥对Matrix进行重载加运算符;⑦对Matrix进行重载减运算符;⑧对Matrix进行重载乘运算符;⑨对Matrix进行重载转置运算符;⑩对Matrix进行重载赋值运算符;④构造函数:构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态。构造函数也是类的一个成员函数,除了具有一般成员函数的特征外,还有一些特殊性质:构造函数的函数名与类名相同,而且没有返回值,构造函数通常被声明为公有函数。只要类中有了构造函数,编译器就会在建立新对象的地方自动插入对构造函数的调用代码。2.实现编写程序,实现矩阵的基本运算。3.总结在编写过程中,遇到的主要问题是指针方面的。以下,总结出一些关于指针的知识。指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。例:(1)int*ptr;(2)char*ptr;(3)int**ptr;(4)int(*ptr)[3];(5)int*(*ptr)[4];a.指针的类型从语法的角度看,只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。例子中各个指针的类型:(1)int*ptr;//指针的类型是int*(2)char*ptr;//指针的类型是char*(3)int**ptr;//指针的类型是int**(4)int(*ptr)[3];//指针的类型是int(*)[3](5)int*(*ptr)[4];//指针的类型是int*(*)[4]b.指针所指向的类型当你通过指针来访问指针所指向的内存区时,指针所指向的类型决

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功