楼主: 陈鱼缸
71 0

C程序设计(第五版)谭浩强 第三章课后习题答案 [推广有奖]

  • 0关注
  • 0粉丝

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
10 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-9-19
最后登录
2018-9-19

楼主
陈鱼缸 发表于 2025-12-11 18:21:37 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

1. 假设我国国民生产总值的年增长率为7%,求10年后与当前相比的增长百分比。根据公式:

其中,r 表示年增长率,n 代表年数,p 是相对于当前的倍数。

#include <stdio.h>
#include <math.h> // 使用pow函数进行幂运算
int main() {
    double r = 0.07;   // 年增长率7%
    int n = 10;        // 年数
    double p;          // 相对于现在的倍数

    // 计算公式: p = (1 + r)^n
    p = pow(1 + r, n);

    // 输出结果
    printf("年增长率 %.1f%%, %d年后国民生产总值是现在的 %.4f 倍\n",
           r * 100, n, p);
    printf("即增长了 %.2f%%\n", (p - 1) * 100);
    return 0;
}

2. 关于存款利息的比较分析:现有本金1000元,计划存储5年,可选择以下五种方式:

  • 一次性存入5年期定期;
  • 先存2年期,到期后本息转存3年期;
  • 先存3年期,之后将本息再存2年期;
  • 每年续存1年期,共连续操作5次;
  • 选择活期存款,每季度结算一次利息。

依据2017年银行利率标准:

  • 1年期定期利率:1.5%;
  • 2年期定期利率:2.1%;
  • 3年期定期利率:2.75%;
  • 5年期定期利率:3%;
  • 活期存款利率:0.35%(按季度复利计算)。

若以 r 表示年利率,n 为年数,则本息和计算方式如下:

#include <stdio.h>
#include <math.h>
int main() {
    int n = 5; // 存款年限
    double r1 = 0.015, r2 = 0.021, r3 = 0.0275, r5 = 0.03, r0 = 0.0035;
    // 分别对应1年、2年、3年、5年及活期利率
    double p1, p2, p3, p5, p0;

    p1 = 1000 * (1 + 5 * r5);                                    // 5年期一次存满
    p2 = ((1 + 2 * r2) * 1000) * (1 + 3 * r3);                   // 2年+3年
    p3 = ((1 + 3 * r3) * 1000) * (1 + 2 * r2);                   // 3年+2年
    p5 = pow(1 + r1, 5) * 1000;                                  // 每年续存1年期
    p0 = pow(1 + r0 / 4, 20) * 1000;                             // 活期,每季计息共20次

    printf("p1 = %.2lf\np2 = %.2lf\np3 = %.2lf\np5 = %.2lf\np0 = %.2lf\n", 
           p1, p2, p3, p5, p0); // 结果保留两位小数
    return 0;
}

3. 购房贷款问题:从银行贷款金额为 d=300,000 元,每月还款额固定为 p=6000 元,月利率 r=1%。需要计算还清所需月数 m,并对结果保留一位小数,第二位四舍五入。

提示中给出的计算公式为:

#include <stdio.h>
#include <math.h>
int main() {
    long d = 300000, p = 6000;
    double r = 0.01, m;
    m = log(p / (p - d * r)) / log(1 + r);
    printf("m=%.1lf\n", m);
    return 0;
}

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

原因:字符型变量赋值为整数时,会将其解释为ASCII码对应的字符。97对应'a',98对应'b',因此%c输出字符形式,而%d输出其原始数值。

(2)若将第4、5行修改为:
c1 = 197;
c2 = 198;

输出可能为:

c1=? , c2=??? (或显示乱码)
c1=-59, c2=-58

原因:在有符号char类型下(通常范围-128~127),197和198超出正向表示范围,发生溢出,实际存储为补码形式,即分别为-59和-58。此时%c尝试打印非标准可打印字符,可能导致乱码。

(3)若将第3行改为:
int c1, c2;

则输出变为:

c1=? , c2=??? (或乱码)
c1=197, c2=198

原因:此时变量类型为int,能完整存储197和198,无溢出。但使用%c输出时仍会尝试将其作为ASCII码解析,而197、198在某些编码体系中可能不对应可见字符,导致显示异常或乱码;%d则正常输出数值。

5. 给定以下代码段,要求输入数据使得 a=3,b=7,x=8.5,y=71.82,c1='A',c2='a'。应如何在键盘上正确输入?

#include <stdio.h>
int main() {
    int a, b;
    float x, y;
    char c1, c2;
    scanf("a=%db=%d", &a, &b);

说明:该scanf语句仅读取格式为"a=数字b=数字"的数据,目前只接收两个整型变量。后续未完成输入x、y、c1、c2的部分代码缺失,但根据已有部分推断,若要使a=3、b=7,应在控制台输入:

a=3b=7

注意:中间不能有空格或其他多余字符,必须严格匹配格式字符串"a=%db=%d"。

#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("使用putchar输出: ");
    putchar(c1);
    putchar(c2);
    putchar(c3);
    putchar(c4);
    putchar(c5);
    putchar('\n');

    printf("使用printf输出: %c%c%c%c%c\n", c1, c2, c3, c4, c5);

    printf("加密后ASCII码: %d %d %d %d %d\n", c1, c2, c3, c4, c5);

    return 0;
}

程序功能说明:通过将字符的ASCII值增加4,实现简单的凯撒密码加密。原始字符串“China”中的每个字母均向后移动四位,'C'变为'G','h'变为'l',依此类推,最终得到加密结果“Glmre”。程序分别使用putchar和printf两种方式输出加密后的字符,并打印其对应的ASCII码值用于验证。


#include <stdio.h>
#include <math.h>
#define PI 3.141592653589793

int main() {
    double r, h;
    double circumference, circle_area;
    double sphere_area, sphere_volume;
    double cylinder_volume;

    printf("请输入圆半径 r: ");
    scanf("%lf", &r);
    printf("请输入圆柱高 h: ");
    scanf("%lf", &h);

    circumference = 2 * PI * r;
    circle_area = PI * r * r;
    sphere_area = 4 * PI * r * r;
    sphere_volume = 4.0 / 3.0 * PI * pow(r, 3);
    cylinder_volume = PI * r * r * h;

    printf("\n========== 计算结果 ==========\n");
    printf("圆半径:      r = %.2f\n", r);
    printf("圆柱高:      h = %.2f\n", h);
    printf("使用π值:     %.10f\n", PI);
    printf("--------------------------------\n");
    printf("圆周长:      %.2f\n", circumference);
    printf("圆面积:      %.2f\n", circle_area);
    printf("圆球表面积:  %.2f\n", sphere_area);
    printf("圆球体积:    %.2f\n", sphere_volume);
    printf("圆柱体积:    %.2f\n", cylinder_volume);

    return 0;
}

本程序用于计算与圆及圆柱相关的几何量。给定用户输入的半径r和高度h,程序依次计算并输出圆的周长、面积,球体的表面积和体积,以及圆柱的体积。所有浮点数结果保留两位小数,提升可读性。使用自定义的高精度PI值以确保计算准确性。

#include <stdio.h>
int main() {
    // 问题(1)解答:c1 和 c2 可使用字符型或整型,但建议用字符型
    char c1, c2;  // 推荐定义为字符类型
    printf("请输入两个字符(中间无需空格): ");
    
    c1 = getchar();  // 获取第一个输入字符
    c2 = getchar();  // 获取第二个输入字符(可能为回车、空格或其他直接输入的字符)

    // 使用 putchar 函数输出这两个字符
    printf("用putchar输出字符: ");
    putchar(c1);
    putchar(' ');   // 添加空格以分隔字符
    putchar(c2);
    putchar('\n');  // 换行处理

    // 利用 printf 函数输出字符内容
    printf("用printf输出字符: %c %c\n", c1, c2);

    return 0;
}

问题解析:

(1)变量 c1 和 c2 应该定义为字符型、整型,还是两者都可以?
答:两种类型均可使用,但从语义清晰和内存效率角度考虑,推荐使用字符型(char)。

(2)若需输出 c1 和 c2 对应的 ASCII 码值,该如何实现?应选用 putchar 还是 printf 函数?
答:必须采用 printf 函数,并配合格式控制符 %d 来输出其对应的 ASCII 数值。putchar 主要用于字符输出,无法直接显示数值编码。

(3)整型变量与字符型变量是否在所有场景下都能互相替代?例如 char c1,c2; 与 int c1,c2 是否完全等价?
答:在基本的字符读取与打印操作中,char 与 int 往往可以互换使用,因为 char 在赋值时会自动提升为 int。然而,在处理 EOF 判断、数据范围限制或执行算术运算时,使用 int 类型更为安全可靠。建议初学者先掌握 char 类型的基本用法,理解底层机制后再根据实际需求选择合适的数据类型。

?
假如我国国民生产总值的年增长率为7%,计算10年后我国国民生产总值与现在相比增长多少百分比。计算公式为:


r为年增长率,n为年数,p为与现在相比的倍数。

#include <stdio.h>

#include <math.h>? // 需要使用pow函数进行幂运算

int main() {

??? double r = 0.07;? // 年增长率7%

??? int n = 10;?????? // 年数

??? double p;???????? // 与现在相比的倍数

???

??? // 计算公式: p = (1 + r)^n

??? p = pow(1 + r, n);

???

??? // 输出结果

??? printf("年增长率 %.1f%%, %d年后国民生产总值是现在的 %.4f 倍\n",

?????????? r * 100, n, p);

??? printf("即增长了 %.2f%%\n", (p - 1) * 100);

???

??? return 0;

}

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为存款年数,则计算本息和的公式如下:



#include <stdio.h>

#include <math.h>

int main() {

???????? int n = 5; // 存5年

????????

???????? double r1 = 0.015, r2 = 0.021, r3 = 0.0275, r5 = 0.03, r0 = 0.0035; // r1-1年期,r2-2年期,r3-3年期,r5-5年期,r0-活期

???????? double p1, p2, p3, p5, p0;

????????

???????? p1 = 1000 * (1 + 5 * r5);

???????? p2 = ((1 + 2 * r2) * 1000) * (1 + 3 * r3);

???????? p3 = ((1 + 3 * r3) * 1000) * (1 + 2 * r2);

???????? p5 = pow(1 + r1, 5) * 1000;

???????? p0 = pow(1 + r0 / 4, 20) * 1000;

???????? printf("p1 = %.2lf\np2 = %.2lf\np3 = %.2lf\np5 = %.2lf\np0 = %.2lf\n", p1, p2, p3, p5, p0); // 保留2位小数,第3位四舍五入

???????? return 0;

}

3.购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。设d为300 000元,p为6000元,r为1%。对求得的月份取小数点后一位,对第2位按四舍五入处理。

提示:计算还清月数m的公式如下:



#include <stdio.h>

#include <math.h>

int main() {

???????? long d = 300000, p = 6000;

???????? double r = 0.01, m;

????????

???????? m = log(p / (p - d * r)) / log(1 + r);

????????

???????? printf("m=%.1lf\n", m);

???????? return 0;

}

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)运行时会输出什么信息?为什么?

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

??? c1 = 197;

??? c2 = 198;

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

(3)如果将程序第3行改为:

int c1, c2;

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

答案:

c1=a, c2=b

c1=97, c2=98

(2)

c1=? , c2=??? (或乱码符号)

c1=-59, c2=-58?? (常见情况)

(3)

c1=? , c2=??? (或乱码符号)

c1=197, c2=198

5.用下面的scanf函数输人数据,使a=3,b=7,x=8.5,y=71.82,c1='A',c2='a'。在键盘上应如何输入?

#include <stdio.h>

int main() {

??? int a, b;

??? float x, y;

??? char c1, c2;

??? scanf("a=%db=%d", &a, &b);

??? scanf("%f%e", &x, &y);

??? scanf("%c%c", &c1, &c2);

??? return 0;

}

答案:

a=3b=7 8.5 71.82Aa

或分三行输入:

a=3b=7

8.5 71.82

Aa

6.请编程序将“China”译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母。例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。因此,“China”应译为“Glmre”。请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为'C','h','i','n','a',经过运算,使c1,c2,c3,c4,c5分别变为'G','1','m','r','e'。分别用putchar函数和printf函数输出这5个字符。

#include <stdio.h>

int main() {

??? // 1. 初始化五个字符变量

??? char c1 = 'C', c2 = 'h', c3 = 'i', c4 = 'n', c5 = 'a';

???

??? // 2. 加密:每个字符后移4位(注意大小写和边界)

??? c1 = c1 + 4;? // 'C' → 'G'

??? c2 = c2 + 4;? // 'h' → 'l'

??? c3 = c3 + 4;? // 'i' → 'm'

??? c4 = c4 + 4;? // 'n' → 'r'

??? c5 = c5 + 4;? // 'a' → 'e'

???

??? // 3. 用putchar函数输出

??? printf("使用putchar输出: ");

??? putchar(c1);

??? putchar(c2);

??? putchar(c3);

??? putchar(c4);

??? putchar(c5);

??? putchar('\n');? // 换行

???

??? // 4. 用printf函数输出

??? printf("使用printf输出: %c%c%c%c%c\n", c1, c2, c3, c4, c5);

???

??? // 5. 输出ASCII码值验证

??? printf("加密后ASCII码: %d %d %d %d %d\n", c1, c2, c3, c4, c5);

???

??? return 0;

}

7.设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。请编程序。

#include <stdio.h>

#include <math.h>?

// 自定义π常量

#define PI 3.141592653589793

int main() {

??? double r, h;

??? double circumference, circle_area;??? // 圆周长, 圆面积

??? double sphere_area, sphere_volume;??? // 圆球表面积, 圆球体积

??? double cylinder_volume;?????????????? // 圆柱体积

???

??? // 1. 输入半径和高

??? printf("请输入圆半径 r: ");

??? scanf("%lf", &r);

??? printf("请输入圆柱高 h: ");

??? scanf("%lf", &h);

???

??? // 2. 使用自定义PI进行计算

??? circumference = 2 * PI * r;????????????????? // 圆周长 = 2πr

??? circle_area = PI * r * r;??????????????????? // 圆面积 = πr?

??? sphere_area = 4 * PI * r * r;??????????????? // 球表面积 = 4πr?

??? sphere_volume = 4.0 / 3.0 * PI * pow(r, 3);? // 球体积 = (4/3)πr?

??? cylinder_volume = PI * r * r * h;??????????? // 圆柱体积 = πr?h

???

??? // 3. 输出结果,保留两位小数

??? printf("\n========== 计算结果 ==========\n");

??? printf("圆半径:?????? r = %.2f\n", r);

??? printf("圆柱高:?????? h = %.2f\n", h);

??? printf("使用π值:????? %.10f\n", PI);? // 显示使用的π值

??? printf("--------------------------------\n");

? ??printf("圆周长:?????? %.2f\n", circumference);

??? printf("圆面积:?????? %.2f\n", circle_area);

??? printf("圆球表面积:?? %.2f\n", sphere_area);

??? printf("圆球体积:???? %.2f\n", sphere_volume);

??? printf("圆柱体积:???? %.2f\n", cylinder_volume);

??? printf("===============================\n");

???

??? return 0;

}

8.编程序,用getchar函数读入两个字符给c1和c2,然后分别用putchar函数和printf函数输出这两个字符。思考以下问题:

(1)变量c1和c2应定义为字符型、整型还是二者皆可?

(2)要求输出c1和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?

(3)整型变量与字符变量是否在任何情况下都可以互相代替?如:char c1,c2;与int c1,c2是否无条件等价?

答案:

#include <stdio.h>

int main() {

??? // 问题(1)的答案:字符型或整型皆可,但字符型更合适

??? char c1, c2;? // 定义为字符型(推荐)

???

??? printf("请输入两个字符(不需空格): ");

??? c1 = getchar();??? // 读取第一个字符

??? c2 = getchar();??? // 读取第二个字符(可能是回车、空格或直接输入)

???

??? // 用putchar输出字符

??? printf("用putchar输出字符: ");

??? putchar(c1);

??? putchar(' ');????? // 加空格分隔

??? putchar(c2);

??? putchar('\n');???? // 换行

???

??? // 用printf输出字符

??? printf("用printf输出字符: %c %c\n", c1, c2);

???

??? return 0;

}

(1)变量c1和c2应定义为字符型、整型还是二者皆可?

???????? 答:二者皆可,但推荐字符型(char)。

(2)要求输出c1和c2值的ASCII码,应如何处理?用putchar函数还是printf函数?

???????? 答:必须使用 printf 函数,格式符为 %d。

(3)整型变量与字符变量是否在任何情况下都可以互相代替?如:char c1,c2;与int c1,c2是否无条件等价?

???????? 答:对于简单的字符输入输出,char 和 int 常可互换,但在涉及EOF检测、范围检查、算术运算时,使用 int 更安全。初学者推荐先用 char 学习字符操作,了解原理后再根据需求选择类型。

?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:课后习题答案 C程序设计 习题答案 课后习题 程序设计

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
jg-xs1
拉您进交流群
GMT+8, 2025-12-21 14:21