C primer plus 第四章课后复习题答案笔记解释整理

      C primer plus 第四章课后复习题答案笔记解释整理_第1张图片

 

复习题

  1. 再次运行程序清单4.1,但是在要求输入名时,请输入名和姓(根据英文书写习惯,名和姓中间有一个空格),看看程序会发生什么情况。为什么?

C语言在使用scanf()函数读取用户输入的字符串时,如果遇到第一个空白(空格,制表符,换行符),就认定完成数据的读取工作,后续数据不再写入当前变量,而只保存在输入缓冲区。因此读取名的scanf()函数只能够在name[]中存储第一个无空白的连续单纯。在空白之后用户输入的内容依然会保留在输入缓冲区内,等待下一次scanf()函数的输入。因此,程序中并没有等待用户输入体重数据,而直接将刚才缓冲区内的姓赋予体重。最终weight变量存储的数据为0.0。

    2.假设下列示例都是完整程序的一部分,它们的打印结果分别是什么?

C primer plus 第四章课后复习题答案笔记解释整理_第2张图片

C primer plus 第四章课后复习题答案笔记解释整理_第3张图片

对这四个输出进行讲解:

第一个输出:这个%2.2f什么意思。               

形如%m.nf ,其中m表示输出数据的宽度(如果宽度不够就补空格,如果宽度超过m久用实际宽度);n表示输出的实数保留n位小数;

举个例子:

       输出如下

      第一个输出在前面补空格让数据宽度达到12,第二个只需要保留小数点后三位就行(四舍五入),第三个不仅需要保留小数点后三位,而且还需要在前面补空格让数据宽度达到12.

输出“He sold the painting for $234.50.”这是浮点数据的格式化输出,%f表明以十进制记数法打印浮点数据,因此,会自动将e记数法转换成十进制,保留小数点后面的两位数字。

第二个输出:输出“Hi!“。打印语句分别用字符型,十进制整型和八进制转义方式打印3个字符。整型十进制数据105对应ASCII字符‘i’,‘\41’中的转义序列表示八进制数据,通常表示八进制时可以写成‘\041’,也可以省略0.直接写成‘\41’.

第三个输出

   预编译指令定义了Q为字符串“His Hamlet was funny without being vulgar.“,打印时会直接通过转换说明符输出该字符串,strlen(Q)函数计算实参字符串Q的长度,即42,并且输出。需要注意的是strlen()函数并没有计算字符串结尾的‘\0’

第四个输出:

Printf()函数打印了两个浮点数,“%e“表示按照e计数法打印,保留小数点后两位数字,

”%2.2f“表示按照普通十进制打印数据,保留小数点后两位数字,如果不够用0补齐。

4.找出下列程序的错误

改正后的程序如下:

C primer plus 第四章课后复习题答案笔记解释整理_第4张图片

5.设一个程序的开头是这样的。

C primer plus 第四章课后复习题答案笔记解释整理_第5张图片

6.打印下列各项内容分别要使用什么转换说明符?

A:一个字段宽度与位数相同的十进制整数;

B:一个形如8A,字段宽度为4的十六进制整数;

C:一个形如232.346、字段宽度为10的浮点数:

D:一个形如2.33e+002、字段宽度为12的浮点数;

E:一个字段宽度为30、左对齐的字符串;

分析与解答;

A:整型数据使用的转换说明符是%d,字段宽度和位数相同不需要使用特殊修饰符,换说明符为%d;

B:十六进制数据的转换说明符(输出大写字符应当使用大写的X)是%X,因为宽使用4作为修饰符。因此转换说明符为%4X;

C;%10.3f

D:%12.2e

E: 字符串使用转换说明符%s,长度为30,左对齐,使用-30修饰符,因此转换说明符为%-30s;

7.打印下面的内容分别使用什么转换说明符?

A;字段宽度为15的unsigned long 类型整数;

B:一个形如ox8a,字段宽度为4的十六进制整数;

C:一个形如2.33E+02、字段宽度为12、左对齐的浮点数;

D:一个形如+232.346、字段宽度为10的浮点数;

E:一个字段宽度为8的字符串的前8个字符;

解析:

A;unsigned 类型整数转换说明符是%u,对于long类型的字段宽度,应添加l修饰符,字段宽度为15,就需要添加15的修饰符,因此转换说明符为%15lu;

B;十六进制整型数据的转换说明符为%x(输出是小写x就小写),输出OX使用#修饰符;字段宽度为4,转换说明符为%#4x;

C;输出科学计数法使用转换说明符%E(输出是大写E就用大写),左对齐,字段宽度为12修饰符为-12,转换说明符为%-12.2E

D:浮点数转换说明符是%f,显示正好使用+修饰符,字符宽度为10,3位小数,使用的转换说明符如下:%+10.3f;

E:字符串转换说明符是%s,字段宽度位8,显示前八个字符使用8.8修饰符,因此转化说明符为%8.8s。

补充:C语言中,%m.ns 的含义:
%s:就是字符串的转换说明符

%ms:输出字符串宽度为m,如果字符串本身实际宽度大于m,那么就用字符串的实际宽度。如果字符串的实际宽度小于m,则左补空格。可以理解成m前面有个省略了的+号,所以字符串右对齐;

%-ms:规则和基本上面一样,不一样的是字符串左对齐,右补空格;

%m.ns;输出宽度占m,但是只取字符串中左端的n个字符。这n个字符排列在m宽度的右侧,如果n小于m则左补空格,如果n大于m,那么m失效,字符的输出宽度就是n。

%-m.ns;规则和上面基本一样,不一样的地方在于,如果n小于m那么需要左对齐,右补空格。

8.打印下面各项内容要分别使用什么样的转换说明符?

A:一个字段宽度为6、最少有4位数字的十进制数;

B:一个在参数列表中给定字段宽度的八进制整数;

C:一个字段宽度为2的字符;

D:一个形如+3.13、字段宽度等于数字中字符数的浮点数;

E:一个字段宽度为7、左对齐的字符串中的前5个字符。

分析与解答:

A:转换说明符为%d,%6.4d;

B:八进制数据使用转换说明符%o,字段宽度由参数列表指定,使用修饰符“*”,因此转换说明符为%*o;

C;%2c

D:%+0.2f;字段宽度为数字中字符数,即不指定字段宽度,小数点后显示两位,使用修饰符+0.2,因此转换说明符为%+0.2f;

E:%-7.5s

9.分别写出读取下列各输入行的scanf()语句,并且声明语句中用到的变量和数组;

A.101;

B.22.32 8.34E-09;

C.linguini;

D.catch 22;

E.catch 22(但是跳过catch)。

分析与解答:

A.输入数据是整型数据,首先定义整型变量i, scanf()函数使用转换说明符%d。

Int dalmations;

          Scanf (“%d”,& dalmations);

B.  输入数据有两个浮点型数据,scanf()使用转换说明符%f或者%e %g。

                     float kgs ,share;

                     scanf(“%f %f”,&kgs,&share);

C.输入数据为字符串scanf()函数使用转换说明符%s,需要注意的是,对于字符数组,scanf()函数的参数列表不需要使用&符号。

              char pasta[20];

              scanf(“%s”,pasta);

D. 输入数据为字符串和整型数据,因此scanf()需要使用%s,%d。

              char action[20];

              int value;

              scanf(“%s %d” , action ,&value);

E. 输入数据为字符串和整型数据,忽略字符串,应当使用“*”修饰字符串转换说明符

              int   value;

              scanf(“%*s %d”,&value);

10.什么是空白?

C语言中的空白是指空格、制表符、换行符,这三种空白是scanf()函数进行输入分割的符号。

11.下面的语句有什么问题?如何修正?

        Printf(“The double type is %z bytes..\n”, sizeof(double));

分析与解答:

百分号(%)后面的z在printf()函数中表示一个修饰符,需要注意的是,修饰符是百分号和转换说明符中间用于表示特定数据类型的符号。修饰符不能单独使用。Z修饰符和整型转换说明符在一起,表示使用sizeof的返回类型——size_t,例如,%zd表示十进制,%zo表示八进制。因此应当修改为%zd,表示打印sizeof的十进制整型数据。

12.假设要在程序中用圆括号替代花括号,以下方法是否能可行?

分析与解答:

C语言中的预编译指令#define语句,可以对相应的符号进行编译时替换,即编译器在对源代码进行编译时进行符号替换。但是例子中的#define语句替换的是c语言中表示语句块和一些重要的语句符号,替换后会导致程序出现语法错误。

你可能感兴趣的:(c,primer,plus,c语言,p2p,linq)