C Primer Plus 第八章 课后答案

目录

 

复习题

1.putchar(getchar())是一个有效表达式,它实现什么功能?getchar(putchar())是否也是有效表达式

2.下面的语句分别完成什么任务?

a.putchar('H');

b.putchar('\007');

c.putchar('\n');

d.putchar('\b');

3.假设有一个名为 count 的可执行程序,用于统计输入的字符数。设计一个使用 count 程序统计essay文件中字符数的命令行,并把统计结果保存在essayct文件中

4.给定复习题3中的程序和文件,下面哪一条是有效的命令?

a.essayct <>

b.count essay

c.essay >count

5.EOF是什么

6.对于给定的输出(ch是int类型,而且是缓冲输入),下面各程序段的输出分别是什么?

a.输入如下:

If you quit, I will.[enter]

程序段如下:

while ((ch = getchar()) != 'i')

        putchar(ch);

b.输入如下:

Harhar[enter]

程序段如下:

while ((ch = getchar()) != '\n')

{

        putchar(ch++);

        putchar(++ch);

}

7.C如何处理不同计算机系统中的不同文件和换行约定

8.在使用缓冲输入的系统中,把数值和字符混合输入会遇到什么潜在的问题

编程练习

1.设计一个程序,统计在读到文件结尾之前读取的字符数

2.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。程序要打印每个输入的字符及其相应的ASCII十进制值。

注意,在ASCII序列中,空格字符前面的字符都是非打印字符,要特殊处理这些字符。如果非打印字符是换行符或制表符,则分别打印\n或\t。否则,使用控制字符表示法。例如,ASCII的1是Ctrl+A,可显示为^A。注意,A的ASCII值是Ctrl+A的值加上64。其他非打印字符也有类似的关系。除每次遇到换行符打印新的一行之外,每行打印10对值。

(注意:不同的操作系统其控制字符可能不同。)

3.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。该程序要报告输入中的大写字母和小写字母的个数。假设大小写字母数值是连续的。或者使用ctype.h库中合适的分类函数更方便

4.编写一个程序,在遇到EOF之前,把输入作为字符流读取。该程序要报告平均每个单词的字母数。不要把空白统计为单词的字母。实际上,标点符号也不应该统计,但是现在暂时不同考虑这么多(如果你比较在意这点,考虑使用ctype.h系列中的ispunct()函数)

5.修改程序清单8.4的猜数字程序,使用更智能的猜测策略。例如,程序最初猜50,询问用户是猜大了、猜小了还是猜对了。如果猜小了,那么下一次猜测的值应是50和100中值,也就是75。如果这次猜大了,那么下一次猜测的值应是50和75的中值,等等。使用二分查找(binary search)策略,如果用户没有欺骗程序,那么程序很快就会猜到正确的答案

6.修改程序清单8.8中的get_first()函数,让该函数返回读取的第1个非空白字符,并在一个简单的程序中测试

7.修改第7章的编程练习8,用字符代替数字标记菜单的选项。用q代替5作为结束输入的标记

8.编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得用户选择的选项后,程序提示用户输入两个数字,然后执行用户刚才选择的操作。该程序只接受菜单提供的选项。程序使用float类型的变量储存用户输入的数字,如果用户输入失败,则允许再次输入。进行除法运算时,如果用户输入0作为第2个数(除数),程序应提示用户重新输入一个新值。

该程序的一个运行示例如下:

Enter the operation of your choice:

a. add                s. subtract

m. multiply       d. divide

q. quit

a

Enter first number: 22 .4

Enter second number: one

one is not a number.

Please enter a number, such as 2.5, -1.78E8, or 3: 1

22.4 + 1 = 23.4


复习题

1.putchar(getchar())是一个有效表达式,它实现什么功能?getchar(putchar())是否也是有效表达式

  1. 实现输出显示缓存区的下一个字符
  2. 不是

2.下面的语句分别完成什么任务?

a.putchar('H');

b.putchar('\007');

c.putchar('\n');

d.putchar('\b');

a. 打印字符 H

b. 如果系统使用ASDII,发出一声警报

c. 把光标移动到下一行

d. 把光标后退一格

3.假设有一个名为 count 的可执行程序,用于统计输入的字符数。设计一个使用 count 程序统计essay文件中字符数的命令行,并把统计结果保存在essayct文件中

count < essay > essayct     or     count > essayct < essay

4.给定复习题3中的程序和文件,下面哪一条是有效的命令?

a.essayct <essay

b.count essay

c.essay >count

都不是

5.EOF是什么

由getchar() or scanf() 返回的特殊的值,表明函数检测到文件的结尾

6.对于给定的输出(ch是int类型,而且是缓冲输入),下面各程序段的输出分别是什么?

a.输入如下:

If you quit, I will.[enter]

程序段如下:

while ((ch = getchar()) != 'i')

        putchar(ch);

b.输入如下:

Harhar[enter]

程序段如下:

while ((ch = getchar()) != '\n')

{

        putchar(ch++);

        putchar(++ch);

}

a. If you qu

b.HJacrthjacrt

7.C如何处理不同计算机系统中的不同文件和换行约定

C的标准I/O库会把不同的文件映射成统一的流来处理

8.在使用缓冲输入的系统中,把数值和字符混合输入会遇到什么潜在的问题

数字会跳过空格和换行符,但是字符输入不会:

输入数字的时候,空格和换行符还会留在缓存区,输入字符的时候会读取。

【在输入数字之后要处理空格和换行符】

编程练习

1.设计一个程序,统计在读到文件结尾之前读取的字符数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    FILE* in;
    in = fopen("123.txt", "r");
    char ch;
    long n = 0;
    while((ch = getc(in)) != EOF)
    {
        n++;
    }
    fclose(in);
    printf("%ld\n", n);
    return 0;
}

2.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。程序要打印每个输入的字符及其相应的ASCII十进制值。

注意,在ASCII序列中,空格字符前面的字符都是非打印字符,要特殊处理这些字符。如果非打印字符是换行符或制表符,则分别打印\n或\t。否则,使用控制字符表示法。例如,ASCII的1是Ctrl+A,可显示为^A。注意,A的ASCII值是Ctrl+A的值加上64。其他非打印字符也有类似的关系。除每次遇到换行符打印新的一行之外,每行打印10对值。

(注意:不同的操作系统其控制字符可能不同。)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    FILE* in;
    in = fopen("123.txt", "r");
    char ch;
    int n = 0;
    while((ch = getc(in)) != EOF)
    {
        if(ch == '\n')
        {
            putchar('\\');
            putchar('n');
            printf("%d\n", ch);
            n = 0;
        }
        else if(ch == '\t')
        {
            putchar('\\');
            putchar('t');
            printf("%d  ", ch);
        }
        else if(ch < ' ')
        {
            putchar('^');
            putchar(ch + 64);
            printf("%d  ", ch);
        }
        else
        {
            putchar(ch);
            printf("%d  ", ch);
        }
        if(++n % 10 == 0)
        {
            n = 0;
            putchar('\n');
        }
    }
    fclose(in);
    return 0;
}

3.编写一个程序,在遇到 EOF 之前,把输入作为字符流读取。该程序要报告输入中的大写字母和小写字母的个数。假设大小写字母数值是连续的。或者使用ctype.h库中合适的分类函数更方便

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

i
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值