第6讲 三种循环结构.ppt
第6讲 三种循环结构,一、while 语句 二、do-while 语句 三、for 语句,循环结构也称重复结构:程序中反复执行的一组指令或程序段。,循环体:被反复执行的程序段。,循环变量:用来控制循环是否继续进行的变量。循环结构有两种类型即当型循环和直到型循环。,方框图及执行过程 :,一、while 语句,格式:while () 语句A;,流程图:,若表达式(条件)的值为真,则执行内嵌语句A,再判断表达式(条件)···,当表达式的值为假时,执行while后面的语句。,while语句的说明:,(1) while语句属当型循环,即先判断条件(表达式),再执行循环体。,(2) 表达式为一条件,用于控制循环是否可继续执行,故称控制表达式。,(3) 语句A为内嵌式语句,是循环结构的循环体。它可以是单语句也可以是复合语句,且该语句中必须包含有对循环条件进行修改的语句。,例6.1 求 1 + 2 + ······ + 100,分析:求和的过程为:,1) S=1 S1 = S0 + 12) S=1+2 S2 = S1 + 23) S=1+2+3 S3 = S2 + 3······ ······ 100) S=1+2+ ··· +100 S100 = S99+100,S0 = 0,求和表达式:,S = S + i,初值:,S = 0,循环次数 i :,1~100,流程图:,程序:,main ( ) { int s, i;s = 0,i = 1;while ( i = 100 ){ s+=i;i++;}printf(“s=%ld\n“, s); },注意:,如果循环体中包含一个以上的语句,应该用花括弧括起来,以复合语句的形式出现。如果不加花括弧,则while语句的范围只到while后的第一个分号处。,在循环体中应该有使循环趋向结束的语句,否则会导致死循环。,如上例中的语句改写 成如下形式:i=1;while ( i = 100 )s+=i;i++;,则while语句的循环体语句为:s+=i; 循环变量i的值没有改变,循环不能终止,陷入死循环,二、do-while 语句,格式: do while ( );,流程图:,执行内嵌语句A,在判断表达式(条件)若为真,则继续执行内嵌语句A,再判断表达式(条件)···,直到表达式的值为假时,执行do-while后面的语句。,执行过程:,与while语句的不同:,do-while语句至少执行循环体一次,但while语句当条件为假时不执行循环体语句。,例:while与do-while区别,#include main( ) {int i=65;do{putchar(i); i++;}while(i‘A’); },#include main( ) {int i=65;while(i‘A’){putchar(i); i++; } },无输出,输出A,例 6.2 编程 :求 。直到最后一项的绝对值小于10-7,分析:,求和:,停止求和:,#include main(){ int n=0; float s=0;do { n+=1;s+=pow(-1,n+1)/(2*n-1);}while ( 1./(2*n-1) = 1e-7 );printf(“PI = %.6f\n“, 4 * s );},程序:,例6.3 编程:求展开项的和。,分析:1. X 的单位应为弧度,即:,2. 当 n = 1 时,S = X,当 n ≥2 时,Sn-1初值为 x , Sn的值为 :,main(){ float x, s, t; int n = 1;scanf(“%f“,},三、for 语句,各部分的作用:表达式1 :循环变量赋初值。表达式2 :判断循环条件,若省略,则认为循环条件恒为“真“。表达式3 :修改循环变量的值。语 句 :循环体,格式: for ( [ 表达式 1] ;表达式2 ;[ 表达式3])语 句;,流程图:,说明:for语句的一般形式中的“表达式1”可以省略。此时应该在for语句之前给循环变量赋初值。如果表达式2省略,即不判断循环条件(认为表达式始终为真),循环会无终止的运行下去。表达式3省略时,应另外设置条件保证循环能正常结束。如在循环体内修改循环变量。表达式1和表达式3可以是简单的表达式,也可以是一个逗号表达式;它可以与循环变量有关,也可以与循环变量无关。,如:for (i=1; ;i++) sum=sum+i;,它相当于:i=1;while (1) {sum=sum+i;i++;},该循环是死循环,如:for (i=1; i100; ) {sum=sum+i; i++;},在循环体内修改循环变量,循环可以正常终止,相当于: while (i100) {sum=sum+i;i++;},如:for ( ; i100; ) {sum=sum+i; i++;},(1)在循环语句前给循环变量赋初值 (2)循环体内修改循环变量,例6.4:for( y=20,x=1 ;x--y ;x+=x )printf(“%d,%d\n“,x,y);,该语句输出如下:,1, 19 2, 18 4, 17 8, 16,例6.5:求 n!,分析:求阶乘的过程为:,1) S=1 S1 = S0 × 12) S=1×2 S2 = S1 × 23) S=1×2×3 S3 = S2 × 3······ ······n) S=1×2× ··· ×n Sn = Sn-1×100,S0 = 1,求阶乘表达式:,S = S × i,初值:,S = 1,循环次数 i :,1~n,流程图:,程序:,#define N 10 main ( ) { int n , i;long int s=1;for ( i=1; i=N; i++ )s *= i;printf(“s=%ld\n“, s); },1. 三种循环可以互相代替。 2. for、while属当型循环,do–while循环属直到型循环。 3. 在for循环的循环体中无须对循环变量进行修改,其它两种循环则必须在循环体中对循环变量进行修改 。 4. for循环的初始条件可在表达式1中进行设置,其它两种循环则必须在进入循环之前进行设置。 5. 循环变量的值在循环体中可以被使用,但决不允许被修改。例如 while ( i=100 ){ s+=i; i++; } 合法的while ( i=100 ){ i+=s; i++; } 不合法的,三种循环几点说明:,例6.6:求 水仙花数,即这个数等于它的百位、十位和个位数的立方和。 如153是一个水仙花数,因为153=,分别用三种循环语句编写该程序。,main( ) {int n=100,i,j,k; /*i、j、k用来放这个数的百位、十位和个位*/printf(“水仙花数是:”);while (n1000){i=n/100;j=(n/10)%10;k=n%10;if (n==i*i*i+j*j*j+k*k*k)printf(“%6d“,n);n=n+1;} },main() {int n=100,i,j,k; printf(“水仙花数是:”);do {i=n/100;j=(n/10)%10;k=n%10;if (n==i*i*i+j*j*j+k*k*k)printf(“%6d“,n);n=n+1;}while (n1000);},main( ) {int n=100,i,j,k;printf(“水仙花数是:”);for(n=100;n1000;n++){i=n/100;j=(n/10)%10;k=n%10;if (n==i*i*i+j*j*j+k*k*k)printf(“%6d“,n);} },例 输入‘A’到‘Z’中的任一个字符,输出如下回文串。如:输入‘B’,则输出ABA;输入‘E’,则输出ABCDEDCBA。,分析:该回文串可以分为两个部分如输入为‘E’时,分为ABCDE和DCBA两部分,可以用两个循环语句,循环变量可以先从‘A’循环到‘E’,再从‘D’循环到‘A’,程序:,main( ) {char c,ci;printf(“输入一个字母\n”);c=getchar( );for(ci=‘A’,ci=‘A’,ci--) printf(“%c”,ci);printf(“\n”);},