zoukankan      html  css  js  c++  java
  • 全国计算机等级考试二级教程-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 }
  • 相关阅读:
    【BZOJ2287】消失之物
    【NOI2001】炮兵阵地
    【SCOI2005】互不侵犯
    【USACO2007 nov glod】玉米田
    【NOIP模拟】航班
    【NOIP模拟】闲荡
    【NOIP模拟】军队调遣
    树形地铁系统
    矩阵
    完美的集合(题解)
  • 原文地址:https://www.cnblogs.com/denggelin/p/5379880.html
Copyright © 2011-2022 走看看