Linux嵌入式学习---c语言之循环结构
Linux嵌入式学习---c语言之循环结构一、while语句循环1.1一般形式1.2累加求和二、do...while语句循环2.1三、for语句循环3.1四、break和continu终止循环4.1三级目录在通常情况下,我们所写的程序,往往是重复的,我们可以重复写相同的程序段来实现要求,但显然是不现实的,工作量大,代码冗长且重复,对于阅读和维护都是困难的,因此高级语言提供了循环语句,来处理需要重复
Linux嵌入式学习---c语言之循环结构
在通常情况下,我们所写的程序,往往是重复的,我们可以重复写相同的程序段来实现要求,但显然是不现实的,工作量大,代码冗长且重复,对于阅读和维护都是困难的,因此高级语言提供了循环语句,来处理需要重复进行的操作。
一、while语句循环
1.1一般形式
while(表达式){
语句;
}
表达式的成立,则执行循环体语句,不成立就不执行循环体语句。
语句可以是一个语句,也可以是复合语句,语句块。
注意:while循环的特点是先判断条件表达式,后执行循环体语句。
1.2累加求和
例如:
求1+2+3+4+5…+100
思路:
- 累加100次,每次加一个数。
- 每次加的数是有规律的,后一个数是前一个数加一,所以不用scanf一个个的从键盘输入数字,而是在加完上一个数i后,使i加一就可以得到下一个数字
流程图:
代码:
#include <stdio.h>
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的初始值,不然结果是不正确的
二、do…while语句循环
2.1do…while语句一般形式
do
语句
while(语句);
2.2do…while语句特点
先无条件的执行循环体,然后判断条件是否成立。
先执行一次指定的循环体语句,然后判断表达式,当判断表达式的值为真时,返回重新执行循环体语句,如此反复,直到表达式的值为假为止,此时循环结束。
例:求1+2+3…+100的和
#include <stdio.h>
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循环语句:
表达式1;
while(表达式2)
{
语句;
表达式3;
}
也可以写成一下形式:
for(循环变量赋初值;循环条件;循环变量增值)
{
语句;
}
例如:
for(i = 1;i<100;i++)
{
sum = sum + i;
}
依然是求1+2+…+100的和
#include <stdio.h>
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,i赋值为1.
- 然后执行表达式2,判断i小于等于100吗?显然i是小于100的,逻辑成立。
- 则执行循环语句sum = sum + i;sum的值为1;
- 执行表达式3,i++;此时i的值变成了2;
- 转到步骤2继续判断。如果i++后的值为101则结束循环.
- 就直接跳到for语句下面的一条语句输出sum的值。
3.2for语句的细节问题处理
- 表达式1的语句是可以省略的,但是分号不可以省略。由于省略了表达式1,应该记得给表达式1赋初值。
int i = 1;//提前赋初值
for( ;i <= 100;i++)//没有表达式1
sum = sum +i;
- 表达式2也是可以省略的,就默认表达式2的值为真,一直循环
for(i = 1; ;i++)
sum = sum + i;
等价于:
int i = 0;
while(1)
{
sum = sum + i;
i++;
}
- 表达式3也是可以省略的,但是必须保证循环可以结束。
for(i = 1;i <= 100;)
{
sum = sum + i;
i++;//可以在循环体中是变量的值增加
}
- 也可以省略三个表达式,就没有什么实用价值了。
for(;;) printf("%d\n",i);
等价于:
while(1) printf("%d\n",i);
- 表达式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也可以是一个逗号表达式
- 表达式2一般是关系表达式,也可以是逻辑表达式,也可以是数值表达式,字符表达式,只要其值不为0即可。
for(i = 0;(c=getchar())!='\n';i+=c)
这个循环语句的意思是:从键盘输入一个字符,赋给C,只要c不等于’\n’就执行循环体,然后在i+=c;
作用:从键盘输入字符,对输入的字符的ASCII码进行累加,直到’\n’为止。
注意:
以上for循环为空语句,把循环体的内容放在了表达式3中。
也可以改为:
#include<stdio.h>
int main()
{
int i= 0;
int c;
for(;(c=getchar())!='\n';)
printf("%c",c);
}
运行结果:
四、三种循环的嵌套使用
一个循环体中又包含另外一个完整的循环结构,称为循环的嵌套。
- 例如:while…while的嵌套
while()
{
...
while()//内层循环
{
...
}
}
- do…while的嵌套循环
do
{
...
do//内层循环
{
...
}while();
}while();
- for循环的嵌套(经常使用)
for(;;)
{
for(; ;)//内层循环
{
...
}
}
- while和do…while循环
while()
{
'''
do
{
...
}while();
}
- for和while的循环
for(; ;)
{
...
while()
{
...
}
}
- do…while和for循环
do
{
for(;;)
{
...
}
}while();
五、break和continue
5.1break提前终止循环
break只能用于循环语句和switch语句中,而不能单独使用
break是跳出循环结构,结束循环。
如果是双重循环,内循环有break语句,是提前结束内循环。
例如:
有1000人进行募捐,当总数达到10万元的时候就结束,统计此时捐款的人数以及平均每人捐款的数目。
思路:
- 首先是循环的次数不能确定,可以设置为最大值,1000.
- 在循环体中统计募捐的总数,并且用if语句判断募捐总数是否大于10万元。如果大于10万元就结束循环,否则继续执行循环体。
#include<stdio.h>
int 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整除的数。
思路:
- 首先是要用循环,因为每一个数都要去除以3.
- 如果可以被3整除,则输出。
- 如果不能被3整除,则执行下次循环,不输出。
代码1:
#include<stdio.h>
int 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:
#include<stdio.h>
int main()
{
int i;
for(i = 100;i<=200;i++){
if(i%3 !=0 ) //对3取余如果不等于0,则执行打印输出
printf("%d ",i);
}
printf("\n");
return 0;
}
输出一下4*5的矩阵
1 2 3 4 5
2 4 6 8 1 0
3 6 9 12 15
4 8 12 16 20
思路:
- 首选这个得用循环来处理
- 定义两个变量,一个输出行i,一个输出列j。
- 在格式上,每行输出的是5个数据,输出5个数据就要换行
#include<stdio.h>
int 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;
}
如果在内循环体中加一句
if(i == 3 && j ==i) break;
#include<stdio.h>
int 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;
}
那如果改为continue结果会是怎么样的呢?
更多推荐
所有评论(0)