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

題目1:假如我國國民生產(chǎn)總值的年增長率為7%,計算10年后我國國民生產(chǎn)總值與現(xiàn)在相比增長多少百分比。計算公式為:
r 為年增長率,n 為年數(shù),p為與現(xiàn)在相比的倍數(shù)。
解:從主教材附錄D(庫函數(shù))可以查到:可以用pow函數(shù)求的值,調(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é)果:

即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年期本息和:
n年期本息和:
存n次1年期的本息和:
說明: 是一個季度的本息和。
解:設(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é)果:

討論:
(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ù)字與上面的有些差別。

(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é)果如下:

題目3:購房從銀行貸了一筆款d,準(zhǔn)備每月還款額為p,月利率為r,計算多少月能還清。設(shè)d為300 000元,p為6000元,r為1%。對求得的月份取小數(shù)點后一位,對第2位按四舍五入處理。
提示:計算還清月數(shù)m的公式如下:
可以將公式改寫為
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é)果:

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

題目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)運行時會輸出什么信息?為什么?
解:運行時輸出

第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;
}
解:按如下方式在鍵盤上輸入:

第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ù)后輸入空格符,會怎么樣呢?情況如下:

這時71.82后面輸入的空格字符就被c1讀入,c2讀入了字符A。在輸出c1時就輸出空格,輸出c2的值為A。
如果在輸入8. 5和71.82兩個實數(shù)后按回車鍵,會怎么樣呢?情況如下:

上面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é)果:

題目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é)果:

說明:如果用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é)果:

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

結(jié)果會怎樣?
運行結(jié)果:

第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é)果:

程序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é)果:

程序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é)果:

請注意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'。
