《C程序设计》课程学习(6)——第6章 循环控制

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_34573534/article/details/102674563

引例:请根据以下情况,编写相应程序

           某公司财务部每天接受1000笔帐户的汇入。每接受一笔汇款,将汇款钱数加入到总额之中。到达规定的次数时,输出汇款总额。

6.1  三种循环结构

6.1.1     while语句

一般形式:while(表达式)语句

作用:实现“当型”循环,当表达式成立时,执行语句。

执行过程:

例:输入四个数并求和,要求一次只能加一个数。

循环程序设计的三要素:

    1. 变量初值,尤其是循环变量的初值;

    2. 循环条件;

    3. 循环体语句,即:反复执行的操作;

例2    求n!。

         main( )
        	{ double  t;
            int  i, n;
            scanf("%d",&n);
            t=1; i=1;
	   while(i<=n)
	        { t=t*i;
                    i++;
                   }
	   printf("%e\n", t);
          } 

例3: 求1到100之间的奇数之和,偶数之积。

6.1.2     do-while语句

	#include "math.h"
	main( )
	{ int  s;
	   float  n, t, pi;
	   t=1;  pi=0;  n=1;  s=1;
	   do
	     { pi=pi+t;
	        n=n+2;   
	        s=-s; 
	        t=s/n;     
	        } while (fabs(t)>=1e-4);
	  printf("pi=%f\n",4*pi);
             }

main( )
{
   float   sum=0,t; 
   int   n=1;
   do
   {  t=1.0/(n*(n+1));
       sum=sum+t;
       n++;
   } while(t>=1e-3);
   printf("sum=%f\n", sum);
 }

while循环与do_while循环小结

1. 循环体内必须有使循环趋于终止的条件。

2. 注意循环初值与循环条件。

3.  do_while 循环的循环体至少执行一次,  while循环的循环体可能一次也不执行。

例6:编程序,求一批非零整数中的偶数、奇数的平均值。用零作为终止标记。

main( )
 {  int    x, s1=0, s2=0, i=0, j=0;
     float    av1=0, av2=0;
     scanf("%d", &x);
     while  (x!=0)
       {  if (x%2==0)  { s1=s1+x; i++;} 
             else   { s2=s2+x ;  j++;} 	
          scanf("%d", &x); 
       }
      if (i!=0) 
        {av1=s1*1.0/i; printf(“t1=%7.2f \n" ,av1);}
      if ( j!=0) 
       {av2=s2*1.0/j; printf(“t2=%7.2f \n" ,av2);}
  }

例7:任意十个数,打印它们中的最大数与最小数。

§6.1.3     for 语句

上图是动态图,截图出来的结果有所改变,以及部分看不到。可以自己推断出里面的内容。

  3.  说明 :

    1)表达式1可省,但分号不能省 ;

    2)若表达式2省略,循环条件永远为真 ;

    3)表达式3也可省略,但应设法保证循环正常结束 ;

例 2:  求1!+2!+3!+......+20!

例3:任意十个数,打印它们中的最大数 与最小数。

 main( )
   {   int  x, max, min,  i=1;        scanf("%d", &x); 
        max=x;  min=x;
         for(i=1;i<=9;i++)  
	  {  scanf("%d",&x);
               if(x>max) max=x; 
               if(x<min)  min=x;                   
            }
 printf("max=%d, min=%d\n",max,min);
   }

注:

1.尽量避免用实型变量控制循环次数。    

2.在循环体内尽量避免改变循环变量的值,  否则将难以予知循环次数。

§6.2 循环的嵌套

 概念 :一个循环体内又包含另一个完整的循环结构 。

例4: 打印乘法99表

 main( )
 {
    int   i, j;
    printf("\n");
    for(i=1;i<10;i++)
    {  
       for(j=1;j<10;j++)  printf("%4d",i*j);
       printf("\n");
    }
 }

 main( )
 {int   i, j;
   for(i=1;i<10;i++)
      {for(j=1;j<10;j++)
           printf("%2d*%1d=%-3d", i, j, i*j);
        printf("\n");
      }
  }

main( )
{int  i, j;
  for(i=1;i<10;i++)
   { for(j=1;j<=i;j++)
        printf("%2d*%1d=%-3d",j,i,i*j);
     printf("\n");
   }
}

方法 1:

方 法 2:

 main( )
 {int  k1, k2, k3, i;
   for (k3=1;k3<=9;k3++)
     for (k2=0;k2<=9;k2++)
       for (k1=0;k1<=9;k1++)
         { i=k3*100+k2*10+k1;
            if(i==k1*k1*k1+k2*k2*k2+k3*k3*k3)      
                 printf("%4d",i);                     
         }
  }

几种循环的比较

1.  四种循环一般可互相代替,但不提倡使用goto型循环 ;

2.  while和do-while循环的循环体中应包括使循环趋于结束的语句。

3.  for循环可以在表达式3中包含使循环趋于结束的语句,甚至可以将循环体中的操作全部放到表达式3中,因此for语句功能更强,完全可以代替while循环 。

4.  用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可在表达式1中给出 ;

5.  while和for循环是先判断表达式,后执行语句,而do-while循环是先执行语句,后判断表达式 ;

6.  对while、do-while和for循环,可以用break跳出循环,用continue语句结束本次循环,而对goto和if构成的循环不能用break和continue语句进行控制 。

§6.3 break 和continue

一、break语句

作用:1)从循环体内跳出循环体,即提前结束循环, 接着执行循环下面的语句;break语句只能用于循环语句和switch语句。    

二、continue 语句

1.作用:结束本次循环,即跳过循环体中下面尚未执行的语句,接着执行下一次是否执行循环的判定。

2.break语句和continue语句的区别是 :

1)continue语句只结束本次循环,不终止整个循环的执行;

2)break语句是终止整个循环的执行,不再进行条件判断。

§6.4    程序举例

 例1:从键盘上任意输入一个正整数,判断其是否为素数。

素数:除了1和它本身之外没有其他因子的数。

方法1:设置标志位

方法2:判断循环时候正常结束

例2:求100-200之间的所有素数及素数的个数。

main( )
{ int  i, n=0, k, m;
  for(m=100;m<=200;m++)
  {k=1;
    for(i=2;i<=m-1;i++)
       if(m%i==0) k=0;
    if(k)
     { printf("%5d",m);   n++;
        if(n%10==0) printf("\n");}
   }
  printf("  n=%d\n",n); }
main( )
{ int  i, m, n=0;
  for(m=100; m<=200; m++)
  { for(i=2; i<=m-1; i++)
       if(m%i==0) break;
     if(i==m)
     { printf("%5d",m);
       n++;
       if(n%10==0) printf("\n");
       }
    }
  printf("  n=%d\n",n);
 }

例3:求Fibonacci数列:1,1,2,3,5,8,...      ...的前40个数 。

 main( )
  { long  int   f1 , f2 , f3;   
     int  i=1;
     f1=1; f2=1;
     printf("%12ld%12ld",f1,f2);
     for( i=3; i<=40; i++)
       {  f3=f1+f2;  printf("%12ld",f3);
           f1=f2; 
           f2=f3; 
           if(i%4==0)  printf("\n");
       }
   }

例4: 找出10~1200之间各个位数字之和能被     5整除的所有数。

 main( )
 { int   i, m, s, k=0;
    for(i=10;i<=1200;i++)
    { m=i; s=0;
      do
        {s=s+m%10;
          m=m/10;
         }while(m>0);
       if  (s%5==0) 
        { printf("%5d",i);
           k++;
           if (k%10==0)    printf("\n");        
         }
     }
  }

   #include <math.h>
   main( )
   { float   x, x1, f, f1;
      x1=1.5;
      do
        { x=x1; 
          f=2*x*x*x-4x*x+3*x-6;
          f1=6*x*x-8*x+3;
          x1=x-f/f1;
        } while (fabs(x-x1)>=1e-5);
      printf("%7.4f  \n",x1);
    }

例6: 找出1~1000之间的全部同构数。

同构数: 一个数等于它的平方数的右端。

  如:5的平方是25

    25的平方是625    

例7: 编程找出1000之内的所有完数。

完数:一个数恰好等于它的因子之和。 例如:6的因子为1,2,3,而6=1+2+3,因此6是完数。

main( )
{ int  i, n, s;
  for (n=2;n<=1000;n++)
 { s=0;
    for (i=1;i<=n/2;i++)
       if  (n%i==0) s=s+i;
    if  (n==s)
      { printf("%d its factors are %d",n,1);
         for (i=2;i<=n/2;i++)
	  if  (n%i==0)   printf(",%d",i);
       }
   }

例8.输入两个正整数m和n,求其最大公约 数和最小公倍数。

辗转相除法求最大公约数:

       首先将 m除以 n(m>n)得余数 r,再用余数r去除原来的除数,得新的余数,重复此过程直到余数为 0时停止,此时的除数就是m和n的最大公约数。

求 m和 n的最小公倍数:

        m和 n的积除以 m和 n 的最大公约数。  

main( )  
 { int m,n,r,p,gy,gb;
   scanf("%d%d",&m,&n);
   if(m<n) {p=m;m=n;n=p;}
   p=m*n;
   r=m%n;
   while(r!=0)
     { m=n;n=r;r=m%n; }
  gy=n;
  gb=p/n;
  printf("gy=%d,gb=%d\n",gy,gb);  
 }

例9:简单图案打印

猜你喜欢

转载自blog.csdn.net/qq_34573534/article/details/102674563