第一章 c 程序设计基础

Post on 17-Mar-2016

81 Views

Category:

Documents

6 Downloads

Preview:

Click to see full reader

DESCRIPTION

第一章 C 程序设计基础. 数制(二进制、八进制、十进制、十六进制) 码制(原码、反码、补码) 计算机的运行 程序设计方法 C 语言概述. 1.1 二进制基础. 二进制则是逢二进一,只使用 0 和 1 这两个数码。 为什么采用二进制 成本更低 运算更简单 硬件上更容易实现. 1.1 二进制基础(续). 二进制、十六进制和八进制 10 进制数转换成 2 、 8 、 16 进制数 整数部分: 除基取余法 小数部分: 乘基取整法 2 、 8 、 16 进制数转换成 10 进制数 按权相加法 2 进制数转换成 16 进制数 - PowerPoint PPT Presentation

TRANSCRIPT

1

第一章 C 程序设计基础 数制(二进制、八进制、十进制、十六进制) 码制(原码、反码、补码) 计算机的运行 程序设计方法 C 语言概述

2

1.1 二进制基础 二进制则是逢二进一,只使用 0 和 1 这两个数码。 为什么采用二进制

成本更低 运算更简单 硬件上更容易实现

3

1.1 二进制基础(续) 二进制、十六进制和八进制 10 进制数转换成 2 、 8 、 16 进制数 整数部分:除基取余法 小数部分:乘基取整法 2 、 8 、 16 进制数转换成 10 进制数 按权相加法 2 进制数转换成 16 进制数 四位一组用 16 进制数代替 16 进制数转换成 2 进制数 每位用四位 2 进制数代替

4

1.1 二进制基础(续) 原码、反码与补码

原码表示法 除符号位以外,其他二进制位为数值的绝对值,这种方案称为“原码”表示法

反码表示法 除符号位以外,负数的反码表示是在原码基础上其他二进制位取反,而正数的反码表示与原码相同

5

1.1 二进制基础(续) 原码、反码与补码

补码表示法 负数的补码表示是在反码基础上加 1 ,而正数的反码表示与原码相同

为什么计算机一般采用补码表示法 惟一性表示 正负数混和相加 带符号与无符号的混合相加 加减法的统一

6

• 原码、反码和补码 原码:一个整数在内存中占二字节,规定高位 字节的最左边一位为最高位,表示数的符号 (0 正 1 负 ) ,其余各位代表数本身的绝对值。如: +8 的原码 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 - 8 的原码 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 +0 的原码 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - 0 的原码 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 反码:正数的反码与原码相同,负数的反码规定 符号位不动,其余各位对原码取反如: - 8 的反码 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1

- 0 的反码 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

7

补码:正数的补码同原码,负数的补码为它的 反码加 1 如: - 8 的补码 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0

- 0 的补码 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 的补码 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

用补码表示数时, 0 的代码是唯一的; 负数补码的补码是它的原码; 用补码表示数使加减法的统一 。 1111 1111 1111 1101 ( -3 )的补码 + 0000 0000 0000 0001 ( +1 )的补码 1111 1111 1111 1110 ( -2 )的补码

8 • 模 216 原则 假定用 16 位二进制表示一个整数,则数值范围为: 无符号数: 0000000000000000 ~ 1111111111111111 0 ~ 216 -1 即 0 ~ 65535 有符号数: 1000000000000000 ~ 0111111111111111 -215 ~ 215 -1 即 -32768 ~ 32767 如果计算机进行运算时运算结果超出这 16 位范围, 那么将只取低 16 位作为结果,例如: 65534 + 3 = 65536+1 无符号 有符号 1111 1111 1111 1110 ( 65534 ) ( -2 ) + 0000 0000 0000 0011 ( 3 ) ( 3 ) 1 0000 0000 0000 0001 ( 1 ) ( 1 )

9 无符号 有符号 1000 0000 0000 0010 ( 32770 )( -32766 ) + 1111 1111 1111 1101 ( 65533 )( -3 ) 1 0111 1111 1111 1111 ( 32767 )( 32767 ) 无符号 32770+65533 = 65536+32767 有符号 -32766-3 = -32769 = -65536+32767 结论:设有两个整数 a 和 b 对 216 求余数(模)所得结果相同(即两数的二进制表示中低 16 位完全相同),那么计算机就认为这两数是同一个数,计算机的这个特征称为取模原则或模 216 原则,即任何一个数加上或减去 65536 所得结果相同。

10

1.1 二进制基础(续) 模 216 原则

设有两个整数 a 和 b ,若存在一个整数 n ,使得满足 a = b + 216*n ,那么这两数的二进制表示中低 16 位将完全相同,计算机因此认为 a 与 b 是同一个数。也可以这么说,如果 a 与 b 对 216 求余数(模)所得结果相同,那么计算机就认为这两数是同一个数,计算机的这个特征称为取模原则或模 216 原则,即任何一个数加上或减去 65536 所得结果相同。

11

基本型整数的变化情况可按下图理解。圆周上标有-32768 ~ 32767 之间的数据,对某一个整数加 n 后的值是从该数开始,按顺时针方向数第 n 个数值。图中可以看到: 32767 + 1 对应的数是- 32768 , 32767+ 2 对应的数是- 32767 。 0 1 2-1-2

-3276832767

32766-32767

-32766

12二进制数的定点和浮点表示二进制数的定点和浮点表示 定点表示法——小数点位置是“固定的”定点表示法——小数点位置是“固定的” 定点数可用于表示整数。整数在机器中用补码表示。定点数可用于表示整数。整数在机器中用补码表示。 对于对于 int a=8,b=-8;int a=8,b=-8;

0 0000000 00001000

符号位:0— 正数 1— 负数

1 0000000 00001000

1 1111111 11110111

正数的补码 = 正数的原码 负数的原码和补码按以下规则相互转换: 符号位不变,数值位各位取反,末位加 1 。

0 0000000 00001000

原码补码

符号位 数值位a=810=10002 b=- 810=-10002

真值

1 1111111 11111000

二进制数的定点和浮点表示二进制数的定点和浮点表示 浮点表示法——小数点位置是“浮动的”。浮点表示法——小数点位置是“浮动的”。 在计算机中一个浮点数由两部分组成:阶码和尾数,在计算机中一个浮点数由两部分组成:阶码和尾数,阶码是指数,尾数是纯小数。浮点表示法可用于表示带阶码是指数,尾数是纯小数。浮点表示法可用于表示带小数的数。小数的数。 (110.011)(110.011)BB=1.10011=1.10011××22+10+10=11001.1 =11001.1 ×× 2 2-10 -10 =0.110011 =0.110011 ×× 2 2+11+11

即: N= 数符 × 尾数 ×2 阶符 × 阶码

尾数的位数决定数的精度 阶码的位数决定数的范围

数符 尾数 阶符 阶码

0 110011 0 11

阶码和数符:0— 正数 1— 负数

14

1.1 二进制基础(续) 浮点小数的二进制表示

二进制与十进制小数互换 浮点数的二进制结构简介

由于小数点本身不能直接转化为二进制,在小数表示时,小数点的位置是隐含的 如果小数点的位置是固定的,即整数部分和小数部分的位数是固定的,称为定点小数 浮点数表示方法允许小数点的位置漂移,它需要额外的二进制位以表示小数点的位置,这部分二进制位称为指数部分,而用于表示有效数字的二进制位称为尾数部分

15

1.2 程序员眼中的计算机 数据在计算机中的存储形式

位、字节、字与地址的概念 二进制数据的最基本单位为一个“位” 一般计算机每个字节为 8 位二进制 统一称 32 位二进制为一个“长字”,而称 16位二进制为一个“短字” 为了访问方便,每个字节都分配一个编号,称为“地址”,在多数计算机中,地址是从低到高连续编址的,最小从 0 开始,最大到实际内存结束。

16

1.2 程序员眼中的计算机 (续) 程序设计中的变量概念

从程序设计的角度看,所有要被处理的数据都是一个个量,称为“变量”,变量存储在内存的一块连续区间中,它可能是一个字节,可能是一个短字,也可能是一个长字或者更多字节,变量自然也相应地会有一个“首地址”,称为变量的“地址”,为了程序描述方便,变量可以被赋予名字。 每个变量的值在一定时间内是明确和固定不变的,通过计算机指令可以修改各个变量的值,这一过程称为对变量“赋值”。

17

1.2 程序员眼中的计算机(续) 16 位系统的内存结构示例

地址00000001……20002001……FFFEFFFF

0010101011110000

=8字节 位

64K容量16位

x变量

内存以字节为基本访问单位 16 64K位系统一般有 寻址空间 x 16设变量 需 位二进制 2由编译器安排连续 个地址 x 2000的首地址为 (如左图) x F02A I ntel的值为十六进制 ( )

18

1.2 程序员眼中的计算机(续) 计算机的运行方式与特点

计算机结构 中央处理器CPU( )

指令系统

寄存器组Regi sters

运算器ALU RAM内存( )

指令流与数据

外部设备I /O( )

191.2 程序员眼中的计算机(续) 计算机指令的执行 计算机执行一条指令,一般有以下过程。⑴ 由指令系统从内存中取得下一条要执行的指令。⑵ 指令系统解释要执行的指令。⑶ 从内存、寄存器或外设中取出指令所需的数据。⑷ 运算器对取出的数据进行运算。⑸ 运算结果返送到内存、寄存器或外设中。⑹ 计算下一条要执行指令的地址。

20

1.2 程序员眼中的计算机(续) 计算机指令的特点 指令是计算机执行的最基本单位。⑵ 每条指令中的数据个数和运算类型是有限和确定的。⑶ 指令的含义是明确和无歧义的。⑷ 除非遇到转移类指令否则指令按顺序依次执行。⑸ 计算机本质上是一个机器,它严格按照预定的指令行事。⑹ 计算机本身并没有智能能力。

21

1.3 程序设计的方法 程序设计的两大要素 程序 = 算法 + 数据结构算法:求解问题的方法和步骤;数据结构:数据元素及各元素之间的关系;说明:高级语言的数据结构是以数据类型来体现的。

22

1.3 程序设计的方法 (续) 算法的描述 算法的概念算法——求解问题的方法和步骤;算法设计——要考虑到是否正确、质量优劣、 表达明确清晰;算法类别——数值运算算法、非数值运算算法;

23

1.3 程序设计的方法 (续)算法的表示算法的表示方法 : 1) 自然语言 2) 传统流程图 3) N-S结构化流程图 4) 伪代码 等结构化程序设计的三种基本结构: 1) 顺序结构 2) 选择结构 3) 循环结构

24

结构化程序设计的三种基本结构:1) 顺序结构 传统流程图 N-S 流程图

A

B

AB

开始

结束其中: A、 B为操作框,可由一条或多条语句实现。

25

传统流程图与 N-S流程图的区别:传统流程图——流程线可向前或向后随意转移;N-S流程图——从画法上取消了流程线,杜绝了基本结构之间的转移,提高了算法的可靠性。

26

2) 选择结构(分支结构) 传统流程图 N-S流程图 入口

出口

A B

P P A B

T FT F

其中: P为分支判断条件; A、 B必有一个且只有一个被执行; A、 B之一可是空操作,用 表示。

27

例:用 N-S 流程图描述:找出 x、 y中的较大者 x>y?T Fxmax ymax

例:对学生成绩 s进行判断,及格则输出 PASS字样 s>=60?T F输出 "PASS"

s<60?T F 输出 "PASS"

28

例:使 a、 b、 c 降序排序 输入 a、 b、 c

a<b? a t b a t a

a<c? ac

b<c? b c 输出 a、 b、 c

T

T

T

F

F

F

29

选择结构的扩充——多分支选择结构 入口

k1 k2 kn ……

出口其中: K为多分支判断条件; Ai 必有一个且只有一个被执行;

K

A1 A2 An

30

3) 循环结构当型循环——先判断后循环,有可能一次也不循环。 入口 F T

P

A

当P为真 A

出口其中: P为循环判断条件; A为要重复执行的操作,称为循环体;

31

直到型循环——先循环后判断,至少循环一次。 入口 F T

P

A A直到 P为真

出口

其中: P为循环判断条件; A为要重复执行的操作,称为循环体;

32

算法举例例:计算 5! (1×2×3×4×5)

1→t1→i

当 i≤5 t×i→t i+1→i输出 t

1→t2→i

t×i→t i+1→i直到 i>5输出 t

当型循环 直到型循环

33

例:根据 x求 y值。 3x - 11 ( 0 ≤ x < 10) y= 2x + 5 (10 ≤x < 20 ) x (20 ≤ x < 30)

输入 x x≥0&&x<30

T F x<10 T F

x<20 T F

y=x y=

3x-11

y=

2x+5

输出x无效

输出 y

输入 x

输出 X无效3x-11→y

x≥0&&x<30

x<10

x<20

2x+5→y x→y

输出 y

F

F

F

TT

T

34

例:判别一个数是否是素数

w: 标志变量 复合循环条件

输入nw=0, i=2 k=sqrt(n)i<=k && w==0 n%i==0? w=1 i++ w==0?输出 "Yes" 输出 "No"

Y F

Y F

循环 分支

顺序

35

算法总结:1) 一个复杂的问题应分解为具有层次关系的多个相对容易的子问题;2) 任何复杂的问题都可由三种基本结构的顺序 组合描述出来;3) 三种基本结构之间可以互相包含;

36

1.3 程序设计的方法 (续) 流程的跟踪执行

跟踪执行是程序调试的重要手段,即可以验证程序的正确性,也可以发现程序的错误以及程序的局限性。

37

1.4 C 程序初步 计算机语言分类1. 计算机语言 编制计算机程序的工具; 每种语言都规定了各自的语法、语义。2. 计算机语言的分类 机器语言——二进制机器指令、可直接执行、依 赖具体计算机硬件; 汇编语言——助记符号、需经汇编处理、依赖具 体计算机硬件; 高级语言——需经编译处理、与硬件无关,可移 植性好;

38

关于语言关于语言 用以表达情意的声音…。是人类最重要的交际工具。 它跟思想有密切关系 , 是人类区别于其他动物的本质特征; 人和人之间可以进行沟通与交流; 各类语言有其特定文字、语法、结构、语义等;如从结绳记事到汉语、英语等高级语言;

什么是计算机语言?

•创造计算机灵魂的工具•与计算机系统交流与沟通的工具•控制计算机完成特定任务•与人类语言相比,其词汇量小、文法简单、语义明确功能强大、好学易用•学习并很好地掌握一门计算机语言,将为未来的学习、科研、工作打下良好基础!

39

机器语言汇编语言

高级语言面向过程面向对象

CPU 指令系统,由 0 、 1 序列构成的指令码组成如: 10000000 加 10010000 减用助记符号描述的指令系统如 ADD A, B

面向机器的语言

程序设计是数据被加工的过程

客观世界可以分类,对象是类的实例对象是数据和方法的封装对象间通过发送和接受消息发生联系程序设计关键是定义类,并由类派生对象

冯 . 诺依曼结构:

计算机

运算器控制器存储器

主机:

I/O 设备:键盘、显示器等

中央处理器 CPU

40

1.4 C 程序初步 (续) C语言简史及特点

41

52

54

56

58

60

62

64

66

68

70

72

74

76

78

80

82

84

86

88

90

92

94

96

Ada

ALGOL60 ALGOL68Pascal

Modula-2

BB CC

C++Java

LISPPROLOG

COBOL

FORTRAN77FORTRANPL/1

Simula 67

Smalltalk 80

BASIC ANSI-BASIC QBASIC VB

FORTRAN90

CPLCPLBCPLBCPL

42

C语言的特点1. 简洁、紧凑、使用方便、灵活 如:只有 32个关键字、 9种控制语句、书写格式自由、语句简练等。32 个关键字: ( 由系统定义,不能重作其它定义由系统定义,不能重作其它定义 ))

auto break case char constcontinue default do double elseenum extern float for gotoif int long register returnshort signed sizeof static structswitch typedef unsigned union voidvolatile while

43

9 种控制语句:if( )~else~for( )~while( )~do~while( )continuebreakswitchgotoreturn

44

例 C 语言与 Pascal 语言比较C 语言 Pascal 语言 含义{ } BEGIN….END 复合语句if(e) s; IF(e) THEN s 条件语句int i ; VAR i:INTEGER 定义 i 为整型变量 int a[10]; VAR a:ARRAY[1..10] OF INTEGER 定义整型数组 aint f(); FUNCTION f():INTEGER 定义 f 为返值整型的函数int *p; VAR p:INTEGER 定义 p 为指向整型变量的指针i+= 2; i=i+2 赋值 i+2ii++,++i; i=i+1 i 自增值结论: C 比 Pascal 简练,源程序短。

45

算术运算符: + - * / % ++ --关系运算符: < <= == > >= !=逻辑运算符:! && ||位运算符 : << >> ~ | ^ &赋值运算符: = 及其扩展条件运算符: ?:逗号运算符: ,指针运算符: * &求字节数 : sizeof强制类型转换: (类型)分量运算符: . ->下标运算符: []其它 : ( ) -

2. 运算符丰富 34种运算符,运算能力强、效率高。

46

C数据类型

基本类型

构造类型

指针类型空类型 void

定义类型 typedef

数值类型

字符类型 char

枚举类型 enum

整 型

浮点型 单精度型 float

双精度型 double

短整型 short

长整型 long

整型 int

数组结构体 struct

共用体 union

3. 数据类型丰富 基本类型、构造类型、指针类型;并可很方便地实现链表、树等动态数据结构。

47

4. 是理想的结构化语言 结构化是程序设计的一种规范和风格,结构化的程序结构清晰、便于阅读、扩充;可靠性强。5. 语法检查不太严格,保证灵活性同时要求变成人员更为严谨;6. 进行位操作,可直接操作硬件,可写系统软件7. 生成目标代码质量高、程序执行效率高;8. 块型结构(多模块结构)

48

简单 C程序介绍例 1.2 /*求两数之和 */main( ){ int a , b , sum ; /*定义变量 */a=123 ; b=456 ;sum= a + b ; printf (“Sum is %d\n”, sum) ;} Sum in 579

49

例 1.3 求两数之最大值 main( ) { int a , b , c ; scanf (”%d,%d”, &a, &b) ; c=max(a , b) ; /* 调用自定义函数max */ printf (“max=%d\n”, c) ;} int max(int x , int y) /*自定义函数 */ { int z ; if (x>y) z=x ; else z=y ; return(z) ; }

50

未使用用户自定义函数: main( ){ int a , b , c ; scanf (”%d,%d”, &a, &b) ;if (a>b) c=a ;else c=b ; printf (”max=%d\n”, c) ;}

51例:求 a、 b、 c、 d四数之最大值 main( ) { int a , b , c , d , m; scanf (”%d,%d,%d%d”, &a, &b, &c, &d) ; m = max(a , b) ; m = max(m, c) ; /*每次调用参数不同 */ m = max(m, d) ; printf (”max=%d\n”, m) ; } int max(int x , int y) /*函数具有可重用性 */ { int z ; if (x>y) z=x ; else z=y ; return(z) ; }

52

例:调用系统库函数计算 x2 、 #include "math.h" main( ) { double x, y, z ; printf("Please input x:") ; scanf (”%lf”, &x) ; y=pow(x, 2) ; /* 调用系统函数 */ z=sqrt(x) ; printf (”y=%f, z=%f\n”, y, z) ; } Please input x: 25↙ y=625.000000, z=5.000000

x

53

总结 C 程序概貌:1.一个 C程序中必须有一个而且只能有一个main函数;一个程序总是从main函数开始执行。2. 函数是构成 C程序的基本单位;3. 被调用函数可是用户自定义函数、也可是系统提供的函数;4. 函数的构成 : 函数名 (函数参数 ) 函数首部 { 变量定义 函数体 执行语句 }

54

5. 简单 C程序结构包含头文件 #include程序主入口 main() 程序功能 scanf(“%d”,&a); …… 取二者最大 ; while(a<10) a++;程序执行完,退出 exit(0);功能 1取二者最大

工具箱 进办公区入口 职能 1 审阅审阅 …… 签字签字 盖章盖章业务处理完,离开 审阅流程审阅流程签字流程签字流程

55

格式特点格式特点 习惯用小写字母,大小写敏感 不使用行号,无程序行概念 可使用空行和空格常用锯齿形书写格式

main( ){ int i , j , sum; sum=0; for(i=1; i<10;i++) { for(j=1;j<10;j++) { sum+=i*j ; } } printf(“%d\n”,sum);}

优秀程序员的素质之一 : 使用 TAB 缩进 { } 对齐 有足够的注释 有合适的空行

56

int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\ o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);

— 1984 年模糊 C 代码大赛“差劲奖”。应代码作者要求匿名。

57

/* example1.2 calculate the sum of a and b*/#include <stdio.h>/* This is the main program */main(){ int a,b,sum; a=10; b=24; sum=add(a,b); printf(”sum= %d\n",sum);}

/* This function calculates the sum of x and y */int add(int x,int y){ int z; z=x+y; return(z);}

运行结果:sum=34

函数

语句

预处理命令注释

58

结构特点 函数与主函数

程序由一个或多个函数组成 必须有且只能有一个主函数 main() 程序执行从 main开始,在main 中结束,其它函数通过嵌套调用得以执行。

程序语句 C 程序由语句组成 用“ ;” 作为语句终止符

注释 /* */ 为注释 , 不能嵌套 不产生编译代码

例: /*This is the main /* of example1.1*/ */

非法

编译预处理命令

59

1.5 C 程序解题分析 建议学习完第四章后再学习此节

60

1.6 编程学习方法总结 实践中理解

61

本 章 结 束

62

除基取余法:十进制整数转二进制除 2 取余法19÷2=9 …… 1 (低位) 9÷2=4 …… 1 4÷2=2 …… 0 2÷2=1 …… 0 1÷2=0 …… 1 (高位) (19)10=(10011)2

十进制整数转十六进制除 16 取余法9999÷16=624 …… 15 624÷16= 39 …… 0 39÷16= 2 …… 7 2÷16= 0 …… 2

(9999)10=(270F)16

63

乘基取整法:十进制小数转二进制乘 2 取整法0.6875 2 = 1.375 0.375 2 = 0.75 0.75 2 = 1.5 0.5 2 = 1.0(0.6875)10=(0.1011)2

十进制小数转八进制乘 8 取整法0.6875 8 = 5.5 0.5 8 = 4.0

(0.6875)10=(0.54)8

64

按权相加法:二进制数转十进制数 (11010.01)2

=124 +123 +022 +121+020 +02-1 +12-2

= 16 + 8 + 0 + 2 + 0 + 0 + 0.25 = 26.25十六进制数转十进制数(2C3D)16

= 2163 +12162 +3161+13160

= 24096+12256+316+13 = 8192+3072+48+13 = 11325

top related