> 文档中心 > Linux嵌入式学习---c语言之循环结构

Linux嵌入式学习---c语言之循环结构

Linux嵌入式学习---c语言之循环结构

  • 一、while语句循环
    • 1.1一般形式
    • 1.2累加求和
  • 二、do...while语句循环
    • 2.1do....while语句一般形式
    • 2.2do....while语句特点
  • 三、for语句循环
    • 3.1for语句的一般形式
    • 3.2for语句的细节问题处理
  • 四、三种循环的嵌套使用
  • 五、break和continue
    • 5.1break提前终止循环
    • 5.2continue语句是提前结束本次循环

在通常情况下,我们所写的程序,往往是重复的,我们可以重复写相同的程序段来实现要求,但显然是不现实的,工作量大,代码冗长且重复,对于阅读和维护都是困难的,因此高级语言提供了循环语句,来处理需要重复进行的操作。

一、while语句循环

1.1一般形式

while(表达式){语句;}

表达式的成立,则执行循环体语句,不成立就不执行循环体语句。
语句可以是一个语句,也可以是复合语句,语句块。
注意:while循环的特点是先判断条件表达式,后执行循环体语句。

1.2累加求和

例如:
求1+2+3+4+5…+100

思路:

  1. 累加100次,每次加一个数。
  2. 每次加的数是有规律的,后一个数是前一个数加一,所以不用scanf一个个的从键盘输入数字,而是在加完上一个数i后,使i加一就可以得到下一个数字

流程图:

在这里插入图片描述
代码:

#include int main(){int i = 1;//定义初始变量 int sum = 0;while(i<=100){//当i>100时,判断条件为假,跳出循环 sum = sum + i;//第一次累加后sum的值为1 i++;//加完后,i的值加一,为下一次的累加做准备 } printf("sum=%d\n",sum);//输出1+2+3+....+100的累加和 return 0;}

注意:
这里不能忽视i和sum的初始值,不然结果是不正确的
Linux嵌入式学习---c语言之循环结构

二、do…while语句循环

2.1do…while语句一般形式

do语句while(语句)

2.2do…while语句特点

先无条件的执行循环体,然后判断条件是否成立。
先执行一次指定的循环体语句,然后判断表达式,当判断表达式的值为真时,返回重新执行循环体语句,如此反复,直到表达式的值为假为止,此时循环结束。

例:求1+2+3…+100的和

#include int main(){int i = 1;//定义初始变量 int sum = 0;do{sum = sum + i;//第一次累加后sum的值为1 i++;//加完后,i的值加一,为下一次的累加做准备 }while(i<=100)printf("sum=%d\n",sum);//输出1+2+3+....+100的累加和 return 0;}

不难看出,do…while和while处理同一问题的时候,若二者的循环体部分一样,那么结果也是一样的。

三、for语句循环

for循环语句可以用来代替while语句,for语句,可以

3.1for语句的一般形式

for(表达式1;表达式2;表达式3){循环语句;}

表达式1执行一次,一般为初始条件;
表达式2是循环结束的条件,如果成立,则执行循环语句;
表达式3是循环变量增值的语句,在执行完循环语句后才进行。

等价于while循环语句:

表达式1while(表达式2){语句;表达式3}

也可以写成一下形式:

for(循环变量赋初值;循环条件;循环变量增值){语句;}

例如:

for(i = 1;i<100;i++){sum = sum + i;}

依然是求1+2+…+100的和

#include int main(){int i ;//定义初始变量 int sum = 0;for(i = 1;i<=100;i++){sum = sum + i;}printf("sum=%d\n",sum);//输出1+2+3+....+100的累加和 return 0;}

执行顺序如下:

  1. 求解表达式1,i赋值为1.
  2. 然后执行表达式2,判断i小于等于100吗?显然i是小于100的,逻辑成立。
  3. 则执行循环语句sum = sum + i;sum的值为1;
  4. 执行表达式3,i++;此时i的值变成了2;
  5. 转到步骤2继续判断。如果i++后的值为101则结束循环.
  6. 就直接跳到for语句下面的一条语句输出sum的值。

3.2for语句的细节问题处理

  1. 表达式1的语句是可以省略的,但是分号不可以省略。由于省略了表达式1,应该记得给表达式1赋初值
int i = 1//提前赋初值for( ;i <= 100;i++)//没有表达式1sum  = sum +i;
  1. 表达式2也是可以省略的,就默认表达式2的值为真,一直循环
for(i = 1; ;i++)sum = sum + i;

等价于:

int i  = 0;while(1){sum = sum + i;i++;}
  1. 表达式3也是可以省略的,但是必须保证循环可以结束
for(i = 1;i <= 100;){sum = sum + i;i++;//可以在循环体中是变量的值增加}
  1. 也可以省略三个表达式,就没有什么实用价值了。
for(;;) printf("%d\n",i);

等价于:

while(1) printf("%d\n",i);
  1. 表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式,表达式3也可以是其他表达式。表达式1和表达式3也可以是逗号表达式。只要可以是for循环正常执行就可以
for(sum = 0;i <= 100;i++) sum  = sum + i;//表达式1设置其他的表达式for(sum = 0,i= 1;i <= 100;i++)//表达式1也可以是一个逗号表达式for(i=0,j=100;i<=j;i++,j--)//表达式3也可以是一个逗号表达式
  1. 表达式2一般是关系表达式,也可以是逻辑表达式,也可以是数值表达式,字符表达式,只要其值不为0即可。
for(i = 0;(c=getchar())!='\n';i+=c)

这个循环语句的意思是:从键盘输入一个字符,赋给C,只要c不等于’\n’就执行循环体,然后在i+=c;
作用:从键盘输入字符,对输入的字符的ASCII码进行累加,直到’\n’为止。

注意:
以上for循环为空语句,把循环体的内容放在了表达式3中。
也可以改为:

#includeint main(){int i= 0;int c;for(;(c=getchar())!='\n';)printf("%c",c); } 

运行结果:

Linux嵌入式学习---c语言之循环结构

四、三种循环的嵌套使用

一个循环体中又包含另外一个完整的循环结构,称为循环的嵌套。

  1. 例如:while…while的嵌套
while(){...while()//内层循环{...}}
  1. do…while的嵌套循环
do{...do//内层循环{...}while();}while();
  1. for循环的嵌套(经常使用)
for(;;){for(; ;)//内层循环{...}}
  1. while和do…while循环
while(){'''do{...}while();}
  1. for和while的循环
for(; ;){...while(){...}}
  1. do…while和for循环
do{for(;;){...}}while();

五、break和continue

5.1break提前终止循环

break只能用于循环语句和switch语句中,而不能单独使用

break是跳出循环结构,结束循环。
如果是双重循环,内循环有break语句,是提前结束内循环。

例如:

有1000人进行募捐,当总数达到10万元的时候就结束,统计此时捐款的人数以及平均每人捐款的数目。

思路:

  1. 首先是循环的次数不能确定,可以设置为最大值,1000.
  2. 在循环体中统计募捐的总数,并且用if语句判断募捐总数是否大于10万元。如果大于10万元就结束循环,否则继续执行循环体。
#includeint main(){int i ;//定义循环变量 ,计算统计人数 float sum;//捐款数float aver;//用来计算平均值float total = 0;//存放累加后的捐款总数,这里要定义初值,否则初始值是随机的 for(i = 1;i<=1000;i++){printf("please enter sum:");scanf("%f",&sum);total = total + sum; if(total >= 100000){break;} }aver = total / i;printf("捐款人数=%d,平均捐款数=%f",i,aver);return 0;   } 

在这里插入图片描述

5.2continue语句是提前结束本次循环

continue是结束本次循环,在continue下面的语句是不能执行的,并不是终止循环,而是执行下一次的循环

如果是双重循环,内循环有continue语句,是跳转到内循环体之外,执行内循环体下面的语句(即外循环的语句)

要求输出100~200不能被3整除的数。
思路:

  1. 首先是要用循环,因为每一个数都要去除以3.
  2. 如果可以被3整除,则输出。
  3. 如果不能被3整除,则执行下次循环,不输出。

代码1:

#includeint main(){int i;for(i = 100;i<=200;i++){if(i%3 ==0 )//对3取余,如果余数为0,表达式为真     continue;//执行continue语句,此时就不执行printf,而是i++ printf("%d ",i);//对3取余如果不等于0,则执行打印输出 }printf("\n");return 0;  } 

也可以不用continue语句
代码2:

#includeint main(){int i;for(i = 100;i<=200;i++){if(i%3 !=0 )//对3取余如果不等于0,则执行打印输出 printf("%d ",i);}printf("\n");return 0;  } 

Linux嵌入式学习---c语言之循环结构

输出一下4*5的矩阵
1 2 3 4 5
2 4 6 8 1 0
3 6 9 12 15
4 8 12 16 20

思路:

  1. 首选这个得用循环来处理
  2. 定义两个变量,一个输出行i,一个输出列j。
  3. 在格式上,每行输出的是5个数据,输出5个数据就要换行
#includeint main(){int i;//定义行int j;//定义列int n = 0;//用来累计输出数据的个数 for(i = 1;i <= 4;i++){//当i为第1行的时候,先把第1行的元素打印完后在i++ for(j = 1;j <= 5;j++)//输出每一行的元素 {if(n%5 == 0){printf("\n"); }n++; printf("%d\t",i*j);//输出每一个元素的值 ,\t表示将光标位置移到下一个TAB的位置 }} printf("\n");return 0;  } 

Linux嵌入式学习---c语言之循环结构

如果在内循环体中加一句
if(i == 3 && j ==i) break;

#includeint main(){int i;//定义行int j;//定义列int n = 0;//用来累计输出数据的个数 for(i = 1;i <= 4;i++){for(j = 1;j <= 5;j++)//输出每一行的元素 {if(n%5 == 0){printf("\n"); }n++; if(i == 3 && j ==1) break;//遇到地3行第1列就跳出内循环//进入下一次的外循环,即第四次外循环printf("%d\t",i*j);//输出每一个元素的值 ,\t表示将光标位置移到下一个TAB的位置 }} printf("\n");return 0;  } 

Linux嵌入式学习---c语言之循环结构

那如果改为continue结果会是怎么样的呢?

Linux嵌入式学习---c语言之循环结构