for循环结构的嵌套
外层循环每循环一次,内层循环会完整循环一次。
外层循环是竖。
内层循环是横。
for, do...while, while的选择:
如果有固定次数,如阶乘! ,判断素数,用 for
如果必须执行一次,用 do...while
其他情况用 while
判断某个数是否为素数,输出2~100之间的素数,用 for
输出前 n 个素数,用 while
做求和的程序时,记录结果的变量应该初始化为0,而做求积的变量时,记录结果的变量应该初始化为1
for (i = 0;i < n;++i)
则循环的次数是 n,而循环结束以后,i 的值是 n
输入一个整数 x,并输出其位数。
1 #include <stdio.h> 2 main() 3 { 4 int x; 5 int y, cnt = 0; 6 scanf("%d", &x); 7 8 if (x < 0) 9 { 10 y = -x; 11 } 12 else y = x; 13 14 do 15 { 16 y = y / 10; 17 cnt++; 18 } while (y > 0); 19 20 printf("%d", cnt); 21 }
多个 for 循环嵌套使用
1 #include <stdio.h> 2 main() 3 { 4 int i, j; 5 6 for (i = 0;i < 3;++i) 7 for (j = 2;j < 5;++j) 8 printf("呵呵 "); 9 printf("哈哈 "); 10 }
输出格式:
呵呵
呵呵
呵呵
呵呵
呵呵
呵呵
呵呵
呵呵
呵呵
哈哈
请按任意键继续. . .
1 #include <stdio.h> 2 main() 3 { 4 int i, j; 5 6 for (i = 0;i < 3;++i) 7 { 8 printf("A "); 9 for (j = 2;j < 5;++j) 10 { 11 printf("BB "); 12 printf("CCC "); 13 } 14 printf("DDDD "); 15 } 16 }
输出格式:
A
BB
CCC
BB
CCC
BB
CCC
DDDD
A
BB
CCC
BB
CCC
BB
CCC
DDDD
A
BB
CCC
BB
CCC
BB
CCC
DDDD
请按任意键继续. . .
while 和 for 的相互比较
while 和 for 可以相互转化,但是 for 的逻辑性更强,更不容易出错,推荐多使用 for
1 #include <stdio.h> 2 main() 3 { 4 for (1;2;3) 5 A; 6 7 //等价于 8 9 while (2) 10 { 11 A; 12 3; 13 } 14 }
从键盘输入一个数字,如果该数字是回文数,则返回yes,否则返回no
回文数:正写和倒写都一样
比如:121 12321 都是回文数
1 #include <stdio.h> 2 main() 3 { 4 int val; //存放待判断的数字 5 int m; 6 int sum = 0; 7 8 printf("请输入需要判断的数字:"); 9 scanf("%d", &val); 10 11 m = val; 12 while (m) 13 { 14 sum = sum * 10 + m % 10; 15 m /= 10; 16 } 17 18 if (sum == val) 19 printf("YES "); 20 else 21 printf("NO "); 22 }
求费波拉契序列
1 #include <stdio.h> 2 main() 3 { 4 int n; 5 int f1, f2, f3; 6 int i; 7 8 f1 = 1; 9 f2 = 2; 10 11 printf("请输入需要求的项的序列:"); 12 scanf("%d", &n); 13 14 if (1 == n) 15 { 16 f3 = 1; 17 } 18 else if (2 == n) 19 { 20 f3 = 2; 21 } 22 else 23 { 24 for (i = 3;i <= n;++i) 25 { 26 f3 = f1 + f2; 27 f1 = f2; 28 f2 = f3; 29 } 30 } 31 32 printf("%d", f3); 33 }
求一元二次方程
do-while 多用于人机交互,即:输入Y继续,输入N结束
1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { 5 double a, b, c; 6 double delta; 7 double x1, x2; 8 char ch; 9 10 do 11 { 12 printf("请输入一元二次方程的三个系数: "); 13 14 printf("a="); 15 scanf("%lf", &a); 16 17 printf("b="); 18 scanf("%lf", &b); 19 20 printf("c="); 21 scanf("%lf", &c); 22 23 delta = b*b - 4 * a*c; 24 25 if (delta > 0) 26 { 27 x1 = (-b + sqrt(delta)) / (2 * a); 28 x2 = (-b - sqrt(delta)) / (2 * a); 29 printf("有两个解,x1=%lf,x2=%lf", x1, x2); 30 } 31 else if (delta == 0) 32 { 33 x1 = x2 = (-b) / (2 * a); 34 printf("有唯一个解,x1=x2=%lf", x1); 35 } 36 else 37 { 38 printf("无实数解"); 39 } 40 41 printf("您想继续吗?(Y/N):"); 42 scanf(" %c", &ch); 43 } while ('y' == ch || 'Y' == ch); 44 }
switch 语句
1 #include <stdio.h> 2 main() 3 { 4 int val; 5 6 printf("请输入要进入的楼层:"); 7 scanf("%d", &val); 8 9 switch (val) 10 { 11 case 1:printf("1 "); 12 //break; 13 case 2:printf("2 "); 14 //break; 15 default:printf("null "); 16 //break; 17 case 3:printf("3 "); 18 //break; 19 } 20 }
输入3,输出格式:
请输入要进入的楼层:3
3
请按任意键继续. . .
输入4,输出格式:
请输入要进入的楼层:4
null
3
请按任意键继续. . .
break 和 continue
break 如果用于循环是用来终止循环。
break 如果用于switch ,则是用于终止 switch
break 不能直接用于 if ,除非 if 属于循环内部的一个子句
break 虽然是 if 内部的语句,但 break 终止的是外部的 for 循环
在多层循环中,break 只能终止距离它最近的循环
1 #include <stdio.h> 2 main() 3 { 4 int i, j; 5 6 for (i = 0;i < 3;++i) 7 { 8 for (j = 1;j < 4;++j) 9 break; //break 只能终止距离它最近的循环 10 printf("hello "); 11 } 12 }
for
计算1+1/2+1/3+...+1/100
这样有错误,因为i是整型常量,1/i也是整型常量,没有小数点
1 #include <stdio.h> 2 main() 3 { 4 int i; 5 double sum = 0; 6 7 for (i = 1;i <= 100;++i) 8 { 9 sum = sum + 1 / i; 10 } 11 12 printf("%f", sum); 13 }
强制类型转换,把整型i转换为实型常量
1 #include <stdio.h> 2 main() 3 { 4 int i; 5 double sum = 0; 6 7 for (i = 1;i <= 100;++i) 8 { 9 sum = sum + 1 / (double)(i); //强制类型转换,把整型i转换为实型常量 10 } 11 12 printf("%f", sum); 13 }
更为简单的方法,推荐使用
1 #include <stdio.h> 2 main() 3 { 4 int i; 5 double sum = 0; 6 7 for (i = 1;i <= 100;++i) 8 { 9 sum = sum + 1.0 / i; 10 } 11 12 printf("%f", sum); 13 }
如何用1角,2角和5角的硬币凑出10元以下的金额?
1 #include <stdio.h> 2 main() 3 { 4 int x; 5 int one, two, five; 6 7 scanf("%d", &x); 8 for (one = 1;one < x * 10;one++) 9 { 10 for (two = 1;two < x * 10 / 2;two++) 11 { 12 for (five = 1;five < x * 10 / 5;five++) 13 { 14 if (one + two * 2 + five * 5 == x * 10) 15 { 16 printf("可以用%d个1角加%d个2角加%d个5角得到%d元 ", one, two, five, x); 17 } 18 } 19 } 20 } 21 }
1求1^2+2^2+3^2+...+n^2,直到累加和大于或等于10000为止。
1 #include <stdio.h> 2 main() 3 { int i, sum; 4 i = 0; sum = 0; /*i和sum的初值为0*/ 5 while (sum < 10000) /*当sum小于10000时执行循环体*/ 6 { sum = sum + i*i; /*sum累加i的平方*/ 7 i = i + 1; /*在循环体中每累加一次后,i增1*/ 8 } 9 printf("n=%d sum=%d ", i - 1, sum); 10 }
2用pi/4=1-1/3+1/5-1/7+1/9-....公式计算pi的近似值,直到最后一项的绝对值小于10^(-6)为止。
1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { int s; 5 float n, t, pi; 6 t = 1.0; 7 pi = 0; 8 n = 1.0; 9 s = 1; 10 while (fabs(t)>=1e-6) 11 { pi = pi + t; 12 n = n + 2.0; 13 s = -s; 14 t = s / n; 15 } 16 pi = 4 * pi; 17 printf("pi=%f ", pi); 18 }
3用迭代法求方程x=cos x的根,要求误差小于10^(-6)
1使x1=0, x2=cos x1
2判|x2-x1|<10^(-6),若x2-x1的绝对值小于10^(-6),则执行x1=x2,重复执行步骤1;否则执行步骤3
3计算结束,输出结果
1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { double x1, x2; 5 x1 = 0.0; 6 x2 = cos(x1); 7 while (fabs(x2 - x1) > 1e-6) 8 { x1 = x2; 9 x2 = cos(x1); 10 } 11 printf("x=%f ", x2); 12 }
4计算费波纳Fibonacci数列,直到某项大于1000为止,并输出该项的值
费波纳Fibonacci数列:f1=0, f2=1, f3=1, f4=2, f5=3, ..., fn=f(n-2)+f(n-1)
f=f1+f2; f1=f2; f2=f
4.1 do-while 语句
1 #include <stdio.h> 2 main() 3 { 4 int f1, f2, f; 5 f1 = 0; 6 f2 = 1; 7 do 8 { 9 f = f1 + f2; 10 f1 = f2; 11 f2 = f; 12 } while (f2 <= 1000); 13 printf("F=%d ", f2); 14 }
4.2 for 语句
1 #include <stdio.h> 2 main() 3 { int f1, f2, f, i; 4 f1 = 0; 5 f2 = 1; 6 for (i = 1;f2 <= 1000;i++) 7 { f = f1 + f2; 8 f1 = f2; 9 f2 = f; 10 } 11 printf("%d", f); 12 }
5求1+2+3+...+100。
for 语句
1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { 5 int i, sum; 6 sum = 0; /*sum的初值为0*/ 7 for (i = 1;i <= 100;i++) /*当i小于或等于100时执行循环体*/ 8 sum = sum + i; /*在循环体中累加i一次*/ 9 printf("sum=%d ", sum); 10 }
6计算半径为0.5mm, 1.0mm, 1.5mm, 2.0mm, 2.5mm时的圆面积。
for 语句
1 #include <stdio.h> 2 #include <math.h> 3 main() 4 { 5 double r, s, Pi = 3.1416; 6 for (r = 0.5;r <= 2.5;r = r + 0.5) 7 { 8 s = Pi*r*r; 9 printf("r=%3.1f s=%f ", r, s); 10 } 11 }
7找出2~100以内的所有质数(素数)。(考点)
1 #include <stdio.h> 2 main() 3 { 4 int x, i, isprime; 5 for (x = 2;x < 100;x++) 6 { 7 isprime = 1; /* 每次判断,先默认其是素数 */ 8 for (i = 2;i < x / 2;i++) 9 { 10 if (x%i == 0) 11 { 12 isprime = 0; 13 break; 14 } 15 } 16 if (isprime == 1) 17 { 18 printf("%d,", x); 19 } 20 } 21 }
8输入某个数,判断是否为素数。(考点)
1 #include <stdio.h> 2 main() 3 { 4 int x, i, isprime; 5 scanf("%d", &x); 6 7 for (i = 2;i < x / 2;++i) 8 { 9 isprime = 1; 10 if (x%i == 0) 11 { 12 isprime = 0; 13 break; 14 } 15 } 16 if (isprime == 1) 17 { 18 printf("YES "); 19 } 20 else printf("NO "); 21 }
8.1 输入一个数 n,输出前 n 个素数。(考点)
1 #include <stdio.h> 2 main() 3 { 4 int x = 2, cnt = 0, tag, i; 5 int n; 6 scanf("%d", &n); 7 8 while (cnt < n) 9 { 10 tag = 1; 11 for (i = 2;i <= x / 2;i++) 12 { 13 if (x%i == 0) 14 { 15 tag = 0; 16 break; 17 } 18 } 19 if (tag == 1) 20 { 21 printf("%d,", x); 22 cnt++; 23 } 24 x++; 25 } 26 }
9计算1+2+3+...+i,直到累加到s大于5000为止,并给出s和i的值。
break 语句
1 #include <stdio.h> 2 main() 3 { 4 int i, s; 5 s = 0; 6 for (i = 1;; i = i + 1) 7 { 8 s = s + i; 9 if (s > 5000) break; 10 } 11 printf("s=%d,i=%d", s, i); 12 }
10 把100~200之间不能被3整除的所有数输出
continue 语句
1 #include <stdio.h> 2 main() 3 { 4 int i; 5 for (i = 100; i <= 200; i++) 6 { 7 if (i % 3 == 0) continue; 8 printf("%d,", i); 9 } 10 }
11求1-3+5-7+...-99+101的值。
11.1 for 语句
1 #include <stdio.h> 2 main() 3 { 4 int i, j, sum; 5 j = 1; 6 sum = 0; 7 for (i = 1; i <= 101; i = i + 2) 8 { 9 sum = sum + i*j; 10 j = (-1)*j; 11 } 12 printf("%d", sum); 13 }
11.2 while 语句
1 #include <stdio.h> 2 main() 3 { 4 int i, j, sum; 5 i = 1; 6 j = 1; 7 sum = 0; 8 while (i <= 101) 9 { 10 sum = sum + i*j; 11 j = (-1)*j; 12 i = i + 1; 13 } 14 printf("%d", sum); 15 }
11.3 do-while 语句
1 #include <stdio.h> 2 main() 3 { 4 int i, j, sum; 5 i = 1; 6 j = 1; 7 sum = 0; 8 do { 9 sum = sum + i*j; 10 i = i + 2; 11 j = (-1)*j; 12 } while (i <= 101); 13 printf("%d", sum); 14 }
12求e的值,e=1+1/(1!)+1/(2!)+1/(3!)+1/(4!)+...
12.1用 for 循环,计算前50项。
1 #include <stdio.h> 2 main() 3 { 4 double n, e; 5 int i; 6 e = 1; 7 n = 1; 8 for (i = 1;i <= 49;i = i + 1) 9 { 10 n = n*i; 11 e = e + 1 / n; 12 } 13 printf("e=%lf ", e); 14 }
12.2用 while 循环,要求直至最后一项的值小于10^(-6)。
1 #include <stdio.h> 2 main() 3 { 4 double n, e; 5 int i; 6 e = 1.0; 7 n = 1.0; 8 i = 1; 9 while (1 / n >= 10e-6) 10 { 11 n = n*i; 12 e = e + 1 / n; 13 i = i + 1; 14 } 15 printf("%lf", e); 16 }
13输出从公元2000年至公元3000年所有闰年的年号,每输出10个年号换一行。判断公元年是否为闰年的条件是:(1)公元年数如能被4整除,而不能被100整除的,则是闰年。(2)公元年数能被400整除也是闰年。
13.1 for 语句
1 #include <stdio.h> 2 main() 3 { 4 int i, n; 5 n = 0; 6 for (i = 2000;i <= 3000;i = i + 1) 7 if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) 8 { 9 printf("%d ", i); 10 n = n + 1; 11 if (n % 10 == 0) printf(" "); 12 } 13 }
13.2 while 语句
1 #include <stdio.h> 2 main() 3 { 4 int i, n; 5 n = 0; 6 i = 2000; 7 while (i <= 3000) 8 { 9 if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) 10 { 11 printf("%d ", i); 12 n = n + 1; 13 if (n % 10 == 0) printf(" "); 14 } 15 i = i + 1; 16 } 17 }
13.3 do-while 语句
1 #include <stdio.h> 2 main() 3 { 4 int i, n; 5 n = 0; 6 i = 2000; 7 do 8 { 9 if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) 10 { 11 printf("%d ", i); 12 n = n + 1; 13 if (n % 10 == 0) printf(" "); 14 } 15 i = i + 1; 16 } 17 while (i <= 3000); 18 }
14输入n,求1+1/2+1/6+1/12+...+1/[n+(n+1)]
1 #include <stdio.h> 2 main() 3 { 4 double s; 5 int n, k; 6 s = 1.0; 7 scanf("%d", &n); 8 for (k = 1;k <= n;k++) 9 { 10 s = s + 1.0 / (k*(k + 1)); 11 } 12 printf("s=%f", s); 13 }