C语言while、do while、for循环的基本用法和两种算法(递推,穷举)

C语言循环控制语句基本用法

循环语句使用的基本思想:

  1. 对于事先循环次数已知的称为计数控制的循环,一般使用for循环;
  2. 对于事先循环次数不知的称为条件控制的循环,一般使用while或者do while循环语句;
  3. 对于一个循环语句包括另外一个循环语句的称为嵌套循环

一、while语句

  1. 一般形式:
    赋初始值;赋初始值;赋初始值;
    while(循环控制表达式)
    {
    循环体语句;
    }
  2. 流程图:
    while

循环控制表达式是在执行循环体语句前判断的:

  1. while语句的执行过程

循环控制表达式是在执行循环体语句前判断的;
如果表达式的值一开始就为0,则语句一次也不会被执行;
a.计算循环控制表达式的值;
b.如果循环控制表达式的值为真,则执行循环体语句,并返回步骤;
c.如果循环控制表达式的值为假,则跳过循环,接着执行后面的语句;

例1、输出1-100之间所有的奇数;

#include <stdio.h>
void main()
{
    
    
	int i=1;//记得赋初始值;
	while(i <= 100)
	{
    
    
		if(i%2 != 0)//判断奇偶;(i%2==0)输出偶数;
		{
    
    
			printf("%5d",i);
		}
		i++;
	}
}
  1. 死循环(例举一种情况)
#include <stdio.h>
void main()
{
    
    
	int i=1;
	while(i <= 100);//这里加上分号就很有可能变成死循环
	{
    
    
		if(i%2 != 0)
		{
    
    
			printf("%5d",i);
		}
		i++;
	}
}

二、do…while语句

  1. 一般形式
    do
    {
    循环体语句;
    }
    while(循环控制表达式);

while();后面有一个分号

  1. 流程图
    do...while

先执行循环体语句,再进行表达式判断;

  1. do…while语句的执行过程:

a.计算循环体语句;
b.计算循环控制表达式的值;
c.如果循环控制表达式的值为真,并返回步骤;
d.如果循环控制表达式的值为假,则跳过循环,接着执行后面的语句;
由于是先执行,后判断表达式的真假,所以循环体中的语句至少被执行一次;

  1. while 与 do…while的区别:
(1)#include <stdio.h>              (2)#include <stdio.h>
void main()                        void main()                           
{
    
                                      {
    
        
	int i=11;                       int i=11;
	while(i<=10)                    do
	{
    
                                  {
    
    
		printf("i = %d\n",i);          printf("i = %d\n",i);
		i++;                           i++;
	}                               }
	                                while(i<=10);
}                                  }
没有任何输出                        输出:i=11

程序(1)是因为先判断后执行,所以当条件一开始就不满足的情况下,循环一次也不执行,所以没有任何输出;
程序(2)是因为先执行后判断,已经执行过了一次再进行的判断,所以循环至少执行了一次,输出 i=11。

例2:1-100之间的数字竞猜游戏(随机数值固定的情况下)

#include <stdio.h>
#include <stdlib.h>
void main()
{
    
    
	int person,machine;//用户猜的数,系统随机数
	int i = 0;  //猜的次数
	printf("输入一个1-100之间的数:");
	machine = rand()%100+1;
	do{
    
         
		    scanf("%d",&person);
			if(person>machine)
			{
    
    
				printf("这个数大了!\n");
			}
			else if(person<machine)
			{
    
    
				printf("这个数小了!\n");
			}
			else
			{
    
    
				printf("你猜对了!\n");
			}
			i++;
	  }
	while(person!=machine);
	printf("您一共猜了%d次\n",i);
}

rand()函数生成的是0–32767之间的整数;使用时需要包括头文件 stdlib.h;
rand()%b ==> [ 0, b-1 ] 之间;
rand()%b+a ==> [ a,a+b-1 ]之间;

三、for语句

  1. 一般形式:
    for(初始化表达式;循环控制表达式;循环变量增量)
    {
    循环语句;
    }

for语句中的表达式分隔符分号,有且只有两个,不可以省略;

也可以表示为其他形式:

初始化表达式                           初始化表达式 
 for(  ;循环控制表达式;循环变量增量)     for( ;循环控制表达式; )
    {
    
                                          {
    
    
       循环语句;                              循环语句;  
                                              循环变量增量;
    }                                     }
 当循环控制表达式省略时,则表示循环条件永真,不做处理的话,可能会导致死循环;
  1. 流程图:
    for

  2. for语句的执行过程:
    a. 由初始化表达式开始;
    b.执行循环控制表达式,若其值为真(非0),则执行循环内语句,然后执行循环变量增量语句;
    c.若其值为假(0),则结束循环,执行循环外语句;

例3:(算法一:穷举法) 韩信点兵问题
韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为5;按从1至7报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10。编程求韩信至少有多少兵?

穷举法:从1开始,直到上述条件成立i,i则为所求的值;

解法一:

#include <stdio.h>
void main()
{
    
    
	int i;
	for(i=1; ;i++)
	{
    
    
		if(i%5==1 && i%6==5 && i%7==4 && i%11==10)
		{
    
    
			printf("%d\n",i);
			break;
		}
	}
}

利用无限循环找出第一个满足条件的值,然后跳出循环;

解法二:(对于循环次数未知的条件控制循环,一般使用while或者do while语句)

#include <stdio.h>
void main()
{
    
    
	int i = 0;
	do
	{
    
    
		i++;
	}
	while(!(i%5==1 && i%6==5 && i%7==4 && i%11==10));
	printf("%d\n",i);
}

算法二:递推法:下一项的值是在前一项的前提下推算出来的。
求Fibonacci数列前40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。

#include <stdio.h>
void main()
{
    
    
	int i, p=1,q=1;
	for(i=1;i<=20;i++)
	{
    
    
		printf("%d %10d\n",p,q);
		p=p+q;
		q=q+p;
	}
}

四、goto语句和if语句构成循环

  1. 一般不使用goto语句和if语句构成循环;

**例:**计算1+2+…+100的和

#include <stdio.h>
void main()
{
    
    
	int i,sum;
	i=1;sum=0;
	round: if(i<=100)
		   {
    
    
			   sum = sum + i;
			   i++;
			   goto round;
		   }
	printf("%d\n",sum);
}

猜你喜欢

转载自blog.csdn.net/weixin_46623617/article/details/105384715