640 likes | 775 Views
第一章 C 程序设计基础. 数制(二进制、八进制、十进制、十六进制) 码制(原码、反码、补码) 计算机的运行 程序设计方法 C 语言概述. 1.1 二进制基础. 二进制则是逢二进一,只使用 0 和 1 这两个数码。 为什么采用二进制 成本更低 运算更简单 硬件上更容易实现. 1.1 二进制基础(续). 二进制、十六进制和八进制 10 进制数转换成 2 、 8 、 16 进制数 整数部分: 除基取余法 小数部分: 乘基取整法 2 、 8 、 16 进制数转换成 10 进制数 按权相加法 2 进制数转换成 16 进制数
E N D
第一章 C程序设计基础 • 数制(二进制、八进制、十进制、十六进制) • 码制(原码、反码、补码) • 计算机的运行 • 程序设计方法 • C语言概述
1.1 二进制基础 • 二进制则是逢二进一,只使用0和1这两个数码。 • 为什么采用二进制 • 成本更低 • 运算更简单 • 硬件上更容易实现
1.1 二进制基础(续) • 二进制、十六进制和八进制 • 10进制数转换成2、8、16进制数 整数部分:除基取余法 小数部分:乘基取整法 • 2、8、16进制数转换成10进制数 按权相加法 • 2进制数转换成16进制数 四位一组用16进制数代替 • 16进制数转换成2进制数 每位用四位2进制数代替
1.1 二进制基础(续) • 原码、反码与补码 • 原码表示法 • 除符号位以外,其他二进制位为数值的绝对值,这种方案称为“原码”表示法 • 反码表示法 • 除符号位以外,负数的反码表示是在原码基础上其他二进制位取反,而正数的反码表示与原码相同
1.1 二进制基础(续) • 原码、反码与补码 • 补码表示法 • 负数的补码表示是在反码基础上加1,而正数的反码表示与原码相同 • 为什么计算机一般采用补码表示法 • 惟一性表示 • 正负数混和相加 • 带符号与无符号的混合相加 • 加减法的统一
• 原码、反码和补码 原码:一个整数在内存中占二字节,规定高位 字节的最左边一位为最高位,表示数的符号(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
补码:正数的补码同原码,负数的补码为它的补码:正数的补码同原码,负数的补码为它的 反码加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)的补码
• 模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)
无符号 有符号 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所得结果相同。
1.1 二进制基础(续) • 模216原则 • 设有两个整数a和b,若存在一个整数n,使得满足 a = b + 216*n,那么这两数的二进制表示中低16位将完全相同,计算机因此认为a与b是同一个数。也可以这么说,如果a与b对216求余数(模)所得结果相同,那么计算机就认为这两数是同一个数,计算机的这个特征称为取模原则或模216原则,即任何一个数加上或减去65536所得结果相同。
基本型整数的变化情况可按下图理解。圆周上标有-32768~32767之间的数据,对某一个整数加n后的值是从该数开始,按顺时针方向数第n个数值。图中可以看到:32767+1对应的数是-32768,32767+2对应的数是-32767。基本型整数的变化情况可按下图理解。圆周上标有-32768~32767之间的数据,对某一个整数加n后的值是从该数开始,按顺时针方向数第n个数值。图中可以看到:32767+1对应的数是-32768,32767+2对应的数是-32767。
符号位: 0—正数 1—负数 二进制数的定点和浮点表示 数值位 符号位 • 定点表示法——小数点位置是“固定的” 定点数可用于表示整数。整数在机器中用补码表示。 对于int a=8,b=-8; 真值 a=810=10002 b=- 810=-10002 原码 0 0000000 00001000 1 0000000 00001000 0 0000000 00001000 1 1111111 11110111 1 1111111 11111000 补码 正数的补码=正数的原码 负数的原码和补码按以下规则相互转换: 符号位不变,数值位各位取反,末位加1。
数符 尾数 阶符 阶码 二进制数的定点和浮点表示 • 浮点表示法——小数点位置是“浮动的”。 在计算机中一个浮点数由两部分组成:阶码和尾数,阶码是指数,尾数是纯小数。浮点表示法可用于表示带小数的数。 (110.011)B=1.10011×2+10=11001.1 × 2-10 =0.110011 × 2+11 即: N=数符×尾数×2阶符×阶码 尾数的位数决定数的精度 阶码的位数决定数的范围 阶码和数符: 0—正数 1—负数 0 110011 0 11
1.1 二进制基础(续) • 浮点小数的二进制表示 • 二进制与十进制小数互换 • 浮点数的二进制结构简介 • 由于小数点本身不能直接转化为二进制,在小数表示时,小数点的位置是隐含的 • 如果小数点的位置是固定的,即整数部分和小数部分的位数是固定的,称为定点小数 • 浮点数表示方法允许小数点的位置漂移,它需要额外的二进制位以表示小数点的位置,这部分二进制位称为指数部分,而用于表示有效数字的二进制位称为尾数部分
1.2 程序员眼中的计算机 • 数据在计算机中的存储形式 • 位、字节、字与地址的概念 • 二进制数据的最基本单位为一个“位” • 一般计算机每个字节为8位二进制 • 统一称32位二进制为一个“长字”,而称16位二进制为一个“短字” • 为了访问方便,每个字节都分配一个编号,称为“地址”,在多数计算机中,地址是从低到高连续编址的,最小从0开始,最大到实际内存结束。
1.2 程序员眼中的计算机 (续) • 程序设计中的变量概念 • 从程序设计的角度看,所有要被处理的数据都是一个个量,称为“变量”,变量存储在内存的一块连续区间中,它可能是一个字节,可能是一个短字,也可能是一个长字或者更多字节,变量自然也相应地会有一个“首地址”,称为变量的“地址”,为了程序描述方便,变量可以被赋予名字。 • 每个变量的值在一定时间内是明确和固定不变的,通过计算机指令可以修改各个变量的值,这一过程称为对变量“赋值”。
1.2 程序员眼中的计算机(续) • 16位系统的内存结构示例
1.2 程序员眼中的计算机(续) • 计算机的运行方式与特点 • 计算机结构
1.2 程序员眼中的计算机(续) • 计算机指令的执行 计算机执行一条指令,一般有以下过程。 ⑴ 由指令系统从内存中取得下一条要执行的指令。 ⑵ 指令系统解释要执行的指令。 ⑶ 从内存、寄存器或外设中取出指令所需的数据。 ⑷ 运算器对取出的数据进行运算。 ⑸ 运算结果返送到内存、寄存器或外设中。 ⑹ 计算下一条要执行指令的地址。
1.2 程序员眼中的计算机(续) • 计算机指令的特点 指令是计算机执行的最基本单位。 ⑵ 每条指令中的数据个数和运算类型是有限和确定的。 ⑶ 指令的含义是明确和无歧义的。 ⑷ 除非遇到转移类指令否则指令按顺序依次执行。 ⑸ 计算机本质上是一个机器,它严格按照预定的指令行事。 ⑹ 计算机本身并没有智能能力。
1.3 程序设计的方法 • 程序设计的两大要素 程序 = 算法 + 数据结构 算法:求解问题的方法和步骤; 数据结构:数据元素及各元素之间的关系; 说明: 高级语言的数据结构是以数据类型来体现的。
1.3 程序设计的方法 (续) • 算法的描述 算法的概念 算法——求解问题的方法和步骤; 算法设计——要考虑到是否正确、质量优劣、 表达明确清晰; 算法类别——数值运算算法、非数值运算算法;
1.3 程序设计的方法 (续) 算法的表示 算法的表示方法: 1) 自然语言 2) 传统流程图 3) N-S结构化流程图 4) 伪代码 等 结构化程序设计的三种基本结构: 1) 顺序结构 2) 选择结构 3) 循环结构
结构化程序设计的三种基本结构: 1) 顺序结构 传统流程图 N-S流程图 开始 A B 结束 其中:A、B为操作框,可由一条或多条语句实现。
传统流程图与N-S流程图的区别: 传统流程图——流程线可向前或向后随意转移; N-S流程图——从画法上取消了流程线,杜绝了 基本结构之间的转移,提高了算法的可靠性。
2) 选择结构(分支结构) 传统流程图 N-S流程图 入口 出口 T F P T F B A 其中:P为分支判断条件; A、B必有一个且只有一个被执行; A、B之一可是空操作,用 表示。
例:用N-S流程图描述:找出x、y中的较大者 x>y? T F xmax ymax 例:对学生成绩s进行判断,及格则输出PASS字样 s>=60? T F 输出"PASS" s<60? T F 输出"PASS"
例:使a、b、c降序排序 输入a、b、c a<b? a t b a t a a<c? ac b<c? b c 输出a、b、c F T F T T F
选择结构的扩充——多分支选择结构 入口 k1 k2 kn …… 出口 K A1 A2 An 其中:K为多分支判断条件; Ai必有一个且只有一个被执行;
3) 循环结构 当型循环——先判断后循环,有可能一次也不循环。 入口 F T 当P为真 A P A 出口 其中:P为循环判断条件; A为要重复执行的操作,称为循环体;
直到型循环——先循环后判断,至少循环一次。直到型循环——先循环后判断,至少循环一次。 入口 F T A 直到P为真 A P 出口 其中:P为循环判断条件; A为要重复执行的操作,称为循环体;
算法举例 例:计算5! (1×2×3×4×5) 当型循环 直到型循环
3x - 11 ( 0 ≤ x < 10) y= 2x + 5 (10 ≤x < 20 ) x (20 ≤ x < 30) 例:根据 x求y值。 输入x F x≥0&&x<30 x≥0&&x<30 T F T x<10 输出X无效 T x<10 T F F T 输 出 x 无 效 x<20 x<20 T F 3x-11→y F y= 2x+5 y=x y= 3x-11 x→y 2x+5→y 输出 y 输出y
例:判别一个数是否是素数 w: 标志变量 复合循环条件 输入n w=0, i=2 k=sqrt(n) i<=k && w==0 n%i==0? w=1 i++ w==0? 输出"Yes" 输出"No" 顺序 循环 分支 Y F Y F
算法总结: • 一个复杂的问题应分解为具有层次关系的多个相对容易的子问题; • 2) 任何复杂的问题都可由三种基本结构的顺序 • 组合描述出来; • 3) 三种基本结构之间可以互相包含;
1.3 程序设计的方法 (续) • 流程的跟踪执行 • 跟踪执行是程序调试的重要手段,即可以验证程序的正确性,也可以发现程序的错误以及程序的局限性。
1.4 C程序初步 • 计算机语言分类 • 计算机语言 编制计算机程序的工具; 每种语言都规定了各自的语法、语义。 2. 计算机语言的分类 机器语言——二进制机器指令、可直接执行、依 赖具体计算机硬件; 汇编语言——助记符号、需经汇编处理、依赖具 体计算机硬件; 高级语言——需经编译处理、与硬件无关,可移 植性好;
创造计算机灵魂的工具 • 与计算机系统交流与沟通的工具 • 控制计算机完成特定任务 • 与人类语言相比,其词汇量小、文法简单、语义明确功能强大、好学易用 • 学习并很好地掌握一门计算机语言,将为未来的学习、科研、工作打下良好基础! • 关于语言 • 用以表达情意的声音…。是人类最重要的交际工具。 • 它跟思想有密切关系,是人类区别于其他动物的本质特征; • 人和人之间可以进行沟通与交流; • 各类语言有其特定文字、语法、结构、语义等;如从结绳记事到汉语、英语等高级语言; • 什么是计算机语言?
冯.诺依曼结构: 运算器 中央处理器CPU 主机: 控制器 计算机 存储器 I/O设备:键盘、显示器等 机器语言 汇编语言 高级语言 面向过程 面向机器的语言 面向对象 程序设计是数据被加工的过程 CPU指令系统,由0、1序列构成的指令码组成 如:10000000 加 10010000 减 客观世界可以分类,对象是类的实例 对象是数据和方法的封装 对象间通过发送和接受消息发生联系 用助记符号描述的指令系统 如 ADD A, B 程序设计关键是定义类,并由类派生对象
1.4 C程序初步 (续) • C语言简史及特点
52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 Ada Modula-2 Pascal ALGOL60 ALGOL68 C CPL BCPL B C++ Smalltalk 80 Java Simula 67 QBASIC VB ANSI-BASIC BASIC FORTRAN90 FORTRAN FORTRAN77 PL/1 COBOL LISP PROLOG
C语言的特点 • 简洁、紧凑、使用方便、灵活 • 如:只有32个关键字、9种控制语句、书写格 • 式自由、语句简练等。 • 32个关键字:(由系统定义,不能重作其它定义) • auto break case char const • continue default do double else • enum extern float for goto • if int long register return • short signed sizeof static struct • switch typedef unsigned union void • volatile while
9种控制语句: • if( )~else~ • for( )~ • while( )~ • do~while( ) • continue • break • switch • goto • return
例 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定义整型数组a • int f();FUNCTION f():INTEGER定义f为返值整型的函数 • int *p;VAR p:INTEGER定义p为指向整型变量的指针 • i+= 2;i=i+2赋值i+2i • i++,++i;i=i+1 i自增值 • 结论:C比 Pascal简练,源程序短。
2. 运算符丰富 34种运算符,运算能力强、效率高。 算术运算符:+ - * / % ++ -- 关系运算符:< <= == > >= != 逻辑运算符:! && || 位运算符 :<< >> ~ | ^ & 赋值运算符:= 及其扩展 条件运算符:?: 逗号运算符:, 指针运算符:* & 求字节数 :sizeof 强制类型转换:(类型) 分量运算符:. -> 下标运算符:[] 其它 :( ) -
短整型short 整 型 整型int 长整型long 数值类型 单精度型float 浮点型 基本类型 双精度型double 字符类型char 数组 C 数 据 类 型 结构体struct 构造类型 共用体union 枚举类型enum 指针类型 空类型void 定义类型typedef 3. 数据类型丰富 基本类型、构造类型、指针类型;并可很方便地实现链表、树等动态数据结构。
4. 是理想的结构化语言 结构化是程序设计的一种规范和风格,结构化 的程序结构清晰、便于阅读、扩充;可靠性强。 5. 语法检查不太严格,保证灵活性同时要求变成人员更为严谨; 6. 进行位操作,可直接操作硬件,可写系统软件 7. 生成目标代码质量高、程序执行效率高; 8. 块型结构(多模块结构)
简单C程序介绍 例1.2 /*求两数之和*/ main( ) { int a , b , sum ; /*定义变量*/ a=123 ; b=456 ; sum= a + b ; printf (“Sum is %d\n”, sum) ; } Sum in 579
例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) ; }
未使用用户自定义函数: main( ) { int a , b , c ; scanf (”%d,%d”, &a, &b) ; if (a>b) c=a ; else c=b ; printf (”max=%d\n”, c) ; }