这里除了之前的while与do while循环,还介绍了第三种循环:for循环。另外还有一些循环的例题进行练习。
例1:阶乘
分析:输入一个数,利用循环计算其阶乘。用变量n表示输入的数,利用中间变量i进行累加操作,用fact变量存放乘法的结果。
方法一:使用while循环
int main()
{
int n;
int fact=1;
int i=1;
scanf("%d",&n);
while(i<=n)
{
fact=fact*i;
i++;
}
printf("%d!=%d\n",n,fact);
return 0;
}
方法二:将while循环改为for循环:
for(i=1;i<=n;i++)
{
fact *=i;
}
在这个例子中,由于有乘法,需要注意对fact以及i进行初始化的时候不能让初始化值为0,而是要设置为1,如果是累加,则应该初始化为0.
1. for循环、
根据上面的例子,我们来理解一下for循环的用法。
for循环像是一个计数循环:设定一个计数器,初始化它,在计数器到达某一个值之前,重复执行循环体,每次执行循环后计数器的值按照一定的步进进行调整,比如加一或者减一。
在上面的for循环中,i=1为计数器初始化,i<=n表示的是循环的条件,在i<=n之前重复执行循环体fact*=I,每次执行循环之后进行i++操作,到i<=n的时候结束循环。
2. 循环的计算与选择
循环次数选择:
for(i=0;i<n;i++)
循环次数是n,循环结束后i的值是n。
例2:循环次数
int main()
{
int i;
for(i=0;i<5;i++)
{
printf("i=%d ",i);
}
printf("最后i=%d\n",i);
return 0;
}
可以得到运行结果如下:
可以得出循环了5次,最后循环完成后i=5.
另一种写法
将for循环改成:
for(i=1;i<=5;i++)
运行结果如下:
可以得出这个循环也是循环了5次,但是循环过程中i的值不同。
3. for循环与while循环
任何一个for循环都可以改写成while循环,只要将初始化拿到循环外面,将计i++或者i—写入循环体既可。
for循环基本格式如下:
for(初始动作;条件;每轮的动作)
{}
for循环中的每一个表达式都是可以省略的
for(;条件;)== while(条件)
4. 三种循环
循环一共有三种,用法区别如下:
如果有固定的循环次数,用for;
如果循环必须执行一次用do while循环;
其他情况用while循环。
5. 循环控制
循环的控制是按照程序的要求进行循环的编写,怎么写循环来达到我们所要求的,需要根据具体的例子进行分析。
例3:素数判断
要判断一个数是否是素数,就要判断它是否能被小于图的所有数整除。
首先根据上面的思路进行编程如下:
int main()
{
int x;
int i;
scanf("%d",&x);
for(i=2;i<x;i++)
{
if(x%i==0)
{
printf("不是素数\n");
}
}
printf("是素数\n");
return 0;
}
但是我们会发现,如果输入6,会出现两次“不是素数”,并且循环结束后还会输出“是素数”,这显然不对。根据程序进行分析,当i=2以及i=3的时候都能被整除6,而循环结束后又会继续执行输出“是素数”。
为了达到需求,我们在这里将引入一个变量isPrime作为是否是素数判断的变量,首先初始化isPrime=1,循环中如果是能够整除,则将isPrime置为0,最后用一个if语句进行输出是否是素数的判断。
具体代码如下:
int main()
{
int x;
int i;
int isPrime =1;
scanf("%d",&x);
for(i=2;i<x;i++)
{
if(x%i==0)
{
isPrime =0;
}
}
if(isPrime==1)
printf("是素数\n");
else
printf("不是素数\n");
return 0;
}
在上面改进的这个代码中,我们会发现,如果对于6这个数进行判断,那么我们在循环到i=2的时候就已经可以判断6不是素数了,因此可以不需要继续循环了。
C语言提供了一个结束循环的语句break,可以做如下改进:
for(i=2;i<x;i++)
{
if(x%i==0)
{
isPrime =0;
break;
}
}
6. break与continue
break:跳出循环
continue:跳过这一轮循环,剩下的语句进入下一轮
这两个语句都只能作用于一层循环,不能跳出所有循环。
7. 循环的嵌套
在程序的编写中我们有时候并不能通过仅仅一个循环完成所需的功能,这时候就需要使用循环的嵌套,我们将通过下面的例子进行循环嵌套的练习。
例4:输出100以内的素数
根据上面的例子我们已经完成了素数的判断,现在在之前的基础上输出100以内的素数,只需要在判断之后进行输出既可。这里素数的判断是一个循环,100以内数的判断是一个循环,这里就用到了循环的嵌套。
具体代码如下:
int main()
{
int x,i,isPrime;
for(x=1;x<=100;x++)
{
isPrime=1;
for(i=2;i<x;i++)
{
if(x%i==0)
{
isPrime =0;
}
}
if(isPrime==1)
printf("%d ",x);
}
return 0;
}
在编程的时候,我还忽略了循环体内关于isPrime的赋值问题,如果将isPrime赋值写到了整个循环外,只在最开始对其赋值为1,那么循环到判断完第一个不是素数的数之后就会isPrime置0,只会输出1 2 3,所以在判断素数的循环后都需要对其重新置1,也就是要将isPrime=1写在循环内。