第一篇:程序设计教案VB版第一章、第二章
第一章
绪
论
本书的任务是启迪读者应用某种计算机语言,对于内业平差计算,按照测量平差基本理论,通过编程来处理各种测量控制网的数据,最后输出控制网基本信息(网形码、已知点数、未知点数、路线条数等)、起算数据表、观测数据表、平差计算中间重要过程数据、平差计算结果(含精度评定指标)及控制网形图、误差椭圆图、误差曲线图等;对于外业观测记录手簿,按照相应的电子记录标准通过编程来实现外业自动记录计算;对于专业测绘部门的测绘资料管理,通过编程来实现控制点的坐标、高程、点之记、地形图等的自动查询。书中编程示例采用的计算机语言是Visual Basic 6.0版(以下简称VB6.0)。
§1-1 学习本书需注意的几个问题
一、本书的主要内容
1、程序设计基本原理(含软件工程、程序设计的基本概念及原则)。
2、VB6.0的基本用法。
3、用VB6.0制作测量程序图形界面、菜单的方法。
4、VB6.0数据输入方法。
测量程序设计中,必须含有数据输入功能。用VB6.0进行数据输入的方法,根据具体问题的不同,可采用对话框输入方法(也称为键盘输入方式),也可采用数据文件输入方式。
5、数据处理方法。
不同的控制网形,具体的数据处理方法不尽相同,有的时候技术难度还较大,或者必须采用特殊方法,需要读者在后续章节内容的学习中给予注意,细心研读。
6、VB6.0数据输出方法。
测量程序设计中,必须含有数据输出功能。用VB6.0进行数据输出的方法,根据具体问题的不同,可采用屏幕直接输出,也可采用数据文件输出,还可通过打印机打印输出。
7、图形输出方法。
控制网平差计算后,应输出与实地方位一致、按一定比例尺缩小的控制网形图。具体的输出方法,可采用屏幕直接输出,也可通过打印机打印输出。
二、本书的学习方法提示
1、读者应具有一定的VB6.0的基本知识。学习VB6.0的基本知识过程中,针对一些问题应上机试验,以便准确掌握。例如SUB、FUNCTION过程传递数据的用法、返回数据的用法;特别应注意传递数组的方法、各个字符串函数的用法等。
读者应掌握如下VB6.0的基本知识:
⑴、建立窗体模块的方法。
⑵、建立菜单的方法。
⑶、基本控件的用法。
⑷、简单数据输入方法(对话框方式)。
⑸、简单数据输出方法(屏幕直接输出方式或对话框方式)。⑹、SUB、FUNCTION过程传递数据的用法,返回数据的用法。⑺、数组的不同用法。
⑻、各个字符串函数的用法。⑼、绘图“方法”的用法。
⑽、输入、输出数据文件的用法。
2、读者应有较为系统的测量专业知识。
3、边学边练。练习时,必须按所要求的基本规则进行编程,充分进行调试(需考虑到各种特殊情况)。
三、学习本书对计算机软、硬件的基本要求
1、硬件配置
CPU:奔Ⅲ(或赛扬Ⅱ800)(不要毒龙或雷鸟系列的任何物品)
内存:256M 硬盘:20G 显示器、显示卡分辨率:1024*768 主板:带USB口。
主板、显示卡、声卡非一体化。
光驱:48速
鼠标:罗技光电鼠标
2、软件安装
需要安装Windows XP操作系统、Office XP办公软件及VB6.0编程语言系统。
§1-2 测量程序功能简介
一、测量程序整体演示
1、菜单
2、外业数据采集程序
⑴、普通水准测量记录计算
⑵、三等水准测量记录计算
⑶、四等水准测量记录计算
⑷、水平方向观测记录计算(方向观测法)
⑸、水平角观测记录计算(测回法)
·
·
·
3、内业平差计算程序
⑴、导线近似平差计算
⑵、单三角锁近似平差计算
⑶、测角、测边交会计算
⑷、导线网严密平差计算
⑸、三角网严密平差计算
·
·
·
4、Gauss投影计算程序
5、地形图分幅编号程序
二、测量程序子功能演示
1、测量程序菜单
2、多重窗体的转换
3、数据文件的读写
4、奇进偶舍
5、Degree与Radian的互化及输入、输出
6、坐标正算
7、坐标反算
8、推算坐标方位角
9、建立测量控制点符号库
10、绘制测量专用线段(单虚线、双虚线、半实半虚单线、半实半虚双线等)
11、绘制等高线(三次样条曲线,二阶导数连续)
12、绘制误差椭圆、误差曲线
13、自动显示控制网形图并打印
第二章
程序设计基本原理
§2-1 概 述
一、软件工程的概念
在计算机迅猛发展的短暂历史中,软件的发展,和计算机硬件技术的发展、计算机的推广应用紧密相关,至今为止,已经历了程序设计、软件、软件工程三个阶段的演化:
1、程序设计阶段——单人编制模式
在计算机发展的初期(1946年 ── 1954年),为了有效地利用计算机,程序设计人员采用个体手工方式开发编制了一些具有单一实际用途的程序。这个阶段的程序只是作为硬件的附属品,还没有作为商品进入营销市场,其开发的工作效率很低,属于手工生产方式。
2、软件阶段(又称程序系统阶段)——小组编制模式
这阶段是指1955年──1970年一段时间。这个阶段的软件生产方式已由个体手工进入作坊生产方式,采取由程序员小组进行编程(个体分工合作)的方法。
由于计算机硬件功能和质量的不断发展,而整机价格大幅度地下降 ── 这意味着计算机可以更广泛地应用于生产和社会生活的各个领域,软件的社会需求迅速上升。但是,软件是一种包含算法、思想等密集知识型的非物理实体,其整个研制开发过程是一个“思考”过程。在写出代码并在计算机上试运行之前,对开发过程的进展情况很难控制,质量也难于评价,而且,往往还会潜存着错误 ── 编写的源程序必须经过机上运行、各种可能数据(含非数字的数据,例如代表某种意义的字符串)测试均通过,才算告捷!
软件这一性质随着其在计算机系统中所占地位的日益重要和复杂度的增加,使软件开发人员越来越满足不了需要,因而,软件的供需矛盾加剧,出现了软件成本高、质量低,常不能按期完成开发计划,软件可靠性差,生产效率低等现象。对此,人们称之为“软件危机”。所以,有人将这一阶段称为“软件危机时期”。
3、软件工程阶段——企业生产模式
这阶段是指自1970至现在的时间。针对“软件危机”的现象,人们逐渐认识到:要经济地研制出功能强、应用面宽、可靠性高的软件,单凭经验和直觉、采用作坊式小组编程是不行的,有必要采取良好的技术措施(方法和工具 ── 软件工具)和科学的组织管理形式。于是,提出了用系统工程学的原理和方法来管理软件生产过程的设想。1968年,在“北大西洋公约”(简称“北约”)组织的一次学术会议上,第一次正式提出了“软件工程”这个术语。
经过各国软件业人员三十余年的悉心研究,目前已创造了许多适用于软件生产各阶段的方法和技术,确立了软件研制的各个阶段的生产模式和组织管理形式(制度),使整个软件研制过程“有章可循”。“工程化”的思想为软件研制指出了新的途径,逐渐形成了软件生产的规范化和自动化,推动了软件研制走向自动化的进程。在此基础上,形成了一门独立的学科──软件工程学。(参见《计算机应用与软件》1995年第三期、第四期)
这个阶段,软件已作为一种社会产品进行批量生产和标准化生产。在生产方式上,出现了大批软件公司、软件工厂等集体生产方式,并以软件作为计算机的中心,提出了一整套软件生产过程的基础理论、方法和工具系统。
经验证明:采用软件工程理论指导软件开发,可以大大地提高软件开发的成功率和生产率,例如美国的IBM公司从70年代初开始运用软件工程系统,研制了“纽约时报情报检索”和“空间实验室的飞行模拟”两个大型系统软件;微软公司、我国的“希望电脑公司”等研制的一些软件,均取得了满意的结果。
因此,研制软件就不再仅仅是“编程序”的单一问题,而是像其它产品一样,应包括计划、分析、设计、加工(编写源代码)、拼装(集成)、测试、生产运营(进入营销市场,由客户应用于实际工作中)、维护等阶段,达到以较少的投资获得“优质、高产”的软件产品的目的。
计算机软件的概念:与计算机系统操作有关的程序(源代码)、过程及任何有关的文档资料的总称。
计算机软件按其功能的不同可分为系统软件和应用软件两类。
系统软件是指用于管理计算机各种资源及协调各种装置正常工作的有关程序,以及为用户编制程序服务的程序。例如:计算机操作系统(DOS、WINDOWS)、设备安装系统(光驱驱动程序、打印机驱动程序、显示卡驱动程序、声卡驱动程序)、语言处理系统(BASIC语言、C语言、PASCAL语言)、文字编辑系统(WPS、WORD等)数据库管理系统、诊断程序等。
应用软件是指与具体用途关系密切、应用针对性强的软件。例如:税务统计软件、大地测量平差计算软件、地籍管理地理信息系统、题库综合操作系统、学生工作管理系统等。
根据生命周期方法学原理,可知软件的生命期包含如下几个阶段:
⑴、计划
⑵、分析
⑶、设计
⑷、编码
⑸、测试
⑹、运行
⑺、维护
⑻、废弃
软件工程的概念是:根据生命周期方法学原理,将一个(套)软件自其生命期的起点至终点所包含的各个阶段的系统工作,称为软件工程。
软件生命周期阶段的划分,按我国软件设计开发规范(GB8566-88),分成如下八个阶段: ⑴、可行性研究与计划:确定要开发软件项目的总项目,从技术、经济和社会条件诸方面调查研究并确定要开发的软件系统是否可行,制定完成开发任务的实施计划。(参见《白山发电厂大坝变形观测数据采集及处理项目的可行性研究》,1997年11月)
⑵、需求分析:对将开发的软件进行详细定义。详细说明被开发系统与其它硬件、软件的接口,以及人机的界面;描述功能细节及性能要求,说明功能之间及功能与数据之间的关系,确定设计性能和测试准则,并编写初步的用户手册和配置管理计划。
⑶、概要设计:又称系统设计。主要任务是决定系统的模块结构,确定目标系统的功能模块之间的关系,定义各功能模块间的数据接口,对模块划分的评价等。
⑷、详细设计:对概要设计的功能模块进行过程描述,确定系统的具体实现方法;写出程序的详细规格说明,提供编写实际程序代码的依据。
⑸、编码与单元测试:将详细设计说明转化为计算机可以接受的程序源代码,即用程序设计语言或数据库语言书写的源程序,并对编写好的源程序进行模块测试,验证模块接口与设计说明的一致性。
⑹、集成测试:也称组装测试。按照选定的测试策略,采用系统化的方法,将经过模块测试的模块按预先制定的测试计划逐步进行组合和测试。
⑺、确认测试:对集成后的软件全部设计功能进行全面确认测试,确认软件开发成功,并提供最终的用户手册和操作手册。
⑻、使用与维护:对投入市场运行后的软件系统不断进行修改和完善,使软件能够适应外界环境的改变,并进一步改善其性能、扩大其功能,延长其生命周期,直至该软件退役。
美国国防部所制定的软件设计开发标准(DOD-STD-2167)对软件生命周期各阶段的划分如下:
⑴、软件要求分析。
⑵、预设计。
⑶、详细设计。
⑷、编码与单元测试。
⑸、CSC集成与测试(Computer Software Configuration,计算机软件配置)。
⑹、CSCI级测试(Computer Software Configuration Item)。
⑺、运行与维护。
二、软件工程目标
软件工程的目标是以较低的投资而获得高质量的软件。那么,如何来评价软件质量的高低呢?一般地讲,不同的人会有不同的观点,不同的设计课题所要求的标准也不会一样。所以,对软件质量的评价很难有一个统一的标准。但就大多数的软件来讲,对其质量还是可以找出一些共性标准来衡量,例如:可以从如下的几个方面得到共同的认识:
1、可靠性
软件的可靠性是指软件本身没有错误,在预期的环境条件下能正确地完成期望的功能,而在意外的情况下,也能作出适当的处理不致造成严重的损害。所以,软件的可靠性应包括程序的正确性和健壮性两个方面。
⑴、正确性
编制程序的目的是为了完成某些特定的功能,如果一个程序不具有所要求的功能,则这个程序是毫无价值的。正确性应是程序的一个最基本的要求,它是通过对算法的精心设计和详尽的检查来实现的。
⑵、健壮性
程序的健壮性和正确性是同样重要的。一个可靠的程序应该具有一定的纠错能力。一个完全正确的程序,若根本不检查输入的数据是否合理,就可能造成严重的后果,这样的程序显然是不可靠的。一个正确的程序还应该具有查核输入数据的正确性和合理性的能力,要经得起长时间及大批量数据的考验。
2、易修改性
软件开发是根据用户的需求进行的。用户往往会因时、因地提出一些新的要求。另外,一个较大的软件经测试后还可能会有错误,这些错误要在运行阶段才会逐步暴露出来。所以,软件需要不断修改、扩充。为了能有效地修改程序,可在尊重程序原有结构的情况下,修改某一部分,而不影响其它部分,以取得所期望的新结果。
3、易理解性
易理解性是指程序的内部结构清晰,易于阅读和理解(为了测试、排错、修改等),在系统中人机界面简明、清晰,使用户乐于使用。为此,一个好的软件应层次分明,其最低层应采用好的编码风格,而较高层应是数据和算法的合理映射,使测试维护人员能从中容易地分离出其中的数据结构和算法。
4、有效性
有效性是指软件系统是否能以最佳方式,有效地使用计算机资源。在现今硬件价格下降,性能、速度不断提高,而软件开发费用不断上升的情况下,人们宁可牺牲一点机上运行的效率也要获得较好的易修改性和可靠性。
§2-2 程序设计的基本概念
一、程序和程序设计
计算机程序是指计算机一组指令的有序集合,或者说是一组语句的有序集合。换言之,一个程序是用程序设计语言对处理过程的描述,而描述的对象不外乎是对处理对象──数据和处理方式──算法的描述。所以,程序结构应包括数据结构和控制结构两个方面,即:
程序=数据结构+算法
实际上,一个程序除了以上两个主要要素之外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。因此,程序可以这样表示:
程序=数据结构+算法+程序设计方法+语言工具和环境
也就是说,以上四个方面是一个程序设计人员所应具备的知识。本书将兼顾这四个方面介绍测量程序的编写方法。
程序设计是指构造具有某种指定功能的指令序列的过程。这是一项技术性很强的工作,它是模仿性和创造性的统一。所谓模仿性,是指程序设计必须严格遵循程序设计语言的有关语法规则,模仿它的格式来编写。创造性是指在符合程序设计语言所规定的语法规则的前提下,如何描述计算过程,采用什么计算方法,程序设计人员可以针对各自的课题尽情地发挥。这里赋予程序员以极大的灵活性和创造性。因此,对同一课题,由不同人员设计出来的程序往往是不同的。例如编程求下面数列的前n项和:
a,aa ,aaa,aa,第1项第2项第3项第n项其中0a9,且a为整数。
针对这个问题,可采用以下两个不同的算法:
1、方法一:设a8,则:
8102
102*10 1088(10020)(102)
(1022*101)(1012*100)
888(1000200)(10020)(102)
(102*10)(10„„„„ 88(10n个n3222*10)(102*10)
1102*10n1)(10n12*10n2)(102*10)(10 n(108)*10n1)(10n1(108)*107
n2)(10(108)*10)10
方法一程序:
A=8
(即a=8)
I=1
(I为循环变量)
N=10
(N为数列的总项数)T=0 DO IF I>N THEN EXIT DO
J=1
(J为内层循环变量)TT=0 TT0=0 DO TT0=10^J-(10-A)*10^(J-1)TT=TT+TT0 J=J+1 IF J>I THEN EXIT DO
LOOP T=T+TT I=I+1 LOOP PRINT“数列前N项之和=”;T
(T为结果)
2、方法二:设a8,则:
88*10 0888*108*10
8888*102108*108*10
10n1n20 888*108*108*10n个n项方法二程序: A = 8 TT = 0 N = 10 For R = 0 To N-1 J = 0 For I = 0 To R k = A *(10 ^ I)J = J + k Next I TT = TT + J Next R Print “数列前N项之和=”;TT
又如给定三点坐标,据此作三角形之前,判断这三点是否共线。可采用如下两种方法:
1、先计算1点与2点之间、2点与3点之间的坐标方位角
12、23;然后,判断这三点是否共线。
or若122
3or1223180(12180,1223180(12180,23180)23180)
则说此三点共线;否则,说明这三点不共线。
2、如图2-1所示有三种可能情况,先计算平距D12、D23、D13;然后,判断这三点是否共线。
若
D13D12D23 or
D12D23D13 or
D23D12D13
则说明三点共线;否则,说明三点不共线。——该问题可用于根据碎部点构造三角网,以便自动内插等高线;也可用于根据三点绘制三角形外接圆等问题
图2-1 三点共线
二、程序设计的一般过程
在实际工作中,人们所开发的软件项目,多数是只需一、二人参加就足够的小项目。像这类项目可根据“小”的特点,采用适当简化的方法,比如,小项目规模小,对问题的理解比较容易,一般可以不进行可行性研究。但对开发的软件,先进行分析制定计划还是必要的。有的编程设计人员有一接受任务不制定计划就着手开发的坏习惯,应克服。又如在设计、编码阶段,由于一、二人进行,对程序的复查工作带来困难,开发者提供文档资料,帮助复审人员更好地理解所开发的软件是必要的。但是,小的软件项目可以使用简化了的软件工程方法进行,对某些阶段和文档资料,根据具体情况进行简化。对程序设计的一般过程可归纳为:
1、分析任务、定义功能。对任务和给定的数据进行分析,明确需要完成的功能和输出的要求,概括地、明确地用文字整理成文。
2、根据定义的功能,设计一个体现总任务的“抽象程序”。
3、将总任务分解成若干子任务,并对每个子任务进行再分解,直到不能再分解为止。
4、对每个子任务进行算法和数据结构设计,绘制N─S流程图及进行相应的文字说明。
5、选择适当的程序设计语言和进行结构化编码,并写出使用说明。
6、程序的测试和调试工作。
三、程序设计的基本原则
软件工程的最终目标是以较少的投资获得具有可靠性、易修改、易理解和有效性的软件产品。因而,进行程序设计应遵循如下基本原则:
1、抽象与隐蔽
由于人的能力所存在的固有的局限性,一般不可能一下子就能触及到问题的全部细节。总是先从分析问题入手,抽取基本的性质忽略非基本的细节,提出一个总的抽象算法。将一些能影响系统的细节隐蔽起来成为不可访问的,这是应付复杂问题的重要手段。抽象只考虑应“做什么”,“如何做”则隐蔽起来。
抽象是有层次的,人们可在抽象的不同层次上认识和处理问题。比如一个学校主要考虑要办几个系,系则关心的是本系要设几个专业,专业教研室则关心的是本专业的建设问题。人们就可利用抽象这一重要的属性,实现对复杂问题的分解,使它简化。又如程序使用说明书,作为用户和程序员的界面,用户从中只看到程序可以“做什么”,看不到程序是“如何做”的技术细节,这就简化了用户应掌握的内容,而集中精力抓住问题的本质。
应用抽象和隐蔽的原则,实现复杂问题的分解和不同功能软件的叠加,从而改善了程序设计环境,使程序设计变得简单而方便。
2、模块和模块化
模块和模块化是对一个复杂问题的“分解”与“综合”,是应付复杂问题的重要手段。所谓分解,就是将一个总任务分解成一系列相互联系而又相对独立的基本元素(子模块);所谓综合,是从总任务的完整性和每个元素功能特征出发,进行综合分析,以确定它们之间的联系,形成整体结构。
模块和模块化的原则,直接支持了易修改性、可靠性和易理解性的目标。
3、反复与复审
程序在开发过程不可能总是直线式进行,在研制过程中,免不了要发生各种各样的错误,这些错误往往要在后期才能发现。这就决定了程序的研制工作必然存在重复交错进行的现象,各阶段甚至要反复进行几次才能达到目的。
复审制度的建立,是减少反复次数的保障措施。在研制过程的每一阶段都应坚持复审。做到这点,也是实现软件工程目标的有力保证。
4、一致性和确定性
一项稍大软件的开发常由多人合作完成,研制过程做到统一化、规范化是开发成功的必要条件。一致性就是要求在步调上、命令方式、文档格式做到一致,使开发工作走上规范化轨道。
确定性也是保证软件质量的前提。它要求将人们的一些直觉变成明确的说明。比如将“软件质量要好”具体化成“正确可靠、易修改、易理解”;将用户心目中想的“响应时间很快”明确地表达成“响应时间小于x秒”等都是确定性的体现。
§2-3 结构化程序设计技术
70年代,荷兰著名计算机科学家Edsgar W.Dijkctra(迪克特拉)提出了结构化程序设计的思想。结构化程序设计规定:一个程序由“顺序、选择和循环(重复)”三种基本结构组成,要求结构化程序设计的高级计算机语言中应该具有直接实现这三种基本结构的语句,而且要求程序实现模块化(即主程序和子程序分别属于不同的模块)。
具有代表性的结构化程序设计的计算机编程语言有: BASIC:True BASIC Quick BASIC Turbo BASIC C: Turbo C C++ PASCAL VB60也具有结构化程序设计的计算机编程语言的功能。
现在,已经把程序“具有良好的结构,容易阅读和理解”作为衡量程序质量的首要条件。一个好的程序应该具备以下条件:
①、运行结果正确(这是最起码的条件)。
②、有良好的结构,清楚易懂。
③、尽可能少的运行时间。
④、运行时所占内存应压缩到合理的范围之内。
也就是说,按照现在的标准,易读性好是第一位的,其次才是效率。因为从根本上说,只有程序具有良好的结构,才易于设计和维护,减少软件成本,从整体来说才是真正的效率。
人们看程序总是从上往下看下去的,在程序中无限制地使用GOTO语句,跳转太多,思路就乱了。像这样的程序,如同一团乱麻,使人无从下手。人们把这种程序称作面条式程序(如同一碗面条,互相绞缠在一起),或称BS型程序(BS是 a Bowl of Spaghetti的缩写,意为“一碗面条”)。这种程序无任何规律而言,令人望而生畏。它造成程序设计和检查程序时的困难,增加程序出错的可能,降低程序的质量。
为了提高程序的易读性(容易理解),保证程序质量,降低软件成本,荷兰学者迪克特拉等提出了“结构化程序设计方法”的概念。它的要点是:
1、程序的质量标准是“清晰第一、效率第二”。
2、要求程序设计者按一定规范书写程序,而不能随心所欲地设计程序。应当按照“工程化”生产方式来组织软件生产,每个人都必须按照同一规则、同一方法进行工作,使生产的软件有统一的标准、统一的风格,成为“标准产品”,便于推广,便于生产和维护。
3、结构化程序设计方法规定了三种具有良好特性的“基本结构”(顺序结构、选择结构和循环结构),用它们作为构成程序的基本单元,如同建筑房屋用的标准预制件一样。每一种基本结构完成一种类型的操作序列。由这些小单元顺序组成一个大结构,这种结构可以避免上述“任意转向”的缺点。
4、一个大程序开发应当采取“自顶向下、逐步细化和模块化”的方法。即将一个大任务先分成若干个子任务,每一个子任务就是一个模块。如果某一个子任务还是太复杂,还可以再分解为若干子任务,如此逐层分解。对每一个模块的设计也是采取这种“自顶向下、逐步细化”的方法,直到将它分解为上述的基本结构为止。这如同写文章一样,有人不订提纲,想到哪里写到哪里,而有人则先拟出总题目和中心内容,再确定分为几大部分,每一大部分又分为哪几节,每一节分为哪几段,每一段包含哪些内容。有了这样通盘考虑的提纲后,文章的结构一般来说是比较清楚的,考虑是周全的,不易发生遗漏。这就是“自顶向下、逐步细化”的方法。
5、“具有良好特性的基本结构”应具有如下特点:
①、只有一个入口。
②、只有一个出口。
③、无“死语句”(没有永远执行不到的语句)。也就是说,结构中的每一部分都应当有执行到的机会,即每一部分都应当有一条从入口到出口的路径通过它(至少通过一次)。
④、没有“死循环”(“死循环”是指永远执行不完的循环,即无终止的循环)。
实践证明:顺序结构、选择结构和循环结构是具有以上特点的良好结构。
结构化程序要求每一基本结构具有单入口和单出口的性质是十分重要的。这是为了便于保证和验证程序的正确性。设计程序时一个结构一个结构地写下来,整个程序结构如同一串珠子一样次序清楚,层次分明。在修改程序时,可以将某一基本结构孤立出来进行修改,在修改一个基本结构时,不会影响到其它基本结构中的语句。
由以上三种基本结构所构成的程序可以处理任何复杂的问题。一个结构化程序是由具有以上特点的基本结构组成的,反过来说,一个结构化程序必定能分解为上述基本结构。下面以VB6.0为例说明结构化程序设计中的三种基本结构。
一、结构化程序的基本控制结构
1、顺序控制结构
顺序控制结构简称顺序结构。它是程序中最经常、最大量遇到的一种最简单、最基本的控制结构。它将程序或程序段分成若干块(一个语句或多个语句),各块在结构内执行的顺序是按照它们出现的顺序依次执行,或者说,其逻辑顺序和物理顺序是一致的。顺序控制的每一步执行是建立在上一步执行成功背道而驰基础上的,本步的执行要受到上一步的控制。结构化程序正是利用这一性质,要求整个程序由若干控制逻辑结构顺序组成。
在顺序结构处理块内的程序语句,允许是一个(组)自上至下依次执行、不产生控制转移的语句,也允许是一个调用子过程、子程序的语句 ── 因为在这样情况下整个控制流程仍可视为顺序结构。
2、选择控制结构
只用顺序结构能编写一些简单的程序,以进行简单的运算。但是,人们对计算机运算的要求并不是仅局限于一些简单的运算,经常会遇到要求计算机进行逻辑判断,即给出一个(或一组)条件,让计算机判断是否满足该条件,并按不同的情况让计算机进行不同的处理。例如:
①、从键盘输入一个数,如果它是正数,把它打印出来,否则不打印;
②、将点位误差超限的“点名”及其“点位误差”打印出来(用于精度评定);
③、比较一组横坐标,将其中数值最大与最小者打印出来(用于屏显网形图);
④、若一条边的两端点均为已知点(两个判断条件),用双实线连接。
选择控制结构简称选择结构或分支结构。它是根据给定的一个或一组条件经过分析、比较、判断后,决定按不同情况进行不同的处理(选择执行某一个或某一组语句)。
选择结构的表达式分为关系表达式(六种关系运算符)和逻辑表达式(六种逻辑表达式)。
在VB6.0中实现选择结构的语句有条件语句(IF...THEN...ELSEIF...ELSE...END IF)、情况语句(SELECT CASE...CASE...END SELECT)。关系表达式和逻辑表达式只是上述各语句实际应用中的语句体。
3、循环(重复)控制结构
在实际应用中,经常遇到一些操作并不复杂,但需要反复多次处理的问题,例如多条边坐标方位角的推算,多个点坐标的计算等,这都将用到循环控制结构。
VB6.0中循环控制结构的语句有三种不同风格的循环语句:计数循环(FOR...TO...STEP...NEXT)、当循环(WHILE...WEND)、DO循环(DO...LOOP)。
二、结构化程序的特点
所谓结构化程序,就是由上面介绍的三种基本控制结构所组成的程序。反之,任何结构化的程序应该是可以分解成上述三种基本控制结构。否则,就不是一个结构化程序。因此,一个结构化程序的结构应具备如下特点:
1、程序由基本控制结构组成。
2、程序中的各个基本控制结构都只有一个入口和一个出口。
3、通过结构的任一部分,都应存在一条从入口到出口的路径,即在结构中每一部分都存在被执行的机会。
各个基本控制结构只有一个入口和一个出口是十分重要的。做到这点可保持各结构间有简单的接口关系,从而达到相对独立地设计各个子结构,静态地分析控制关系,并验证它的正确性。比如某一个子结构需要修改,只要接口关系不变,就不会影响其它子结构和整个程序。
三、结构化程序的实现
㈠、实现结构化程序采用的技术
1、自顶向下逐步求精技术
这是结构化程序设计中的一种基本方法,它的要点是:
①、对问题作全局性分析,以确定数学模型。
②、用分解技术将问题分成若干相对独立的子块,确定各子块的相互关系。
③、对各子块逐一精细化,直到能用程序设计语言直接描述。
这项技术符合人们先整体后细节、先全局后局部、先抽象后具体的思维活动规律。坚持采用这一技术,容易达到程序结构清晰、易读、易修改的要求,从而提高程序的正确性。
2、模块化技术
模块化程序设计技术,是将求解的任务划分成几个功能相对独立的子任务。对每个子任务要求意义单
一、职责明确,各子任务间的联系简明。对每个子任务称为子模块。每个子任务还可按照逐步求精技术,继续划分为更小的任务,形成具有层次结构的整体,如图2-1所示。
图2-1 层次结构图
3、结构化的编码技术
结构化编码技术要求对程序的所有处理及程序的控制逻辑,仅由三种基本控制结构描述;所选用的控制结构应做到只有一个入口和一个出口;对复杂的程序结构仅用嵌套的三种基本控制结构实现;当选用的程序设计语言没有和基本控制结构相应的语句结构时,应采用前后一致的方法来模拟实现。
结构化编码严格限制GOTO语句的使用。因为,过多地使用GOTO语句会破坏程序的层次结构,使程序的静态结构和动态执行路径差异较大,最终导致程序质量的下降。
4、限制变量的作用域
变量的作用域指的是变量的可见性或有效性。在VB6.0程序中,根据变量的定义方式,可以分为两类,即局部变量和全局变量。其中局部变量只在程序的某一部分有效,而全局变量可用于子程序的每个部分。
限制变量的作用域,有利于更好地保障程序模块具有相对独立性,不致于干扰其它模块,保障程序的模块化编码。
㈡、子程序(过程)
在结构化程序设计中,子程序是常用的技术。现简要介绍如下。
1、子程序的概念
在设计较复杂的程序时,通常应根据程序需要实现的主要功能,划分为若干个相对独立的部分,其中每个部分都可以编写出一段程序,习惯上,把这样的一段程序称为子程序。顾名思义,子程序是整个程序的一部分,它是执行一个特定任务的程序块。
定义子程序后,就可以在程序的其它地方调用它。调用程序与被调用的子程序之间的信息交换通过参数的传送来实现。
一般来说,子程序是在程序的若干处都需要执行的相同的代码,使用子程序可以达到缩短程序长度和减少占用内存空间的目的。
在VB6.0 中,通常把子程序称为过程。其过程一般分为两类,即子程序过程和函数过 13
程,前者叫做SUB过程,后者叫做FUNCTION过程。
使用过程编写程序,主要有以下两个优点:
①、便于调试。用过程可以把程序划分为若干个独立的逻辑单元,调试一个过程比调试整个程序要容易得多。
②、节省代码。将一个程序中的某个子功能用一个过程来编写,可被整个程序的任何位置所调用,这样,便可节省整个程序的代码总量;而且,这样具有相对独立功能的过程,通常不需要修改或进行很小的修改,就能用于其它程序中。
2、子程序的结构与调用方法
一般地,SUB过程用CALL来调用;FUNCTION 过程可像函数一样直接调用。
四、结构化程序设计的基本特征
结构化程序设计具有如下基本特征:
1、用系统工程观点把一个程序视为一个大系统。
2、将大系统运用“自顶向下、逐步求精”的方法,进行程序开发。
3、用模块化的设计方法,使一个模块完成一项子功能。
4、结构化程序中的每一个模块都是由基本控制逻辑结构(或相互嵌套)顺序地组成,且各控制结构只有一个入口和一个出口。
5、结构化程序只能有限制地使用GOTO语句。
6、在结构化程序内部,应适当地使用程序功能注释(REM 语句),以提高程序的可读性。
利用VB6.0编程时,在每一个窗体模块或标准模块内由程序员编写的程序代码,即是一个相对完整的结构化程序;它调用的子过程允许不在同一个模块内。
§2-4 面向对象的程序设计技术
一、OOP(Object Oriented Programming)概述
程序包含两类基本的元素,即数据和操作数据的指令集(称为代码)。传统的程序设计语言以设计代码为核心,程序设计实际上就是指定程序指令的先后次序,数据表示必须适应代码的设计。模块化程序设计方法将完成某一功能的指令集组成一个相对独立的程序模块(即函数或过程),使得程序的结构清晰,便于有效地维护,对程序设计技术有很大的促进。但由于结构化程序设计方法并不能保证各程序模块之间真正的相互独立,程序设计者在设计一个模块时很难完全排除其它模块的影响。随着程序规模的增大,各模块之间的相互影响导致了一些难于测试、难于定位发现的错误,增加了程序开发和维护的困难。面向对象的程序设计方法就是在这种背景下出现和发展起来的。
面向对象的程序设计方法主要以数据为中心,代码是围绕着需要处理的数据而设计的。
OOP ── 面向对象的程序设计,是一种比较先进的程序设计方法。
作为Windows环境下的软件开发工具语言,VB所采用的一个关键技术是面向对象编程,简称OOP。可以将对象看作变量,与通常变量不同的是,真正的面向对象编程的对象不仅具有特征属性(变量),同时具有行为方法(函数)。一个对象知道如何管理自己,例如可能使 14
自己初始化,打印或完成其它任务。特别是对象可以响应外界触发的事件。编写面向对象的程序时,程序员并不关心所使用的对象实际如何工作,而只需知道对象的行为。一旦消除了对象中那些令人乏味的细节,程序员即可集中精力于所需功能的编程,即编写应用程序中无法替代的部分。另外,可以在程序中重复使用对象。
在VB中,窗体、控件即为具有属性、方法并可响应事件的对象。通过改变控件的属性,控制其外观和行为。例如,通过改变文本框的字体和颜色属性,可以知道(确定)如何显示其中的文本。方法是控件本身所固有的程序,例如选中文本框后,当在键盘上按下一个键时,这个键所代表的字符将在文本框编辑区内以特定格式显示。此外,每个控件还可识别特定的事件。大多数控件知道鼠标是否移动到其上,是单击,单击的是左键还是右键。而对于大多数控件,都可以编写一段对应的程序。当事件发生时,程序执行,从而完成所需的功能。
二、几个术语
1、对象(Object)
对象是OOP程序的基本单元,其属性给出其特征,其方法指定实现的任务。对象还可响应并识别事件。
2、控件(Control)对于VB而言,控件是可重复使用的对象,如文本框、按钮等。控件用于构成程序的可视化界面。
3、事件(Event)事件是用户或操作系统执行的操作,如通过键盘输入一个字符、单击、等待超时等。
4、方法(Method)方法是指对象固有的程序代码。
5、过程(Procedure)过程是用于实现一项功能的一段程序代码,通常用于响应一个事件。
6、属性(Properties)属性是对象的特征,如位置、尺寸、颜色、字符等。属性给出对象的外观,有时也用于确定目标的行为,也可用于输入数据给对象或从对象中获得数据。
三、VB6.0特点
VB6.0最大特点是大大简化了Windows应用程序的开发,是设计Windows应用程序的极好工具。VB6.0与当前各种BASIC语言在设计思想上有许多相似之处,对于已经掌握或熟悉其它版本BASIC语言的用户,可很快掌握VB6.0语言。VB6.0继承了BASIC语言的优点,同时又增加了图形用户界面,使得用户只需记住很少的命令即可使用。VB6.0中的“Visual”直译为“可视化”,是指为开发图形用户界面,不需要编写大量的程序代码,而只需用鼠标拖放窗口和控件,设置其大小、位置和属性等。
使用VB6.0设计Windows应用程序的最大方便之处是在设计阶段即可创建用户界面,从一个窗体开始,在其上添加所需的菜单和控件等;然后,编程,连接代码与对象,即可完成一个应用程序的设计。步骤如下:
1、创建窗体。
2、为每个窗体选择控件。
3、为主窗体设计菜单。
4、设计控件和窗体的属性。
5、定义事件和编写通用过程。
6、调试。
四、VB6.0快捷键
1、剪切(T)Ctrl+X
2、复制(C)Ctrl+C
3、粘贴(P)Ctrl+V
4、撤消(Z)Ctrl+Z
5、查找(F)Ctrl+F
6、打开(O)Ctrl+O
7、保存(S)Ctrl+S
§2-5 编程风格问题
为了使程序代码易于维护,在编写程序时应遵循一定的公认准则。
1、重要的程序行一般要顶格写,即该行前面不要留空格。例如,注释行。
2、语句缩进准则:书写程序应采用缩进格式,这是为了层次分明、结构清晰,便于阅读、修改,像一篇文章分段书写一样。
虽然没有任何一种计算机编程语言强制要求使用缩进准则,但在实际编程中,几乎每一个程序员都使用缩进来增强代码的可读性。使用缩进的方式是千差万别的,例如VB中可使用该语言系统所提供的Tab键缩进格式,当然也可使用SPACE键(空格键)灵活缩进。
3、注释:虽然不要求对每行语句都进行注释,但最好对每一源文件、每个函数、每一特殊操作语句(或语句段)、重要变量等都能有注释,以说明文件、函数、语句或变量等的用途和意义。
VB中所提供的注释语句是:REM......或'(撇号)。
对源文件的总体注释应放在文件(程序)的最前面,一般包括如下几部分:
①、文件名
②、文件功能、用途
③、创建时间
④、作者
⑤、修改时间
⑥、修改的目的
⑦、修改人
4、源文件设置:主程序尽量简明,起到“总调度”的功能;将各子任务尽可能地分解,分别用过程(SUB或FUNCTION过程)处理;严格控制使用GOTO语句,以免破坏程序的模块化结构。
5、命名准则:编写代码时如何给常量、变量和函数取名将在很大程度上影响代码的可读性,好的命名方式,可减少编写代码的笔误和提高代码的维护效率。一般的命名准则包括:
①、使用能描述常量、变量和过程的意义或用途的词命名。
②、具有相似特征或意义的一组常量、变量和过程的名称,可分成两部分来表示:第一部分的名称相同,第二部分的名称不同,这两部分之间用下划线连接。
6、作用域问题:在设置变量时,应尽量少用全局变量及占用字节多的变量,例如双精度变量、长整型变量等;尽量通过使用过程参数来传递数据。
7、针对具体问题,不要先把注意力放在某一种语言如何使用上,而应先把注意力放在 16
程序设计的思路和方法上,即应先考虑解决具体问题的程序设计的思路和方法,然后再考虑用某一种语言的什么语句、函数、命令等解决它。
8、风格前后一致准则:在编写代码时,应注意保持所使用的编码风格的前后一致性。
作为计算机应用人员,应当建立程序设计的概念。程序设计是一个计算机应用人员应具有的基本功。无论是在学校学习期间或者是在实际工作中,一个优秀的工程技术人员,应当把程序设计作为一项基本训练。只有懂得程序设计,才能真正理解计算机是如何进行工作的,才能在工程实践中利用计算机编程有效地解决一些问题。
第二篇:公开课 VB程序设计教案
第四课 学学程序设计—初步认识编程软件VB 教学目标:
知识目标:了解什么是程序设计语言和计算机程序以及语言的分类
过程与方法:培养学生的阅读总结和自主探索能力
情感态度与价值观:通过学生利用所学的知识解决实际问题,激
发学生的学习兴趣
教学重难点:了解什么是程序设计语言
启发学生创新思维
以任务为驱动,激发学生创新思维 教法:讲授法、任务驱动法 教学过程:
一、导入新课
教师运行游戏小程序,引起学生的兴趣,并打开程序的原代码说明编程并不很神秘。试运行游戏小程序,激发学生的学习兴趣。
二、教师讲授: 程序设计语言
教师活动:语言是人类交流思想、沟通感情最重要的工具。那么语言不通的人如何交流呢?
学生活动:请一个语言翻译或自己学会他人的语言
教师活动:计算机所做的事情均为人向机器下达的命令,那么操作作者又是通过什么语言同计算机进行沟通的呢? 程序设计语言的分类及特点
1、机器语言
教师活动:①计算机能听懂的语言(机器语言)②机器语言的实质(二进制语言)③二进制语言的特点。强调计算机内部只认识二进制
学生活动:谈对二进制语言的感受
教师小结:机器语言的特点(二进制、计算机直接能懂、难以理解,与人类语言差距较大)汇编语言-用助记符号表示面向机器的程序设计语言。使用汇编语言编写的程序,机器不能直接识别,要由一种程雪汇编语言翻译成机器语言。适合编写直接控制机器操作的程序,不容易使用。高级语言-最接近人的自然语言,即简单易学,它所编制的程序计算机执行时需要“翻译”,执行速度比二进制程序慢。三:展示微课视频
VB简介、认识VB窗口、相关概念:
1、对象的概念
2、属性的概念
3、事件和代码的概念。演示设计运行程序“奔跑的小汽车”依照微课演示编写程序“奔跑的小汽车” 四:学生体验
1、学生编写程序“奔跑的小汽车”,教师巡回指导。
2、试修改程序,让汽车倒车、速度变慢。
五、教学评价:
1、教师点评教师通过巡视,把部分学生修改的结果进行点评,指出典型的错误。
六、课后小结:
这节课,我们体验了用VB设计程序,了解程序有关知识。(回顾本节知识)希望同学们继续努力。
第三篇:程序设计教案VB版第三章
第三章
矩阵的基本计算程序设计方法
§3-1 行列式的性质(参见文献[39]P91)
矩阵的基本计算用到了行列式的内容。行列式通常用记号A或detA表示,det的英文单词是:determinant。为后面讨论矩阵计算时方便,下面先叙述行列式的十个主要性质。
1、把行列式的行变为同号数的列,行列式的值不变。即一个行列式与它的转置行列式的值相等。
2、对调行列式的两行(或两列),行列式的符号改变,但绝对值不变。
3、有两行(或两列)相同的行列式的值必等于零。
4、行列式等于它任意一行(或一列)的各元素与对应于它们的代数余子式的乘积的和。
5、行列式某一行(或某一列)的各元素与另一行(或另一列)对应元素的代数余子式的乘积的和恒等于零。
6、行列式的某一行(或某一列)的各元素如果有公因子,这公因子可以提到行列式记号的外面去。
7、如果行列式的某一行(或某一列)的各元素都等于零,则此行列式等于零。
8、如果行列式的第i行(或第i列)的各元素是两个加数的和,则此行列式可表示为两个行列式的和,其中一个行列式的第i行(或第i列)的各元素是上述的一个加数,而另一个行列式的第i行(或第i列)的各元素是另一个加数;在这三个行列式中,其余的各元素完全相同。
9、如果行列式的两行(或两列)的对应元素成比例,则此行列式等于零。
10、把行列式的某一行(或某一列)所有的元素同乘以一个数后,加于另一行(或另一列)的各对应元素上,行列式的值不变。
§3-2 矩阵基本计算的程序设计原理
矩阵的基本计算包括:矩阵的初等变换(行变换或列变换),矩阵的加、减法,矩阵的转置,矩阵乘法的定义及计算方法、代数余子式的定义及计算方法、按照定义式进行矩阵求逆等的编程方法。矩阵的英文单词是matrix。
一、矩阵的基本概念
设有一个线性方程组,例如测量平差中的条件方程: a1v1a2v2anvnwa0b1v1b2v2bnvnwb0
rvrvrvw022nnr11等式的左边由三部分组成,即n个改正数vi,r个改正数的系数,r个闭合差。现在我们将这三种成份按原来排列的次序抽出来,分别组成下面三个表:
a1b1r1a2b2r2anbn,v1rnwawbvn,wr v2 18 这种由一组数排列成矩形的表,就称为矩阵。表中的数称为矩阵的元素。在第一个表中有r行n列元素,该表称为rn阶矩阵;第二个表只有一行n列元素,称为1n阶矩阵,或称行矩阵;第三表有r行一列元素,称为r1阶矩阵,或称列矩阵。
一般地,设有mn个元素排成矩形的表: a11a21 Aam1a12a22am2a1na2n amn称A为m行n列矩阵,aij称为矩阵A的元素。m行n列矩阵记为mn阶矩阵。
二、常见的特殊矩阵
1、方阵
当mn时,矩阵A称为n阶矩阵,或称n阶方阵。方阵A中的元素a11,a22,,ann称为矩阵A的对角线元素。例如条件平差中法方程组的系数阵,即为方阵。
2、零矩阵
如果某一个矩阵的元素全为零,则称为零矩阵,记为O。测量平差中常见的零矩阵是r1阶零矩阵,一般也用O表示。即:
00 O
0
3、对角阵
如果一个n阶方阵除对角线元素外,其余元素全为零,则称其为对角阵,即: a110 A00a22000 ann
4、单位矩阵
对于对角阵A,当主对角线元素全为1时,即:a11a22ann1,则称其为单位矩阵,简称单位阵,也称为幺阵,一般用E表示,也有用I表示的。
5、上三角矩阵
对于n阶方阵A,如果当ij时,aij均为零,则称该矩阵为上三角矩阵。即: a110A 0a12a220a1na2n ann
6、下三角矩阵
对于n阶方阵A,如果当ij时,aij均为零,则称该矩阵为下三角矩阵。即: a11a21 Aan10a22an200 ann
7、行矩阵
对于mn阶矩阵,若m1时,则称其为行矩阵,也称为行向量。即:
Aa11
8、列矩阵
对于mn阶矩阵,若n1时,则称其为列矩阵,也称为列向量。即: a11a21 A
am1a12a1n
9、对称方阵
对于n阶方阵A: a11a21A an1a12a22an2a1na2n annann两侧的元素对称相等,若主对角线元素a11,a22,即aijaji,则称A为n阶对称方阵。
三、矩阵的基本计算
矩阵和行列式有本质的区别,属于两个不同的概念。行列式本身代表一个数,而矩阵仅仅是一组数排列成的表,它只说明表中各元素的排列位置,但矩阵的整体可以参与运算。下面介绍矩阵的基本计算规则。
㈠、矩阵的相等
设有两个同阶矩阵A(aij)和B(bij),如果它们的对应元素相等,即:aijbij,则矩阵A和B称为相等。
㈡、矩阵的加、减法
1、如果矩阵A(aij)和B(bij)是同阶矩阵,则矩阵A与B是可加减的。将两个同阶矩阵中对应元素求和差,称为矩阵的加减法。即: a11b11a21b21 ABabm1m1a12b12a22b22am2bm2a1nb1na2nb2n amnbmn 20 若令aijbijcij,C(cij),则矩阵:
CAB
可见矩阵C必与A、B同阶。
2、一个常数与一个矩阵相乘的定义及计算方法
常数与某矩阵A相乘所得之矩阵B,其元素就是常数与矩阵A中各个元素之乘积。即:
a11a21 BAAam1a12a22a1na2nam2amn
3、矩阵加减法运算的基本性质
⑴、可结合性:A(BC)(AB)C ⑵、可交换性:ABBA
⑶、AOA(式中O为与A同阶的零矩阵)
⑷、()AAA(式中A为矩阵,、是常数)⑸、(AB)AB(式中A、B为矩阵,是常数)
㈢、矩阵的转置
1、设A是mn阶矩阵,将A的行与列依次对换,得nm阶矩阵,称为A的转置矩阵,并记为A,或记为AT。即: a11a21 Aam1a12a22am2a1na11a2na12TA aamn1na21a22a2nam1am2 anm
2、转置矩阵的性质
⑴、将矩阵进行两次转置即得原矩阵,即:(A)⑵、(AB)⑶、(A)TTTTTA。
ATTB
TTTA(式中A为矩阵,是常数)
⑷、(AB)BA
⑸、对角阵的转置矩阵,仍为对角阵,且与原对角阵相等。⑹、若ATA,则A为对称矩阵。
㈣、矩阵相乘的定义及计算方法
1、两个矩阵相乘的定义及计算方法 设矩阵A的列数等于矩阵B的行数: a11a21Aam1a12a22am2a1pb11a2pb21B bampp1c1nc2n cmnb12b22bp2b1nb2n bpn又设矩阵:
c11c21 Ccm1pc12c22cm2这里cijak1ik,将C称为bkj(i1,2,,m;j1,2,,n;1im;1jn)矩阵A与B的乘积,记作CAB。
2、矩阵乘积的性质
⑴、注意,一般地,ABBA,即矩阵的乘法一般不满足交换律。
⑵、矩阵乘法的结合律是成立的,即:(AB)CA(BC)或(A)B(AB)。⑶、矩阵乘法的分配律是成立的,即:A(BC)ABAC或(AB)CACBC。⑷、若A是n阶矩阵,E是n阶单位矩阵,则有:AEEAA。
㈤、代数余子式的定义及计算方法
在某阶行列式中,划去aij所在的行和列的元素,余下的元素构成一个降阶行列式,它与(1)ij的乘积叫做aij的代数余子式,记作Aij。例如:
a11a12a22a3223a13a23中a23的代数余子式为: a33行列式a21a31A23(1)a11a31a12a32a11a31a12a32
㈥、按照定义式进行矩阵求逆的一种编程方法
1、非奇异矩阵和奇异矩阵的定义 a11a21设n阶矩阵为:Aan1a12a22an2a1na2n,方阵A的行列式记作A,若A0,ann称A为非奇异矩阵(也称满秩矩阵);否则,称A为奇异矩阵。
2、逆矩阵的定义 对于n阶矩阵A,如果有一个n阶矩阵B,满足:ABBAE,则B叫做A的逆矩阵,A也叫做B的逆矩阵。A的逆矩阵记作A1,这里E是单位矩阵。
重要的性质:一个n阶矩阵有逆矩阵的必要与充分条件是该矩阵是非奇异矩阵。非奇异矩阵有唯一的逆矩阵。
3、伴随方阵的定义及逆矩阵的定义式
设A为一个n阶非奇异矩阵,则A有唯一的一个逆矩阵A1,其定义式为:
A11AA*
a11a21A an1 A*A11A12A1na12a22an2A21A22A2na12a22an2a1na2n annAn1An2 Anna1na2nanna11 Aa21an1
式中,Aij是行列式A中元素aij的代数余子式,称矩阵A*为矩阵A的伴随方阵,A1是矩阵A的逆矩阵。
4、矩阵A的行列式A的值的计算方法
根据行列式的性质10,首先通过列变换,将行列式第一行上除主对角线上的一个元素外,将这行上其它各元素均变换成零;这样,根据行列式的性质4可知,行列式的值等于第一行各元素与对应于它们的代数余子式的乘积之和,即等于第一行不为零的主对角线上的元与其代数余子式的积。素a11若行列式的某一行(或某一列)的所有元素均为零,则该行列式的值为零,不需要进行变换。
a11a12a22an2a1na2nann Aa21an1
a110a222ana22a23a333an0na2annna2na3anna1ia11 a21an1
111a11a322an
上式中首先将a12、a13、„„、a1n均变换为0,具体方法如下:取乘数m1i
3、、n)(i
2、,从第二列起,每列各元素加上第一列各元素与m1i的积。例如,若想
a12使a12变为0,应将第一列各元素同乘以a11a13将第一列各元素同乘以a11后,加到第二列上;若想使a13变为0,应后,加到第三列上;„„。 仿照列变换,也可以进行行变换,使a11、a21、a31、„„、an1均变换为0。
同理,往下可以逐次变换,每变换一次,行列式便降一阶,最后行列式A的值为经过变换的主对角线上各元素与每一次降阶时的(1)ij的积。
由于每次降阶时均有ij,所以(1)ij1。这样,矩阵A的行列式的值为: a33a44
Aa11a225、伴随矩阵A*中各元素Aij的计算方法
类似地,利用上述求行列式A的值的方法可以求出伴随矩阵A*中各元素Aij(Aij为行列式A中元素aij的代数余子式)的值。
6、有关逆矩阵的两个性质
①、若矩阵A、B都有逆矩阵,则其乘积AB也有逆矩阵,其(AB)②、设A为非奇异矩阵,则(A)1T1B1A1。
(A)T1,即(A)为AT的逆矩阵。
1T㈦、矩阵的秩
1、矩阵A的k阶子式的定义
在一个m行、n列的矩阵A中任取k行、k列,位于这些行、列相交处的元素构成的k阶行列式,叫做A的k阶子式。
2、矩阵A的秩的定义
矩阵A中不等于零的子式的最大阶数,叫做矩阵A的秩。
3、关于计算矩阵A的秩的三个定理(这三个定理又称为矩阵的初等变换)①、如果一个矩阵的某一行(列)乘以一个不为零的数,则矩阵的秩不变。
②、若一个矩阵的任意两行(列)交换,则矩阵的秩不变。
③、如果一个矩阵A的某一行(列)乘以一个不为零的数k,然后加到另一行(列)的对应元素上去,则矩阵的秩不变。
㈧、分块矩阵
对于阶数比较高的矩阵A,在计算过程中,经常采用“矩阵分块法”,这样,它可以使计算简化为较低阶矩阵的运算。
1、分块矩阵的定义
将一个mn阶矩阵A用若干条纵线和横线分成多块低阶矩阵,每一块低阶矩阵称为A的子块,以子块为元素的矩阵称为分块矩阵。
实际计算中,多数情况下是将一个mn阶矩阵A化成m1阶或1n阶分快矩阵,即将矩阵A按列或按行分块,这样分块的作用是规律性强,利于编程计算。
2、分块矩阵的计算规则
⑴、作分块矩阵的加减法运算时,必须将两个同阶矩阵按相同方法分块,才能运算。
⑵、作分块矩阵A与B相乘时,A的列子阵数必须等于B的行子阵数,且对应相乘的子阵Cih与Dhi必须有Cih的列数等于Dhi的行数。即:
C11C21ACs1C12C22Cs2at1,l2at2,l2atm,l2C1pD11C2pD21 BDCspp1at1,lnat2,ln atm,lnD12D22Dp2D1rD2r Dpr且 Cihat1,l1at2,l1atm,l1bf1,e1bfx,e1 Dhibf1,en
bfx,en⑶、分块矩阵转置时,先将子阵看成矩阵的元素,作转置后,再将每个子阵转置。即:
C11C21ACs1
C12C22Cs2TC1pC11TC2pC12T ACTCsp1pC21C22C2pTTTTCs1TCs2 TCsp25 ⑷、分块矩阵求逆法 参见文献[30]P506。
四、矩阵基本计算程序示例
1、矩阵加减、转置、乘法运算 Private Sub GPHARRAY1_Click()Rem ***** 矩阵加减计算子菜单 ***** Dim I As Integer Dim J As Integer I = 3 J = 3 ReDim A(1 To I, 1 To J)As Double ReDim B(1 To I, 1 To J)As Double A(1, 1)= 1 A(1, 2)= 2 A(1, 3)= 3 A(2, 1)= 4 A(2, 2)= 5 A(2, 3)= 6 A(3, 1)= 7 A(3, 2)= 8 A(3, 3)= 9 B(1, 1)= 0.1: '***** 第一行第一列 B(1, 2)= 0.2 B(1, 3)= 0.3 B(2, 1)= 0.4: '***** 第二行第一列 B(2, 2)= 0.5 B(2, 3)= 0.6 B(3, 1)= 0.7: '***** 第三行第一列 B(3, 2)= 0.8 B(3, 3)= 0.9 Cls Call GPHARRAY11(A(), B())End Sub
Private Sub GPHARRAY11(ByRef A()As Double, ByRef B()As Double)Rem ***** 矩阵加减计算子程序 ***** Dim I As Integer Dim J As Integer Dim N As Integer N = 3 ReDim C(1 To N, 1 To N)As Double For I = 1 To N For J = 1 To N C(I, J)= A(I, J)+ B(I, J)Print Spc(6);“C(”;I;“,”;J;“)=”;C(I, J)Next J Next I End Sub
Private Sub GPHARRAY2_Click()Rem ***** 矩阵转置计算子菜单 ***** Dim I As Integer I = 2 J = 3 ReDim A(1 To I, 1 To J)As Double A(1, 1)= 2: '***** 第一行第一列 A(1, 2)= 3 A(1, 3)= 4 A(2, 1)= 5: '***** 第二行第一列 A(2, 2)= 6 A(2, 3)= 7 Cls Call GPHARRAY21(A())End Sub
Private Sub GPHARRAY21(ByRef A()As Double)Rem ***** 矩阵转置计算子程序 ***** Dim I As Integer Dim J As Integer Dim I1 As Integer Dim J1 As Integer I = LBound(A, 1): '***** 返回二维数组第一维的最小下标 J = LBound(A, 2): '***** 返回二维数组第二维的最小下标 I1 = UBound(A, 1): '***** 返回二维数组第一维的最大下标 J1 = UBound(A, 2): '***** 返回二维数组第二维的最大下标 ReDim C(I To J1, J To I1)As Double For R = 1 To J1 For S = 1 To I1 C(R, S)= A(S, R)Print Spc(6);“C(”;R;“,”;S;“)=”;C(R, S)Next S 27 Next R End Sub
Private Sub GPHARRAY3_Click()Rem ***** 矩阵乘法计算子菜单 ***** Dim I As Integer Dim J As Integer I = 2 J = 3 K = 4 ReDim A(1 To I, 1 To J)As Double ReDim B(1 To J, 1 To K)As Double A(1, 1)= 1 A(1, 2)= 2 A(1, 3)= 3 A(2, 1)= 4 A(2, 2)= 5 A(2, 3)= 6 B(1, 1)= 1: '***** 第一行第一列 B(1, 2)= 2 B(1, 3)= 3 B(1, 4)= 4 B(2, 1)= 5: '***** 第二行第一列 B(2, 2)= 6 B(2, 3)= 7 B(2, 4)= 8 B(3, 1)= 9: '***** 第三行第一列 B(3, 2)= 10 B(3, 3)= 11 B(3, 4)= 12 Cls Call GPHARRAY31(A(), B())End Sub
Private Sub GPHARRAY31(ByRef A()As Double, ByRef B()As Double)Rem ***** 矩阵乘法计算子程序 ***** Dim I As Integer Dim J As Integer Dim K As Integer Dim U As Integer Dim I1 As Integer Dim J1 As Integer Dim K1 As Integer I1 = UBound(A, 1): '***** 返回二维数组第一维的最大下标,此为矩阵A()的行数
J1 = UBound(A, 2): '***** 返回二维数组第二维的最大下标,此为矩阵A()的列数 K1 = UBound(B, 2): '***** 返回二维数组第二维的最大下标,此为矩阵B()的列数 Rem ***** C()=A()*B()
ReDim C(1 To I1, 1 To K1)As Double For I = 1 To I1 For K = 1 To K1 U = 0 For J = 1 To J1 U = U + A(I, J)* B(J, K)Next J C(I, K)= U Print Spc(6);“C(”;I;“,”;K;“)=”;C(I, K)Next K Next I End Sub
2、矩阵求逆
Private Sub Form_Load()Dim I As Integer Dim J As Integer Dim K As Integer Dim N As Integer Dim R As Integer Dim DetA As Double, S As Double N = 4 ReDim A(1 To N, 1 To N), B(1 To N, 1 To N)As Double, C(1 To N, 1 To N)As Double 'A数组存放源矩阵,B数组临时存放各元素的代数余子式,C数组存放逆矩阵 A(1, 1)= 10: A(1, 2)= 4: A(1, 3)= 3: A(1, 4)= 6 A(2, 1)= 5: A(2, 2)= 8: A(2, 3)= 7: A(2, 4)= 9 A(3, 1)= 1: A(3, 2)= 3: A(3, 3)= 5: A(3, 4)= 7 A(4, 1)= 2: A(4, 2)= 6: A(4, 3)= 3: A(4, 4)= 1 '求矩阵的行列式 For I = 1 To N For J = 1 To N B(I, J)= A(I, J)Next J Next I Call QIUJUZHEN(B(), N, S)DetA = S Debug.Print “S=”;S '求代数余子式及伴随矩阵 N = N1)= A(K, R)If R < J And K > I Then B(K1, R1 For J = I + 1 To N M =-B(I, J)/ B(I, I)For K = I To N B(K, J)= B(K, J)+ M * B(K, I)' Debug.Print “B(”;K;“,”;J;“)=”;B(K, J)Next K Next J Next I For I = 1 To N S = S * B(I, I)Next I
End Function 30
第四篇:程序设计教案VB版第七章
第七章
绘制误差椭圆、误差曲线的程序设计方法
§7-1 绘制误差椭圆的程序设计方法
测量平面控制网平差计算后进行精度评定时,点位中误差虽然可以用来评定待定点的点位精度,但是它却不能代表该点在某一任意方向上的位差大小。在有些情况下,往往需要确定点位在某些特殊方向上的位差大小;此外,还要了解点位在哪一个方向上的位差最大,在哪一个方向上的位差最小。例如,在工程放样中,就经常需要研究这个问题。为了便于求定待定点点位在任意方向上位差的大小,一般是通过求出待定点的点位误差椭圆来实现的。通过误差椭圆可以求得待定点在任意方向上的位差,这样就可以较精确地、形象而全面地反映待定点点位在各个方向上误差的分布情况。
为了确定任意两个待定点之间相对位置的某些精度,也需要作出两个待定点之间的相对误差椭圆。
无论是表示点位绝对位差的误差椭圆,还是表示两个待定点之间相对位置的某些精度的相对误差椭圆,在测量程序设计中所要面临的问题都是绘制椭圆,而这个椭圆一般情况下不是正立的。由于目前常用的几种编程语言(例如VB、VC)中没有现成的语句、命令、函数或方法来绘制倾斜任意角度的椭圆,因此,下面研究在计算机屏幕上绘制倾斜任意角度的椭圆的编程方法。
一、绘制误差椭圆的基本思路
以下讨论问题及编程中所使用的平面直角坐标系,设经过一段程序的控制,已将屏幕绘图区域的平面直角坐标系调整为测量平面直角坐标系(以下简称坐标系),即纵轴向上为X轴正向,横轴向右为Y轴正向。
绘制倾斜任意角度的误差椭圆时,已知数据如下: 椭圆的长半轴:E(也可用a表示)椭圆的短半轴:F(也可用b表示)
椭圆中心点的在坐标系中的坐标:(X0,Y0)
椭圆长半轴在坐标系中的坐标方位角:T(T称为误差椭圆的主轴方向)
如图7-1所示,绘制倾斜任意角度的误差椭圆的基本思路是:首先,求出在坐标系中坐标方位角为T的椭圆长半轴与椭圆圆周的交点G的坐标;然后,再求出椭圆圆周上一系列点P(i)的坐标(设i0时,P(0)点与G点重合;in时,P(n)点与G点重合);最后,从G点开始用VB中画直线方法LINE(以下简称LINE)依次连接相邻点。
为了用LINE依次连接相邻点时所画出的直线趋近于椭圆曲线,需要使椭圆圆周上一系列点P(i)(将P(i)点称为误差椭圆圆周上细部点,简称P(i)点,下同)分布合理,即P(i)点与P(i1)点之间的直线距离应足够小。鉴于计算机屏幕的分辨率,可控制在0.2mm内。
关于G点坐标的计算,应以椭圆中心点坐标(X0,Y0)作为起始坐标、以椭圆的长半轴E为距离、以T为坐标方位角、按坐标正算的方法进行计算,即:
XGX0aCos(T)
(7-1)YYaSin(T)0G
155 椭圆长轴与椭圆圆周的另一个交点GA的坐标为:
sT)XGAX0aCo((7-2)
(T)YGAY0aSin椭圆短轴与椭圆圆周的两个交点H、HA的坐标分别为:
XXbCos(T)0H(7-3)YYbSin(T)H023XXbCos(T)0HA2
(7-4)3YYbSin(T)HA02根据上述坐标,用LINE可画出椭圆的长轴及短轴。以下重点介绍计算P(i)点坐标的方法。
二、计算P(i)点坐标的方法
1、坐标转换公式
如图7-1所示,设P点在坐标系XOY中的坐标为XP、YP,在坐标系EOF中的坐标为EP、FP;O点在坐标系XOY中的坐标为XO、YO;E轴正向在坐标系XOY中的坐标方位角为T。则可以推证出如下坐标互换公式:
图7-1 倾斜任意角度的误差椭圆
XPXOEPCosTFPSinT
(7-5)YYESinTFCosTOPPPEP(YPYO)SinT(XPXO)CosT及:
(7-6)
F(YY)CosT(XX)SinTPOPOP2、计算P(i)点坐标的参数方程法
如图7-2所示,该法的基本思路是:先用椭圆的参数方程求解正立竖放椭圆上P(i)点坐标EP(i)、FP(i);然后,使用坐标转换公式的(7-5)式计算P(i)点在坐标系XOY中的坐标XP(i)、YP(i)。
P(i)点在EOF坐标系中的坐标EP(i)、FP(i)可用参数方程表示为:
156 EP(i)aCos(t)
(7-7)FP(i)bSin(t)参照图7-1,用P(i)代替P、EP(i)代替EP、FP(i)代替FP、XP(i)代替XP、YP(i)代替YP,将(7-7)式代入(7-5)式中,可得任一点P(i)在XOY坐标系中的坐标为:
XP(i)X0(aCos(t))Cos(T)(bSin(t))Sin(T)
(7-8)YP(i)Y0(aCos(t))Sin(T)(bSin(t))Cos(T)如图7-2所示,编程中,可设ti(DT),其中DT是椭圆圆周上有序(即有一定规律)分布的一系列点中的任意相邻两点P(i)、P(i1)和椭圆中心相连的直线的夹角,t应从OG开始沿顺时针方向递增,即自E轴正向沿着顺时针方向至OP(i)的水平夹角;i是程序中的循环变量,i0,1,2,,n。
3、计算P(i)点坐标的直线点斜式方程法
如图7-2所示,该法的基本思路是:首先,求出
图7-2 正立竖放椭圆 椭圆圆周上一系列点P(i)到椭圆中心的距离D(i);然后,直接用坐标正算公式求解P(i)点在坐标系XOY中坐标XP(i)、YP(i)。
设正立竖放椭圆中心O点在EOF坐标系中的坐标为(0,则过该点及椭圆圆周上任0),一点P(i)的直线点斜式方程为:
FP(i)mEP(i)
(7-9)其中:
mtg(iDT)
(7-10)
(7-10)式中的m为直线OP(i)的斜率,i、DT的意义与前面相同。
在EOF坐标系中的正立竖放椭圆的标准方程为:
(EP(i))2(FP(i))2
1(7-11)
22ab将(7-9)式代入到(7-11)式,并顾及(7-10)式,可解得:
a2b(EP(i))2
(7-12)22batg(iDT)2 157 则O点至P(i)点的距离为:
D(i)(EP(i))2(FP(i))2
a2b2a2b22m2
(7-13)
b2a2m2ba2m2从式(7-13)可以看出,D(i)的计算与坐标系无关,也可以说与椭圆倾斜角度无关。在图7-1与图7-2中,不论椭圆是正立竖放,还是倾斜任意角度的,D(i)是不变的。因此,P(i)点在坐标系XOY中的坐标按坐标正算公式可得:
XP(i)XOD(i)Cos(TiDT)
(7-14)
YP(i)YOD(i)Sin(TiDT)
编程中,如图7-1所示,从G点开始依顺时针方向用LINE依次连接相邻点,最后,再回到G点,即可绘出所要求的误差椭圆。
4、计算P(i)点坐标的递推计算方法
该方法与计算P(i)点坐标的参数方程法基本相同,只是编程计算中采用了递推计算的方法计算Cos(t)和Sin(t)。详见后面的示例程序。
三、坐标轴的平移、旋转公式(即(7-5)式、(7-6)式的推导过程)
如图7-3所示,设P点在坐标系
,YP),O点XOY中的坐标为(XP在坐标系XOY中的坐标为(XO,YO);经
图7-3 坐标轴的平移、旋转
,YP)平移、旋转后,P点在坐标系XOY中的坐标为(XP,YP)。根据求(XP(XP,YP)的公式如下:
XPXOA1P
X0OPCos()
sCosOPSinSin
XOOPCoCosYPSin XOXPYPYOOA1
Y0OPSin()
YOOPSinCosOPCosSin
158 SinYPCos
YOXP,YP)(XO,YO)、(XP,YP)根据、,也可求得,有以下两种方法。(XP、YP。方法一:根据上面的两式联立方程组,可解得XP方法二:如图7-3所示,设POA11,则可得:
OPSin(1)
XP
OPSinCos1OPCosSin(YPYO)Sin(XPXO)Cos
OPCos(1)
YP
OPCosCos1OPSinSin1
(YPYO)Cos(XPXO)Sin
四、正立横放椭圆的参数方程与标准方程
绘制倾斜任意角度的误差椭圆时,也可根据正立横放椭圆推导出另一套公式进行编程。
如图7-4所示,正立横放椭圆的参数方程为:
图7-4 正立横放椭圆
XPXBbCos YYaSinAP 在坐标系XOY中,椭圆中心位于坐标原点的正立横放椭圆的标准方程为:
Y2X21 a2b
2五、绘制误差椭圆程序示例(输出图形见图7-5)
Private Sub GPHPIC22_Click()Rem ***** 绘制误差椭圆菜单子过程 ***** Dim X As Double Dim Y As Double Dim A As Double
159 Dim B As Double Dim T As String Cls
Form2.DrawStyle = 0: ' ***** 设定绘制单实线
Form2.DrawWidth = 1: ' ***** 设定绘制单实线的线宽
Form2.Line(1, 7)-(199, 143), RGB(255, 0, 0), B: '***** 绘制一个红色矩形作为绘图区域。
X = 80: '***** 椭圆中心测量纵坐标 ***** Y = 100: '***** 椭圆中心测量横坐标 ***** A = 25.4: '***** 椭圆长半轴 ***** B = 9.5: '***** 椭圆短半轴 ***** T = “138 54 12”: '***** 椭圆长半轴坐标方位角 **** Call GPHP15(X, Y, A, B, T)End Sub
Private Sub GPHP15(ByVal XC As Double, ByVal YC As Double, ByVal A As Double, ByVal B As Double, ByVal T As String)Rem ***** 绘制误差椭圆子过程 ***** Dim II As Integer Dim N As Integer Dim I As Integer Dim DT As Double Dim TT As Double: '***** 椭圆长半轴坐标方位角 ****
N = 200
ReDim X(N + 1)As Double ReDim Y(N + 1)As Double
TT = RAD(T): '***** 程序中T应为度、分、秒(字符串)DT = 2 * PI()/ N
II = 3: '***** 选择绘制椭圆的方法
Select Case II Case 1: '***** 用椭圆参数方程及将坐标进行平移、旋转变换的方法
Form2.PSet(YC + A * Sin(TT), XC + A * Cos(TT)), RGB(0, 0, 0)
For I = 1 To N
X(I)= XC + A * Cos(I * DT)* Cos(TT)ST * SS: '***** 递推求算Cos(i*DT)
ST = ST * CC + CT * SS: '***** 递推求算Sin(i*DT)
CT = DCT
XP = XC + A * CT * Cos(TT)-B * ST * Sin(TT)
YP = YC + A * CT * Sin(TT)+ B * ST * Cos(TT)
Form2.Line-(YP, XP), RGB(0, 0, 0)
Next I
Case 3: '***** 用点斜式直线方程与竖放椭圆的标准方程联立方程组
Rem ***** 解算椭圆中心O(0,0)至椭圆圆周交点距离的方法
Dim AT As Double
Dim BT As Double
Dim XI As Double
Dim YI As Double
Dim M As Double
Dim DI As Double
Dim XPI As Double
Dim YPI As Double
Form2.PSet(YC + A * Sin(TT), XC + A * Cos(TT)), RGB(0, 0, 0)
161
AT = A ^ 2
BT = B ^ 2
For I = 1 To N
M = Tan(I * DT): '***** 直线的斜率
M = M ^ 2
XI = AT * BT /(BT + AT * M): '***** 正立竖放椭圆圆周i点纵坐标的平方,X(i)^2
YI = XI * M: '***** 正立竖放椭圆圆周i点横坐标的平方,Y(i)^2
DI = Sqr(XI + YI): '***** 椭圆中心至椭圆圆周i点的距离D(i)
XPI = XC + DI * Cos(TT + I * DT): '***** 斜立椭圆圆周i点的纵坐标XP(i)
YPI = YC + DI * Sin(TT + I * DT): '***** 斜立椭圆圆周i点的横坐标YP(i)
Form2.Line-(YPI, XPI), RGB(0, 0, 0)
Next I End Select
Rem ***** 绘制椭圆的长、短轴,用坐标正算的方法 *****
Dim X1 As Double
Dim Y1 As Double
Dim X2 As Double
Dim Y2 As Double
X1 = XC + A * Cos(TT)
Y1 = YC + A * Sin(TT)
X2 = XC + A * Cos(TT + PI())
图7-5 误差椭圆
Y2 = YC + A * Sin(TT + PI())
Line(Y1, X1)-(Y2, X2), RGB(255, 0, 0)
X1 = XC + B * Cos(TT + PI()/ 2)
Y1 = YC + B * Sin(TT + PI()/ 2)
X2 = XC + B * Cos(TT + 3 * PI()/ 2)
Y2 = YC + B * Sin(TT + 3 * PI()/ 2)
Line(Y1, X1)-(Y2, X2), RGB(255, 0, 0)
Rem ***** 以下绘制测量坐标系及方框 ***** Rem ***** 略 ***** End Sub
162 §7-2 绘制误差曲线的程序设计方法
一、误差曲线简介
误差曲线的方程为:
2ma2Cos2b2Sin2
式中:
a —— 误差曲线所对应的误差椭圆的长半轴 b —— 误差曲线所对应的误差椭圆的短半轴
—— 以a为起始方向、以误差曲线中心为起始点、沿顺时针方向对应误差曲线上某点的方向角
m—— 对应任意方向角的误差曲线上某点的位差
以不同的和m为极坐标的点的轨迹为一条闭合的曲线。显然,从曲线中心O至曲线上任意点P(对应误差曲线上某点的方向角为)的向径OP就是该方向的位差m。这个曲线可以把各方向的位差清楚地图解出来。
在工程测量中,误差曲线的用途是广泛的。根据这个图可以确定坐标平差值在各个方向上的位差。参见文献[34] P461-462)
二、误差曲线的程序设计方法
由于编程语言中没有现成的语句、命令、函数或方法来绘制倾斜任意角度的误差曲线,因此,下面研究在计算机屏幕上绘制倾斜任意角度的误差曲线的编程方法。
绘制倾斜任意角度的误差曲线时,已知数据如下: 对应误差曲线的误差椭圆的长半轴:A(或a)对应误差曲线的误差椭圆的短半轴:B(或b)对应误差曲线的误差椭圆中心点的测量坐标系坐标:(XO,YO)对应误差曲线的误差椭圆长半轴在测量坐标系中的坐标方位角:T 下面讨论问题及编程中所使用的平面坐标系均为测量平面直角坐标系,即纵轴向上为X轴正向,横轴向右为Y轴正向。
绘制倾斜任意角度的误差曲线的基本思路是:首先,求出在测量坐标系中坐标方位角为T的椭圆长半轴与椭圆圆周的交点G(该点也是椭圆长半轴与误差曲线的交点)的坐标;然后,再求出误差曲线上一系列点P(i)的坐标;最后,从G点开始用画直线方法LINE依次连接相邻点。
为了用画直线方法LINE依次连接相邻点时所画出的直线趋近于误差曲线,需要将误差曲线上一系列点P(i)分布的合理,即P(i)与P(i1)的距离应足够小,且任意相邻两点P(i)与P(i1)和误差曲线中心(也是误差椭圆中心)相连的直线的夹角均相等——这是为了使编程计算有规律性。
实际编程中,如图7-6所示,在测量坐标系中坐标方位角为T的椭圆长半轴与椭圆圆周的交点G的坐标,应以椭圆中心点坐标(Xo,Yo)作为起始坐标、以椭圆的长半轴A为距离、以T为坐标方位角、按坐标正算的方法计算G点的坐标:
163 XGX0ACos(T)YGY0ASin(T)椭圆长轴与椭圆圆周的另一个交点GA的坐标为:
sT)XGAX0ACo(
YYASin(T)0GA椭圆短轴与椭圆圆周的两个交点F、FA的坐标分别为:
XXBCos(T)0F2 YYBSin(T)F023XXBCos(T)FA02 YYBSin(T3)FA02根据上述坐标,用画直线方法LINE可
图7-6 倾斜任意角度的误差曲线
画出椭圆的长轴及短轴,这也是误差曲线的 长轴及短轴。
计算倾斜任意角度T的误差曲线上任意点P(i)坐标的方法,可采用与绘制误差椭圆相同的方法,如图7-6所示。
首先,求出在测量坐标系中坐标方位角为T的椭圆长半轴与椭圆圆周的交点G的坐标。
然后,再求出误差曲线上一系列点P(i)到误差曲线中心的距离。不论误差曲线是正立竖放,还是倾斜任意角度的,这个距离值是确定不变的,因此,可按正立竖放的误差曲线求算该距离值,如图7-7所示,对于误差曲线上的任意一点P(i),有t。
D(i)ma2Cos2b2Sin2
实际编程中,可取iDT。
图7-7 竖立正放的误差曲线 按坐标正算可得误差曲线上任意点P(i)的坐标:
XP(i)XOD(i)Cos(TiDT)
YP(i)YOD(i)Sin(TiDT)164 最后,在图7-6中从G点开始用画直线方法LINE依次连接相邻点,即可绘出误差曲线。
三、误差曲线编程示例(含屏幕显示及打印机打印误差曲线两部分)(见图7-8)
Private Sub GPHPIC23_Click()Rem ***** 绘制误差曲线一级菜单子过程 ***** End Sub
Private Sub GPHPIC24_Click()Rem ***** 显示误差曲线菜单子过程 ***** Dim X As Double Dim Y As Double Dim A As Double Dim B As Double Dim T As String Cls Form2.DrawStyle = 0: ' ***** 设定绘制单实线
Form2.DrawWidth = 1: ' ***** 设定绘制单实线的线宽
Form2.Line(1, 7)-(199, 143), RGB(255, 0, 0), B: '绘制一个红色矩形作为绘图区域。X = 80: '***** 曲线中心测量纵坐标 ***** Y = 100: '***** 曲线中心测量横坐标 ***** A = 25.4: '***** 对应误差曲线的误差椭圆的长半轴 ***** B = 9.5: '***** 对应误差曲线的误差椭圆的短半轴 ***** T = “138 54 12”: '***** 对应误差曲线的误差椭圆的长半轴坐标方位角 **** Call GPHP16(X, Y, A, B, T, 1)End Sub
Private Sub GPHPIC25_Click()Rem ***** 打印机打印误差曲线菜单子过程 Dim X As Double Dim Y As Double Dim A As Double Dim B As Double Dim T As String Cls Form2.DrawStyle = 0: ' ***** 设定绘制单实线
Form2.DrawWidth = 1: ' ***** 设定绘制单实线的线宽
Form2.Line(1, 7)-(199, 143), RGB(255, 0, 0), B: '绘制一个红色矩形作为绘图区域。
X = 80: '***** 曲线中心测量纵坐标 ***** Y = 100: '***** 曲线中心测量横坐标 ***** A = 25.4: '***** 对应误差曲线的误差椭圆的长半轴 ***** B = 9.5: '***** 对应误差曲线的误差椭圆的短半轴 ***** T = “138 54 12”: '***** 对应误差曲线的误差椭圆的长半轴坐标方位角 **** Call GPHP16(X, Y, A, B, T, 2)165 End Sub
Private Sub GPHP16(ByVal XC As Double, ByVal YC As Double, ByVal A As Double, ByVal B As Double, ByVal T As String, ByVal PP As Integer)Rem ***** 屏幕显示及打印机打印误差曲线子过程 ***** Rem ***** 当PP=1时,屏幕显示误差曲线 ***** Rem ***** 当PP=2时,打印机打印误差曲线 ***** Dim N As Integer Dim I As Integer Dim DT As Double Dim TT As Double: '***** 对应误差曲线的误差椭圆的长半轴坐标方位角 ****
N = 400 TT = RAD(T): '***** 程序中T应为度、分、秒(字符串)DT = 2 * PI()/ N
Rem ***** 用点斜式直线方程与竖放椭圆(或竖放误差曲线)的标准方程联立方程组 Rem ***** 解算椭圆中心O(0,0)至椭圆圆周(或竖放误差曲线)交点距离的方法 Rem ***** 误差曲线的方程为:m^2=a^2*(Cos(t))^2+b^2*(Sin(t))^2 Dim AT As Double Dim BT As Double Dim XI As Double Dim YI As Double Dim M As Double Dim DI As Double Dim XPI As Double Dim YPI As Double
AT = A ^ 2 BT = B ^ 2
If PP = 1 Then Form2.PSet(YC + A * Sin(TT), XC + A * Cos(TT)), RGB(0, 0, 0)ElseIf PP = 2 Then Dim XXX As Printer For Each XXX In Printers If XXX.Orientation = vbPRORPortrait Then Set Printer = XXX: '* 设置为系统默认打印机,参见《VB6.0中文版参考详解》P502 Exit For End If Next
Printer.ScaleMode = 0: '***** 通常先设为零
Printer.ScaleMode = 6: '***** 设置打印机坐标系的单位是毫米
166
Dim ASPP As Single
ASPP = Printer.ScaleHeight / Printer.ScaleWidth: '*** 设置打印机新的绘图区坐标系纵横比
Rem ***** 当设置打印机坐标系的单位是毫米时,ASPP值约为0.72 Printer.ScaleWidth = 200: '*** 设置打印机新的绘图区坐标系宽为200 Printer.ScaleHeight =-Int(Printer.ScaleWidth * ASPP): '*** 设置打印机新的绘图区坐标系高
Printer.ScaleLeft =-0: '*** 设置打印机新的绘图区坐标系坐标原点横坐标值
Printer.ScaleTop =-Printer.ScaleHeight: '-ScaleHeight: '*** 设置打印机新的绘图区坐标系坐标原点纵坐标值
Rem ***** 通过以上的设定,将打印机绘图区坐标系设为与数学坐标系相同 Printer.DrawStyle = 0: ' ***** 设定打印机打印单实线
Printer.DrawWidth = 1: ' ***** 设定打印机打印单实线的线宽
Printer.PSet(YC + A * Sin(TT), XC + A * Cos(TT)): '*** 打印机打印 End If
For I = 1 To N M = Tan(I * DT): '***** 直线的斜率 M = M ^ 2 XI = AT * BT /(BT + AT * M): '***** 正立竖放椭圆圆周i点纵坐标的平方,X(i)^2 YI = XI * M: '***** 正立竖放椭圆圆周i点横坐标的平方,Y(i)^2 DI = Sqr(XI + YI): '***** 椭圆中心至椭圆圆周i点的距离D(i)XPI = XC + DI * Cos(TT + I * DT): '***** 斜立椭圆圆周i点的纵坐标XP(i)YPI = YC + DI * Sin(TT + I * DT): '***** 斜立椭圆圆周i点的横坐标YP(i)If PP = 1 Then Form2.Line-(YPI, XPI), RGB(0, 0, 0): '***** 绘制斜立误差椭圆 ElseIf PP = 2 Then Printer.Line-(YPI, XPI): '***** 打印机打印斜立误差椭圆 End If Next I
If PP = 1 Then Form2.PSet(YC + A * Sin(TT), XC + A * Cos(TT)), RGB(0, 0, 255)ElseIf PP = 2 Then Printer.PSet(YC + A * Sin(TT), XC + A * Cos(TT)): '*** 打印机打印 End If
For I = 1 To N DI = Sqr(AT *(Cos(I * DT))^ 2 + BT *(Sin(I * DT))^ 2): '***** 误差曲线中心至曲线上i点的距离D(i)XPI = XC + DI * Cos(TT + I * DT): '***** 斜立误差曲线上i点的纵坐标XP(i)167 YPI = YC + DI * Sin(TT + I * DT): '***** 斜立误差曲线上i点的横坐标YP(i)If PP = 1 Then Form2.Line-(YPI, XPI), RGB(0, 0, 255): '***** 绘制斜立误差曲线 ElseIf PP = 2 Then Printer.Line-(YPI, XPI): '***** 打印机打印斜立误差曲线 End If Next I
Rem ***** 绘制椭圆的长、短轴,用坐标正算的方法 ***** Dim X1 As Double Dim Y1 As Double Dim X2 As Double Dim Y2 As Double
X1 = XC + A * Cos(TT)Y1 = YC + A * Sin(TT)X2 = XC + A * Cos(TT + PI())Y2 = YC + A * Sin(TT + PI())If PP = 1 Then Line(Y1, X1)-(Y2, X2), RGB(255, 0, 0)ElseIf PP = 2 Then Printer.Line(Y1, X1)-(Y2, X2): '*** 打印机打印 End If
X1 = XC + B * Cos(TT + PI()/ 2)Y1 = YC + B * Sin(TT + PI()/ 2)X2 = XC + B * Cos(TT + 3 * PI()/ 2)Y2 = YC + B * Sin(TT + 3 * PI()/ 2)If PP = 1 Then Line(Y1, X1)-(Y2, X2), RGB(255, 0, 0)ElseIf PP = 2 Then Printer.Line(Y1, X1)-(Y2, X2): '*** 打印机打印
Printer.EndDoc: '***** 该方法(EndDoc)意思为“开始打印” End If Rem ***** 以下绘制测量坐标系及方框 ***** Rem ***** 略 ***** End Sub
图7-8 误差椭圆与误差曲线
168
第五篇:VB程序设计的常用算法教案
VB程序设计的常用算法教案
算法(Algrith):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采 取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何 安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。
一、计数、求和、求阶乘等简单算法
此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条,更要注意用来表示计数、和、阶 乘的变量的初值。
例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,6,7,8,9,0的 数的个数并打印出来。
本题使用数组来处理,用数组a存放产生的确100个随机整数,数组x来存放个位上的数字分
别为1,2,3,4,6,7,8,9,0的数的个数。即个位是1的个数存放在x中,个位是2的个数存放在x中,…… 个位是0的个数存放在x。
将程序编写在一个GetTput过程中,代码如下: PubliSubGetTput
DiaAsInteger
DixAsInteger
DiiAsInteger,pAsInteger
'产生100个[0,99]范围内的随机整数,每行印出来
Fri=1T100
a=Int
Ifa<10Then
Fr1PrintSpae;a;
10个打
Else
Fr1PrintSpae;a;
EndIf
Ifid10=0ThenFr1Print
Nexti
'统计个位上的数字分别为1,2,3,4,6,7,8,9,0的数的个数,并将统计结果保存在数组x,x,x中,将统计结果打印出来
Fri=1T100
p=a
d
0
'求个位上的数字
Ifp=0Thenp=10
x=x+1
Nexti
Fr1Print&qut;统计结果&qut;
Fri=1T10
p=i
Ifi=10Thenp=0 Fr1Print&qut;个位数为&qut;+Str+&qut;&qut;+Str)+&qut;个&qut;
Nexti EndSub
二、求两个整数的最大公约数、最小公倍数 分析:求最大公约数的算法思想:
对于已知两数,n,使得>n;
共
除以n得余数r;
若r=0,则n为求得的最大公约数,算法结束;否则执行;
←n,n←r,再重复执行。
例如:求=14,n=6的最大公约数
n
r
0 =inputBx n=inputBx n=n* If r=dn Dhile =n n=r r=dn Lp Print&qut;最大公约数=&qut;,n [1] [2] [3] [4] [] [6] [7] 下一页 <