第3章 数据和C
复习题
1、对下面的各种数据使用合适的数据类型:
a.East Simpleton的人口
b.DVD影碟的价格
c.本章出现次数最多的字母
d.这个字母出现的次数
答:a.int类型,可以是short、unsigned或unsigned short;人口数是一个整数。
b.float类型;价格不太可能正好是一个整数(您也可以使用double,但实际上并不需要那么高的精度)。
c.char类型。
d.int类型,可以是unsigned。
2、需要用long类型变量代替int类型变量的原因是什么?
答:一个原因是在您的系统中long可以容纳比int类型更大的数;一个原因是如果您确实需要处理更大的值,那么使用一种在所有系统上都能保证至少是32位的类型会使程序的可移植性更好。
3、获得一个32位的有符号整数,可以使用哪些可移植的数据类型?每种选择的原因是什么?
答:要获得正好是32位的数,您可以使用int32_t(如果在您的系统上有这一定义的话)。要获得可存储至少32位的最小类型,可以使用int_least32_t。如果要在32位的类型中获得提供最快计算速度的类型,可以选择int_fast32_t。(参考3.4.5 可移植的类型:inttypes.h,理解的不是很清楚!!!)
4、指出下列常量的类型和意义(如果有的话):
a.'\b'
b.1066
c.99.44
d.0XAA
e.2.0e30
答:a.char常量(但以int类型存储)
b.int常量
c.double常量
d.unsigned int常量,十六进制格式
e.double常量
5、Dottie Cawm写的下面这个程序中有很多错误,找出这些错误。
1 include <stdio.h>
2 main
3 (
4 float g; h;
5 float tax, rate;
6
7 g = e21;
8 tax = rate * g;
9 )
答:第1行:应该是#include <stdio.h>
第2行:应该是int main(void)
第3行:使用{,而不是(
第4行:在g和h之间应该是逗号而不是分号
第5行:无错误
第6行:(空行)无错误
第7行:在e之前应该至少有一个数字,.1e21或1.e21都是正确的,尽管这个数有点大。
第8行:无错误,至少在语法上没有
第9行:使用},而不是)
缺少的行:首先,rate没有被赋值。其次,变量h从来没有被使用。而且程序永远不会把它的计算结果通知给您。这些错误都不会阻止程序的运行(尽管可能会向您出示一个警告以说明变量没有被使用),但是它们确实减弱了程序本来就不多的功能。而且在结尾处应该有一个return语句。
下面是正确版本之一: 1 #include <stdio.h>
2 int main(void)
3 {
4 float g, h;
5 float tax, rate;
6 rate = 0.08;
7 g = 1.0e5;
8
9 tax = rate * g;
10 h = g + tax;
11 printf("You owe $%f plus $%f in taxes for a total of $%f.\n", g, tax, h);
12 return 0;
13 }
6、指出下表中各常量的数据类型(在声明语句中使用的数据类型)及其在printf()中的格式说明符。
| 常量 | 类型 | 说明符 |
| 12 | | |
| 0x3 | | |
| 'C' | | |
| 2.34E07 | | |
| '\040' | | |
| 7.0 | | |
| 6L | | |
| 6.0f | | |
答:
| 常量 | 类型 | 说明符 |
| 12 | int | %d |
| 0x3 | unsigned int | %#x |
| 'C' | char | %c |
| 2.34E07 | double | %f |
| '\040' | char | %c |
| 7.0 | double | %f |
| 6L | long | %ld |
| 6.0f | float | %e |
7、指出下表中各常量的数据类型(在声明语句中使用的数据类型)及其在printf()中的格式说明符,假设int类型为16位长。
| 常量 | 类型 | 说明符 |
| 012 | | |
| 2.9e05L | | |
| 's' | | |
| 100000 | | |
| '\n' | | |
| 20.0f | | |
| 0x44 | | |
|
|
|
|
答:
| 常量 | 类型 | 说明符 |
| 012 | int | %#0 |
| 2.9e05L | long double | %Le |
| 's' | char | %c |
| 100000 | long | %ld |
| '\n' | char | %c |
| 20.0f | float | %f |
| 0x44 | unsigned int | %#x |
|
|
|
|
8、假设一个程序开始处有如下的声明:
1 int imate = 2;
2 long shot = 53456;
3 char grade = 'A';
4 float log = 2.71828;
在下面printf()语句中添上合适的类型说明符:
1 printf("The odds against the %___ were %___ to 1.\n", imate, shot);
2 printf("A score of %___ is not an %___ grade.\n", log, grade);
答:
1 printf("The odds against the %d were %ld to 1.\n", imate, shot);2 printf("A score of %f is not an %c grade.\n", log, grade);9、假设ch为char类型变量。使用转义序列、十进制值、八进制字符常量以及十六进制字符常量等方法将其赋值为回车符(假设使用ASCII编码)。
答:
1 char ch = '\r';
2 char ch = 13;
3 char ch = '\015';
4 char ch = '\xd';
10、改正下面程序(在C中/表示除法)。
1 void main(int) / this progarm is perfect /
2 {
3 cows, legs integer;
4 printf("How many cow legs did you count?\n);
5 scanf("%c", legs);
6 cows = legs / 4;
7 printf("That implies there are %f cows.\n", cows)
8 }
答:
1 #include <stdio.h>
2 int main(void) /* this progarm is perfect */
3 {
4 int cows, legs;
5 printf("How many cow legs did you count?\n");
6 scanf("%d", &legs);
7 cows = legs / 4;
8 printf("That implies there are %d cows.\n", cows);
9 return 0;
10 }
11、指出下列转义字符的含义:
1 a.\n
2 b.\\
3 c.\"
4 d.\t
答:a.换行字符
b.反斜线字符
c.双引号字符
d.制表字符
编程练习(如有错误,希望指正!!!)1、
1 /* 整数上溢*/
2 #include <stdio.h>
3 int main(void)
4 {
5 int i = 2147483647;
6 unsigned int j = 4294967295;
7
8 /*
9 无符号整数j像一个汽车里程指示表(形容的太好了,可参考《计算机科学导论》第3章 数据存储,有图),
10 当达到最大值时,它将溢出到起始点。整数i也是同样。它们的主要区别是unsigned int变量j的起始点是0(正像里程
11 指示表那样),而int变量i的起始点则是-2147483648。——参考《C Primer Plus》
12 */
13 printf("%d %d %d\n", i, i+1, i+2);
14 printf("%u %u %u\n", j, j+1, j+2);
15 return 0;
16 }
运行结果:
2147483647 -2147483648 -2147483647
4294967295 0 1
浮点数的上溢和下溢???(
理解的不是很清楚,回头再来写)2、
1 #include <stdio.h>
2 int main(void)
3 {
4 int asc;
5 printf("Please enter an ASCII value: ");
6 scanf("%d", &asc);
7 printf("The code is %c.\n", asc);
8 return 0;
9 }
3、
1 #include <stdio.h>
2 int main(void)
3 {
4 printf("\aStartled by the sudden sound, Sally shouted, ");
5 printf("\"By the Great Pumpkin,what was that!\"\n");
6 return 0;
7 }
4、
1 #include <stdio.h>
2 int main(void)
3 {
4 float number;
5 printf("Please enter a float value: ");
6 scanf("%f", &number);
7 printf("The input is %f or %e", number, number);
8 return 0;
9 }
5、
1 #include <stdio.h>
2 int main(void)
3 {
4 int age;
5 printf("Please enter your age: ");
6 scanf("%d", &age);
7 printf("Your age has %e s", age*3.156e7);
8 return 0;
9 }
6、
1 #include <stdio.h>
2 int main(void)
3 {
4 int num; // 夸脱数应该为整数吧!!
5 printf("Please enter water: ");
6 scanf("%d", &num);
7 printf("The water has %e ", num*950/3.0e-23);
8 return 0;
9 }
7、
1 #include <stdio.h>
2 int main(void)
3 {
4 float height;
5 printf("Please enter your height: ");
6 scanf("%f", &height);
7 printf("Your height is %.2f cm.\n", height*2.54);
8 return 0;
9 }