《C语言程序设计基础》课件第5章_第1页
《C语言程序设计基础》课件第5章_第2页
《C语言程序设计基础》课件第5章_第3页
《C语言程序设计基础》课件第5章_第4页
《C语言程序设计基础》课件第5章_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章

循环结构实现语句——循环结构程序设计5.1while语句5.2do_while语句5.3for语句5.4用循环嵌套实现多重循环5.5改变循环控制的语句5.6循环结构程序设计实训任务九

熟悉循环结构控制语句实训任务十

学习循环结构程序设计的方法 5.1while语句

何谓当型循环?怎样实现当型循环?

循环结构程序从控制流程上可分为当型循环和直到型循环。while语句是实现当型循环结构的语句。

while语句的一般形式为

while(表达式)

循环体语句;

其中,表达式用于控制循环是否进行,可以是关系表达式和逻辑表达式。当表达式的值为“真”(表达式的值为“非0”)时,即循环条件成立,则执行循环体语句;当表达式的值为“假”(表达式的值为“0”)时,即循环条件不成立,则结束循环。图5.1while语句的执行流程

while语句的执行流程如图5.1所示。while语句执行时,先计算表达式的值,其值为“真”则执行循环体语句,为“假”则不执行循环体语句(结束循环)。

构造循环控制表达式是循环结构程序设计的关键。表达式构造不当,就不可能按预期的规律循环。极端情况下,当进入循环时,表达式的值就为“0”,则循环体一次也不会被执行;表达式的值在循环中不变化,永远保持“非0”,就会产生死循环。这两种情况都应避免。

循环体语句必须是一个语句的形式。实际使用中循环体往往有多个语句,这就需要用一对花括号把这些语句括起来,构成复合语句。

例5.1

编写程序,实现求

的值。

编程思路:定义一个变量i,初值为1,每加一次其值增1,既是累加次数的计数,作为循环控制变量,又形成了每次要累加的数。再定义一个累加和变量sum,初值设置为0,相当于将变量单元清零。因为变量代表一个存储器单元,如不清0,会将该单元中原来未知的数带进累加和中,造成结果不正确。其算法流程如图5.2所示。

图5.2例5.1算法流程运行结果:

分析:循环体语句被执行100次,实现了1~100中的整数累加。

思考:在循环体外,把语句“i=1;”改为语句“i=0;”,循环体被执行多少次?执行结果会正确吗?

5.2do_while语句

何谓直到型循环?怎样实现直到型循环?

do_while语句是实现直到型循环结构的语句。

do_while语句的一般形式为

do

循环体语句;

while(表达式)

其中,表达式的作用和循环体语句的组成形式同while语句。只是循环控制流程与while语句有所差别。其执行流程如图5.3所示。do_while语句是先执行循环体语句,然后计算表达式的值,其值为“真”时执行循环体语句,为“假”则结束循环。也就是说,循环体语句至少要被执行一次。图5.3do_while语句的执行流程

例5.2

用do_while语句实现求

的值。

编程思路:该例的编程思路基本与例5.1相同。其算法流程如图5.4所示。

图5.4例5.2算法流程分析:本例的执行结果同例5.1。先执行循环体语句,对i的当前值累加,再使i加1,当i的值增加到101时结束循环。

思考:与例5.1比较,程序结构有何异同?程序执行时的循环控制过程相同吗?循环结束时,变量i的值应是多少?

5.3for语句

5.3.1for语句的形式与执行流程

for语句的一般形式为

for(表达式1;表达式2;表达式3)

循环体语句;

其执行流程如图5.5所示。从流程图可以看出,for语句的执行步骤如下:

(1)求解表达式1的值。

(2)求解表达式2的值,若其值为非0(“真”),则执行for语句中的循环体语句,然后执行下面第(3)步。若值为0(“假”),则结束循环。

(3)求解表达式3的值。

(4)转回上面第(2)步继续执行。

for语句中三个表达式分别有不同的作用:

表达式1有给循环提供初值的作用,可以是算术表达式、赋值表达式和逗号表达式。

表达式2起控制循环的作用,可以是C语言中的各种表达式,只要表达式的值为“非0”,即为逻辑“真”,控制循环继续进行;表达式的值为“0”,即为逻辑“假”,立即结束循环。表达式3起改变循环控制条件的作用,使循环向结束靠近。如果没有表达式3,或表达式不合适,就可能导致死循环。在一些规律明显的循环中,可以把表达式3称为步长表达式。

需注意的是,三个表达式之间必须用“;”作为分隔符。

图5.5for语句执行流程

例5.3

为了便于三种循环语句的比较,仍以求值为

例,用for循环来实现。

编程思路:同前。

源程序:

分析:运行结果同前。与while、do_while实现程序相比,本例的程序结构简单紧凑。i赋初值可用for语句的表达式1来实现,变量i的值增1可用表达式3来实现。

5.3.2for语句中三个表达式的灵活使用

for语句灵活运用的关键是三个表达式的设置。

(1)三个表达式都可以采用多种表达式。如for(i=1,sum=0;i<=100;i++,j++)中,表达式1和表达式2是逗号表达式。

(2)表达式1可以省略,但应在循环体外给循环控制变量赋初值,否则会导致死循环。如例5.3中,在循环体外给变量赋初值,则循环语句可改为

for(;i<=100;i++)sum=sum+i;

(3)从语言规则来说,表达式2也可以缺省,例如:

for(i=1;;i++)sum=sum+i;

但执行时将变为死循环,因此是不正确的循环。

5.4用循环嵌套实现多重循环

何谓多重循环?怎样实现多重循环?

C语言中把循环结构作为一个语句。既然循环结构是一个语句,当然可以出现在循环体语句中。这样,在循环体中就包含了一个完整的循环结构语句,称为循环嵌套,即循环中套循环。如此,可以形成多重循环。C语言中对循环嵌套层数没有限制,但实际上,循环嵌套层数越多,程序越不容易理解,出错的机会也就越多。实际应用中,两层以上的循环嵌套不多见。下面只对两重循环嵌套的情况作一介绍。

三种循环结构语句可以相互嵌套,形成如下6种嵌套关系。

通常,把外层循环称为外循环,内层循环称为内循环。两重循环嵌套中,内循环作为外循环的一个语句,外循环每循环一次,内循环要循环一遍。设外循环执行i次,内循环执行j次,则内循环体要被执行i × j次。

程序中,循环嵌套要求内循环必须被完全包含在外层循环的循环体中,不允许出现内外层循环体交叉的情况。如图5.6所示,在do_while循环体内开始while()循环,但是do-while循环结束在while()循环体内,它们互相交叉,这是非法结构。

图5.6循环交叉为非法结构

5.5改变循环控制的语句

5.5.1break语句

break语句的一般形式为

break;

前面已经介绍,break语句可用在switch结构中,使执行流跳出switch结构。break语句也可用在循环结构中,使执行流跳出所在的循环,即提前结束循环。

例5.5

使用break语句来改变循环控制。

运行结果:

分析:for循环中缺省了三个表达式,应该是一个死循环。但在程序中使用了“if(i>100)break;”语句,使i达到101时就结束循环。这也是循环程序设计中,巧用break语句的一种方法。

5.5.2continue语句

continue语句的一般形式为

continue;

其功能是结束本次循环,即跳过循环体中continue语句后面尚未执行的循环体语句,转向循环头部,检测是否进行下一次循环。

例5.6

输出100以内能被9整除的数。

编程思路:逐一检测9~100的整数能否被9整除,如能整除则输出该数,不能整除则不输出。

分析:“if(n%9!=0)continue;”语句判断当前数是否能被9整除,若能整除,不执行“continue;”语句,则执行printf函数调用,输出该数;若不能整除,则执“continue;”语句而跳过printf函数调用,不输出该数,结束本次循环,返回循环头部,开始下一次循环,直到满足循环结束条件。

例5.7

编写程序,从键盘输入字符后显示,按Enter键,则结束字符输入;按Esc键,则放弃当前输入的字符。运行结果:

分析:程序中使用字符输入/输出库函数,程序开头要使用预处理命令#include<conio.h>。for(;;)不控制循环,是通过两个if语句来实现对循环的控制。当按Enter键时,执行“break;”语句,立即结束字符输入;当按Esc键时,执行“continue;”语句,跳过“putchar(ch);”语句,返回循环头部,输入下一个字符。

5.6循环结构程序设计

循环结构程序设计时应考虑哪些问题?如何准确地设计循环结构程序?

一般来说,循环结构程序在设计时需考虑以下几方面的问题:

(1)循环初始化问题。循环初始化包括对循环控制变量设置初值和对循环体中相关变量设置初值。循环控制变量初值设置得恰当与否,关系到循环规律能否实现。如例5.1~例5.3中,如果循环控制变量i的初值设置为0,则要循环101次,第一次循环累加和变量加0,毫无意义。如果设置为大于1的数,循环次数不到100次,造成累加和不正确。给循环体中操作变量设置初值,需要根据具体问题具体分析。一般来说,要给加法和变量清零,乘积变量置1,以防未知数据带入,导致结果不正确。

(2)循环控制条件设置问题。按循环控制方式,循环可有计数控制和条件控制。计数控制循环是循环次数已知,一般用关系表达式作循环控制条件。对于循环次数未知的循环,一般要认真分析循环控制过程,找出规律,列出逻辑表达式。

(3)循环控制量改变问题。循环控制变量要在循环过程中加以改变,使循环控制条件向循环结束方面转变。循环控制变量的改变方式要依据循环规律来确定。

(4)循环体结构问题。循环体语句是循环问题的重复执行部分,可包含三种结构语句。复杂循环体语句一定要注意结构语句的嵌套层次,嵌套层次之间不能相互交叉,即一个结构语句必须完全包含在另一个结构语句中。

(5)循环控制变量的引用问题。循环控制量可以在循环结束后引用,但要注意量值的准确性。如例5.1~例5.3中,循环控制变量i在循环结束时值是101,而不是100。

循环结构程序设计要比顺序结构和选择结构程序设计复杂一些,一定要认真分析规律和算法,然后选择便于实现的循环语句。

例5.8

编写程序,计算s=1-3+5-7…-99+101。

编程思路:这个问题可看成数的累加,相加数是1~101之间的质数,且一个为正数,一个为负数,即累加数的符号在交替变化。找出这个规律,可以设置一个符号变量flag,初值设置为1,在循环中使用flag=-flag,即可实现符号的交替变换。算法可依照数的累加。

例5.9

用for循环语句求n!。

编程思路:可用迭代公式n!=n*(n-1)!。利用循环很容易实现迭代计算问题。设置变量i,既作循环控制变量i(1≤i≤n),又作本次循环求阶乘的数,用变量fac存放i!,初始化为fac=1。第i次循环前,fac中存放(i-1)!,第i次循环后,fac中存放i!,实现了相继两次的迭代。可用for语句实现。

运行结果:

分析:fac作为循环中的乘积变量,在循环外赋初值1,在循环中实现1 × 2 × … × n求值运算,即求得n的阶乘值。

例5.10

编写程序求1~1000之间满足“用3除余2,用5除余3,用7除余2”的数,且一行只打印5个数。

编程思路:求余数用取模运算符%。3个条件是“与”的关系。一行打印5个数,可以通过计数到5再回车换行。用do_while循环来实现。

运行结果:

分析:变量i既作循环控制变量,又是当前要检测的数,取1~1000之间的整数。变量j用于输出数据的计数,控制一行输出5个数。

例5.11

编程实现电文加密。电文加密规律为:将字母变成其后面的第4个字母,其他字符保持不变。例如,a→e,A→E,W→A。编写一个程序,输入一行字符,要求转换成加密电文输出。

编程思路:电文的加密规律如图5.7所示。输入字符赋给变量ch,如果是字符,则其ASCII码值加4,即ch = ch+4。加密后判断ch的值是否超出字母的范围,如果超过,则

ch = ch-26。如输入x,其ASCII码值是120,加4得124,大于z的ASCII码值122,减26后得98,是b的ASCII码值,即把x转换成b。从键盘输入字符并转换为循环实现,循环控制条件为ch!='\n'。

图5.7例5.11的电文加密规律运行结果:

分析:用while循环实现从键盘上输入一个电文字符序列,每输入一个字符按加密规律进行加密转换,一直到输入“回车”键结束。第1层if语句中的条件表达式“ch>='a'&&ch<='z'||(ch>='A')&&ch<='Z'”判断输入的字符是否是26个大写或小写字母,是则进行ASCII码加4转换,不是则不转换。第2层if语句中的条件表达式“(ch>'Z'&&ch<'a')||(ch>'z')”判断字母ASCII码加4转换后是否越界,如果越界则按加密循环规律,将其减26。

例5.12

编写程序,求出100~1000之间各位数字之和是5的数,一行输出5个数,并统计个数。

编程思路:该问题要对100~1000中的每一数逐一进行判定,而且每一数要进行逐位求和,是一个双重循环问题。取遍100~1000之间的所有数可选用for循环结构语句来解决。但在判定100~1000之间的每一个数其各位数字之和是否为5时,由于循环次数随数位的变化而不同,宜选用while循环结构语句。

运行结果:

分析:程序采用双重循环,外循环用for语句,内循环用while语句。在内循环实现对每位数字分离并累加。“s=s+k%10;”语句的作用是分离出当前数的低位并累加,“k=k/10;”语句的作用是截取当前数的高位部分,作为下一次要分离的数。例如123,第1次循环分离出低位数字3,截取高位部分12;第2次循环分离出低位数字2,截取高位部分1;第3次循环分离出低位数字1,截取高位部分0,循环结束。外循环利用变量i依次产生100~1000之间的一个整数,根据内循环计算各位数字之和是否为5,确定是否输出,并进行计数。

例5.13

编写程序,找出3~500之间的全部素数并输出,在一行输出15个数。

编程思路:

(1)素数是除1和它本身之外不能被任何一个整数整除的自然数(1除外)。如2,3,5,7是素数,1,4,6,8,10不是素数。判断某数i是否为素数的一个简单办法是用2,3,4,…,i-1这些数据逐个去除i,只要被其中的一个数整除了,则i就不是素数。数学上已证明,对于自然数i只需用2,3,4,…,i1/2测试。

(2)需要判定3~500之间的每一数是否为素数。判定一个数是否是素数,又要用2,3,4,…,i1/2逐一进行测试,测试到被其中的某一个数整除,则可判定不是素数,就不需要再进行测试了。显然这是一个双重循环问题。为了结束内循环时能方便识别当前判定的数是否为素数,设置一个标志变量flag,在内循环外设初值0,在内循环中遇到能被整除的测试,使flag赋值1。程序流程如图5.8所示。

图5.8

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论