《C程序设计语言》K&R版习题摘录一
时间:2010-07-22 来源:RobinKQin
第一章:
1、编写一个将输入复制到输出和程序,并将其中的制表符替换为\t,把回退符替换成\b,把反斜杠替换为 \\,这样可以将制表符和回退符以可见的方式显示 出来。(1-10)
2、你准备如何测试单词计数程序?如果程序中存在某种错误,那么什么样的输入最可能发现这类错误呢?(1-11)
3、 编写一个程序,以每行一个单词的形式打印其输入。(1-12)
int c, state; //inside a word
state = OUT; //outside a word
//pirnt input one word per line
while((c = getchar()) != EOF)
{
if(c == ' ' || c == '\n' || c == '\t')
{
if(state == IN)
{
state = OUT;
putchar('\n'); //finish the word
}
}
else if(state == OUT)
{
state = IN;
putchar(c); //beginning of word
}
else
putchar(c); //inside a word
}
分析:整形变量state是一个布尔量,用于刻录程序的处理过程是否正处于某个单词的内部。在程序刚开始运行的暑假,变量state将被初始 化为OUT,表明尚未处理任何数据。
第一个if语句: if(c == ' ' || c == '\n' || c == '\t') 判断变量c是否是一个单词分隔符。如果是,则第二条if语句 if(state == IN)将判断这个单词分隔符是否表示某个单词结束。如果是,就输出一个换行符并修改变量state的值;如果不是,则不进行任何操作。
如果c不是一个单词分隔符,那么,它将或者是某单词的第一个字符、或者是一个单词中除第一个字符之外的其他字符。对于第一种情况(是某单词的第一个字 符),程序修改变量state的值并输出这个字符;对于第二种情况(是一个单词中除第一个字符之外的其他字符),程序直接输出这个字符。
4、 直方图的输出。(1-13)
5、修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文 本。(1-16)--------getline() copy()
6、编写一个程序,删除每个输入行末尾的空格及制表符,关删除完全是空格的行。 (1-18) remove()
7、编写函数reverse(s)将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一 个输入行中的字符顺序。(1-19) reverse()
8、请编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满 到下一个制表符终止的地方。假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢?(1-20)
9、 编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变。假设制表符终止的位置与练习1-20的detab程序的情况相 同。当使用一个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪种替换字符比较好?(1-21)
10、编写一个程序,把较长的 输入行“拆”成短一些的两行或多行,拆行的位置在输入行的第n列之前的最后一个非空格符之后。要保证程序能够智能地处理输入行很长以及在指定的列前没有空 格或制表符的情况。(1-22)
11、编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符串常量。在C语言程序 中,注释不允许嵌套。(1-23)
12、编写一个程序,查找C语言程序中的基本语法错误,如圆括号、方括号以及花括号不配对等。要正确处 理引号(包括单引号、双引号)、转义字符序列与注释。(1-24)
------------------------------------------------------------------------------------------------------------------------------------
第二章:
1、编写一个将输入复制到输出和程序,并将其中的制表符替换为\t,把回退符替换成\b,把反斜杠替换为\\,这样可 以将制表符和回退符以可见的方式显示 出来。(1-10)
2、你准备如何测试单词计数程序?如果程序中存在某种错误,那么什么样的输入最可能发现这类错误呢?(1-11)
3、 编写一个程序,以每行一个单词的形式打印其输入。(1-12)
int c, state; //inside a word
state = OUT; //outside a word
//pirnt input one word per line
while((c = getchar()) != EOF)
{
if(c == ' ' || c == '\n' || c == '\t')
{
if(state == IN)
{
state = OUT;
putchar('\n'); //finish the word
}
}
else if(state == OUT)
{
state = IN;
putchar(c); //beginning of word
}
else
putchar(c); //inside a word
}
分析:整形变量state是一个布尔量,用于刻录程序的处理过程是否正处于某个单词的内部。在程序刚开始运行的暑假,变量state将被初始 化为OUT,表明尚未处理任何数据。
第一个if语句: if(c == ' ' || c == '\n' || c == '\t') 判断变量c是否是一个单词分隔符。如果是,则第二条if语句 if(state == IN)将判断这个单词分隔符是否表示某个单词结束。如果是,就输出一个换行符并修改变量state的值;如果不是,则不进行任何操作。
如果c不是一个单词分隔符,那么,它将或者是某单词的第一个字符、或者是一个单词中除第一个字符之外的其他字符。对于第一种情况(是某单词的第一个字 符),程序修改变量state的值并输出这个字符;对于第二种情况(是一个单词中除第一个字符之外的其他字符),程序直接输出这个字符。
4、 直方图的输出。(1-13)
5、修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文 本。(1-16)--------getline() copy()
6、编写一个程序,删除每个输入行末尾的空格及制表符,关删除完全是空格的行。 (1-18) remove()
7、编写函数reverse(s)将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一 个输入行中的字符顺序。(1-19) reverse()
8、请编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满 到下一个制表符终止的地方。假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢?(1-20)
9、 编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变。假设制表符终止的位置与练习1-20的detab程序的情况相 同。当使用一个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪种替换字符比较好?(1-21)
10、编写一个程序,把较长的 输入行“拆”成短一些的两行或多行,拆行的位置在输入行的第n列之前的最后一个非空格符之后。要保证程序能够智能地处理输入行很长以及在指定的列前没有空 格或制表符的情况。(1-22)
11、编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符串常量。在C语言程序 中,注释不允许嵌套。(1-23)
12、编写一个程序,查找C语言程序中的基本语法错误,如圆括号、方括号以及花括号不配对等。要正确处 理引号(包括单引号、双引号)、转义字符序列与注释。(1-24)
------------------------------------------------------------------------------------------------------------------------------------
第三章:
1、折半查找 int binsearch(int x, int v[], int n)
2、编写 一个函数escape(s, t),将字符串t复制到字符串s中,并在复制过程中将换行符、制表符等不可显示字符分别转换为\n、\t等相应的可显示的转义字符序列。要求使用 switch语句。再编写一个具有相反功能的函数,在复制过程中将转义字符序列转换为实际字符。
3、编写函数 expand(s1,s2),将字符串s1中类似于a-z一类的速记符号在字符串s2中扩展为等价的完整列表abc.....xyz。该函数可以处理大小 写字母和数字,并可以处理a-b-c、a-z0-9与a-z等类似的情况。作为前导和尾随的字符原样复制。(3-3)
4、在数的对二的补 码表示中,我们编写的itoa函数不能处理最大的负数,即n等于-(2的(字长-1)次方)的情况。请解释其原因。修改该函数,使它在任何机器上运行时都 能打印出正确的值。
5、编写函数 itob(n, s, b),将整数n转换为以b为底的数,并将转换结果以字符的形式保存到字符串s中。(3-5)
6、修改 itoa 函数,使得该函数可以接收三个参数。其中,第三个参数为最小字段宽度。为了保证转换后所得的结果至少具有第三个参数指定的最小宽度,在必要时应在所得结果 的左边填充一定的空格。
1、编写一个将输入复制到输出和程序,并将其中的制表符替换为\t,把回退符替换成\b,把反斜杠替换为 \\,这样可以将制表符和回退符以可见的方式显示 出来。(1-10)
2、你准备如何测试单词计数程序?如果程序中存在某种错误,那么什么样的输入最可能发现这类错误呢?(1-11)
3、 编写一个程序,以每行一个单词的形式打印其输入。(1-12)
int c, state; //inside a word
state = OUT; //outside a word
//pirnt input one word per line
while((c = getchar()) != EOF)
{
if(c == ' ' || c == '\n' || c == '\t')
{
if(state == IN)
{
state = OUT;
putchar('\n'); //finish the word
}
}
else if(state == OUT)
{
state = IN;
putchar(c); //beginning of word
}
else
putchar(c); //inside a word
}
分析:整形变量state是一个布尔量,用于刻录程序的处理过程是否正处于某个单词的内部。在程序刚开始运行的暑假,变量state将被初始 化为OUT,表明尚未处理任何数据。
第一个if语句: if(c == ' ' || c == '\n' || c == '\t') 判断变量c是否是一个单词分隔符。如果是,则第二条if语句 if(state == IN)将判断这个单词分隔符是否表示某个单词结束。如果是,就输出一个换行符并修改变量state的值;如果不是,则不进行任何操作。
如果c不是一个单词分隔符,那么,它将或者是某单词的第一个字符、或者是一个单词中除第一个字符之外的其他字符。对于第一种情况(是某单词的第一个字 符),程序修改变量state的值并输出这个字符;对于第二种情况(是一个单词中除第一个字符之外的其他字符),程序直接输出这个字符。
4、 直方图的输出。(1-13)
5、修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文 本。(1-16)--------getline() copy()
6、编写一个程序,删除每个输入行末尾的空格及制表符,关删除完全是空格的行。 (1-18) remove()
7、编写函数reverse(s)将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一 个输入行中的字符顺序。(1-19) reverse()
8、请编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满 到下一个制表符终止的地方。假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢?(1-20)
9、 编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变。假设制表符终止的位置与练习1-20的detab程序的情况相 同。当使用一个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪种替换字符比较好?(1-21)
10、编写一个程序,把较长的 输入行“拆”成短一些的两行或多行,拆行的位置在输入行的第n列之前的最后一个非空格符之后。要保证程序能够智能地处理输入行很长以及在指定的列前没有空 格或制表符的情况。(1-22)
11、编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符串常量。在C语言程序 中,注释不允许嵌套。(1-23)
12、编写一个程序,查找C语言程序中的基本语法错误,如圆括号、方括号以及花括号不配对等。要正确处 理引号(包括单引号、双引号)、转义字符序列与注释。(1-24)
------------------------------------------------------------------------------------------------------------------------------------
第二章:
1、编写一个将输入复制到输出和程序,并将其中的制表符替换为\t,把回退符替换成\b,把反斜杠替换为\\,这样可 以将制表符和回退符以可见的方式显示 出来。(1-10)
2、你准备如何测试单词计数程序?如果程序中存在某种错误,那么什么样的输入最可能发现这类错误呢?(1-11)
3、 编写一个程序,以每行一个单词的形式打印其输入。(1-12)
int c, state; //inside a word
state = OUT; //outside a word
//pirnt input one word per line
while((c = getchar()) != EOF)
{
if(c == ' ' || c == '\n' || c == '\t')
{
if(state == IN)
{
state = OUT;
putchar('\n'); //finish the word
}
}
else if(state == OUT)
{
state = IN;
putchar(c); //beginning of word
}
else
putchar(c); //inside a word
}
分析:整形变量state是一个布尔量,用于刻录程序的处理过程是否正处于某个单词的内部。在程序刚开始运行的暑假,变量state将被初始 化为OUT,表明尚未处理任何数据。
第一个if语句: if(c == ' ' || c == '\n' || c == '\t') 判断变量c是否是一个单词分隔符。如果是,则第二条if语句 if(state == IN)将判断这个单词分隔符是否表示某个单词结束。如果是,就输出一个换行符并修改变量state的值;如果不是,则不进行任何操作。
如果c不是一个单词分隔符,那么,它将或者是某单词的第一个字符、或者是一个单词中除第一个字符之外的其他字符。对于第一种情况(是某单词的第一个字 符),程序修改变量state的值并输出这个字符;对于第二种情况(是一个单词中除第一个字符之外的其他字符),程序直接输出这个字符。
4、 直方图的输出。(1-13)
5、修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能多地打印文 本。(1-16)--------getline() copy()
6、编写一个程序,删除每个输入行末尾的空格及制表符,关删除完全是空格的行。 (1-18) remove()
7、编写函数reverse(s)将字符串s中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一 个输入行中的字符顺序。(1-19) reverse()
8、请编写程序detab,将输入中的制表符替换成适当数目的空格,使空格充满 到下一个制表符终止的地方。假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢?(1-20)
9、 编写程序entab,将空格串替换为最少数量的制表符和空格,但要保持单词之间的间隔不变。假设制表符终止的位置与练习1-20的detab程序的情况相 同。当使用一个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪种替换字符比较好?(1-21)
10、编写一个程序,把较长的 输入行“拆”成短一些的两行或多行,拆行的位置在输入行的第n列之前的最后一个非空格符之后。要保证程序能够智能地处理输入行很长以及在指定的列前没有空 格或制表符的情况。(1-22)
11、编写一个删除C语言程序中所有的注释语句。要正确处理带引号的字符串与字符串常量。在C语言程序 中,注释不允许嵌套。(1-23)
12、编写一个程序,查找C语言程序中的基本语法错误,如圆括号、方括号以及花括号不配对等。要正确处 理引号(包括单引号、双引号)、转义字符序列与注释。(1-24)
------------------------------------------------------------------------------------------------------------------------------------
第三章:
1、折半查找 int binsearch(int x, int v[], int n)
2、编写 一个函数escape(s, t),将字符串t复制到字符串s中,并在复制过程中将换行符、制表符等不可显示字符分别转换为\n、\t等相应的可显示的转义字符序列。要求使用 switch语句。再编写一个具有相反功能的函数,在复制过程中将转义字符序列转换为实际字符。
3、编写函数 expand(s1,s2),将字符串s1中类似于a-z一类的速记符号在字符串s2中扩展为等价的完整列表abc.....xyz。该函数可以处理大小 写字母和数字,并可以处理a-b-c、a-z0-9与a-z等类似的情况。作为前导和尾随的字符原样复制。(3-3)
4、在数的对二的补 码表示中,我们编写的itoa函数不能处理最大的负数,即n等于-(2的(字长-1)次方)的情况。请解释其原因。修改该函数,使它在任何机器上运行时都 能打印出正确的值。
5、编写函数 itob(n, s, b),将整数n转换为以b为底的数,并将转换结果以字符的形式保存到字符串s中。(3-5)
6、修改 itoa 函数,使得该函数可以接收三个参数。其中,第三个参数为最小字段宽度。为了保证转换后所得的结果至少具有第三个参数指定的最小宽度,在必要时应在所得结果 的左边填充一定的空格。
相关阅读 更多 +