第1章编程逻辑和技术目标本章中你将学习引入框图IPO周期.docx
- 文档编号:16322360
- 上传时间:2023-07-12
- 格式:DOCX
- 页数:24
- 大小:112.27KB
第1章编程逻辑和技术目标本章中你将学习引入框图IPO周期.docx
《第1章编程逻辑和技术目标本章中你将学习引入框图IPO周期.docx》由会员分享,可在线阅读,更多相关《第1章编程逻辑和技术目标本章中你将学习引入框图IPO周期.docx(24页珍藏版)》请在冰点文库上搜索。
第1章编程逻辑和技术目标本章中你将学习引入框图IPO周期
第1章
编程逻辑和技术
目标:
本章中,你将学习:
引入框图
I-P-O周期
使用框图表示程序流程
变量、常量和内存
循环迭代和条件判定
预检和预检表
循环迭代
条件判定
理解编程的模块化方法
养成一个好的习惯
开始
我们在开始学习任何一门编程语言之前,首先需要知道和了解编程所使用的技术。
也许,你学过BASIC、FORTRAN和COBOL等编程语言,在编程之前,首先要使用框图绘制程序流程图。
绘制程序流程图的过程就是程序设计的过程,它包含着编程逻辑和编程技术,就好像在写这本书之前,首先要写好大纲和目录,确定要编写的内容和深度以及所面向的读者群体,架构起本书的框架一样。
本课提供对编程技术的理解,使用这种技术来表示使用程序求解问题所需要的编程逻辑。
主要使用框图技术开发基本的编程逻辑。
本章你将学习如下技术:
⏹使用框图绘制程序流程图。
⏹用条件表示程序逻辑。
⏹理解循环和迭代。
⏹实现模块化编程。
⏹学会一题多解,反向思维和超常规思维。
引入框图
I-P-O周期
计算机执行的一个活动周期也遵循着“输入—处理过程—输出”周期,或称I-P-O周期(In-Process-Out)。
计算机由几个部分组成,如键盘、鼠标、中央处理器(CPU)、存储器、显示器、打印机等。
每个部件参与输入阶段、处理过程阶段、输出阶段的某一个活动。
例如,键盘和鼠标用于输入阶段;计算机系统内部的中央处理器和存储器用于处理过程阶段;显示器和打印机用于输出阶段,如图1-1所示。
图1-1一个I-P-O周期
例如:
从键盘输入两个数,并求两个数的和。
1.输入阶段:
从键盘输入两个数,并将两个数存储在计算机的两个内存单元中。
2.处理过程:
中央处理器从指定的两个内存单元中取出两个数据,并将两个数据相加,将结果存储在另一个内存单元中。
3.输出阶段:
取出所指定的内存单元中的数据,输出显示在显示器上。
使用框图表示程序流程
框图
框图是求解程序问题要遵循的步骤的图形符号,它由一组标准专用的图形符号组成,每个图形符号表示一个特定的活动内容。
一个典型的程序处理过程涉及接受输入、处理输入及显示输出。
处理过程涉及求解程序问题所采用的条件判定、循环迭代、程序跳转等结构。
框图中使用的图形符号
让我们看一下框图中表示I-P-O周期所用的某些图形符号。
⏹任何问题的输入用平行四边形
表示,包括从键盘、鼠标、文件的输入。
⏹长方形
表示对输入的处理过程,以产生结果和输出。
⏹图形
表示输出,包括输出到显示器、打印机及文件。
类似地,还有一些图形符号表示开始、结束以及程序中求解问题所需的结构。
表1-1列出了框图中所使用的图形符号和活动。
表1-1框图使用的图形符号
序号
符号
活动
1
输入框,用于表示所有的输入活动
2
处理框,用于表示对数据的所有处理活动
3
输出框,用于表示对结果的所有输出活动
4
判定框,用于求值一个条件的真和假的活动
5
子例程框,在程序流程中调用一个独立的程序模块
6
流线图,连接框图的步骤,指出要执行的顺序。
顺序应是自顶向下、从左向右
7
终结符,指出框图的开始和结束
8
页连接符,用于同一页中框图的一个步骤连接到同一页中的另一个步骤
9
离开页的连接符,用于不同页中框图的一个步骤连接到另一页中的另一个步骤
10
注释框,用于插入到框图的注解,插入注解提供对步骤的解释,便于阅读
画出简单的框图
既然知道了框图中使用的不同符号,下面我们考察使用框图获得解决实际程序问题的方案。
例如,从键盘输入两个数,并求两个数之和的框图如图1-2所示。
图中用语言描述的形式,画出了从键盘输入两个数,并求两个数之和的流程图。
那么,从键盘输入两个数和两个数求和结果存放在什么地方?
为了使程序流程图更详细,更接近程序源代码,需要了解变量、常量和内存。
图1-2从键盘输入两个数,并求两个数之和的框图
问题与思考1
以正确的顺序重新安排下面给出的步骤,从而把两个数相加,并画出框图。
Acceptthefirstnumber
Displayresult
Stop
Addthetwonumbers
Acceptthesecondnumber
Start
变量、常量和内存
计算机内有存储器,也就是通常所说的内存。
内存用来存储用户提供的输入数据,处理输入的指令及处理结果。
存储器由不同的存储数据的单元组成。
为理解计算机如何处理数据,还是看前面的例子。
当执行输入指令时,第一个数据被接受并存储在存储器的一个内存单元中,第二个数据被接受并存储在存储器的另一个内存单元中。
当执行相加处理命令时,中央处理器从两个内存单元中取出数据相加,并将结果存储在一个内存单元中。
当执行输出命令时,中央处理器从内存单元中取出数据并显示到屏幕。
在编程中,如果要使用变量则必须提前声明。
声明变量事实上就是申请了一个内存单元。
变量的名称即内存单元的名称。
使用数据类型声明变量,例如int(整型),第一个变量为Num1,第二个变量为Num2,两个数相加的结果存放的变量为Sum。
从键盘输入两个数,并求两个数的和,显示声明变量并使用变量的框图如图1-3所示。
图1-3从键盘输入两个数,并求两个数的和
在程序执行过程中,iNum1、iNum2和iSum的数值是变动的,这依赖于用户的输入和程序指令的执行。
例如下面这条程序指令:
iNumber=iNumber+1
在数学上,这条指令无论如何也无法理解。
但在计算机中它完成了读操作和写操作,中央处理器读取iNumber存储单元的数据,执行加1操作,然后将结果重新存储在iNumber存储单元中。
这里“=”是赋值操作符,而不是数学中的等号。
在上面的程序流程中,将数据10赋值给iNum1存储单元,将数据15赋值给iNum2存储单元,将数据相加的结果赋值给iSum存储单元,如图1-4所示。
图1-4变量和常量
内存单元iNum1、iNum2和iSum的值是可变的,称为变量;而内存单元中存放的数据10、15和25是不变的,因此存储在变量中的值被称为常量。
问题与思考2
考察下列程序指令,预测iNum1、iNum2和iNum3存储单元中的数据。
iNum1=1;
iNum2=2;
iNum3=iNum1+iNum2
iNum1=iNum2
iNum2=iNum3;
iNum3=iNum1+iNum2
循环迭代和条件判定
预检和预检表
编程语言能使编写的程序可以计算连贯的复合条件,这些复合条件在框图中有时导致复合的流程图。
预检的概念将帮助你执行逻辑检查和理解框图中的控制流。
也可以使用预检表,通过一组样本值对程序可能的输出求值。
预检表提供了一步步地计算程序中变量的值。
下面使用预检表,求问题与思考2中Num1、Num2和Num3存储单元中的最终数据,预检表将帮助你理解这段程序指令的含义,如表1-2所示。
表1-2预检表
序号
程序指令
Num1
Num2
Num3
1
Num1=1;
1(赋值)
未知
未知
2
Num2=2;
1(不变)
2(赋值)
未知
3
Num3=Num1+Num2
1(不变)
2(不变)
3(赋值)
4
Num1=Num2
2(赋值)
2(不变)
3(不变)
5
Num2=Num3;
2(不变)
3(赋值)
3(不变)
6
Num3=Num1+Num2
2(不变)
3(不变)
5(赋值)
循环迭代
计算机的一个重要特征就是重复地执行一串指令的能力。
计算机的这种能力,可让你具有控制重复执行任务的能力。
例子:
要求产生一个Fibonacci数列,该数列的前两个数为1和2,从第三个数开始,每个数为前两个数之和。
1.声明三个变量Num1、Num2和Num3,分别用于保存数列中的连续三个数。
2.赋值给数列第一个数Num1=1并显示第一个数。
3.赋值给数列第二个数Num2=2并显示第二个数。
4.将前两个数相加赋值给数列的第三个数Num3=Num1+Num2,并显示第三个数。
接下来应该是第三个数和第二个数相加赋值给数列的第四个数Num4=Num2+Num3,并显示第四个数。
这样Fibonacci数列有多少个数,就要声明多少个变量,相加并赋值的指令代码就要重复写多少遍。
很显然这是不现实的。
怎样将上述问题简化为可以重复执行的数学模型呢?
由于内存的数值是可变、可重复赋值的,考察下列两行程序指令。
⏹Num1=Num2;数列第二个数变成第一个数。
⏹Num2=Num3;数列第三个数变成第二个数。
经过上面两条程序指令,交换了数列的值,这样就简化为一个数学问题:
Num3=Num1+Num2,执行程序第四条指令,就可以求出数列第四个数,再重复执行程序第五、六、四条指令,就可以依次求出数列的各个数。
产生Fibonacci数列的程序流程图如图1-5所示。
图1-5产生Fibonacci数列的程序流程图
下面使用预检表求一个Fibonacci数列的输出,参见表1-3。
表1-3用预检表求一个Fibonacci数列的输出
序号
程序指令
Num1
Num2
Num3
Display
1
Num1=1Display
1
未知
未知
1
2
Num2=2Display
1
2
未知
2
3
Num3=Num1+Num2Display
1
2
3
3
循环1
Num1=Num2;Num2=Num3
Num3=Num1+Num2Display
2
3
5
5
循环2
Num1=Num2;Num2=Num3
Num3=Num1+Num2Display
3
5
8
8
循环3
Num1=Num2;Num2=Num3
Num3=Num1+Num2Display
5
8
13
13
循环4
Num1=Num2;Num2=Num3
Num3=Num1+Num2Display
8
13
21
21
循环5
Num1=Num2;Num2=Num3
Num3=Num1+Num2Display
13
21
34
34
循环6
Num1=Num2;Num2=Num3
Num3=Num1+Num2Display
21
34
55
55
循环7
Num1=Num2;Num2=Num3
Num3=Num1+Num2Display
34
55
89
89
循环8
Num1=Num2;Num2=Num3
Num3=Num1+Num2Display
55
89
144
144
条件判定
在上面求一个Fibonacci数列输出的程序中,通过数据交换,始终让Num2和Num1值总是数列最后的两个值,然后重复执行Num3=Num1+Num2。
这里有一个问题,循环到什么时候为止呢?
或者说在最后的丁字路口处,程序怎样知道是继续返回循环还是退出终止循环呢?
这里需要有条件判定。
循环有两类:
⏹固定的循环(重复的次数已知)
⏹可变的循环(重复的次数未知)
例如,在上面的Fibonacci数列中,如果要求创建Fibonacci数列的前10个数,则为固定的循环(重复的次数已知);如果要求创建Fibonacci数列的最大数小于100,则为可变的循环(重复的次数未知)。
这两种循环,产生Fibonacci数列的程序流程图如图1-6所示。
第一种循环以Fibonacci数列的最大数Num3(或Num2,因为Num2=Num3)为判定条件,如果Num3<100条件判定为真,则重复执行循环体,否则,Num3<100条件判定为假,则退出循环体,执行循环体后面的语句(Stop)。
第二种循环以Fibonacci数列的个数为判定条件,这里需要声明一个新的变量Counter(计数器),用来累加循环的次数。
由于Fibonacci数列已经有了前两个数,所以变量Counter初始化为2(Counter=2),每执行一次循环体Counter变量加1,其中“++”是C++增量运算符(加1运算符),Counter++等价于Counter=Counter+1。
如果Counter<10条件判定为真,则重复执行循环体。
否则Counter<10条件判定为假,则退出循环体,执行循环体后面的语句(Stop)。
对于某些复杂的问题,可能需要在一个循环中镶套着另一个循环,一个判定接着另一个判定,如图1-7所示。
(a)固定的循环(重复的次数已知)(b)可变的循环(重复的次数未知)
图1-6产生Fibonacci数列的程序流程图
问题与思考3
绘制求一个正整数的阶乘n!
=1*2*3*4*…*n的框图。
绘制求一个正整数的阶乘和1!
+2!
+3!
+4!
+5!
+…+n!
的框图。
理解编程的模块化方法
对于同一个问题的解决方案,不同的程序员可能编写不同的程序。
只要没有什么逻辑错误和语法错误,可以通过编译和执行,计算机都是可以接受的。
但不同程序的运行效率、可移植性、可阅读性、可修改性则可能不同。
因此鼓励程序员采用更加规范的方法来编写程序。
所采用的这个技术称为结构化编程技术。
结构化编程技术提供了这样的方法:
它把长的、连续的程序分解为一组不同的并以指定方式彼此联系的模块。
一个程序应用一般由一些被集成的任务组成。
几乎所有的应用都被设计为一些小模块的集合。
这些模块是完整的,并可通过主程序加以集成。
主程序可以调用每个模块。
在某一个特定模块完成任务后,控制返回主程序,继续执行主程序的下一条指令。
被主程序调用的每个模块称为子程序,如图1-8所示。
图1-7循环中镶套着另一个循环图1-8编程的模块化方法
回顾前面讲过的例子,首先求两个数的和并赋给第三个数,而在产生Fibonacci数列时,可以简化为循环执行两个数相加并赋给第三个数。
因此可以将“求两个数的和并赋给第三个数”作为一个独立模块,在产生Fibonacci数列时重复调用此模块。
下面,让我们分析一下“问题与思考2”。
绘制求一个正整数的阶乘和1!
+2!
+3!
+4!
+5!
+…+n!
的框图。
程序和框图中使用的变量的作用和意义如表1-4所示。
表1-4变量的作用和意义
变量
作用与意义
Nums
给出的求阶乘和的正整数n
Sum
阶乘之和Sum=1!
+2!
+3!
+…Nums!
Numr
从1到Nums之间的某一个自然数
Rank
数Numr的阶乘Rank=1*2*3*…*Numr
可以将这个问题简化为这样一个数学模型:
Sum=Sum+Rank
首先将Sum初始化为0,然后分别让Rank等于1!
、2!
、3!
…Nums!
循环累加。
在累加的每一次循环中镶套着另一个循环,求阶乘。
求阶乘这个问题可以简化为这样一个数学模型:
Rank=Rank*Numr
首先将Rank初始化为1,然后分别让Numr等于1、2、3…Numr循环累乘,如图1-9所示。
图1-9求一个正整数的阶乘之和1!
+2!
+3!
…+n!
的流程图
如图1-9所示的程序流程图如果采用模块化的编程方法,可以将求一个数的阶乘作为一个独立的模块,将求和作为主程序,在每次循环中,调用子程序模块求阶乘,如图1-10所示。
(a)主程序求和流程图(b)子程序求阶乘流程图
图1-10求一个正整数的阶乘之和1!
+2!
+3!
…+n!
的流程图
在如图1-10所示的程序流程图中,两个循环皆为可变的循环(重复的次数未知),每循环一次变量Nums和Numr递减1,直到Nums和Numr为0。
因此:
Sum=n!
+(n-1)!
+…+3!
+2!
+1!
Rank=n*(n-1)*…*3*2*1
如果采用固定的循环(重复的次数已知),则需要增加两个循环累加变量,如表1-5所示。
表1-5增加的两个循环累加变量
变量
作用与意义
S_Counter
用于外层循环求和,从1到Num
R_Counter
用于内层循环求阶乘,从1到S_Counter
外循环每循环一次,变量S_Counter就递增1,直到S_Counter为Num。
数学模型为:
Sum=Sum+Rank;S_Counter=S_Counter+1。
条件:
S_Counter<=Num
外循环每循环一次,内循环就要循环一个周期,循环次数为S_Counter。
数学模型为:
Rank=Rank*R_Counter;
R_Counter=R_Counter+1;
条件:
R_Counter<=S_Counter。
下面给出这种循环的程序流程图,如图1-11所示。
(a)主程序求和流程图(b)子程序求阶乘流程图
图1-11程序流程图
养成一个好的习惯
不管是在学习或工作中,都要学会用多种方法、多种途径去解决同一个问题。
完成一个问题后,回过头来总结一下好的地方在哪里?
不好的地方在哪里?
怎样改进?
要学会反向思维,超常规思维。
在前面的例子中,第一种方法要比第二种方法好,它省去了两个计数器变量,节省了内存开销。
但第二种方法更常规,更易想到。
再看如图1-12所示的程序流程图。
前面的两种求阶乘之和的方法,从逻辑和语法上来说并没有错,是常规思维的产物。
但是存在一个问题,循环中嵌套着循环,外循环循环n次,内循环就要循环1+2+3+4+…+n次,这样程序陷入了重复循环,CPU不停地进行着重复的累乘和累加运算,程序效率很低,运行速度很慢,严重时甚至导致程序的崩溃。
如图1-12所示的程序流程很巧妙地使用了如下的数学模型:
一个数的阶乘等于前一个数的阶乘乘以这个数,即n!
=(n-1)!
*n。
程序循环体:
Rank=Rank*Counter;
Counter=Counter+1;
Sum=Sum+Rank;
这样,程序很巧妙地使用一次循环而解决了问题,不仅节省了内存,而且大大地提高了程序的运行效率。
每一个数的阶乘,被下一个数的阶乘使用,避免了重复循环。
图1-12求值一个正整数的阶乘之和1!
+2!
+3!
…+n!
的流程图
让我们再来看看如图1-13所示的只用两个变量产生Fibonacci数列的程序流程图。
图1-13只用两个变量产生Fibonacci数列的程序流程图
第1步:
赋值数列的第一个数Num1=1。
第2步:
赋值数列的第二个数Num2=2。
第3步:
将数列的前两个数相加并重新赋值Num2=Num1+Num2=3,得到数列的第三个数,将第三个数重新作为Num2,并显示这个数。
第4步:
Num1前移,原来的Num2成为新的Num1,而Num1=Num2是错误的,在第3步Num2已经被更新,原来的Num2已经不存在。
但可以计算出来,原来的Num2(即新Num1)为第三个数新Num2与第一个数老Num1之差:
Num1=Num2–Num1。
第5步:
重复循环第3步和第4步,就可以得到Fibonacci数列。
如图1-14所示为修改后的Fibonacci数列程序流程图。
概括前面的内容,可以总结如下几点:
⏹用尽可能少的变量,完成尽可能多的任务。
⏹变量的命名尽量反映变量的作用和意义,如Number数、Counter计数器。
⏹变量是有作用范围和生命周期的。
⏹内存是可以更新和重复使用的。
⏹把一个复杂的问题尽可能分解为一个个小的模块,在主程序中集成。
⏹把一个复杂的问题简化为一个简单的数学模型。
⏹一题多解是一种很好的学习方法。
问题与思考4
使用模块化方法画出求Fibonacci数列的程序流程图。
问题与思考5
使用模块化方法画出求1*2+2*3+3*4+…+(n-1)*n数列的程序流程图。
图1-14产生Fibonacci数列的程序流程图
问题与思考6
画出程序流程图:
输入7个数,并显示一周的相对应的星期。
提示:
1=Monday
2=Tuesday
3=Wednesday
4=Thursday
5=Friday
6=Saturday
7=Sunday
小结
本章中,你已经学习了:
⏹计算机执行的活动周期为输入—处理过程—输出,简称I-P-O周期。
⏹执行特定任务的一组指令称为程序。
⏹框图是程序流程指令顺序的图形表示。
⏹框图由一组图形符号组成,每个符号表示一个单独的活动。
⏹数据可分为变量和常量。
⏹变量名称是内存单元的表示,通过变量名称访问指定的内存单元。
⏹预检将帮助你执行逻辑检查和理解框图中的控制流。
⏹预检表是使用一组样本值,求程序的输出。
⏹为重复执行一组指令应使用循环。
⏹有两类循环:
Ø重复次数已知的固定循环
Ø重复次数未知的可变循环
⏹循环中可以嵌套循环。
⏹为跳出循环,需要使用条件判定。
条件为true继续循环,条件为false终止循环。
⏹如果有多重条件,需要连续重复使用条件判定。
⏹结构化编程技术是一种规范的编写程序的方法。
⏹大程序可分解为几个模块,每个模块执行一个特定的任务,以有利于分工协作。
⏹由主程序调用模块,用Return语句把控制过程从模块返回到主程序,并返回值。
⏹要学会反向思维和超常规思维,学会用多种方法解决同一个问题的能力。
不停地否定自我和超越自我。
独立实践
1.画出接受两个数并显示这两个数中较大者的框图。
2.画出接受两个数并交换这两个数值的框图。
3.画出接受一个学生成绩的框图。
如果成绩大于等于80,显示GOOD;如果成绩大于等于60小于80,显示OK;如果小于60,显示ENCOURAGE。
4.使用模块化编程方法,画出接受一个学生的三门成绩并显示平均成绩的框图。
提示:
接受成绩和计算平均成绩作为两个独立模块;在主程序中调用模块,并显示平均成绩。
5.使用模块化编程的方法,画出计算下图中阴影部分面积的框图。
提示:
计算矩形面积和计算圆面积作为两个独立模块;在主程序中调用模块,并将两个面积相减。
6.画出显示前10个偶数乘积的框图。
7.画出显示前10个奇数求和的框图。
8.画出接受10个数,并显示奇数和偶数的总个数的框图。
提示:
用这个数除以2,余数为0,为偶数,否则为奇数。
求余数使用“%”运算符判定Num%2=0吗?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 逻辑 技术 目标 本章 你将 学习 引入 框图 IPO 周期