第 6讲 三种循环结构一,while 语句二,do-while 语句三,for 语句循环结构 也称 重复结构,程序中反复执行的一组指令或程序段。
循环体,被反复执行的程序段。
循环变量,用来控制循环是否继续进行的变量。
循环结构有两种类型即 当型循环 和直到型循环 。
方框图及执行过程,
非 0(真)
0(假)
表达式语 句当型循环非 0 (真)
0 (假)
语句 A
表达式直到型循环一,while 语句格式,
while ( < 表达式 >) 语句 A;
非 0(真)
0(假)
语句 A
表达式流程图:
若表达式(条件 ) 的值为真,则执行内嵌语句 A,
再判断表达式(条件) ···,当表达式的值为假时,执行
while后面的语句 。
while语句的说明:
(1) while语句属 当型循环,即先判断条件(表达式),再执行循环体。
(2) 表达式为一条件,用于控制循环是否可继续执行,故称控制表达式。
(3) 语句 A为内嵌式语句,是循环结构的循环体。它可以是单语句也可以是复合语句,且该语句中必须包含有对循环条件进行修改的语句。
非 0(真)
0(假)
语句 A
表达式例 6.1 求 1 + 2 + ··· + 100
分析:
求和的过程为:
1) S=1 S1 = S0 + 1
2) S=1+2 S2 = S1 + 2
3) 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
定义 变量 s,i
s = 0,i = 1 ;
i≤ 1 0 0
s + = i ;
i + + ;
输出 s
N
Y
流程图,程序:
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 < 语句 A ; >
while ( < 条件 > );
流程图:
非 0(真)
0(假)
语句 A
表达式执行内嵌语句 A,在判断表达式(条件)若为真,则继续执行内嵌语句 A,再判断表达式(条件) ···,直到表达式的值为假时,执行 do-while后面的语句。
执行过程:
与 while语句的不同:
do-while语句 至少执行循环体一次,但 while语句 当条件为假时不执行循环体语句。
例,while与 do-while区别
# include <stdio.h>
main( )
{int i=65;
do{putchar(i);
i++;}while(i<?A’ );
}
# include <stdio.h>
main( )
{int i=65;
while(i<?A?)
{putchar(i); i++; }
}
无输出 输出 A
例 6.2 编程,求? 。
直到最后一项的绝对值小于 10-7
71513114?
1n2 11)(7151311S 1n
分析:
10 7
1n
1n2
1)(
1n2
1)( 1nss

求和:
停止求和:
10 71n 1n2 1)(
定义变量 n,s
n=0,s=0;
n++;
输出 4*s
1/(2*n-1)≥10 -7
12
)1( 1

n
nss
Y
N
#include <math.h>
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 编程:求展开项的和。
!!!)( 753 753 xxxxxS i n
分析:
1,X 的单位应为弧度,即,3 6 01432 /,xx
2,当 n = 1 时,S = X
当 n ≥2 时,Sn-1初值为 x,Sn的值为,
))(( 1222
2
1

nn
xSS
nn
main()
{ float x,s,t;
int n = 1;
scanf( "%f",&x );
x = 2 * 3.1415926 * x / 360;
s = x; t = x;
do { n = n + 1;
t = t * (-1) * x * x /
(( 2 * n - 2) *( 2* n - 1)) ;
s = s + t ; }
while ( t > 1e-6 ) ;
printf( " SIN( %f) = %.3f \n ",x,s) ;
}
三,for 语句各部分的作用:
表达式 1,循环变量赋初值。
表达式 2,判断循环条件,若省略,则认为循环条件恒为 "真 "。
表达式 3,修改循环变量的值。
语 句,循环体格式:
for ( [ 表达式 1] ;表达式 2 ; [ 表达式 3])
语 句;
表达式 2
语句假表达式 3
For循环的 下一语句真表达式 1
流程图:
说明:
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; i<100; )
{sum=sum+i; i++;}
在循环体内修改循环变量,循环可以正常终止相当于,while (i<100)
{sum=sum+i;
i++;}
如,for( ; i<100; )
{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 × 1
2) S=1× 2 S2 = S1 × 2
3) 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
定义 符号 常量 N
定义 变 量 n,i,s
s = 1 ; i = 1
i≤ N
s * = i
i + +
输出 s
Y
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= 333 351
分别用三种循环语句编写该程序。
main( )
{int n=100,i,j,k; /*i,j,k用来放这个数的百位、十位和个位 */
printf(“水仙花数是:”);
while (n<1000)
{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 (n<1000);
}
main( )
{int n=100,i,j,k;
printf(“水仙花数是:”);
for(n=100;n<1000;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<=c,ci++) printf(“%c”,ci);
ci--;
for(,ci>=?A?,ci--) printf(“%c”,ci);
printf(“\n”);
}