zoukankan      html  css  js  c++  java
  • C语言程序设计:现代方法(第2版)第二章全部习题答案

    前言

    本人在通过《C语言程序设计:现代方法(第2版)》自学C语言时,发现国内并没有该书完整的课后习题答案,所以就想把自己在学习过程中所做出的答案分享出来,以供大家参考。这些答案是本人自己解答,并参考GitHub上相关的分享和Chegg.com相关资料。因为并没有权威的答案来源,所以可能会存在错误的地方,如有错误还希望大家能够帮助指出。

    第二章练习题和编程题答案

    练习题

    2.2节

    1.建立并运行由Kernighan和Ritchie编写的著名的“hello world”程序:

    1 #include <stdio.h>
    2 int main(void)
    3 {
    4     printf("hello world!
    ");
    5 }

    在编译时是否有警告信息?如果有,需要如何改进呢?

    答:如果使用部分比较老的编译器如turbo C等,会生成警告信息,指出main函数并没有返回任何值。这是因为在声明main函数时使用了int,表明函数会返回一个整型数值,这个数值为任意(因为main后面是void)。 但是上面的代码中并没有return语句,所以并不会返回任何值。加入return语句后便可消除警告。

    1 /* 加入return语句后的版本 */
    2 #include <stdio.h>
    3 int main(void)
    4 {
    5     printf("Hello world!
    ");
    6     return 0;
    7 }

    如果是使用IDE中的编译器,且IDE版本比较新(如本人目前使用的Code:Blocks)即使没有return语句,编译器也不会生成警告信息。

    2.思考下面的程序:

    1 #include <stdio.h>
    2 int main(void)
    3 {
    4     printf("Parkinson's Law:
    Work expands so as to ");
    5     printf("fill the time
    "); 
    6     printf("available for its completion.
    ");
    7     return 0;
    8 }

    (a)请指出程序中的指令和语句。

    (b)程序的输出是什么?

    答:(a)给出的程序中有一个指令#include和三条printf语句和一条return语句组成。

      (b)程序的输出结果为

    Parkinson's Law:
    Work expands so as to fill the time
    available for its completion.

    2.4节

    3.通过下列方法缩写程序dweight.c: (1)用初始化式替换对变量height、length和width的赋值;(2)去掉变量weight,在最后的printf语句中计算(volume + 165)/ 166。

    答:

     1 #include <stdio.h>
     2 int main(void)
     3 {
     4     /* 用初始化替代对变量赋值就是在声明变量时直接为其赋值 */
     5     int height = 8, length = 12, width = 10, volume = height * length * width;
     6     printf("Dimensions: %dx%dx%d
    ", length, width, height);
     7     printf("Volume (cubic inches): %d
    ", volume);
     8     /* 此处则省略原来对于weight,并将计算公式直接放入printf语句中 */
     9     printf("Dimensional weight (pounds): %d
    ", (volume + 165) / 166);
    10     return 0;
    11 }

    4.编写一个程序来声明几个int型和float型变量,不对这些变量进行初始化,然后直接显示它们的值。这些值是否有规律?(通常情况下没有)。

    答:

    1 #include <stdio.h>
    2 int main(void)
    3 {
    4     int a, b, c;
    5     float e, f, g;
    6     printf("a:%d
    b:%d
    c:%d
    e:%f
    %f:f
    g:%f
    "a, b, c, d, e, f, g);
    7     return 0;
    8 }

    实际上并没有什么规律,上面这些变量既没有被初始化也没有在程序中被赋值,这时变量被显示出来的值取决于许多因素,所以无法确定最终显示的结果。

    2.7节

    5.判断下列C语言标识符哪些不是合法的?

    (a) 100_bottles

    (b) _100_bottles

    (c) one_hundred_bottles

    (d) bottles_by_the_hundred_

    答:不合法的标识符只有(a),因为标识符只能以字母或下划线开头,而100_bottles是以数字开头的,所以不会发。另外C语言还规定了下划线后跟一个大写字母是保留字,不应该在程序中使用(书中后面有提及)。

    6.为什么说在标识符中使用多个相邻的下划线(如current___balance)不太合适?

    答:因为在阅读程序时很难分清到底有几个相邻的下划线,如current____balance和current_____balance,前者是4个下划线后者是5个下划线。在未来维护程序时不论是编写者本人还是他人,都容易弄混下划线的数量,造成不必要的混乱。

    7.判断下列哪些是C语言的关键字?

    (a) for

    (b) If

    (c) main

    (d) printf

    (e) while

    答:只有(a)for和(e)while是关键字,其余全都不是。(b) If 是因为C语言区分大小写,所以If和if并不相同,if是关键字但是If不是。(c)main和(d)printf也不是关键字,main()函数是C语言自动调用的函数,但是我们依旧可以将变量命名为main(不建议这样做)。printf()则是我们头文件<stdio.h>内包含的函数,如果不调用这个头文件那么我们一样可以将变量命名为printf。总的来说只有在关键字表里的单词才是关键字,其余都不是关键字。

    2.8节

    8.下面的语句中有多少个记号?

     answer=(3*q-p*p)/3;

    答:14个记号,分别是answer、=、(、3、*、q、-、p、*、p、)、/、3、;。

    9.在练习题8的记号之间插入空格,使该语句更易于阅读。

    答:answer = (3 * q - p * p) / 3;

    10.在dweight.c程序(2.4节)中,哪些空格是必不可少的?

    答:程序当中出现两次的int后面空格不能少,return 0; 中间的空格不能少。程序其他部分的空格都是为了易于阅读而存在的,即使可去掉程序本身依旧能够正常执行,只是增加了阅读困难。

    编程题

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

           *

          *

         *

    *   *

     * *

      *

    答:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5     printf("       *
    ");
     6     printf("      *
    ");
     7     printf("     *
    ");
     8     printf("*   *
    ");
     9     printf(" * *
    ");
    10     printf("  *
    ");
    11 
    12     return 0;
    13 }

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

    答:

     1 #include <stdio.h>
     2 /* 定义名为PI和SCALE_FACTOR的宏 */
     3 #define PI 3.14f
     4 #define SCALE_FACTOR 4.0f/3.0f
     5 
     6 int main(void)
     7 {
     8 
     9 /* 声明变量并对其初始化,r是半径,volume为计算结果,r_3是r的立方结果 */
    10     float r = 10.0f;
    11     float volume = 1.0f;
    12     float r_3 = 0.0f;
    13 
    14 /* 计算半径为10m的球体体积 */
    15     r_3 = r*r*r;
    16     volume = SCALE_FACTOR * PI * r_3;
    17 
    18 /* 显示结果 */
    19     printf("Result is:%f
    ", volume);
    20 
    21     return 0;
    22 }

    如果把分数4.0f/3.0f编程4/3,则会导致计算结果出现错误,因为4/3的结果是1,而不是1.33333333。C语言中整数相除会舍掉后面的小数。

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

    答:

     1 #include <stdio.h>
     2 /* 定义名为PI和SCALE_FACTOR的宏 */
     3 #define PI 3.14f
     4 #define SCALE_FACTOR 4.0f/3.0f
     5 
     6 int main(void)
     7 {
     8 
     9 /* 声明变量并对其初始化,r是半径,volume为计算结果,r_3是r的立方结果 */
    10     float r = 1.0f;
    11     float volume = 1.0f;
    12     float r_3 = 0.0f;
    13 
    14 /* 输入球体半径,注意变量r前面要有&符号 */
    15     printf("Enter number:");
    16     scanf("%f", &r);
    17 
    18 /* 计算半径为10m的球体体积 */
    19     r_3 = r*r*r;
    20     volume = SCALE_FACTOR * PI * r_3;
    21 
    22     printf("Result is:%f
    ", volume);
    23 
    24     return 0;
    25 }  

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

    Enter an amount: 100.00

    With tax added: $105.00

    答:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5 /* 声明变量money和taxed_money并初始化,前者表示金额,后者表示税后的金额 */
     6     float money = 0.0f;
     7     float taxed_money = 0.0f;
     8 
     9 /* 金额录入 */
    10     printf("Enter an amount:");
    11     scanf("%f", &money);
    12 
    13 /*计算税后的金额 */
    14     taxed_money = money * 1.05;
    15 
    16 /*显示结果,使用.2f是因为题目中税后的金额只保留了两位小数 */
    17     printf("With tax added: $%.2f
    ", taxed_money);
    18 
    19     return 0;
    20 }

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

     3x5+2x4-5x3-x2+7x-6 

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

    答:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5 /* 声明并初始化变量x和计算结果result,选择float型是因为题目中没有说用户不能输入小数 */
     6     float x = 0.0f;
     7     float result = 0.0f;
     8 
     9 /* 用户输入x的值,然后将值写入变量x中 */
    10     printf("Enter the value of x:");
    11     scanf("%f", &x);
    12 
    13 /* 计算公式的结果 */
    14     result = 3 * x * x * x * x * x + 2 * x * x * x * x - 5 * x * x * x -x * x + 7 * x - 6;
    15 
    16     printf("The result is: %f", result);
    17 
    18     return 0;
    19 }

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

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

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

    答:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5     float x = 0.0f;
     6     float result = 0.0f;
     7 
     8     printf("Enter the value of x:");
     9     scanf("%f", &x);
    10 
    11 /* 修改后的计算公式 */
    12     result = ((((3 * x + 2)* x - 5)* x - 1)* x + 7)* x - 6;
    13 
    14     printf("The result is: %f", result);
    15 
    16     return 0;
    17 }

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

    Enter a dollar amount: 93

    $20 bills:4

    $10 bills:1

      $5 bills:0

      $1 bills:3

    答:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5 /* 声明并初始化金额总数amount和美元面额变量 */
     6     int amount = 0;
     7     int b20 = 0, b10 = 0, b05 = 0, b01 = 0;
     8 
     9     printf("Enter a dollar amount:");
    10     scanf("%d", &amount);
    11 
    12 /* 因为要求是用最少张数付款,所以先用总金额除以20,得到的所需20美元的数量,再将总金额减去所需20美元后除以10,得到所需10美元数量,以此类推求出全部结果 */
    13     b20 = amount / 20;
    14     amount = amount - 20 * b20;
    15     b10 = amount / 10;
    16     amount = amount - 10 * b10;
    17     b05 = amount / 5;
    18     amount = amount - 5 * b05;
    19     b01 = amount / 1;
    20 
    21 /* 显示结果 */
    22     printf("
    $20 bills:%d
    $10 bills:%d
     $5 bills:%d
     $1 bills:%d
    ", b20, b10, b05, b01);
    23 
    24     return 0;
    25 }

    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。

    答:

     1 #include <stdio.h>
     2 
     3 int main(void)
     4 {
     5 /* 声明并初始化变量,loan是贷款金额,y_inter是年利率,m_inter月利率,m_pay是每月还款金额 */
     6     float loan = 0.0f;
     7     float y_inter = 0.0f;
     8     float m_inter = 0.0f;
     9     float m_pay = 0.0f;
    10 
    11 /* 用户输入贷款金额、年利率、月还款数 */
    12     printf("Enter amount of loan: ");
    13     scanf("%f", &loan);
    14     printf("Enter interest rate: ");
    15     scanf("%f", &y_inter);
    16     printf("Enter monthly payment: ");
    17     scanf("%f", &m_pay);
    18 
    19 /* 计算月利率,加1是因为如果直接是月利率乘以贷款金额得到的是利息,利息还要在加上贷款金额。加1之后可以直接求出贷款金额加利息后的结果 */
    20     m_inter = y_inter / 100 / 12 + 1;
    21 
    22 /* 求出第一个月还款之后的剩余金额 */
    23     loan = loan * m_inter - m_pay;
    24     printf("Balance remaining after first payment: %.2f
    ", loan);
    25 
    26 /* 求出第二个月还款之后的剩余金额 */
    27     loan = loan * m_inter - m_pay;
    28     printf("Balance remaining after second payment: %.2f
    ", loan);
    29 
    30 /* 求出第三个月还款之后的剩余金额 */
    31     loan = loan * m_inter - m_pay;
    32     printf("Balance remaining after third payment: %.2f
    ", loan);
    33 
    34     return 0;
    35 }
    36 /* 题目中还款是等额本息的方式,贷款20000,年利率6%,一共贷款5年 */

     

  • 相关阅读:
    全排列问题(递归&非递归&STL函数)
    基于python的机器学习开发环境安装(最简单的初步开发环境)
    X分钟速成Python
    X分钟速成Python3
    Python6
    Python5
    Error[Pe020]: identifier "FILE" is undefined
    串口 ------ 硬件流控
    STM32F103 ------ 时钟配置
    git
  • 原文地址:https://www.cnblogs.com/windrages/p/8179618.html
Copyright © 2011-2022 走看看