第2章数据类型与表达式

Download Report

Transcript 第2章数据类型与表达式

第二章
数据类型与表达式
教学目标

(1) 掌握基本数据类型的含义及其定义方法;

(2) 理解常量和变量的概念及类型说明方法;

(3) 掌握算术、赋值、关系、逻辑及其他运算符
和表达式的使用方法。
3
基本内容

2.1 数据类型

2.2 常量和变量

2.3 运算符与表达式
4
2.1 数据类型

数据



程序的主要任务是对数据进行处理,而数据有多种类
型,如数值数据、文字数据、图像数据以及声音数据
等。
不同类型的数据在存储器中存放的格式不同
程序中对各种数据进行处理之前都要对其类型 (也就
是存储格式) 预先加以说明,其目的是:


便于为这些数据分配相应的存储空间
说明了程序处理数据时应采用何种具体运算方法
5
数据类型


计算机只能存放二进制数据。不同类型事物的
数据如何区分和描述?由此产生数据类型。

不同类型的数据占据不同长度的存储单元。

不同类型的数据对应不同的值域范围。

不同类型的数据对应不同的操作(运算)及规则。
数据类型越丰富,求解能力越强大。
6
整型

8
15
短整型
7
0
占用两个字节存储空间 -2^15~2^15-1(-32768~32767)

整型、长整型
24
23
16
15
8
7
0
31
占用四个字节存储空间 -2^31~2^31-1
7
实型

可采用浮点类型和双精度类型表示:


浮点类型
 使用4个字节存放数据,10-38~1038, 有效数字7位
双精度类型数据
 使用8个字节存放数据,10-308~10308,有效数字15位
31
24
23
16
15
8
尾数部分
7
0
指数部分
浮点型存储格式
8
字符型、布尔型、无值型
7

0
字符型(char)
占用一个字节存储空间 -27 ~ 27-1 (-128 ~ 127)

布尔型(bool)
即逻辑型,占用一个字节存储空间,0表示false,1表示true

无值型(void)
值域为一空集,主要用来说明函数的参数或返回值类型,表
示无参数或无返回值。
9
2.2 常量和变量

在实际数据处理过程中,有些数据经常变化,
而有些数据不变化。

变化的量称变量,不变化的量称常量。
10
2.2.1 常量
1.
2.
整型常量

2进制常量
100100000000B,10B

8进制常量
04400,0777,0100

10进制常量
2304

16进制常量
0x900,0xABC,0xffff
实型常量:

十进制形式:


xxxxx.xxxx
0.0, -2.68, 3.141593, 637.312, 32768.0,…
指数形式:

有两种表示形式:
xxx.Exx
1.267E20, 1.2E-5…
3.
字符型常量 'a', 'A', '1', ' ', '+',
4.
字符串常量 "Visual C++", "12.34", "This is a string.\n", …
5.
布尔型常量:true 和 false
11
文字数据表示

文字数据有两种:

单个字符: 例如,‘A ’、‘+‘ 、 ‘\0’ 、 ‘\’’


实际存储的是其编码  可以用整数来表示ASCII码
字符串:例如,"This is a string . "

如何存储?
12
ASCII码

共有128个,使用整数0~127表示。





10个阿拉伯数字
52个英文字母
32控制字符(非显示字符)
34个特殊字符
ASCII码对应的字符



‘A’的值65、‘a’的值97(差是32)
问号‘?’的值63、‘*’的值42
回车键的值13、ESC键的值27
助记码
 转义字符


'\n'(换行), '\r'(回车), '\t'(横向跳格), '\''(单引号), …
13
字符串存储方式
'M' 'O' 'N' 'D' 'A' 'Y' '\0'
图3-2字符串“MONDAY”的存储方式
字符串的存储方式
14
字符和字符串的区别

字符


字符串


是用单引号括起来的单个字符,它在存储器中占1个字节;
是用双引号括起来的一串字符,它在存储器中占n+1个字节,
即字符串的结束符‘\0’也占1个字节的位置。
例如:

‘A’和“A”是有区别的;前者是字符常数,后者是字符串常数。
15
2.2.2 变量
定义: 其值可以改变的量称为变量。
变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量
名分配一个内存地址。
在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其
存储单元中读取数据。
用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效
字符序列称为标识符(identifier)。简单地说,标识符就是一个名字。
变量命名规则
变量使用规则
变量初始化
变量引用
类型修饰符
16
(1)变量定义

变量的定义:用基本数据类型描述符来说明对象
变量类型 变量名表;

例:
int i, j, k;
//说明了3个整型变量
short len;
//说明了1个短整型变量
float average;
//说明了1个浮点类型的变量
double baseSalary, bonus, totalSale, additionalBonus, Salary;
//说明了5个双精度类型的变量
bool sex;
//说明了1个布尔型变量
char c1, c2;
//说明了2个字符型变量
17
(2) 变量(标识符)命名规则
•
•
•
•
变量名只能由字母、数字或下划线组成;
变量名的第一个字符必须是字母或下划线;
变量名长度不能超过编译器规定的长度;
不要用保留字定义变量名。
合法变量名:
a、 b1、 _area、m_nCount
不合法变量名:
1-name、 student one、 float
18
(3)变量使用规则

先定义,后使用
例如:
int a,b,c;
a=1;b=2;c= a+b;
下列用法是错误的(有几处?):
#include <iostream>
using namespace std;
int main()
{
int a;
cin>>b;
int c=a+b;
cout<<c<<endl;
return 0;
}
19
(4)变量初始化

变量初始化就是给变量赋初值,可采用以下任
意一种方式:

先定义,再赋初值
例如:
int sum,fac;
sum=0;fac=1;

定义时赋值(有两种形式)
例如:
int count = 0;
char c=‘A’;
或
或
int count (0);
char c(‘A’);
20
(5) 类型修饰符

在基本数据类型前加类型修饰符,可以改
变数据表示的范围。常用的有:



unsigned —— 无符号
long
—— 长型
short
—— 短型
例如:
unsigned char 表示范围变为0~255
unsigned short int 表示范围变为0~65535
21
例2-4
整型数据的溢出
#include <iostream.h>
int main()
{
short a, b;
a=32767;
b=a+1;
cout<<"a="<<a<<endl<<"b="<<b<<endl;
return 0;
}
22
2.3 运算符与表达式

表达式是由运算符将运算对象 (如常数, 变量和
函数等) 连接起来的具有合法语义的式子。

不同类型的表达式按不同运算规则进行计算。

计算结果是不同类型的值。
23
2.3.1 算术运算符和算术表达式







算术运算符:
+
*
/
%
加
减
乘
除
整除取余
算术表达式:
 由算术运算符组成的表达式。
运算对象:数值变量、常数、函数、表达式等
运算结果: 数值
优先级: 先乘、除、取余,后加、减
结合性: 从左至右
注意事项:



x*-y
6x
5X 2
应写成 x*(-y)
应写成 6*x
应写成 5*X*X
24
自增、自减运算符

“++”和“--”是自增、自减运算符



i++ 等价于 i=i+1
i-- 等价于 i=i-1
运算规则
 只能用于变量和指针
合法: i++ ;

非法: ++(a+b);
前缀形式
++(- -)V,先运算,再引用。

后缀形式
V++(- - ),先引用,再运算。
25
自增和自减运算符的用法
表达式
表达式的值
i++
i-++i
--i
i
i
i+1
i-1
副作用
i的值增大1
i的值减少1
i的值增大1
i的值减少1
26
例:++和-
假设a= 1:

x = ( a++) * (a++) ,结果?

x = ( a++) * (++ a) ,结果?

x = (++ a) * (++ a) ,结果?
27
类型不同的数据之间的混合算术运算


不同类型的数据在参加运算之前会自动转换成相同的类
型, 然后再进行运算。
转换的原则:由低级向高级转换
char -> int -> float -> double
 例2-1 算术运算
#include <iostream>
using namespace std;
int main()
{ int x=7, y=3;
double d=7.0;
cout<<x<<"/"<<y<<"="<<x/y<<endl;
cout<<x<<"%"<<y<<"="<<x%y<<endl;
cout<<d<<“/”<<y<<“=”<<d/y<<endl;
return 0;
}
//整数除法
//整数求余
//double与int运算
28
2.3.2 关系运算符和关系表达式
 关系运算符:
>
大于
<
==
小于
等于
>=
大于等于
<=
小于等于
!=
不等于
 关系表达式:由关系运算符组成的表达式。
 计算结果:逻辑值(“真”和“假”)
 优先级:

{>,>=,<,<=} 高于 { == , !=}

赋值运算 < 关系运算 < 算术运算
 运算对象:算术、关系、赋值、字符表达式
29
运算对象

算术表达式:
x+y >= x*y ;

关系表达式:
(a > b) == (c < d);

赋值表达式:
(x + = 3 ) == ( y- = 1);

字符表达式:
‘a’ ! = ‘A’ ;
30
运算规则

关系成立,结果为‘真’(非0);否则,
结果为‘假’(0)。
例如:

a=3,b=5;
a>=b
a< b
a == b
a! = b
结果为0
结果为1
结果为0
结果为1
结合性:从左到右。
31
注意事项

在逻辑上必须正确,否则会出现不正确的结果。
例如:
1X  10

若写成 1<=x<=10

在语法上是正确的,但在逻辑上是错误的。
当 x= 8 时, 1 <= x <= 10 结果为1
 当x= - 5时, 1 <= x <= 10 结果也为1

正确的写法是: 1 <= x && x <= 10
32
2.3.3 逻辑运算符和逻辑表达式

逻辑运算符:
&&(与)

由逻辑运算符组成的表达式。
运算结果:


!(非)
逻辑表达式:


||(或)
逻辑值(“真”和“假”)
优先级:


!> && > ||
赋值运算< &&、|| < 关系运算 < 算术运算< !
33
举例

xc或xb至少之一成立
x <= c || x >= b

i和j均小于或等于100,或者i和j均大于k
( i <= 100 && j <= 100 ) || ( i > k && j > k )

选所有未婚的 35岁以上男副教授和30岁以上女讲师
! 婚否 && ( (性别==‘男’&& 职称==‘副教授’&& 年龄〉=35)
|| (性别==‘女’&& 职称==‘讲师’&& 年龄〉=30))
34
2.3.4 赋值运算符和赋值表达式
赋值运算符
 赋值表达式




=
V=e
赋值表达式的值等于运算符右边的表达式的值
副作用是将表达式的值存入变量V。
复合赋值运算符
格式:
V op = e
等价于:
V = V op e
例如: a += 5, 等价于 a = a + 5

复合赋值运算符有
+=、- =、*=、/=、%=等10个
35
举例

i=j=m*n;
计算表达式m*n的值,将其结果存入变量j中,然后再将
结果存入变量i中。
 temp=a; a=b; b=temp;
交换a和b的值,temp是工作单元。
 sum=sum+i;(等价于 sum+=i;)
计算sum与i的和,结果送sum。
 str[i] = ch+‘A’- ‘a’;
将字符变量ch转换为大写字母,结果存入数组str[i]中。
36
表达式中各运算符的运算顺序
C/C++中的几十种运算符有严格、确定的运算符优先
关系和运算顺序规则。
37
优先级别
运算符
运算形式
结合方向
名称或含义
1
()
[]
.
->
(e)
a[e]
x.y
p->x
自左至右
圆括号
数组下标
结构体成员
用指针访问结构体成员
2
-
+
++ -!
~
(t)
*
&
sizeof
-e
++x或x++
!e
~e
(t)e
*p
&x
sizeof(t)
自右至左
负号和正号
自增运算和自减运算
逻辑非
按位取反
类型转换
由地址求内容
求变量的地址
求某类型变量的长度
3
* / %
e1*e2
自左至右
乘、除和求余
4
+ -
e1+e2
自左至右
加和减
5
<< >>
e1<<d2
自左至右
左移和右移
6
< <= > >=
e1<e2
自左至右
关系运算(比较)
7
== !=
e1==e2
自左至右
等于和不等于比较
8
&
e1&e2
自左至右
按位与
9
^
e1^e2
自左至右
按位异或
10
|
e1|e2
自左至右
按位或
11
&&
e1&&e2
自左至右
逻辑与(并且)
12
||
e1||e2
自左至右
逻辑(或者)
13
? :
e1?e2:e3
自右至左
条件运算
14
= += -= *=
/= %= >>=
<<= &= ^= |=
自右至左
赋值运算
复合赋值运算
15
,
自左至右
顺序求值运算
e1,e2
扩展阅读

2.4 常量修饰符

2.5 强制类型转换运算符
To be continue…
39
2.4 常量修饰符

直接常量:其本身的书写格式就说明了该常数的类型

符号常量

用const定义的常量
const double pi=3.1415926;

用宏定义#define定义的常量;类似变量,但不是变量。
#define PI 3.1415926
#define MAXNUM 10000

可以出现在表达式中
f1= r * r * PI;

但是不能作左值,下列用法是错误的:
PI = 1.0*3.14 ;
40
2.5 强制类型转换运算符

强制类型转换
C格式: (类型语句)e
C++格式: 类型语句(e)
例:
int i=1,j=2;
double d;
d = i / j;
d = (double) i / j;
d = double ( i ) / j;

//结果d为0.0
//结果d为0.5
//结果d为0.5
41
上机指导

2.6 语法错误

查看和修改编译错误

查看和修改链接错误
42
应用举例

例2-5 温度转换:输入一个华氏温度,计算并
输出对应的摄氏温度值。
5
C  ( F  32)
9
#include <iostream>
using namespace std;
int main()
{
double c, f;
cout<<"请输入一个华氏温度:";
cin>>f;
c=5.0/9.0 * (f-32);
//温度转换公式
cout<<"对应于华氏温度"<<f<<"的摄氏温度为"<<c<<endl;
return 0;
}
43
应用举例

例2-6 大小写转换:


输入一个字符,判断它是否为大写字母。如是,将其
转换为对应的小写字母输出;否则,不用转换直接输
出。
算法:

从ASCII码表知道,大小写对应字母之间的差值是32


如:‘A’的值65、‘a’的值97(差是32)
小写字母的ASCII码值
= 对应的大写字母的ASCII码值-'A '+'a '
44
#include <iostream>
using namespace std;
int main()
{
char ch;
cout<<"请输入一个字母: ";
cin>>ch;
if(ch>='A' && ch<='Z') ch=ch-'A'+'a';
cout<<"将大写转换为小写后,该字母为:"<<ch<<endl;
return 0;
}
45
应用举例

例2-7 转义字符的使用
#include <iostream>
using namespace std;
int main()
{
cout<<"Hello\n";
cout<<"1\t2\t3\t4\t5\n";
cout<<"12345\b\b78\n";
cout<<"\"hi!\", he said.\n";
return 0;
}
//使用换行符
//使用制表符和换行符
//使用退格符和换行符
//使用双引号和换行符
46
应用举例

例2-8 找零钱问题

假定有伍角、壹角、伍分、贰分和壹分共五种硬币,
在给顾客找硬币时,一般都会尽可能的选用硬币个数
最小的方法。


例如,当要给某顾客找七角二分钱时,会给他一个伍角,2个
壹角和1个贰分的硬币。
请编写一个程序,输入的是要找给顾客的零钱(以分
为单位),输出的是应该找回的各种硬币数目,并保
证找回的硬币数最少
47
#include <iostream>
using namespace std;
int main()
{
int change;
//存放零钱的变量
cout<<"请输入要找给顾客的零钱(以分为单位)";
cin>>change;
cout<<"找给顾客的五角硬币个数为:"<<change/50<<endl;
change=change%50;
cout<<"找给顾客的壹角硬币个数为:"<<change/10<<endl;
change=change%10;
cout<<"找给顾客的伍分硬币个数为:"<<change/5<<endl;
change=change%5;
cout<<"找给顾客的贰分硬币个数为:"<<change/2<<endl;
change=change%2;
cout<<"找给顾客的壹分硬币个数为:"<<change<<endl;
return 0;
}
结 束 语
学好程序设计语言的唯一途径是
你的编程能力与你在计算机上投入的时间成
49