复习题:
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杯,转换过程中会产生半品脱的情况。此外,实际应用中其他计量单位也可能产生非整数的情况。完整代码如下: