《C語言程序設(shè)計》(譚浩強(qiáng)第五版) 第3章 最簡單的的C程序設(shè)計——順序程序設(shè)計 習(xí)題解析與答案

你也可以上程序咖(https://meta.chengxuka.com),打開大學(xué)幕題板塊,不但有答案,講解,還可以在線答題。

WX20220412-135428@2x.png

題目1:假如我國國民生產(chǎn)總值的年增長率為7%,計算10年后我國國民生產(chǎn)總值與現(xiàn)在相比增長多少百分比。計算公式為:
p=(1+r)^n

r 為年增長率,n 為年數(shù),p為與現(xiàn)在相比的倍數(shù)。

解:從主教材附錄D(庫函數(shù))可以查到:可以用pow函數(shù)求y^x的值,調(diào)用pow函數(shù)的具體形式是pow(x,y)。在使用pow函數(shù)時需要在程序的開頭用# include指令將<math.h>頭文件包含到本程序模塊中??梢杂孟旅娴某绦蚯蟪?0年后國民生產(chǎn)總值是現(xiàn)在的多少倍。

答案代碼:

#include <stdio.h>
#include <math.h>
int main()
{
    float p, r, n;
    r = 0.07;
    n = 10;
    p = pow(1 + r, n);
    printf("p= %f\n", p);
    return 0;
}

運行結(jié)果:

WX20220321-160340@2x.png

即10年后國民生產(chǎn)總值是現(xiàn)在的1.967151倍。

題目2:存款利息的計算。有1000元,想存5年,可按以下5種辦法存:

(1) 一次存5年期。

(2) 先存2年期,到期后將本息再存3年期。

(3) 先存3年期,到期后將本息再存2年期。

(4) 存1年期,到期后將本息再存1年期,連續(xù)存5次。

(5) 存活期存款?;钇诶⒚?季度結(jié)算一次。

2017年的銀行存款利息如下:

1年期定期存款利息為1.5%;

2年期定期存款利息為2.1%;

3年期定期存款利息為2.75%;

5年期定期存款利息為3%;

活期存款利息為0.35%(活期存款每一季度結(jié)算一次利息)。

如果 r 為年利率,n 為存款年數(shù),則計算本息和的公式如下:

1年期本息和: P=1000* (1+r)

n年期本息和: P=1000* (1+n* r);
存n次1年期的本息和:P=1000* (1+r)^n;

說明: 1000*(1+\frac{r}{4}) 是一個季度的本息和。

解:設(shè)5年期存款的年利率為r5,3年期存款的年利率為r3,2年期存款的年利率為r2,1年期存款的年利率為rl,活期存款的年利率為r0。

設(shè)按第1種方案存款5年得到的本息和為p1,按第2種方案存款5年得到的本息和為p2,按第3種方案存款5年得到的本息和為p3,按第4種方案存款5年得到的本息和為p4,按第5種方案存款5年得到的本息和為p5。

答案代碼:

#include <stdio.h>
#include <math.h>
int main()

{
    float r5, r3, r2, r1, r0, p, p1, p2, p3, p4, p5;
    p = 1000;
    r5 = 0.03;
    r3 = 0.0275;
    r2 = 0.021;
    r1 = 0.015;
    r0 = 0.0035;
    p1 = p * (1 + r5 * 5);                //一次存5年期
    p2 = p * (1 + 2 * r2) * (1 + 3 * r3); //先存2年期,到期后將本息再存3年期
    p3 = p * (1 + 3 * r3) * (1 + 2 * r2); //先存3年期,到期后將本息再存2年期
    p4 = p * pow(1 + r1, 5);              //存1年期,到期后將本息再存1年期,連續(xù)存5次
    p5 = p * pow(1 + r0 / 4, 4 * 5);      //存活期存款,活期利息每一季度結(jié)算一次
    printf("p1= %f\n", p1);               //輸出按第1種方案得到的本息和
    printf("p2= %f\n", p2);               //輸出按第2種方案得到的本息和
    printf("p3= %f\n", p3);               //輸出按第3種方案得到的本息和
    printf("p4= %f\n", p4);               //輸出按第4種方案得到的本息和
    printf("p5= %f\n", p5);               //輸出按第5種方案得到的本息和
    return 0;
}

運行結(jié)果:

WX20220322-092435@2x.png

討論:
(1) 程序在編譯時出現(xiàn)警告(warning),并告知原因是“‘=': truncation from ' const double ' to 'float'”(在執(zhí)行賦值時,出現(xiàn)將雙精度常量轉(zhuǎn)換為單精度的情況)。這是由于VisualC++6.0在編譯時把實常數(shù)(如程序中的利率)全部按雙精度數(shù)處理,因此在向r5,r3等float型變量賦值時,就出現(xiàn)將雙精度數(shù)賦給單精度變量的情況,這樣可能會損失一些精度,故向用戶提醒,請用戶考慮是否要修改。警告只是提醒,程序可以正常運行,但得到的結(jié)果可能會出現(xiàn)一些誤差,如果用戶認(rèn)為誤差可以容忍,可不理會警告,繼續(xù)進(jìn)行連接和運行。

(2) 如果不想出現(xiàn)上面的警告,可以將第4行各變量改為double型,即

double r5,r3,r2 ,r1,r0,p,p1 ,p2 ,p3,p4,p5;

由于采用了雙精度變量,得到的運算結(jié)果會更精確些,最后幾位數(shù)字與上面的有些差別。

WX20220322-093327@2x.png

(3) 輸出運行結(jié)果時,得到6位小數(shù),連同整數(shù)部分有10 位數(shù)字,而一個float 型變量只能保證6位有效數(shù)字,后面幾位是無意義的。而且在輸出款額時,入們一般只要求精確到兩位小數(shù)(角、分),因此可以在printf 函數(shù)中用%10.2格式符輸出。最后5個語句可改為

    printf("p1=%10.2f\n", p1); //輸出按第1種方案得到的本息和
    printf("p2=%10.2f\n", p2); //輸出按第2種方案得到的本息和
    printf("p3=%10.2f\n", p3); //輸出按第3種方案得到的本息和
    printf("p4=%10.2f\n", p4); //輸出按第4種方案得到的本息和
    printf("p5=%10.2f\n", p5); //輸出按第5種方案得到的本息和

這時的輸出結(jié)果如下:

WX20220322-093726@2x.png

題目3:購房從銀行貸了一筆款d,準(zhǔn)備每月還款額為p,月利率為r,計算多少月能還清。設(shè)d為300 000元,p為6000元,r為1%。對求得的月份取小數(shù)點后一位,對第2位按四舍五入處理。

提示:計算還清月數(shù)m的公式如下:
m=\frac{log p-log(p-d*r)}{log(1+r)}

可以將公式改寫為
m=\frac{log(\frac{p}{p-d*r})}{log(1+r)}

C的庫函數(shù)中有求對數(shù)的函數(shù)log10,是求以10為底的對數(shù),log(p)表示log p。

解:根據(jù)以上公式可以很容易寫出以下程序。

答案代碼:

#include <stdio.h>
#include <math.h>
int main()

{
    float d = 300000, p = 6000, r = 0.01, m;
    m = log10(p / (p - d * r)) / log10(1 + r);
    printf("m=%6.1f\n", m);
    return 0;
}

運行結(jié)果:

WX20220322-100200@2x.png

即需要69.7個月才能還清。為了驗證對第2位小數(shù)是否已按四舍五入處理,可以將程序第6行中的“%6.1f”改為“%6.2f"”。此時的輸出為

WX20220322-100411@2x.png

題目4:分析下面的程序:

#include <stdio.h>
int main()
{
    char c1, c2;
    c1 = 97;
    c2 = 98;
    printf("c1= %c,c2= %c\n", c1, c2);
    printf("c1= %d,c2= %d\n", c1, c2);
    return 0;
}

(1)運行時會輸出什么信息?為什么?

解:運行時輸出

WX20220322-100503@2x.png

第1行是將c1,c2按%c的格式輸出,97是字符a的ASCII碼,98是字符b的ASCII碼。

第2行是將c1,c2按%d的格式輸出,所以輸出兩個十進(jìn)制整數(shù)。

(2)如果將程序第4,5行改為

c1=197;

c2= 198;

運行時會輸出什么信息?為什么?

解:由于VisualC++6.0字符型數(shù)據(jù)是作為signed char類型處理的,它存字符的有效范圍為0~127,超過此范圍的處理方法,不同的系統(tǒng)得到的結(jié)果不同,因而用%c格式輸出時,結(jié)果是不可預(yù)料的。

用%d格式輸出時,輸出c1=-59,c2=-58。這是按補(bǔ)碼形式輸出的,內(nèi)存字節(jié)中第1位為1時,作為負(fù)數(shù)。59與197之和等于256,58與198之和也等于256。對此可暫不深究。

只要知道:用char類型變量時,給它賦的值應(yīng)在0~127范圍內(nèi)。

(3)如果將程序第3行改為
int c1 ,c2;

運行時會輸出什么信息?為什么?

解:如果給c1和c2賦的值是97和98,則輸出結(jié)果與(1)相同。如果給c1和c2賦的值是197和198,則用%c輸出時是不可預(yù)料的字符。用%d輸出時,輸出整數(shù)197和198,因為它們在int類型的有效范圍內(nèi)。

題目5:用下面的scanf函數(shù)輸入數(shù)據(jù),使a=3,b=7,x=8.5,y=71.82,c1='A',c2='a'。在鍵盤上應(yīng)如何輸入?

#include <stdio.h>
int main()
{
    int a, b;
    float x, y;
    char c1, c2;
    scanf("a=%d b=%d", &a, &b);
    scanf("%f %e", &x, &y);
    scanf("%c %c", &c1, &c2);
    printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n", a, b, x, y, c1, c2);
    return 0;
}

解:按如下方式在鍵盤上輸入:

WX20220322-104625@2x.png

第3行是輸出的結(jié)果。

注意:在輸入8.5和71.82兩個實數(shù)給x和y后,應(yīng)緊接著輸入字符A,中間不要有空格,,由于A是字母而不是數(shù)字,系統(tǒng)在遇到字母A時就確定輸入給y的數(shù)值已結(jié)束。字符A就送到下一個scanf語句中的字符變量c1。如果在輸入8.5和71.82兩個實數(shù)后輸入空格符,會怎么樣呢?情況如下:

WX20220322-110238@2x.png

這時71.82后面輸入的空格字符就被c1讀入,c2讀入了字符A。在輸出c1時就輸出空格,輸出c2的值為A。

如果在輸入8. 5和71.82兩個實數(shù)后按回車鍵,會怎么樣呢?情況如下:

WX20220322-110453@2x.png

上面3行是輸入,在輸入71. 82后按回車鍵。在這時“回車”被作為一個字符送到內(nèi)存輸入緩沖區(qū),被c1讀入(實際上c1讀入的是回車符的ASCII碼),字符A被c2讀取,所以在執(zhí)行printf函數(shù)輸出c1時,就輸出一個換行,在下一行輸出逗號和c2的值A(chǔ)。

在用scanf函數(shù)輸入數(shù)據(jù)時往往會出現(xiàn)一些意想不到的情況,例如在連續(xù)輸入不同類型的數(shù)據(jù)(特別是數(shù)值型數(shù)據(jù)和字符數(shù)據(jù)連續(xù)輸入)的情況。要注意回車符是可能被作為一個字符讀入的。

通過此例,可以了解怎樣正確進(jìn)行輸入數(shù)據(jù)。這些知識不能靠枯燥地死記規(guī)則,必須善于在實踐中注意分析現(xiàn)象,不斷總結(jié)經(jīng)驗。

題目6:請編程序?qū)ⅰ癈hina”譯成密碼,密碼規(guī)律是:用原來的字母后面第4個字母代替原來的字母。例如,字母“A”后面第4個字母是“E" ,用“E”代替“A”。因此,“China"應(yīng)譯為“Glmre”。請編一程序,用賦初值的方法使cl,c2,c3,c4,c5這5個變量的值分為'C','h','i','n','a' ,經(jīng)過運算,使c1,c2,c3,c4,c5分別為'G','l','m','r','e'。 分別用putchar 函數(shù)和printf函數(shù)輸出這5個字符。

解:答案代碼:

#include <stdio.h>
int main()
{

    char c1 = 'C', c2 = 'h', c3 = 'i', c4 = 'n', c5 = 'a';
    c1 = c1 + 4;
    c2 = c2 + 4;
    c3 = c3 + 4;
    c4 = c4 + 4;
    c5 = c5 + 4;
    printf("password is %c%c%c%c%c\n", c1, c2, c3, c4, c5);
    return 0;
}

運行結(jié)果:

WX20220322-110914@2x.png

題目7:設(shè)圓半徑r=1.5,圓柱高h(yuǎn)=3,求圓周長、圓面積、圓球表面積、圓球體積、圓柱體積。用scanf輸入數(shù)據(jù),輸出計算結(jié)果,輸出時要求有文字說明,取小數(shù)點后2位數(shù)字。請編程序。

解:答案代碼:

#include <stdio.h>
int main()
{

    float h, r, l, s, sq, vq, vz;
    float pi = 3.141526;
    printf("請輸入圓半徑r,圓柱高h(yuǎn): ");
    scanf("%f,%f", &r, &h);          //要求輸入圓半徑r和圓柱高h(yuǎn)
    l = 2 * pi * r;                  //計算圓周長l
    s = r * r * pi;                  //計算圓面積s
    sq = 4 * pi * r * r;             //計算圓球表面積sq
    vq = 3.0 / 4.0 * pi * r * r * r; //計算圓球體積vq
    vz = pi * r * r * h;             //計算圓柱體積vz
    printf("圓周長為:         l=%6.2f\n", l);
    printf("圓面積為:         s=%6.2f\n", s);
    printf("圓球表面積為:   sq=%6.2f\n", sq);
    printf("圓球體積為:        v=%6.2f\n", vq);
    printf("圓柱體積為:        vz=%6.2f\n", vz);
    return 0;
}

運行結(jié)果:

WX20220322-121607@2x.png

說明:如果用VisualC++ 6.0中文版對程序進(jìn)行編譯,在程序中可以使用中文字符串,在輸出時也能顯示漢字。如果用英文的C編譯系統(tǒng),則無法使用中文字符串,讀者可以改用英文字符串。

題目8:編程序,用getchar函數(shù)讀入兩個字符給c1和c2,然后分別用putchar函數(shù)和printf函數(shù)輸出這兩個字符。思考以下問題:

(1)變量c1和c2應(yīng)定義為字符型、整型還是二者皆可?

(2)要求輸出cl和c2值的ASCII碼,應(yīng)如何處理?用putchar函數(shù)還是printf函數(shù)?

(3)整型變量與字符變量是否在任何情況下都可以互相代替?如:
char c1,c2;

int cl ,c2;
是否無條件地等價?

解:答案代碼:

#include <stdio.h>
int main()
{

    char c1, c2;
    printf("請輸入兩個字符c1,c2:");
    c1 = getchar();
    c2 = getchar();
    printf("用putchar語句輸出結(jié)果為:");
    putchar(c1);
    putchar(c2);
    printf("\n");
    printf("用printf 語句輸出結(jié)果為:");
    printf("%c %c\n", c1, c2);
    return 0;
}

運行結(jié)果:

WX20220322-112812@2x.png

注意:若連續(xù)用兩個getchar函數(shù),輸入字符時a和b之間沒有空格,連續(xù)輸入。

如果分兩行輸入:

WX20220322-113023@2x.png

結(jié)果會怎樣?

運行結(jié)果:

WX20220322-113109@2x.png

第1行是輸入數(shù)據(jù),輸入a后按回車鍵。結(jié)果還未來得及輸入b,程序馬上輸出了其下4行結(jié)果(包括2個空行)。

因為第1行將 a 和換行符輸入到內(nèi)存的輸入緩沖區(qū),因此c1得到a(ASCII碼為97),c2得到換行符(ASCII碼為10)。再用putchar函數(shù)輸出c1,就輸出了字符a,在輸出c2時,就把換行符轉(zhuǎn)換為回車和換行兩個操作,輸出一個換行,后面的printf("\n")又輸出一個換行,所以就相當(dāng)于輸出一個空行,此行不顯示任何字符。后面用printf 函數(shù)輸出c1 和c2,同樣也輸出了字符a和一個空行。

注意:在用連續(xù)兩個getchar輸入兩個字符時,只要輸入了“a”然后回車,系統(tǒng)就會認(rèn)為用戶已輸入了兩個字符。所以應(yīng)當(dāng)連續(xù)輸入ab兩個字符然后再按回車鍵,這樣就保證了c1和c2分別得到字符a和b。

下面回答思考問題:

(1) cl和c2可以定義為字符型或整型,二者皆可。

(2)可以用printf函數(shù)輸出,在printf函數(shù)中用%d格式符,即

printf(" %d,%d\n" ,c1,c2);

(3)字符變量在計算機(jī)內(nèi)占1個字節(jié),而整型變量占2個或4個字節(jié)。因此整型變量在可輸出字符的范圍內(nèi)(ASCII碼為0~127的字符)是可以與字符數(shù)據(jù)互相轉(zhuǎn)換的。如果整數(shù)在此范圍外,不能代替。

為了進(jìn)一步說明char型與int型數(shù)據(jù)的關(guān)系,請注意分析以下3個程序。

程序1:

#include <stdio.h>
int main()
{

    int c1, c2; //定義整型變量c1,c2
    printf("請輸入兩個整數(shù)c1,c2:");
    scanf("%d,%d", &c1, &c2);
    printf("按字符輸出結(jié)果:\n");
    printf("%c,%c\n", c1, c2);
    printf("按ASCII碼輸出結(jié)果為:\n");
    printf("%d,%d\n", c1, c2);
    return 0;
}

運行結(jié)果:

WX20220322-120432@2x.png

程序2:

#include <stdio.h>
int main()
{

    char c1, c2; // c1,c2定義為字符型變量
    int i1, i2;  //定義整型變量
    printf("請輸入兩個字符c1,c2:");
    scanf("%c,%c", &c1, &c2);
    i1 = c1; //賦值給整型變量
    i2 = c2;
    printf("按字符輸出結(jié)果:\n");
    printf("%c,%c\n", i1, i2);
    printf("按整數(shù)輸出結(jié)果:\n");
    printf("%d,%d\n", c1, c2);
    return 0;
}

運行結(jié)果:

WX20220322-121755@2x.png

程序3:

#include <stdio.h>
int main()
{
    char c1, c2; // c1,c2 定義為字符型
    int i1, i2;  // i1,i2定義為整型.
    printf("請輸入兩個整數(shù)i1,i2:");
    scanf("%d, %d", &i1, &i2);
    c1 = i1; //將整數(shù)賦值給字符變量
    c2 = i2;
    printf("按字符輸出結(jié)果:\n");
    printf("%c,%c\n", c1, c2);
    printf("按整數(shù)輸出結(jié)果:\n");
    printf("%d,%d\n", c1, c2);
    return 0;
}

運行結(jié)果:

WX20220322-120921@2x.png

請注意i,i1和i2占2個或4個字節(jié)(Visual C++對它分配4個字節(jié)),而c1和c2是字符變量,只占1個字節(jié)。如果是unsigned char 類型,可以存放0~255的整數(shù);如果是signed char類型,可以存放-128127范圍內(nèi)的整數(shù)。而現(xiàn)在輸入給i1和i2的值已超過0255的范圍,i1的值為289,在內(nèi)存中i1的存儲情況如圖3.1(a)所示(為簡單起見,用2個字節(jié)表示),在賦給字符變量c1時,只將其存儲單元中最后一個字節(jié)(低8位)賦給c1,見
圖3.1(b)。而圖3.1(b)中的數(shù)據(jù)是整數(shù)33,是字符'!'的ASCII碼,所以用字符形式輸出c1時,會輸出字符'!'。圖3.2表示i2和c2的情況,c2的值為74,是字符'J'的ASCII碼,因此,按字符形式輸出c2時就輸出字符j'。

WX20220322-121428@2x.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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