标准数据类型
C++语言提供了丰富的数据类型,如整数类型、实数类型(浮点数)、字符类型等。每种数据类型均有其取值范围,Dev-C++(4.9.9.2)是Windows平台下的32位编译器,基本数据类型的取值范围如表1.1所示(方括弧内的部分是可以省写的,例如,signed int与int等价)。
表1.1
现在的计算机普遍使用二进制(即0和1两个数码)来存储数据。二进制位(bit)是计算机存储信息的最小单位,代表1个二进制数位,其值为0或1,可以表示两个状态/数值。
8个连续的二进制位为一个字节,可以存放1个西文字符的编码(ASCII码)。1个汉字占两个字节。
表1.1列出的整数类型的取值范围均包含有负数,如果程序中需要用到的某数据类型的取值范围仅为正数,并且永远不可能取负数时,则可以使用无符号的数据类型,其取值范围如表1.2所示。
表1.2
使用无符号类型的整数类型,正整数的最大数据范围扩大了一倍啊。这对于某些数据规模较大的题目来说,如果不涉及负数的运算,使用无符号类型的整数类型,倒是很方便的。
sizeof函数可用于获取各数据类型的字节长度,例如获取long型字节长度可这样写:
cout <<sizeof(long);
了解所使用的编译器支持的各数据类型的字节长度很有必要,可以这样写:
cout<<"int的字节长度为"<<sizeof(int)<<endl; cout<<"short的字节长度为"<<sizeof(short)<<endl; cout<<"long的字节长度为"<<sizeof(long)<<endl; cout<<"long long的字节长度为"<<sizeof(long long)<<endl; cout<<"bool的字节长度为"<<sizeof(bool)<<endl; cout<<"char的字节长度为"<<sizeof(char)<<endl; cout<<"float的字节长度为"<<sizeof(float)<<endl; cout<<"double的字节长度为"<<sizeof(double)<<endl; cout<<"long double的字节长度为"<<sizeof(long double)<<endl;
【例题描述】 两整数相加
输入两个整数,计算两整数相加的和。
1 /* 2 这是一个加法程序 3 */ 4 #include <iostream> 5 using namespace std; 6 7 int main() 8 { 9 int a,b,c; //定义变量a,b,c 10 cout <<"请输入a,b的值:"; //显示提示信息 11 cin >> a >>b; //从键盘输入a和b的值 12 c=a+b; //计算a和b的和,并把结果放在c中 13 cout <<a<<"+"<<b<<"="<<c<<endl;//显示结果 14 system("pause"); 15 return 0; 16 }
第1~3行中的/*…… */是C++语言里的注释语句,用于注释多行的语句。
//也是C++语言里的注释语句,用于注释当前这一行的语句。
所谓注释语句只是方便阅读程序的人理解程序所写的语句,对编译和运行不起任何作用,当编译程序时,将自动忽略注释语句,所以注释语句的多少不影响程序运行的快慢。为便于理解,一般注释语句可用中文表示,当然也可以用英语或汉语拼音作注释。适当地添加注释语句是编程的一个好习惯。
int a,b,c;定义了a,b,c三个整型变量,所有的变量必须先定义后使用。
第11行是输入语句。cin代表标准输入流设备即键盘,输入操作由运算符“>>”来表达,它表示通过标准输入设备输入右边的数据。cin>>a>>b这条语句是表示从键盘输入两个整数,cin一次可输入多个变量的值,注意输入时数与数之间要以空格间隔。
第12行是表达式语句,即计算a+b的值,并将结果存储在c中。
第13行最后的endl用于换行,相当于前面用过的'\n'。endl与'\n'有细微的差别,endl除了输出换行外,还刷新了流,在Cena评测系统(一个可自动评测代码是否正确的软件)中,有时使用endl会随机地导致程序无法通过。
我发现一个小技巧,就是在调试程序过程中,如果暂时不想运行某段代码,其实无须将它删除,只需将这段代码注释掉就可以了。
可是我又发现一个问题,就是我不小心在输入数据时多输入或者少输入了数字,甚至输入的根本就是错误字符,可是程序仍然会得出结果,虽然这结果是错误的。
从键盘输入数据时,需严格按输入语句要求的格式输入,例如上例中,当a=1,b=2时,cin>>a>>b语句的正确输入格式应该是输入半角字符12后回车,其中1和2之间以一个或多个空格分隔,但不能是其他符号。诸如从键盘输入“a=1,b=2”,或者“1,2”之类的格式均是错误的。
需要注意的是,如果输入数字的时候错误地输入了其他字符,在C语言里会将该字符自动转换为该字符相对应ASCII码,但C++语言会直接忽略该字符,而直接代之以内存中当前位置的原始储存值。
此外,输入输出语句应严格按照格式编写,例如不能写成cin>>a,b,c;或者cout<<a+b=c之类的。即输入输出的字符串、各变量之间应使用“>>”或“<<”分隔。
C++程序对用到的所有数据都必须指定其数据类型。程序中常需要对一些变量预先设置初值。C++语言允许在定义变量的同时使变量初始化。例如:
int a=5; //指定a为整型变量,初值为5 float f=3.45; //指定f为实型变量,初值为3.45 char c= 'a '; //指定c为字符变量,初值为'a '
其中诸如int a=5这样的语句,相当于下面两条语句:
int a; a=5;
也可以使被定义的变量的一部分赋初值。如:
int a,b,c=5; //定义了整型变量a,b,c,其中c的初值为5,注意a,b,c之间用逗号分隔。
如果对几个变量均赋予初值5,应该写成:
int a=5,b=5,c=5;
不能写成int a=b=c=5;
数据类型一经确定,即不再更改,所以变量类型的定义应视程序的实际需要而定,选取数据类型过大会降低运算速度、浪费内存空间,过小会发生数据溢出。
C++程序用到的算术运算符如表1.3所示。
表1.3
C++语言没有提供数学中的中括号和大括号运算符,而统一以圆括号代替,例如数学算式:{[3-(2-9)]-[(6-10)-(5-17)]},写成C++的表达式为((3-(2-9))-((6-10)-(5-17))),计算时由内到外计算圆括号里的值。
顺便提一下,诸如x2+y2这样的式子,写成C++的表达式为x*x+y*y。
诸如a*b+a*c这样的表达式,注意千万不要写成ab+ac这样的数学算式了,初学者常犯这样的隐蔽错误。
现在自己尝试着编程解决一些复杂的算式。例如输入三个整数a,b,c,输出a3+b3+c3的值。
哈哈,这个简单,看我的关键代码如下:
int a,b,c; cin>>a>>b>>c; cout<<a*a*a+b*b*b+c*c*c<<"\n";
可是为什么当a=1000,b=1000,c=1000时,结果居然是-1294967296呢?
每种类型的数据都有各自的取值范围,请勿必确保所定义的数据不超过该类型数据的取值范围,否则会造成数据的溢出并产生结果错误。请注意,数据的溢出在编译和运行时并不报错,完全要靠编程者的细心和经验来保证结果的正确性。
下面的程序显示了整型数据溢出的错误。
1 //整型数据的溢出 2 #include <iostream> 3 using namespace std; 4 5 int main() 6 { 7 int a=2147483647; 8 a=a+1; 9 cout<<"a ="<<a<<endl; 10 system("pause"); 11 return 0; 12 }
运行结果为:
a=-2147483648
我明白了,变量a在自身加1以后,其值已经超过int型数据的取值范围,而发生错误。这就好像汽车的里程表一样,当达到最大值以后,又从最小值开始计数。
【上机实践】 梯形面积
如图1.18所示,圣魔法学院的主教学楼平面图是一个梯形,已知梯形的上底和下底的长度分别为15公里和30公里,梯形中阴影部分为高级魔法师才能去的场所,其面积是160平方公里,求梯形面积是多少。
图1.18
三角形的面积公式是(底×高)/2,由此可以算出梯形的高,再将高代入梯形面积公式(上底+下底)×高/2即可。