C Primer Plus 6 第三章编程练习

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Alice_12/article/details/79332899

一、知识点复习

  • 程序离不开数据,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
int 0x41 0101 65
unsigned int 0x41u 0101u 65u
long 0x41L 0101L 65L
unsigned long 0x41uL 0101uL 65uL
long long 0x41LL 0101LL 65LL
unsigned long long 0x41uLL 0101uLL 65uLL

1.3浮点型常量写法示例

类型 十进制
float 6.0f
double 2.3
long double 4.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为例的有符号整型转换表示
  144 0144(带前缀) 64 0x64(带前缀)\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类型,所以没有做相关练习。








猜你喜欢

转载自blog.csdn.net/Alice_12/article/details/79332899
今日推荐