Upload
demetria-richmond
View
105
Download
6
Embed Size (px)
DESCRIPTION
第 5 章 循环结构程序设计. 5.1 循环结构程序设计的概念 5.2 语句标号和 goto 语句 5.3 while 语句 5.4 do … while 语句 5.5 for 语句 5.6 循环结构嵌套 5.7 break 语句和 continue 语句. 第 5 章 循环结构程序设计. 5.1 循环结构程序设计的概念. 实现循环的程序结构称为循环结构,是计算机科学中用以描述客观世界循环现象的重要手段。 - PowerPoint PPT Presentation
Citation preview
第 5 章 循环结构程序设计 5.1 循环结构程序设计的概念5.2 语句标号和 goto 语句 5.3 while 语句 5.4 do … while 语句 5.5 for 语句 5.6 循环结构嵌套 5.7 break 语句和 continue 语句
5.1 循环结构程序设计的概念
实现循环的程序结构称为循环结构,是计算机科学中用以描述客观世界循环现象的重要手段。
程序设计中的循环(简称循环)是指在程序设计中,从某处开始有规律地反复执行某一操作块(或程序块)。如果循环永远不会终止,这样的循环就称为死循环。
第 5 章 循环结构程序设计
5.2 语句标号和 goto 语句
goto 语句为无条件转向语句,它的一般格式为:
goto 语句标号 ;
第 5 章 循环结构程序设计
例 5.1 用 if 语句和 goto 语句构成循环,求∑ n 。 main( ) { int i , sum=0; i=1;loop: if(i<=100) { sum=sum+i; i++; goto loop; } printf("%d" , sum); }
100
n=1
5.3 while 语句 while 语句用来实现“当型”循环结构。 5.3.1 while 语句的一般格式 while 语句是一个循环控制语句,用来控制程序段
的重复执行。其一般格式为: while( 表达式 )
循环体 ;
格式中的循环体,可以是单个语句、空语句,也可以是复合语句。
第 5 章 循环结构程序设计
5.3.2 while 语句的执行过程
当表达式为非 0 时,执行 while 语句中的循环体,然后继续进行表达式的判断,如此循环。当表达式为0 时,则退出循环。
说明:如果循环体包含一个以上的语句,就构成块语句,应该用花括号 { } 括起来。
第 5 章 循环结构程序设计
返回章目录
当表达式为非 0 值时,执行 while 语句中的内嵌语句。其流程图见图 5.1 。其特点是:先判断表达式,
后执行语句。
图 5.1图 5.2
例 5.2 求∑ n 。用传统流程图和 N-S 结构流程图表示算法,见图
P84 5.2(a) 和图 5.2(b) 。根据流程图写出程序:
main(){
int i , sum=0; i=1;
while (i<=100) {
sum=sum+i; i++;
} printf("%d" , sum);
}
100
n=1
5.4 do … while 语句 C 语言中,用 do … while 语句构成直到型循环结
构。 5.4.1 do … while 语句的一般格式 do … while 语句也是一个循环控制语句。其特点是
先执行循环体,然后判断条件是否成立。其一般格式为: do
循环体 while( 表达式 ) ;
说明:循环体至少执行一次。当循环体有多个语句时必须加花括号 { } 。
第 5 章 循环结构程序设计
5.4.2 do … while 语句的执行过程
先执行一次指定的循环体语句,然后判断表达式。当表达式的值为非 0 的数据时,返回重新执行循环体,如此反复直到表达式的值为 0 为止,此时循环结束。
第 5 章 循环结构程序设计
返回章目录
图 5.3
例 5.3 用 do while 语句求∑ n 。先画出流程图,见图 5.4 。
图 5.4 图 5.5
100
n=1
程序如下:main()
{
int i , sum=0;
i=1;
do
{sum=sum+i;
i++;
}
while(i<=100);
printf("%d" , sum) ; }
例 5.4while 和 do-while 循环的比较。(1) main ( ) (2) main( )
{int sum=0 , i; {int sum=0 , i;
scanf(“%d” , &i); scanf("%d" , &i);
while (i<=10) do
{sum=sum+i; {sum=sum+i;
i++; i++;
} } while (i<=10)
printf(“sum=%d” , sum); printf(“sum=%d” , sum);
} }
5.5 for 语句
for 语句可以用于循环次数已经确定的情况,还可用于循环次数不确定而只给出循环结束条件的情况。
5.5.1 for 语句的一般格式
for 语句的一般格式为:
for ( 表达式 1 ; 表达式 2 ; 表达式 3)
循环体
第 5 章 循环结构程序设计
5.5.2 for 语句的执行过程
for 语句的执行过程为: (1) 先求解表达式 1 ,表达式 1 只执行一次,一般是赋
值语句,用于初始化变量。 (2) 求解表达式 2 ,若为假( 0 ),则结束循环。
(3) 当表达式 2 为真(非 0 )时,执行循环体。 (4) 执行表达式 3 。 (5) 转回 (2) 。
第 5 章 循环结构程序设计
图 5.6
for(i=1;i<=100;i++)
sum=sum+i;
5.6 循环结构嵌套 一个循环体内包含另一个完整的循环结构,称为循环的嵌套。循
环之中还可以套循环,称为多层循环。三种循环( while 循环、 do … while 循环和 for 循环)可以互相嵌套。例如:
while( ) { … for ( ) { … } … }
第 5 章 循环结构程序设计
5.7 break 语句和 continue 语句 5.7.1 break 语句
break 语句可以使流程跳出 Switch 结构,继续执行 Switch 语句下面的一个语句。 break 语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。如:
for(r=1;r<=10;r++) { area=Pi*r*r; if(area>100) break; printf("%f" , area); }
第 5 章 循环结构程序设计
5.7.2 continue 语句
continue 语句的作用是结束本次循环,忽略 continue 后面的语句,进行下一次循环判定。
continue 语句和 break 语句的区别是: continue 语句只结束本次循环,而不是终止整个循环的执行。而 break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
第 5 章 循环结构程序设计
返回章目录
5.9 程序举例
例 5.6 用 π/4≈1-13+15-17+… 公式求 π 的近似值,直到最后一项的绝对值小于 10-6 为止。
用 N\|S 结构化流程图表示算法 ( 见图 5.12) 。
图 5.12
程序如下:#include<math.h>
main()
{
int s;
float n , t , Pi;
t=1 ; Pi=0;n=1.0;S=1;
while((fabs(t))>1e-6)
{Pi=Pi+t;
n=n+2;
s=-s;
t=S/n;
}
Pi=Pi*4;
printf("Pi=%10.6f \ n" , Pi);
}
运行结果为:Pi= 3.141594
例 5.7 求 fibonacci 数列 40 个数。这个数列有如下特点:第1 , 2 两个数为 1 , 1 。从第 3 个数开始,该数是其前面两个数之和。即 :
f1=1 (n=1)
f2=1 (n=2)
fn=fn-1+fn-2 (n≥3)
解此题的算法如图 5.13 所示。
图 5.13
程序如下:
main()
{
long int f1 , f2;
int i;
f1=1;f2=1;
for(i=1; i<=20; i++)
{
printf("%12ld %12ld " , f1 , f2);
if(i%2==0) printf(" \ n");
f1=f1+f2;
f2=f2+f1;
}
}
运行结果为: 1 1 2 3
5 8 13 21
34 55 89 144
233 377 610 987
1597 2584 4181 6765
10946 17711 28657 46368
75025 121393 196418 317811
514229 832040 1346269 2178309
3524578 57022887 9227465 14930352
24157817 39088169 63245986 102334155
例 5.8 判断 m 是否素数。算法如图 5.14 所示。我们采用的算法是这样的:让 m 被 2 到 m 除,如果 m 能被 2 ~ m 之中任何一个整数整除,则提前
结束循环,此时 i 必然小于或等于 k( 即 m) ;如果 m不能
图5.14
#include <math.h>
main()
{
int m , i , k;
scanf("%d" , &m);
k=sqrt(m+1);/* 加 1 是为了避免在求 m 时可能出现的误差 */
for (i=2;i<=k;i++)
if(m%i==0) break;
if(i>=k+1) printf("%d is a Prime muber \ n" ,m);
else printf("%d is not a Prime number \ n" ,m);
}
运行情况如下:17
17 is a Prime number
例 5.9 求 100 ~ 200 间的全部素数。 在例 5.8 的基础上,对本题用一个嵌套的 for 循环即可处理。程序如下: # include <math.h>
main()
{
int m , k , i , n=0;
for(m=101;m<=200;m=m+2)
{
k=sqrt(m);
for (i=2;i<=k;i++)
if (m%i==0) break;
if (i>=k+1){printf("%d " , m);n=n+1;}
if(n%10==0) printf(" \ n");
}
printf (" \ n");
}
运行结果如下:101 103 107 109 113 127 131 137 139 149
151 157 163 167 173 179 181 191 193 197
199
n 的作用是累计输出素数的个数,控制每行输出10 个数据。
例 5.10 译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。例如,可以按以下规律将电文变成密码:将字母 a 变成字母 E , a 变成 e ,即变成其后的第4 个字母, W 变成 a , X 变成 b , Y 变成 c , Z 变成 D 。见图 5.15 。字母按上述规律转换,非字母字
符不变。如“ china!” 转换为“ Glmre!” 。输入一行字符,要求输出其相应的密码。
图5.15
程序如下: #include <Stdio.h>
main()
{
char c;
while((c=getchar())!=' \ n')
{
if((c>='a' && c<='z') || (c>='a' && c<='Z'))
{ c=c+4;
if(c>'Z' && c<='Z'+4 || c>'z') c=c-26;
}
printf("%c" , c);
}
}
运行结果如下:china!
Glmre!
程序中对输入的字符处理办法是:先判定它是否大写字母或小写字母,若是,则将其值加 4( 变成其后的第 4 个字母 ) 。如果加 4 以后字符值大于‘ Z’或‘ z’ ,则表示原来的字母在 V( 或 v) 之后,应按图 5.15 所示的规律将它转换为 a ~ D( 或 a ~ d)之一。办法是
使 c 减 26 ,如果读者对此还有疑问,请查 ascII码表即可清楚。还有一点请读者注意:内嵌的 if 语
句不能写成 if(c>'Z'|| c>'z') c=c-26;
因为当字母为小写时都满足“ c>‘Z’” 条件,从而也执行“ c=c-26;” 语句,这就会出错。
因此必须限制其范围为“ c>‘Z’ && c<=‘Z’+4” ,即原字母为‘W’ 到‘ Z’ ,在此范围以外的不是大写字母 W ~ Z ,不应按此规律转换。请考虑:为什么对
小写字母不按此处理,即写成 c>'z' && c<='z'+4
而只须写成“ c>‘z’” 即可。