2019-03-04 計算機(jī)二級C語言程序設(shè)計之課后習(xí)題(2)

參考資料:高教版《全國計算機(jī)等級考試二級教程——C語言程序設(shè)計》

P69 填空題

5.15

題目:

有以下程序段:

s = 1.0;

for( k = 1; k <= n; k++ )
    s = s + 1.0 / ( k * ( k + 1 ) );

printf( "%f\n", s );

請?zhí)羁眨瓜旅娴某绦蚨蔚墓δ芘c之完全等同。

s = 0.0;
[1];
k = 0;

do
{
    s = s + d;
    [2];
    d = 1.0 / ( k * ( k + 1 ) );
}
while([3]);

printf( "%f\n", s );

題解:

相比原來的程序段,給出的程序段缺少的部分應(yīng)實(shí)現(xiàn)的功能如下:

  1. 在第一次循環(huán)時使s = 1.0;

  2. 每循環(huán)一次,k加1;

  3. 判斷條件,即for語句中的k <= n這部分。

所以應(yīng)該這樣填寫:

  1. 觀察程序段發(fā)現(xiàn)沒有給d賦值,而且在第一次循環(huán)的時候要讓s = 1.0,所以[1]處應(yīng)該是d = 1.0;
  2. 在[2]處填寫k++實(shí)現(xiàn)每循環(huán)一次k加1的功能;
  3. 由于do-while循環(huán)的條件是:while后面的語句為真時,執(zhí)行循環(huán)體,所以[3]處直接填入k <= n。

最終的程序段如下:

s = 0.0;
d = 1.0;            //給變量d賦值1.0
k = 0;

do
{
    s = s + d;
    k++;            //每循環(huán)一次,k的值增加1
    d = 1.0 / ( k * ( k + 1 ) );
}
while( k <= n );    //判斷條件

printf( "%f\n", s );

5.16

題目:

以下程序的功能是:從鍵盤上輸入若干學(xué)生的成績,統(tǒng)計并輸出最高成績和最低成績,當(dāng)輸入負(fù)數(shù)時結(jié)束輸入。請?zhí)羁铡?/p>

(注:本人輕度代碼潔癖,所以稍微改下原題的代碼,最核心的部分沒動,只是改了空行,左花括號,縮進(jìn),main函數(shù)的寫法,加return 0等??傊牧艘膊挥绊戭}意,當(dāng)然如果介意的話可以私信我。)

#include <stdio.h>

int main( void )
{
    float x, amax, amin;
    
    scanf( "%f", &x );
    amax = x;
    amin = x;
    
    while( [1] )
    {
        if( x > amax )
            amax = x;
        if( [2] )
            amax = x;
        scanf( "%f", &x );
    }
    
    printf( "\namax = %f\namin = %f\n", amax, amin);
    
    return 0;
}

題解:

首先題目中提到“當(dāng)輸入為負(fù)數(shù)時結(jié)束輸入”,所以控制循環(huán)的表達(dá)式應(yīng)該有判斷輸入是否為負(fù)的情況。題目中還提到要輸出最低成績,所以應(yīng)該有判斷最低成績的語句。將實(shí)現(xiàn)這個功能的語句分別填到[1]和[2]處就可以了。

最終的程序如下:

#include <stdio.h>

int main( void )
{
    float x, amax, amin;
    
    scanf( "%f", &x );
    amax = x;
    amin = x;
    
    while( x >= 0 )     //判斷輸入是否為負(fù)數(shù),如果是就結(jié)束輸入
    {
        if( x > amax )
            amax = x;
        if( x < amin )  //記錄最低成績
            amax = x;
        scanf( "%f", &x );
    }
    
    printf( "\namax = %f\namin = %f\n", amax, amin);
    
    return 0;
}

P69 編程題

5.17

題目:

編寫程序,求1-3+5-7+……-99+101的值。

題解:

應(yīng)該設(shè)置一個變量k和一個變量j,每循環(huán)一次k的值加1,i的值加2,當(dāng)i大于101的時候退出循環(huán)。當(dāng)循環(huán)次數(shù)為奇數(shù)(即k的值為奇數(shù))時,j加i,當(dāng)循環(huán)次數(shù)為偶數(shù)(k的值為偶數(shù))時,j減i。

程序如下:

#include <stdio.h>

int main(void)
{
    int i = 1, j = 0, k = 1;
    
    //這個for循環(huán)用來計算表達(dá)式的值
    
    for( i = 1; i <= 101; i += 2 )  //每循環(huán)一次,i的值增加2,當(dāng)i大于101時結(jié)束循環(huán)
    {
        //循環(huán)次數(shù)為奇數(shù)時,j加i;循環(huán)次數(shù)為偶數(shù)時,j減i
        
        if (k % 2 == 0)
            j -= i;
        else
            j += i;

        k++;    //變量k用于計算循環(huán)次數(shù)
    }

    printf( "%d", j );

    return 0;
}

輸出:

51

5.18

題目:

編寫程序,求e的值,e≈1+1/1!+1/2!+1/3!+1/4!……

  1. 用for循環(huán),計算前50項(xiàng)。
  2. 用while循環(huán),要求直到最后一項(xiàng)的值小于10^-6。

題解:

這里還沒學(xué)到函數(shù)的遞歸調(diào)用,其實(shí)算階乘可以用函數(shù)的遞歸調(diào)用來實(shí)現(xiàn),但這里就根據(jù)章節(jié)和題目要求用循環(huán)來實(shí)現(xiàn)了。精度要求比較高,就使用double類型了。

第一問:

計算前五十項(xiàng),最后一項(xiàng)就是1/49!。因?yàn)楣降牡谝豁?xiàng)和第二項(xiàng)都是1,所以初始化變量的時候應(yīng)該讓e等于1。

程序如下:

#include <stdio.h>

int main(void)
{
    double e = 1, j = 1;    //公式中第一項(xiàng)為1,所以將e的值初始化為1

    //這個for循環(huán)用來計算階乘,進(jìn)而通過階乘的倒數(shù)的和估算e的值
    
    for (int i = 1; i <= 49; i++)
    {
        j = j * i;          //計算階乘
        e += 1 / j;         //通過計算階乘的倒數(shù)的和估算e的值
    }

    printf("%lf", e);
    
    return 0;
}

輸出:

2.718282

第二問:

要求使用while循環(huán),那么判斷條件就是最后一項(xiàng)的值小于10^6。

跟上一問差不多的辦法。

程序如下:

#include <stdio.h>

int main(void)
{
    double e = 1, j = 1, s = 0, i = 1;

    while ((1 / j) >= 1e-6) //判斷最后一項(xiàng)的精度是否小于10^-6
    {
        j = j * i;          //通過這一句和下面的"i++"計算階乘
        s = 1 / j;          //將階乘保存在變量中(這一句也可以不寫,把下一句改成“e += 1 / j就行”
        e += s;             //計算e的估計值
        i++;
    }

    printf("%lf", e);

    return 0;
}

輸出:

2.718282

5.19

題目:

編寫程序,輸出從公元2000年至公元3000年所有閏年的年號,每輸出10個年號換一行。判斷公元年是否為閏年的條件是:

  1. 公元年數(shù)如能被4整除,而不能被100整除,則是閏年。
  2. 公元年數(shù)能被400整除也是閏年。

題解:

使用for循環(huán),判斷年數(shù)是不是能被4整除且不能被100整除(可以被400整除的情況除外),如果是的話就輸出,同時定義一個變量記錄輸出的個數(shù),如果個數(shù)能被10整除就輸出一個回車符。

程序如下:

#include <stdio.h>

int main(void)
{
    int count = 0;
    for (int i = 2000; i <= 3000; i++)  //定義年份的范圍和循環(huán)的條件
    {   
        //判斷年份是否為閏年,如果是,輸出閏年的年份
        if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
        {
            printf("%d ", i);
            count++;

                if (count % 10 == 0)    //輸出10個年份之后輸出一個換行符
                    //還沒學(xué)到字符型的話可以用printf()函數(shù)來輸出,即printf("\n");
                    putchar('\n');
        }
    }

    return 0;
}

輸出:

2000 2004 2008 2012 2016 2020 2024 2028 2032 2036
2040 2044 2048 2052 2056 2060 2064 2068 2072 2076
2080 2084 2088 2092 2096 2104 2108 2112 2116 2120
2124 2128 2132 2136 2140 2144 2148 2152 2156 2160
2164 2168 2172 2176 2180 2184 2188 2192 2196 2204
2208 2212 2216 2220 2224 2228 2232 2236 2240 2244
2248 2252 2256 2260 2264 2268 2272 2276 2280 2284
2288 2292 2296 2304 2308 2312 2316 2320 2324 2328
2332 2336 2340 2344 2348 2352 2356 2360 2364 2368
2372 2376 2380 2384 2388 2392 2396 2400 2404 2408
2412 2416 2420 2424 2428 2432 2436 2440 2444 2448
2452 2456 2460 2464 2468 2472 2476 2480 2484 2488
2492 2496 2504 2508 2512 2516 2520 2524 2528 2532
2536 2540 2544 2548 2552 2556 2560 2564 2568 2572
2576 2580 2584 2588 2592 2596 2604 2608 2612 2616
2620 2624 2628 2632 2636 2640 2644 2648 2652 2656
2660 2664 2668 2672 2676 2680 2684 2688 2692 2696
2704 2708 2712 2716 2720 2724 2728 2732 2736 2740
2744 2748 2752 2756 2760 2764 2768 2772 2776 2780
2784 2788 2792 2796 2800 2804 2808 2812 2816 2820
2824 2828 2832 2836 2840 2844 2848 2852 2856 2860
2864 2868 2872 2876 2880 2884 2888 2892 2896 2904
2908 2912 2916 2920 2924 2928 2932 2936 2940 2944
2948 2952 2956 2960 2964 2968 2972 2976 2980 2984
2988 2992 2996

5.20

題目:

編寫程序,打印以下圖形:

   *
  ***
 *****
*******
 *****
  ***
   *

題解:

設(shè)行號為i,前四行每行輸出4-i個空格和2*i-1個星號;四行后重新把行號i設(shè)為1,后三行每行輸出i-1個空格和7-2*i個星號。

程序如下:

#include <stdio.h>

int main(void)
{
    int i = 0, j = 0, k = 0, l = 0;
    
    //打印前四行
    
    for ( i = 1; i <= 4; i++)
    {
        j = 4 - i;              //定義每行空格的數(shù)量
        l = 2 * i - 1;          //定義每行星號的數(shù)量

        for (k = 1; k <= j; k++)
            putchar(' ');       //每行打印4-i個空格
        for (k = 1; k <= l; k++)
            putchar('*');       //每行打印2*i-1個星號

        //還沒學(xué)到putchar()的話,可以用printf("*")來輸出
        
        putchar('\n');          //每行打印完成后,輸出一個換行符來換行
    }
    
    //重新計算行號,打印后四行
    
    for ( i = 1; i <= 3; i++)
    {
        j = 7 - 2 * i;          //定義每行星號的數(shù)量
        l = i - 1;              //定義每行空格的數(shù)量

        for (k = 0; k <= l; k++)
            putchar(' ');       //每行打印i-1個空格
        for (k = 0; k < j; k++)
            putchar('*');       //每行打印7-2*i個星號

        putchar('\n');          //換行
    }

    return 0;
}

輸出:

   *
  ***
 *****
*******
 *****
  ***
   *

P80 編程題

6.19

題目:

請編寫程序,輸入一行字符(用回車結(jié)束),輸出每個字符以及與之對應(yīng)的ASCII碼值,每行輸出三個。

題解:

char類型實(shí)際存儲的是ASCII碼,所以輸出對應(yīng)的ASCII碼值只需要在輸出時改變一下格式控制就可以。同時,還要設(shè)置一個計數(shù)變量,實(shí)現(xiàn)輸出三個之后換行的功能。

程序如下:

#include <stdio.h>

int main(void)
{
    char c;
    int i = 0;

    while ((c = getchar()) != '\n')     //判斷輸入的是否為換行符,如果是則結(jié)束輸入
    {
        printf("character: %c, ASCII: %d ", c, c);
        i++;                //計算輸出的數(shù)量
        if (i % 3 == 0)     //每輸出三個,換一行
            putchar('\n');
    }

    return 0;
}

輸入和輸出:

aqwsedrf
character: a, ASCII: 97 character: q, ASCII: 113 character: w, ASCII: 119
character: s, ASCII: 115 character: e, ASCII: 101 character: d, ASCII: 100
character: r, ASCII: 114 character: f, ASCII: 102

6.20

題目:

請編寫程序,輸入一行數(shù)字字符(用回車結(jié)束),每個數(shù)字字符的前后都有空格。請編程,把這一行中的數(shù)字轉(zhuǎn)換成一個整數(shù)。

樣例輸入:

2 4 8 3

樣例輸出:

2483

題解:

可以用getchar()的返回值是否為回車來判斷輸入結(jié)束,也可以判斷是否為空格,如果不是,則輸出。

程序如下:

#include <stdio.h>

int main(void)
{
    char c;

    while ((c = getchar()) != '\n')     //判斷輸入的是否為換行符,如果是則結(jié)束輸入
    {
        //判斷輸入的是否為空格,如果不是則輸出數(shù)字字符
        
        if ((c != ' '))
            putchar( c );
    }

    return 0;
}

輸入和輸出:

1  2  3  4
1234

6.21

題目:

請編寫程序統(tǒng)計輸入的行數(shù),用!號結(jié)束輸入,!號所在的行不計入行數(shù)。

題解:

跟上一題差不多,也是用一個while循環(huán)和一個if語句來實(shí)現(xiàn)。

程序如下:

#include <stdio.h>

int main(void)
{
    char c;
    int count = 0;                  //聲明一個計數(shù)的變量

    while ((c = getchar()) != '!')  //通過輸入是否為“!”來判斷是否結(jié)束輸入
    {   
        //統(tǒng)計換行符的個數(shù)
        
        if ((c == '\n'))
            count++;
    }

    printf("count = %d", count);    //輸出行數(shù)

    return 0;
}

輸入輸出:

a
b
c
d
e
!
count = 5

6.22

題目:

請編寫程序統(tǒng)計輸入的一行中小寫字母的個數(shù)。

題解:

判斷是否為小寫字母可以使用char類型,讀入字符的方法與上面兩題相同。

程序如下:

#include <stdio.h>

int main(void)
{
    char c;
    int count = 0;                      //聲明一個計數(shù)的變量

    while ((c = getchar()) != '\n')     //當(dāng)輸入換行符時,結(jié)束輸入
    {
        if (c >= 'a' && c <= 'z')       //判斷輸入的字符是否為小寫字母,并統(tǒng)計小寫字母的個數(shù)
            count++;
    }

    printf("count = %d", count);

    return 0;
}

輸入輸出:

AaBbCcDdEeFfGg
count = 7

6.23

題目:

請編寫輸出以下圖案的程序,圖案的行數(shù)由輸入的整數(shù)值確定(每行中字符之間沒有空格)

    A
   BBB
  CCCCC
 DDDDDDD
EEEEEEEEE

題解:

這道題跟上面那道畫菱形的有些相似,只是圖案的行數(shù)是通過輸入確定的,而且每一行的字符也不一樣。每輸出一行換一個字符可以通過將輸出的字符聲明為char類型,并且每循環(huán)一次將這個字符的值加1(實(shí)際上就是ASCII碼表中這個字符的下一個字符)來實(shí)現(xiàn)。

這道題的隱含條件應(yīng)該是行數(shù)是大于0小于26的,要不然就出Bug了……

程序如下:

#include <stdio.h>

int main(void)
{
    int i = 0, j = 0, k = 0, l = 0, m = 0;
    char c = 'A';                   //聲明要輸出的字符,并將其初始化為A

    scanf("%d", &j);                //輸入行數(shù)

    for (i = 1; i <= j; i++)
    {
        k = j - i;                  //定義每一行的空格數(shù)量
        l = 2 * i - 1;              //定義每一行的字符數(shù)量

        for (m = 1; m <= k; m++)
            putchar(' ');
        for (m = 1; m <= l; m++)
            putchar( c );
        c++;                        //每輸出一行,字符的值加1

        putchar('\n');
    }

    return 0;
}

輸入和輸出:

5
    A
   BBB
  CCCCC
 DDDDDDD
EEEEEEEEE
10
         A
        BBB
       CCCCC
      DDDDDDD
     EEEEEEEEE
    FFFFFFFFFFF
   GGGGGGGGGGGGG
  HHHHHHHHHHHHHHH
 IIIIIIIIIIIIIIIII
JJJJJJJJJJJJJJJJJJJ
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容