51
模模 模模模模模模 模模 模模模模模模 模模 模模模模模模 () 模模 模模模模模模 () 模模模模 模模模模

模块一 程序设计基础 (三)数据运算部分

Embed Size (px)

DESCRIPTION

模块一 程序设计基础 (三)数据运算部分. 基础模块. 模块一 数据运算学习内容.  算术运算符  增 1 和减 1 运算符  宏常量与 const 常量  表达式与赋值中的自动类型转换  强制类型转换运算符  常用的标准数学函数. 运算符( Operator ). 详见附录 C 常见的运算符 算术运算符 赋值运算符 类型强转 关系运算符 逻辑运算符 增1和减1 位运算符. 1.1C 运算符和表达式 ( Operator and Expression ). 何谓运算符和操作数 ?. Example:. - PowerPoint PPT Presentation

Citation preview

Page 1: 模块一 程序设计基础 (三)数据运算部分

模块一 程序设计基础模块一 程序设计基础(三)数据运算部分(三)数据运算部分模块一 程序设计基础模块一 程序设计基础(三)数据运算部分(三)数据运算部分

基础模块基础模块基础模块基础模块

Page 2: 模块一 程序设计基础 (三)数据运算部分

2/51

模块一 数据运算学习内容模块一 数据运算学习内容

算术运算符算术运算符 增增 11 和减和减 11 运算符运算符 宏常量与 宏常量与 constconst 常量常量 表达式与赋值中的自动类型转换表达式与赋值中的自动类型转换 强制类型转换运算符强制类型转换运算符 常用的标准数学函数常用的标准数学函数

Page 3: 模块一 程序设计基础 (三)数据运算部分

3/51

运算符( 运算符( Operator Operator )) 详见附录详见附录 CC 常见的运算符常见的运算符

算术运算符算术运算符 赋值运算符赋值运算符 类型强转类型强转 关系运算符关系运算符 逻辑运算符逻辑运算符 增1和减1增1和减1 位运算符位运算符

Page 4: 模块一 程序设计基础 (三)数据运算部分

4/51

1.1C1.1C 运算符和表达式运算符和表达式(( Operator and ExpressionOperator and Expression ))

Example:Example:

W + ZW + Z

操作数操作数(Operand)(Operand) 运算符运算符

(Operator)(Operator)

操作数操作数(Operand)(Operand)

何谓运算符和操作数何谓运算符和操作数 ??

Page 5: 模块一 程序设计基础 (三)数据运算部分

5/51

1.1.11.1.1 算术运算符和表达式算术运算符和表达式

Addition (+)Addition (+)

Subtraction (-)Subtraction (-)

Multiplication (*)Multiplication (*)

Division (/)Division (/)

Modulus (%)Modulus (%)

Arithmetic OperatorsArithmetic OperatorsArithmetic OperatorsArithmetic Operators

Page 6: 模块一 程序设计基础 (三)数据运算部分

6/51

除法除法(( DivisionDivision ))Example:Example:

W / ZW / Z

浮点数除法(Floating Division)

WW or ZZ or both are floats

整数除法(Integer Division)

WW and ZZ are integers

Page 7: 模块一 程序设计基础 (三)数据运算部分

7/51

Example:Example:

an integeran integer

an integeran integer

the result is the result is also an integeralso an integer

整数除法(整数除法( Integer DivisioInteger Divisionn ))

11 / 5 = 211 / 5 = 2

Page 8: 模块一 程序设计基础 (三)数据运算部分

8/51

Example:Example:

实数除法实数除法(( Floating DivisioFloating Divisionn ))

11.0 / 5 = 2.211.0 / 5 = 2.2

a floata float

an integeran integer

the result is a the result is a floatfloat

Page 9: 模块一 程序设计基础 (三)数据运算部分

9/51

求余求余(( ModulusModulus ))

It returns theIt returns the remainderremainder that occurs that occurs after performing the division of 2 after performing the division of 2 operandsoperands

Rule:Rule: 操作数必须是整数操作数必须是整数 Operands must beOperands must be integersintegers

注意!注意!

Page 10: 模块一 程序设计基础 (三)数据运算部分

10/51

Example:Example:

11 % 5 = 111 % 5 = 1

an integeran integer

an integeran integer

the result is the the result is the remainder of remainder of 11/511/5

1152

10

1

remainderresult

求余(求余( ModulusModulus ))

Page 11: 模块一 程序设计基础 (三)数据运算部分

11/51

Example:Example:

-11 % 5 = -1-11 % 5 = -1

an integeran integer

an integeran integer

-115-2

-10

-1

remainderresult

the result is the the result is the remainder of -11/5remainder of -11/5

求余(求余( ModulusModulus ))

Page 12: 模块一 程序设计基础 (三)数据运算部分

12/51

Example:Example:

11 % -5 = 111 % -5 = 1

an integeran integer

an integeran integer

11-5-2

10

1

remainderresult

the result is the the result is the remainder of 11/-5remainder of 11/-5

求余(求余( ModulusModulus ))

Page 13: 模块一 程序设计基础 (三)数据运算部分

13/51

Example:Example:

11.0 % 5 = ?11.0 % 5 = ?

a floata float

an integeran integer

INVALID!INVALID!

求余(求余( ModulusModulus ))

注意!注意!

Page 14: 模块一 程序设计基础 (三)数据运算部分

14/51

当算术表达式包含两个或两个以上的算当算术表达式包含两个或两个以上的算术运算符时术运算符时

首先要确定运算顺序首先要确定运算顺序 所有的运算符都有一个优先级所有的运算符都有一个优先级(( Order Order

of Precedence of Precedence ))

算术表达式算术表达式(( Arithmetic ExpressionArithmetic Expression ))

算术表达式算术表达式(( Arithmetic ExpressionArithmetic Expression ))

Page 15: 模块一 程序设计基础 (三)数据运算部分

15/51

优先级(优先级( Order of PrecedenceOrder of Precedence ))

High:High: * / %* / %Low: Low: + -+ -

不同不同优先级时的运算顺序:优先级时的运算顺序:———— 从高到低从高到低相同相同优先级时的运算顺序:优先级时的运算顺序:———— 算术运算符为左结合(从左到右)算术运算符为左结合(从左到右)

算术表达式算术表达式(( Arithmetic ExpressionArithmetic Expression ))

算术表达式算术表达式(( Arithmetic ExpressionArithmetic Expression ))

Page 16: 模块一 程序设计基础 (三)数据运算部分

23/4/20 16/51

Example:Example:??

44

8.58.5

2.5 + 6 –2.5 + 6 –

– – 44

4.54.5

2.5 + 6 – 2 * 2 = 2.5 + 6 – 2 * 2 =

算术表达式算术表达式(( Arithmetic ExpressionArithmetic Expression ))

算术表达式算术表达式(( Arithmetic ExpressionArithmetic Expression ))

4.54.5

Page 17: 模块一 程序设计基础 (三)数据运算部分

17/51

巧妙使用巧妙使用圆括号圆括号改变运算顺序改变运算顺序 从内往外运算从内往外运算

Example:Example:

( 9 – ( 3 + 2 ) ) * 3 = ?( 9 – ( 3 + 2 ) ) * 3 = ?

算术表达式算术表达式(( Arithmetic ExpressionArithmetic Expression ))

算术表达式算术表达式(( Arithmetic ExpressionArithmetic Expression ))

Page 18: 模块一 程序设计基础 (三)数据运算部分

18/51

Example:

( 9 – ( 3 + 2 ) ) * 3 = ??( 9 – ( 3 + 2 ) ) * 3 = ??

Example:

( 9 – ( 3 + 2 ) ) * 3 = ??( 9 – ( 3 + 2 ) ) * 3 = ?? – – 5544 1212

( 9 – ( 3 + 2 ) ) * 3 = 12( 9 – ( 3 + 2 ) ) * 3 = 12

算术表达式算术表达式(( Arithmetic ExpressionArithmetic Expression ))

算术表达式算术表达式(( Arithmetic ExpressionArithmetic Expression ))

Page 19: 模块一 程序设计基础 (三)数据运算部分

19/51

赋值语句赋值语句(( Assignment StatementAssignment Statement ))

三种赋值形式三种赋值形式 ::

Simple——Simple—— 简单赋值简单赋值 Multiple——Multiple—— 多重赋值多重赋值 Shorthand——Shorthand—— 简写的复合赋值简写的复合赋值

Page 20: 模块一 程序设计基础 (三)数据运算部分

20/51

算术混合运算 算术混合运算

Page 21: 模块一 程序设计基础 (三)数据运算部分

21/51

【【例例 1.11.1 】】计算并输出一个三位整计算并输出一个三位整数的个位、十位和百位数字之和 数的个位、十位和百位数字之和 关键是如何分离个位、十位、百位数字?关键是如何分离个位、十位、百位数字?

15153 3 % 10% 10 == 3 3

1153 / 100 =53 / 100 = 1 1

11553 - 1*100 = 3 - 1*100 = 5533

553 / 10 = 3 / 10 = 55

Page 22: 模块一 程序设计基础 (三)数据运算部分

22/51

【【例例 1.11.1 】】计算并输出一个三位整计算并输出一个三位整数的个位、十位和百位数字之和 数的个位、十位和百位数字之和

Page 23: 模块一 程序设计基础 (三)数据运算部分

23/51

变量的赋值变量的赋值

简单赋值简单赋值(( Simple AssignmentSimple Assignment )) ::

变量 变量 == 表达式表达式 ;;多重赋值多重赋值(( Multiple AssignmentMultiple Assignment )) ::

变量变量 1 1 == 变量变量 2 2 == 表达式表达式 ;;

Page 24: 模块一 程序设计基础 (三)数据运算部分

24/51

Syntax:Syntax:

变量变量 xx = = 变量变量 xx 运算符运算符 opop 表达式表达式 ;;

变量变量 xx 运算符运算符 opop = = 表达式表达式 ;;

1.1.21.1.2 复合的赋值运算符复合的赋值运算符(( Combined Assignment Combined Assignment

OperatorsOperators ))

1.1.21.1.2 复合的赋值运算符复合的赋值运算符(( Combined Assignment Combined Assignment

OperatorsOperators ))

这种形式看起来更直观,且执行效率一般也更高一些这种形式看起来更直观,且执行效率一般也更高一些

Page 25: 模块一 程序设计基础 (三)数据运算部分

25/51

Example:

num = num + 5;

Example:

num = num + 5;

num 15

15 + 515 + 5

2020

20

Example:

num += 5;

Example:

num += 5; similar tosimilar to numnum = num + = num + 55

shorthand assignment operatorshorthand assignment operator

1.1.21.1.2 复合的赋值运算符复合的赋值运算符(( Combined Assignment Combined Assignment

OperatorsOperators ))

1.1.21.1.2 复合的赋值运算符复合的赋值运算符(( Combined Assignment Combined Assignment

OperatorsOperators ))

Page 26: 模块一 程序设计基础 (三)数据运算部分

26/51

已知 int a = 3;执行 a += a -= a * a 后,变量 a 的值? a += a -= a * a

a += a -= 9

a += -6

a = -12

33-6-6-12-12

执行 a += a -= a *= a 后,变量 a 的值? a += a -= a *= a a += a -= 9 a += 0 a = 0

33990000

Page 27: 模块一 程序设计基础 (三)数据运算部分

23/4/20 27/51

Operation Examples of expression Description

+= num += 5; num = num + 5;

-= num -= 5; num = num – 5;

*= num *= 5; num = num * 5;

/= num /= 5; num = num / 5;

%= num %= 5; num = num % 5;简写的复合赋值(简写的复合赋值( Shorthand AssignmentShorthand Assignment))简写的复合赋值(简写的复合赋值( Shorthand AssignmentShorthand Assignment))

1.1.21.1.2 复合的赋值运算符复合的赋值运算符(( Combined Assignment OperatorsCombined Assignment Operators

))

1.1.21.1.2 复合的赋值运算符复合的赋值运算符(( Combined Assignment OperatorsCombined Assignment Operators

))

Page 28: 模块一 程序设计基础 (三)数据运算部分

28/51

1.1.31.1.3 增增 11 和减和减 11 运算符运算符((Increment and DecrementIncrement and Decrement))

n++n++ ,, nn---- ,, ++n++n ,, --n--n ++++ 让参与运算的变量加让参与运算的变量加 11 ,, ---- 让参与运算的变量减让参与运算的变量减

11 作为作为后缀后缀 (postfix)(postfix) 运算符时,先取运算符时,先取 nn 的值,然后加的值,然后加 //

减减 11

m = nm = n++++;;

m = n;m = n;

nn++++;;

Page 29: 模块一 程序设计基础 (三)数据运算部分

29/51

1.1.31.1.3 增增 11 和减和减 11 运算符运算符((Increment and DecrementIncrement and Decrement))

n++n++ ,, nn---- ,, ++n++n ,, --n--n ++++ 让参与运算的变量加让参与运算的变量加 11 ,, ---- 让参与运算的变量减让参与运算的变量减 11 作为作为后缀后缀 ((postfixpostfix)) 运算符时,先取运算符时,先取 nn 的值,然后加的值,然后加 // 减减 11 作为作为前缀前缀 (prefix)(prefix) 运算符时,先加运算符时,先加 // 减减 11 ,然后取,然后取 nn 的值的值

m = m = ++++n;n;

nn++++;;

m = n;m = n;

Page 30: 模块一 程序设计基础 (三)数据运算部分

30/51

Example:

j = ++i - 2

Example:

j = ++i - 2

i 5similar to

i = i + 1;i = i + 1;

j = i – 2;j = i – 2;j ??4

6

前缀( 前缀( PrefixPrefix ))增增 11 和减和减 11 运算运算符符

前缀( 前缀( PrefixPrefix ))增增 11 和减和减 11 运算运算符符

Page 31: 模块一 程序设计基础 (三)数据运算部分

31/51

Example:

j = i++ - 2

Example:

j = i++ - 2

i 5similar to

j = i – 2;j = i – 2;

i = i + 1;i = i + 1;

后缀(后缀( PostfixPostfix ))增增 11 和减和减 11 运算运算符符

后缀(后缀( PostfixPostfix ))增增 11 和减和减 11 运算运算符符

j ??3

6

Page 32: 模块一 程序设计基础 (三)数据运算部分

32/51

int a=3;

printf("%d", -a++);

a 3

similar to

printf("%d", -a);printf("%d", -a);

a = a + 1;a = a + 1;

后缀(后缀( PostfixPostfix ))增增 11 和减和减 11 运算运算符符

后缀(后缀( PostfixPostfix ))增增 11 和减和减 11 运算运算符符

4

Page 33: 模块一 程序设计基础 (三)数据运算部分

33/51

良好的程序设计风格提倡:良好的程序设计风格提倡:在一行语句中,一个变量只能出现一在一行语句中,一个变量只能出现一次增次增 11 或者减或者减 11 运算运算 过多的增过多的增 11 和减和减 11 运算混合,不仅可读运算混合,不仅可读性差,而且因为编译器实现的方法不同,性差,而且因为编译器实现的方法不同,导致不同编译器产生不同的运行结果导致不同编译器产生不同的运行结果

1.1.31.1.3 增增 11 和减和减 11 运算符运算符(Increment and Decrement)(Increment and Decrement)

Page 34: 模块一 程序设计基础 (三)数据运算部分

34/51

【【例例 1.21.2 】】计算圆的周长和面计算圆的周长和面积 积

circumference = 33.300854area = 88.247263

Page 35: 模块一 程序设计基础 (三)数据运算部分

35/51

【【例例 1.31.3 】】计算圆的周长和面计算圆的周长和面积 积

Input r: 5.3↙circumference = 33.300854 area = 88.247263

在程序中直接使用的常数称为幻数 (Magic Number)

Page 36: 模块一 程序设计基础 (三)数据运算部分

36/51

使用幻数存在的问题?使用幻数存在的问题?假如直接使用常数,会有什么影响?假如直接使用常数,会有什么影响?

程序的可读性变差程序的可读性变差 容易发生书写错误容易发生书写错误 当常数需要改变时,要修改所有引用它的代码,当常数需要改变时,要修改所有引用它的代码,工作量大,还可能有遗漏工作量大,还可能有遗漏

解决方案:解决方案: 避免使用幻数避免使用幻数 把幻数定义为常量(宏常量、把幻数定义为常量(宏常量、 constconst 常量常量…………))

Page 37: 模块一 程序设计基础 (三)数据运算部分

37/51

1.21.2 宏常量与宏替换宏常量与宏替换 #define#define 标识符标识符 字符串 字符串宏常量(宏常量( Macro constant Macro constant ))

也称符号常量也称符号常量 一般采用全大写字母表示 一般采用全大写字母表示

宏定义不是语句,而是一种编译预处理宏定义不是语句,而是一种编译预处理命令命令

Page 38: 模块一 程序设计基础 (三)数据运算部分

38/51

【【例例 1.41.4 】】计算圆的周长和面计算圆的周长和面积 积

宏替换宏替换

Page 39: 模块一 程序设计基础 (三)数据运算部分

39/51

#include <stdio.h>#define PI 3.14159;#define R 5.3;main(){

printf("area = %f\n", PI * R * R);printf("circumference = %f\n", 2 * PI * R);

}

相当于执行#include <stdio.h>main(){

printf("area = %f\n", 3.14159;*5.3;*5.3;);printf("circumference = %f\n", 2*3.14159;*5.3;);

}

语法错误语法错误

计算圆的周长和面积 计算圆的周长和面积

Page 40: 模块一 程序设计基础 (三)数据运算部分

40/51

constconst 常量与宏常量相比的优点是什么?常量与宏常量相比的优点是什么?– constconst 常量有常量有数据类型数据类型– 某些集成化调试工具可以对某些集成化调试工具可以对 constconst 常量进行调试常量进行调试

1.3 const1.3 const 常量常量【【例例1.51.5 】】

【【例例1.51.5 】】

Page 41: 模块一 程序设计基础 (三)数据运算部分

41/51

表达式与赋值中的自动类型转换表达式与赋值中的自动类型转换 相同类型数据的运算结果,还是该类型相同类型数据的运算结果,还是该类型 不同类型数据的运算结果,是两种类型中取值范围大的那种不同类型数据的运算结果,是两种类型中取值范围大的那种

longlong doubledouble > > doubledouble > > floatfloat > > longlong > > intint > > shortshort > > charchar

double float

long

unsigned int char, short

Page 42: 模块一 程序设计基础 (三)数据运算部分

42/51

表达式与赋值中的自动类型转换表达式与赋值中的自动类型转换 取值范围取值范围小小的类型的类型赋值给赋值给取值范围取值范围大大的类型是的类型是安全安全的的

反之是不安全的反之是不安全的 若若大大类型的值在类型的值在小小类型能容纳的范围之内,则平安无事类型能容纳的范围之内,则平安无事 但是但是浮点数转为整数浮点数转为整数,会丢失小数部分,而非四舍五,会丢失小数部分,而非四舍五入入

反之转换后的结果必然是错误的,具体结果与机器和实反之转换后的结果必然是错误的,具体结果与机器和实现方式有关现方式有关

避免如此使用,好的编译器会发出警告避免如此使用,好的编译器会发出警告

注意!注意!

Page 43: 模块一 程序设计基础 (三)数据运算部分

43/51

表达式与赋值中的自动类型转换表达式与赋值中的自动类型转换 【【例 例 1.61.6 】】下面程序演示了赋值中的类型转下面程序演示了赋值中的类型转

换换

Page 44: 模块一 程序设计基础 (三)数据运算部分

23/4/20 44/51

Example: int x = 10;

float y;y = (float)x;

Example: int x = 10;

float y;y = (float)x;

(float)10(float)10 10.00000010.000000

x 10

y ??10.000000

1.41.4 自动类型转换与强制类型转自动类型转换与强制类型转换运算符换运算符

1.41.4 自动类型转换与强制类型转自动类型转换与强制类型转换运算符换运算符

强转强转(( CastingCasting )可以)可以消除从大到小的警告消除从大到小的警告      

通过下面方式把表达式的值转为任意类型通过下面方式把表达式的值转为任意类型         (( 类型类型 )) 表达式表达式

不改变不改变 xx

Page 45: 模块一 程序设计基础 (三)数据运算部分

23/4/20 45/51

Example: int total, number;

float average;…average = total / number;

Example: int total, number;

float average;…average = total / number;

15 / 215 / 2 77

total 15

number 2

average ??7.000000

两个整数运算的结果还是整数,不是浮点数

1.41.4 自动类型转换与强制类型转自动类型转换与强制类型转换运算符换运算符

1.41.4 自动类型转换与强制类型转自动类型转换与强制类型转换运算符换运算符

Page 46: 模块一 程序设计基础 (三)数据运算部分

23/4/20 46/51

Example: int total, number;

float average;…average = (float)total /

number;

Example: int total, number;

float average;…average = (float)total /

number;

15.000000 / 215.000000 / 2 7.5000007.500000

total 15

number 2

average ??7.500000

1.41.4 自动类型转换与强制类型转自动类型转换与强制类型转换运算符换运算符

1.41.4 自动类型转换与强制类型转自动类型转换与强制类型转换运算符换运算符

Page 47: 模块一 程序设计基础 (三)数据运算部分

47/51

【【例例 1.71.7 】】演示类型强转运算符演示类型强转运算符

m/2 = 2(float)(m/2) = 2.000000(float)m/2 = 2.500000m = 5

Page 48: 模块一 程序设计基础 (三)数据运算部分

48/51

常用的标准数学函数 常用的标准数学函数

Page 49: 模块一 程序设计基础 (三)数据运算部分

49/51

【【例例 1.81.8 】】计算三角形面积 计算三角形面积

area = sqrt(s * (s - a) * (s - b) * (s - c))area = sqrt(s * (s - a) * (s - b) * (s - c))

area = sqrt(s(s-a)(s-b)(s-c))area = sqrt(s(s-a)(s-b)(s-c))

s = 0.5 * (a + b + c)s = 0.5 * (a + b + c)

s = 1.0/2 * (a + b + c)s = 1.0/2 * (a + b + c)

s = (a + b + c) / 2.0s = (a + b + c) / 2.0

s = (float)(a + b + c) / 2s = (float)(a + b + c) / 2

s = 1/2 * (a + b + c)s = 1/2 * (a + b + c)

s = (float)((a + b + c) / 2)s = (float)((a + b + c) / 2)

注意!注意!

Page 50: 模块一 程序设计基础 (三)数据运算部分

50/51

【【例例 1.81.8 】】计算三角形面积 计算三角形面积

Input a,b,c:3,4,5↙area = 6.000000

Page 51: 模块一 程序设计基础 (三)数据运算部分

23/4/20 51/51

Questions and answersQuestions and answers