赞
踩
【例3.1】有人用温度计测量出华氏法表示的温度(如64°F),今要求把它转换为以摄氏法表示的温度(如17.8°C)。
编写程序:有了N-S图,很容易用C语言表示,写出求此问题的C程序。
#include<stdio.h>
int main()
{
float f, c; //定义f和c为单精度浮点型变量
f = 64.0; //指定f的值
c = (5.0/9) *(f-32); //利用公式计算c的值
printf("f = %f\nc = %f\n", f, c); //输出f和c的值
return 0;
}
运行结果:
f = 64.000000
c = 17.777779
【例3.2】计算存款利息。有1000元要存一年。有三种方法:(1)活期,年利率为r1;(2)一年期定期,年利率r2;(3)存两次半年定期,年利率为r3。请分别计算出一年后按三种方法所得到的本息和。
编写程序:
#include <stdio.h>
int main()
{
float p0 = 1000, r1 = 0.0036, r2 = 0.0225, r3 = 0.0198, p1, p2, p3; //定义变量
p1 = p0 * (r1 + 1); //计算三种方式的本息和
p2 = p0 * (r2 + 1);
p3 = p0 * (r3 + 1);
printf("p1 = %f\np2 = %f\np3 = %f\n",p1, p2, p3); //输出结果
return 0;
}
运行结果:
p1 = 1003.599976
p2 = 1022.500061
p3 = 1019.799927
在计算机高级语言中,数据有两种表现形式:常量和变量。
在程序运行过程中,其值不能被改变的量称为常量。数值常量就是数学中的常数。
(1)整型常量。如1000,12345,0,-345等都是整型常量。
(2)实型常量。有两种表示形式:
①十进制小数形式,由数字和小数点组成。如123.456,0.345,0.0,12.0等。
②指数形式。如12.34e3,-346.87e-25,0.145E-25等。计算机输入输出无法表示上角或下角故规定用字母E或e表示以10为底的指数。E或e之前必须有数字,之后必须为整数(有待考证)。
(3)字符常量。有两种形式的字符串常量:
①普通字符。用单引号括起来的一个字符,如’a’,‘b’,‘3’,‘?’。单引号只是界限符,字符常量只能是一个字符,不包括单引号。‘a’与‘A’是不同的字符。字符常量存储在计算机单元里并不是存储字符本身,而是以ASCII码的形式存储。例如‘a’的ASCII码是97,故存储单元存放的就是97(以二进制的形式存放)。
②转义字符。以字符“\”开头的字符序列。例如’\n’代表换行符。‘\t’代表输出的位置跳到下一个Tab位置(制表位置),一个Tab位置为8列。这是一种在屏幕上无法显示的控制字符,在程序中也无法用一般形式的字符来表示,只能采取转义字符这种特殊形式。常用的以’'开头的转义字符见表3.1。
转义字符意思是将“\”后面的字符转换成另外的意义。如“\n”中的“n”不代表字母n而作为换行符。
(4)字符串常量。如“boy”,"123"等用双引号把若干字符括起来,字符串常量是双引号中的全部字符但不包括双引号。单引号只能包含一个字符表示字符常量。
(5)符号常量。用#define 指令,指定用一个符号名称代表一个常量。如:
#define PI 3.1416 //注意行末没有分号
经过以上的指定后,本文件中从此行开始所有的PI都代表3.1416。对程序进行编译前,预处理器先对PI进行处理,把所有PI全部置换为3.1416。这种用一个符号名代表一个常量的,称为符号常量。在预编译后,所有符号常量都变成字面常量/直接常量。使用符号常量有以下好处:
①含义清楚,见名知义。
②可以同时改变程序中多处用到的同一个常量。
注意:符号常量不是变量。符号常量不占内存,只是一个临时符号代表一个值,预编译后这个符号就不存在了,故不能对符号常量赋新值。为与变量区分,符号常量常用大写表示,如PI,PRICE等。
变量代表一个有名字的、具有特定属性的一个存储单元。它用来存放数据,也就是存放变量的值。在程序运行期间,变量的值是可以改变的。
变量必须先定义后使用。在定义时指定该变量的名字和类型。名字便于引用。变量值是存储的数据,变量名是名字代表的存储地址。在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。
C99允许使用常变量,方法是在定义变量时,在前面加一个关键字const。如:
const int a = 3;
定义a为一个整型变量,其值为3,而且在变量存在期间其值不能改变。常变量与常量的异同是:常变量有变量的基本属性:有类型占存储空间只是不允许改变其值;常变量是有名字的不变量,而常量是没有名字的不变量。有名字就便于在程序中被引用。
那符号常量和常变量有什么不同呢?
#define pi 3.1415926 //定义符号常量
const float pi = 3.1415926 //定义常变量
符号常量pi和常变量pi都代表3.1415926。但二者性质不同:符号常量是预编译指令,在预编译时仅进行字符替换,预编译之后符号常量就不存在了,所以是不分配存储空间的;而变常量是要占用存储单元的,有变量值但是值不改变。从使用角度常变量有符号常量的优点,而且使用方便。
在计算机高级语言中,用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称标识符(identifier)。简单来说,标识符就是一个对象的名字。前面用到的变量名p1,p2,c,f,符号常量名PI,PRICE,函数名printf都是标识符。
C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须是字母或者下划线。且C语言区分大小写。用户自定义标识符不能与关键字(if)和预定义标识符(printf)相同。
C语言要求定义所有变量时都要指定变量的类型。常量也是区分类型的。用计算机进行的计算不是抽象的理论值的计算,而是用工程的方法实现计算,在许多情况下只能得到近似的结果。
所谓类型就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。不同的类型分配不同的长度和存储形式。C语言允许使用的类型如图3.4,图中带有*的是C99所增加的。
其中基本类型(包括整型和浮点型)和枚举类型的变量都是数值,统称为算术类型。算术类型和指针类型统称为纯量类型,因为其变量的值都是以数字表示的。枚举类型是用户定义的整数类型。数组类型和结构体类型统称为组合类型,共用体不属于组合类型,因为在同一时间内只有一个成员具有值。函数类型用来定义函数,描述函数的接口返回值的数据类型和参数类型。
不同类型的数据在内存中占用的存储单元长度是不同的。
(1)基本整型(int型)
编译系统分配给int型数据2个或4个字节。在存储单元中的存储方式是:用整数的补码(complement)形式存放。一个正数的补码正是此数二进制形式,如5的二进制形式是101,如果用两个字节存放,如图3.5;如果是一个负数,则应先求出负数的补码:想写出绝对值二进制形式,然后对其按位取反,再加1,如图3.6。
在存放整数的存储单元中,最左面的一位是用来表示符号的,0为正,1为负。所以表示范围:0000 0000 0000 0001 到 0111 1111 1111 1111为+1 ~ +32767;1000 0000 0000 0000 到1111 1111 1111 1111为-32768 ~ -1。0000 0000 0000 0000是0。故总范围是-32768 ~ 32767。4个字节的话是-2 ^31 ~ (2 ^31 -1)。
(2)短整型(short int)
类型名为short int或short。一般存储单位为整型的一般。存储方式与整型相同。
(3)长整型(long int)
类型名为long int 或 long。一般分配4个字节。取值范围是-2 ^31 ~ (2 ^31 -1)。
(4)双长整型(long long int)
类型名为long long int 或 long long,一般分配8个字节。C99新增,有些编译系统未实现。
C标准没有具体规定各种数据类型所占用的存储单元的长度,这是由各个编译系统自行决定的。C标准只要求long型数据长度不短于int型,short型不长于int型。即
//sizeof(short)<=sizeof(int)<=sizeof(long)<=sizeof(long long)
以上这些类型在存储单元中都是以补码的形式存储的,存储单元的第一个二进制位代表符号。整型变量的范围包括负数到正数。(见表3.2)
在实际应用中,有的数据的范围常常是只有正值。为了充分利用变量的值,可以将变量定义为无符号正数类型,在类型符号前加上修饰符unsigned,表示指定该变量为无符号整数类型。如果加上修饰符signed,则是有符号类型。因此以上四种整型数据可以扩展为8中整型数据。
说明:
(1)只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加。
(2)对无符号整型数据用“%u”格式输出。
由于字符是按其代码(整数)形式存储的,因此C99把字符型数据作为整数类型的一种。但是字符型数据在使用上也有自己的特点。
字符和字符代码并不是任意写一个字符程序都能识别,例如圆周率π在程序中就不能识别,只能使用系统字符集中的字符,目前大多是系统都采用ASCII字符集。各种字符集都基本包括了127个字符。其中包括:
字符是以整数形式(ASCII代码)存放在内存单元中的。如图所示。
ASCII码是7位或8位二进制表示,所以在C语言中指定一个字节(8位)存储一个字符(所有系统都不例外)。如小写字母‘a’在内存中的存储情况见图3.9。
字符‘1’按ASCII码形式存储,占一个字节;而整数1是以整数存储方式(二进制补码)存储,占二或四个字节。
字符变量用类型符char定义字符变量。char 是character字符的缩写。
char c = '?';
定义c为字符型常量并使初值为字符‘?’。?的ASCII代码是63,系统将整数63赋给变量c。
c是字符变量,实质上是一个字节的整型变量,由于它用来存放字符,所以成为字符变量。在输出字符变量时,可以选择十进制整数形式输出,或以字符形式输出,如:
printf("%d %c", c, c)
输出结果是
63 ?
即用%d格式输出十进制整数,用%c格式输出字符。字符类型也属于整型,也可以用unsigned,signed修饰。存储空间和范围见表3.3。
在使用有符号字符型变量时,允许存储的值为-128 ~ 127,但是字符的代码不可能为负值,所以在存储字符时只用到0 ~ 127这一部分,其第一位都是0。
浮点型数据是用来表示具有小数点的实数的。为什么称为浮点数呢?在C语言中,实数是以指数形式存放在存储单元的。一个实数表示为指数可以有不止一种形式,如3.14159×10 ^0, 0.314159×10 ^1, 0.0314159×10 ^2等,它们代表同一个值。可以看出,小数点的位置在314159几个数字之间浮动,只要小数点浮动的同时改变指数的值,就可以保证它的值不会改变。由于小数点的位置可以浮动,所以实数的指数形式称为浮点数。
浮点数类型包括float(单精度浮点型)、double(双精度浮点型)、long double(长双精度浮点型)。
(1)float(单精度浮点型)。编译系统为每一个float型变量分配4个字节,数值以规范化的二进制指数形式存放在存储单元中。分为小数部分和指数部分分别存放。小数部分前面的数是0。如3.14159存放如图3.11所示。
图中使用十进制数示意的,实际上计算机中用二进制数来表示小数部分以及用2的幂次来表示指数部分的。4个字节的空间分别用多少位来表示小数部分和指数部分,C标准没有规定,由C语言编译系统自定。由于是用二进制,且长度有限,故不可能得到完全精确的值,只能存储成有限的精确度。小数部分数值范围越多,数的有效位数就越多,精度也就越高。指数部分位数越多,表示数的范围就越大。float型数据能得到6位有效数字,数值范围-3.4×10^ -38 ~ 3.4×10 ^38。
(2)double(双精度浮点型)。
为了扩大能表示的数值范围,用8个字节存储一个double型数据,可得到15位有效数字,数值范围-1.7×10^ -308 ~ 1.7×10 ^308。为了提高运算精度,C语言进行浮点数算术运算时,将float型数据都自动转换为double型,然后进行运算。
(3)long double(长双精度浮点型)。
不同编译系统对long double 型的数据处理方法不同,Turbo C分配16个字节。Visual C++分配8个字节。
整型常量。不带小数点的数值是整型常量,但要注意有效范围。123L,123l,在整数末尾加上字母表示长整型。
浮点型常量。凡以小数形式或指数形式出现的实数均是浮点型常量,在内存中都以指数形式存储。10是整型,10.0是浮点型。C编译系统把浮点型常量都按双精度处理,分配8个字节。
如果有:
float a = 3.14159;
则在编译时会发出警告:warning:truncation from ‘const double’ to ‘float’。意为把一个双精度常量转换为单精度事务警告。可以在常量末尾加专用字符,强调常量类型。
float a = 3.14159f;
long double = 3.14159L;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。