C primer plus 第三章课后复习题与编程练习答案笔记解释整理

 复习题:

1:

a:st Simpleton 的人口是一个整数,考虑到人口规模,应当使用32位的int类型表示。此外,也可以使用无符号整型数据,不建议使用16位数据进行表示,否则将会产生溢出。

b:DVD的价格通常情况下是有小数部分的,因此不能使用整型。考虑到实际的数据精度,使用doubel类型数据会产生浪费,使用float类型比较合适。

c:本章出现次数最多的字母,一般用字符型来表示,注意,字符常量用单引号表示。

d:本章出现次数最多的字母的次数是一个整型,因此,使用int类型或者其他无符号整数

2:在什么情况下要用long类型变量替代int类型变量?

Int和long都表示整型数据,两者的差异在于数据存储位数,通常在32位系统下int型数据是32位,long型的数据是64位,因此在需要表示比较大的整数时选择使用long类型。

3.使用那些可移植的数据类型可以获得32位有符号整数?选择的理由是什么?

由于C语言中数据类型实际所占存储位数和精度和具体平台相关,C语言的规范并没有强制和详细的规定,因此C语言程序在移植过程中可能会出现不同平台数据类型的不兼容。为了解决这个状况,C语言在可移植类型stdint.h和inttypes.h中规定了精确宽度整数类型,以确保C语言的类型在各系统内功能相同。为了获得32位有符号整数,可以使用int32_t作为标准32位整型数据,使用int_least32_t获得至少32位整型数据,int_fast32_t获得32整型数据的最快计算速度。

4.指出下列常量的类型和含义:

a.’\b’

b . 1066;

c . 99.44;

d . OXAA;

e.2.0e30.

a.’\b’,单引号表示字符类型常量,‘\’表示转义,’\b’表示退格;

b. 1066是一个int型数据常量;

c. 99.44 表示双精度浮点型数据常量;

d.OxAA表示十六进制unsigned int 类型数据常量,对于八进制和十六进制整型数据,系统优先解释为无符号类型;

e.2.0e30表示双精度浮点类型数据常量。从数据格式看,2.0e30并未超过float类型的最大值限制,但是编译器通常将浮点型常量统一为64位double类型。

5.找出程序中的错误;

 6. 写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明。

常量

类型

转换说明(%转换字符)

12

int

%d

Ox3

unsigned int

%#X

‘c’

char

%c

2.34E07

double

%f

‘\040’

char

%c

7.0

double

%f

6L

long

%ld

6.0f

float

%f

Ox5.b6p12

float

%a

浮点型常量默认均为double类型,除非以6.0f的形式显示表示float类型的数据。

‘\o40’是以八进制表示的字符型数据,‘\’表示转义。

八进制和十六进制常量通常优先选择unsigned int 类型,而不是int 类型。当八进制和十六进制数据需要显示前面的0时,要使用%#X转换说明符。为了显示大写X,转换说明中也需要使用大写X。

0x5.b6p12 是浮点类型数据的p记数法。

p记数法  注:c99里的16进制浮点数计数法。非c99不可用。

数以0x开头,后面紧跟16进制小数eg:5.b6等等(b是11)

5.b6=5乘16的0次方+11乘16进制的-1次方+6乘16进制的-2次方。

后跟p再跟以2为底的阶码。

eg:p12意味着乘2的12次方;

所以0x5.b6p12=(5*16^0+11*16^(-1)+6*16^(-2))*(2^12);

7. 写出下列常量在声明中使用的数据类型和在printf()中对应的转换说明(假设 int 为16位)

常量

类型

转换说明符(%转换字符)

012

Unsigned int

%#o

2.9e05L

Long double

%Le

‘s’

Char

%c

100000

Long

%ld

‘\n’

Char

%c

20.0f

Float

%f

0x44

Unsigned int

%#x

-40

Int

%

012中以0开头表示八进制数据,八进制和十六进制通常优先选择unsigned int 类型,因此使用转换说明符%#o。同理,unsigned int 类型数据0x44需要使用%#x。

2.9e05默认是double类型浮点数,其后的L表示其为long double类型。

100000超过了int类型的最大值(2^15-1),因此自动转换为long类型。

8.假设程序的开头有以下声明。

int imate =2;

long shot =53456;

char grade = ‘A’

float log =2.71828;

把下面printf()语句中的转换字符补充完整:

Printf(“The odds against the %d  were %ld  to,1\n”, imate, shot );

Printf(“A score of %f  is not an %c  grade.\n ”, log , grade);

9.假设ch是char类型的变量。分别使用转义序列,十进制值,八进制字符常量和十六进制字符常量把回车字符赋给ch(假设使用ASCII编码值).

从C语言的角度看,char类型本质上是一种整数类型。程序设计过程中可以使用字符类型的变量对char型变量赋值,也可以使用整型数据赋值。因此赋值方式有以下几种。

 char ch=’\r’;  // 转义序列形式

 char ch=13 ; // 整数形式

 char ch=’\015’; // 八进制形式

 char ch= ‘\xd’; // 十六进制

10.修正下面的程序

注:

scanf和scanfs的区别
scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:

//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节
char buf[5]={'\0'};
scanf("%s", buf);
//
如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。

以上代码如果用scanf_s()则可避免此问题:

char buf[5]={'\0'};
scanf_s("%s",buf,5); //
最多读取4个字符,因为buf[4]要放'\0' 
//
如果输入1234567890,则buf只会接受前4个字符

注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符.

11.指出下列转义序列的含义:

A:\n

B:  \\

C:  \”

D:  \t

C语言中char类型的数据通常是使用单引号表示,但是对于ACSII码表中的非打字符则无法直接表示。C语言可以采用整型数据赋值形式或者转义序列的形式来表示。例如,char beep=7;就是直接采用整型数据赋值形式表示。转义序列则使用一些特定的符号来表示非打印字符,例如,char beep =’\a’,其中反斜杠一般表示转义。

答案如下:

\n 表示换行符;

\\ 表示转义\;

\”表示双引号;

\t表示水平制表符。

编程练习:

1:通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢,浮点数上溢和浮点数下溢的情况。

C语言在limits.h 和 float.h 头文件里预先定义了常见的数据类型的限制。例如,float类型的最大值是FLT_MAX,int类型的最大值是INT_MAX.下面的代码大致展现了越界,精度限制,和系统预定义的最值。

2.编写一个程序,要求提示输入一个ASCII码值(如66),然后打印输入的字符。

编程分析:

程序要求读取用户输入的整型数据,将该整型数据转换成ASCII字符并显示该字符。程序需要用到的函数有scanf()函数和printf()函数。完整代码如下:

3.编写一个程序,发出一声警报,然后打印下列文本。

Starled by the sudden sound, Sally shouted,

“By the Great Pumpkin, what was that ! ”

编程分析:

ASCII码中表示警报的非打印字符为”\a”,用十进制整数表示就是7。通常建议使用转义序列,避免使用整数赋值。文本打印可以直接使用printf()函数打印,但是打印过程中需要注意双引号的打印需要使用转义序列“\“.完整代码如下。

4. 编写一个程序,读取一个浮点数,先打印小数形式,然后打印指数形式。然后,如果系统支持,再打印p记数法(即十六进制记数法)。按一下格式输出(实际显示的指数位数因系统而异)。

编程分析:

程序要求读取用户输入的浮点型数据,并按照不同的输出格式输出。输出格式的指定是通过printf()函数中转换说明符实现的。浮点数据的小数形式,指数形式,p记数法分别使用的是%f,%e,%a表示。完整代码如下:

5.一年中大概有3.156x10^7秒。编写一个程序,提示用户输入年龄,然后显示该年龄对应的秒数。

编程分析:

程序要求读取用户输入的年龄数据,通过计算转换成该年龄对应的秒数,年龄和秒数的大致位数估计,均可使用float类型数据计算和表示。完整代码如下:

%.lf这里面的这个. 是对精确到多少位的定义,如果是%.2lf 就是保留到小数点后两位。

6.一个水分子的质量约为3.0x10^-32克。1夸脱   (1夸脱=0.000946 m3)水的质量,大约是950克。编写一个程序,提示用户输入水的夸脱数,并显示水分子的数量。

编程分析:

程序的目的是计算指定夸脱数的水所含的水分子数量。程序通过scanf()函数读取用户输入的夸脱数,并按照数量关系进行计算。完整的代码如下。

7.1英寸相当于2.54cm。编写一个程序,提示用户输入身高(单位是英寸),然后以厘米为单位显示身高。

编程分析:

程序目的是实现身高的进制转换。使用scanf()函数读取用户输入的英寸数,并转换成厘米。完整代码如下:

8.编程分析:

程序的主要目的是将用户输入的杯数,分别转换成其他的计量单位。使用浮点型数据主要在于1品脱等于2杯,转换过程中会产生半品脱的情况。此外,实际应用中其他计量单位也可能产生非整数的情况。完整代码如下:

  • 10
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值