《C语言程序设计:现代方法》(第2版·修订版)第2章编程题试解

1. 编写一个程序,使用printf在屏幕上显示下面的图形:

        *

       *

      *

*    *

 *  *

   *

/* 打印对钩图形 */

#include <stdio.h>

int main(void)
{
    printf("       *\n");
    printf("      *\n");
    printf("     *\n");
    printf("*   *\n");
    printf(" * *\n");
    printf("  *\n");
    
    return 0;
}

2. 编写一个计算球体体积的程序,其中球体半径为10m,参考公式 v=4/3\pi r^{3}。注意,分数4/3应写为4.0f/3/0f。(如果分数写成4/3会产生什么结果?)提示:C语言没有指数运算符,所以需要对r自乘两次来计算r^3

3. 修改上题中的程序,使用户可以自行输入球体的半径。

 两道题可以合并在一起做:

/* 计算球体体积的程序,公式v = (4 / 3) * π * (r ^ 3) */

#include <stdio.h>

#define VOLUME (4.0f / 3.0f) * 3.14f    // 使用宏定义,将球体积计算中固定使用的表达式命名为"VOLUME"

int main(void)
{
    float radius, radius_cube, volume;  // 分别用于存储球体半径、球体半径的立方和球体体积
    
    printf("Enter the radius of the sphere: ");
    scanf("%f", &radius);
    /*
     * 第11行提示用户输入球体半径,第12行将用户输入的球体半径读入变量radius
     * 第2题将第11、12行改为"radius = 10.0f;"即可,
     * 或在第9行声明变量时直接将radius初始化为"10.0f":
     * float radius = 10.0f, radius_cube, volume;
     */
    radius_cube = radius * radius * radius;  // 计算球体半径的立方
    volume = VOLUME * radius_cube;  // 计算球体体积: (4.0f / 3.0f) * 3.14f * radius_cube
    printf("The volume of a sphere is %.2f cubic meter.\n", volume);  // 输出球体体积计算结果
    
    return 0;
}

【说明】

①根据题干给出的用例,球体半径radius也可以声明为int型。

②第2题括号内的问题:“如果分数写成4/3会产生什么结果?” 4和3均为整数,属int型。“在C语言中,如果两个整数相除,那么结果会被"截短":小数点后的所有数字都会丢失。”(P15,本文中出现的页码括注,均为“[美]K. N. 金著《C语言程序设计:现代方法》(第2版·修订版),吕秀锋、黄倩译,人民邮电出版社2021年版”的页码 )因此,如果分数写成"4 / 3"会产生的结果是"1"。

4. 编写一个程序,要求用户输入一个美元数额,然后显示出增加 5% 税率后的相应金额。格式如下所示:

        Enter an amount: 100.00

        With tax added: $105.00

 

/* 输入一个美元金额,显示出增加 5% 税率后的相应金额 */

#include <stdio.h>

int main(void)
{
    float amount;   // 根据题干提供的输出示例,我们将变量声明为float型
    
    printf("Enter an amount: ");
    scanf("%f", &amount);
    // 第9行提示用户输入金额,第10行将用户输入的金额读入变量amount
    printf("With tax added: $%.2f\n", amount * 1.05f);
    /*
     * 将增加税率后金额的计算表达式置于函数的参数列表中
     * 使用转换说明"%.2f"输出结果
     * "%f"是显示float型值的转换说明,修饰符".2"的作用是显示小数点后2位
     */
    
    return 0;
}

5. 编程要求用户输入x的值,然后显示如下多项式的值:

        3x^5+2x^4-5x^3-x^2+7x-6

提示:C语言没有指数运算符,所以需要对x进行自乘来计算其幂。(例如,x*x*x就是x的三次方。)

6. 修改上题,用如下公式对多项式求值:

        ((((3x+2)x-5)x-1)x+7)x-6

注意,修改后的程序所需的乘法次数减少了。这种多项式求值方法即 Horner 法则。

 两道题可以合并在一起做:

/* 输入x,显示"3x^5+2x^4-5x^3-x^2+7x-6"的值 */

#include <stdio.h>

int main(void)
{
    float x, x2, x3;
    /*
     * 题干给出的多项式最高次为5次,可以借由"平方*立方"得出,4次则可用平方自乘得出
     * 所以,这里只声明3个float型变量,分别用于存储输入的x,x的平方和x的立方。
     */
    
    printf("Enter a number of x:");
    scanf("%f", &x);
    // 第13行提示用户输入x,第14行将用户输入的x读入变量x
    x2 = x * x;     // 计算x的平方
    x3 = x2 * x;    // 计算x的立方
    
    printf("3x^5+2x^4-5x^3-x^2+7x-6 = %.2f.\n",
     (3 * x2 * x3) + (2 * x2 * x2) - (5 * x3) - x2 + (7 * x) - 6);
    // 第5题的解法
    printf("Calculate using Horner's Law: ((((3x+2)x-5)x-1)x+7)x-6 = %.2f.\n",
     ((((3 * x + 2) * x - 5) * x - 1 )* x + 7 ) * x - 6);
    // 第6题的解法
    
    return 0;
}

7. 编写一个程序,要求用户输入一个美元数额,然后显示出如何用最少张数的20美元、10美元、5美元和1美元钞票来付款:

        Enter a dollar amount: 93

        

        $20 bills: 4

        $10 bills: 1

          $5 bills: 0

          $1 bills: 3

提示:将付款金额除以20,确定20美元钞票的数量,然后从付款金额中减去20美元的总金额。对其他面值的钞票重复这一操作。确保在程序中始终使用整数值,不要用浮点数。

题干要求, “用最少张数的20美元、10美元、5美元和1美元钞票来付款”,最少修饰的是钞票,而非某一种面额的钞票。因此,只需尽可能用大面额的钞票即可。

/* 输入一个美元金额,显示如何用最少张数的20美元、10美元、5美元和1美元钞票来付款 */

#include <stdio.h>

#define TWENTY 20
#define TEN 10
#define FIVE 5      // 使用宏定义,分别将20美元、10美元和5美元的币值定义为可理解的名称,而非字面量

int main(void)
{
    int amount, twenty, ten, five, one;     // 分别用于存储用户输入的金额,20、10、5、1美元钞票数量

    printf("Enter a dollar amount:");
    scanf("%d", &amount);
    // 第13行提示用户输入金额,第14行将用户输入的金额读入变量amount
    
    twenty = amount / TWENTY;   // 计算所需20美元钞票数量
    ten = (amount - twenty * TWENTY) / TEN;     // 计算所需10美元钞票数量
    // 本书第2章没有介绍求余运算符(%),因此这里使用"被除数 - 商 * 除数"的方式求余数
    five = (amount - twenty * TWENTY - ten * TEN) / FIVE;     // 计算所需5美元钞票数量
    one = amount - twenty * TWENTY - ten * TEN - five * FIVE;     // 计算所需1美元钞票数量
    
    printf("$20 bills: %d\n", twenty);
    printf("$10 bills: %d\n", ten);
    printf(" $5 bills: %d\n", five);
    printf(" $1 bills: %d\n", one);

    return 0;
}

8. 编程计算第一、第二、第三个月还贷后剩余的贷款金额:

        Enter amount of loan: 20000.00

        Enter interest rate: 6.0

        Enter monthly payment: 386.66

 

        Balance remaining after first payment: $19713.34

        Balance remaining after second payment: $19425.25

        Balance remaining after third payment: $19135.71

在显示每次还款后的余额时保留两位小数。提示:每个月的贷款余额减去还款金额后,还需要加上贷款余额与月利率的乘积。月利率的计算方法是把用户输入的利率转换成百分数再除以12。

/* 计算还贷剩余贷款金额 */

#include <stdio.h>

int main(void)
{
    float amount, rate, monthly_rate, monthly_payment, loan1, loan2, loan3;
    // 分别用于存储贷款金额、利率、月利率、月供、第一月剩余、第二月剩余和第三月剩余
    
    printf("Enter amount of loan:");
    scanf("%f", &amount);
    printf("Enter interest rate:");
    scanf("%f", &rate);
    printf("Enter monthly payment:");
    scanf("%f", &monthly_payment);
    // 第10、12、14行提示用户输入贷款金额、利率和月供
    // 第11、13、15行将用户输入的贷款金额、利率和月供分别读入变量amount、rate和monthly_payment
    monthly_rate = rate / 100.00f / 12;     // 计算月利率,并存入变量monthly_rate
    loan1 = amount - monthly_payment + (amount * monthly_rate);
    loan2 = loan1 - monthly_payment + (loan1 * monthly_rate);
    loan3 = loan2 - monthly_payment + (loan2 * monthly_rate);
    // 第19~21行分别计算第一、二、三月还贷后剩余的贷款金额,并存入变量loan1、loan2和loan3
    
    printf("Balance remaining after first payment: $%.2f\n", loan1);
    printf("Balance remaining after second payment: $%.2f\n", loan2);
    printf("Balance remaining after third payment: $%.2f\n", loan3);
    
    return 0;
}

 

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值