书接上回
1.while循环:与if一样,while后面的括号也表示0或1,首先执行括号内的表达式,表达式不为0,就是真,就进行下面的语句,语句结束后表达式进行判断,如果表达式结果为真,就继续执行,如果为假,就跳出循环,直接结束。
流程图:
//打印1—10
include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;//i+以产生数字1—10,直到i=11不满足条件
}
return 0;
}
其中i=1为初始化部分,i<=10为判断部分,i++为调整部分,这三个部分共同构成while循环,但是随着代码的增多或者复杂,这三个部分会比较分散,不太容易操作,因此就有了for循环的出现。
2.for(表达式1;表达式2;表达式3;)
#include <stdio.h>
//打印1—10
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
第一步初始化 ,让i=1,第二步判断,判断i是否小于10,小于就为真,为真走下面的语句,执行完后走表达式3,让i++,变成2,再判断是否小于10,以此类推,直到最后i++完成之后变成11,再判断,大于10为假,就跳出循环,结束了。
3.do-while循环
while和for都是先判断,条件满足再循环,而do-while循环是先执行循环体内的语句,再执行while后面的表达式,为真就进行下一次,为假则不再循环。
//打印1—10
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
练习:输入一个正整数,计算它是几位数
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int count = 0;
do
{
count++;
n = n / 10;
} while (n);
printf("%d\n", count);
return 0;
}
4.break和continue:在循环执行的过程中,如果发生某些情况需要提前终止循环,C语言提供了break和continue两个关键字去提前终止循环。
break的作用是永久终止循环,只要break执行,就直接跳出循环,继续往后执行。
continue的作用是跳过本次循环continue后面的代码,在for循环和while循环中是由差异的。
include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if(i==5)
break;
printf("%d ", i);
i++;//i+以产生数字1—10,直到i=11不满足条件
}
return 0;
}
当i==5的时候,执行break,跳出循环,只打印1 2 3 4 。如果将break换成continue,结果会变成死循环,光标一直在闪,因为当i==5时,执行continue然后跳过后面的代码,i++被跳过了,循环重新执行 ,但是i没有变停在了5这里,所以continue会一直执行。
#include <stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
与while不同的是,执行continue跳过之后的代码,然后又回到调整部分即i++,然后就会接着打印。
5.循环的嵌套:可以将前面所讲的三种循环进行嵌套以解决更加复杂的问题,实现更加复杂的功能。
例:打印出100-200之间的素数(只能被1和它本身整除的数)
分析:首先需要产生100-200之间的数,然后再进行判断。
关于如何进行判断:拿2~i-1之间的数字去试除,如果这些数字中有任何一个数字能整除i,那么i就不是素数,反之为素数。即先产生2~i-1之间的数,然后去试除i。
#include <stdio.h>
int main()
{
int i = 0;
int count = 0;//计数素数个数
for (i = 100; i < 200; i++)
{
//判断i是否为素数
//产生2—i-1之间的数
int flag = 1;//假设i是素数,当发现i%j==0,就让flag=0来标记它是素数
int j = 0;
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\ncount=%d", count);
return 0;
}
优化:其实没有必要拿2—i-1之间全部数字去除。假如存在数字m=a*b ,那么a和b中至少有一个数字<=(m)^1/2。例如16=4*4=2*8,如果16可以被2整除那么16会被“另一边”的8给整除了,这个“另一边”的分界线就是4也就是(16)^1/2。 那么代码就可以改进为:
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
int count = 0;//计数素数个数
for (i = 100; i < 200; i++)
{
//判断i是否为素数
//产生2—i-1之间的数
int flag = 1;//假设i是素数,当发现i%j==0,就让flag=0来标记它是素数
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\ncount=%d", count);
return 0;
}
其中sqrt()是一个库函数,表示开平方。
还有一个细节就是偶数(除了2)是不会为素数的 ,所以就可以把代码再改进为:
#include <stdio.h>
#include <math.h>
int main()
{
int i = 0;
int count = 0;//计数素数个数
for (i = 101; i < 200; i+=2)
{
//判断i是否为素数
//产生2—i-1之间的数
int flag = 1;//假设i是素数,当发现i%j==0,就让flag=0来标记它是素数
int j = 0;
for (j = 2; j <= sqrt(i); j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", i);
count++;
}
}
printf("\ncount=%d", count);
return 0;
}
6.goto语句:C语言提供了一种非常特别的语法,就是goto语句和跳转符号,goto语句可以实现在同一个函数内跳转到设置好的标号处。
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("heihei\n");
return 0;
}
另外,next只是随便起的名字,可以自己起名字,只是一个标签。goto语句不要随便使用,会打乱程序的执行流程。在多层循环的代码中,如果想想快速跳出使用goto就会方便许多。
OK以上就是分支循环语句的一些基本内容了,拜拜了各位。