全国计算机等级考试二级教程-C语言程序设计_第5章_循环结构


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 }
原文地址:https://www.cnblogs.com/denggelin/p/5379880.html