一、程序设计基本知识

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

1.1 程序与程序语言
1.2.1 程序与程序语言
1.计算机语言
什么是计算机语言?为什么要使用计算机语言?过去,一提到语言这个词,人们自然想到的是像英语、汉语等这样的自然语言,因为它是人和人相互交流信息不可缺少的工具。

而今天,计算机遍布了我们生活的每一个角落,除了人和人之间的相互交流之外,我们必须和计算机交流。

用什么样的方式和计算机做最直接的交流呢?人们自然想到的是最古老也最方便的方式--语言。

人和人交流用的是双方都能听懂和读懂的自然语言,同样,人和计算机交流也要用人和计算机都容易接受和理解的语言,这就是计算机语言。

人们用自然语言讲述和书写,目的是给另外的人传播信息。

同样,我们使用计算机语言把我们的意图表达给计算机,目的是使用计算机。

计算机语言是根据计算机的特点而编制的,它没有自然语言那么丰富多样,而只是有限规则的集合,所以它简单易学。

但是,也正因为它是根据机器的特点编制的,所以交流中无法意会和言传,而更多地表现了说一不二,表现了"规则"的严谨。

例如该是";"的地方不能写成".",该写"a"的地方不能写成"A",这使得人和计算机的交流在一开始会有些不习惯。

不过,只要认识到计算机语言的特点,注意学习方法,把必须的严谨和恰当的灵活相结合,一切都会得心应手。

2.程序
我们知道,计算机是一种具有内部存储能力的自动、高效的电子设备,它最本质的使命就是执行指令所规定的操作。

如果我们需要计算机完成什么工作,只要将其步骤用诸条指令的形式描述出来,并把这些指令存放在计算机的内部存储器中,需要结果时就向计算机发出一个简单的命令,计算机就会自动逐条顺序执行操作,全部指令执行完就得到了预期的结果。

这种可以被连续执行的一条条指令的集合称为计算机的程序。

也就是说,程序是计算机指令的序列,编制程序的工作就是为计算机安排指令序列。

但是,我们知道,指令是二进制编码,用它编制程序既难记忆,又难掌握,所以,计算机工作者就研制出了各种计算机能够懂得、人们又方便使用的计算机语言,程序就是用计算机语言来编写的。

因此,计算机语言通常被称为"程序语言",一个计算机程序总是用某种程序语言书写的。

3.程序语言的发展
程序语言的产生和发展,直接推动了计算机的普及和应用。

自第一个高级语言问世以来,人们已发明了上千种程序语言,常用的也有上百种。

这些语言之间有什么区别,我们应该学习哪一种?
计算机语言按使用方式和功能别可分为低级语言和高级语言。

低级语言包括机器语言和汇编语言。

机器语言就是计算机指令的集合,它与计算机同时诞生,是第一代的计算机语言;汇编语言是用符号来表示计算机指令,被称为第二代语言。

机器语言和汇编语言都是围绕特定的计算机或计算机族而设计的,是面向计算机的语言。

要使用这种语言必须了解计算机的内部结构,而且难学、难写、难记忆,把这种语言称为低级语言。

因为低级语言是难以普及应用的,为此便产生了第三代语言--高级语言。

它采用了完全符号化的描述形式,用类似自然语言的形式描述对问题的处理过程,用数学表达式的形式描述对数据的计算过程。

可见,高级语言只是要求人们向计算机描述问题的求解过程,而不关心计算机的内部结构,所以把高级语言称为"面向过程语言",它易于被人们理解和接受。

典型的面向过程语言有BASIC、FORTRAN、COBOL、C、Pascal等等。

随着计算机技术的迅猛发展,自从80年代以来,众多的第四代非过程化语言、第五代智能化语言也竞相推出。

如果说第三代语言要求人们告诉计算机怎么做,那么第四代语言只要求人们告诉计算机做什么。

因此,人们称第四代语言是"面向对象语言"。

面向对象概念的提出是相对于"面向过程"的一次革命,面向对象技术在系统程序设计、多媒体应用、数据库等诸多领域得到广泛应用。

但是,"
面向过程"是程序设计的基础,尤其对于程序设计的初学者。

所以,我们将以面向过程的C程序设计语言为背景,主要介绍程序设计的基本概念和方法。

在本书最后一章中,我们将结合Visual C++ 6.0,介绍面向对象程序设计语言的基本概念和初步使用。

上一页下一页
1.2 算法和算法的表示
1.2.1 算法的概念
1.算法的基本概念
什么是算法?当代著名计算机科学家D.E.Knuth在他撰写的《THE ART OF COMPUTER PROGRAMMING》一书中写到:"一个算法,就是一个有穷规则的集合,其中之规则规定了一个解决某一特定类型的问题的运算序列。

"简单地说,任何解决问题的过程都是由一定的步骤组成的,把解决问题确定的方法和有限的步骤称作为算法。

需要说明的是,不是只有计算问题才有算法。

例如,加工一张写字台,其加工顺序是:桌腿桌面抽屉组装,这就是加工这张写字台的算法。

当然,如果是按"抽屉桌面桌腿组装"这样的顺序加工,那就是加工这张写字台有另一种算法,这其中没有计算问题。

通常计算机算法分为两大类:数值运算算法和非数值运算算法。

数值运算是指对问题求数值解,例如对微分方程求解、对函数的定积分求解、对高次方程求解等,都属于数值运算范围。

非数值运算包括非常广泛的领域,例如资料检索、事务管理、数据处理等。

数值运算有确定的数学模型,一般都有比较成熟的算法。

许多常用算法通常还会被编写成通用程序并汇编成各种程序库的形式,用户需要时可直接调用。

例如数学程序库、数学软件包等。

而非数值运算的种类繁多,要求不一,很难提供统一规范的算法。

在一些关于算法分析的著作中,一般也只是对典型算法作详细讨论,其它更多的非数值运算是需要用户设计其算法的。

下面通过三个简单的问题说明设计算法的思维方法。

例1-1:有黑和蓝两个墨水瓶,但却错把黑墨水装在了蓝墨水瓶子里,而蓝墨水错装在了黑墨水瓶子里,要求将其互换。

算法分析:这是一个非数值运算问题。

因为两个瓶子的墨水不能直接交换,所以,解决这一问题的关键是需要引入第三个墨水瓶。

设第三个墨水瓶为白色,其交换步骤如下:
①将黑瓶中的蓝墨水装入白瓶中;
②将蓝瓶中的黑墨水装入黑瓶中;
③将白瓶中的蓝墨水装入蓝瓶中;
④交换结束。

例1-2:计算函数M(x)的值。

函数M(x)为:
其中,a,b,c为常数。

算法分析:本题是一个数值运算问题。

其中M代表要计算的函数值,有两个不同的表达式,根据x的取值决定采用哪一个算式。

根据计算机具有逻辑判断的基本功能,用计算机解题的算法如下:
①将a、b、c和x的值输入到计算机;
②判断x≤a?如果条件成立,执行第③步,否则执行第④步;
③按表达式bx+a2计算出结果存放到M中,然后执行第⑤步;
④按表达式a(c-x)+c3计算出结果存放到M中,然后执行第⑤步;
⑤输出M的值;
⑥算法结束。

例1-3:给定两个正整数m和n(m≥n),求它们的最大公约数。

算法分析:这也是一个数值运算问题,它有成熟的算法,我国数学家秦九韶在《算书九章》一书中曾记载了这个算法。

求最大公约数的问题一般用辗转相除法(也称欧几里德算法)求解。

例如:设m 35,n 15,余数用r表示。

它们的最大公约数的求法如下:
35/15商2 余数为5 以n作m,以r作n,继续相除;
15/5商3 余数为0 当余数为零时,所得n即为两数的最大公约数。

所以35和15两数的最大公约数为5。

用这种方法求两数的最大公约数,其算法可以描述如下:
①将两个正整数存放到变量m和n中;
②求余数:计算m除以n,将所得余数存放到变量r中;
③判断余数是否为0:若余数为0则执行第⑤步,否则执行第④步;
④更新被除数和余数:将n的值存放到m中,将r的值存放到n中,并转向第②步继续循环执行;
⑤输出n的当前值,算法结束。

如此循环,直到得到结果。

由上述三个简单的例子可以看出,一个算法由若干操作步骤构成,并且这些操作是按一定的控制结构所规定的次序执行。

如例1-1中的四个操作步骤是顺序执行的,称之为顺序结构。

而在例1-2中,则不是按操作步骤顺序执行,也不是所有步骤都执行。

如第三步和第四步的两个操作就不能同时被执行,它们需要根据条件判断决定执行哪个操作,这种结构称之为分支结构。

在例1-3中不仅包含了判断,而且需要重复执行。

如第二步到第五步之间的步骤就需要根据条件判断是否重复执行,并且一直延续到条件"余数为0"为止,这种具有重复执行功能的结构称之为循环结构。

2.算法的两要素
由上述三个例子可以看出,任何简单或复杂的算法都是由基本功能操作和控制结构这两个要素组成。

不论计算机的种类如何之多,但它们最基本的功能操作是一致的。

计算机的基本功能操作包括以下四个方面:
(1) 逻辑运算:与、或、非;
(2) 算术运算:加、减、乘、除;
(3) 数据比较:大于、小于、等于、不等于、大于等于、小于等于;
(4) 数据传送:输入、输出、赋值。

算法的控制结构决定了算法的执行顺序。

如以上例题所示,算法的基本控制结构通常包括顺序结构、分支结构和循环结构。

不论是简单的还是复杂的算法,都是由这三种基本控制结构组合而成的。

算法是对程序控制结构的描述,而数据结构是对程序中数据的描述。

因为算法的处理对象必然是问题中所涉及到的相关数据,所以不能离开数据结构去抽象地分析程序的算法,也不能脱离算法去孤立地研究程序的数据结构,而只能从算法和数据结构的统一上去认识程序。

但是,在计算机的高级语言中,数据结构是通过数据类型表现的,本书在第三章、第七章、第十章和第十一章中,将通过对C语言数据类型的详细描述说明数据结构在程序设计中的作用。

这里我们只讨论算法的问题。

需要强调的是,设计算法与演绎数学有明显区别,演绎数学是以公理系统为基础,通过有限次推演完成对问题的求解。

每次推演都是对问题的进一步求解,如此不断推演,直到能将问题的解完全描述出来为止。

而设计算法则是充分利用解题环境所提供的基本操作,对输入数据进行逐步加工、变换和处理,从而达到解决问题的目的。

上一页下一页
1.3 结构化程序设计方法
程序设计的基本目标是用算法对问题的原始数据进行处理,从而获得所期望的效果。

但这仅仅是程序设计的基本要求。

要全面提高程序的质量,提高编程效率,使程序具有良好的可读性、可靠性、可维护性以及良好的结构,编制出好的程序来,应当是每位程序设计工作者追求的目标。

而要做到这一点,就必须掌握正确的程序设计方法和技术。

1.3.1 程序的三种基本结构
结构化程序的概念首先是从以往编程过程中无限制地使用转移语句而提出的。

转移语句可以使程序的控制流程强制性的转向程序的任一处,在传统流程图中,就是用上节我们提到的"很随意"的流程线来描述这种转移功能。

如果一个程序中多处出现这种转移情况,将会导致程序流程无序可寻,程序结构杂乱无章,这样的程序是令人难以理解和接受的,并且容易出错。

尤其是在实际软件产品的开发中,更多的追求软件的可读性和可修改性,象这种结构和风格的程序是不允许出现的。

为此提出了程序的三种基本结构。

在讨论算法时我们列举了程序的顺序、选择和循环三种控制流程,这就是结构化程序设计方法强调使用的三种基本结构。

算法的实现过程是由一系列操作组成的,这些操作之间的执行次序就是程序的控制结构。

1996年,计算机科学家Bohm和Jacopini证明了这样的事实:任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。

所以,这三种结构就被称为程序设计的三种基本结构。

也是结构化程序设计必须采用的结构。

1. 顺序结构
顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的,其流程如图1-6所示。

图中的s1和s2表示两个处理步骤,这些处理步骤可以是一个非转移操作或多个非转移操作序列,甚至可以是空操作,也可以是三种基本结构中的任一结构。

整个顺序结构只有一个入口点a和一个出口点b。

这种结构的特点是:程序从入口点a开始,按顺序执行所有操作,直到出口点b处,所以称为顺序结构。

上一节图1-2表示的就是一个顺序结构的流程图。

事实上,不论程序中包含了什么样的结构,而程序的总流程都是顺序结构的。

例如,在图1-3、图1-4和图1-5所表示的流程图中,其总体结构流程都是自上而下顺序执行的。

2.选择结构
选择结构表示程序的处理步骤出现了分支,它需要根据某一特定的条件选择其中的一个分支执行。

选择结构有单选择、双选择和多选择三种形式。

双选择是典型的选择结构形式,其流程如图1-8所示,图中的s1和s2与顺序结构中的说明相同。

由图中可见,在结构的入口点a处是一个判断框,表示程序流程出现了两个可供选择的分支,如果条件满足执行s1处理,否则执行s2处理。

值得注意的是,在这两个分支中只能选择一条且必须选择一条执行,但不论选择了哪一条分支执行,最后流程都一定到达结构的出口点b处。

前面的图1-3中就采用了双选择结构流程图。

当s1和s2中的任意一个处理为空时,说明结构中只有一个可供选择的分支,如果条件满足执行s1处理,否则顺序向下到流程出口b处。

也就是说,当条件不满足时,什么也没执行,所以称为单选择结构,如图1-7所示。

多选择结构是指程序流程中遇到如图1-9所示的s1、s2、……、sn等多个分支,程序执行方向将根据条件确定。

如果满足条件1则执行s1处理,如果满足条件n则执行Sn处理,总之要根据判断条件选择多个分支的其中之一执行。

不论选择了哪一条分支,最后流程要到达同一个出口处。

如果所有分支的条件都不满足,则直接到达出口。

有些程序语言不支持多选择结构,但所有的结构化程序设计语言都是支持的,C语言是面向过程的结构化程序设计语言,它可以非常简便的实现这一功能。

本书在第五章将详细介绍各种形式的选择结构应用问题。

3.循环结构
循环结构表示程序反复执行某个或某些操作,直到某条件为假(或为真)时才可终止循环。

在循环结构中最主要的是:什么情况下执行循环?哪些操作需要循环执行?循环结构的基本形式有两种:当型循环和直到型循环,其流程如图1-10所示。

图中虚线框内的操作称为循环体,是指从循环入口点a到循环出口点b之间的处理步骤,这就是需要循环执行的部分。

而什么情况下执行循环则要根据条件判断。

当型结构:表示先判断条件,当满足给定的条件时执行循环体,并且在循环终端处流程自动返回到循环入口;如果条件不满足,则退出循环体直接到达流程出口处。

因为是"当条件满足时执行循环",即先判
断后执行,所以称为当型循环。

其流程如图1-10(a)所示。

直到型循环:表示从结构入口处直接执行循环体,在循环终端处判断条件,如果条件不满足,返回入口处继续执行循环体,直到条件为真时再退出循环到达流程出口处,是先执行后判断。

因为是"直到条件为真时为止",所以称为直到型循环。

其流程如图1-10(b)所示。

本章图1-5用迭代法求和的流程图就是一个典型的直到型循环结构。

同样,循环型结构也只有一个入口点a和一个出口点b,循环终止是指流程执行到了循环的出口点。

图中所表示的S处理可以是一个或多个操作,也可以是一个完整的结构或一个过程。

整个虚线框中是一个循环结构。

通过三种基本控制结构可以看到,结构化程序中的任意基本结构都具有唯一入口和唯一出口,并且程序不会出现死循环。

在程序的静态形式与动态执行流程之间具有良好的对应关系。

上一页下一页
本章小结
本章介绍的基本内容有:语言、程序和程序设计;算法、算法设计和算法的表示;程序结构、结构化程序和程序风格。

语言是交流的工具,程序是指令的集合,而程序设计就是用计算机语言对所要解决的问题进行完整而准确的描述过程。

一个完整的程序应该涉及到以下四个方面的问题:
数据结构、算法、编程语言、程序设计方法
程序设计过程的五个步骤是:①分析问题,建立数学模型;②确定数据结构和算法;③编制程序;④测试程序。

其中第①、②步就是确定解决问题的方案;第③步是用程序语言把这个解决方案严格的描述出来;第④步是在计算机上测试这个程序。

在这里,工作过程的第①、②步与其他领域里解决问题的方法相类似,只是考虑问题的基础不同、出发点不同。

在程序设计领域里,我们需要从计算的观点、程序的观点出发,由此引出了数据结构、算法设计以及算法的表示等新问题。

这是本章的重点,也是程序设计的基础。

第③、④步是程序设计工作的特殊问题。

由于程序设计具有严格规定的组成结构,各种结构有明确定义的功能和形式,要把问题解决方案转变为符合这些结构的形式,这也不是轻而易举的,需要掌握相关的技术和方法。

由此引出了程序的三种基本结构、流程图、N-S图和结构化程序设计等方法和技术。

这些都是程序设计的
基本知识,每一个程序设计工作者都必须掌握。

会用一些常用算法(例如迭代法、枚举法、递归法等)解决实际问题,对于初学者来说,是至关重要的。

许多初学者往往是把要解决的问题首先和程序设计语言中的语句联系在一起,影响了程序设计质量。

设计算法和编写程序要分开考虑,当你还没有学习程序语言时,就学会针对一些简单问题设计算法,这是学习程序设计入门的好方法。

程序的结构化技术是程序设计的基本技术,它使得程序在逻辑上层次分明、结构清晰、易读、易维护,从而提高程序质量和开发效率。

采用结构化程序设计方法,并且用流程图表示算法是必须的。

将算法转换成程序代码,并注意程序风格,这都是编写代码时要注意的问题。

上一页
下一页
习题一
一、单选题
1-1. 以下______是面向过程的程序设计语言。

A. 机器语言
B. 汇编语言
C. 高级语言
D. 第四代语言
1-2. 程序设计一般包含以下四个步骤,其中首先应该完成的是______。

A. 设计数据结构和算法
B. 建立数学模型
C. 编写程序
D. 调试运行程序
1-3. 以下常用算法中,适合计算等差级数的算法是______。

A. 枚举法
B. 递推法
C.分治法
D. 排序法
1-4. 以下不属于算法基本特征的是______。

A. 有穷性
B. 有效性
C.可靠性
D. 有一个或多个输出
1-5.下面描述中,不正确的是______。

A. 程序就是软件,但软件不仅仅是程序。

B. 程序是指令的集合,计算机语言是编写程序的工具。

C. 计算机语言都是形式化语言,它有严格的语法规则和定义。

D. 计算机语言只能编写程序而不能表示算法。

1-6.下面描述中,正确的是______。

A. 结构化程序设计方法是面向过程程序设计的主流。

B. 算法就是计算方法。

C. 一个正确的程序就是指程序书写正确。

D. 计算机语言是编写程序的工具而不是表示算法的工具。

1-7.下面描述中,不正确的是______。

A. 递归法的关键是必须有一个递归终止条件。

B. 递归算法要求语言具有反复自我调用子程序的能力。

C. 对于同一个问题,递推算法比递归算法的执行时间要长。

D. 递推算法总可以转换为一个递归算法。

1-8. N-S图与传统流程图比较,其主要优点是______。

A. 杜绝了程序的无条件转移。

B. 具有顺序、选择和循环三种基本结构。

C. 简单、直观。

D. 有利于编写程序
二、填空题
1-9. 在流程图符号中,判断框中应该填写的是______。

1-10. 结构化程序设计是_______应遵循的方法和原则。

1-11. 结构化程序必须用_______程序设计语言来编写。

1-12. 可以被连续执行的一条条指令的集合称为计算机的_______。

1-13. 只描述程序应该"做什么",而不必描述"怎么做"的语言被称为_______。

1-14. 任何简单或复杂的算法都是由_______和_______这两个要素组成。

1-15. 算法的_______特征是指:一个算法必须在执行有限个操作步骤后终止。

1-16. 在三种基本结构中,先执行后判断的结构被称为______。

1-17. 在程序设计中,把解决问题确定的方法和有限的步骤称作为______。

1-18. 程序设计风格主要影响程序的______。

1-19. 用模块组装起来的程序被称为______结构程序。

1-20. 采用自上而下,逐步求精的设计方法便于______。

三、应用题
1-21. 用任何一种熟悉的方法描述求N个数中最小数的算法。

1-22. 试用枚举法设计例1-4中百钱买百鸡问题的算法,并用流程图表示。

1-23. 分别用递推和递归两种算法计算斐波那契数列:
f(n+2)=f(n+1)+f(n),f(1)=f(0)=1
的前30项,并用流程图表示。

1-24. 求例1-6中方程x3-x-1=0在x=1.5附近的一个根。

试用迭代法设计其算法,并用流程图表示。

1-25. 有一分数序列如下:
试用迭代法求出这个数列前20项之和,用流程图表示其算法。

1-26. 对输入的任意三个数a,b,c,要求按从小到大的顺序把它们打印出来,用流程图表示该算法。

1-27. 判断一个整数n能否同时被3和7整除,用流程图表示该算法。

1-28. 求某课全班的平均分,用流程图表示该算法。

上一页下一页。

相关文档
最新文档