目录
一、复习题
1. 指出下面各种数据使用的合适数据类型(有些可能使用多种数据类型):
a. East Simpleton 的人口
b. DVD 影碟的价格
c. 文章中出现次数最多的字母
d. 文章出现次数最多的字母次数
答:
a. int 类型最大存储 21 亿,可以存储世界上任何一个国家的人口。人口不为负数,也可以使用 unsigned int 类型。
b. 价格可能需要小数,所以使用 double 类型(或者 float 类型)。
c. 存储字母等字符,使用 char 类型
d. 使用 int 类型足够
2. 在什么情况下要用 long 类型的变量替代 int 类型的变量?
答:在两者存储位数有差异的系统上,需要存储较大数值的时候,使用 long 类型。因为 C 语言规定,long 的类型至少和 int 一样大。
3. 使用哪些可移植的数据类型可以获得 32 位有符号整数?选择的理由是什么?
答:C 语言在可移植的 stdint.h 和 inttypes.h 中规定了精确宽度整数类型,如:int32_t 作为标准的 32 为整型数据。
4. 指出下列常量的类型和含义:
a. '\b'
b. 1066
c. 99.44
d. 0XAA
e. 2.0e30
答:
a. char 类型,转义字符表示退格
b. int 类型,整数 1066
c. double 类型,浮点数 99.44
d. unsigned int 类型,十六进制整数 AA
e. double 类型,浮点数 2.0e30
5. Dottie Cawm 编写了一个程序,请找出程序中的错误。
答:错误程序就不写了,大家自己看。程序的主要错误有:
1)包含头文件漏了 # 号
2)main 后面紧跟小括号,然后函数体放在花括号里
3)没有正确书写指数计数法
4)使用了未初始化的变量 rate
5)没有 return 0;语句
c
#include <stdio.h>
int main()
{
float g = 0, h = 0; // 创建变量的同时初始化,是一个好习惯
float tax = 0, rate = 0;
g = 1.0e21;
tax = rate * g;
return 0;
}
6. 写出下列常量在声明中使用的数据类型和在 printf() 中对应的转换说明。
答:如下代码所示:
c
int %d
unsigned int %#X
char %c
double %E
char %c
double %f
long %ld
float %f
float %a
7. 写出下列常量在声明中使用的数据类型和在 printf() 中对应的转换说明(假设 int 为 16 位)。
答:如下代码所示:
c
unsigned int %#o
long double %Le
char %c
long %ld
char %c
float %f
unsigned int %#x
int %d
8. 假设程序的开头有如下声明:
int imate = 2;
long shot = 53456;
char grade = 'A';
float log = 2.71828;
把下面 printf()语句中的转换字符补充完整:
答:一行一句:
d 和 ld
f 和 c
9. 假设 ch 是char 类型的变量。分别使用转义序列、十进制值、八进制字符常量和十六进制字符常量把回车字符赋给 ch(假设使用 ASCII 编码值)。
答:如下代码:
c
char ch = 0;
ch = '\r'; // 转义字符
ch = 13; // 十进制
ch = '\015'; // 八进制
ch = '\x0D'; // 十六进制
10. 修正下面的程序(在 C 中,/ 表示除以)。
答:这里就不给出错误的程序了。该代码的具体错误如下:
1)没有包含头文件 stdio.h
2)没有正确声明变量的类型,也没有使用正确使用注释
3)没有使用正确的输入格式和输出格式
4)没有 return 0; 语句
正确代码如下:
c
#include <stdio.h>
int main()
{
int cows, legs;
printf("How many cow legs did you count?\n");
scanf("%d", &legs);
cows = legs / 4;
printf("That implies there are %f=d cows.\n", cows);
return 0;
}
11. 指出下面转义序列的含义:
a. \n
b. \
c. "
d. \t
答:
a. 换行符
b. 反斜杠
c. 双引号
d. 水平制表符
二、编程练习
1. 通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢、浮点数上溢和浮点数下溢的情况。
答:
程序设计分析: 让存储的值超过该类型的最大值或者低于该类型的最小值即可。
代码如下:
c
#include <stdio.h>
#include <limits.h>
int main()
{
// 观察整数上溢、浮点数上溢和浮点数下溢的情况
int i = INT_MAX;
printf("%d\n", i);
i = i + 1;
printf("%d\n", i);
float f = 100.0f;
printf("%f\n", f);
f *= 10e100;
printf("%f\n", f);
f /= 10e200;
printf("%f\n", f);
return 0;
}
2. 编写一个程序,要求提示输入一个 ASCII 值(如,66),然后打印输入的字符。
答:
程序设计分析: 使用整型变量进行输入,然后使用字符输出格式进行输出。
代码如下:
c
#include <stdio.h>
int main()
{
// 输入一个 ASCII 码值并打印
printf("Please enter an ASCII code value : ");
int ch = 0;
scanf("%d", &ch);
printf("%c", ch);
}
3. 编写一个程序,发出一声警报,然后打印下面的文本。
答:
程序设计分析: 发出警报的转义字符为 \a
代码如下:
c
#include <stdio.h>
int main()
{
printf("\a Startled by the sudden sound, Sally shouted,\n");
printf("\"By the Gewat Pumpkin, what was that!\"\n");
return 0;
}
4. 编写一个程序,读取一个浮点数,先打印成小数格式,再打印成指数形式。然后,如果系统支持,在打印成 p 计数法(即十六进制计数法)。按以下格式输出(实际显示的指数位数因系统而异)。
答:
程序设计分析: 小数格式------%f,指数形式------%e或者%E,p 计数法------%a
代码如下:
c
#include <stdio.h>
int main()
{
printf("Enter a floating-point values : ");
float f = 0.0;
scanf("%f", &f);
printf("fixed-point notation: %f\n", f);
printf("exponential notation: %e\n", f);
printf("p natation: %a\n", f);
}
5. 一年大约有 3.156 * 10^7 次方秒。编写一个程序,提示用户输入年龄,然后显示年龄对应的秒数。
答:
程序设计分析: 使用一个 double 变量记录秒数,然后使用 int 变量输入年龄。
代码如下:
c
#include <stdio.h>
int main()
{
printf("Enter your age: ");
int year = 0;
scanf("%d", &year);
long long seconds = year * 3.156e7;
printf("Your age is %lld seconds.\n", seconds);
return 0;
}
6. 1 个水分子的质量约为 3.0 * 10 ^ -23 克。1 夸脱水大约是 950 克。编写一个程序,提示用户输入水的夸脱数,并显示水分子的数量。
答:
程序设计分析: 使用合适的变量存储转换单位,或者定义符号常量。或者直接使用。
代码如下:
c
#include <stdio.h>
int main()
{
int num = 0;
printf("Please enter the quantity : ");
scanf("%d", &num);
double quality = num * 950 / 3.0 * 10e23;
printf("Its quality is %lf", quality);
return 0;
}
7. 1 英寸相当于 2.54 厘米。编写一个程序,提示用户输入身高(/英寸),然后以厘米为单位显示身高。
答:
程序设计分析 使用 #define 定义符号常量进行换算,或者直接使用。
代码如下:
c
#include <stdio.h>
int main()
{
printf("Please enter your height (inch) : ");
double height = 0.0;
scanf("%lf", &height);
printf("Your height in cm is %lf", height * 2.54);
return 0;
}
8. 在美国的体积测量系统中,1 品脱等于 2 杯,1 杯等于 8 盎司,1 盎司等于 2 大汤勺,1 大汤勺等于 3 茶勺。编写一个程序,提示用户输入杯数,兵役品脱、盎司、汤勺、茶勺为单位显示等价容量。思考对于该程序,为何使用浮点类型比整形数据更合适。
答:
程序设计分析: 使用符号常量来记录转换单位,或者直接使用。使用整型在换算中涉及除法时,会进行整数除法,这样会损失精度。
代码如下:
c
#include <stdio.h>
int main()
{
printf("请输入杯数:");
int cup = 0;
scanf("%d", &cup);
printf("%f 脱品\n", cup / 2.0f);
printf("%f 盎司\n", cup * 8.0f);
printf("%f 汤勺\n", cup * 16.0f);
printf("%f 茶勺\n", cup * 48.0f);
return 0;
}