数据和数据运算第 2章 数据类型、运算符、表达式
2
本章学习目标
通过本章学习,你能够
了解数据在计算机中的存在形式
掌握 数据类型 的概念和使用
掌握 常量 和 变量 的概念和使用
掌握各种 数据运算 的概念和使用
3
本章主要内容
基本数据类型
常量和变量
运算符和表达式该章细节较多,请课下仔细阅读本章作业
4
数据类型( Data Type)
数据为什么要区分类型?
不同类型的数据代表不同的
数据表示形式
合法的取值范围
占用内存空间大小
5
数据在内存中的表示形式
十进制数转换成二进制数
正整数:原码
如,10 ---> (0 0 0 0 1 0 1 0)2
负整数:补码
如,-10 ---> (1 1 1 1 0 1 1 0) 2
实数:尾数 + 阶码
(90.5)10 =(1011010.1)2
0.10110101*2 --> 0.10110101*27 111
6
数据运算 (数学上 )
1,圆面积,R2?
2,球体积,4/3?R3
3,计算函数,f(x) = x3 - 5x2 + 16x - 80
4,条件判断,?0
5.,..
acb 42-=D
7
数据运算 (C++)
1,圆面积,r*r* 3.14159
2,球体积,4.0/3.0* 3.14159 *r*r*r
3,计算函数:
f(x) = x*x*x - 5*x*x + 16*x - 80
= ((x-5)*x+16)*x-80 (更合理 )
4,条件判断,b*b-4*a*c>=0
5.,..
8
数据的存在形式和类型
存在形式:
变量
常量
例,r*r* 3.14159
数据类型:
整型、实型、字符型、逻辑型,...
9
什么是变量
存储单元
在程序运行期间,其值可以改变
变量名:标识存储单元
变量类型:存储某种性质的数据
变量值:存储单元中存储的数据
123sum
变量的命名规则
由字母、下划线 (_)或数字组成
第 1个字符必须是字母或下划线
大小写字母敏感
不能是 C++的关键字
studentName student_name
No_1 _above Lotus_1_2_3
M.D.John $123 #56
3SA567 Lotus-123 char
11
如何定义整型变量
关键字,int
修饰符:
short,long,unsigned
例:
int num
short int i
long int sum
unsigned int count
12
整型数据类型 说明符 位数 数值范围短整 short 16 -32768~ 32767
基本 int 32 -231~ (231-1)
长整 long 32 -231~ (231-1)
无符号
unsigned short 16 0~ 65535
unsigned [int] 32 0~ (232-1)
unsigned long 32 0~ (232-1)
13
问题 1:四则运算
程序要求:
随机产生两个整数 (<10)
进行加运算
输入运算结果
判断结果是否正确
#include<cmath> //常用数学函数
int main()
{
int a,b,sum; //定义整型变量
a=rand()%10; b=rand()%10;
cout<<a<<'+'<<b<<'=';
cin>>sum;
if(sum==a+b)
cout<<"correct!"<<endl;
else
cout<<"error!"<<endl;
}
请指出:
常量和变量数据类型
15
问题 2:已知半径计算,..
圆面积
球体积
圆周长必须考虑:
数据类型、计算精度等
16
如何定义实型变量
关键字:
float
double
long double
17
实型数据的数值范围
float,4字节,~7位有效数字,? ~ 10 to ~ 10
double,8字节,~15位有效数字,? ~ 10 to ~ 10
long double,同 double
参考,IEEE 754标准
需注意的问题:有效数字,数据溢出
-44 38
-323 308
int main()
{
float r;
float area,vol,per; //定义实型变量
cout<<"请输入半径,";
cin>>r;
area = r*r*3.14159;
vol = 4.0/3.0*r*r*r*3.14159;
per = 2*r* 3.14159;
cout<<"圆面积 ="<<area<<endl;
....
请指出:
常量和变量数据类型
int main() //提高计算精度
{
const double PI = 3.1415926; //定义常变量
double r;
double area,vol,per; //定义双精度实型变量
cout<<"请输入半径,";
cin>>r;
area = r*r*PI;
vol = 4.0/3.0*r*r*r*PI;
per = 2*r* PI;
cout<<"圆面积 ="<<area<<endl;
....
20
问题 3:四则运算
程序要求:
随机产生两个整数 (<10)
进行加运算
输入运算结果
判断结果是否正确
反复计算直到放弃
int main()
{
int a,b,sum;
char cont; //定义字符型变量
do {
..,//参照问题 1的程序代码
cout<<"还想继续计算吗?";
cin>>cont;
} while(cont=='y');
...
22
如何定义字符型变量
关键字:
char
存储形式
占 1个字节
ASCII编码(参见教材附录 A)
23
字符型数据
字符常量
如,'a','D','?','$'
字符变量
例,char c1,c2;
c1 = 'a';
c2 = 'b';
24
转义字符常量
'\n','\0','\\','\'','\41','\x41'
参见教材 (表 2.2,p24)
字符型与整型之间的关系举例,char a='a'; a = a-32; a?
字符型数据 (2)
25
逻辑型数据
关键字,bool
占 1个字节
只有 2个值:
false
true
例,bool flag; flag = false;
基本数据类型整型 (int)
整型 短整型 (short int)
长整型 (long int)
无符号整型 (unsigned)
基本类型 字符型 (char)
单精度型 (float)
浮点型 双精度型 (double)
长双精度型 (long double)
布尔型 (bool)
C++编译系统内置
27
数据小结
常量 (由字面形式判断 )
数值常量
整型常量,123,-123,123L,020,0x20
实型常量,3.14,-0.314e1,1.23456789L
字符常量
普通字符常量,'a','1','#'
转义字符常量,'\n','\41','\x41'
28
数据小结 (2)
变量:
类型:字节数、表示形式
命名规则
先定义后使用
定义形式:
类型名 变量名
例,int a; char c; float x; double y;
变量初始化,float a = 10;
29
数据运算
通过表达式实现
表达式:数据 + 运算符
数据 (常量和变量 )
运算符 (功能、优先级、结合性 )(参见附录 B)
例如,r*r*3.14159
area = r*r*3.14159
30
运算符
算术运算符
关系运算符
逻辑运算符
赋值运算符
条件运算符
位运算符
,..
31
算术运算
+ - * / %(取余)
双目运算符
优先级:
先乘除,后加减
结合性:
同级自左至右注:参见教材附录 B
32
赋值运算
赋值运算符,"="
作用是将其 右边的数据 赋给其 左边的变量
例:
n = 100;
n = n + 5;
n?
33
自增、自减运算符
++,-- (单目运算符 )
例,i++; 等价与,i = i + 1;
++i; 等价与,i = i + 1;
j=i++; 等价与,j = i; i++;
j=++i; 等价与,i++; j = i;
int main()
{
float r;
float area,vol,per; //定义实型变量
cout<<"请输入半径,";
cin>>r;
area = r*r*3.14159;
vol = 4.0/3.0*r*r*r*3.14159;
per = 2*r* 3.14159;
cout<<"圆面积 ="<<area<<endl;
....
请指出:
运算符和表达式
35
复合赋值运算符
+=,-=,*=,/=,%=
例:
a += 3 等价于 a = a + 3
x*=y+8 等价于 x = x*(y+8)
36
赋值表达式举例
a=5 表达式值为 5
a=b=c=5 表达式值为 5,a,b,c均为 5
a=5+(c=6) 表达式值为 11,a为 11,c为 6
a=(b=4)+(c=6)
表达式值为 10,a为 10,b为 4,c为 6
注:适可而止,不影响程序的可读性
37
关系运算
构成简单的判断条件
优先次序为:
< <= > >= == !=
优先级相同(高) 优先级相同(低)
表达式值类型为,bool
例如,int a=1,b=2,c=3,x=1,y=2;
a>b,c<=a+b,x+y==3
例 1.3 给两个数 x和 y,求两数中的大者
#include <iostream>
using namespace std;
int max(int x,int y)
{
int z;
if(x>y) //判断条件
z=x;
else
z=y;
return z;
}
39
逻辑运算
构成复杂的判断条件
逻辑运算符:
!(非 ) &&(与 ) ||(或 )
优先次序,高 → 低
逻辑表达式例如,(a>b) && (x>y)
表达式值类型为,bool
40
逻辑运算举例
润年判断符合下面二者之一:
1,能被 4整除,但不能被 100整除。
2,能被 400整除。
41
逻辑运算举例 (2)
1,能被 4整除,但不能被 100整除。
表示成:
year%4 == 0 && year%100 != 0
42
逻辑运算举例 (3)
2,能被 400整除。
表示成:
year%400 == 0
43
逻辑运算举例 (4)
润年判断条件:
(year%4 == 0 && year%100 != 0)|| (year%400 ==0)
44
逻辑运算的真值表
a b !a a&&b a||b
true true false true true
true false false false true
false true true false true
false false true false false
注:对于非逻辑数据,非 0,true,0,false
45
关于逻辑运算的性能提示
在 &&表达式中,把最可能为假的表达式放在其表达式左边
在 ||表达式中,把最可能为真的表达式放在其表达式左边
46
逻辑运算思考题如何表示计算如下函数的条件:
0 x<0
f (x) = sin(x) 0? x
1 x>?
47
条件运算
条件运算符:
,
唯一的三元运算符
条件表达式:
表达式 1? 表达式 2,表达式 3
计算 结果为真计算
48
条件运算
条件运算符:
,
唯一的三元运算符
条件表达式:
表达式 1? 表达式 2,表达式 3
计算结果为假计算条件运算
运算符:?:
表达式 1?表达式 2:表达式 3
执行顺序,
先求解 表达式 1,
若表达式 1的值为 true,则求解 表达式 2,
表达式 2的值为最终结果
若表达式 1的值为 false,则求解 表达式 3,
表达式 3的值为最终结果例 1.3 给两个数 x和 y,求两数中的大者
#include <iostream>
using namespace std;
int max(int x,int y) //max函数
{
int z;
if(x>y) //if语句
z=x;
else
z=y;
return z;
}
51
条件运算举例
int max(int x,int y) //max函数
{
int z;
z = x>y? x,y;
return z;
}
52
条件运算举例
int max(int x,int y) //max函数
{
return x>y? x,y;
}
53
条件表达式举例
if ( grade >= 60 )
cout<< "Passed";
else
cout<< "Failed";
可写成:
grade >= 60?cout<<"Passed",cout<<"Failed";
54
sizeof 运算符
运算结果:
数据所占的字节数。
语法形式
sizeof (类型名 )
或 sizeof (表达式 )
运算符优先级 (附录 B)
()
++ -- sizeof
* / %
+ -
== !=
位运算
&&
||
,
赋值运算逗号运算 低高
56
不同类型数据间的混合运算两个不同类型的数据要先转换成同一类型,
然后进行运算。
转换的规则按图所示:
赋值运算符例外!
例,int n;
n=10 / 3 + 'a' + 1.5 - 0.1234 * 'd'
57
强制类型转换将一个表达式转换成所需类型。
例如:
(int)(x+1.2) (将 x+1.2的值转换成整型)
(float)1/3 (将 1的值转换成 float型)
强制类型转换的一般形式为
(类型名 )(表达式 ) 或 类型名 (表达式 )
例,(float)1/ 3 float(1)/3
赋值运算符取决于其左边变量的类型!
例如:
short int i=289;
char c;
c=i;
类型转换中的问题
int main( )
{
unsigned short a;
short int b = -1;
a=b;
cout<<″a=″<<a<<endl;
return 0;
}
类型转换中的问题 (2)
结果,65535
60
数据的输入 /输出
利用 stdio函数
#include<stdio.h>
输出,printf()
输入,scanf()
利用 iostream类对象
#include<iostream.h>
输出,cout
输入,cin
61
数据的输入 /输出
利用 stdio函数
例如:
char c=97;
int n='a';
float f=3.14;
printf("%5c%5d%10.2f \n",c,n,f);
printf("%d %o %x %c\n",n,n,n,n);
printf("%d %o %x %c\n",c,c,c,c,c);
printf("%f %d %c\n",f,f,f);
62
数据的输入 /输出
利用 iostream类对象
例如:
char c=97; int n='a'; float f=3.14;
cout<<c<<' '<<n<<' '<<f<<'\n';
cout<<setw(5)<<c<<setw(5)<<n<<...;
cout<<n<<' '<<char(n)<<' '<<int(c)<<endl;
cout<<setiosflags(ios::oct)<<n<<'\n';
cout<<setiosflags(ios::hex)<<n<<'\n';
63
本章小结
基本数据类型
字节数,数的范围,有效数字,上溢或下溢问题
常量和变量
字面形式,常变量,符号常量
变量先定义后使用,变量命名规则,变量的初始化
运算符 (参见附录 B)和表达式
运算符的功能、操作数个数、优先级、结合性
不同类型的数据的转换 (自动或强制 )
C++的数据类型数据类型 基本类型 整型 短整型 (short int)
整型 (int)
长整型 (long int)
字符型 (char)
浮点型 单精度型 (float)
双精度型 (double)
长双精度型 (long double)
布尔型 (bool)
构造类型 枚举类型 (enum)
数组类型结构体类型 (struct)
共用体类型 (union)
类类型 (class)
指针类型引用类型空类型 (void)
65
本章思考题
某地刑侦大队对涉及 6个嫌疑人的一桩疑案进行分析:
1,A,B至少有 1人作案;
2,A,E,F至少有 2人参与作案;
3,A,D不可能是同案犯;
4,B,C或同时作案,或与本案无关;
5,C,D中有且仅有 1人作案;
6,如果 D没有参与作案,则 E也不可能参与作案。
试写出以上各情况的判断条件。
66
本章作业
实验 2
复习第 2章,预习第 3章
习题,1~7
67
位运算 —— 按位与( &)
运算规则
将两个运算量的每一个位进行逻辑 与 操作
举例:计算 3 & 5
3,0 0 0 0 0 0 1 1
5,(&) 0 0 0 0 0 1 0 1
3 & 5,0 0 0 0 0 0 0 1
用途:
将某一位置 0,其它位不变。例如:
将 char 型变量 a 的最低位置 0,a = a & 0376;
取指定位。
例如:有 char c; int a;
取出 a 的低字节,置于 c 中,c = a & 0377;
69
位运算 —— 按位或( |)
运算规则
将两个运算量的每一个位进行逻辑 或 操作
举例:计算 3 | 5
3,0 0 0 0 0 0 1 1
5,(|) 0 0 0 0 0 1 0 1
3 | 5,0 0 0 0 0 1 1 1
用途:
将某些位置 1,其它位不变。
例如:将 int 型变量 a 的低字节置 1,
a = a | 0xff;
70
位运算 —— 按位异或 (^)
运算规则
两个操作数进行异或:
若对应位 相同,则结果该位为 0,
若对应位 不同,则结果该位为 1,
举例:计算 071^052
071,0 0 1 1 1 0 0 1
052,(^) 0 0 1 0 1 0 1 0
071^052,0 0 0 1 0 0 1 1
71
位运算 —— 按位异或( ^)
用途:
使特定位翻转(与 0异或保持原值,与 1异或取反)
例如:要使 01111010 低四位翻转:
0 1 1 1 1 0 1 0
(^)0 0 0 0 1 1 1 1
0 1 1 1 0 1 0 1
72
位运算 —— 取反 (~)
单目运算符:对一个二进制数按位取反。
例,025,0000000000010101
~025,1111111111101010
73
位运算 —— 移位
左移运算( <<)
左移后,低位补 0,高位舍弃。
右移运算( >>)
右移后,低位:舍弃高位:无符号数:补 0
有符号数:补,符号位,