1 / 64

第一章 C 程序设计基础

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

norris
Télécharger la présentation

第一章 C 程序设计基础

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

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

  12. 符号位: 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。

  13. 数符 尾数 阶符 阶码 二进制数的定点和浮点表示 • 浮点表示法——小数点位置是“浮动的”。 在计算机中一个浮点数由两部分组成:阶码和尾数,阶码是指数,尾数是纯小数。浮点表示法可用于表示带小数的数。 (110.011)B=1.10011×2+10=11001.1 × 2-10 =0.110011 × 2+11 即: N=数符×尾数×2阶符×阶码 尾数的位数决定数的精度 阶码的位数决定数的范围 阶码和数符: 0—正数 1—负数 0 110011 0 11

  14. 1.1 二进制基础(续) • 浮点小数的二进制表示 • 二进制与十进制小数互换 • 浮点数的二进制结构简介 • 由于小数点本身不能直接转化为二进制,在小数表示时,小数点的位置是隐含的 • 如果小数点的位置是固定的,即整数部分和小数部分的位数是固定的,称为定点小数 • 浮点数表示方法允许小数点的位置漂移,它需要额外的二进制位以表示小数点的位置,这部分二进制位称为指数部分,而用于表示有效数字的二进制位称为尾数部分

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

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

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

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

  19. 1.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 结束 其中:A、B为操作框,可由一条或多条语句实现。

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

  26. 2) 选择结构(分支结构) 传统流程图 N-S流程图 入口 出口 T F P T F B A 其中:P为分支判断条件; A、B必有一个且只有一个被执行; A、B之一可是空操作,用 表示。

  27. 例:用N-S流程图描述:找出x、y中的较大者 x>y? T F xmax ymax 例:对学生成绩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? ac  b<c? b  c  输出a、b、c F T F T T F

  29. 选择结构的扩充——多分支选择结构 入口 k1 k2 kn …… 出口 K A1 A2 An 其中:K为多分支判断条件; Ai必有一个且只有一个被执行;

  30. 3) 循环结构 当型循环——先判断后循环,有可能一次也不循环。 入口 F T 当P为真 A P A 出口 其中:P为循环判断条件; A为要重复执行的操作,称为循环体;

  31. 直到型循环——先循环后判断,至少循环一次。直到型循环——先循环后判断,至少循环一次。 入口 F T A 直到P为真 A P 出口 其中:P为循环判断条件; A为要重复执行的操作,称为循环体;

  32. 算法举例 例:计算5! (1×2×3×4×5) 当型循环 直到型循环

  33. 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

  34. 例:判别一个数是否是素数 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

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

  36. 1.3 程序设计的方法 (续) • 流程的跟踪执行 • 跟踪执行是程序调试的重要手段,即可以验证程序的正确性,也可以发现程序的错误以及程序的局限性。

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

  38. 创造计算机灵魂的工具 • 与计算机系统交流与沟通的工具 • 控制计算机完成特定任务 • 与人类语言相比,其词汇量小、文法简单、语义明确功能强大、好学易用 • 学习并很好地掌握一门计算机语言,将为未来的学习、科研、工作打下良好基础! • 关于语言 • 用以表达情意的声音…。是人类最重要的交际工具。 • 它跟思想有密切关系,是人类区别于其他动物的本质特征; • 人和人之间可以进行沟通与交流; • 各类语言有其特定文字、语法、结构、语义等;如从结绳记事到汉语、英语等高级语言; • 什么是计算机语言?

  39. 冯.诺依曼结构: 运算器 中央处理器CPU 主机: 控制器 计算机 存储器 I/O设备:键盘、显示器等 机器语言 汇编语言 高级语言 面向过程 面向机器的语言 面向对象 程序设计是数据被加工的过程 CPU指令系统,由0、1序列构成的指令码组成 如:10000000 加 10010000 减 客观世界可以分类,对象是类的实例 对象是数据和方法的封装 对象间通过发送和接受消息发生联系 用助记符号描述的指令系统 如 ADD A, B 程序设计关键是定义类,并由类派生对象

  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 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

  42. 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

  43. 9种控制语句: • if( )~else~ • for( )~ • while( )~ • do~while( ) • continue • break • switch • goto • return

  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定义整型数组a • int f();FUNCTION f():INTEGER定义f为返值整型的函数 • int *p;VAR p:INTEGER定义p为指向整型变量的指针 • i+= 2;i=i+2赋值i+2i • i++,++i;i=i+1 i自增值 • 结论:C比 Pascal简练,源程序短。

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

  46. 短整型short 整 型 整型int 长整型long 数值类型 单精度型float 浮点型 基本类型 双精度型double 字符类型char 数组 C 数 据 类 型 结构体struct 构造类型 共用体union 枚举类型enum 指针类型 空类型void 定义类型typedef 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) ; }

More Related