高级程序设计语言吴 凡
TEL,83202682
E-mail,cdwf@tom.com
电子科技大学通信与信息工程学院第六章 循环控制电子科技大学通信与信息工程学院概述
循环结构:在给定条件成立时,反复执行某程序段,直到条件不成立为止。
给定的条件称为 循环条件,反复执行的程序段称为 循环体 。
实现循环的四种语句
用 goto语句和 if语句构成循环;(不提倡)
用 while语句;( while型循环,先判断,再执行)
用 do-while语句;(先执行,再判断)
用 for语句;(多功能)
电子科技大学通信与信息工程学院
goto语句以及用 goto语句构成循环
goto语句功能:无条件地转向语句标号所在的语句行出开始执行
格式为,goto 语句标号;
语句标号:属于标识符,命名规则与变量相同
不提倡使用,会破坏结构化,
例,例:求 1+2+3…+100 的和
for (,.,)
for (,.,) {
..,
if (disaster)
goto error;
}
..,
error,printf(,ERROR\n”) ;
#include "stdio.h"
main()
{
int sum = 0,i = 1;
loop,if (i<=100){
sum = sum + i;
i++;
goto loop;
}
printf("sum = %d\n",sum);
}
电子科技大学通信与信息工程学院
while 语句
格式,while (表达式 )
语句 ;
例:求 1+2+3…+100
的和语句当 (表达式 )为真语句表达式 0(假 )
非 0(真 )
#include "stdio.h"
main()
{
int sum = 0,i = 1;
while (i <= 100){
sum = sum + i;
i++;
}
printf("sum = %d\n",sum);
}
循环体循环变量电子科技大学通信与信息工程学院
while 语句
例,∑n 例,n!
#include "stdio.h"
main()
{
int sum,i;
int n;
printf("Input n:\t");
scanf("%d",&n);
sum = 0;
i = 1;
while (i <= n){
sum += i;
i++;
}
printf("sum = %d\n",sum);
}
#include "stdio.h"
main()
{
int fac,i;
int n;
printf("Input n:\t");
scanf("%d",&n);
fac = 1;
i = 1;
while (i <= n){
sum *= i;
i++;
}
printf("factorial=%d\n",fac);
}
电子科技大学通信与信息工程学院
while语句
例:统计从键盘输入一行字符的个数
#include "stdio.h"
main()
{
int num = 0;
printf("input a string:\t");
while (getchar()!=‘\n’)
num++;
printf("character number = %d\n",num);
}
电子科技大学通信与信息工程学院
while语句注意事项
循环前,应先给循环变量赋初值
循环体中,一般应该有修改循环变量值的语句,
使循环趋向结束(即使表达式的值变为假)
循环体如包括有一个以上的语句,则必须用复合语句(即用 { }括起来)
循环体可以为空
例,while ((c = getchar( )) != 'Q' );
等价,c = getchar( );
while (c != 'Q')
c = getchar();
电子科技大学通信与信息工程学院
do-while语句
格式,do
语句;
while (表达式 );
特点:先执行,再判断
区别,while语句:先判断,
再执行语句直到(表达式)为假表达式 非 0(真 )
0(假 )
语句电子科技大学通信与信息工程学院区别,do while & while
while do while
#include "stdio.h"
main()
{
int sum=0,n;
scanf("%d",&n);
while(n <= 10){
sum += n;
n++;
}
printf("sum=%d\n",sum);
}
#include "stdio.h"
main()
{
int sum=0,n;
scanf("%d",&n);
do{
sum += n;
n++;
} while( n <= 10);
printf("sum=%d\n",sum);
}
电子科技大学通信与信息工程学院
do while 语句
例:求 2+ 4+,..+ n( n为偶数)
#include "stdio.h"
main()
{
int sum,i;
int n;
do{
printf("Input n(even):\t");
scanf("%d",&n);
} while (n%2);
sum = 0;
i = 2;
while (i <= n){
sum += i;
i += 2;
}
printf("sum = %d\n",sum);
}
电子科技大学通信与信息工程学院
for语句
格式:
for(表达式 1;表达式 2;表达式 3)
语句;
注意:
表达式 1只执行一次,且在进入循环体之前执行,表达式 1的功能一般为循环变量置初值;
表达式 3实际上循环体的一部分非 0(真 )
0(假 )
语句求解表达式 1
表达式 2
求解表达式 3
循环体外下一条语句电子科技大学通信与信息工程学院
for语句
例:求 1+2+3…+100 的和
for语句 while语句
#include "stdio.h"
main()
{
int sum = 0,i = 1;
while (i <= 100){
sum = sum + i;
i++;
}
printf("sum = %d\n",sum);
}
#include "stdio.h"
main()
{
int sum = 0,i;
for(i = 0; i <= 100; i++)
sum += i;
printf("sum = %d\n",sum);
}
电子科技大学通信与信息工程学院
{
循环体
}
for语句
表达式 1省略时,应该在 for循环前为循环变量赋初值
表达式 2省略时;不判断循环条件,将成为“死循环”,可以在循环体内使用 break语句退出循环
表达式 3省略时,循环体内应该有修改循环变量的语句
for( ; ; )表达式 1循环变量赋初值 表达式 2循环条件 表达式 3循环变量增值电子科技大学通信与信息工程学院
for语句

同时省略表达式 1和表达式 3,只有表达式 2,
则相当于 while语句
i = 0;
for(; i <= 100; i++)
sum += i;
i = 0;
for(; i<=100;){
sum += i;
i++;
}
i = 0;
while(i <= 100){
sum += i;
i++;
}
电子科技大学通信与信息工程学院
for语句
表达式 2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。
例,for(; (c = getchar()) != 'Q';)
printf(“%c”,c);
例,for(i = 1; i - 4; i++)
sum += i;
达式 1和表达式 3可以是一个简单表达式也可以是逗号表达式。
例,for(sum = 0,i=1; I <= 100 ; i++)
sum += i;
电子科技大学通信与信息工程学院外循环内循环循环的嵌套
循环体内包含另一个 完整 的循环,称为循环嵌套。
内嵌循环体中还可以嵌套循环
三种循环结构可以相互嵌套
例 while ( ){
......
for (...;,..;,..){
....
}
...
}
电子科技大学通信与信息工程学院循环的嵌套
各重循环有各自的循环变量
内循环变化快,外循环变化慢
例:
for (i=1; i<10; i++){
for (j=1; j<=i; j++)
printf("% d*%d = %d",j,i,j*i);
printf("\n");
}
电子科技大学通信与信息工程学院循环的嵌套
打印下图
1234567890123
#include "stdio.h"
main()
{
int i,j,k;
for (i=0; i<4; i++){
for (j=0; j<6-2*i; j++)
printf(" ");
for (k=1; k<=2*i+1; k++)
printf("* ");
printf("\n");
}
}
*
* * *
* * * * *
* * * * * * *
电子科技大学通信与信息工程学院几种循环的比较
不提倡用 goto语句构成循环
循环控制的比较循环变量初始化
while(表达式 ){
语句;
...
}
循环变量初始化
do{
语句;
...
} while (表达式 )
for(表达式 1;表达式 2;表达式 3){
语句;
...
}
循环变量初始化循环控制条件修改循环变量电子科技大学通信与信息工程学院
break和 continue语句
break语句
用在循环语句和开关语句中
在 switch中,break使程序跳出 switch而执行 switch
以后的语句。
在循环结构中,break使程序终止循环而执行循环后面的语句,通常 break语句总是与 if语句联在一起,
即满足条件时便跳出循环。
在多层循环中,一个 break语句只向外跳一层。
电子科技大学通信与信息工程学院
continue 语句
continue语句作用:结束本次循环(跳过循环本中剩余的语句),而强行执行下一次循环。
continue语句只用在 for,while,do-while等循环体中,常与 if条件语句一起使用,用来 加速循环 。
电子科技大学通信与信息工程学院程序举例
例 1:输入正整数 m,n,求 m和 n的最大公约数
举例的目的:体会循环结构的特点 ——重复执行相同的操作。
求最大公约数:辗转相除法
例:求 18和 31
的最小公约数次数 被除数 除数 余数
1 18 30 18
2 30 18 12
3 18 12 6
4 12 6 0
电子科技大学通信与信息工程学院例 1 输入 m,n
r = m % n
r != 0
m = n;
n = r;
r = m % n;
输出 n
#include "stdio.h"
main()
{
int m,n;
int r;
printf("Input m & n:\t");
scanf("%d%d",&m,&n);
printf("(%d,%d) = ",m,n );
r = m % n;
while (r != 0){
m = n;
n = r;
r = m % n;
}
printf("%d\n",n);
}
初始化循环变量循环体
for (r=m%n; r!=0; r=m%n){
m = n;
n = r;
}
电子科技大学通信与信息工程学院例 2 判断一个整数是否是素数
#include "stdio.h"
#include "math.h"
main()
{
int m,i,tmp;
printf("input n:\t");
scanf("%d",&m);
tmp = sqrt(m);
for (i=2; i<=tmp; i++)
if (m%i == 0)
break;
if (i > tmp && m!=1)
printf("%d is a prime number\n",m);
else
printf("%d is not a prime number\n",m);
}
输入 m
i = 2
i <= m1/2
m%i == 0
Y N
i > m1/2
Y N
退出循环 i++
打印“素数” 打印“非素数”
电子科技大学通信与信息工程学院例 3求 100至 200间的全部素数,并要求输出时一行 10个数( P118,例 6.9)
分析:
从 100到 200,循环检查 ——在上例中增加外循环
输出时一行 10个数 —
—对输出计数,每 10
个数,打印换行
#include "stdio.h"
#include "math.h"
main()
{
int n,i,j,tmp;
n = 0;
for (i=100; i <= 200; i++){
tmp = sqrt(i);
for (j=2; j<=tmp; j++)
if (i%j == 0)
break;
if (j > tmp){
printf("%6d",i);
n++;
}
if (n%10 == 0)
printf("\n");
}
}