标准数据类型

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即可。