循环控制
本章学习内容:
①goto语句以及用goto语句构成循环
②while语句
③do-while语句
④for语句
⑤循环的嵌套
⑥几种循环的比较
⑦break语句和continue语句
5.1 概述
程序中凡涉及求阶乘、累加、排序等问题都要用循环解决,因为程序中的某一程序段要重复执行若干次。
C语言实现循环的语句: goto 和if组合; while语句; do while语句 ;for语句。
5.2 goto语句以及用goto语句构成循环 作用:无条件地转移到语句标号指向的语句去执行。
一般格式:
goto 语句标号;
….…..
标号:语句;
说明: 语句标号由字母、数字和下划线组成,定名规则同变量名,不能用数字开头。
goto loop; ( √ ) goto 100;(×) 与循环语句配合使用时,可从循环体内跳到循环体外,而不能从循环体外跳到循环体内。 goto语句转移的方向可前可后。 与if语句配合使用时可构成循环。
goto 语句违背结构化程序设计的原则,因此应限制使用。
例 用if 和goto语句构成循环,求
#include <stdio.h>
void main( )
{ int i,sum=0;
i=1;
loop: if(i<=100)
{
sum+=i;
i++;
goto loop;
} printf("%d",sum);
}
例 从键盘输入一组数据,以0结束输入,求数据和。
#include <stdio.h>
void main()
{
int number,sum=0;
read_loop: scanf("%d",&number);
if(!number) goto print_sum;
sum+=number;
goto read_loop;
print_sum: printf("The total sum is %d\n",sum);
}
while语句 while语句实现“当型”循环结构。 一般形式:
while(表达式) 循环体语句;
while(表达式);
例 用while语句构成循环,求
#include <stdio.h>
void main( )
{
int i,sum=0;
i=1;
while(i<=100)
{
sum=sum+i;
i++;
}
printf("%d",sum);
}
关于while循环语句:
- while循环先判断表达式,后执行循环体。
- 循环体有可能一次也不执行。
- 循环体若包含一个以上语句,应该用{}括起来。
- 循环体应包含有使循环趋向结束的语句;
- 下列情况,退出while循环 条件表达式不成立(为零) 循环体内遇 break , goto
- 无限循环
- while(1)
- 循环体 ;
例 用while语句显示1~10的平方
#include <stdio.h>
void main()
{ int i=1;
while(i<=10)
{
printf("%d*%d=%d\n",i,i,i*i);
i++;
}
}
do-while语句
do-while语句实现“当型”循环结构。 一般形式:
功能:先执行循环体,然后判断表达式。若为真,则再次执行循环体,否则退出循环。 求
例 用while语句显示1~10的平方
#include <stdio.h>
void main()
{ int i=1;
while(i<=10)
{ printf("%d*%d=%d\n",i,i,i*i);
i++;
}
}
- do-while 循环,循环体至少执行一次;
- while和do-while可以解决同一问题,两者可以互换。
- while后的表达式一开始就为假时,两种循环结果不同。
5.5 for语句
for 语句是 C 语言中最为灵活,使用最广泛的循环语句,可完全替代while,do-while语句。 一般形式
一般形式: for(表达式1;表达式2;表达式3) 循环体语句;
常用形式: for(循环变量赋初值;循环条件;循环变量增值) 循环体语句;
例 用for语句构成循环,求
#include <stdio.h>
void main( )
{
int i,sum=0;
for(i=1;i<=100;i++)
sum+=i;
printf("%d",sum);
}
几点说明:
for语句中表达式1、2、3类型任意,都可省略,但分号“;”不能省。
无限循环:for(;;)不断执行循环体,循环不终止。
For语句可以转换成while结构
几种形式:
表达式1、3可以是与循环无关的表达式,也可以是逗号表达式。 for ( s=0 , i=1 ; i<=100 ; i++ ) s=s+i;
表达式2可以是关系、逻辑、算术、字符表达式,非0时,执行循环体,为0时退出循环。
#include <stdio.h>
main()
{ int i,c;
for(i=0;(c=getchar())!='\n';i+=c)
printf("%d ",i+c);
}
注意:循环可以互相嵌套,但不能相互交叉。
5.8 break语句和continue语句
Break语句
功能:在循环语句和switch语句中,终止并跳出循环体或开关体。
说明:
- break只能终止并跳出最近一层的结构。
- break不能用于循环语句和switch语句之外的任何其它语句之中。
一般形式:break;
例 break举例:小写字母转换成大写字母,直至输入非字母字符
#include <stdio.h>
void main()
{char c;
while(1)
{ c=getchar();
if(c>='a' && c<='z') putchar(c-32);
else
if(c>=‘A' && c<=‘Z') putchar(c);
else break;
}
}
Continue语句
功能:
- 结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。
- continue 语句仅用于循环语句中。
break 和 continue 语句的区别
- continue 语句只结束本次循环,break语句则是结束整个循环。
- continue 语句只用于while,do-while,for循环语句中,break语句还可以用于switch语句中。
例 把100~200之间不能被3整除的数输
#include <stdio.h>
void main()
{ int i;
for(i=100;i<=200;i++)
{ if(i%3= =0)
continue;
printf(“%d”,n);
}
}
例 求输入的十个整数中正数的个数及其平均值
#include <stdio.h>
void main()
{ int i,num=0,a;
float sum=0;
for(i=0;i<10;i++)
{ scanf("%d",&a);
if(a<=0) continue;
num++;
sum+=a;
}
printf("%d plus integer's sum :%6.0f\n",num,sum);
printf("Mean value:%6.2f\n",sum/num);
}
例 求Fibonacci数列:1、1、2、3、5、8……前40个数
#include <stdio.h>
#include <conio.h>
void main()
{
long int f1,f2;
int i;
f1=1; f2=1;
for(i=1;i<=20;i++)
{
printf("%12ld %12ld ",f1,f2);
if(i%2==0) printf("\n");
f1=f1+f2;
f2=f2+f1;
}
}
例 判断m是否素数。
#include <stdio.h>
#include <math.h>
void main()
{
int m,i,k;
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0) break;
if(i>k) printf("%d is a prime number\n",m);
else printf("%d is not a prime number\n",m);
}
例 求100~200间的全部素数。
#include <stdio.h>
#include <math.h>
void main()
{
int m, k, i, n=0;
for(m=101;m<=200;m=m+2)
{ k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0) break;
if(i>=k+1) {printf("%d",m);n=n+1;}
if(n%10==0) printf("\n");
}
printf("\n");
}
例 译密码。
按一定规律将电文变成密码:
将字母A变为E、将字母a变为e,即变成其后的第四个字母,W将变成A。字母按上述规律转换,非字母字符不变。输入一行字符,输出相应密码。
分析: 由于字符和整数之间可以通用,所以‘A’->’E’对应‘A’->’A’+4 可以定义一个字符型变量c,c接受输入,并c->c+4。 特殊之处是‘W’-’Z’和‘w’-’z’之间时,它们需要对应为‘A’-’D’和‘a’-’d’,怎么办? 一种是用书上的办法,再减回去,即用c->c-26来解决。
#include <stdio.h>
void main()
{
char c;
while((c=getchar())!='\n')
{ if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
{ c=c+4;
if(c> 'Z'&&c<= 'Z'+4||c>'z') c=c-26;
}
printf("%c",c);
}
printf(“\n");
}
本章小结:
- 用编程语言实现结构化算法就是结构化程序设计。
- 结构化算法中只包含顺序、分支和循环三种控制结构。
- 在C语言中实现上述三种结构的控制语句分别是顺序语句,分支语句和循环语句。
- if/if else语句在使用时应注意else和最近一个没有被else匹配的if匹配。
- ?运算符相当于根据不同情况对同一变量赋值的if/else语句的简写形式。
- switch语句实现多路选择,应用时应注意其条件表达式值为整型或字符型,且每个分支应用break语句结束。
- while和do while语句在应用时要注意后者至少执行一次循环体。
- for循环应用时要注意其控制结构中各个表达式的作用及执行次序。for(表达式1;表达式2;表达式3)→表达式1是初始执行,仅执行一次;表达式2接下来执行,以判断是否退出循环,如果执行了循环,接下来执行表达式3,对循环条件进行某中改变,然后再到表达式2进行判断……
- 注意break和continue的区别,break是结束本层循环,continue是结束本次循环。
精选练习题:
1. C语言中,do-while语句构成的循环只能用break语句退出。(可以自然退出)
A.对 B.错
2.for、while和do while循环结构的循环体均为紧接其后的第一个语句(含复合语句)。
A.对 B.错
3.由i=-1;while(i<10) i+=2;i++;可知,此while循环的循环体执行次数为6次。
A.对 B.错
解析:1:i=1 2:i=3 3:i=5 4:i=7 5:i=9 6:i=11 i=12(注意作用域)
4.while后的表达式只能是逻辑或关系表达式。【注意:while(1)】
A.对 B.错
5.已知:int t=0; while(t=1) { ... } ,则以下叙述正确的是______。
A.循环表达式的值为0 B.循环表达式的值为1
C.循环表达式不合法 D.以上说法都不对
6.以下程序段的运行结果是______。
i=0; do printf("%d,",i); while(i++); printf("%d\n",i);
A.0,0 B.0,1 C.1,1 D.程序进入无限循环
7.若程序执行时的输入数据是2473<回车>,则下述程序的输出结果是______。
#include <stdio.h>
void main()
{
int cs;
while((cs=getchar())!='\n')
{
switch(cs-'2')
{
case 0:
case 1: putchar(cs+4);
case 2: putchar(cs+4); break;
case 3: putchar(cs+3);
default: putchar(cs+2);
}
}
}
A.668977 B.668966 C.6677877 D.6688766
8.以下程序的输出结果是______。
#include "stdio.h"
void main()
{
int a,i;a=0;
for(i=1;i<5;i++) //1 2 3 4
switch(i)
{
case 0: case 3:a+=2;
case 1: case 2:a+=3;
default:a+=5 ;
//(1 ,2,3,4): 3+5+3+5+3+5+2+5=24+7=31
}
printf("%d\n",a);
}
A.31 B.13 C.10 D.20
9.以下程序的运行结果是______。
#include <stdio.h>
void main()
{
int i;
for(i='a';i<'f';i++,i++)//'a' 'c' 'e'
printf("%c",i-'a'+'A'); //i+32
//ACE
printf("\n");
}
A.ACE B.BDF C.ABD D.CDE
10.以下程序运行后的输出结果是______。
#include <stdio.h>
void main()
{
int k=5,n=0;
do
{
switch(k)
{
case 1: case 3:n+=1;k--;break;
default:n=0;k--;
case 2: case 4:n+=2;k--;break;
}
printf("%d",n);
}while(k>0 && n<5);
}
A.235 B.0235 C.02356 D.2356
解析:
//k=5 n=0 k=4 (default的时候没有跳出循环不会执行printf)
//k=4 n=2 k=3
//k=3 n=3 k=2
//k=2 n=5 k=1
11.下述程序的输出结果是_______。
#include <stdio.h>
void main()
{
int x=8;
for( ; x>0; x--)
{
if(x%3)
{
printf("%d,",x--);
continue;
}
printf("%d,",--x);
}
}
A.7,4,2, B.8,7,5,2, C.9,7,6,4, D.8,5,4,2,
12.以下不会构成无限循环的语句或语句组是_______。
A.n=0; do{++n;}while(n<=0); B.n=0; while(1){n++;} //永远为真
C.n=10; while(n); {n--;} D.for(n=0,i=1; ;i++) n+=i;
解析:
/* 循环的题目 注意while();这种语句如果while(n)后面跟;而且n不等于0,则永远为真
A.
#include <stdio.h>
void main()
{
int n=0;
do{
++n;//1
}
while(n<=0); //一直加到溢出,就跳出循环
printf("一直加到溢出,就跳出循环");
}
B.
n=10; while(n); //死循环
{n--;}
D.
for(n=0,i=1; ;i++)
n+=i;
//没有终止条件,死循环
D.
n=0; while(1){n++;} //永远为真
*/
13.以下程序的运行结果是_______。
//注意作用域
#include "stdio.h"
void main()
{
int k=0,m=0,i,j;
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
k++;
k-=j;
}
m=i+j;//2+3=5
printf("k=%d,m=%d",k,m);
}
A.k=0,m=3 B.k=0,m=5 C.k=1,m=3 D.k=1,m=5
14.下面程序的运行结果是_______。
a=1;b=2; c=2; while(a<b<c) { t=a;a=b;b=t;c--;}
printf("%d,%d,%d",a,b,c);
A.1,2,0 B.2,1,0 C.1,2,1 D.2,1,1
//注意要看是否满足循环,如果满足,继续,如果不满足,跳出循环体
//1<2=1 1<2=1 a=2 b=1 c=1
//2<1=0 0<2=1 a=1 b=2 c=0
15.以下叙述中正确的是_______。
A.break语句只能用于switch语句体中
B.continue语句的作用是使程序的执行流程跳出包含它的所有循环
C.break 语句只能用在循环体内和switch语句体内
D.在循环体内使用break语句和continue语句的作用相同
16.以下程序运行后的输出结果是_______。
#include "stdio.h"
void main()
{
int k=5,n=0;
do
{
switch(k)//k=5
{
case 1: case 3: n+=1; break;
default: n=0;k--; //default结束之后如果还有语句不会跳出循环
case 2: case 4: n+=2;k--;break;
}
printf("%d", n);
}while(k>0&&n<5);
}
A.2345 B.0235 C.02356 D.2356
解析:
//k=5 n=0 k=4
//k=4 n=2 k=3 printf 2
//k=3 n=3 printf 3
//k=3 n=4 printf 4
//k=3 n=5 printf 5
17.执行以下程序时输入1234567890<回车>,则其中while循环体将执行_______次。
#include "stdio.h"
void main()
{ char ch; while((ch=getchar())=='0') printf("#"); }
A.10 B.0 C.2 D.l
解析:
//important!!!!
#include "stdio.h"
void main()
{
char ch;
//1234567890<回车>
//只有输入0,才会执行循环
while((ch=getchar())=='0') //因为输入的1234567890<回车>的第一个被拿出来的'1'不等于'0',所以条件为假,循环不可以执行,然后会执行0次
printf("#");
printf("*************************************\n");
}
18.以下程序执行后的输出结果是________。
#include "stdio.h"
void main()
{
int i;
for(i=1;i<=40;i++)
{
if(i++%5==0)//5 10 15 20 25 30 35 40
if(++i%8==0)//7 12 17 22 27 32 37 42 //32
printf("%d",i);
}
printf("\n");
}
A.5 B.24 C.32 D.40
19.有以下程序,若运行时从键盘输入:18,11<回车>,则程序输出结果是_______ 。
#include "stdio.h"
void main()
{ int a,b;
printf("Enter a,b:");scanf("%d,%d",&a,&b);
while(a!=b)
{ while(a>b) a-=b;
while(b>a) b-=a; }
printf("%3d%3d\n",a,b); }
A.1 1 B.1 2 C.1 3 D.1 4
解析:
#include "stdio.h"
void main()
{
int a,b;
printf("Enter a,b:");//18 11
scanf("%d,%d",&a,&b);
while(a!=b)
{
while(a>b) //1 7>4 3>1 2>1
a-=b;//a=18-11=7 7>11不大于 跳出循环 a=3 a=2 a=1
while(b>a) //11>7 4>3
b-=a; //b=11-7=4 a=7 b=1
}
printf("%3d%3d\n",a,b); //a=1 b=1
}
20.以下程序运行后的输出结果是_______。
#include "stdio.h"
void main()
{
int i,j,x=0;
for(i=0;i<2;i++)//0 1
{
x++;
for(j=0;j<=3;j++)
{
if(j%2)// 注意这个式子:当 j取 1,3 if(j%2)为真,取0,2的时候if(j%2)为假
continue;
x++;
}
x++;
}
printf("x=%d\n",x);
}
- x=4 B.x=8 C.x=6 D.x=12
//x=1 j=0 x=2 j=1 j=2 x=3 j=3 x=4
//x=5 j=0 x=6 j=1 j=2 x=7 j=3 x=8
21.以下程序的输出结果是_______。
#include "stdio.h"
void main()
{
int k=5,n=0;
while(k>0)
{
switch(k)
{
default : break;
case 1 : n+=k;
case 2 :
case 3 : n+=k;
}
k--;
printf("%d\n",k);
}
printf("%d\n",n);
}
A.3 B.4 C.5 D. 6
//k=4 k=3
//k=3 n=0+3=3
//k=2 n=3+2=5
//k=1 n=5+1+1=7
//k=0 n=7
22.以下程序执行后的输出结果是_______。
#include "stdio.h"
void main()
{
int x=0,y=5,z=3;
while(z-->0&&++x<5)
y=y-1;
printf("%d,%d,%d\n",x,y,z);
}
A.3,2,0 B.3,2,-1 C.4,3,-1 D.5,-2,-5
解析:
//z=3>0 z=2 x=1<5 y=4
//z=2>0 z=1 x=2<5 y=3
//z=1>0 z=0 x=3<5 y=2
//z=0>0 不成立 z=-1 important!!!!
//x=3 y=2 z=-1
23.以下程序执行后的输出结果是_______。
#include "stdio.h"
void main()
{ int i,n=0;
for(i=2;i<5;i++)
{ do{ if(i%3) continue; n++; }while(!i);
n++; }
printf("n=%d\n",n); }
A.n=5 B.n=2 C.n=3 D.n=4
解析:
#include <stdio.h>
int main( )
{
int i,n=0;
for(i=2;i<5;i++)//2 3 4
{
do
{
if(i%3) //为真 2 4 为假 3
continue;// i%3与i%3!=0等效
//break;
n++;
} while(!i);//!i i!=0
n++;
//printf("n=%d\n",n);
}
printf("n=%d\n",n);
}
//continue执行到i%3为真的时候,然后它不会继续执行n++;语句,重新进行do...while()循环,但是此时while(!i)为假,所以跳出循环
//break执行到i%3为真的时候,然后它不会继续执行n++;语句,直接跳出do...while();循环
24.下面程序的功能是输出以下形式的金字塔图。在下划线处应填入的是_______。
*
***
*****
*******
#include "stdio.h"
void main( )
{ int i,j;
for(i=1;i<=4;i++)
{ for(j=1;j<=4-i;j++) printf(" ");
for(j=1;j<=_______;j++) printf("*");
printf("\n"); }
}
A.i B.2*i-1 C.2*i+1 D.i+2
解析:
// * i=1 , n1=1 , n2=3 n1=2*i-1
// *** i=2 , n1=3 , n2=2 n1=2*i-1
// ***** i=3 , n1=5 , n2=1 n1=2*i-1
// ******* i=4 , n1=7 , n2=0 n1=2*i-1
//思路整理
/*
for(i=0;i<=4;i++)
for(j=1;j<=4-i;j++)
printf("");
for(j=1;j<=2*i-1;j++)
printf("*");
*/
//程序设计
#include "stdio.h"
void main( )
{
int i,j;
for(i=1;i<=4;i++)//i控制行数
{
for(j=1;j<=4-i;j++) //j控制空格个数 个数规律为:3 2 1 0 满足 j=4-i
printf(" ");
for(j=1;j<=2*i-1;j++) //j控制*的个数 个数规律为:1 3 5 7 满足 j=2*i-1
printf("*");
printf("\n");
}
}
本文笔记来自C程序设计谭浩强PPT,我是热爱学习的呵呵哒!
如果您觉得写得不错,点个赞呀~