C Primer Plus 6 第三章编程练习

一、知识点复习

  • 程序离不开数据,C语言提供两大数据类型:整数类型和浮点数类型。
  • 最初K&R给出的C语言关键字有int、long、short、unsigned、char、float、double,C90标准增加了signed和void,之后C99标准又添加了_Bool、_Complex、_Imaginary。

1.变量和常量

1.1定义

(1)变量:在程序运行期间可能会改变或被赋值的数据类型。
(2)常量:在整个程序运行过程中不会改变的数据类型。

1.2整型常量的写法示例

类型十六进制八进制十进制
char\0x41\0101
int0x41010165
unsigned int0x41u0101u65u
long0x41L0101L65L
unsigned long0x41uL0101uL65uL
long long0x41LL0101LL65LL
unsigned long long0x41uLL0101uLL65uLL

1.3浮点型常量写法示例

类型十进制
float6.0f
double2.3
long double4.32L

2.整数和浮点数

(1)整数:没有小数部分的数。

(2)浮点数:有小数部分。

注意:计算机把浮点数分成小数部分和指数部分且分开进行存储;浮点数可以表示的范围比整数大;一些算术运算里浮点数损失的精度更多;浮点数通常只是实际值的近似值。

3.整数类型

3.1有符号整型

关键字简单定义声明举例

在printf()中的对应转换说明

(1.一般默认十进制,

2.只用小写)

八进制和十六进制的使用
int

可以是正整数、负整数、0;

C语言规定int类型不小于16位

int m;

signed int m;(一般不用特意强调说明,下同)

%d见表1
short

占用的存储空间可能比int少;

C语言规定short类型至少占16位

short m;

short int m;

%hd见表1
long

占用的存储空间可能比int多;

C语言规定long类型至少占32位

long m;

long int m;

%ld(%Ld)见表1
long long

占用的空间可能比long多;

long long类型至少占64位

long long m;

long long int m;

%lld(%LLd)见表1
表1 以八进制数144和十六进制数64为例的有符号整型转换表示
 1440144(带前缀)640x64(带前缀)\0X64
int%o%#o%x%#x、%#X(下略)
short%ho%#ho%hx%#hx
long%lo%#lo%lx%#lx
long long%llo%#llo%llx%#llx

3.2无符号整型

无符号整型只用于非负值场合,可以表示更大的数。各关键字类型分类与声明与有符号整型类似。在printf()函数中的对应转换说明举例如下表(与有符号整型十进制int类型%d对应使用的是%u,其他进制略):

表2 十进制无符号转换说明
 printf()中对应转换说明
unsigned int%u
unsigned short%hu
unsigned long%lu
unsigned long long%llu

3.3字符型

char型

char类型实际上存储的是整数而不是字符,计算机使用ASCII编码处理字符,标准ASCII码的范围是0~127,C语言中char类型占用一个字节。用单引号括起来的单个字符被称为字符常量。char类型的标准声明和定义如下:

char m = 'T';

printf()函数用%c指明待打印的字符。

char类型除了打印字符'T'之外,也有非打印字符。单引号只适用于字符、数字、标点符号,而有些是ASCII字符打印不出来的,所以用一些特殊符号序列表示一些特殊字符,这些特殊符号序列成为转义序列。第二章接触到的换行符\n就属于转义序列。

注意:C语言将字符常量视为int类型而非char类型,char m = 65;这种定义方式也可以但不是一种好的编程风格。

关于char类型有无符号的问题视情况而定,若有符号,可表示的范围是-128~127;若无符号,可表示的范围是0~255;特别的,若只用char处理字符,则无需任何修饰符。

3.4布尔类型

_Bool型

C99标准添加的类型,简而言之就是逻辑值true和false,用1表示true,0表示false。布尔类型属于整数类型,原则上仅占一位储存空间。在有些资料中并不把它算作C中的数据类型。

4.浮点数类型

4.1实浮点类型

(1)float

可精确表示至少6位有效数字,浮点型常量后面跟f。

(2)double

能表示比float类型更多的有效数字(至少10位)和更大的指数。

(3)long double

能表示比double更多的有效数字和更大的指数,浮点型常量后跟L。

表3 在printf()中的对应转换说明
 十进制指数记数法十六进制
float%f%e%a
double%f%e%a
long double%Lf%Le%La

4.2复数和虚数浮点数

虚数类型是可选类型。复数的实部和虚部类型都基于实浮点类型构成:

(1)复数

float_Complex

double_Complex

long double_Complex

(2)虚数

float_Imaginary

double_Imaginary

long double_Imaginary

二、编程练习

1.

/*overflow.c--整数上溢、浮点数上溢、浮点数下溢
  author:Alice_12
  date:2018.2.18*/
#include<stdio.h>
int main(void)
{
	int i = 2147483647;//32位的long最小取值范围的正上限是2147483647
	unsigned int j = 4294967295;//unsigned long的最小取值范围上限

	float m = 3.4e38f;//上溢
	float n = 0.1234e-10f;//下溢

	/*当前系统指定的各数据类型大小(字节数)*/
	printf("Type int has a size of %d bytes.\n",sizeof(int));//sizeof是C内置运算符,以字节为单位给出指定类型的大小
	printf("Type short has a size of %d bytes.\n",sizeof(short));
	printf("Type long has a size of %d bytes.\n",sizeof(long));
	printf("Type char has a size of %d bytes.\n",sizeof(char));
	printf("Type float has a size of %d bytes.\n",sizeof(float));
	printf("Type double has a size of %d bytes.\n\n",sizeof(double));

	printf("给出以下数据:\n");
	printf("有符号整型i=%d\n", i);
	printf("无符号整型j=%u\n", j);
	printf("浮点数m=%e\n", m);
	printf("浮点数n=%e\n\n", n);

	/*整数上溢*/
	printf("i+1=%d i+2=%d\n", i+1, i+2);
	printf("j+1=%u j+2=%u\n", j+1, j+2);
	
	/*浮点数上溢*/
	printf("m*100.0=%e or %f\n", m*100.0);
	
	/*浮点数下溢*/
	printf("n/10=%e or %f\n", n/10);
	return 0;
}

2.
/*character.c--输入一个ASCII值,打印输入的字符
  author:Alice_12
  date:2018.2.18*/
#include<stdio.h>
int main(void)
{
	int i;

	printf("Please enter a number between 0~127:");
	printf("___\b\b\b");
	scanf("%d", &i);
	printf("\n%d in ASCII is %c\n", i, i);
	return 0;
}

3.

/*alarm.c--警报声响后打印一段文本
  author:Alice_12
  date:2018.2.18*/
#include<stdio.h>
int main(void)
{
	printf("\aStartled by the sudden sound, Sally shouted,\n");//转义序列\a表示警报
	printf("\"By the Great Pumpkin, what was that!\"\n");
	return 0;
}

4.

/*display.c--读取一个浮点数并分别以小数点形式、指数形式、十六进制记数法(若可以)打印显示
  author:Alice_12
  date:2018.2.18*/
#include<stdio.h>
int main(void)
{
	float i;

	printf("Please enter a floating number:");
	printf("_____\b\b\b\b\b");
	scanf("%f", &i);
	printf("\nfixed-point notation: %f\n", i);//形参里的第一个\n经测试就算不要也能实现换行,猜测应当是缓冲区满了,保留此问题,待议
	printf("exponential notation: %e\n", i);
	printf("p notation: %a\n", i);
	return 0;
}

5.

/*secong.c--输入年龄,显示对应的秒数
  author:Alice_12
  date:2018.2.18*/
#include<stdio.h>
int main(void)
{
	int i;

	printf("It's about 3.156e7 second a year.\n");
	printf("Do you wanna know what your age is in seconds?\n");
	printf("All right, let's do it!\n");
	printf("Please enter your age: ");
	printf("__\b\b");
	scanf("%d", &i);
	printf("\nWow! your age in seconds is %e!\n", i*3.156e7);//换行问题同第四题
	return 0;
}

6.
/*water.c--输入水的夸脱数,显示水分子数量
  author:Alice_12
  date:2018.2.18*/
#include<stdio.h>
int main(void)
{
	double i = 3.0e-23;//1个水分子的质量
	float j = 950;//1夸脱水的质量
	float m;//水的夸脱数
	double n;//水分子的数量

	printf("The mass of a water molecule is 3.0e-23 gram.\n");
	printf("The mass of a quart of water is 950 gram.\n");
	printf("Enter the number of quart of water: ");
	printf("__\b\b");
	scanf("%f", &m);
	n = m * j / i;
	printf("The number of water molecule is %e\n", n);
	return 0;
}

7.
/*inch.c--以英寸为单位输入身高,以厘米为单位打印
  author:Alice_12
  date:2018.2.18*/
#include<stdio.h>
int main(void)
{
	float inch;
	float i = 2.54f;//1英寸有2.54厘米
	float cm;

	printf("Enter your height(in inch):");
	printf("_____\b\b\b\b\b");
	scanf("%f", &inch);
	cm = inch * i;
	printf("your height in cm is %f\n", cm);
	return 0;
}

8.

/*number.c--输入杯数,分别显示其他单位的等价容量
  author:Alice_12
  date:2018.2.18*/
#include<stdio.h>
int main(void)
{
	float j;//杯

	printf("Enter Cup number:");
	printf("___\b\b\b");
	scanf("%f", &j);

	//品脱
	printf("%f glass of water is %e pint.\n", j, 0.5*j);

	//盎司
	printf("%f glass of water is %e ounce.\n", j, j*8);

	//汤勺
	printf("%f glass of water is %e soup spoon.\n", j, j*8*2);

	//茶勺
	printf("%f glass of water is %e tea spoon.\n", j, j*8*2*3);
	return 0;
}

三、总结

1.编程中的部分数据问题需要了解一下二进制、十进制、八进制、十六进制之间的相互转换。

2.printf()在本章的使用仍然是重点,体现在相关数据类型的打印转换。

3.关于float和double如何选取:有一个说法是float以一个字32位显示,7个有效位,double以2个字64位显示,16个有效位;浮点数字面值在不做f和l后缀时都默认为double类型;进行浮点数运算时float类型损失的精度比double多。

4.在练习4往后我遇到了换行不确定的问题,原因在于书上例3.10的程序分析及刷新输出中提到当缓冲区满、遇到换行符、需要输入时会把printf发送到缓冲区中的输出发送到屏幕上,我的实际练习情况有点不符。

5.在我使用的编译器上并不支持long long类型,所以没有做相关练习。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值