Download presentation
Presentation is loading. Please wait.
Published byΠολωνα Κανακάρης-Ρούφος Modified 5年之前
1
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例
2
2.1 数据类型概述
3
常量 常量就是在程序使用之前预先设定并在整个运行过程中没有变化的量。 C语言有两种实现常量的方法:
直接常量:1, 2, 3; 0.1, 10.0; 'a', '1'; "hello" 常变量:C++中,可以使用 const 关键字定义常变量 const double PI = ; 使用常变量的好处是: 做到“见名知意” 做到“一改全改”,容易调整
4
变量 变量是在程序执行过程中其值可以改变的量。 在程序中需要先定义变量,再使用变量。 定义变量包含两个步骤: ① 指出变量的数据类型。
例如: int studentID; //int是变量的数据类型 ② 为每个变量取一个名称(变量名)。 int studentID; //studentID是变量名 C语言允许把数据存放在变量中,每一个变量都由一个变量名来标识。变量名的命名规则要满足标识符的规定。 每个变量都必须具有一个类型。 每个变量根据它的类型,在内存中占据一定数目的字节单元,该变量的值就存放在这些内存单元中。
5
变量 变量的本质就是命名的内存单元 变量名 prod 实际上是一个符号地址 内存单元的地址 prod 123 123是 prod的值
内存单元的内容 变量的本质就是命名的内存单元
6
标识符的命名规定 只能由大小写字母、下划线和数字组成; 开头的第一个字符只能是大小写字母或下划线; 大小写是敏感的; 不能与C的关键字重复;
名字在整个程序中必须是唯一的; 名字的长度不能超过系统的规定。 合法的C变量名: area, sum, answer, month, name, Name, Step1, step2, number_of_student, average_score, _class1 非法的C变量名: 3rd_entry (数字开头) all$done (包含非法字符$) the end (包含空格) int (系统关键字)
7
变量的命名习惯 避免使用无意义的名字,应尽量做到“见名知意”; 尽量使用代表变量实际含义的英文单词或缩写作标识符名;
当名字包含多个单词时,通常使每个单词的首字母大写; 以下划线开头的名字通常是系统内部保留的标识符名; 在整个程序中保持统一的命名方式。 好的C变量名: CircleArea, TotalScore, UserSelection, choice, StudentNumber, AverageScore, SampleFrequency 不是很好的C变量名: a, aa (不知何意) numberofstudent (全部小写难以辨认) total totals (名字太相似)
8
变量的定义和使用 C语言中,变量必须“先定义,后使用” 变量定义具有三个目的: ⑴ 定义变量名; ⑵ 定义变量类型;
⑶ 向程序员描述该变量。 int radius; // 圆周率 注释用来解释这个变量,它是给程序员的信息。对程序主要的变量作注释是很好的习惯。 关键字 int 告诉编译系统我要定义一个整型变量,用它来保存一个整型的数值。 这是变量的名字。以后的程序中就用这个名字来访问这个变量。
9
变量的定义和使用 变量“先定义,后使用”的好处是:
C只允许使用定义过的变量。凡是未被事先定义的符号,不作为变量名。这样可以检查出程序中错误使用的变量名。 #include <iostream> using namespace std; int main() { int a, b, sum ; a=123; b=456; sum=a+b; cout<<"sum="<<sim<<endl; return(0); } 此处由于输入错误或其它原因,出现了名字为 sim 的符号。由于该符号在这之前从未定义过,所以在编译时,便会出现错误信息。 此处定义的变量名是 sum 。 error C2065: “sim”: 未声明的标识符
10
变量的定义和使用 变量定义的一般格式是:type name; //comment 类型 名字; // 注释 int age; // 学生年龄
类型 名字; // 注释 int age; // 学生年龄 float score; // 学生成绩 long number; // 学生数量 double distance; // 地月间距离 char userSelection; // 用户选择 系统将根据变量的定义为其分配相应大小的内存单元。
11
2.2 基本数据类型
12
C的数据类型 整型 单精度型 基本类型 浮点型 双精度型 C的数据类型 字符型 数组类型 结构体类型 构造类型 联合类型 指针类型 枚举类型
数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作 指针类型 枚举类型 空类型
13
2.2.1 整型数据
14
1. 整型数据类型
15
2.整型常量 整型常量即整常数。 C中有下面三种形式的整型常量: 1) 十进制整型常量: 由数字0~9和正负号表示
如: 123, -456, 0
16
2. 整型常量 2)八进制整型常量: 由数字0开头,后跟数字0~7表示. 如: 0123, 即(0123)8 =(83)10
注意:八进制整型常量中不应出现“7”以上的数码。 如: 0128, 0209 3) 十六进制整型常量:以 “0x或0X”开头后跟0~9,a~f或A~F表示 如: 0xFF, 即(0xFF)16 =(255)10
17
2.2.2 浮点型数据
18
1. 浮点型数据类型 1. 浮点型数据类型 实数又叫“浮点数”。
19
2. 浮点型常量 实数常量,默认为double型。有两种表示形式: 十进制小数形式:由数字和小数点组成。 (小数点必须有)
如: 10.23, , .12, 0.0, 89. 指数形式:±s E ±n 或 ±s e ±n 形式。 注意: E或e前面必须有数字,后面的指数 必须为整数。 如: = 218.3E0 = 2183E-1 = E+4 e-5 , 1.2E-3.5 在常量后加字母f或F,指定数据是float型常量。如 f
20
2.2.3 字符型数据
21
1. 字符型数据类型
22
2. 字符型常量 C语言中,字符常量是用单引号’ 括起来的一个字符,这些字符都是ASCII码集中的字符。
2. 字符型常量 C语言中,字符常量是用单引号’ 括起来的一个字符,这些字符都是ASCII码集中的字符。 比如:’a’ , ’A’ , ’d’ , ’D’ ,’?’ , ’%’ , ’$’ , ’2’ , ’4’ 注意: ’a’ 和 ’A’ , ’d’ 和 ’D’ 都是不 同的字符常量。
23
2. 字符型常量----转义字符常量 另外:C语言还存在转义字符常量。 它以 \ 字符开头,后面跟一个字符或代码值,并用单引号括起来。
2. 字符型常量----转义字符常量 另外:C语言还存在转义字符常量。 它以 \ 字符开头,后面跟一个字符或代码值,并用单引号括起来。 比如: ’\n’ , ‘\t’ , ‘\r’ , ‘\\’
24
2. 字符型常量----转义字符常量及其含义 转义字符 含义 ASCII 代码 \ddd
2. 字符型常量----转义字符常量及其含义 转义字符 含义 ASCII 代码 \ddd ddd为1至3位八进制数字构成,表示对应的ASCII码的字符 \xdd dd为1至2位十六进制数字构成,表示对应的ASCII码的字符 特殊标点符号 \\ 反斜杠字符 “\” 92 \‘ 单引号(撇号)字符 ‘ 39 \“ 双引号字符 “ 34 如 ’\101’ ’A’ ’\012’ ’\n’ ’\376’ ’’ ’\x61’ ’a’ ’\60’ ’0’ ’\483’ --- () 例5:(程序) ’A’--’\101’---’\x41’----65 举例: char a; a=‘A’; a=65; 24
25
2.2.4 字符串常量 C语言中,字符串常量是用双引号" 括起来的若干个字符。 比如:’’a” , ”A” , ”hello” ,
”OK” , ”SiChuanDaXue” ◆字符串常量在内存中占用连续的字节单元,每个字符按顺序占一个字节。 系统自动在字符串常量的结尾加一个字符串结束标志字符, 表示字符串结束。
26
2.2.4 字符串常量---字符串结束标志字符 C语言中,字符串结束标志字符是 ’\0’ 。
◆ ’\0’ 是ASCII码为0的字符。它是一个“空操作字符”,它既不引起任何控制动作,也不产生任何显示。 ◆ 因此,字符串常量在内存中占用的字节数等于可见字符数加上1。
27
字符串结束标志字符也是一个字符,也要占用一个字节。
2.2.4 字符串常量---字符串结束标志字符 字符串结束标志字符也是一个字符,也要占用一个字节。 5个可见字符 H E L O \0 ” HELLO ” 总共占用6个字节 没有字符串变量,字符串用字符数组存放。
28
2.2.4 字符串常量---’A’和”A”的区别 ’A’ 是字符常量,占一个字节单元 ”A” 是字符串常量,占两个字节单元, 包括’ A’和’\0’两个字符 ◆不能把一个字符串常量赋值给一个字符变量。 如 char c1 = ”A” ; 是错误的。
29
2.2.5 变量的定义与初始化 对变量的类型和精度提出合适的要求,指出它们的数据类型 目的:为变量分配内存单元并赋初值。
例:定义变量名为a的整型变量,程序可写成: int a = 30; 系统会根据这个精度要求,安排2个字节的内存单元存放a变量的值,见下图。 这里a是这个内存单元的符号地址。
30
变量初始化 一个变量在定义之后,第一次赋值之前,它的值是不确定的。 在赋初值前,不能让其参与运算,否则会得到不可预知的结果。 对变量进行定义的同时给变量赋初值,称为初始化 ◆ 在定义变量的同时进行初始化 如:int TotalStudent=40; 等价于:int TotalStudent; TotalStudent=40; ◆ 当一次定义多个变量时,可以对其全部或部分进行初始化 如:int TotalStudent=40, TotalScore=0, average; ◆ 当一次定义多个变量时,不能用连续=号的方式对多个变量进行初始化 如:int TotalScore=AverScore=0; 是错误的。 正确的应该是:int TotalScore=0, AverScore=0;
31
2.2.6 常变量 用const关键字把一个变量声明转换成常量声明 例如,用常变量PI存储π的值 const double PI = ;
32
2.3 运算符与表达式
33
2.3.1 运算符与表达式概述
34
1.运算符 运算符:一些特定的符号,具有特定的运算功能. 例如: 算术运算(加、减、乘、除) 比较运算(大于、小于、等于)
逻辑运算(与、或、非) C语言共有34种运算符。
35
1.运算符 学习运算符应注意: 运算符功能 与运算量关系 要求运算量个数 要求运算量类型 运算符优先级别 结合方向 结果的类型
36
2.表达式和表达式语句 表达式:按照运算符的性质,用运算符把数据连接起来以达到运算目的的式子。
每一个表达式都会有一个运算的结果,称为表达式的值。一个表达式中往往包含多个运算符,所以必须熟悉每一种运算符的性质(优先级别和结合性),才能写出正确的表达式。 在表达式的末尾加上一个分号“;”就构成了表达式语句。
37
2.3.2 算术运算符和算术表达式
38
1. 基本的算术运算符 ◆算术运算符(双目): + 加 - 减 * 乘 / 除 % 求余
+ 加 - 减 * 乘 / 除 % 求余 20*4 ; *2-8%9/3 ; 3%5 说明: 两整数相除,结果为整数 %要求两侧均为整型数据,其结果的符号与左边数据的符号相同。
39
1. 基本的算术运算符---例 例 -5/2.0 = -2.5 例 -5%2 = -1 5.5%2 ()
#include <iostream> using namespace std; int main( ) { int a=3, b=5, c=0; c = a/b; cout<<“c=”<<c<<”\n”; c = b/a; return 0; } 例 -5/2.0 = -2.5 例 -5%2 = -1 5.5% ()
40
2. 算术运算的优先级与结合性 算术运算符的优先级: *、/、% 同级 +、- 同级 高 低 算术运算符的结合性: 自左向右 参考课本的附录
C语言全部34种运算符的性质以及 优先级和结合性。
41
3. 自增、自减运算符 ◆自增、自减运算符(单目) 运算符: ++ -- 优先级: 高于算术运算符 结合性: 右结合性
运算符: ++ -- 优先级: 高于算术运算符 结合性: 右结合性 作 用: 使变量的值加1或减1
42
? 3. 自增、自减运算符 ◆用法:设i是个整型变量, ++i -- i (运算符前置) i++ i -- (运算符后置) 两种用法的区别?
43
? 3. 自增、自减运算符----使用注意事项 注意:自增、自减运算符的运算量只能 是变量,不可能是常量或表达式。 为什么?
因为自增、自减运算符有赋值功能,常量和表达式不能被赋值。 ++ i i = i + 1 - - i i = i - 1 像下面这样的用法就是错误的: (x+y) ++
44
2.3.3 赋值运算符和赋值表达式
45
1. 赋值运算符的功能、优先级和结合性 ◆赋值运算符(双目) 运算符: = 优先级: 低于算术运算符。 结合性: 右结合性
作 用:将一个数据赋值给一个变量, 这个数据可以是常量、变量或 表达式。
46
1. 赋值运算符的功能、优先级和结合性 ◆赋值表达式一般形式: 变量=表达式 如:num=40 把常量40赋值给变量num
如:aver=total/num 把表达式total/num的值赋给变量aver 如:temp=aver 把变量aver的值赋给变量temp
47
3. 赋值运算符的使用 注意:赋值表达式的左边只能是变量, 而右边可以是常量、变量或任何合法的 C表达式。 像下面这样的用法就是错误的:
10 = x x+y = 1 整个赋值表达式的值就等于赋值后的左边变量的值。
48
3. 赋值运算符的使用 规则:赋值号右边表达式值自动转换成左边变量的类型 例 int i; i=2.56; //结果i=2;
例 float f; int i; i=10; f=i; //结果 f=10.0
49
2.3.4 关系运算符和关系表达式
50
1. 关系运算符的功能 ◆关系运算符(双目):也叫“比较运算符” 6种: < 小于 <= 小于等于
6种: < 小于 <= 小于等于 > 大于 >= 大于等于 == 等于 != 不等于 ◆关系表达式的运算量可以是常量、变量或任何合法的表达式。 如:a*a <= 100 如:NowIndex == MaxIndex
51
<、<=、>、>= 同级
2. 关系运算符的优先级和结合性 关系运算符的优先级: <、<=、>、>= 同级 ==、!= 同级 高 低 算术运算符 = 赋值运算符 关系运算符的结合性: 自左向右
52
3. 关系运算符使用的注意事项-- (1)关系运算符使用左右操作数的算数运算值
◆每一个表达式都有一个算术运算值和一个逻辑值。 所谓算术运算值,即表达式的运算结果。 所谓逻辑值,规则是:非0的算术运算值其逻辑值是1;0的逻辑值为0。表示“真”或“假”
53
3. 关系运算符使用的注意事项 ◆关系运算符在比较左右表达式的值的大小时,使用左右操作数的算数运算值,而不是逻辑值。
但关系运算的值是“逻辑值”,表示“真”或“假”,而且 “真”用整数1表示; “假”则得到整数0。
54
3. 关系运算符使用的注意事项 = 是“赋值运算符”。赋值表达式中,赋值 运算符的左边只能是变量。
= 是“赋值运算符”。赋值表达式中,赋值 运算符的左边只能是变量。 == 是“等于关系运算符”。关系表达式中,运算符的两边可以是常量、变量或任何合法的表达式。
55
3. 关系运算符使用的注意事项 (a = 1)==(b = 2) 是正确的关系表达式 (a = 1) = (b = 2) 是错误的赋值表达式
这个赋值表达式的值是2 a == 2 这个关系表达式的值是 0
56
2.3.5 逻辑运算符和逻辑表达式
57
逻辑运算符 逻辑运算符:3种 && 逻辑与(双目) || 逻辑或(双目) ! 逻辑非(单目)
58
2.3.5 逻辑运算 1、逻辑与,运算符为&& 如图电路 A——表示开关A合上; B——表示开关B合上; A&&B——表示灯亮;
A B A&&B 1表示真,0表示假,这是逻辑变量的取值,非真即假
59
? 1. 逻辑运算符的功能-- &&逻辑与 例:要求写一个表达式,判断变量x的值是否在(-5,+5)范围内。
C语言中的表达: 例如: 当x=6时 在C语言中用-5 < x < +5判断, 结果是:1。 表示“成立”。判断错误。 考虑x=-6 应该这样使用: x>-5 && x<5 -5 +5 59
60
2.3.5逻辑运算 A B A||B 1 1 1 1 0 1 0 1 1 0 0 0 2、逻辑或,运算符为|| 如图电路
A——表示开关A合上; B——表示开关B合上; A||B——表示灯亮; A B A||B 1表示真,0表示假
61
逻辑运算符的功能-- ! 逻辑非: ! 逻辑非: 运算量的逻辑值为1 ,逻辑非运算则为0; 运算量的逻辑值为0 ,逻辑非运算则为1
逻辑运算符的功能-- ! 逻辑非: ! 逻辑非: 运算量的逻辑值为1 ,逻辑非运算则为0; 运算量的逻辑值为0 ,逻辑非运算则为1 x < 0 ! (x > =0)
62
逻辑运算符的优先级和结合性 逻辑运算符的优先级: 逻辑运算符的结合性: 关系运算符 && 逻辑与 高 低 算术运算符 || 逻辑或
! 逻辑非 = 赋值运算符 逻辑运算符的结合性: && 、|| 自左向右 ! 自右向左
63
逻辑运算符使用的注意事项 逻辑运算的运算量:可以是任何类型的数 据。既可以使常量、变量,也可以是表达式。
◆逻辑运算符两边的运算量都使用表达式的逻辑值,即“0”或“1”。 逻辑表达式的运算结果也是逻辑值:0 或 1 如:x && y + z 如:5 && 3 && ! 0 结果:1
64
逻辑运算符使用的注意事项 逻辑运算的运算量:可以是任何类型的数 据。既可以使常量、变量,也可以是表达式。
◆逻辑运算符两边的运算量都使用表达式的逻辑值,即“0”或“1”。 逻辑表达式的运算结果也是逻辑值:0 或 1 如:x && y + z 如:5 && 3 && ! 0 结果:1
65
((a+b)>c)&&(b==c) (7>c) && (b==c) 1 && (b==c) 1 && 0 → 0
逻辑运算符使用的注意事项- 逻辑表达式:例 #include <iostream> using namespace std; int main( ) { int a = 3, b = 4, c = 5, d = 0, x = 0, y = 0; d = a + b > c && b == c; cout<<d<<endl; return 0; } ((a+b)>c)&&(b==c) (7>c) && (b==c) 1 && (b==c) 1 && 0 → 0 输出0
66
3. 逻辑运算符使用的注意事项 对于“&&”表达式和“||”表达式,系统按从左向右顺序求解时,如果当求出某个运算量后整个逻辑表达式的值就能够确定时,则余下的运算量不被求解。
67
3. 逻辑运算符使用的注意事项 x < -5 || x > +5 假设: x = -6 1 || x < +5 1
没有被求解 1 x > -5 && x < +5 假设: x = -6 && x < +5 没有被求解
68
3. 逻辑运算符使用的注意事项 运行结果: 1 a=4, c=5 x=4, y=0 #include <iostream>
using namespace std; int main( ) { int a = 3, b = 4, c = 5, d = 0, x = 0, y = 0; d = a + b > c && b == c; cout<<d<<endl; d = a ++ | | c ++; d = ! (x = a) && (y = b); cout<<“a =“<<a<<“, c =“<<c<<endl; cout<<“x =“<<x<<“, y =“<<y<<endl; return 0; } 运行结果: 1 a=4, c=5 x=4, y=0
69
2.4 混合运算与类型转换
70
2.4.1 自动类型转换 ◆不同类型的数值型数据之间可以进行混合运算。如:10+‘a’+1.5*123.45*’B’
◆系统在求解时,先自动把不同类型的数据转换成同一类型,然后进行运算。转换规则如图: 运算对象不同时转换 必定的转换
71
2.4.1 自动类型转换 10+'a'+1.5*123.45*'B' *123.45*'B' *'B' *66 *66.0
72
2.4.2 强制类型转换 ◆强制类型转换运算符(单目) 运算符: (类型名) 用 法: (类型名) (变量或表达式)
用 法: (类型名) (变量或表达式) 优先级: 高于算术运算符 结合性: 右结合性 如:(long)(length-200) 如:(float)5/3 相当于:((float)5)/3
73
2.4.2 强制类型转换 注意:参与强制 类型转换的变量 本身的类型并不 会改变。 #include <iostream>
using namespace std; int main( ) { float a = 3.5, b = 2.3; int c; c = (int) a - (int) b ; cout<<“c=”<<c<<endl; c = (int) a % c ; return 0; } 注意:参与强制 类型转换的变量 本身的类型并不 会改变。
74
2.4.3 赋值运算中的类型转换 赋值运算中左右操作数数据类型不一致时,自动类型转换的原则是:
将运算符右边的值的类型转换成与左边变量的类型一致。
75
2.5 数据的输入输出
76
2.5.1 使用cin和cout进行数据输入输出 cin是C++的标准输入流对象, cout是C++的标准输出流对象,
它们都在头文件iostream中定义。 因此使用这两个流对象需要加载这个头文件。
77
1. 输出流对象cout cout是C++的标准输出流,用于在屏幕上显示插入的字符。 例如:
cout << "Good Morning!\n"; cout和输出运算符<<一起使用,<<的作用是将字符串“Good Morning!\n”写入到输出流cout中,也就是输出在标准输出设备(通常是屏幕)上。
78
1. 输出流对象cout---例 int studentID = 12345678; float score = 98.5;
输出结果为: studentID= , score=98.5, grade=A int studentID = ; float score = 98.5; char grade = 'A'; cout << "studentID=" << studentID << ", score=" << score << ", grade=" <<grade <<endl; 将多个数据写入到输出流cout中 控制符endl代表回车换行操作
79
2. 输入流对象cin cin是C++的标准输入流对象。用于从键盘输入信息至内存变量。 例如:
int studentID; float score; cin >> studentID >> score; // 输入一个整数和浮点数。 输入: (数据间用空格分隔) 用cin输入变量时,C语言会自动识别变量的类型,将输入的字符转换成合适的数值传给变量。
80
2.5.2 单个字符的输入输出
81
1. 字符输出函数putchar() putchar()函数的功能:向标准输出设备(一般是屏幕)输出一个字符。
它需要一个字符型的参数(参数可以是常量、变量或表达式)。它的一般形式是: putchar(字符型数据);
82
1. 字符输出函数putchar()---例 运行结果: BOY Ab #include <iostream>
using namespace std; int main( ) { char a, b; int c, d; a = 'B'; b = 'O'; c = 65; d = 66; putchar(a); putchar(b); putchar('Y'); putchar('\n'); putchar(c); putchar(d+32); return 0; } 运行结果: BOY Ab
83
2. 字符输入函数getchar() getchar()函数的功能是从键盘获得一个字符,并将这个字符作为函数的返回结果,返回给调用它的程序。
执行过程: 当程序运行到包含有getchar函数调用的语句时,会暂时停下来,此时屏幕上有一个闪烁的光标,等待用户从键盘上的输入。用户必须键入有关信息并按Enter键后程序才能继续向下执行。
84
2. 字符输入函数getchar()—例 字符输入函数getchar :例 #include <iostream>
using namespace std; int main( ) { char ch; ch = getchar( ); putchar(ch); return 0; } 运行结果: B↙ (用户键入字符B后,再键入“回车”键) B (putchar函数再在屏幕上输出一个字符B)
85
2.6 顺序程序设计举例
86
程序开发的过程 用计算机解决问题的过程大致是: 1. 分析问题,首先从数学上找出解决该问题的方法(数学模型,公式)
2. 拟出具体的解决步骤(算法,流程图) 3. 用某种计算机语言实现(程序设计方法,基本控制结构,程序) 4. 运行该程序,找出错误,直到结果正确(编辑源程序,编译,连接,调试)
87
例 已知1厘米等于0.3937英寸。编写一个程序,要求输入以厘米为单位的身高,然后显示该身高值等于多少英寸。 算法分析:
题目中已给出了数学上厘米和英寸换算的比率。因此程序只需从键盘获得以厘米为单位的身高,然后乘以这个比率,就可以得出以英寸为单位的身高。 基本步骤: 包含相应的头文件 根据题目需要定义变量(类型、名字、初值) 从键盘输入需要的数据 进行相关的运算 输出计算结果
88
例 包含头文件 #include <iostream> using namespace std; int main() 定义变量
{ const double CM_INCH_RATIO=0.3973; double heightCm, heightIn; cout<<"请输入你的身高(单位:厘米):"; cin>>heightCm; heightIn = heightCcm * CM_INCH_RATIO; cout<<"你的身高为"<<heightIn<<"英寸"<<endl; return 0; } 定义变量 (类型、初值) 提示输入,然后得到输入的数据 进行 相关的 计算 输出需要 的结果
Similar presentations