1-1.在你自己的系统中运行 "hello,word"程序 再有意去掉程序中的部分内容,看看会得到什么出错信息。
1-2.做个试验,当printf函数的参数字符串中包含\c(其中c是上面的转义字符序列中未曾列出的一个字符)时,观察一下会出现什么情况。
1-3.修改温度转换程序,使之能在转换表的顶部打印一个标题。
1-4.编写一个程序打印摄氏温度转换为华氏温度的转换表。
1-5.修改温度转换程序,要求以逆序(即按照从3000度到0度的顺序)打印温度转换表。
1-6 验证表达式getchar() != EOF的值是0还是1。
1-7 编写一个打印EOF值的程序。
1-8 编写一个统计空格、字符表与换行符个数的程序。
1-9 编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替。
1-10 编写一个将输入复制到输出的程序,并将其中的制表符替换为\t,把回退符替换为\b,把反斜扛替换为\。这样可以将制表符和回退符以可见的方式显示出来。
1-11 你准备如何测试单词计数程序?如果程序中存在某种错误,那么什么样的输入可能发现这类错误呢?
1-12 编写一个程序,以每行一个单词的形式打印其输入。
1-13 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易绘制,垂直放图则要苦难些。
1-14 编写一个程序,打印输入中各个字符出现频度的直方图。
1-15 重新编写(1.2节)中的温度转换程序,使用函数实现温度转换计算。
1-16 修改打印最长文本行的程序(P.21)的主程序main,使之可以打印任意长度的输入行的长度,并尽可能地打印文本。
1-17 编写一个程序,打印长度大于80个字符的所有输入行。
1-18 编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行。
1-19 编写函数reverse(s),将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。
1-20 编写detab,将输入中的制表符替换成适当数目的空格,使空格充满到下一个制表符终止位的地方。假设制表符终止位的位置是固定的,比如每个n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢?
1-21 编写entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变。假设制表符终止位置与练习 1-20 的detab程序的情况相同。当使用一个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪一种替换字符比较好?
1-22 编写一个程序,把较长的输入行“折”成短一些的两行或多行,执行的位置在输入行的第n列之前的最后一个非空格之后。要保证程序能够智能地处理输入行很长以及在指定的列前没有空格或制表符的情况。
1-23 编写一个程序删除C语言程序中的所有注释语句。同时要正确处理/识别带引号的字符
串与字符常量。在C语言中,注释不允许嵌套。
1-24 编写一个程序,查C语言程序中的基本语法错误,如圆括号、方括号、花括号不配对等。要正确处理引号(包括单引号和双引号)、转移字符序列与注释。(如果读者想把该程序编写成完全通用的程序,难度会比较大。)
2-1 编写一个程序以确定分别由signed及unsigned限定的char、short、int与long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现。后一种方法的实现较困难一些,因为要确定各种浮点类型的取值范围。
2-2 在不使用运算符&&和||的条件下编写一个与上面(P.32)for循环语句等价的循环语句。
2-3 编写htoi(s),把由16进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值。字符串允许包含的数字包括:0 ~ 9、a ~ f以及A ~ F。
2-4 重新编写squeeze(s1, s2)[P.37],将字符串s1中任何与字符串s2中字符匹配的字符都删除。
2-5 编写函数any(s1, s2),将字符串s2中任一字符在字符串s1中第一次出现的位置作为结果返回。如果s1中不包含s2中的字符,则返回-1。(标准库函数strpbrk具有同样的功能,但它返回的是指向该位置的指针)
2-6 编写一个函数setbits(x, p, n, y),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
编程递归函数2-7 编写一个函数invert(x, p, n),该函数返回对x执行下列操作后的结果值:将x中从第p位开始的n个(二进制)位求反(即,1变成0,0变成1),x的其余各位保持不变。
2-8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后所得到的的值。
2-9 在求对二的补码(Two’s complement)时,表达式x &=(x - 1)可以删除x中最右边值为1的一个二进制位(如1000中的1)。请解释这样做的道理。用这一方法重写bitcount函数(P.40 ~ P.41),以加快其执行速度。
2-10 重新编写将大写字母转换为小写字母的函数lower(P.34),并用条件表达式替换其中的i
f-else结构。
3-1 在上面(P.46)有关折半查的例子中,while循环语句内共执行了两次测试,其实只要一次就足够(代价是将更多的测试在循环外执行)。重写该函数,使得在循环内部只执行一次测试。比较两个版本函数的运行时间。
3-2 编写一个函数escape(s, t),将字符串t复制到字符串s中,并在复制过程中将换行符、制表符等不可见字符分别换成\n、\t等相应的可见的转义字符序列。要求使用switch语句。再编写一个具有相反功能的函数,在复制过程中将转义字符序列转换为实际字符。
3-3 编写函数expand(s1, s2),将字符串s1中类似于a-z一类的速记符号在字符串s2中扩展为等价的完整列表abc…xyz。该函数可以处理大小写字母和数字,并可以处理a-b-c、a-z0-9与-a-z等类似的情况。作为前导和尾随的-字符原样排印。
3-4 在数的对二补码表示中,我们编写的itoa函数(P.52-53)不能处理最大的负数,即n等于-(2^字长-1)的情况。请解释原因。修改该函数,使它在任何机器上运行时都能打印出正确的值。
3-5 编写函数itob(n, s, b),将整数n转换为以b为底的数,并将转换结果以字符的形式保存到字符串s中。例如,itob(n, s, 16)把整数n格式化成十六进制整数保存在s中。
3-6 修改itoa函数,使得该函数可以接收三个参数。其中,第三个参数为最小字段宽度。为了保证转换后所得的结果至少具有第三个参数指定的最小宽度,在必要时应在所得结果的左边填充一定的空格。
4-1 编写函数strrindex(s, t),它返回字符串t在s中最右边出现的位置、如果s中不包含t,则返回-1。
4-2 对atof函数(P.60)进行扩充,使它可以处理形如123.45e-6的科学表示法,其中,浮点数后面可能会紧跟一个e或E以及一个指数(可能有正负号)
4-3 在有了基本框架后,对计算器程序进行扩充就比较简单了。在该程序中加入取模(%)运算符,并注意考虑负数的情况。
4-4 在栈操作中添加几个命令,分别用于在不弹出元素的情况下打印栈顶元素;复制栈顶元素;交换栈顶两个元素的值。另外增加一个命令用于清空栈。
4-5 给计算器程序增加访问sin、exp与pow等库函数的操作。有关这些库函数的详细信息,参见附录B.4节中的头文件< math.h>。
4-6 给计算器程序增加处理变量的命令(提供26个具有单个英文字母变量名的变量很容易)。增加一个变量存放最近打印的值。
4-7 编写一个函数ungets(s),将整个字符串s压回到输入中。ungets函数需要使用buf和bufp吗?它能否仅使用ungetch函数?
4-8 假定最多只压回一个字符。请相应地修改getch与ungetch这两个函数。
4-9 以上介绍的getch与ungetch函数不能正确的处理压回的EOF。考虑压回EOF时应该如何处理?请实现你的设计方案。
4-10 另一种方法是通过getline函数读入整个输入行,这种情况下可以不适用getch与ungetch函数。请运用这一方法修改计算器程序。
4-11 修改getop函数,使其不必使用ungetch函数。提示:可以使用一个static类型的内部变量解决该问题。
简单分析:ungetch函数是将非数字字符压回到了输入流中(缓冲区中),它会被重新读取;getop函数每次只会回压一个字符到输入流中。根据static局部变量的特性,在getop函数中定义一个static int类型的变量即可。
4-12 运用printd函数(P.74)的设计思想编写一个递归版本的itoa函数,即通过递归调用把整数转换为字符串。
4-13 编写一个递归版本的reverse(s)函数,以将字符串s倒置。
4-14 定义宏swap(t, x, y)以交换t类型的两个参数。(使用程序块结构会对你有所帮助。)
5-1 在上面的例子中,如果符号+或-的后面紧跟的不是数字,getint函数将把符号视为数字0的有效表达方式。修改该函数,将这种形式的+或-符号重新写回到输入0中。
5-2 模仿函数getint的实现方法,编写一个读取浮点数的函数getfloat。getfloat函数的返回值应该是什么类型?
5-3 用指针方式实现第2章中的函数strcat。函数strcat(s, t)将t指向的字符串复制到s指向的字符串的尾部。
5-4 编写strend(s, t)。如果字符串t出现在字符串s的尾部,该函数返回1;否则返回0。
5-5 实现库函数strncpy、strncat和strncmp,它们最多对参数字符串中的前n个字符进行操作。例如,函数strncpy(s, t, n)将t中最多前n个字符复制到s中。更详细的说明请参见附录B。
5-6 采用指针而非数组索引的方式改写前面章节和练习中的某些程序,例如getline(第1、4章),atoi、itoa以及它们的变体形式(第2、3、4章),reverse(第3章),strindex、getop(第4章)等等。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。