测绘常用程序C语言

合集下载

2015测绘程序实习报告

2015测绘程序实习报告

测绘程序设计(C版)实习报告学号:姓名:班级:专业:测绘工程课程名称:测绘程序设计(C及Matlab)指导老师:肖根如2015年12月目录1.实习目的.......................... 错误!未定义书签。

2.实习内容.......................... 错误!未定义书签。

2.1 实习环境.................. 错误!未定义书签。

2.2 实习主要内容介绍.. 错误!未定义书签。

2.2.1 算法 ................. 错误!未定义书签。

2.2.2 角度转换 (5)2.2.3 初始化 (5)2.2.4 输入 (7)2.2.5 选择结构 (7)2.2.6循环结构 (9)2.2.7数组 (10)2.2.8函数 (12)2.2.9数组函数 (13)2.2.10 结构体 (14)2.2.11文件 (16)2.2.12指针 (18)3.实习体会 (22)1.实习目的:(1)熟悉我们自己所用的计算机的C语言开发环境,并且能够熟练掌握,达到错误能找到原因并且加以改正。

(2)加深对课本理论知识的理解,进一步掌握书中重点、难点实例,锻炼自己的编写程序能力和实际应用能力。

(3)上机调试程序的过程中,发现错误,解决错误,保证程序的正确运行,运行结果与给定结果完全相同。

(4)学会用书中基本知识解决测量计算中的一些问题,将书本所学的内容与实际操作相结合,掌握把实际问题转变为C语言描述的算法的方法,明确思路。

将自身的不足与缺陷改掉,养成良好编辑风格。

(5)培养我们的主观能动性、沟通、表达能力和团队合作意识,为我们以后的发展打下基础。

2.实习内容2.1实习环境:笔记本电脑一台,《C程序设计》一本,《数字测图原理与方法》一本。

2.2实习主要内容介绍2.2.1算法:算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

测绘程序设计

测绘程序设计

测绘程序设计通过了六周的课程设计,在我们学习完测绘程序设计基础、测量学、测量平差的基础等课程上,通过课程的设计、制定详细的程序设计计划,编码等环节,进一步巩固了我们在这两年多的时间里所学习的知识,做到学以致用,并培养我们对于测绘的综合应用能力,使我们真正地学会自主学习,学会自主处理解决问题的能力。

作为一个测绘工作者,测量过程中免不了要做一些平差的计算,如果遇到测量值较多的平差,则使计算简直成了一种煎熬。

随着电子计算机的出现,数学计算变得简单了很多,同时也使测量平差作业模式发生了翻天覆地的变化,把平差计算者从繁重的、枯燥乏味的数字计算中彻底解放了出来。

学会平差程序设计,可以帮助我们更加灵活的使用计算机来帮助我们做平差处理以及其他的测量计算。

1、角度弧度的相互转化程序;要求屏幕输入角度值或弧度值,将其转化为弧度值或角度值,实现互换。

键盘输入正、负角度,及弧度(弧度没有正负之分),计算实例,检验程序正确与否。

2、文件输入输出;3、矩阵的加减乘;4、条件平差、间接平差的计算;要求首先运用c++语言或c 语言编写程序,首先实现矩阵的加、减、乘、转置的基本运算,以及矩阵求逆运算,然后在文本中读写相关变量数据,根据条件平差和间接平差的基本公式,求出改正数、中误差及高程平差值,并输出到文本中。

具体算例中,条件平差与间接平差的文件书写不同,需分别写在不同的文件中,分别读取。

5、水准网的平差计算。

要求设计平差类,根据水准网平差计算内容及步骤定义平差类成员变量及成员函数,所需数据全部从文件中读取,全部数据存于同一个文件中,并以文本格式保存,文件格式的设计就是规定数据文件中包含的内容、各类数据的先后以及各种数据的书写格式。

数据存储方案设计,将磁盘中的数据读到内存中,按照不同的类别有序地放在变量或数组中,然后进行平差计算,最后将计算结果写到磁盘文件中。

1.老师讲解角度、弧度之间互相转化的计算方法以及注意事项,特别提及角度或弧度为负数的情况。

C语言测量平差课程设计

C语言测量平差课程设计

C语言测量平差课程设计一、课程目标知识目标:1. 让学生掌握C语言中常用的数据类型、运算符和语法结构,并能将其应用于测量平差计算中。

2. 使学生了解测量平差的基本原理和常用算法,如最小二乘法等。

3. 帮助学生理解C语言在解决测量平差问题中的优势,如计算速度和精度。

技能目标:1. 培养学生运用C语言进行测量平差计算的能力,能独立编写、调试和优化相关程序。

2. 提高学生分析测量数据、选择合适算法解决问题的能力。

3. 培养学生团队合作精神和沟通能力,能共同完成测量平差项目。

情感态度价值观目标:1. 激发学生对测量平差和C语言的兴趣,培养主动学习和探究的精神。

2. 引导学生关注测量平差在工程、科研等领域的应用,认识到所学知识的社会价值。

3. 培养学生严谨、求实的科学态度,遵循学术道德,尊重他人成果。

本课程针对高年级学生,课程性质为理论与实践相结合。

在分析课程性质、学生特点和教学要求的基础上,将课程目标分解为具体的学习成果,为后续的教学设计和评估提供依据。

通过本课程的学习,学生将能够运用所学知识解决实际问题,提高C语言编程能力和测量平差理论水平。

二、教学内容1. C语言基础回顾:数据类型、变量、运算符、控制结构、函数等基本概念,重点复习数组、指针和结构体。

教材章节:第一章至第三章2. 测量平差基本原理:介绍测量平差的定义、目的、数学模型和常用算法(如最小二乘法)。

教材章节:第四章3. C语言实现测量平差算法:结合实际案例,讲解如何使用C语言编写测量平差程序。

教材章节:第五章4. 程序设计与调试:介绍编程规范,演示调试技巧,分析常见错误。

教材章节:第六章5. 测量平差实际应用:分析实际测量数据,运用所学知识解决具体问题。

教材章节:第七章6. 项目实践:分组进行项目设计,完成测量平差程序编写、调试和优化,撰写项目报告。

教材章节:第八章教学内容安排和进度:1. 第1周:C语言基础回顾。

2. 第2周:测量平差基本原理。

测绘程序设计实验报告

测绘程序设计实验报告

测绘程序设计(C版)实习报告学号:201420050138姓名:李阳靖班级:1420501Z专业:测绘工程课程名称:测绘程序设计(C及Matlab)指导老师:肖根如2015年12月目录前言1一、实验目的1二、实验环境2三、Turbo C 3.0与VC++6.0的熟悉与操作2四、实验内容梗概3五、实验具体内容4实验一算法4实验二数据类型、运算符和表达式5实验三控制语句6实验四函数9实验五数组11实验六结构体与共用体12六、常见错误及分析14七、程序调试15八、实验心得与体会17九、附录:实习程序设计清单21.、八、-刖言现代科学飞速发展,世界也不断的变化,人类的生活随着科技的发展也发生着惊天动地的变化。

作为新时代的大学生,我们应该不断努力学习科学文化知识,以适应社会的发展要求,以现代化的科学知识为祖国做贡献。

而C语言作为一种计算机语言,无疑是我们将来工作不可缺少的一门技能,所以我们应该认真学好C语言。

但只是课本上的知识是不够的,我们应该将从课本上学到的理论知识应用到实践中,通过不断的实践,在实践中发现错误解决错误,并不断创新,最后能熟练的运用所学的知识,充分掌握这种工具。

C语言知识博大精深,有必要对C语言的专著进行研究学习,多阅读别人的程序代码、多动手实践操作与设计,这样便对程序算法精简改进提供了可能。

想学的更深更透彻的话就必须进一步掌握运用C进行程序设计的能力;进一步理解和运用面向过程程序设计的思想和方法;初步掌握开发一个小型实用系统的基本方法;学会调试一个较长程序的基本方法;学会利用互联网查找相关的知识并学习;学海之路何其宽广,有必要让我们孜孜不倦的求索下去。

一、实验目的C语言程序设计实习是在学习《C语言程序设计》理论知识的基础上进行的实践教学环节,其目的是培养我们具有初步的C语言程序设计、编程、调试和排除C语言程序语法、逻辑错误的能力。

全面熟悉、掌握C语言基本知识,掌握C程序设计中的顺序、分支、循环三种结构及数组、函数和C语言基本图形编程等方法,把编程和实际结合起来,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和规范编程的思想,为以后在专业课程中应用计算机系统解决计算、分析、实验和设计等学习环节打下较扎实的基础。

测绘程序设计实验指导书1

测绘程序设计实验指导书1

《测绘程序设计》实验指导书华北科技学院土木工程系测绘工程教研室2010年8月实验一:线性方程组解算一、实验目的与要求⒈初步掌握线性方程组的算法;⒉初步掌握线线性方程组在计算机上实现方法。

二、实验安排⒈实验共需用2学时。

⒉实验每个小组1人,用C/VB等语言在计算机上完成程序代码的编写,并调试通过,然后用算例印证程序的正确性。

三、实验步骤及要点⒈在课余时间,提前准备线性方程组解算程序代码;⒉上机时写入代码,并调试运行;⒊用算例进行印证。

四、实验指导(一)Turbo C工作环境一个C语言程序的实施是从进入Turbo C的集成环境开始的,而进入C语言的环境,一般有两种途径:从DOS环境进入和从Windows环境进入。

1、从DOS环境进入:在DOS命令行上键入:C>CD \TC↙(指定当前目录为TC子目录)C>TC↙ (进入Turbo C环境)这时进入Turbo C集成环境的主菜单窗口,屏幕显示如下图所示。

2、从Windows环境进入:在Windows 95/98环境中,如果本机中已安装了Turbo C,可以在桌面上建立一个快捷方式,双击该快捷图标即可进入C语言环境。

或者从开始菜单中找到“运行”,在运行对话框中键入“C:\TC\TC”,“确定”即可。

刚进入TC环境时,光带覆盖在“File”上,整个屏幕由四部分组成,依次为:主菜单、编辑窗口、信息窗口和功能提示行(或称快速参考行)。

(1)主菜单显示屏的顶部是主菜单条,它提供了8个选择项:File 处理文件(装入、存盘、选择、建立、换名存盘、写盘),目录操作(列表、改变工作目录),退出Turbo C,返回DOS 状态。

Edit 建立、编辑源文件。

Run 自动编辑、连接并运行程序。

Compile 编辑、生成目标文件组合成工作文件。

Project 将多个源文件和目标文件组合成工作文件。

Option 提供集成环境下的多种选择和设置(如设置存储模式、选择编参数、诊断及连接任选项)以及定义宏;也可记录Include、Output及Library文件目录,保存编译任选项和从配置文件加载任选项。

【精品】测绘程序设计

【精品】测绘程序设计

测绘程序设计课程实习报告一、实习目的《测量平差程序设计》是在我们学习了专业基础课《误差理论与测量平差基础》课程后将测量平差和计算机程序设计等课程的综合实践与应用的一门课程。

其目的是在我们学习过平差这门课后增强我们对误差理论与测量平差基础理论的理解,巩固已掌握的测量平差的基本原理和基本公式以及计算方法,熟悉测量数据处理的基本技能,培养我们正确应用公式、综合分析问题和解决问题的能力,并能能够熟练运用所学过的C++语言,使平差理论与计算机结合起来,将主要的条件平差、间接平差以及水准网平差计算方法过程编写成一般形式的程序用于数据处理,灵活准确的应用于解决各类数据处理的实际问题当中,为我们今后步入工作岗位打下了一定的基础。

二、实习内容本课程要求我们熟练运用测量平差的基本公式与计算方法和拥有基本的C++编程能力,以自由组成3-4人小组的方式共同学习,在老师的指导下能够按照要求由简至繁完成以下程序。

(一)角弧之间的相互转化复习基本的C++内容、程序结构及编写方法,保证任意角度弧度之间可转化及其转化精度。

(二)文件的读入输出在程序外部建立文本文档输入数据使程序具有一般性并且不需要在执行程序时进行输入,同时在程序运行后结果自动生成文件保存。

(三)概率运算根据已知题目以及程序进行加以更改调试,建立文本文档读入文件计算标准正态分布函数、B分布的分布函数等概率函数。

(四)矩阵运算实现矩阵的基本加、减、乘、转置及求逆运算,为接下来平差运算程序解决基本运算问题。

(五)条件平差与间接平差利用之前以编写过的基本程序,以及平差的公式与算法,根据例题编写程序计算条件平差与间接平差(二者具有一定相似度)。

(六)水准网平差首先利用已知的例题以及水准网计算公式和算法编写特殊可解的水准网平差,再在其基础上编写一般形式具有广泛应用的普通程序。

在将以上基本任务都完成之后还可以进一步编写GPS向量网等。

三、实习过程(一)角弧之间的相互转化1.编程思路:首先在头文件中要注明#include<cmath>保证程序中的数学运算合理,然后建立一个角度是否合理判断的函数,在其中将角度的度、分、秒分别用三个double型变量a、b、c表示,将输入或计算出的角度改正成合理的形式(分和秒都小于60大于0),如将30°66´27"化成31°6´27"以及角度的正负。

7个大一C语言必学的程序C语言经典代码大全

7个大一C语言必学的程序C语言经典代码大全7个大一C语言必学的程序C语言是计算机专业的基础语言之一,作为大一新生,学好C语言对于你未来的学习和工作都非常重要。

以下是7个大一C语言必学的程序,通过学习和理解这些经典代码,你将对C语言的基础知识有更深入的了解,并能够应用到实际的编程中。

程序一:Hello World#include <stdio.h>int main() {printf("Hello World!\n");return 0;}这是C语言中最经典的程序,它将在屏幕上打印出"Hello World!"。

通过这个简单的程序,你将学会如何使用printf函数打印输出,并理解main函数的作用和返回值。

程序二:求和程序#include <stdio.h>int main() {int a = 10;int b = 20;int sum = a + b;printf("和为:%d\n", sum);return 0;}这个程序演示了如何进行加法运算,并将结果打印输出。

通过这个程序,你将学会如何定义变量,使用赋值运算符,并理解printf函数的格式化输出。

程序三:判断奇偶数#include <stdio.h>int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (num % 2 == 0) {printf("%d是偶数。

\n", num);} else {printf("%d是奇数。

\n", num);}return 0;}这个程序演示了如何判断一个整数是奇数还是偶数。

通过这个程序,你将学会如何使用if语句进行条件判断,并了解scanf函数的使用方法。

c语言入门程序讲解

c语言入门程序讲解C语言是一种高级编程语言,它是许多编程领域首选的语言之一。

其灵活性和可读性使得C语言成为了开发各种应用程序的首选语言之一。

以下是一些基础的C语言入门程序讲解:1. Hello World程序#include<stdio.h>int main(){printf('Hello World!');return 0;}这是最基础的C语言程序,它的作用是输出一句话“Hello World!”。

printf函数是C语言内置的输出函数,它可以输出各种类型的数据,这里使用的是%s占位符来输出字符串。

2. 求两个数的和#include<stdio.h>int main(){int a,b,sum;scanf('%d %d',&a,&b);sum=a+b;printf('The sum of %d and %d is %d',a,b,sum);return 0;}这个程序的作用是输入两个数,然后输出它们的和。

scanf函数是C语言内置的输入函数,它可以输入各种类型的数据,这里使用的是%d占位符来输入整数。

在计算完成后,使用printf函数输出结果。

3. 求一个数的平方#include<stdio.h>int main(){int n;scanf('%d',&n);printf('%d的平方是%d',n,n*n);return 0;}这个程序的作用是输入一个数,然后输出它的平方。

使用变量n来存储输入的值,在printf函数中直接输出n*n的结果。

以上是三个基础的C语言入门程序示例,它们可以帮助你了解C语言的基础语法和函数的使用。

继续学习C语言,你将会掌握更多强大的编程技巧和应用程序开发的技术。

(整理)测绘程序设计

测绘程序设计课程实习报告一、实习目的《测量平差程序设计》是在我们学习了专业基础课《误差理论与测量平差基础》课程后将测量平差和计算机程序设计等课程的综合实践与应用的一门课程。

其目的是在我们学习过平差这门课后增强我们对误差理论与测量平差基础理论的理解,巩固已掌握的测量平差的基本原理和基本公式以及计算方法,熟悉测量数据处理的基本技能,培养我们正确应用公式、综合分析问题和解决问题的能力,并能能够熟练运用所学过的C++语言,使平差理论与计算机结合起来,将主要的条件平差、间接平差以及水准网平差计算方法过程编写成一般形式的程序用于数据处理,灵活准确的应用于解决各类数据处理的实际问题当中,为我们今后步入工作岗位打下了一定的基础。

二、实习内容本课程要求我们熟练运用测量平差的基本公式与计算方法和拥有基本的C++编程能力,以自由组成3-4人小组的方式共同学习,在老师的指导下能够按照要求由简至繁完成以下程序。

(一)角弧之间的相互转化复习基本的C++内容、程序结构及编写方法,保证任意角度弧度之间可转化及其转化精度。

(二)文件的读入输出在程序外部建立文本文档输入数据使程序具有一般性并且不需要在执行程序时进行输入,同时在程序运行后结果自动生成文件保存。

(三)概率运算根据已知题目以及程序进行加以更改调试,建立文本文档读入文件计算标准正态分布函数、B分布的分布函数等概率函数。

(四)矩阵运算实现矩阵的基本加、减、乘、转置及求逆运算,为接下来平差运算程序解决基本运算问题。

(五)条件平差与间接平差利用之前以编写过的基本程序,以及平差的公式与算法,根据例题编写程序计算条件平差与间接平差(二者具有一定相似度)。

(六)水准网平差首先利用已知的例题以及水准网计算公式和算法编写特殊可解的水准网平差,再在其基础上编写一般形式具有广泛应用的普通程序。

在将以上基本任务都完成之后还可以进一步编写GPS向量网等。

三、实习过程(一)角弧之间的相互转化1.编程思路:首先在头文件中要注明#include<cmath>保证程序中的数学运算合理,然后建立一个角度是否合理判断的函数,在其中将角度的度、分、秒分别用三个double型变量a、b、c表示,将输入或计算出的角度改正成合理的形式(分和秒都小于60大于0),如将30°66´27"化成31°6´27" 以及角度的正负。

ntripclient c代码

ntripclient c代码一、概述ntripclient是一个用于实现NTRIP协议的C语言客户端程序。

NTRIP 协议是一种网络传输实时差分GPS数据的协议,主要用于实时获取GPS数据以进行精准定位。

在实际应用中,需要使用C语言编写ntripclient程序来实现NTRIP协议的数据传输和处理,以达到获取精准GPS数据的目的。

二、ntripclient的代码结构1. 主函数主函数是ntripclient程序的入口,负责程序的初始化和执行流程的控制。

主函数首先对程序进行初始化,包括初始化网络连接、设置传输参数等。

然后进入主循环,不断接收服务器端发送过来的数据,并进行处理。

主函数是整个程序的核心,负责协调各个模块的工作。

2. 网络连接模块网络连接模块负责与NTRIP服务器建立连接,并进行数据的传输。

该模块包括网络初始化、连接建立、数据发送和数据接收等功能。

在建立连接时,需要进行身份验证和协议协商。

数据传输过程中需要处理网络异常和错误,保证数据传输的稳定性和可靠性。

3. 数据处理模块数据处理模块负责对从NTRIP服务器接收到的数据进行处理和解析。

NTRIP协议中的数据格式较为复杂,包括RINEX格式的GPS观测数据和NTRIP协议的控制信息。

数据处理模块需要解析RINEX格式的数据,提取GPS观测数据并进行相应的处理;同时还需要解析NTRIP 控制信息,包括校验和认证等。

4. 错误处理模块错误处理模块负责处理程序运行过程中的各种错误和异常。

包括网络连接错误、数据解析错误、协议协商错误等。

错误处理模块需要对错误进行分类,采取相应的措施来处理错误,保证程序的稳定性和可靠性。

5. 日志记录模块日志记录模块负责记录程序运行过程中的关键信息和调试信息。

通过日志记录,可以方便地追踪程序的执行流程和排查问题。

日志记录模块一般包括日志文件的创建、打开、写入和关闭等功能。

三、ntripclient的使用方法1. 下载ntripclient源代码ntripclient的源代码可以从开源软件库或冠方全球信息站上下载获取,通常以压缩包的形式进行发布。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

测量平差程序设计1.角度(度分秒)到弧度AngleToRadian#define PI 3.14159265double AngleToRadian(double angle){int D,M;double S,radian,degree, angle,MS;D=int(angle+0.3);MS=angle-D;M=int((MS)*100+0.3);S=(MS*100-M)*100;degree=D+M/60.0+S/3600.0;radian=degree*PI/180.0;return radian;}注意:防止数据溢出,要加个微小量,例如0.3.2.弧度换角度(度分秒) RadianToAngle#define PI 3.14159265double RadianToAngle(double radian){int D,M;double S,radian,degree,MS,angle;degree=radian*180/PI;D=int(degree);MS=degree-D;M=int(MS*60);S=(MS*60-M)*60;angle=D+M/100.0+S/10000.0;return angle;}3.已知两点求坐标方位角Azimuth#include <math.h>double Azimuth(double xi,double yi,double xj,double yj) {double Dx,Dy,S,T;Dx=xj-xi;Dy=yj-yi;S=sqrt(Dx*Dx+Dy*Dy);if(S<1e-10) return 0;T=asin(Dy/S);if(Dx<0) T=PI-T;if(Dx>0&&(Dy<0)||T<0) T=2*PI+T;return T;}4.开辟二维数组的动态空间的宏#include <malloc.h>#define NewArray2D(type,A,i,n,m){A=(type**)malloc(n*sizeof(type*));\for(i=0;i<m;i++)\A[i]=(type*)malloc(m*sizeof(type));\}5.释放开辟的二维数组的空间#define FreeSpace(A,i,m){for(i=0;i<m;i++)\free(A[ i]);\free(A);\}注意:释放空间与开辟空间相反,释放空间是先释放列,后释放行.6.矩阵求转置transformmatrixvoid transformmatrix(double **A,double **B,int i,int j){int m,n;for(m=0;m<=i;m++)for(n=0;n<=j;n++){B[n][m]=A[m][n]:}}7.矩阵相乘(mulmatrix)void mulmatrix(double **A,double **B,double **C,int i,int j,int k) {int m,n,p;for(m=0;m<i;m++)for(n=0;n<j;n++){C[m][n]=0;for(p=0;p<k;p++){C[m][n]+=A[m][p]*B[p][n]:}}}8.矩阵求逆(countermatrix)#include <math.h>void countermatrix(double **T, double **s, double **r, double **Q,double **N, double **rt,int n){for(i=0;i<n;i++){s=N[i][i];for(k=0;k<i;k++){s-=T[k][i]*T[k][i];}T[i][i]=sqrt(s)for(j=i+1;j<n;j++){s=N[i][j];for(k=0;k<i;k++){s-=T[k][i]*T[k][j];}T[i][j]=s/T[i][i];}}for(i=0;i<n;i++)for(j=0;j<n;j++){T[i][j]=0;}for(i=n-1;i>=0;i++){r[i][i]=1/T[i][i];for(j=i+1;j<n;j++){s=0;for(k=i;k<j-1;k++){s-=r[i][k]*T[k][j];}r[i][j]=s/T[i][i];}}for(i=0;i<n;i++)for(j=0;j<n;j++){r[i][j]=0;}transformmatrix(r,rt,n,n)mulmatrix(r,rt,Q,n,n)}9.平差主程序之读入数据typedef struct POINT{char name[8];double x,y;int type;}POINT;typedef struct READV ALUE{POINT *begin;POINT *end;double value;}READV ALUE;POINT *GETPOINT(char *name,POINT *pPoint,int nPoint) {int i;for(i=0;i<nPoint;i++){if (strcmp(pPoint[i].name,name)==0)return (pPoint+i)}for(i=0;i<nPoint;i++){if(pPoint[i]=NULL)strcmp(pPoint[i].name,name);pPoint[i].type=0;return(pPoint+i);}}double AngleToRadian(double angle){int D,M;double S,radian,degree, angle,MS;D=int(angle+0.3);MS=angle-D;M=int((MS)*100+0.3);S=(MS*100-M)*100;degree=D+M/60.0+S/3600.0;radian=degree*PI/180.0;return radian;}main(){POINT *pPoint=NULL;READV ALUE *pDirect=NULL;READV ALUE *pDistance=NULL;int nPoint,nKnownPoint,nDirect,nDistance,i;double mo,mf,ms;char begin[8],end[8];FILE *fp=0;fp=fopen(“c:\\dat\\t1.txt”,”r”)fscanf(fp,”%d,%d,%d,%d\n”,&nPoint,&nKnowPoint,&nDirect,&nDistance) if(nPoint>0)pPoint=(POINT*)malloc(nDirect*sizeof(POINT));if(nDirect>0)pDirect=(READV ALUE*)malloc(nDirect*sizeof(READV ALUE));if(nDistance>0)pDistance=(READV ALUE*)malloc(nDistance*sizeof(RAADV ALUE));fscanf(fp,”%lf,%lf,%lf\n”,&mo,&mf,&ms);for(i=0;i<nKnownPoint;i++){fscanf(fp,”%s,%lf,%lf\n”,pPoint[i].name,&pPoint[i].x,&pPoint[i].y);type=1;}for( ;i<nPoint;i++){pPoint[i].name=NULL;pPoint[i].x=0;pPoint[i].y=0;pPoint[i].type=0;}for(i=0;i<nDirect;i++){fscanf(fp,”%s,%s,%lf\n”,begin,end,&pDirect[i].value);pDirect[i].begin=GetPoint(begin,pPoint,nPoint);pDirect[i].end=GetPoint(end,pPoint,nPoint);}for(i=0;i<nDistance;i++){fscanf(fp,”%s,%s,%lf\n”,begin,end,&pDistance[i].value);pDistance[i].begin=GetPoint(begin,pPoint,nPoint);pDistance[i].end=GetPoint(end,pPoint,nPoint);}fclose(fp);}10.角度检验(checkangle)#include <math.h>int checkangle(double angle){int M,S;double MS;if(angle>=0&&angle<360){MS=angle-(int)(angle);if(M<6){S=(int)(MS*1000);if(S%10<6){return 1;}}}return 0;}11.前方交会#define PI=3014159265/***此处调用程序角度换弧度AngleToRadian***/Qianfang(double XE, double YE, double XF, double YF, doubleDEG, double DEF, double DFG, double DFE, double *DFE, double *DFG){double C,A,B;C=DGE-DGF;A=DEF-DEG;B=DFG-DFE;if((C<-PI&&C>-2*PI)||(C>0&&C<PI){XG=(XE/tan(B)+XF/tan(A)-YE+YF)/(1/tan(A)+ 1/tan(B);YG=(YE/tan(B)+YF/tan(A)+XE-XF)/ (1/tan(A)+ 1/tan(B);}if((C>-PI&&C<0)||(C>PI&&C<2*PI)){XG=(XE/tan(B)+XF/tan(A)+YE-YF)/(1/tan(A)+ 1/tan(B);YG=(YE/tan(B)+YF/tan(A)-XE+XF)/ (1/tan(A)+ 1/tan(B);}}12.坐标概算全方向法子函数取出观测方向GetAllDirectint GetAllDirect(char *name,int nDirect,READV ALUE *pDirect, READV ALUE *pStation) {int i,nCount=0;for(i=0;i<nDirect;i++)if(strcmp(pDirect[i].begin->name,name)==0)){pStation[nCount].begin=p(pDirect[nCount].begin;pStation[nCount].end=p(pDirect[nCount].end;pStation[nCount].value=p(pDirect[nCount].value;nCount++;}return nCount;}坐标概算全方向法子程序实现流程(coordinate)coordinate (入口参数设置){READV ALUE pStation[50],pObject[50];int nCount,i,j,k,m,n,p,nobject;for(i=0;i<nPoint;i++){nCount=GetAllDirect(pPoint[i].name,nDirect,pStation)if((nCount>1)||( nCount=1)){for(j=0;j<nCount;j++){if(pStation[j].end->type==1){for(k=0;k<nCount;k++){if(pStation[k].end->type==0)nobject=GetAllDirect(pStation[j].end->name,nDirect,pDirect,pobject)m=-1;n=-1;for(p=0;p<nobject;p++){if(strcmp(pobject[p].end->name,pPoint[i].name)==0){m=p;}if(strcmp(pobject[p].end->name,pStation[k].end->name)==0){n=p;}if(m>=0&&n>=0){pPoint[i]=pStation[k].end-pStation[j].end;pStation[j].end=pObject[m].value-pObject[n].value;{Xe=pPoint[i].x;Ye=pPoint[i].y;Xf=pStation[j].end->x;Yf=pStation[j].end->y;Lef=pStation[j].value;Leg=pStation[k].value;Lfe=pObject[m].value;Lfg=pObject[n].value;Qianfang(Xe,Xf,Ye,Yf,Lef,Leg,Lfe,Lfg,*Xg,*Yg;)pStation[k].end->x=*xg;pStation[k].end->y=*yg;pStation[k].end.type=2;}}}}}}}}13.坐标增量法(calcoordinate)子函数由端点名称得边长值的函数GetDistancedouble GetDistance(char *begin,char *end,int nDistance,READV ALUE *pDistance){int i;for(i=0;i<nDistance;i++){if((strcmp(pDistance[i].begin->name,begin)==0&&strcmp(pDistance[i].end->name,end==0)| |(strcmp(pDistance[i].begin->name,end)==0&&strcmp(pDistance[i].end,begin)==0))return pDistance[i].value;}return -1;}/***函数取出观测方向GetAllDirect***/void calcoordinate(int nDirect,READV ALUE *pDirect,int nDistace,READV ALUE *pDistance,int nPoint,POINT *pPoint){int nPoint,nCount,nDirect,nDistance;int m=-1,i,j,k;double x1,y1,x2,y2,A0,A,S,dx,dy;READV ALUE*pDirect=NULL;READV ALUE pStation[50];for(i=0;i<nPoint;i++){if(pPoint[i].type>0){nCount=GetAllDirect(pPoint[i].name,nDirect,pDirect,pStation[50]);for(j=0;j<nCount;j++){if(pStation[j].end->type>0)m=j;if(m!=-1){for(k=0;k<nCount;k++){if(pStation[k].end->type==0){x1=pPoint[i].x;y1=pPoint[i].y;x2=pStation[j].end->x;y2=pStation[j].end->y;A0=Bearing(x1,y1,x2,y2);A=A0-(DMSToRAD(pStation[m].value)-DMSToRAD(pStation[k].value));if(A<0)A=A+2*PI;if(A>2*PI)A=A-2*PI;S=GetDistance(pPoint[i],pStation[k].end,nDistance,pDistance);if(S<0)continue;else{dx=S*cos(A);dy=S*sin(A);pStation[k].end->x=pPoint[i].x+dx;pStation[k].end->y=pPoint[i].y+dy;pStation[k].end->type=2;}}}}}}}}14.高斯正反算高斯正算:#include <math.h>#include <stdio.h>#define PI 3.14159265double DMSToRAD(double dDMS){int L1,L2;double T,L3;L1=(int)(dDMS+0.3);L2=(int)((dDMS-L1)*100+0.3);L3=((dDMS-L1)*100-L2)*100;T=(L1+L2/60.0+L3/3600.0)*PI/180.0;return T;}void PreGausePositive(double B,double L,double L0, double a, double b, double *N, double *l, double *c, double *t, double *X,double *B1){double a0,a2,a4,a6,a8,m0,m2,m4,m6,m8;double e,e1;e=(sqrt(a*a-b*b))/a;e1=(sqrt(a*a-b*b))/b;B1=DMSToRAD(B);t=tanB1;c=sqrt(e1*e1*cosB1*cos*B1);l=L-L0;N=a/(sqrt(1-e*e*sinB1*sinB1));m0=a*(1-e*e);m2=3/2*e*e*m0;m4=5/4*e*e*m2;m6=7/6*e*e*m4;m8=9/8*e*e*m6;a0=m0+m2/2+3*m4/8+5*m6/16+35*m8/128;a2=m2/2+m4/2+15*m6/32+7/16*m8;a4=m4/8+3*m6/16+7*m8/32;a6=m6/32+m8/16;a8=m8/128;X=a0*B1-a2*(sin(2*B1))/2+a4*(sin(4*B1))/4-a6*(sin(6*B1))/6+a8*(sin(8*B1))/8;}Void BLToXY(double *x,double *y,double N,double l,double c,double t,double B1,double X)x=X+N*l*l*t*cosB1*cosB1*((3+l*l*cosB1*cosB1*(5-t*t+9*c*c+4*c*c*c*c)/4+l*l*\cosB1*cosB1*(61-58*t*t+t*t*t*t)/30))/6;y=N*l*cosB1(1+l*l*cosB1*((1+c*c-t*t)+l*l*cosB1*cosB1(5-18*t*t+t*t*t*t+14*c*c\-58*t*t*c*c)));}高斯反算void XYToBL(double x,double y,double L0,double a,double b,double q,double *B,\double *L){double Bf,c,t,y,N,e1,ee=(sqrt(a*a-b*b))/(a*a);e1=(sqrt(a*a-b*b))/(b*b);for(Bf=0;;){t=tanBf;c=e1*e1*cosBf;N=a/(sqrt(1-e*e*sinBf*sinBf));B=Bf-(1+c*c)*t*y*y/(2*N*N)*(1-y*y)/(12*N*N)*(15+3*t*t+c*c-9*t*t*c*c)-y*y/ (30*N*N)*(61+90*t*t+45*t*t*t*t);if(fabs(B-Bf)<q)break;Bf=B;}L=L0+y/(N*cosBf)*(1-y*y/(6*N*N))*((1+2*t*t+c*c)-y*y/(20*N*N)*(5+6*c*c)+28*t* t+24*t*t*t*t+8*t*t*c*c)-y*y/(42*N*N)*(61+662*t*t+1320*t*t*t*t+720*t*t*t*t*t*t));B=RADToDMS(B);L=RADToDMS(L);}附录资料:不需要的可以自行删除SHA算法的实现C语言程序:#include <iostream>#include <vector> //定义vector数组#include <string> //记录消息using namespace std;const int NUM = 8; //一个字由32比特(或者8个16进制数)const int BIT = 512; //消息认证码要以512比特一组//字常量string H0 = "67452301";string H1 = "EFCDAB89";string H2 = "98BADCFE";string H3 = "10325476";string H4 = "C3D2E1F0";//定义SHA1(安全哈希算法)类class SHA1{public://将一个字符串形式的字转化为vector数组vector<int> hex_into_dec(string word);//将vector转化为string字符串形式string num_into_message(vector<int> A);//两个字X和Y的逻辑"和"vector<int> word_AND(vector<int> A,vector<int> B);//两个字X和Y的逻辑"或"vector<int> word_OR(vector<int> A,vector<int> B);//两个字X和Y的逻辑"异或"vector<int> word_XOR(vector<int> A,vector<int> B);//两个字X和Y的逻辑"补"vector<int> word_COMPLEMENT(vector<int> A);//两个字X和Y的摸2^32整数加vector<int> word_ADD(vector<int> A,vector<int> B);//将字X循环左移s个位置vector<int> ROTL(vector<int> A,int s);//SHA-1的填充方案,我们设定msg由ASCII码组成vector<vector<int> > SHA_1_PAD(string msg);//将SHA-1压成以字为单位vector<vector<vector<int> > > compress(vector<vector<int> > result);//定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出vector<int> Ft(int t,vector<int> B,vector<int> C,vector<int> D);//定义字常数Kvector<int> K(int t);//开始进行SHA-1(安全Hash算法)的加密vector<vector<int> > SHA_1(string msg);};//将vector转化为string字符串形式string SHA1::num_into_message(vector<int> A){int i;string msg = "";for(i = 0;i < A.size();i++){if(A[i] >= 0 && A[i] <= 9)msg += '0' + A[i];else if(A[i] >= 10 && A[i] <= 15)msg += 'A' + (A[i] - 10);}return msg;}//将一个字符串形式的字转化为vector数组vector<int> SHA1::hex_into_dec(string word){int i;vector<int> result(NUM,0);for(i = 0;i < NUM;i++){if(word[i] >= '0' && word[i] <= '9'){result[i] = word[i] - '0';}else if(word[i] >= 'A' && word[i] <= 'F'){result[i] = 10 + word[i] - 'A';}}return result;}//两个字X和Y的逻辑"和"vector<int> SHA1::word_AND(vector<int> A,vector<int> B) {vector<int> result(NUM,0);int i;for(i = 0;i < NUM;i++){result[i] = A[i] & B[i];}return result;}//两个字X和Y的逻辑"或"vector<int> SHA1::word_OR(vector<int> A,vector<int> B) {vector<int> result(NUM,0);int i;for(i = 0;i < NUM;i++){result[i] = A[i] | B[i];}return result;}//两个字X和Y的逻辑"异或"vector<int> SHA1::word_XOR(vector<int> A,vector<int> B) {vector<int> result(NUM,0);int i;for(i = 0;i < NUM;i++){result[i] = A[i] ^ B[i];}return result;}//两个字X和Y的逻辑"补"vector<int> SHA1::word_COMPLEMENT(vector<int> A) {vector<int> result(NUM,0);int i;for(i = 0;i < NUM;i++){result[i] = 15 - A[i];}return result;}//两个字X和Y的摸2^32整数加vector<int> SHA1::word_ADD(vector<int> A,vector<int> B) {vector<int> result(NUM,0);int i;for(i = NUM - 1;i >= 0;i--){result[i] = A[i] + B[i];if(i != 0){int temp = result[i] / 16;result[i-1] += temp;}result[i] %= 16;}return result;}//将字X循环左移s个位置vector<int> SHA1::ROTL(vector<int> A,int s){vector<int> result = A;vector<int> temp(NUM,0);int i,j;for(i = 0;i < s;i++){for(j = NUM - 1;j >= 0;j--){if(result[j] / 8 >= 1){temp[j] = 1;result[j] <<= 1;result[j] %= 16;if(j < NUM - 1)result[j] += temp[j + 1];}else if(result[j] / 8 == 0){temp[j] = 0;result[j] <<= 1;result[j] %= 16;}}result[NUM - 1] += temp[0];}return result;}//SHA-1的填充方案,我们设定msg由ASCII码组成vector<vector<int> > SHA1::SHA_1_PAD(string msg){int len = msg.length();int bit_num = len * 8;int i,j;int num,lest = bit_num % 512;if(lest != 0) //看消息长度是否超过512字节,我们需要将它补成512的倍数num = bit_num / 512 + 1;elsenum = bit_num / 512;//首先我们以8位字节为一组保存到vector里面,512比特为一组,即一组里面有64位元素vector<vector<int> > result;result.resize(num);for(i = 0;i < num;i++){result[i].resize(64);}for(i = 0;i < num;i++){for(j = 0;j < 64 && i * 64 + j < len;j++){result[i][j] = msg[i * 64 + j];}}//下面开始为未够512比特的消息分组进行补长度操作if(lest != 0){int x = num - 1,last_len = lest / 8;result[x][last_len] = 128; //先补一个"1"for(i = last_len + 1;i < 56;i++){result[x][i] = 0;}int last_l = lest;j = 63;while(j >= 56){result[x][j] = last_l % 128;last_l /= 128;j--;}}return result;}//将SHA-1压成以字为单位(三维数组有点复杂)vector<vector<vector<int> > > SHA1::compress(vector<vector<int> > result) {vector<vector<int> > rr;rr.resize(result.size());int i,j;for(i = 0;i < rr.size();i++){rr[i].resize(128);}for(i = 0;i < result.size();i++){for(j = 0;j < result[i].size();j++){rr[i][2 * j] = result[i][j] / 16;rr[i][2 * j + 1] = result[i][j] % 16;}}vector<vector<vector<int> > > rrr;rrr.resize(result.size());for(i = 0;i < rrr.size();i++){rrr[i].resize(16);}for(i = 0;i < rrr.size();i++){for(j = 0;j < 16;j++){rrr[i][j].resize(8);}}for(i = 0;i < rr.size();i++){for(j = 0;j < rr[i].size();j++){rrr[i][j / 8][j % 8] = rr[i][j];}}return rrr;}//定义ft函数,每个ft函数都有B,C,D三个字作为输入,并产生一个字作为输出vector<int> SHA1::Ft(int t,vector<int> B,vector<int> C,vector<int> D){vector<int> result;if(t >= 0 && t <= 19){vector<int> a1 = word_AND(B,C);vector<int> a2 = word_AND(word_COMPLEMENT(B),D);result = word_OR(a1,a2);}else if((t >= 20 && t <= 39) || (t >= 60 && t <= 79)){vector<int> a1 = word_XOR(B,C);result = word_XOR(a1,D);}else if(t >= 40 && t <= 59){vector<int> a1 = word_AND(B,C);vector<int> a2 = word_AND(B,D);vector<int> a3 = word_AND(C,D);vector<int> a4 = word_OR(a1,a2);result = word_OR(a4,a3);}return result;}//定义字常数Kvector<int> SHA1::K(int t){vector<int> result;if(t >= 0 && t <= 19){result = hex_into_dec("5A827999");}else if(t >= 20 && t <= 39){result = hex_into_dec("6ED9EBA1");}else if(t >= 40 && t <= 59){result = hex_into_dec("8F1BBCDC");}else if(t >= 60 && t <= 79){result = hex_into_dec("CA62C1D6");}return result;}//开始进行SHA-1(安全Hash算法)的加密vector<vector<int> > SHA1::SHA_1(string msg){vector<int> h0 = hex_into_dec(H0);vector<int> h1 = hex_into_dec(H1);vector<int> h2 = hex_into_dec(H2);vector<int> h3 = hex_into_dec(H3);vector<int> h4 = hex_into_dec(H4);vector<vector<int> > result1 = SHA_1_PAD(msg);vector<vector<vector<int> > > result2 = compress(result1);int n = result2.size();int i,j;for(i = 0;i < n;i++){vector<vector<int> > W;W.resize(80);for(j = 0;j < 16;j++){W[j] = result2[i][j];}for(j = 16;j < 80;j++){vector<int> a1 = word_XOR(W[j-3],W[j-8]);vector<int> a2 = word_XOR(a1,W[j-14]);vector<int> a3 = word_XOR(a2,W[j-16]);W[j] = ROTL(a3,1);}//将string转化为vector数组vector<int> A = hex_into_dec(H0);vector<int> B = hex_into_dec(H1);vector<int> C = hex_into_dec(H2);vector<int> D = hex_into_dec(H3);vector<int> E = hex_into_dec(H4);for(j = 0;j < 80;j++){vector<int> a1 = ROTL(A,5);vector<int> a2 = Ft(j,B,C,D);vector<int> a3 = word_ADD(a1,a2);vector<int> a4 = word_ADD(a3,E);vector<int> a5 = word_ADD(a4,W[j]);vector<int> temp = word_ADD(a5,K(j));E = D;D = C;C = ROTL(B,30);B = A;A = temp;}h0 = word_ADD(h0,A);h1 = word_ADD(h1,B);h2 = word_ADD(h2,C);h3 = word_ADD(h3,D);h4 = word_ADD(h4,E);}//返回结果(H0||H1||H2||H3||H4)vector<vector<int> > result;result.push_back(h0);result.push_back(h1);result.push_back(h2);result.push_back(h3);result.push_back(h4);return result;}int main(){SHA1 sha1; //定义SHA1算法类string message = "cryptographyisthepracticeandstudyoftechniquesforsecurecommunicationinthepresenceofthirdpartiesmoregenerallyitisaboutconstructingandanalyzingprotocolsthatovercome theinfluenceofadversariesandwhicharerelatedtovariousaspectsininformationsecuritysu chasdataconfidentialitydataintegrityauthenticationandnonrepudiationmoderncryptogra phyintersectsthedisciplinesofmathematicscomputerscienceandelectricalengineeringap plicationsofcryptographyincludeATMcardscomputerpasswordsandelectroniccommerc e";vector<vector<int> > result;result = sha1.SHA_1(message);cout << "消息为:" << endl << message << endl;cout << "利用填充方案SHA-1-PAD给出对消息的填充,得出SHA-1(x)得:" << endl;int i;for(i = 0;i < result.size();i++){cout << sha1.num_into_message(result[i]);}cout << endl;return 0;}程序运行结果:- 21 -。

相关文档
最新文档