循环语句
while循环
-
当型循环
while(表达式) { //循环体 }
do_while循环
- 无论条件满足与否,都会执行一次
do
{
}while(表达式);
//do-while 无论条件满足与否,都会执行一次
do
{
}while(0);
- while循环与do while 循环区别
- while循环有可能一次循环也不会执行,do while 循环不管怎么样都会执行一次循环
for循环
for(表达式1;表达式2;表达式3)
{
表达式4;
}
//for死循环
for(;;);
for(;1;);
for(;;)
-
for中() 三部分都可以省略 for(; ; ) (死循环)
-
执行顺序: 1 2 4 3 2 4 3 2 4 3
-
表达式1: 写条件的初始化
-
表达式2: 描述条件
-
表达式3: 改变循环条件,往不满足靠拢
-
案例
#include <stdio.h> int main() { //1+2+3+...100 int i = 0; int sum = 0; while (i <= 100) { sum += i; //sum=sum+i; //改变循环变量 -->往不满足条件的位置靠拢 i++; } printf("sum=%d\n", sum); return 0; }
-
跳转语句
-
continue: 结束本次循环,直接进入下一次循环,不能独立存在,只能存在循环中
-
break:直接跳出一层循环,当然也可以在switch中使用(跳出switch)
-
goto: 跳转到标签位置(仅限同一个函数中)
-
在程序描述循环时候,尽量不要使用goto
-
goto语句的嵌套会严重影响的代码可读性
-
在程序深层嵌套的时候,可以考虑使用goto
-
使用
//标签 //标识符: //goto 标签名; 跳到标签处
-
循环语句的使用
- 循环一般都是用来描述有规律的问题,比如推导公式类的和递推关系类的
- 数学问题
- 逻辑问题
//问题1:1!+2!+3!+4!+5! 阶乘
//0!=1
//x!=x(x-1)(x-2)...1;
//3!= 3*2*1;
#include <stdio.h>
int main()
{
int i = 0;
int temp = 1;
int iresult = 0;
for (i = 1; i <= 5; i++) //1 2 3 4 5
{
//i! 1!=1 2!=1!*2 3!=2!*3
temp *= i; //temp=1 temp=1*2 temp =1*2*3
printf("%d\t%d\n", temp, i);
iresult += temp;
}
printf("iresult=%d\n", iresult);
return 0;
}
//问题2:1/2+2/3+3/4+4/5
//n/n+1 ---> n<5
//n-1/n;
#include <stdio.h>
int main()
{
double result = (double)1 / 2 + (double)2 / 3 + (double)3 / 4 + (double)4 / 5;
printf("result=%.2lf\n", result);
result = 0.0;
for (int i = 1; i < 5; i++)
{
result += (double)i / (i + 1.0);
}
//i = 3; 错误 ,i作用域只能在for循环{}中使用
printf("result=%.2lf\n", result);
}
//问题3:求1+1/3+1/5+1/7+....+1/n 的和
#include <stdio.h>
int main() {
double s = 1.0;
int n, i = 3;
scanf("%d", &n);
//第一种方法
/*while (i <= n){
s += 1.0 / i;
i = i + 2;
}*/
//第二种方法
for (i = 3; i <= n; i += 2)
s += 1.0 / i;
printf("s=%.2f", s);
return 0;
}
循环嵌套
-
C语言任何循环之间都可以允许嵌套的,并且嵌套的层数没有限制,只要逻辑与语法上没有问题都可以
-
打印形状问题
- 外循环表示行,内循环表示列
- 打印倒三角形
#include <stdio.h> int main() { int i, j; for (i = 10; i >= 1; i--) { for (j = 1; j <= i; j++) printf("*"); printf("\n"); } }
-
打印正三角
-
#include <stdio.h> int main() { int i, j; for (i = 1; i <= 10; i++) { for (j = 1; j <= i; j++) printf("*"); printf("\n"); } }
-
打印等边三角形
#include <stdio.h> int main() { int i, j, k; for (i = 1; i <= 10; i++) { for (k = 15; k >= i; k--) printf(" "); for (j = 1; j <= 2 * i - 1; j++) printf("*"); printf("\n"); } }
-
打印菱形
#include <stdio.h> int main() { int i, j, k; for (i = 1; i <= 5; i++) { for (k = 10; k >= i; k--) printf(" "); for (j = 1; j <= 2 * i - 1; j++) printf("*"); printf("\n"); } for (i = 4; i >= 1; i--) { for (k = 10; k >= i; k--) printf(" "); for (j = 2 * i - 1; j >= 1; j--) printf("*"); printf("\n"); } }
- 外循环表示行,内循环表示列
-
求数之和
//求100以内能被3和5同时整除的数之和 int s = 0,i = 1; while (i <= 100){ if (i % 3 == 0 && i % 5 == 0){ s += i; } i++; printf("%d",s); } //s = 1-3+5-7+9-......+101 的和 #include <stdio.h> int main() { //第一种 /*int s = 0, i = 1, flag = 1; while (i <= 101){ s += flag * i; i += 2; flag = -flag; } printf("%d", s);*/ //第二种 /*int s = 0, s1 = 0, s2 = 0, i; for (i = 1; i <= 101; i += 4) s1 = s1 + i; for (i = -3; i >= -99; i -= 4) s2 += i; s = s1 + s2; printf("%d", s);*/ //第三种 int s = 0, a = 1, b = -3; while (a <= 97){ //a <= 101 s += a + b; a = a + 4; b += -4; } s += 101; // s += 103 printf("%d", s); }
-