轻松学习C语言 第五章

循环控制

本章学习内容:

①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循环语句:

  1. while循环先判断表达式,后执行循环体。
  2. 循环体有可能一次也不执行。
  3. 循环体若包含一个以上语句,应该用{}括起来。
  4. 循环体应包含有使循环趋向结束的语句;
  5. 下列情况,退出while循环 条件表达式不成立(为零) 循环体内遇 break , goto
  6. 无限循环              
  • 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++;
    }
}
  1. do-while 循环,循环体至少执行一次;
  2. while和do-while可以解决同一问题,两者可以互换。
  3. 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语句中,终止并跳出循环体或开关体。

说明:

  1. break只能终止并跳出最近一层的结构。
  2. 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语句

功能:

  1. 结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。
  2. continue 语句仅用于循环语句中。

break 和 continue 语句的区别

  1. continue 语句只结束本次循环,break语句则是结束整个循环。
  2. 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");
}

本章小结:

  1. 用编程语言实现结构化算法就是结构化程序设计。
  2. 结构化算法中只包含顺序、分支和循环三种控制结构。
  3. 在C语言中实现上述三种结构的控制语句分别是顺序语句,分支语句和循环语句。
  4. if/if else语句在使用时应注意else和最近一个没有被else匹配的if匹配。
  5. ?运算符相当于根据不同情况对同一变量赋值的if/else语句的简写形式。
  6. switch语句实现多路选择,应用时应注意其条件表达式值为整型或字符型,且每个分支应用break语句结束。
  7. while和do while语句在应用时要注意后者至少执行一次循环体。
  8. for循环应用时要注意其控制结构中各个表达式的作用及执行次序。for(表达式1;表达式2;表达式3)→表达式1是初始执行,仅执行一次;表达式2接下来执行,以判断是否退出循环,如果执行了循环,接下来执行表达式3,对循环条件进行某中改变,然后再到表达式2进行判断……
  9. 注意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); 
}
  1. 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,我是热爱学习的呵呵哒!

如果您觉得写得不错,点个赞呀~

猜你喜欢

转载自blog.csdn.net/weixin_41987016/article/details/105822965