您好,欢迎来到聚文网。 登录 免费注册
C程序设计语言(原书第2版.新版)习题解答(典藏版)

C程序设计语言(原书第2版.新版)习题解答(典藏版)

  • 字数: 80
  • 装帧: 平装
  • 出版社: 机械工业出版社
  • 作者: [美]克劳·汤多(Clovis L.Tondo),斯科特·吉米拜尔(Scott E.Gimpel)
  • 出版日期: 2019-04-01
  • 商品条码: 9787111619017
  • 版次: 1
  • 开本: 16开
  • 页数: 140
  • 出版年份: 2019
定价:¥39 销售价:登录后查看价格  ¥{{selectedSku?.salePrice}} 
库存: {{selectedSku?.stock}} 库存充足
{{item.title}}:
{{its.name}}
精选
内容简介
本书是对Brian W.Kernighan和Dennis M.Ritchie所著的《C程序设计语言(第2版·新版)》所有练习题的解答,是不错的编程实战辅导书。K&R的著作是C语言方面的经典教材,而这本与之配套的习题解答将帮助您更加深入地理解C语言并掌握良好的C语言编程技能。
目录
出版者的话前言第1章 导言1第2章 类型、运算符与表达式27第3章 控制流37第4章 函数与程序结构43第5章 指针与数组61第6章 结构99第7章 输入与输出111第8章 UNIX系统接口123
摘要
    导 言练习1-1 (《C程序设计语言(第2版·新版)》即教材第3页)在你自己的系统中运行“hello,world”程序。再有意去掉程序中的部分内容,看看会得到什么出错信息。上面这个例子省略了换行符(\n),这将使光标停留在输出信息的末尾。第二个例子省略了printf()后面的分号。C程序的语句必须以分号结尾(参见K&R原著第10页)。因此,对于本例,编译器将识别出少了一个分号并给出相应的出错信息。在第三个例子里,\n后面的双引号"被错写为单引号'。于是,这个单引号及其后面的右括号和分号将被看作整个输出字符串的一部分。编译器将把这种情况视为一个错误,会报告说缺失了一个双引号;在右花括号前缺失了一个右圆括号;字符串过长;字符串中带有换行符。练习1-2 (教材第3页)做个实验,当printf函数的参数字符串中包含\c(其中c是上面的转义字符序列中未曾列出的某个字符)时,观察一下会出现什么情况。参考手册(参见K&R原著附录A,第193页)中提到:“如果\后面紧跟的字符不在以上指定的字符中,则其行为是未定义的。”上面这段代码的执行结果与具体的编译器相关。一种可能出现的结果是:其中,是ASCII值等于7的字符所产生的一声短蜂鸣。在\的后面,可以用最多3个八进制数字(参见K&R原著第37页)来代表一个字符,而\7在ASCII字符集中代表的是一声短蜂鸣。练习1-3 (教材第8页)修改温度转换程序,使之能在转换表的顶部打印一个标题。在循环语句之前增加的printf("Fahr Celsius\n");语句将在温度转换表的顶部产生一个表头。为了让输出内容与这个表头对齐,我们还在%3.0f和%6.1f之间增加了两个空格。上面这个程序中的其余语句与K&R原著第12页中给出的代码接近一致。练习1-4 (教材第8页)编写一个程序打印摄氏温度转换为相应华氏温度的转换表。本程序将输出一个摄氏温度(0~300)到华氏温度的转换表。华氏温度是用以下语句计算得到的:本题的解题思路与打印华氏温度到摄氏温度的对照表程序(见K&R原著第12页)是相同的。整型变量lower、upper、step分别对应变量celsius的下限、上限、步长。程序先把变量celsius初始化为它的下限,再在while循环中把对应的华氏温度计算出来。然后,程序打印出这组摄氏温度和华氏温度的值,并按步长递增变量celsius的值。while循环将一直执行,直到变量celsius超出其上限为止。练习1-5 (教材第9页)修改温度转换程序,要求以逆序(即按照从300度到0度的顺序)打印温度转换表。专享的修改之处是:这条for语句的第一部分负责把华氏温度变量(fahr)初始化为它的上限;for语句的第二部分(即for循环的控制条件)负责检查变量fahr是否大于或等于它的下限—只要这个检查的结果为真,for语句就将继续循环执行;for语句的第三部分(即步长表达式)负责对变量fahr按步长进行递减操作。练习1-6 (教材第11页)验证表达式getchar()!= EOF的值是0还是1。根据K&R原著第17页的论述,表达式相当于本程序从系统的标准输入读取字符并使用了上面的表达式。当有字符可读时,getchar()不会返回文件结束符(即EOF),所以的值为真,变量c将被赋值1。当程序遇到文件结束符时,表达式的值为假,此时,变量c将被赋值0,程序将结束运行。练习1-7 (教材第11页)编写一个打印EOF值的程序。符号常量EOF是在头文件中定义的。在上面这个程序中,printf()语句中双引号外的EOF将被替换为头文件中紧跟在之后的文本。在我们的系统中,EOF被定义为-1,但在其他系统中,EOF可能被定义为其他的值。这正是使用EOF等标准符号常量能够增加程序可移植性的原因所在。练习1-8 (教材第13页)编写一个统计空格、制表符与换行符个数的程序。整型变量nb、nt和nl分别用来统计空格、制表符和换行符的个数。这三个变量的初值都是0。在while循环的循环体内,出现在输入中的每一个空格、制表符和换行符都将被记录。while循环中的三条if语句在每次循环中都将被执行。如果程序读到的字符不是空格、制表符或换行符,就不执行任何操作。如果程序读到的字符是这三个符号之一,就对相应的计数器加1。当while循环终止(即getchar返回EOF)时,本程序将把空格、制表符和换行符的统计结果打印出来。K&R原著对if-else语句的介绍最早出现于第21页,下面是使用了这一语法结构的实现方法:练习1-9 (教材第13页)编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。整型变量c负责记录当前输入字符的ASCII值,而整型变量lastc则记录着前一个输入字符的ASCII值。符号常量NONBLANK负责把变量lastc初始化为一个任意的非空格字符。while循环体中的第一条if语句输出非空格字符,第二条if语句处理空格字符,而第三条if语句用于检查当前的空格字符究竟是一个单个的空格符还是一串空格中的第一个空格。最后,对变量lastc进行刷新。以上操作将一直重复到while循环终止(即getchar返回EOF)为止。对if-else语句的介绍最早出现于教材第14页,下面是使用了这一语法结构的实现方法:对逻辑或(OR)操作符 的介绍也最早出现于教材第14页,下面是使用了这一知识的实现方法:练习1-10 (教材第13页)编写一个将输入复制到输出的程序,并将其中的制表符替换为\t,将回退符替换为\b,将反斜杠替换为\\。这样可以将制表符和回退符以可见的方式显示出来。输入的字符可以是一个制表符、一个回退符、一个反斜杠或者其他任何字符。如果输入是一个制表符,我们就把它替换为\t;如果输入是一个回退符,我们就把它替换为\b;如果输入是一个反斜杠,我们就把它替换为\\;其他字符则按原样输出。在C语言中,反斜杠是用'\\'来表示的。因此,如果我们想输出两个反斜杠,就必须把字符串"\\\\"传递给printf函数。对if-else语句的介绍最早出现于教材第14页,下面是使用了这一语法结构的实现方法:练习1-11 (教材第15页)你准备如何测试单词计数程序?如果程序中存在某种错误,那么什么样的输入最可能发现这类错误呢?单词计数程序的测试工作首先要从没有任何输入的情况开始。此时,该程序的输出结果应该是“0 0 0”,即零行、零单词、零字符。接下来测试输入单字符单词的情况。此时,该程序的输出结果应该是“1 1 2”,即一行、一个单词、两个字符(一个字母加上一个换行符)。再测试一个由两个字符组成的单词。此时,该程序的输出结果应该是“1 1 3”,即一行、一个单词、三个字符(二个字母加上一个换行符)。然后,再测试两个单字符单词的情况。首先,两个单词出现在同一行,此时的输出结果应该是“1 2 4”;然后,两个单词各占一行,此时的输出结果应该是“2 2 4”。那些满足边界条件的输入情况最有助于发现单词计数程序中的错误。这些边界条件包括:—没有输入—没有单词(只有换行符)—没有单词(只有空格、制表符和换行符)—每个单词各占一行的情况(没有空格和制表符)—单词出现于文本行行首的情况—单词出现于一串空格之后的情况练习1-12 (教材第15页)编写一个程序,以每行一个单词的形式打印其输入。整型变量state是一个布尔量,用于记录程序的处理过程是否正处于某个单词的内部。在程序刚开始运行的时候,变量state将被初始化为OUT,表明尚未处理任何数据。第一条if语句判断变量c是否是一个单词分隔符。如果是,则第二条if语句将判断这个单词分隔符是否表示某个单词结束。如果是,就输出一个换行符并修改变量state的值;如果不是,则不进行任何操作。如果c不是一个单词分隔符,那么,它将或者是某单词的第一个字符,或者是一个单词中除第一个字符之外的其他字符。对于第一种情况(c是某单词的第一个字符),程序将修改变量state的值并输出这个字符;对于第二种情况(c是某个单词中的其他字符),程序直接输出这个字符。练习1-13 (教材第17页)编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易绘制,垂直方向的直方图则要困难些。空格、换行符或制表符标志着单词的结束。如果有一个单词(nc>0)且它的长度小于允许的单词优选长度(nc=MAXWORD),这个程序将对变量ovflow加1以记录长度大于或等于MAXWORD的单词的个数。在读入全部单词之后,我们的程序将找出数组wl中的优选值(maxvalue)。变量len是根据MAXHIST和maxvalue的值计算得出的wl[i]所对应的直方图长度。如果wl[i]大于零,就至少要打印出一个星号。这个实现方法将输出一个垂直方向的直方图。这个程序从开始直到求值maxvalue的过程与前一个程序接近相同。然后,这个程序需要计算数组wl中的每一个元素并判断是否需要在数组元素的对应位置上打印一个星号。这一判断过程必不可少,因为垂直方向直方图的所有直方条是同步打印的。最后的两个for循环用来输出数组wl各元素的下标和取值。练习1-14 (教材第17页)编写一个程序,打印输入中各个字符出现频度的直方图。这个程序与练习1-13中的水平直方图输出程序很相似,但我们现在统计的是各个字符的出现频度。程序中使用了一个元素个数等于MAXCHAR的字符计数器数组,如果我们使用的字符集中存在值大于或等于MAXCHAR的字符,则这些字符将被忽略。另一个区别是我们使用了一个宏来判断某个字符是否是一个可显示字符。关于包含的头文件的讨论出现于K&R原著第43页,对isprint的介绍则出现于K&R原著第249页(附录B:标准库)。练习1-15 (教材第19页)重新编写1.2节中的温度转换程序,使用函数实现温度转换计算。我们采用一个函数把华氏温度转换为摄氏温度。这个函数名为celsius,它的输入参数是一个浮点数,返回值也是一个浮点数。这个函数将通过return语句返回表达式的值。有时,表达式是一个简单变量,例如power函数(参见K&R原著第26页);但有时我们也会使用一个比较复杂的表达式,例如这里的celsius函数,因为这样做可以使所有工作都在return语句中完成。因为函数celsius的输入参数是一个浮点数,它的返回值也是一个浮点数,所以我们把它声明为如下的形式:练习1-16 (教材第22页)修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文本。我们只对原来的主函数进行了一处修改,如下所示:这条语句将把输入行的长度(len)和保存在数组line里的字符尽可能多地打印出来。我们对函数getline也做了几处修改。首先,循环语句不再检查字符数是否超出数组s的—因为这一不再是for循环的终止条件之一了,现在的getline能返回任意长的输入行的长度并能存储尽可能多的输入行内容。其次,原来for循环中用于判断字符串数组是否还有空位置的表达式被修改为语句之所以要进行这样的修改,是因为数组s的最后一个下标是而这又是因为数组s中有lim个元素且我们已经读取了输入字符。所以将在数组s里给换行符留出一个位置,即还要给字符串结束符留出一个位置,即字符串的长度将通过变量i返回;而变量j则记录着被复制到字符串s中的字符的个数。

蜀ICP备2024047804号

Copyright 版权所有 © jvwen.com 聚文网