第1章 程序设计基础Word格式.docx

上传人:b****7 文档编号:22449756 上传时间:2023-02-04 格式:DOCX 页数:16 大小:110.92KB
下载 相关 举报
第1章 程序设计基础Word格式.docx_第1页
第1页 / 共16页
第1章 程序设计基础Word格式.docx_第2页
第2页 / 共16页
第1章 程序设计基础Word格式.docx_第3页
第3页 / 共16页
第1章 程序设计基础Word格式.docx_第4页
第4页 / 共16页
第1章 程序设计基础Word格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

第1章 程序设计基础Word格式.docx

《第1章 程序设计基础Word格式.docx》由会员分享,可在线阅读,更多相关《第1章 程序设计基础Word格式.docx(16页珍藏版)》请在冰豆网上搜索。

第1章 程序设计基础Word格式.docx

前面已经提到,对同一个问题求解,当然允许有不同的算法,也允许存在不同的数据结构,而依不同算法编写的操作代码,其执行效率也就不一样。

5.语言

算法不仅要通过具体的语言来表述,还要采用合适的方法来表达,才能够形成程序。

可以这样说,算法是程序的灵魂,是解决“做什么”和“怎样做”的问题。

一个好的程序必须要有一个合理、高效的算法,数据结构是程序要处理的具体对象,语言是描述算法过程的工具。

6.程序设计的方法

程序设计方法分为两大类:

面向过程的程序设计方法和面向对象的程序设计方法。

面向过程的程序设计方法是将完成某项工作的每一个步骤和具体要求都考虑在内来设计程序,程序主要用于描述完成这项工作所涉及的数据对象和具体操作规则,如先做什么、后做什么、怎样做、如何做。

C语言是一种面向过程的程序设计语言。

面向对象的程序设计方法是将任何事物都看成一个对象,它们之间通过一定的渠道相互联系,对象是活动的、相互对立的,是可以激发的,每个对象都是由数据和操作规则构成的。

在进行程序设计时,主要针对一个个对象,所有数据分别属于不同的对象,并被封装在对象内,只要激发每个对象完成相对独立的操作功能,整个程序就会自然完成全部操作。

1.2算法和结构化程序设计

1.2.1算法的概念

做任何事情都有一定的步骤。

为解决一个问题而采取的方法和步骤,就称为算法。

计算机算法:

计算机能够执行的算法。

当设计一个程序时,通常先分析程序中需要的数据并对数据进行描述,即数据结构设计,然后再根据功能要求设计解决问题的方法,即算法设计,最后用某种计算机语言将其描述出来;

同时,为了保证程序有很高的正确性、可靠性、可读性、可理解性、可修改性和可维护性,在整个设计过程中,还必须采用科学的程序设计方法。

因此,可以把程序表示为:

程序=数据结构+算法+程序设计方法+语言工具和环境

数据结构指的是数据的组织形式,并且必须是允许定义和使用的数据结构。

根据数据的性质和结构,可以把数据定义为某种数据类型;

同时利用规定的数据类型,还可以构建更复杂的数据结构,如链表、堆栈、树等。

算法指的是解决问题的方法和步骤;

程序设计语言是全部计算机指令(语句)的集合;

按照程序设计语言的词法、语法和语义规则设计的计算机指令(语句)序列就是一个程序,而程序也是计算机算法的体现。

当设计和编写程序时,并不是简单地写一个程序,而是像一个工程,为了保证其质量,就必须采用科学的程序设计方法,程序设计方法的种类有很多,主要有结构化程序设计方法、面向对象程序设计方法等。

算法设计是程序设计的主要步骤,没有高质量的算法就没有高质量的程序。

算法(Algorithm)指的是解决问题的方法和步骤。

一个算术问题的解题过程、一首乐谱、一份菜谱、一个工作计划等都是一个算法。

人们在工作和生活中做每件事情都有其特定的步骤和方法。

在现代,特别是计算机诞生之后,人们把计算机解题步骤称为计算机算法,本书谈到的算法,没有特别说明,指的就是计算机算法。

1.2.2算法的特性

当设计和使用某个算法时,必然要考虑其是否可行。

使用一个没有价值的算法是没有任何意义的。

因而,算法具有若干约束特性,具有约束特性的算法才称其为算法。

著名计算机科学家Knuth在其《计算机程序设计艺术》一书中详细描述了算法的5个特性:

(1)有穷性:

算法是一组有穷步骤序列,即一个算法必须在执行有穷步骤后结束。

一个算法如果永远不能结束或需要运行相当长的时间才能结束,那么这样的算法是没有使用价值的。

(2)确定性:

算法中的每一个步骤都必须要有明确的定义,不能含糊、不能有歧义。

如“请面向前方”就有歧义,因为“前方”在无任何参照物的参照下,可能是东、南、西、北等的任何一方。

(3)大于等于0个输入:

在算法执行过程中可以有0个或若干个输入数据,即算法处理的数据既可以不从外部输入(内部生成),也可以从外部输入。

少量数据适合内部生成,而大量数据一般需要从外部输入,所以多数算法中要有输入数据的步骤。

(4)大于等于1个输出:

算法在执行过程中必须要有1个以上的输出操作,即算法中必须要有输出数据的步骤。

一个没有输出步骤的算法是毫无意义的。

(5)可行性:

算法中的每一步骤都是可实现的,即在现有计算机上是可执行的。

如:

当B是一个很小的实数时,A/B在代数中是正确的,但在算法中却是不正确的,因为它在计算机上无法执行,而要使A/B能正确执行,就必须在算法中使B满足条件:

|B|>

δ,其中δ是一个计算机允许的小的实数。

一个问题可有若干个不同的可行算法。

在不同的算法中有好算法,也有差算法,如:

针对同一问题,执行10分钟的算法要比执行1小时的算法好得多。

目前,评价算法质量主要有4个基本标准:

正确性、可读性、通用性和高效性。

一个好的算法应满足运行结果正确、可读性好、可适用一类问题的解决并执行速度快、运用时间短、占用内存少标准。

当然,高效性和可读性往往是矛盾的,可读性要优先于高效性。

目前,在计算机速度比较快、内存比较大的情况下,高效性已处于次要地位。

1.2.3算法的描述

对于算法,需要选择一种合适的描述工具进行描述。

常用的描述工具有自然语言、流程图、N-S图、伪代码等。

1.用自然语言描述算法

用自然语言描述算法就是选择某种日常使用的语言(如汉语、英语)来描述算法。

使用自然语言描述算法的优点是描述自然、通俗易懂而且灵活多样,但缺点是容易产生歧义;

因此,在算法设计中应少用或不用自然语言描述算法。

通常是在设计初步算法时适当采用自然语言描述,然后还需用其他描述工具细化算法描述。

【例1-1】输入两个数a、b的值,然后交换两数的值。

算法描述如下。

S1:

输入两个数a、b的值;

S2:

使a的值赋给c;

S3:

使b的值赋给a;

S4:

使c的值赋给b;

S5:

输出a、b的值。

【例1-2】输入两个正整数m和n,求两数的最大公约数。

输入正整数m、n的值;

若m小于n,则交换两个数的值;

求解m整除n的值,并赋给r;

使n的值赋给m;

使r的值赋给n;

S6:

当r的值不等于0,转S3继续执行;

否则执行S7;

S7:

输出两数的最大公约数的值m。

【例1-3】输入一个年份,判定其是否为闰年。

闰年判定的条件为:

能被4整除但不能被100整除的年份是闰年;

或者能被100整除又能被400整除的年份是闰年。

输入一个年份y;

若y不能被4整除,则输出“y不是闰年”;

若y能被4整除,但不能被100整除,则输出“y是闰年”;

若y既能被100整除,又能被400整除,则输出“y是闰年”;

否则输出“y不是闰年”。

2.用流程图描述算法

流程图是采用一些框图来描述算法的一种工具。

美国国家标准化协会ANSI和国际标准化组织ISO公布的标准(ISO5807—85)规定了流程图采用的一些框图,如图1-1所示。

其优点是描述简洁、清晰和直观,缺点是由于转移箭头可以无约束使用,所以会影响算法的可靠性。

流程图由以下几部分组成。

图1-1流程图中常用框图

开始结束框:

表示流程图的起点或终点,即开始或结束,框中给出开始或结束说明。

处理框:

表示各种处理功能,框中给出处理说明或一组操作。

输入/输出框:

表示数据的输入或输出,框中给出输入或输出数据说明。

判断框:

表示一个逻辑判断,框中给出判断条件说明或条件。

一般情况有两个出口,分别表示条件的成立或不成立(真或假、是或否),但在执行过程中只有一个出口被激活,如图1-2所示。

图1-2判断框

流程线:

表示算法的执行方向,且一定为单向线。

注释框:

表示对流程图某一部分的解释、说明。

一般绘制在侧面,如图1-2所示。

虚线:

表示被注释的范围,如图1-1所示。

连接:

表示流程线的断点(去向或来源),在图中给出断点编号,如图1-3所示。

图1-3连接示意图

1966年,Bohra和Jacopini提出了三种基本结构:

顺序结构、分支结构和循环结构。

(1)顺序结构。

顺序结构是一种最简单、最基本的结构。

在这种结构中,各程序块按照出现的顺序依次执行,如图1-4所示,表示A框执行完后立即执行B框;

它只有一个入口a和一个出口b。

(2)分支结构。

也称为选择结构,是根据给定的条件判断在两条可能的路径中选择哪一条,如图1-5所示,若条件P为真时执行A框处理,为假时执行B框处理;

当然,A、B框可为空,但不能同时为空。

在执行时,只可能执行A框或者执行B框,不可能既执行A框又执行B框;

但是无论走哪一路径,都在b口结束。

图1-4顺序结构图1-5分支结构

(3)循环结构。

循环结构也称为“重复处理结构”,包括当型循环结构和直到型循环结构。

当型循环结构是在满足给定条件时反复执行某一程序块A,否则不执行。

如图1-5(a)所示,先判断条件P,当P为真时执行A框,A框处理完后再判断条件P,当P为真时再执行A框,循环往复,直到判断条件P为假时为止。

直到型循环结构是先执行程序块A,直到满足给定条件时,不再执行。

如图1-5(b)所示,先执行A框,A框处理完后再判断条件P,当P为假时再执行A框,如此循环往复,直到判断条件P为真时为止。

从图中可以看出,循环结构也只有一个入口a和一个出口b。

图1-5循环结构

在这三种基本结构中,有以下4个共同特征。

●只有一个入口。

●只有一个出口。

●结构中的每一部分都有机会被执行到。

●结构内不存在“死循环”。

现已证明,由上述三种基本结构顺序组成的算法结构可以解决任何复杂的问题。

例1-1~例1-3用流程图表示,分别如图1-6~图1-8所示。

图1-6【例1-1】流程图图1-7【例1-2】流程图

图1-8【例1-3】流程图

3.用伪代码图描述算法

伪代码也称过程描述语言(ProgramDesignLanguage,PDL),是介于自然语言和高级程序设计语言之间的一种文字和符号描述工具,它不涉及图形,和写文章一样,一行一行、自上而下地描述算法,书写方便,格式紧凑,言简意赅。

【例1-4】把【例1-3】用伪代码表示。

BEGIN(开始)

输入年份y

ify不被4整除

printy:

“不是闰年”

else

ify不被100整除

“是闰年”

ify不被400整除

endif

END(结束)

上述是用不同的描述工具描述算法,但要真正被计算机执行,还需要用计算机语言编写出算法。

用高级语言表示结构化算法的程序就是一个结构化程序,如下面的例1-5就是用C语言编写的一个结构化程序。

【例1-5】把【例1-1】用c语言实现。

voidmain()

{inta,b,c;

printf(“Pleaseinputa,b:

”);

scanf(“%d%d”,&

a,&

b);

c=a;

a=b;

b=c;

printf(“a=%db=%d\n”,a,b);

}

1.2.2简单算法举例

【例1-6】求1×

5。

最原始方法:

步骤1:

先求1×

2,得到结果2。

步骤2:

将步骤1得到的乘积2乘以3,得到结果6。

步骤3:

将6再乘以4,得24。

步骤4:

将24再乘以5,得120。

这样的算法虽然正确,但太繁。

改进的算法:

S1:

使t=1

S2:

使i=2

S3:

使t×

i,乘积仍然放在在变量t中,可表示为t×

i→t

S4:

使i的值+1,即i+1→i

S5:

如果i≤5,返回重新执行步骤S3以及其后的S4和S5;

否则,算法结束。

用C语言表示:

voidmain()

{

inti,t;

t=1;

i=2;

while(i<

=5)

t=t*i;

i=i+1;

printf(“%d”,t);

如果计算100!

只需将S5:

若i≤5改成i≤100即可。

如果该求1×

11,算法也只需做很少的改动:

S1:

1→t

S2:

3→i

S3:

S4:

i+2→t

S5:

若i≤11,返回S3,否则,结束。

该算法不仅正确,而且是计算机较好的算法,因为计算机是高速运算的自动机器,实现循环轻而易举。

思考:

若将S5写成:

若i<11,返回S3;

否则,结束。

结果如何?

【例1-7】有50个学生,要求将他们之中成绩在80分以上者打印出来。

如果,n表示学生学号,ni表示第个学生学号;

g表示学生成绩,gi表示第个学生成绩;

则算法可表示如下:

1→i

如果gi≥80,则打印ni和gi,否则不打印

i+1→iS4:

若i≤50,返回S2,否则,结束。

【例1-8】求

算法可表示如下:

sigh=1

sum=1

deno=2

sigh=(-1)×

sigh

term=sigh×

(1/deno)

S6:

term=sum+term

S7:

deno=deno+1

S8:

若deno≤100,返回S4;

【例1-9】对一个大于或等于3的正整数,判断它是不是一个素数。

S1:

输入n的值

i=2

n被i除,得余数r

如果r=0,表示n能被i整除,则打印n“不是素数”,算法结束;

否则执行S5

i+1→i

如果i≤n-1,返回S3;

否则打印n“是素数”;

然后算法结束。

改进:

S6:

如果i≤,返回S3;

否则打印n“是素数”;

练习:

1、【例3-2】输入一个三位数,将该数逆序输出。

例如,输入123,则输出321。

2、【例3-3】输入两个整数,输出其中的大数。

3、有一个函数:

4、【例3-7】编写程序,输入一个字符,判断其是否为大写字母,如果是大写字母则将其转换为小写字母,否则不变。

5、【例3-9】求一元二次方程ax2+bx+c=0的根。

该一元二次方程的根有以下4种情况:

(1)当a=0,不是二次方程。

(2)当b2-4ac=0,有两个相同的实根。

(3)当b2-4ac>

0,有两个不同的实根。

(4)当b2-4ac<

0,有两个共轭复根。

6、【例4-18】求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。

例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。

7、【例4-20】求Fibonacci数列的前40个数。

该数列的生成方法为:

F1=1,F2=1,Fn=Fn-1+Fn-2(n≥3),即从第3个数开始,每个数等于前2个数之和。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1