1
一,while 语句二,do~while 语句三,for 语句
2
一,while 语句循环结构控制用于迭代计算,循环语句使得迭代计算反复执行同一个程序段,该程序段称为循环体,循环体中的语句根据迭代条件执行 0次或多次,除非迭代结束或遇到 break,return以及 goto
语句而中断循环过程。
控制循环的表达式是关系表达式或逻辑表达式或是整数、浮点或指针类型数据,它们最终可转换为 bool型( 0或 1)数据。
3
语法格式和程序流程如图所示:
while(表达式 )
单条语句;
后续语句;
while(e)
{ 循环体语句 ;}
不受 while(e)
影响的语句 ; 后续语句循环体体
while
零非零表达式
4
C/C++中的 while语句的执行过程为:
首先计算表达式的值,若表达式的结果是零则不执行循环体中的语句,此时跳过循环执行后续语句,因此循环体可以一次也不遍历;如果表达式的结果为非零值则执行循环体语句。
然后再次计算表达式的值,重复迭代过程,表达式的值为零就退出循环。 while语句的特点是先判断,再执行。在进入下一次循环体之前表达式完成新的求值和副作用。
循环体通常是花括号包含的复合语句,只有一条语句时花括号可以省去不写。 如,
while (n <= 100) sum+=n++;
5
while语句其特点 先判断,再执行
[例 ] 求小于 n的奇数的和 (n选定为 6)
#include<stdio.h>
void main (void)
{ const int n=6;
int sum=0;
int Odd=1; //循环的初值
while (Odd <=n)
{ if (Odd % 2==1) sum+ = Odd;
6
Odd++; }
//循环的增量条件不应受 if 表达式的影响
printf ( "Odd sum =%d from 0 to %d,Odd
=%d\n",sum,n,Odd);
}
//输出,Odd sum =9 from 0 to 6,Odd =7
上面的 while如果改为 if则输出:
Odd sum =1 from 0 to 6,Odd =2
7
上面的 while如果改为 if则输出:
Odd sum =1 from 0 to 6,Odd =2
不妨认为 while循环语句是多个 if条件语句循环的浓缩形式,对于下面的两个格式,
while (e) 语句 ; if (e) 语句 ;
表达式 e为 0,两者是等价的。表达式 e非 0时 if管辖的语句执行一次,而表达式 e非 0时 while循环控制的语句执行多少次,需要根据表达式 e的值、循环控制变量的初始值和循环体一起匹配确定。
因此在循环体中必须存在条件导致循环的中断,本题通过 Odd++循环控制变量自增改变 Odd < 6为真的条件判断从而达到不再进入循环体的目的。
8
关于 n个形如 sum=e1+e2+e3+...+en 有规律表达式的和的迭代计算。一般先具体写出前三到四个合适于 C语言的形式,然后总结出一定的迭代关系,例如:
n=1 sum1=e1=0+e1
n=2 sum2=e1+e2=sum1+e2
n=3 sum3==e1+e2+e3= sum2+e3
这样对于任意 n则得到,写成 C形式为 sum=sum+en,
进一步处理为高效的形式即得到循环体的核心语句,
sum+=en; (对于 n个数连乘则相应地 sum*=en;)
这个语句要求 sum的初始值与求和的范围。范围的下界本题通过 k=0确定,上界则由 while中的表达式 k<=100给出。
9
如求不大于 n的偶数和或奇数和,进一步在核心语句前加上相应的 if(e)开关控制,对于累积求和公式构成一道过滤或屏蔽 如:
if (Odd % 2==1) sum+ =Odd;
循环迭代控制语法是简单的,但数学的迭代问题转换为
C语言实现时,需要总结迭代的基本规律,总结规律的过程就是从具体到抽象的过程,也就是从 1,2,3到 n的推演过程。
10
二,do~while 语句语法格式和程序流程如图所示,
do 单条语句 ;
while(表达式 );
后续语句;
do
{
循环体语句;
} while(表达式 );
后续语句;
循环体后续语句
do
非零零
while
表达式
11
C/C++中的 do~while语句的执行过程为:
先无条件地执行一次循环体中的语句;再计算表达式的值,若表达式的结果是零则不执行循环体中的语句,此时跳过循环执行后续语句,如果表达式的结果为非零值则执行循环体语句。
然后再次计算表达式的值,重复迭代过程,表达式的值为零就退出循环。
do~while语句的特点是先执行,再判断。
12
[例 ] 求不大于 n的偶数的和 (n选定为 6)
#include<stdio.h>
void main (void)
{ const int n=6; int sum=0;
int Even = 0; //循环的初值
do { if ( Even %2 ==0) sum + = Even;
Even++;
} while (Even <=6) ;
printf ("Even sum =%d from 0 to%d,Even+1
= %d\n",sum,n,Even);
}
//输出,Even sum =12 from 0 to 6,Even+1=7
13
[例 ] do~while循环与 while循环的比较
#include<stdio.h> #include<stdio.h>
int d(int k) int w(int k)
{ int sum=0; { int sum=0;
do sum+=k++; while (k<101) sum+=k++;
while (k<101); return sum; }
return sum; } void main (void)
void main (void) {
{ printf ("%d,%d",w(1),w(101));
printf ("%d,%d",d(1),d(101));
} /*输出,5050,101*/ } //输出,5050;0
14
[例 ] 弦截法求方程 y=f(x)=((x-5)*x+16)*x-80=0的根
# include<stdio.h>
# include<math.h>
float f (float x)
{ return ((x-5)*x+16)*x-80;}
float root (float a,float b)
{ if ( f (a)*f (b)>0) return -8888888.0;
float x;
do{
x= (a*f (b) - b*f (a))/(f (b)- f (a));
if (f (a)*f (x)>0) a=x ;
else b=x; }
f (a) f (x)
f (b)
a x b
f (a)
f (b)
a
x b
f (x)
15
while ( fabs (f (x))>0.00001 );return x;
}
void main (void)
{ printf ("%f\n ",root (2,6));
printf ("%f",root (2,4)); }
上面程序的思路为:
端点函数值 f(a)*f(b)>0认为区间 [a,b]无根,程序返回
-8888888。有根则求端点弦线在 x轴上的截点
x= (a*f (b) - b*f (a))/( f (b) - f (a))。如果 f (x)和 f (a)同号,则根在区间 [x,b],此时设置 a=x。
如果 f(x)和 f(a)异号,则根在区间 [a,x],此时设置 b=x。
反复缩小求根的区间直到小于给定的收敛指标。
16
三,for 语句,语法格式和程序流程如图所示
for(表达式 1;表达式 2;
表达式 3)
单条语句;
后续语句;
for(初始化表达式 ;条件表达式 ;增量表达式 )
{
循环体语句;
}
后续语句; 后续语句零非零表达式 2
表达式 1
循环体表达式 3
for
17
C/C++中的 for语句的执行过程为:
1,首先仅仅执行一次表达式 1提供的操作运算,表达式 1
常称为初始化表达式。
2,再计算表达式 2的值,若表达式 2的结果是零则不执行循环体中的语句,此时跳过循环体执行后续语句,因此循环体中的语句可以一次也不执行;表达式 2也称为条件表达式,通常求值的结果为整型数据或 bool型的逻辑值。
3,如果表达式 2的结果为非零值则执行循环体语句。然后计算表达式 3的值,表达式 3常用于循环增量索引,至此完成一次循环。然后再从表达式 2的判断结果开始下一轮重复迭代过程,表达式 2的值为零便退出循环。用 s表示循环体中的语句。
18
for循环的第一个表达式中可以引进变量,其间引入的变量为局部变量,相当于这些变量紧临在 for语句前刚定义。
即,for (int k=0;e2;e3) {s;}
相当于 int k ; for (k=0; e2; e3) { s; }。
for语句中的表达式 1、表达式 2和表达式 3在语法上都是为可选项,可以三缺一,也可以省略其中的两项或全部。
但分号不能省略,编译器在 for语句的扫描中搜寻两个分号。
for语句的三个表达式分别用于初始化、终止条件测试和增量的变动。
for ( e1; e2; e3 ) { s;} 相当于 e1; while (e2) { s; e3; }
19
[例 ] 求小于 n的奇数的和 (n选定为 6)
#include<stdio.h>
void main (void)
{ const int n=6 ;
int sum=0;
for (int i=1; i <n; i++)
if (i % 2==1) sum+=i;
printf ("sum =%d \ n",sum);
}
/*输出,sum =9*/
20
[例 ] 求上限为 n的偶数的和的函数
int f (int n)
{
int sum=0;
for ( int i=1; i <=n; i++)
if (i % 2==0) sum+=i;
return sum;
}
21
[例 ] 用公式求 的近似值
#include<stdio.h>
void main (void)
{ int sign=1 ; double pi=1;
for (double n=1; n<1000000; n+=2,pi+=sign/n)
sign= - sign;
printf ("pi =%f\n",pi*4); /*输出,pi =3.141595*/
}
此例中第三个表达式 n+=2,pi+=sign/n是逗号运算符表达式,常用于 for语句的循环中。
在 n+=2,pi+=sign/n中 n+=2首先求值,然后计算表达式
pi+=sign/n。例中的 for循环等价于:
for (double n=1; n<1000000; )
{ sign=-sign; n+=2; pi+= sign/n; }
4 1
1
3
1
5
1
7
22
一,while 语句二,do~while 语句三,for 语句
2
一,while 语句循环结构控制用于迭代计算,循环语句使得迭代计算反复执行同一个程序段,该程序段称为循环体,循环体中的语句根据迭代条件执行 0次或多次,除非迭代结束或遇到 break,return以及 goto
语句而中断循环过程。
控制循环的表达式是关系表达式或逻辑表达式或是整数、浮点或指针类型数据,它们最终可转换为 bool型( 0或 1)数据。
3
语法格式和程序流程如图所示:
while(表达式 )
单条语句;
后续语句;
while(e)
{ 循环体语句 ;}
不受 while(e)
影响的语句 ; 后续语句循环体体
while
零非零表达式
4
C/C++中的 while语句的执行过程为:
首先计算表达式的值,若表达式的结果是零则不执行循环体中的语句,此时跳过循环执行后续语句,因此循环体可以一次也不遍历;如果表达式的结果为非零值则执行循环体语句。
然后再次计算表达式的值,重复迭代过程,表达式的值为零就退出循环。 while语句的特点是先判断,再执行。在进入下一次循环体之前表达式完成新的求值和副作用。
循环体通常是花括号包含的复合语句,只有一条语句时花括号可以省去不写。 如,
while (n <= 100) sum+=n++;
5
while语句其特点 先判断,再执行
[例 ] 求小于 n的奇数的和 (n选定为 6)
#include<stdio.h>
void main (void)
{ const int n=6;
int sum=0;
int Odd=1; //循环的初值
while (Odd <=n)
{ if (Odd % 2==1) sum+ = Odd;
6
Odd++; }
//循环的增量条件不应受 if 表达式的影响
printf ( "Odd sum =%d from 0 to %d,Odd
=%d\n",sum,n,Odd);
}
//输出,Odd sum =9 from 0 to 6,Odd =7
上面的 while如果改为 if则输出:
Odd sum =1 from 0 to 6,Odd =2
7
上面的 while如果改为 if则输出:
Odd sum =1 from 0 to 6,Odd =2
不妨认为 while循环语句是多个 if条件语句循环的浓缩形式,对于下面的两个格式,
while (e) 语句 ; if (e) 语句 ;
表达式 e为 0,两者是等价的。表达式 e非 0时 if管辖的语句执行一次,而表达式 e非 0时 while循环控制的语句执行多少次,需要根据表达式 e的值、循环控制变量的初始值和循环体一起匹配确定。
因此在循环体中必须存在条件导致循环的中断,本题通过 Odd++循环控制变量自增改变 Odd < 6为真的条件判断从而达到不再进入循环体的目的。
8
关于 n个形如 sum=e1+e2+e3+...+en 有规律表达式的和的迭代计算。一般先具体写出前三到四个合适于 C语言的形式,然后总结出一定的迭代关系,例如:
n=1 sum1=e1=0+e1
n=2 sum2=e1+e2=sum1+e2
n=3 sum3==e1+e2+e3= sum2+e3
这样对于任意 n则得到,写成 C形式为 sum=sum+en,
进一步处理为高效的形式即得到循环体的核心语句,
sum+=en; (对于 n个数连乘则相应地 sum*=en;)
这个语句要求 sum的初始值与求和的范围。范围的下界本题通过 k=0确定,上界则由 while中的表达式 k<=100给出。
9
如求不大于 n的偶数和或奇数和,进一步在核心语句前加上相应的 if(e)开关控制,对于累积求和公式构成一道过滤或屏蔽 如:
if (Odd % 2==1) sum+ =Odd;
循环迭代控制语法是简单的,但数学的迭代问题转换为
C语言实现时,需要总结迭代的基本规律,总结规律的过程就是从具体到抽象的过程,也就是从 1,2,3到 n的推演过程。
10
二,do~while 语句语法格式和程序流程如图所示,
do 单条语句 ;
while(表达式 );
后续语句;
do
{
循环体语句;
} while(表达式 );
后续语句;
循环体后续语句
do
非零零
while
表达式
11
C/C++中的 do~while语句的执行过程为:
先无条件地执行一次循环体中的语句;再计算表达式的值,若表达式的结果是零则不执行循环体中的语句,此时跳过循环执行后续语句,如果表达式的结果为非零值则执行循环体语句。
然后再次计算表达式的值,重复迭代过程,表达式的值为零就退出循环。
do~while语句的特点是先执行,再判断。
12
[例 ] 求不大于 n的偶数的和 (n选定为 6)
#include<stdio.h>
void main (void)
{ const int n=6; int sum=0;
int Even = 0; //循环的初值
do { if ( Even %2 ==0) sum + = Even;
Even++;
} while (Even <=6) ;
printf ("Even sum =%d from 0 to%d,Even+1
= %d\n",sum,n,Even);
}
//输出,Even sum =12 from 0 to 6,Even+1=7
13
[例 ] do~while循环与 while循环的比较
#include<stdio.h> #include<stdio.h>
int d(int k) int w(int k)
{ int sum=0; { int sum=0;
do sum+=k++; while (k<101) sum+=k++;
while (k<101); return sum; }
return sum; } void main (void)
void main (void) {
{ printf ("%d,%d",w(1),w(101));
printf ("%d,%d",d(1),d(101));
} /*输出,5050,101*/ } //输出,5050;0
14
[例 ] 弦截法求方程 y=f(x)=((x-5)*x+16)*x-80=0的根
# include<stdio.h>
# include<math.h>
float f (float x)
{ return ((x-5)*x+16)*x-80;}
float root (float a,float b)
{ if ( f (a)*f (b)>0) return -8888888.0;
float x;
do{
x= (a*f (b) - b*f (a))/(f (b)- f (a));
if (f (a)*f (x)>0) a=x ;
else b=x; }
f (a) f (x)
f (b)
a x b
f (a)
f (b)
a
x b
f (x)
15
while ( fabs (f (x))>0.00001 );return x;
}
void main (void)
{ printf ("%f\n ",root (2,6));
printf ("%f",root (2,4)); }
上面程序的思路为:
端点函数值 f(a)*f(b)>0认为区间 [a,b]无根,程序返回
-8888888。有根则求端点弦线在 x轴上的截点
x= (a*f (b) - b*f (a))/( f (b) - f (a))。如果 f (x)和 f (a)同号,则根在区间 [x,b],此时设置 a=x。
如果 f(x)和 f(a)异号,则根在区间 [a,x],此时设置 b=x。
反复缩小求根的区间直到小于给定的收敛指标。
16
三,for 语句,语法格式和程序流程如图所示
for(表达式 1;表达式 2;
表达式 3)
单条语句;
后续语句;
for(初始化表达式 ;条件表达式 ;增量表达式 )
{
循环体语句;
}
后续语句; 后续语句零非零表达式 2
表达式 1
循环体表达式 3
for
17
C/C++中的 for语句的执行过程为:
1,首先仅仅执行一次表达式 1提供的操作运算,表达式 1
常称为初始化表达式。
2,再计算表达式 2的值,若表达式 2的结果是零则不执行循环体中的语句,此时跳过循环体执行后续语句,因此循环体中的语句可以一次也不执行;表达式 2也称为条件表达式,通常求值的结果为整型数据或 bool型的逻辑值。
3,如果表达式 2的结果为非零值则执行循环体语句。然后计算表达式 3的值,表达式 3常用于循环增量索引,至此完成一次循环。然后再从表达式 2的判断结果开始下一轮重复迭代过程,表达式 2的值为零便退出循环。用 s表示循环体中的语句。
18
for循环的第一个表达式中可以引进变量,其间引入的变量为局部变量,相当于这些变量紧临在 for语句前刚定义。
即,for (int k=0;e2;e3) {s;}
相当于 int k ; for (k=0; e2; e3) { s; }。
for语句中的表达式 1、表达式 2和表达式 3在语法上都是为可选项,可以三缺一,也可以省略其中的两项或全部。
但分号不能省略,编译器在 for语句的扫描中搜寻两个分号。
for语句的三个表达式分别用于初始化、终止条件测试和增量的变动。
for ( e1; e2; e3 ) { s;} 相当于 e1; while (e2) { s; e3; }
19
[例 ] 求小于 n的奇数的和 (n选定为 6)
#include<stdio.h>
void main (void)
{ const int n=6 ;
int sum=0;
for (int i=1; i <n; i++)
if (i % 2==1) sum+=i;
printf ("sum =%d \ n",sum);
}
/*输出,sum =9*/
20
[例 ] 求上限为 n的偶数的和的函数
int f (int n)
{
int sum=0;
for ( int i=1; i <=n; i++)
if (i % 2==0) sum+=i;
return sum;
}
21
[例 ] 用公式求 的近似值
#include<stdio.h>
void main (void)
{ int sign=1 ; double pi=1;
for (double n=1; n<1000000; n+=2,pi+=sign/n)
sign= - sign;
printf ("pi =%f\n",pi*4); /*输出,pi =3.141595*/
}
此例中第三个表达式 n+=2,pi+=sign/n是逗号运算符表达式,常用于 for语句的循环中。
在 n+=2,pi+=sign/n中 n+=2首先求值,然后计算表达式
pi+=sign/n。例中的 for循环等价于:
for (double n=1; n<1000000; )
{ sign=-sign; n+=2; pi+= sign/n; }
4 1
1
3
1
5
1
7
22