第4章 控制结构设计.docx
- 文档编号:8027884
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:22
- 大小:112.34KB
第4章 控制结构设计.docx
《第4章 控制结构设计.docx》由会员分享,可在线阅读,更多相关《第4章 控制结构设计.docx(22页珍藏版)》请在冰豆网上搜索。
第4章控制结构设计
第4章控制结构设计
一、授课内容
授课科目:
计算机基础(VB)
授课内容:
第4章控制结构设计
授课类型:
讲授
授课时间:
?
学时
主讲教师:
朱泽民
二、教学目的要求
知识目标:
1.理解算法的基础知识及程序的控制结构;
2.熟练掌握选择结构,掌握IF、SELECTCASE结构;
3.熟练掌握循环结构,掌握FOR、WHILE、DO循环结构;
4.掌握常的算法,如累加连乘、输出定位、穷举法、递推法及数字处理。
能力目标:
培养学生“提出问题、分析问题、解决问题”科学的思维方法。
情感目标:
通过创设情景,激发学生应用VB编写程序的学习兴趣,培养学生独立思考、勇于探究的学习精神;鼓励学生编写程序来解决实际生活中的问题。
三、教材分析
概述:
程序的控制结构和常用算法是利用VB编写程序的基础,主要介绍了程序设计中的三种基础控制结构。
教学重点:
IF、SELECTCASE结构;FOR、WHILE、DO循环结构。
教学难点:
FOR、WHILE、DO循环结构。
四、教学方法
问题教学法、讲授法、类比法、讨论法等。
五、教学过程
(一)导入新课
如何将输入转化成用户所需要的输出,往往需要编写相关程序代码来实现。
本章主要讲授程序的控制结构以及算法基础,并介绍了常用的一些算法。
(二)讲授新课
4.1算法基础与程序控制结构
4.1.1算法基础
1.算法的概念
算法,简单的说就是计算机解决问题的方法和步骤。
任何一个问题能否用计算机进行处理,关键步骤就是看能否设计出实现它的算法。
下面以一个简单的例子来说明算法。
【例4-1】求5个自然数的和
(即S=1+2+3+4+5)。
解决本题最简单的算法就是直接用一个表达式“1+2+3+4+5”进行计算。
但如果参加运算的数很多,用表达式求解就比较复杂。
我们注意到,本题是将每一个加数(1、2、…、5)加到变量S中去,并具有两个特点:
(1)加数是一个等差数列
(2)重复执行加法,将每一个加数累加到变量S中去。
可用以下算法实现:
S1定义一个表示累加和的变量S,初始值为0;定义一个表示加数的变量N,初始值为1。
S2将加数N累加到变量S中去,即S+N→S。
S3加数变量N加1,产生一个新的加数,即N+1→N。
S4判断:
当N≤5时,返回S2,再次求和;当N>5时,顺序执行S5。
S5输出结果,则S为所求之和。
在这个算法里,出现了重复运算的操作,称为循环。
循环必须用条件限制循环次数,否则就成为死循环,导致程序无法结束。
算法中S4是判断条件,如果条件成立(N≤5)则回到S2继续求和,否则执行S5输出结果。
2.算法的特点
从上面的例子中,可以概括出算法的5个特点:
有穷性:
一个算法必须在执行有穷个计算步骤后终止;
确定性:
一个算法给出的每个计算步骤,必须都是精确定义的、无二义性的;
可行性:
算法所要执行的每一个计算步骤,都是可以在有限时间内做完的;
输入:
一个算法一般要求有零个或多个输入信息,这些输入信息是算法所需的初始数据;
输出:
一个算法一般要求有一个或多个输出信息,这些信息一般就是对输入信息进行计算的结果。
注意:
对于同一个问题,可能有多种不同的算法,即存在一题多解的情况。
在解题的过程中,应该尽可能选择一种占用资源少、执行效率高且又容易理解的算法。
3.算法的描述
描述算法有多种不同的工具,不同的工具对算法描述的质量有着很大的影响。
常见的描述工具有自然语言、流程图、N-S图、PAD图等。
(1)自然语言。
自然语言是人类在日常生活中进行交流的语言。
用自然语言描述算法的优点在于人们比较熟悉,容易接受,但存在文字冗长、有二义性、表达不够直观准确、计算机不便于处理等缺点。
(2)流程图。
流程图亦称框图,是用一些几何框图、流程线和文字说明来表示各种类型的操作,具有直观、形象、易于理解等特点,应用很广泛,但程序流程很复杂时,会使图形中的流程线过多而显得杂乱,不便于阅读。
流程图采用的基本图形符号如表4-1所示。
表4-1流程图中常用的基本图形符号
名 称
图 形
功 能
起止框
表示程序的开始或结束
处理框
框中指出要处理的内容
输入输出框
用于数据的输入输出
判断框
框中内容为条件
流程线
程序的走向
(3)N-S图。
N-S图去掉了流程图中引起混乱的流程线,算法由一个矩形框来描述。
4.1.2程序控制结构
结构化程序设计的基本思想是像玩积木游戏那样,只要利用几种简单的结构,就可以构成任意复杂的程序。
基于这种思想,1966年Bobra和Jacopini提出了三种基本结构——顺序结构、选择结构、循环结构。
基于这三种结构的程序,就是结构化程序(StructuredProgram)。
1.顺序结构
顺序结构是最简单的一种结构,其程序流向是沿着一个方向进行的,有一个入口(A),一个出口(B);先执行A块,再执行B块。
A块和B块分别代表某些操作。
2.选择结构
程序的流程在某个位置发生分支,需要根据条件选择其中之一执行,这就是选择结构,又称为分支结构。
它也有一个入口(A),一个出口(B)。
简单的选择结构只有两个分支,根据给定的条件是否成立决定执行A块还是B块。
3.循环结构
循环结构又称重复结构,即程序流程根据条件重复执行某一块程序(循环体)。
循环结构有两种类型:
(1)当型(WHILE)循环结构:
先判断条件,后执行循环体。
当条件满足时执行循环体,否则就退出循环。
当型循环结构的流程图和N-S图如图4-5所示。
(2)直到型(UNTIL)循环结构:
先执行循环体,后判断条件。
当条件不满足时继续执行循环体,直到条件满足退出循环体。
注意:
虽然我们强调VisualBaisc是一种面向对象的程序设计语言,但其同样也是一种结构化程序设计语言,它对结构化程序设计的三种控制结构提供了良好的支持。
4.2选择结构
选择结构根据分支的个数,可分为单分支选择结构、双分支选择结构和多分支选择结构。
VisualBaisc中提供了多种形式的条件语句来实现不同的选择结构,本节我们主要介绍If语句和SelectCase语句
以及相关的选择函数。
4.2.1IF条件语句
If条件语句可分为单分支结构、双分支结构和多分支结构。
1.If…Then语句(单分支结构)
格式一(单行结构):
If<表达式>Then<语句块>
格式二(块结构):
If<表达式>Then
<语句块>
EndIf
功能:
如果“表达式”的值为True或非0值,则执行“语句块”,否则执行下一条语句。
说明:
(1)两种结构效果上等价,只是语法格式不一样而已,例如:
Ifx<0Thenx=0
等价于
Ifx<0Then
x=0
EndIf
(2)如果Then后面有多条语句,则各语句之间用“:
”隔开。
例如:
Ifx<0Thena=b:
b=c:
c=a
(3)表达式可以为关系表达式、逻辑表达式、数值表达式、字符串表达式,当为数值表达式时,非0值表示True,0值表示False。
例如:
If1Thenx=0
条件为数值1,表示True,即执行语句“x=0”。
【例4-2】编程实现比较两整数x和y的大小,使x≤y。
分析:
x和y的关系有两种:
①x≤y,则无需做任何操作直接输出结果即可;②x>y,则需交换x和y的值,然后输出结果。
程序代码如下:
PrivateSubCommand1_Click()
DimxAsInteger,yAsInteger
DimtempAsInteger'用于存放中间结果
x=CInt(InputBox("请输入一个数:
"))'输入一个数,并转换成整型
y=CInt(InputBox("请输入另一个数:
"))
Ifx>yThen'交换两个数的算法
temp=x
x=y
y=temp
EndIf
Printx;y
EndSub
以上IF语句采用块结构实现,如果采用单行结构,IF语句可写为:
Ifx>yThentemp=x:
x=y:
y=temp
思考:
交换两个数的算法能否用如下语句交换两个数?
x=y:
y=x
本例中使用了临时变量temp来交换两个数,还有一种不使用临时变量的算法,如下:
x=x+y:
y=x-y:
x=x-y
2.
If…Then…Else语句(双分支结构)
格式一(单行结构):
If<表达式>Then<语句块1>[Else<语句块2>]
格式二(块结构):
If<表达式>Then
<语句块1>
[Else
<语句块2>]
EndIf
功能:
如果“表达式”的值为True或非0值,则执行“语句块1”,否则执行“语句块2”。
说明:
(1)“Else<语句块2>”可以省略。
省略时,则双分支结构就简化成了单分支结构。
(2)如果Then或Else后面有多条语句,则各语句之间用“:
”隔开。
3.IF语句的嵌套
对于较复杂的判断,可以采用If语句的嵌套来实现。
If语句嵌套的一般格式如图4-10所示。
图4-10IF语句嵌套结构图
注意:
嵌套的IF语句建议采用缩进格式进行书写,便于阅读和修改。
4.If…Then…ElseIf语句(多分支结构)
格式:
If<条件1>Then
<语句块l>
[Elself<条件2>Then
<语句块2>]
[Elself<条件3>Then
<语句块3>]
……
[Else
<语句块n+1>]
EndIf
功能:
如果“表达式1”的值为True或非0值,则执行“语句块1”,否则继续判断“表达式2”;如果“表达式2”的值为True或非0值,则执行“语句块2,否则继续判断“表达式3”;以此类推;如果上述条件均不成立,则执行“语句块n+1”。
流程如图4-13所示。
图4-13IF语句多分支结构流程图
注意:
(1)ElseIf不要写成ElseIf,否则编译通不过。
(2)如果省略“ElseIf”子句,则块IF语句简化为双分支选择结构。
4.2.2SelectCase语句
SelectCase语句又称情况语句,是多分支结构的另一种形式。
格式:
SelectCase测试表达式
Case表达式列表1
<语句块1>
Case表达式列表2
<语句块2>
…
[CaseElse
<语句块n+1>]
EndSelect
功能:
根据“测试表达式”的值,从多个语句块中选择符合条件的一个语句块执行。
说明:
(1)情况语句执行流程是:
先对“测试表达式”求值,然后顺序测试该值与哪一个Case子句中的“表达式列表”匹配,如果找到,则执行该Case子句的语句块,否则执行CaseElse子句的语句块,执行完后退出SelectCase结构。
(2)“测试表达式”可以是数值型或字符串表达式,通常为变量或常量。
(3)“表达式列表i”与“测试表达式”的类型必须相同。
(4)“表达式列表i”有三种格式:
①<表达式1>[,表达式2]…
当“测试表达式”的值与其中之一相同时,就执行该Case子句的语句块。
例如:
Case2,4,6,8
②<表达式1>To<表达式2>
当“测试表达式”的值在<表达式1>和<表达式2>之间时,就执行该Case子句的语句块。
例如:
Case1to5
③Is<关系表达式>
当“测试表达式”的值满足<关系表达式>时,就执行该Case子句中的语句块。
例如:
CaseIs<10
注意:
SelectCase语句最多只能选择一个分支去执行,即顺序找到的第一个与“测试表达式”相匹配的Case子句,执行对应的语句块后退出SelectCase结构。
4.2.3条件函数
1.IIf函数
格式:
IIf(条件表达式,表达式1,表达式2)
功能:
IIf函数功能与If…Then…Else语句相似。
如果“条件表达式”的值为True或非0值,则函数返回“表达式1”的值,否则返回“表达式2”的值。
例如,将x,y中较大的数赋给max变量,实现代码为:
max=IIf(x>y,x,y)
2.Choose函数
格式:
Choose(整数表达式,返回值1,返回值2,……)
功能:
根据“整数表达式”的值来决定返回选项列表中的某个值。
如果“整数表达式”的值为1,则Choose函数的返回值为“返回值1”;如果“整数表达式”的值为2,则Choose函数的返回值为“返回值2”;以此类推。
若“整数表达式”的值小于1或大于列出的选项数目时,则Choose函数的返回值为Null。
例如,将数字形式的星期week转换成中文星期名。
转换语句如下:
CWeek=Choose(week,"星期一","星期二","星期三","星期四","星期五")
当week值为1时,返回字符串“星期一”,然后赋值给CWeek变量;当week值为2时,返回字符串“星期二”;以此类推。
若week值不在1~5之间时,返回Null值。
4.3循环结构
在实际应用中,经常遇到一些操作并不复杂,但需要反复处理的问题,这些问题用顺序结构处理十分麻烦,甚至难以实现,而使用循环结构可以轻松实现。
循环结构就是在指定的条件下重复执行同一组语句。
VisualBaisc提供了两种不同的循环结构:
计数型循环结构(For-Next)和条件型循环(While和Do-Loop)。
4.3.1For…Next循环
For循环适合处理事先就能确定循环次数的问题。
格式:
For<循环变量>=<初值>To<终值>[step<步长>]
<循环体>
[ExitFor]
Next[<循环变量>]
功能:
按确定的次数执行循环体,循环次数由循环变量的初值、终值和步长值确定。
说明:
(1)For循环执行过程:
①将“初值”赋给“循环变量”;
②检查“循环变量”是否超过终值,若没有超过终值,则执行循环体,否则结束循环执行Next后面的语句;
③循环变量加上步长值,并转到②。
其流程图如图4-15所示。
图4-15For循环执行流程
2,然后继续判断是否超过终值。
以此类推。
直到i值变为6时,超过终值,循环结束。
其输出结果为:
12345
(2)循环变量也称“循环计数器”或“循环控制变量”,为数值型。
(3)初值、终值和步长均为数值表达式。
步长为1时可以省略,如【例4-10】中“step1”可以省略不写。
(4)ExitFor可用于强制退出For循环,转去执行Next后面的语句。
(5)Next后面的“循环变量”与For后面的“循环变量”必须相同,也可以省略不写。
由于For循环每执行一次循环体之后都要加上步长值,可以将Next语句直观地理解成如下操作:
循环变量=循环变量+步长
(6)For-Next循环的循环次数由初值、终值和步长三个因素决定,计算公式为:
循环次数=Int(终值-初值)/步长+1。
注意:
(1)当退出循环时,循环变量的值会保持退出时的值。
如【例4-10】中,退出循环后,i值为6。
(2)步长为循环变量的增量,可正可负;如果省略,则默认步长为1。
当初值≤终值时,步长为正数,反之为负数。
①步长>0,表示循环变量的值是递增的,循环体若能执行,初值必须≤终值。
②步长<0,表示循环变量的值是递减的,循环体若能执行,初值必须≥终值。
例如以下程序段:
Fori=5To1step-1
Printi;
Nexti
其输出结果为:
54321
③步长=0,循环体若能执行,则必须在循环体中加入强制退出循环的语句ExitFor,否则构成死循环。
(3)在循环体内可以对循环变量进行引用,但如果在循环体中修改了循环变量的值,会影响原来的循环规律。
4.3.2While…Wend循环
格式:
While<条件表达式>
[<循环体>]
Wend
功能:
当“条件表达式”成立,即为True或非0值时,执行循环体,否则执行Wend之后的语句。
流程图如图4-18所示。
图4-18While循环流程图
注意:
在For循环结构中,可以利用循环变量加步长值的隐含操作修改循环变量的值,但While循环结构无此功能,所以需要在循环体内单独用一条语句修改循环变量的值。
4.3.3Do…Loop循环
Do循环有两种格式:
格式一:
Do[{While|Until}<条件>]
<语句块>
[ExitDo]
<语句块>
Loop
格式二:
Do
<语句块>
[ExitDo]
<语句块>
Loop[{While|Until}<条件>]
说明:
(1)格式一为前测型,先判断条件,后执行循环体,如果一开始条件不成立,则循环体一次也不执行;格式二为后测型,先执行循环体后判断条件,即使一开始条件不成立,循环体也执行一次。
(2)While指在条件为True时就执行循环体;Until指在条件变为True之前执行循环体。
(3)ExitDo语句可以强制退出循环,而转去执行Loop之后的语句。
(4)若语句中省略While或Until子句,即循环由Do-Loop构成,则为无条件循环,循环体内应该有ExitDo语句,否则成为死循环。
4.3.4GoTo语句
格式:
GoTo{标号|行号}
功能:
无条件地转移到标号或行号指定的语句。
说明:
行号是写在一行开头的正整数,标记则是变量加上一个“:
”。
行号写在一行的开头位置,用来指示GoTo语句所要跳到的地方。
标号是一个字符序列,行号是一个数字序列。
由于GoTo语句可以灵活跳转,如果不加限制,会破坏结构化设计风格。
所以,在程序设计时应尽可能少用、慎用GoTo语句。
4.3.5循环嵌套
一个循环体内又出现另外的循环语句称为循环的嵌套,也称为多重循环。
在嵌套结构中,一般有几层嵌套,就说是几重循环。
注意:
(1)嵌套时,内层循环必须完全包含在外层循环之内,不能相互“交叉”。
表4-8列举了常见的正确嵌套形式和错误嵌套形式。
表4-8嵌套形式范例
正确的嵌套
Fori=1To10
…
Forj=1To20
…
Nextj
…
Nexti
Do
…
Forj=1To20
…
Nextj
…
LoopWhilei<=10
Fori=1To10
…
DoWhilej<=20
…
Loop
…
Nexti
错误的嵌套
Fori=1To10
…
Forj=1To20
…
Nexti
…
Nextj
Do
…
Forj=1To20
…
LoopWhilei<=10
…
Nextj
Fori=1To10
…
DoWhilej<=20
…
Nexti
…
Loop
(2)多重循环的执行过程是,外循环每执行一次,内循环都要从头到尾执行一遍。
例如以下程序段:
Fori=1To5
Forj=1To3
Printi,j,i+j
Nextj
Nexti
在以上的双重循环中,外循环变量i取1时,内循环就要执行3次(内循环变量j依次取1、2、3),接着,外循环变量取值2,内层循环同样要重新执行3次(j再一次取1、2、3)……以此类推,循环体“Printi,j,i+j”一共执行了5×3次,即15次。
4.4常用算法
(一)
4.4.1累加、连乘
累加和连乘是循环结构中最常用的算法。
累加是在原来和的基础上再加一个数,并重复此操作。
累加常可分为数值累加和字符串累加。
连乘是在原有积的基础上再乘以一个数,并重复此操作。
要注意的是,存放累加或连乘结果的变量初值应在循环语句前设置。
【例4-21】编程求Sum=1+(1+2)+(1+2+3)+…(1+2+3+…+n),其中n由用户输入。
分析:
该题是一个累加问题,共有n项相加,存放累加和的变量为Sum;而对于第i个累加项1+2+…+i,又是一个累加问题,存放该累加和的变量为Sum1。
本题需要采用双重循环。
外循环变量i依次取1、2、…n;内循环变量j依次取1、2、…i。
程序代码如下:
PrivateSubForm_Click()
N=InputBox("请输入欲求的项数:
")
Sum=0'存放所有项的累加和变量,置初值0
Fori=1ToN
Sum1=0'存放每一项的累加和变量
'在计算每个累加项之前,将其值清零
Forj=1Toi
Sum1=Sum1+j'求每一项累加和的语句
Nextj
Sum=Sum+Sum1'求所有项累加和的语句
Nexti
PrintSum'输出结果
EndSub
程序运行后,单击窗体,弹出一个输入对话框,输入5,在窗体上输出结果35。
【例4-22】逆序输出26个英文字母。
程序代码如下:
PrivateSubForm_Click()
DimiAsInteger
DimstrSumAsString'存放累加和的变量
strSum=""'累加和变量置初值
Fori=1To26
Char=Chr(Asc("A")+i-1)'依次产生26个字母
strSum=Char+strSum'字符串累加语句,注意Char和strSum的顺序
Nexti
PrintstrSum'输出结果
EndSub
运行结果为:
ZYXWVUTSRQPONMLKJIHGFEDCBA
思考:
如果要顺序输出,程序应该如何改写?
【例4-23】求n!
(n为自然数)。
分析:
n!
=1×2×3×…×n,乘数为1到n的步长为1的等差数列。
PrivateSubForm_Click()
DimnAsInteger
n=InputBox("输入n的值:
")
k=1'存放n!
,置初值1
Fori=1Ton'利用循环变量依次产生下一个乘数
k=k*i'连乘语句
Nexti
Printn;"!
=";k
EndSub
程序运行后,在弹出的输入对话框中输入6,输出结果:
n!
=720。
4.4.2输出定位
输出定位即要求在指定位置输出字符或图形信息。
【例4-20】打印九九乘法表就是输出定位的一个例子。
在解决这类问题时,应该首先从图形效果上找规律,再采用循环等结构来进行处理。
【例4-24】在窗口中输出以下图形。
(1)
(2)
(3)
(4)
图4-24输出定位效果图
分析:
在图形
(1)中,每一行都输出同样的6个*,只需将输出一行字符的语句连续执行5次。
程序代码如表4-9
(1)。
图形
(2)与
(1)的差别在于每一行*前面有若干空格,空格的个数与其行号相同,即始终与行变量j相同。
代码如
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 控制结构设计 控制 结构设计