第 4章 流程控制
4.1 关系运算符和关系表达式
4.2 逻辑运算符和逻辑表达式
4.3 if 语句
4.4 switch 语句
4.5 循环控制
第 4章 流程控制语句
4.1 关系运算符和关系表达式
1,关系运算符及其优先顺序
C 有 6 种关系运算符:
<
< =
>
> =
优先级相同 (高 )
==
! = 优先级相同 (低 )
! (非 ) 高
算术运算符
关系运算符
&& 和 | |
赋值运算符 低
并排两个等于号,
一个时为赋值号。
2,关系表达式
关系表达式是用关系运算符将两个以上算术、关
系、逻辑、赋值或字符表达式连接起来的式子。
关系表达式的值是一个逻辑值,“真” (非 0) 或
“假” (0)。
例如:
c>a+b 等效于, c>(a+b)
a>b!=c (a>b)!=c
a==b<c a==(b<c)
a=b>c a=(b>c)
4.2 逻辑运算符和逻辑表达式
1,逻辑运算符及其优先顺序
? C的三种逻辑运算符
&& 逻辑与
|| 逻辑或
? 逻辑非
“&&” 和, ||” 为双目运算符,,!” 为单目运算符。
a && b 若 a,b均为真,则 a && b为真,否则为假。
a || b 若 a,b均为真,或之一为真,则 a||b为真,否则为假
!a 若 a为真,则 !a 为假,否则为真。
? 优先顺序
(a>b) && (x>y) ? a>b && x>y
(a= =b) || (x= =y) ? a= =b || x= =y
( ! a) || (a>b) ? ! a || a>b
(m=a>b) && (n=c>d) ? (m=(a>b) ) &&(n=(c>d) )
! (非 ) 高
算术运算符
关系运算符
&& 和 | |
赋值运算符 低
2,逻辑表达式
逻辑表达式是用逻辑运算符将关系表达式或逻辑
量连接起来的式子。逻辑表达式的值是一个逻辑量“真”
(非 0) 或,假” (0)。
3,逻辑表达式求解
a && b && c 若 a 为假,则表达式值为假。
a || b || c 若 a 为真,则表达式值为真。
5>3&&2||8<4-!0 若 (5>3&&2)为真,则表达式值为真。
在 Turbo C中,&& 和 || 的优先级相同。
4.3 if 语句
1,if 语句的一般形式
? if (表达式 ) 语句;
? if (表达式 ) 语句 1;
else 语句 2;
其中:
?,语句”和“语句 1”可以是用 { }括起来的复合语句。
?,语句 2”既可以是用 { } 括起来的复合语句,也可
以是 ?或 ? 形式的 if 语句。
?,语句 1”后面的,;,是必须的。
例 4.1 输入三个实数,按小到大顺序输出。
main( )
{ float a,b,c,t;
scanf(“%f,%f,%f”,&a,&b,&c);
if (a>b) { t=a; a=b; b=t; }
if (a>c) { t=a; a=c; c=t; }
if (b>c) { t=b; b=c; c=t; }
printf(“%5.2f,%5.2f,%5.2f”,a,b,c);
} 若 a>b,则通过中间变量 t 交换变量 a,b的值
2,if 语句的嵌套
在 if 语句中又包含一个或多个 if 语句称为 if 语
句的嵌套。
if ( )
if ( ) 语句 1;
else 语句 2;
else
if ( ) 语句 3;
else 语句 4;
注,从最内层开始,else总是与它前面最近的未曾
配对的 if 配对,除非用花括号改变其配对关系。
例 4.2 编程求 y =
main( )
{ int x,y;
scanf(“%d”,&x);
if (x<0) y = -1;
else if (x==0) y = 0;
else y = 1;
printf(“x=%d,y=%d\n”,x,y);
}
-1 ( x < 0 )
0 ( x = 0 )
1 ( x > 0 )
的值。
x 的值从键盘输入。
3,条件运算符
若有如下 if 语句:
if (a>b) max=a;
else max=b;
则可以用下面的条件运算符处理:
max = (a>b)? a, b;
同样, 对如下 if 语句:
if (a>b) printf(“%d”,a);
else printf(“%d”,b);
也可用下面的语句代替:
printf(“%d”,a>b? a, b);
?条件运算符,?,, 是一个三目运算符,必须有三个操
作对象。
?条件运算符的优先级高于赋值运算符,低于关系运算
符和算术运算符。 如:
a>b?a:b+1 /? 相当于 a>b? a, (b+1) ?/
?条件运算符的结合方向为, 自右至左,。
a>b?a:c>d?c:d /* 相当于 a>b?a:(c>d?c:d) */
如,max = (a>b)? a, b;
?仅在 if 语句 内嵌 的语句为赋值语句时,才能用条件
表达式取代该 if 语句。
?条件表达式中的操作对象可以是不同的类型,且其值
取较高的类型。 如:
x??a?:?b? 当 x = 0时,条件表达式的值为‘ b?
x>y?1:1.5 当 x≤y 时,条件表达式的值为 1.5,
否则为 1.0。
如:
例 4.3 求一元二次方程的解。
#include“math.h”
main( )
{float a,b,c,d,x1,x2,p,q;
scanf(“%f,%f,%f,,&a,&b,&c); printf(“该方程, );
if (fabs(a) <= 1e-6) printf(“不是一个 2次方程 。, );
else d=b?b-4?a?c;
if (fabs(d)==1e-6)printf(“有两个相等的实根, %8.4f \n”,-b/(2?a));
else
if (d>1e-6)
{ x1= (-b+sqrt(d))/(2?a);
x2= (-b-sqrt(d))/(2?a);
printf(“有两个不相等的实根,%8.4f and %8.4f \n”,x1,x2);
}
else
{p=-b/(2?a); q=sqrt(-d)/(2?a);
printf(“有复数根,\n”);
printf(“%8.4f +%8.4f i\n”,p,q); printf(“%8.4f -%8.4f i\n”,p,q);
}
}
此处不得写成:
fabs(a) <= 0
因为这里是实数比较
1e-6 为 0.000001
4.4 switch语句
switch 语句为多路分支选择语句。其一般形式如下:
switch (表达式 )
{ case 常量表达式 1,语句 1; break;
case 常量表达式 2,语句 2; break;
? ? ? ?
case 常量表达式 n,语句 n; break;
defaul t, 语句 n+1;
}
其中:
?,表达式” 可以是任何类型的表达式。
?,常量表达式” 的值必须互不相同。
? 各个 case 出现的先后顺序对执行结果没有影响。
? 执行完一个 case后面的语句后,通过 break语句结束该控制结构
? 若所有的,常量表达式” 的值都不与,表达式” 的值相匹配,就
执行 default 后面的语句。
? 多个 case可以共用一组执行语句。
? case后面若有多个语句,可以不用 { } 括起。
例 4.4 某商店按如下折扣优惠购货的顾客:
D =
折扣
0
5%
7.5%
10%
15%
购货金额
(m < 250)
(250 ? m < 500)
(500 ? m < 1000)
(1000 ? m < 2000)
( m ? 2000)
C = int(m) / 250
0
1
2,3
4,5,6,7
? 8
试编程,输入购货金额 m,求顾客应付金额 s。
课外练习:习题册中习题三全部
main( )
{ int c;
float d,m,s;
scanf(“%f”,&m);
if (m>=2000) c=8;
else c=m/250;
switch(c)
{ case 0,d=0; break;
case 1,d=0.05; break;
case 2:
case 3,d=0.075; break;
case 4:
case 5:
case 6:
case 7,d=0.1; break;
case 8,d=0.15;
}
s = m ? ( 1 – d );
printf(“Amount=%8.2f”,s);
}
4.5 循 环 控 制
1,概述
重复执行某个程序段称为 循环 。在 C中可用如下语
句实现循环:
1.用 goto 语句和 if 语句构成循环;
2.用 while 语句;
3.用 do ~ while 语句;
4.用 for 语句。
2,goto 语句
goto语句为无条件转向语句。其形式为:
goto 语句标号 ;
说明:
? goto 语句的作用是无条件地转去执行“语句标号”标
明开始的某一段程序。
语句标号后的,:”是必须的
?
?
100
1i
n
main( )
{int i,sum=0;
i=1;
loop,if (i<=100)
{sum=sum+i;
i++;
goto loop; }
printf(“%d”,sum);
}
?,语句标号, 为某一语句前的一个标识符 。 其定名规
则与变量名相同 。
例 4.5 用 if 语句和 goto语句构成循环求 。
? 在 C中, 除非不得已时才使用 goto语句 。
sum = 0i = 1
i <=100
非 0
sum = sum + ii = i + 1
0
3,while 语句
用 while语句可实现,当型,循环,语句形式为:
while (表达式 )
语句;
说明:
?,表达式, 的值为真 (非 0)时执行, 语句,, 然后
返回 while 处判断, 表达式, 是否为假 (0),若
为假, 则转去执行, 语句, 后面的语句, 否则,
继续执行, 语句, 。
?,语句” 可以是用 { } 括起的复合语句。
例 4.6 用 while语句求 。
main( )
{int i,sum;
i=1; sum=0;
while ( i<=100 )
{sum=sum+i;
i++;
}
printf(“%d”,sum);
}
sum = 0i = 1
i <=100
非 0
sum = sum + ii = i + 1
0
?
?
100
1i
n
4,do ~ while语句
用 do~while语句可实现,直到型,循环,语句形式为:
do
语句;
while (表达式 );
说明:
?执行, 语句, 后, 判断, 表达式, 是否为假 (0),若为假
则结束循环, 否则返回 do处继续执行, 语句, 。
?,语句”可以是用 { } 括起的复合语句。
? while 循环是先判断, 表达式,, 后执行, 语句, 。
因此 。 while 循环可能一次也不会执行 。
? do ~ while循环是先执行, 语句,, 后判断, 表达式, 。
因此, do ~ while 循环至少要执行 1 次 。
例 4.7 用 do ~ while语句求 。
main( )
{int i,sum=0;
i=1;
do
{ sum=sum+i;
i ++;
}
while ( i<=100 );
printf(“%d”,sum);
}
i <=100非 0
sum = sum + ii = i + 1
0
?
?
100
1i
n
sum = 0i = 1
5,for语句
for语句的一般形式:
for(表达式 1; 表达式 2; 表达式 3) 语句 ;
其中:“语句” 可以是用 { } 括起的复合语句。
for语句的执行过程如图所示,表达式 1
表达式 2
非 0
语句
表达式 3
0例 4.8 用 for 循环语句求 。
?
?
100
1i
n
main( )
{ int i,sum = 0 ;
for ( i=1; i<=100; i+ +)
sum = sum + i ;
printf(“%d”,sum);
}
请特别注意 for语句中三个表达式的执行顺序
?,表达式 1”可置于 for语句之前,但必须保留, ;”。 如:
i=1; for ( ; i<=100; i+ +) sum=sum+i;
?如果省略“表达式 2”或三个表达式均省略,则成为“死循环”。 如:
for (i=1; ; i++) sum = sum + i ;
for ( ; ; ) 语句;
?,表达式 3” 可置于“语句”中。 如:
for (sum=0,i=1; i<=100 ;) {sum=sum+i; i++; }
?如果只有“表达式 2”,则完全等同于 while 循环。 如:
for (sum=0,i=1; i<=100;)
{ sum=sum+i;
i++; }
while ( i<=100 )
{sum=sum+i;
i++; }
?,表达式 1”可以是设置循环变量初值的赋值表达式,也可以是与
循环变量无关的其它表达式。 如:
for (sum=0; i<=100; i++) sum=sum+i;
?,表达式 1”和“表达式 3”可以是简单表达式,也可以是逗号表达
式。 如:
for (i=0,j=100; i<=j; i++,j--) k=i+j;
?,表达式 2” 一般为关系表达式或逻辑表达式,但也可以是数值
表达式或字符表达式,只要其值为非 0,就执行,语句”。
6,break 语句和 continue 语句
1) break语句
break 语句用于从 while, do~while 和 for 循环中
跳出去而终止其循环。
例,for (i=1; i<=10; i++)
{ s=i?i;
if (s>30) break;
printf(“%f \n”,s);
}
注,break语句不能用于循环语句和 switch语句以外的
任何其它语句中。
2) continue语句
continue语句的作用是结束本次循环并开始下一次循环。
例 4.9 编程输出 100 ~ 200之间不能被 3整除的数。
main( )
{ int n;
for (n=100; n<=200; n++)
{ if (n%3==0) continue;
printf(“%d”,n);
}
}
3) break语句和 continue语句执行流程比较
表达式 1
非 0
语句 1
表达式 2
0
语句 2
0
break
表达式 1
非 0
语句 1
表达式 2
0
语句 2
0
continue
例 4.10 用,辗转相除法” 求正整数 m 和 n 的最大公约数。
“辗转相除法” 的步骤为:
? 若 m<n,则 m ? n ;
? m%n ? r ;
? 若 r=0,转 ?
? n ? m,r ? n,转 ?
? 输出 n 。
main( )
{ int r,m,n;
printf(“Enterm,n=”); scanf(“%d%d”,&m,&n);
printf(“m=%d,n=%d\n”,m,n);
if (m<n) { r=m; m=n; n=r ; }
r =m%n;
while ( r != 0 ) { m=n; n=r ; r =m%n; }
printf(“H.C.F=%d\n”,n);
}
例 4.11 求 100 ~ 200之间的所有素数。
#include,math.h”
main( )
{ int f,m,i,k,n=0;
for (m=101; m<=200; m=m+2)
{ if (n%10 == 0) printf(“\n”);
k = sqrt(m); f =1;
for (i=2; i <= k; i++)
if (m%i = = 0) { f = 0; break; }
if (f == 1)
{ printf(“%d”,m); n=n+1; }
}
}
去掉偶数,在
奇数里找素数
控制每一行
输出 10个数
能被其中某个数
整除就不是素数
是素数就输出,
且计数器加 1
理论证明,不能被 2
到该数本身的开方
数整除就是素数。
假设 m是素数,若
不是就置 f 为 0
例 4.12 求 sum =
??????? 29181811117744331
前 40项之值。
#include“stdio.h”
main( )
{ int n,flag;
long int f1,f2,t;
float sum = 0;
flag = –1; f1 = 1; f2 = 3;
for ( n=1; n<=40; n++)
{ flag = –flag;
sum += 1.0 ? flag ? f1/f2;
t = f1; f1 = f2; f2 = f1 + t;
}
printf(“sum=%f\n”,sum);
}
分子 分母
变换每一项的符号 (+,–)
以防 f1/f2=0,促使
表达式作浮点运算
下一项的分子
下一项的分母
例 4.13 编程求 1000以内的完数 (一个数等于因子之和为完数 )
#include,stdio.h”
main( )
{int m,n,sum;
for (m=2; m<1000; m++)
{sum=1;
for (n=2; n<m; n++)
if (m%n==0) sum+=n;
if (m==sum)
{ printf("%d=1",m);
for (n=2; n<m; n++)
if (m%n==0) printf("+%d",n);
printf("\n");
}
}
}
求 m的因子之和 sum
当 sum=m时,打
印出每一个因子。
课外练习:习题册中习题四全部
4.1 关系运算符和关系表达式
4.2 逻辑运算符和逻辑表达式
4.3 if 语句
4.4 switch 语句
4.5 循环控制
第 4章 流程控制语句
4.1 关系运算符和关系表达式
1,关系运算符及其优先顺序
C 有 6 种关系运算符:
<
< =
>
> =
优先级相同 (高 )
==
! = 优先级相同 (低 )
! (非 ) 高
算术运算符
关系运算符
&& 和 | |
赋值运算符 低
并排两个等于号,
一个时为赋值号。
2,关系表达式
关系表达式是用关系运算符将两个以上算术、关
系、逻辑、赋值或字符表达式连接起来的式子。
关系表达式的值是一个逻辑值,“真” (非 0) 或
“假” (0)。
例如:
c>a+b 等效于, c>(a+b)
a>b!=c (a>b)!=c
a==b<c a==(b<c)
a=b>c a=(b>c)
4.2 逻辑运算符和逻辑表达式
1,逻辑运算符及其优先顺序
? C的三种逻辑运算符
&& 逻辑与
|| 逻辑或
? 逻辑非
“&&” 和, ||” 为双目运算符,,!” 为单目运算符。
a && b 若 a,b均为真,则 a && b为真,否则为假。
a || b 若 a,b均为真,或之一为真,则 a||b为真,否则为假
!a 若 a为真,则 !a 为假,否则为真。
? 优先顺序
(a>b) && (x>y) ? a>b && x>y
(a= =b) || (x= =y) ? a= =b || x= =y
( ! a) || (a>b) ? ! a || a>b
(m=a>b) && (n=c>d) ? (m=(a>b) ) &&(n=(c>d) )
! (非 ) 高
算术运算符
关系运算符
&& 和 | |
赋值运算符 低
2,逻辑表达式
逻辑表达式是用逻辑运算符将关系表达式或逻辑
量连接起来的式子。逻辑表达式的值是一个逻辑量“真”
(非 0) 或,假” (0)。
3,逻辑表达式求解
a && b && c 若 a 为假,则表达式值为假。
a || b || c 若 a 为真,则表达式值为真。
5>3&&2||8<4-!0 若 (5>3&&2)为真,则表达式值为真。
在 Turbo C中,&& 和 || 的优先级相同。
4.3 if 语句
1,if 语句的一般形式
? if (表达式 ) 语句;
? if (表达式 ) 语句 1;
else 语句 2;
其中:
?,语句”和“语句 1”可以是用 { }括起来的复合语句。
?,语句 2”既可以是用 { } 括起来的复合语句,也可
以是 ?或 ? 形式的 if 语句。
?,语句 1”后面的,;,是必须的。
例 4.1 输入三个实数,按小到大顺序输出。
main( )
{ float a,b,c,t;
scanf(“%f,%f,%f”,&a,&b,&c);
if (a>b) { t=a; a=b; b=t; }
if (a>c) { t=a; a=c; c=t; }
if (b>c) { t=b; b=c; c=t; }
printf(“%5.2f,%5.2f,%5.2f”,a,b,c);
} 若 a>b,则通过中间变量 t 交换变量 a,b的值
2,if 语句的嵌套
在 if 语句中又包含一个或多个 if 语句称为 if 语
句的嵌套。
if ( )
if ( ) 语句 1;
else 语句 2;
else
if ( ) 语句 3;
else 语句 4;
注,从最内层开始,else总是与它前面最近的未曾
配对的 if 配对,除非用花括号改变其配对关系。
例 4.2 编程求 y =
main( )
{ int x,y;
scanf(“%d”,&x);
if (x<0) y = -1;
else if (x==0) y = 0;
else y = 1;
printf(“x=%d,y=%d\n”,x,y);
}
-1 ( x < 0 )
0 ( x = 0 )
1 ( x > 0 )
的值。
x 的值从键盘输入。
3,条件运算符
若有如下 if 语句:
if (a>b) max=a;
else max=b;
则可以用下面的条件运算符处理:
max = (a>b)? a, b;
同样, 对如下 if 语句:
if (a>b) printf(“%d”,a);
else printf(“%d”,b);
也可用下面的语句代替:
printf(“%d”,a>b? a, b);
?条件运算符,?,, 是一个三目运算符,必须有三个操
作对象。
?条件运算符的优先级高于赋值运算符,低于关系运算
符和算术运算符。 如:
a>b?a:b+1 /? 相当于 a>b? a, (b+1) ?/
?条件运算符的结合方向为, 自右至左,。
a>b?a:c>d?c:d /* 相当于 a>b?a:(c>d?c:d) */
如,max = (a>b)? a, b;
?仅在 if 语句 内嵌 的语句为赋值语句时,才能用条件
表达式取代该 if 语句。
?条件表达式中的操作对象可以是不同的类型,且其值
取较高的类型。 如:
x??a?:?b? 当 x = 0时,条件表达式的值为‘ b?
x>y?1:1.5 当 x≤y 时,条件表达式的值为 1.5,
否则为 1.0。
如:
例 4.3 求一元二次方程的解。
#include“math.h”
main( )
{float a,b,c,d,x1,x2,p,q;
scanf(“%f,%f,%f,,&a,&b,&c); printf(“该方程, );
if (fabs(a) <= 1e-6) printf(“不是一个 2次方程 。, );
else d=b?b-4?a?c;
if (fabs(d)==1e-6)printf(“有两个相等的实根, %8.4f \n”,-b/(2?a));
else
if (d>1e-6)
{ x1= (-b+sqrt(d))/(2?a);
x2= (-b-sqrt(d))/(2?a);
printf(“有两个不相等的实根,%8.4f and %8.4f \n”,x1,x2);
}
else
{p=-b/(2?a); q=sqrt(-d)/(2?a);
printf(“有复数根,\n”);
printf(“%8.4f +%8.4f i\n”,p,q); printf(“%8.4f -%8.4f i\n”,p,q);
}
}
此处不得写成:
fabs(a) <= 0
因为这里是实数比较
1e-6 为 0.000001
4.4 switch语句
switch 语句为多路分支选择语句。其一般形式如下:
switch (表达式 )
{ case 常量表达式 1,语句 1; break;
case 常量表达式 2,语句 2; break;
? ? ? ?
case 常量表达式 n,语句 n; break;
defaul t, 语句 n+1;
}
其中:
?,表达式” 可以是任何类型的表达式。
?,常量表达式” 的值必须互不相同。
? 各个 case 出现的先后顺序对执行结果没有影响。
? 执行完一个 case后面的语句后,通过 break语句结束该控制结构
? 若所有的,常量表达式” 的值都不与,表达式” 的值相匹配,就
执行 default 后面的语句。
? 多个 case可以共用一组执行语句。
? case后面若有多个语句,可以不用 { } 括起。
例 4.4 某商店按如下折扣优惠购货的顾客:
D =
折扣
0
5%
7.5%
10%
15%
购货金额
(m < 250)
(250 ? m < 500)
(500 ? m < 1000)
(1000 ? m < 2000)
( m ? 2000)
C = int(m) / 250
0
1
2,3
4,5,6,7
? 8
试编程,输入购货金额 m,求顾客应付金额 s。
课外练习:习题册中习题三全部
main( )
{ int c;
float d,m,s;
scanf(“%f”,&m);
if (m>=2000) c=8;
else c=m/250;
switch(c)
{ case 0,d=0; break;
case 1,d=0.05; break;
case 2:
case 3,d=0.075; break;
case 4:
case 5:
case 6:
case 7,d=0.1; break;
case 8,d=0.15;
}
s = m ? ( 1 – d );
printf(“Amount=%8.2f”,s);
}
4.5 循 环 控 制
1,概述
重复执行某个程序段称为 循环 。在 C中可用如下语
句实现循环:
1.用 goto 语句和 if 语句构成循环;
2.用 while 语句;
3.用 do ~ while 语句;
4.用 for 语句。
2,goto 语句
goto语句为无条件转向语句。其形式为:
goto 语句标号 ;
说明:
? goto 语句的作用是无条件地转去执行“语句标号”标
明开始的某一段程序。
语句标号后的,:”是必须的
?
?
100
1i
n
main( )
{int i,sum=0;
i=1;
loop,if (i<=100)
{sum=sum+i;
i++;
goto loop; }
printf(“%d”,sum);
}
?,语句标号, 为某一语句前的一个标识符 。 其定名规
则与变量名相同 。
例 4.5 用 if 语句和 goto语句构成循环求 。
? 在 C中, 除非不得已时才使用 goto语句 。
sum = 0i = 1
i <=100
非 0
sum = sum + ii = i + 1
0
3,while 语句
用 while语句可实现,当型,循环,语句形式为:
while (表达式 )
语句;
说明:
?,表达式, 的值为真 (非 0)时执行, 语句,, 然后
返回 while 处判断, 表达式, 是否为假 (0),若
为假, 则转去执行, 语句, 后面的语句, 否则,
继续执行, 语句, 。
?,语句” 可以是用 { } 括起的复合语句。
例 4.6 用 while语句求 。
main( )
{int i,sum;
i=1; sum=0;
while ( i<=100 )
{sum=sum+i;
i++;
}
printf(“%d”,sum);
}
sum = 0i = 1
i <=100
非 0
sum = sum + ii = i + 1
0
?
?
100
1i
n
4,do ~ while语句
用 do~while语句可实现,直到型,循环,语句形式为:
do
语句;
while (表达式 );
说明:
?执行, 语句, 后, 判断, 表达式, 是否为假 (0),若为假
则结束循环, 否则返回 do处继续执行, 语句, 。
?,语句”可以是用 { } 括起的复合语句。
? while 循环是先判断, 表达式,, 后执行, 语句, 。
因此 。 while 循环可能一次也不会执行 。
? do ~ while循环是先执行, 语句,, 后判断, 表达式, 。
因此, do ~ while 循环至少要执行 1 次 。
例 4.7 用 do ~ while语句求 。
main( )
{int i,sum=0;
i=1;
do
{ sum=sum+i;
i ++;
}
while ( i<=100 );
printf(“%d”,sum);
}
i <=100非 0
sum = sum + ii = i + 1
0
?
?
100
1i
n
sum = 0i = 1
5,for语句
for语句的一般形式:
for(表达式 1; 表达式 2; 表达式 3) 语句 ;
其中:“语句” 可以是用 { } 括起的复合语句。
for语句的执行过程如图所示,表达式 1
表达式 2
非 0
语句
表达式 3
0例 4.8 用 for 循环语句求 。
?
?
100
1i
n
main( )
{ int i,sum = 0 ;
for ( i=1; i<=100; i+ +)
sum = sum + i ;
printf(“%d”,sum);
}
请特别注意 for语句中三个表达式的执行顺序
?,表达式 1”可置于 for语句之前,但必须保留, ;”。 如:
i=1; for ( ; i<=100; i+ +) sum=sum+i;
?如果省略“表达式 2”或三个表达式均省略,则成为“死循环”。 如:
for (i=1; ; i++) sum = sum + i ;
for ( ; ; ) 语句;
?,表达式 3” 可置于“语句”中。 如:
for (sum=0,i=1; i<=100 ;) {sum=sum+i; i++; }
?如果只有“表达式 2”,则完全等同于 while 循环。 如:
for (sum=0,i=1; i<=100;)
{ sum=sum+i;
i++; }
while ( i<=100 )
{sum=sum+i;
i++; }
?,表达式 1”可以是设置循环变量初值的赋值表达式,也可以是与
循环变量无关的其它表达式。 如:
for (sum=0; i<=100; i++) sum=sum+i;
?,表达式 1”和“表达式 3”可以是简单表达式,也可以是逗号表达
式。 如:
for (i=0,j=100; i<=j; i++,j--) k=i+j;
?,表达式 2” 一般为关系表达式或逻辑表达式,但也可以是数值
表达式或字符表达式,只要其值为非 0,就执行,语句”。
6,break 语句和 continue 语句
1) break语句
break 语句用于从 while, do~while 和 for 循环中
跳出去而终止其循环。
例,for (i=1; i<=10; i++)
{ s=i?i;
if (s>30) break;
printf(“%f \n”,s);
}
注,break语句不能用于循环语句和 switch语句以外的
任何其它语句中。
2) continue语句
continue语句的作用是结束本次循环并开始下一次循环。
例 4.9 编程输出 100 ~ 200之间不能被 3整除的数。
main( )
{ int n;
for (n=100; n<=200; n++)
{ if (n%3==0) continue;
printf(“%d”,n);
}
}
3) break语句和 continue语句执行流程比较
表达式 1
非 0
语句 1
表达式 2
0
语句 2
0
break
表达式 1
非 0
语句 1
表达式 2
0
语句 2
0
continue
例 4.10 用,辗转相除法” 求正整数 m 和 n 的最大公约数。
“辗转相除法” 的步骤为:
? 若 m<n,则 m ? n ;
? m%n ? r ;
? 若 r=0,转 ?
? n ? m,r ? n,转 ?
? 输出 n 。
main( )
{ int r,m,n;
printf(“Enterm,n=”); scanf(“%d%d”,&m,&n);
printf(“m=%d,n=%d\n”,m,n);
if (m<n) { r=m; m=n; n=r ; }
r =m%n;
while ( r != 0 ) { m=n; n=r ; r =m%n; }
printf(“H.C.F=%d\n”,n);
}
例 4.11 求 100 ~ 200之间的所有素数。
#include,math.h”
main( )
{ int f,m,i,k,n=0;
for (m=101; m<=200; m=m+2)
{ if (n%10 == 0) printf(“\n”);
k = sqrt(m); f =1;
for (i=2; i <= k; i++)
if (m%i = = 0) { f = 0; break; }
if (f == 1)
{ printf(“%d”,m); n=n+1; }
}
}
去掉偶数,在
奇数里找素数
控制每一行
输出 10个数
能被其中某个数
整除就不是素数
是素数就输出,
且计数器加 1
理论证明,不能被 2
到该数本身的开方
数整除就是素数。
假设 m是素数,若
不是就置 f 为 0
例 4.12 求 sum =
??????? 29181811117744331
前 40项之值。
#include“stdio.h”
main( )
{ int n,flag;
long int f1,f2,t;
float sum = 0;
flag = –1; f1 = 1; f2 = 3;
for ( n=1; n<=40; n++)
{ flag = –flag;
sum += 1.0 ? flag ? f1/f2;
t = f1; f1 = f2; f2 = f1 + t;
}
printf(“sum=%f\n”,sum);
}
分子 分母
变换每一项的符号 (+,–)
以防 f1/f2=0,促使
表达式作浮点运算
下一项的分子
下一项的分母
例 4.13 编程求 1000以内的完数 (一个数等于因子之和为完数 )
#include,stdio.h”
main( )
{int m,n,sum;
for (m=2; m<1000; m++)
{sum=1;
for (n=2; n<m; n++)
if (m%n==0) sum+=n;
if (m==sum)
{ printf("%d=1",m);
for (n=2; n<m; n++)
if (m%n==0) printf("+%d",n);
printf("\n");
}
}
}
求 m的因子之和 sum
当 sum=m时,打
印出每一个因子。
课外练习:习题册中习题四全部