什么是循环结构
在解决问题时,经常要重复执行某些计算或操作,将这些计算和操作写成循环结构可以使计算机重复的执行。
for语句
for语句是功能最强、使用最广的一种循环语句。
for语句可以直接处理循环变量的初值、终止、步长。
for循环一般用来执行一个指定次数的循环。
for的一般格式
for(表达式1;表达式2;表达式3)
{
循环体语句
}
3个表达式要用分号隔开
- 表达式1通常用来給变量赋值(这个变量称为循环变量),一般为赋值表达式。(表达式1可以省略,省略时应在循环语句前为循环变量赋值)
- 表达式2通常是循环条件,一般为条件表达式或逻辑表达式。(表达式也可以省略,省略时应在循环体内用if()设置退出条件,否者会死循环)
- 表达式3通常用来修改循环变量,即处理步长,一般是赋值语句。(表达式3也可以省略,省略时在循环体内设置步长,不然会死循环)
- 无论省略哪个表达式分号都不能少。(3个表达式都省了也要写分号)
- 每个表达式都可以使用逗号表达式。(一般只在表达式1和表达式3使用)
- 循环体只能是一个语句,如果有多个语句要用花括号括起来变成复合语句。
#include"stdio.h"
int main()
{
//输出0-100,两个数之间用空格隔开
//int i=0是表达式1(为循环变量赋值),i<=100是表达式2(确定循环结束条件),i++是表达式3(确定循环步长,一般循环变量每次加1)
for(int i=0;i<=100;i++)
{
printf("%d ",i);
}
//表达式1和表达式3可以是逗号表达式
int a=0;
//在0到100中有多少对数相加为100
for(int i=0,j=100;i<j;i++,j--)
{
a++;
}
printf("%d\n",a);
return 0;
}
for的执行过程 :
1、执行表达式1获得循环变量的值。
2、执行表达式2,结果为假for循环不执行,为真执行循环体 。
3、循环体执行完后执行表达式3。
4、表达式3执行完后继续执行表达式2 。
也就是说表达式1执行后,只要表达式2的值为真,那么会按表达式2——循环体——表达式3——表达式2——循环体——表达式3…这种顺序一只执行下去,直到表达式2的值为假时结束for循环。
for语句中省略表达式
#include"stdio.h"
int main()
{
//省略for循环中的表达式
int i=0;//相当于for循环的表达式1
for(;;)
{
printf("%d ",i);
i++;//相当于for循环的表达式3
if(i>100)//相当于for循环的表达式2,不同的是这个if表达式为真时退出循环
{
break;//i大于100结束for循环
//注意这个break不是结束if语句而是结束这个if所在的循环。
}
}
return 0;
}
可以省略任何一个,也可以全部省略。(注意结束条件)
for的死循环
#include"stdio.h"
int main()
{
//要注意循环指定次数后,循环变量要不满足表达式2 的条件。(使表达式2的值为假,不然会死循环)
for(int i=0;i<=100;i--)
{//i只会越来越小,没有其他终止条件这个for将一直执行(死循环)
printf("%d ",i);
}
for(int i=1;i!=100;i+=2)
{//i永远不会等于100,
printf("%d ",i);
}
int a=0;
for(;;)
{//没有结束条件
printf("%d ",a);
a++;
}
return 0;
}
for循环的嵌套
for语句可以像if语句那样嵌套。
外层for循环每执行一次,内层的for语句要执行完(要执行指定的n次循环),外层for才能开始下一次执行。
#include"stdio.h"
int main()
{
for(int i=1;i<=10;i++)
{
//i=0时内层的for要执行1次
for(int j=1;j<=10;j++)
{//每次执行要循环10次
printf("%d ",i*j);
}
printf("\n");
}
return 0;
}
注意:外层循环变量和内层循环变量不能相同,内层循环表达式2和表达式3的循环变量不要写成外层循环的循环变量
外层的for循环要执行10次,内层的for也要执行10次,而外层for循环每执行1次,内层的for都要执行10次,循环总次数为10*10=100次。
for语句的嵌套建议不要超过3层,最多4层,否则代码可读性或很差差,循环时间也会呈几何增长。
while语句
while循环的一般格式:
while(循环条件表达式)
{
循环体语句
}
- 循环条件表达式一般是关系表达式或逻辑表达式,表达式为真执行循环体。
- 循环体超过一个语句时要用花括号括起来变成复合语句。
- while语句先判断循环条件表达式,条件为真执行,为假不执行。
- 注意循环条件,避免死循环。
#include"stdio.h"
int main()
{
int a=0;
while(a<=100)//关系表达式
{
printf("%d ",a);
a+=2;
}
return 0;
}
#include"stdio.h"
int main()
{
int a=20,b=50;
while(a<=30||b<=80)//逻辑表达式
{
printf("%d ",a);
a+=2;
b+=3;
}
return 0;
}
while的执行过程:
1、判断循环条件表达式否为真。(关系表达式或逻辑表达式)
2、表达式值为真执行循环体,为假循环结束。
3.循环体执行完继续判断表达式的值是否为真。
while循环更适合执行不知道循环次数的循环
#include"stdio.h"
int main()
{
//将一个整个的各个位上的数单独输出。
int a=12548468;
while(a>0)
{
printf("%d\n",a%10);
a/=10;
}
//输入一个整数,输出其各个位上的数。
int b;
scanf("%d",&b);//并不知道你输入的是几位数,无法确定循环次数
while(b>0)//(只知道循环条件不知道循环次数)
{
printf("%d\n",b%10);
b/=10;
}
return 0;
}
switch的嵌套
switch语句也可以向for语句那样嵌套。
#include"stdio.h"
int main()
{
int a=10;
switch(a--)
{
int b=10
switch(b--)//外层switch每执行一次,内层switch执行10次
{
}
}
return 0;
}
break语句和continue语句
break语句和continue语句用来打断一个循环结构的正常执行,break语句可以直接退出循环(直接让循环结束),continue语句可以让本次循环结束直接开始下一次循环(循环体中剩余的语句不参与执行直接开始下一次循环)
break语句多用于循环过程中有多个结束条件。
continue语句多用于循环过程中满足某些条件时,跳过这次循环。
break语句适用于循环结构和switch语句,continue语句只适用于循环结构。
break和continue配合if语句使用。
#include"stdio.h"
int main()
{
//在1-100中找到10个3的倍数
int a=0;
for(int i=1;i<=100;i++)
{
if(i%3==0)
{
printf("%d\n",i);
a++;//找到一个3的倍数a加1
}
if(a==10)//a等于10证明找到过10次
{//退出循环 (结束整个for循环)
break;
}
}
return 0;
}
#include"stdio.h"
int main()
{
//输出1-100中不能被10整除的数
int a=0;
for(int i=1;i<=100;i++)
{
if(i%10==0)
{//结束本次循环开始下一次循环(本次循环后面的代码不执行)
continue;
}
printf("%d ",i);
}
return 0;
}
do…while循环
do…while循环的一般形式:
do
{
循环体
}while(循环条件表达式);
do…while循环和while循环类似,不同的是while循环时先判断循环条件表达式,如果第一次条件表达式为假那么while循环一次也不执行(先判断后执行)。而do…while(); 循环是先执行循环体,然后判断条件表达式是否为真(先执行后判断)。在do…while中无论表达式的值是真是假,do…while循环都会执行一次(do…while循环至少执行一次)。
#include"stdio.h"
int main()
{
int a=20,b=20;
do
{
printf("a=%d\n",a);
a--;
}while(a>30);
//do...while循环至少执行一次
while(b>20)
{
printf("b=%d\n",b);
b--;
}
return 0;
}
for循环多用于已知循环次数的循环,while循环多用于只知道循环条件的循环(循环要满足关系表达式或逻辑表达式的条件)。do while循环并不常用。