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

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

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)時(shí)使s = 1.0追迟;

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

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

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

  1. 觀察程序段發(fā)現(xiàn)沒有給d賦值桦沉,而且在第一次循環(huán)的時(shí)候要讓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后面的語句為真時(shí)剿骨,執(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)計(jì)并輸出最高成績和最低成績钞速,當(dāng)輸入負(fù)數(shù)時(shí)結(jié)束輸入贷掖。請?zhí)羁铡?/p>

(注:本人輕度代碼潔癖,所以稍微改下原題的代碼渴语,最核心的部分沒動(dòng)苹威,只是改了空行,左花括號(hào)驾凶,縮進(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ù)時(shí)結(jié)束輸入”且轨,所以控制循環(huán)的表達(dá)式應(yīng)該有判斷輸入是否為負(fù)的情況。題目中還提到要輸出最低成績虚婿,所以應(yīng)該有判斷最低成績的語句旋奢。將實(shí)現(xiàn)這個(gè)功能的語句分別填到[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è)置一個(gè)變量k和一個(gè)變量j玷过,每循環(huán)一次k的值加1爽丹,i的值加2筑煮,當(dāng)i大于101的時(shí)候退出循環(huán)。當(dāng)循環(huán)次數(shù)為奇數(shù)(即k的值為奇數(shù))時(shí)粤蝎,j加i真仲,當(dāng)循環(huán)次數(shù)為偶數(shù)(k的值為偶數(shù))時(shí),j減i初澎。

程序如下:

#include <stdio.h>

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

        k++;    //變量k用于計(jì)算循環(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),計(jì)算前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類型了公黑。

第一問:

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

程序如下:

#include <stdio.h>

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

    //這個(gè)for循環(huán)用來計(jì)算階乘,進(jìn)而通過階乘的倒數(shù)的和估算e的值
    
    for (int i = 1; i <= 49; i++)
    {
        j = j * i;          //計(jì)算階乘
        e += 1 / j;         //通過計(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++"計(jì)算階乘
        s = 1 / j;          //將階乘保存在變量中(這一句也可以不寫鸭廷,把下一句改成“e += 1 / j就行”
        e += s;             //計(jì)算e的估計(jì)值
        i++;
    }

    printf("%lf", e);

    return 0;
}

輸出:

2.718282

5.19

題目:

編寫程序枣抱,輸出從公元2000年至公元3000年所有閏年的年號(hào),每輸出10個(gè)年號(hào)換一行辆床。判斷公元年是否為閏年的條件是:

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

題解:

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

程序如下:

#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個(gè)年份之后輸出一個(gè)換行符
                    //還沒學(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è)行號(hào)為i闷沥,前四行每行輸出4-i個(gè)空格和2*i-1個(gè)星號(hào);四行后重新把行號(hào)i設(shè)為1咪鲜,后三行每行輸出i-1個(gè)空格和7-2*i個(gè)星號(hào)狐赡。

程序如下:

#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;          //定義每行星號(hào)的數(shù)量

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

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

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

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

    return 0;
}

輸出:

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

P80 編程題

6.19

題目:

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

題解:

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

程序如下:

#include <stdio.h>

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

    while ((c = getchar()) != '\n')     //判斷輸入的是否為換行符柳骄,如果是則結(jié)束輸入
    {
        printf("character: %c, ASCII: %d ", c, c);
        i++;                //計(jì)算輸出的數(shù)量
        if (i % 3 == 0)     //每輸出三個(gè)团赏,換一行
            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é)束)耐薯,每個(gè)數(shù)字字符的前后都有空格舔清。請編程,把這一行中的數(shù)字轉(zhuǎn)換成一個(gè)整數(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)計(jì)輸入的行數(shù)故响,用!號(hào)結(jié)束輸入纷捞,!號(hào)所在的行不計(jì)入行數(shù)。

題解:

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

程序如下:

#include <stdio.h>

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

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

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

    return 0;
}

輸入輸出:

a
b
c
d
e
!
count = 5

6.22

題目:

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

題解:

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

程序如下:

#include <stdio.h>

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

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

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

    return 0;
}

輸入輸出:

AaBbCcDdEeFfGg
count = 7

6.23

題目:

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

    A
   BBB
  CCCCC
 DDDDDDD
EEEEEEEEE

題解:

這道題跟上面那道畫菱形的有些相似捣染,只是圖案的行數(shù)是通過輸入確定的骄瓣,而且每一行的字符也不一樣。每輸出一行換一個(gè)字符可以通過將輸出的字符聲明為char類型耍攘,并且每循環(huán)一次將這個(gè)字符的值加1(實(shí)際上就是ASCII碼表中這個(gè)字符的下一個(gè)字符)來實(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市式曲,隨后出現(xiàn)的幾起案子妨托,更是在濱河造成了極大的恐慌,老刑警劉巖吝羞,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兰伤,死亡現(xiàn)場離奇詭異,居然都是意外死亡钧排,警方通過查閱死者的電腦和手機(jī)敦腔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卖氨,“玉大人会烙,你說我怎么就攤上這事⊥厕啵” “怎么了柏腻?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長系吭。 經(jīng)常有香客問我五嫂,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任沃缘,我火速辦了婚禮躯枢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘槐臀。我一直安慰自己锄蹂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般棒厘。 火紅的嫁衣襯著肌膚如雪欺缘。 梳的紋絲不亂的頭發(fā)上憔足,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死治宣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砌滞。 我是一名探鬼主播侮邀,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼布持!你這毒婦竟也來了豌拙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤题暖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后捉超,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胧卤,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年拼岳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枝誊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惜纸,死狀恐怖叶撒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耐版,我是刑警寧澤祠够,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站粪牲,受9級(jí)特大地震影響古瓤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一落君、第九天 我趴在偏房一處隱蔽的房頂上張望穿香。 院中可真熱鬧,春花似錦绎速、人聲如沸皮获。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魔市。三九已至,卻和暖如春赵哲,著一層夾襖步出監(jiān)牢的瞬間待德,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工枫夺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留将宪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓橡庞,卻偏偏與公主長得像较坛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子扒最,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容