第三章 程序習題
- 1、第2題
- 2、第2題
- 3、第3題
- 4、第4題
1、第2題
假如我國國民生產總值的年增長率為7%, 計算10年后我國國民生產總值與現在相比增長多少百分比。計算公式為 p = ( 1 + r ) n p = (1+r)^n p=(1+r)n ,其中r為年增長率,n為年數,p為與現在相比的倍數。
解析:調用math庫冪運算函數pow,傳遞對應參數即可。
#include<stdio.h>
#include <math.h>int main()
{int n = 10;float p, r;r = 0.07;p = pow(1 + r, n);printf("p=%f\n", p);return 0;
}// 輸出結果
p = 1.967152
2、第2題
存款利息的計算。有1000元,想存5年,可按以下5種辦法存:
(1)一次存5年期
(2)先存2年期,到期后將本息再存3年期
(3)先存3年期,到期后將本息再存2年期
(4)存1年期,到期后將本息再存1年期,連續存5次
(5)存活期存款,活期利息每一季度結算一次
2017年銀行存款利息如下:
1年期定期存款利息為1.5%;
2年期定期存款利息為2.1%;
3年期定期存款利息為2.75%;
5年期定期存款利息為3%;
活期存款利息為0.35%(活期存款每一-季度結算一-次利息)
如果r為年利率,n為存款年數,則計算本息的公式如下:
1年期本息和: P= 1000* (1+r);
n年期本息和: P= 1000* (1+n* r);
存n次1年期的本息和: P = 1000 ? ( 1 + r ) n P=1000* (1+r)^n P=1000?(1+r)n;
活期存款本息和: P= 1000 (1+ r 4 \frac{r}{4} 4r?) 4 n ^{4n} 4n;
說明: 1000(1+ r 4 \frac{r}{4} 4r?)是一個季度的本息和。
#include<stdio.h>
#include <math.h>
int main()
{int p = 1000;float r5, r3, r2, r1, r0, p1, p2, p3, p4, p5;r5 = 0.0585;r3 = 0.054;r2 = 0.0468;r1 = 0.0414;r0 = 0.0072;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年期,連續存5次 p5 = p*pow(1 + r0 / 4, 4 * 5); // 存活期存款。活期利息每一季度結算一次 printf("p1=%f\n", p1); // 輸出按第1方案得到的本息和 printf("p2=%f\n", p2); // 輸出按第2方案得到的本息和 printf("p3=%f\n", p3); printf("p4=%f\n", p4); printf("p5=%f\n", p5); return 0;
}// 輸出結果
p1 = 5292.500488
p2 = 1270.763062
p3 = 1270.763184
p4 = 1224.863770
p5 = 1036.621094
3、第3題
購房從銀行貸了一筆款d,準備每月還款額為p,月利率為r,計算多少月能還清。設d為300 000元,p為6000元,r為1%。對求得的月份取小數點后一位,對第2位按四舍五人處理。
提示:計算還清月數m的公式如下:
m = l o g ( p ) ? l o g ( p ? d ? r ) l o g ( 1 + r ) \frac{log (p) - log(p - d * r) }{log(1 + r)} log(1+r)log(p)?log(p?d?r)?
可以將公式改寫為:
m = l o g ( p p ? d ? r ) l o g ( 1 + r ) \frac{log(\frac{p} {p - d * r} ) } {log(1 + r)} log(1+r)log(p?d?rp?)?
C的庫函數中有求對數的函數log10,是求以10為底的對數,log (p)表示log p。
題目解析:
該題的關鍵主要是利用數學函數庫中的log函數進行求解,然后月份要求按照小數點后一位進行四舍五入進行處理,只需要在輸出時進行格式控制即可。
#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 = %3.1f\n", m);return 0;
}
4、第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)運行時會輸出什么信息?為什么?
c1=a, c2=b
c1=97, c2=98
print()函數格式輸出:
%c --> 字符形式輸出,輸出相應字符,所以會把97和98當作相應字符的ASCII值,輸出的時候按照字符顯示
%d --> 整數形式輸出,輸出對應整數值。
(2)如果將程序第4,5行改為
c1 = 197;
c2 = 198;
運行時會輸出什么信息?為什么?
c1=?, c2=?
c1=-59, c2=-58
因為c1和c2為char類型,其保存的數據范圍為-128~127,當c1=197,c2=198時,已經超出了char類型所能夠保存的數據范圍,此時會進行相應的轉換為c1=-59,c2=-58
(當整型值用2 byte 表示:197二進制為0000 0000 1100 0101,198二進制為0000 0000 1100 0110,當整型值197賦值給字符型c1時,進行了縮窄轉換,高8位被舍棄留下了1100 0101,最高位表示符號位,為1表示為負數,求出其數值即可)。
只是第一行以字符輸出時,c1=-59,c2=-58為不可顯示字符,所以輸出了?,而第二行以整數輸出時就進行了相應的整數顯示。
(3)如果將程序第3行改為
int c1, c2;
運行時會輸出什么信息?為什么?
c1=?, c2=?
c1=197, c2=198
因為c1和c2為int時,第二行以整形輸出自然能夠保存的下,但第一行以字符輸出時,雖然數據int能夠儲存,但是在輸出時需要準換為字符,轉換后數據就超出了范圍,此時c1=-59,c2=-58,兩者都為不可顯示字符,所以就顯示了?。