C程序设计谭浩强第五版

第三章 程序习题

1、第2题

假如我国国民生产总值的年增长率为7%, 计算10年后我国国民生产总值与现在相比增长多少百分比。计算公式为 p = ( 1 + r ) n p = (1+r)^n p=(1+r)n ,其中r为年增长率,n为年数,p为与现在相比的倍数。

解析:调用math库幂运算函数pow,传递对应参数即可。

cpp 复制代码
#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)是一个季度的本息和。

cpp 复制代码
#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函数进行求解,然后月份要求按照小数点后一位进行四舍五入进行处理,只需要在输出时进行格式控制即可。

cpp 复制代码
#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题

分析下面的程序:

cpp 复制代码
#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)运行时会输出什么信息?为什么?

cpp 复制代码
c1=a,	c2=b
c1=97,	c2=98

print()函数格式输出:
%c --> 字符形式输出,输出相应字符 ,所以会把97和98当作相应字符的ASCII值,输出的时候按照字符显示
%d --> 整数形式输出,输出对应整数值。

(2)如果将程序第4,5行改为

c1 = 197;

c2 = 198;

运行时会输出什么信息?为什么?

cpp 复制代码
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;

运行时会输出什么信息?为什么?

cpp 复制代码
c1=?,	c2=?
c1=197,	c2=198

因为c1和c2为int时,第二行以整形输出自然能够保存的下,但第一行以字符输出时,虽然数据int能够储存,但是在输出时需要准换为字符,转换后数据就超出了范围,此时c1=-59,c2=-58,两者都为不可显示字符,所以就显示了?。

相关推荐
从0至124 分钟前
力扣刷题 | 两数之和
c语言·开发语言
小比卡丘42 分钟前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
一个不知名程序员www1 小时前
leetcode第189题:轮转数组(C语言版)
c语言·leetcode
冷白白1 小时前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
睡觉然后上课1 小时前
c基础面试题
c语言·开发语言·c++·面试
武昌库里写JAVA2 小时前
【Java】Java面试题笔试
c语言·开发语言·数据结构·算法·二维数组
aaasssdddd965 小时前
python和c
c语言·开发语言·python
凯子坚持 c6 小时前
C语言复习概要(三)
c语言·开发语言
无限大.6 小时前
c语言200例 067
java·c语言·开发语言
无限大.6 小时前
c语言实例
c语言·数据结构·算法