实验二 数据的表示与存储
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二数据的表示与存储
一、实验目的
1.掌握整型、浮点数型和字符型数据的数值范围、相应常量和变量的定义及使用
2.掌握字符转义序列的表示方法,字符串常量的表示形式
3.了解指针型、枚举型和基本构造类型的定义方式和基本应用
4.掌握符号常量和变量的使用区别
二、实验相关知识
本次实验涉及C语言中多种数据类型的概念及相应常量和变量的使用。
1.数据类型
数据类型是指一组值及在这组值上定义的相关操作,它决定了数据的存储位数、存储方式及可以进行的数据操作。
C语言共提供了四大类数据类型。
●基本类型:包括整型、浮点型、字符型
●构造类型:包括数组、结构和联合和枚举
●指针类型
●空类型
2.常量和变量
数据可以分为常量和变量。
常量是指在运行期间值不能改变的量,变量是指在运行期间值可以改变的量。
常量分字面常量和符号常量。
其中符号常量使用宏来实现,一般形式为:
#define 标识符字符序列
变量声明的一般形式为:
类型说明符变量名列表;
类型说明符可以是C语言中提供的任何类型,如int和float等;变量名必须符合标识符的命名规则,且要注意每一种编译器所规定的标识符最大识别长度,避免在一个程序块中出现同名变量。
3.整型和浮点型
在使用整型和浮点型数据时,主要注意其数值范围和有效位数,并且综合考虑其可计算范围、运算精度与运算速度的关系,合理选用类型。
4.字符型和字符串
对于字符的表示,除如…A‟和…e‟等简单的字符表示形式外,也可以用字符转义序列的形式表示。
字符转义序列常用来表示非打印字符和一些无法用简单字符常量表示的字符,表示方法是在单引号内以反斜线开头的后跟字符或数字的序列(如…\n‟、…\123‟)。
字符型数据在内存中均按照字符的编码存储,所以在实际使用中不管是字符常量或字符变量都可以当作整型值计算。
与字符类型不同的是,C语言不支持字符串变量,只有字符串常量。
字符串常量是以双引号引起来的一系列字符,且存储时系统自动在字符串常量的最后添加一个字符…\0‟作为字符串结束标记。
5.指针型
指针变量用来存储其他变量的地址。
声明指针变量的一般形式为:
基类型说明*变量名;
6.构造型
对于一些复杂的数据需要用构造类型表示。
,C语言中的构造类型主要有两类,一类是由相同类型的元素构成的数组类型;另一类则由不同类型的元素构成,典型的如结构类型。
声明数组的一般形式是:
类型说明符数组名[元素个数];
结构类型以关键字struct开头,其类型定义形式为:
struct 结构类型名{成员列表定义};
声明结构类型变量的一般形式为:
struct 结构类型名变量名;
枚举类型是将某一问题的所有可能取值以枚举常量的方式列出的类型。
枚举类型以关键字enum开头,其定义的一般形式为:
enum 枚举类型名{枚举常量列表};
声明枚举类型变量的一般形式为:
enum 枚举类型名变量名;
7.typedef定义
如果需要给已有的数据类型起一个新名字可以借助于typedef机制,其简单形式为:
typedef A B;
在程序中可以用类型名B替代类型名A使用。
三、实验要求
1.程序均需在编译器中进行试验
2.实验完成后只需要上交第2、5、7、8题的源程序文件
3.源程序文件名均使用“2_题号.c”作为文件名,如2_2.c
四、实验内容
1.编写一个程序,验证编译系统对标识符长度的限制。
在TC2.0编译器中声明两个整型变量,变量名长度超过32位但是前32个字符相同,运行后观察系统给出的错误提示。
例:int ab012345678901234567890123456789_1;
int ab012345678901234567890123456789_2;
2.编写程序,定义int型、long型、float型、double型、char型变量各一个,输出这些变量所占的存储空间大小。
3.编写一个程序察看整型变量在内存中是否以补码方式存储。
4.设计一个程序来验证所用编译器中float类型和double类型的有效位数。
printf中输出浮点数的格式说明符为%f,用%f格式时输出浮点数小数点后的6位数。
5.用三种方式输出字符…E‟。
6.定义一个代表10的符号常量PRICE,。
在main函数中重新给其赋值为20,观察编译后的结果并分析原因。
7.编写程序,输入一个长方体的长、宽和高(整数),输出这个长方体的体积。
*8.定义一个描述红、绿、蓝三色(red,green,blue)的枚举类型,类型名为color,再定义该类型的3个变量R、G和B让其值分别为red、green和blue。
再次定义3个指针变量,分别指向变量R、G和B,最后用指针变量输出这3个变量的值。
五、难点提示
1.在TC2.0中编写一个程序声明这两个变量,编译后会出现如下错误信息
Redeclaration of ‘ab012345678901234567890123456789_1’
这是因为TC2.0中能识别的标识符长度最多为32位,系统认为这两个变量是同名的,所以编译后提示变量重新定义(Redeclaration)错误。
2.计算某种类型的变量所占用的字节数可以利用sizeof运算符来实现。
例如:
printf("int size : %d\n", sizeof(int));
将输出int型变量所占用的存储空间大小。
3.调用printf函数时使用的格式说明符%x,表示以十六进制形式输出数据。
如若有如下代码:
int a=-123,b=123;
printf("a and b in memory : %x %x\n", a,b);
观察输出的值是否是-123的补码形式。
4.由于计算机中表示数的长度是有限的,所以每种编译系统能表示数的范围和精度都有固定的长度,且可能不一样。
例如TC2.0中float类型数据的有效位数为6~7位(不包括小数点),double类型数据的有效位数是15~16位。
在编程时可以设计两个同类型的变量相加,同时考虑%f格式说明符只能输出小数点后的6位数字,观察该类型的精度。
例如定义两个float类型的变量a=11.1111111,b=66.6666666,a+b的精确值应该是77.7777777,但是因为精度原因所以实际的输出结果并不一定是精确值,请读者自行分析结果。
另外要注意的是,有效位数是指系统不管进行哪种运算,某种类型的精度肯定能保证的长度。
5.用printf(“%c”, …字符‟)来实现,格式转换符%c表示将参数(…字符‟)以字符形式输出。
第一种方法可以直接用…E‟来表示,另两种方法可以借助转义字符序列…\???‟(?表示1个八进制数字)和…\x???‟(?表示1个十六进制数字),只要将字母E的编码值分别转换成八进制和十六进制表示。
6.语句“PRICE=20;”在TC2.0中程序编译后会出现如下错误信息:
Lvalue required in function main
这是因为符号常量PRICE在预处理完成后的编译阶段已经不存在了,语句“PRICE=20;”变为“10=20;”,产生Lvalue(左值)语法错误。
此概念可参考实验三赋值表达式中的相关知识介绍。
*7.调用scanf函数输入变量的值,变量名前必须用取地址符号“&”。
8.必须先定义枚举类型再定义枚举类型变量,且在定义变量时不能省略关键字enum(除非之前已用typedef重新定义过类型)。
指针变量定义时的“*”表示其为指针类型的变量,而在引用时的“*”表示间接访问,要注意其区别。