第4章 循环结构_第1页
第4章 循环结构_第2页
第4章 循环结构_第3页
第4章 循环结构_第4页
第4章 循环结构_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章 循环结构,计算机系,西南交通大学,内容提要,西南交通大学,4.1 引言,在不少实际问题中有许多具有规律性的重复操作,在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,取决于循环的终止条件。 循环语句是由循环体及循环的终止条件两部分组成的。 要使用循环语句时,必须要确定两个重要因素:要重复执行哪些语句,重复到什么时候为止。,西南交通大学,4.2 for循环,1. 语法格式 for(循环变量赋初值;循环条件;循环变量值的改变) 循环体语句 2. 说 明 (1)执行顺序 先执行循环变量赋初值; 再判断循环条件; 如果条件成立执行循环体语句; 再返回上面执行循环变

2、量值的改变; 后面重复这个顺序; 直到条件不成立,跳出整个 for 循环。,西南交通大学,4.2 for循环,(2)for循环中的循环变量赋初值可省略,但后面的 ; 不能 省略。 如果省略,则要求循环变量在 for 之前已经赋值。 另外,该处也可写与循环变量无关的其他表达式。 (3)for循环中的 循环条件可省略,但后面的;不能省。 如果省略,即无循环结束的条件,循环将无终止地执行下去。 如果省略,还可用 break 语句替代其功能(在 4.7 节详细说明) 。 循环条件可以是关系、逻辑、数值、字符表达式,只要值不为 0 就执行循环体。,西南交通大学,4.2 for循环,(4)for 循环中的

3、 循环变量值的改变可省略。 如果省略,应在循环体语句中设置变量值的改变,否则循环可能无法结束。 另外,该处也可写与循环变量无关的其他表达式。 (5)for 循环中的都可省略,如: for( ; ; ) 表示无限循环。 (6)循环体语句如果超过一条应加上花括号“”构成复合语句。,西南交通大学,for循环 举例,【例4.1】求和。 输入 10 个数,求这 10 个数的和,然后输出结果。 #include int main(void) float count,sum,x; printf(输入10 个数:); for(count=0,sum=0;count10;count+) scanf(%f, ,例

4、4.1.1,西南交通大学,for循环 举例,程序说明: (1)该例中,count=0,sum=0; 还可写为:count=sum=0; (2)该例中,可省略和,即将放在循环体之前进行, 将放在循环体中进行。 (3)循环结束时,count 的值为 10。 (4)循环体语句执行了 10 次。,例4.1.2,西南交通大学,for循环 举例,【例4.2】 求阶乘。编程求 10!。 #include int main(void) long int i,s; for(i=1,s=1;i=10;i+) s*=i; printf(10!=%ldn,s); return 0; ,例4.2,西南交通大学,for循

5、环 举例,程序说明: (1)跳出循环时,i=11,循环体共执行了 10 次。 (2)本题中,变量 i 也可从 2 开始。 (3)由于 10!超过了“整型”范围,因此必须定义为“长整型” 。 (4)循环体语句只有一句 s*=i; 因此可以不用加花括号。,西南交通大学,for循环 举例,【例4.3】 求阶乘的和。编程求 1!+2!+10!。 基本思路: 本题把例 4.1 和例 4.2 的要求融合在一起,用循环实现累加和累乘。 很多程序都是在累加和累乘的基础上实现的,请读者在初学时,多练习写相关的程序,以更好地理解程序设计中循环的解题思想。 如:求 100200 所有的奇数和; 求 1020 所有偶

6、数的乘积。,例4.3,西南交通大学,for循环 举例,#include int main(void) long int i,s,sum; for(i=2,s=1,sum=1;i=10;i+) s*=i; sum+=s; printf(1!+2!+3!+10!=%ldn,sum); return 0; ,西南交通大学,for循环 举例,【例 4.4】 输出所有水仙花数。 水仙花数为一个三位数,该三位数每位数字的立方和等于该数本身。编程求出所有三位水仙花数。 基本思路: 三位数即表示范围为 100999,这种明确给出了数值范围的题目,用 for 循环来表示,结构上非常清晰。 该题也可用 while

7、 循环来实现,读者可以自己尝试写出程序,比较这两种循环在表达上的差异。,例4.4,西南交通大学,for循环 举例,#include void main() int i,a,b,c; for(i=100;i=999;i+) a=i%10; /*a 为个位*/ c=i/100; /*c 为百位*/ b=i%100/10; /*b 为十位*/ if(i=a*a*a+b*b*b+c*c*c) printf(%d,i); ,西南交通大学,例4.5,for循环 举例,【例4.5】 输入任意字符,并将刚才输入的字符输出,如果想结束输入,则输入字母 t。 #include int main(void) cha

8、r c; for(;(c=getchar()!=t;) printf(%c,c); printf(n); return 0; ,该题省略了和,只保留了,循环体语句只有一句 而printf(n);是循环外的语句,要在整个循环结束后才会执行,函数 getchar()获取从键盘上输入的字符,赋给变量 c,西南交通大学,for循环 举例,每输入一个字符,按回车键,结果如下: 连续输入一串字符,最后一个输入 t,然后按回车键,结果如下:,西南交通大学,4.3 while循环,1. 语法格式 while(循环条件) 循环体语句 2. 说 明 (1)执行顺序: 当循环条件“真” ,即值为非 0 时,执行循环

9、体语句; 当循环条件“假” ,即值为 0 时,跳出循环。,西南交通大学,4.3 while循环,(2)循环体语句如果有一个以上的语句,应以一对花括号“ ”括起来,成为复合语句。 (3)循环体语句中应该有使循环趋于结束的语句。 (4)while 循环,首先就要判断条件,如果条件一开始就为假,循环体语句可能一次都不执行。,西南交通大学,while循环 举例,【例4.6】 求和(与例 4.1 的 for 循环比较) 。 #include int main(void) float count=0,sum=0,x; /*变量赋初值*/ printf(输入10 个数:); while(count10) s

10、canf(%f, ,例4.6,西南交通大学,while循环 举例,程序说明: 将本例和例 4.1 比较,我们发现: while 循环就是把 for 循环的循环体变量赋初值放到while 之前; 把 for 循环的循环体变量值的改变放到 while 的循环体内; 条件判断部分是一样的。,西南交通大学,while循环 举例,实际编程中一般选择表达方式简洁明确的: 例4.1-例4.4 用 for 循环更好; 例4.5 和 4.8 用 while 循环更好。,西南交通大学,例4.7,while循环 举例,【例4.7】 求阶乘(与例 4.2 的 for 循环比较) 。 #include int main

11、(void) long int i,s; i=1,s=1; while(i=10) s*=i; i+; printf(10!=%ldn,s); return 0; ,西南交通大学,while循环 举例,【例4.8】 使用公式 /411/3+1/51/7+求, 直到最后一项的绝对值小于 10-8为止。 #include #include int main(void) double pi=0,t=1,n=1; int s=1;,while(fabs(t)=1E-8) pi+=t; n+=2; s=-s; t=s/n; printf(%.8fn,pi*4); return 0; ,例4.8,西南交通

12、大学,while循环 举例,程序说明: (1)最后一项的绝对值小于 10-8,即有效位数超过 7 位,已超出 float 型的精度范围,因此应定义为 double 型。 (2)该例中循环次数不明确, 循环条件要通过计算才能得到, 这种类型的程序, 选择 while 循环实现要更清楚明确,读者可以尝试用 for 循环来实现。,西南交通大学,4.4 do-while循环,1. 语法格式 do 循环体语句 while( 循环条件 ) ; 2. 说 明 (1)执行顺序: 先无条件执行一次 do 后的循环体语句; 然后判断循环条件,若值为“真” ,返回 do 处,执行循环体语句; 如此反复,直到循环条件

13、为“假” ,跳出循环。,西南交通大学,4.4 do-while循环,(2)无论条件是否成立, do-while 循环的循环体语句至少执行一次; 而 while 循环的循环体语句可能一次都不执行。 (3)do-while 循环中,while 后的循环条件 后有一个分号 ; 书写时不要遗漏了。,西南交通大学,do-while循环 举例,【例4.9】 求和(与例 4.6 的 while 循环比较) 。 #include int main(void) float count=0,sum=0,x; printf(输入10 个数:); do scanf(%f, ,例4.9,西南交通大学,do-while循

14、环 举例,程序说明: 如果 count 初值为10,输入x的值为10 : 那么 do-while 循环的循环体仍然要执行一次, 最后sum 的值为 10 如果是 while 循环,则循环体一次都不执行,最后 sum 值为 0,西南交通大学,do-while循环 举例,【例4.10】 统计字符个数,输入一串字符, 分别统计数字字符、字母和其他字符的个数. int digit=0,letter=0,other=0; char c; printf(输入一行字符串:n); do scanf(%c,例4.10,西南交通大学,do-while循环 举例,程序的运行结果如下:,其他字符有:空格、逗号、减号、

15、乘号、除号、回车 6 种, 回车符号在屏幕上看不出来。,西南交通大学,do-while循环 举例,可改为如下形式: while(c=getchar()!=n) if(c=0 ,西南交通大学,do-while循环 举例,【例4.11】 任意输入两个数,求这两个数的最大公约数。 基本思路: 首先,随机输入两个数 m、n(默认 mn) ; 其次,将 m 除以 n 的余数赋给 k,如果 m 能被 n 整除,则 k 值为 0,n 即为这两个数的最大公约数; 否则,将 n 赋给 m,k 赋给 n,重复以上过程,直到 k 值为 0。 这种求最大公约数的算法称为辗转相除法。,例4.11,西南交通大学,do-w

16、hile循环 举例,int m,n,k,result; printf(Enter two numbers:); scanf(%d%d,西南交通大学,4.5 goto语句,1. 语法格式 goto 语句标号; 2. 说 明 (1)执行顺序:无条件跳转到语句标号所在行。 (2)语句标号用标识符表示,命名规则和变量名相同。 (3)可与 if 语句一起构成循环。 (4)滥用 goto 语句会使程序流程无规律,一般限制使用,只在需要从多层循环的内层跳 到外层时才会用到该语句。,西南交通大学,goto语句 举例,【例4.12】 求和。 #include int main(void) int i=1,sum

17、=0; loop:if(i=10) sum=sum+i;i+; goto loop; printf(%d,sum); return 0; 程序说明: 该程序相当 while循环,当 i=10 时,执行花括号内的语句块。,例4.12,西南交通大学,4.6 循环嵌套,一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。 内嵌的循环中还可以嵌套循环,这就是多层循环。,西南交通大学,循环嵌套 举例,【例4.13】 百钱买百鸡。现有 100 元钱,要买 100 只鸡,公鸡 5 元一只,母鸡 3 元一只,小鸡1元钱三只,问如何买法。 #include int main(void) int cock,h

18、en,chick; for(cock=0;cock=20;cock+) for(hen=0;hen=33;hen+) chick=100cockhen; if(cock*15+hen*9+chick=300) printf(%d,%d,%dn,cock,hen,chick); return 0; ,例4.13,西南交通大学,循环嵌套 举例,程序说明: (1)100 元钱全部买公鸡,最多买 20 只。因此循环中 cock 最大值取 20;取 100 也可以,但使循环多执行了很多次,程序效率低。 (2)程序执行顺序:请老师上课讲解。,西南交通大学,4.7 break语句和continue语句,br

19、eak 语句 可以使程序流程跳出 switch 语句, 还可以从循环体内跳出循环体,提前结束循环。 continue 语句 可以提前结束本次循环。,西南交通大学,4.7.1 break语句,1. 语法格式 break ; 2. 说 明 (1)作用 1:使流程跳出循环,终止整个循环。 (2)作用 2:使流程跳出 switch 语句。 (3)不能用于循环语句和 switch 语句之外的其他任何语句。,西南交通大学,break语句 举例,【例4.14】 判别所输入的一个大于 1 的正整数是否是素数。 判断素数的方法是: 用这个数分别去除 2 到这个数的平方根, 只要有一个数能被整除,则表明此数不是素

20、数, 如果没有一个数能被整除,则是素数。 #include #include int main(void) int x,i,j; printf(输入一个大于1的正整数?); scanf(%d,例4.14,西南交通大学,break语句 举例,j=(int)sqrt(x); for(i=2;ij) printf(%d 是素数!n,x); else printf(%d 不是素数!n,x); return 0; ,sqrt( )平方根函数, 见附录,当ij 时跳出,说明从 2 到 sqrt(x)之间,没有一个能被 x 整除,这种情况判断出 x 是素数,当x%i=0 时跳出,说明 x 有因子,不可能是素数,这时 i 还未取到终止值 j,如果不用 break 语句,本程序可将 for 语句改成: for(i=2,j=(int)sqrt(x);i=j,西南交通大学,break语句 举例,for 语句有两个结束条件: 当ij 时跳出,说明从 2 到 sqrt(x)之间,没有一个能被 x 整除,这种情况判断出 x 是素数。 当x%i=0 时跳出

温馨提示

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

评论

0/150

提交评论