C流程控制——循环
一、定义
重复执行
二、分类
for 循环
while 循环
do while 循环
(一)for 循环
1. 执行顺序
执行顺序:
先执行1;再执行2;2如果成立、标志此次循环成立,进行此次循环。
此次循环执行:先执行4; 再执行3,3执行结束标志一次循环结束。
是否进行下次循环:先执行2,2如果成立,执行下次循环……
1 只执行1次 i=1;
2 执行5次,分别为 1<=4; 2<=4; 3<=4; 4<=4; 5<=4;
4 执行了4次,分别为:sum=0+1;sun=1+2;sum=3+3;sum=6+4;
3 执行4次,分别为 i=1+1;i=2+1;i+3+1;i+4+1;
2. 循环程序举例
-
用循环实现1-n之间所有奇数的和
```C int main() { int n; int sum = 0; int i; printf("请输入N的值:\n"); scanf("%d",&n); for (i=1;i<=n;i+=2) sum = sum +i; printf("%d之前所有奇数项的和为:%d\n",n,sum); return 0; } ```
-
求1-100之间所有能被3整除的数字之和
int main() { int n; int sum = 0; int i; printf("请输入N的值:\n"); scanf("%d",&n); for (i=3;i<=n;++i) { if(i%3==0) sum = sum +i; } printf("%d之前所有奇数项的和为:%d\n",n,sum); system("pause"); return 0; }
-
求 1 + 1/2 1/3 + 1/4 + …… + 1/99 + 1/100 的值
double sum = 0; int i; for (i=1;i<=100;++i) { sum = sum + (double)1/i; //这是第一种写法 //也可以写成:sum = sum + 1.0/i; //也可以写成:sum = sum + 1/(double)i; //不能写成:sum = sum + (double)(1/i); //如果不进行类型转换,输出结果就是1.0; } printf("sum= %lf\n", sum );
-
循环更新的部分为什么不能定义为浮点型?
因为浮点型数据不能准确存储 -
多层for循环
```
执行顺序:
1. 执行外层的1,再执行2;2成立,执行内层循环。
2. 执行内层循环体Ⅱ:
3. 内层循环先执行4,再执行5,5成立执行A;
4. 再执行6;
5. 再执行5,5成立执行A;
6. 再执行6;
7. 再执行5,5不成立跳出内层循环。
8. 执行外层循环,执行3;
9. 再执行3,2成立,再进入内层循环体Ⅱ(执行过程同上);
10. 再执行3;
11. 再执行2,2不成立,结束两层循环
12. 执行B
```
```C
例子1:
for (i=0;i<3;++i)
for(i=3;i<=5;++i)
printf("嘿嘿");
printf("哈哈");
// 输出结果
嘿嘿
嘿嘿
嘿嘿
哈哈
这里的内外层i 是一个i
例子2:
int i,j;
for (i=0;i<3;++i)
for(j=3;j<=5;++j)
printf("嘿嘿\n");
printf("哈哈\n");
// 输出结果
连续输出9个嘿嘿后,输出1个哈哈
例子3:
int main()
{
int i,j;
for(i=0;i<3;++i)
printf("嘿嘿!\n");
for(j=2;j<5;++j)
printf("哈哈!\n");
printf("嘻嘻!\n");
system("pause");
return 0;
}
//输出结果:
嘿嘿!
嘿嘿!
嘿嘿!
哈哈!
哈哈!
哈哈!
嘻嘻!
Press any key to continue . . .
```
(二)while 循环
1. 执行顺序
while(表达式)
语句A;
表达式成立,执行语句A,一直成立一直执行,不成立就不执行了。
默认只能控制一条语句。
//用 while 循环实现 1-100 的和
int main()
{
int i = 1;
int sum = 0;
while(i<101)
{
sum = sum+i;
i+=1;
}
printf("%d\n",sum);
system("pause");
return 0;
}
2. 与 for 的相互比较
for(1;2;3)
A;
//等价于:
1;
while(2)
{
A;
3;
}
可以看出,虽然两种循环方法都可以相互转化,但是for更具有逻辑性,不容易出错。
3. while 程序举例
例子1 :判断一个数字是否是回文数:正写倒写都一样,如121,1331 ……
int m ,val;
int sum = 0;
printf("请输入要判断的整数,按空格结束\n");
scanf("%d",&val)
m=val;
while(m)
{
sum = sum*10+m%10;
m/=10;
}
if(sum==val)
printf("Yes!\n");
else
printf("No!\n")
//第二种
int a;
printf("请输入一个整数:");
scanf("%d", &a);
int s = 0;
for(int i = 1; i <= a; i *= 10)
{
s = a%(10*i)/i + 10*s;
}
if(a == s)
printf("这个数是回文数\n");
else
printf("这个数不是回文数\n");
return 0;
例子2 :斐波拉契数列: 从第三项开始,后一项是前两项的和。1、 2 、 3 、 5、 8 、 13……
int main()
{
int n ;
int i;
int f1,f2,f3;
f1=1;
f2=2;
f3=3;
printf("请输入所要求的斐波那契数列的第N项,按空格结束\n");
scanf("%d",&n);
if(n<3)
printf("%d\n",n);
else
{
for (i = 3; i <= n; i++)
{
f3=f1+f2;
f1=f2;
f2=f3;
}
printf("%d\n",f3);
}
system("pause");
return 0;
}
4. for 与 while 的适宜情况
以后补充吧
(三)do …… while 循环
-
主要适用于人机交互
-
格式
do { 语句; } while(表达式);
-
do …… while 和 while 不可以相互转换
因为 while 先判断表达式是否成立,再执行语句
do …… while 先执行语句,再进行判断,也就是说至少执行一次。
而while 可能一次都不执行。 -
案例: 一元二次方程
#include <math.h> #include <stdio.h> int main() { double a, b, c; double delta; double x1, x2; char ch; do { printf("请输入一元二次方程的三个系数a,b,c\n"); printf("a="); scanf("%lf", &a); printf("\nb="); scanf("%lf", &b); printf("\nc="); scanf("%lf", &c); delta = b * b - 4 * a * c; if (delta > 0) { x1 = ((-b) + sqrt(delta)) / (2 * a); x2 = ((-b) - sqrt(delta)) / (2 * a); printf("\n该方程有两个不相同的实数解,分别是%lf,%lf\n", x1, x2); } else if (0 == delta) { x1 = ((-b) + sqrt(delta)) / (2 * a); printf("\n该方程有两个相同的实数解,x1=x2=%lf\n", x1); } else if (delta < 0) { printf("\n该方程有无解\n"); } else { printf("\nERROR"); } printf("请问您是否要继续[Y|N]\n"); scanf(" %c",&ch);//注意这里%c前必须有一个空格,否则就会出错! } while ('y' == ch || 'Y' == ch); return 0; }
三、break & continue
break
- break 如果用于循环时用来终止循环的
- break 如果用于switch,则是用于终止switch
switch(2)
{
case 2:
printf("哈哈\n");
break;
}
- break不能直接用于if,除非if属于循环内部的一个子句。
for(i=0;i<3;++i)
if(3>2)
break;
printf("heihie\n");
//break 虽然是if 的子句,但是用来终止的确实外部的for 循环
- break 用于多个for 循环
for(i=0;i<4;++i)
{
for(j=1;j<4;++j)
break;
printf("哈哈!\n")
}
//输出3个哈哈
//break 终止的是内重循环
//在多层循环中,break只能终止距离它最近的循环
在多层switch嵌套中,break只能终止距离它最近的一层switch
int main()
{
int x=1;
int y=1;
int a=0;
int b=0;
switch (x)
{
case 1:
switch (y)
{
case 1:
a++;
break; //终止的是内层的switch
case 2:
a*=3;
break;
}
b=100;
break; //终止的是外层的switch
case 2:
break;
default:
break;
}
printf("a=%d b=%d\n",a,b);
system("pause");
return 0;
}
//输出
a=1 b=100
continue
1. 作用
用于跳过本次循环余下的语句,转去判断是否需要执行下一次循环
2. 例子
for(1;2;3)
A;
B;
continue;
C;
D;
int i,j;
scanf("%d",&i)
while((ch = getchar()!='\n')
continue;
scanf("%d",&j)
//可以用来清除用户输入的非法字符