C 程序设计 吉林大学软件教研室
课程组成 课堂讲授 十二章 64学时 上机实验 八个实验 32学时 课程设计 C的词法分析器 助课老师答疑
课程特点 不同于“解释程序设计语言” 强调“程序设计”,“编程能力”的培养
讲授内容 基础知识 程序设计 数据组织
基础知识 第一章 基本知识 第二章 数据信息 第三章 简单程序 介绍程序设计基本概念、BNF、PAD 图 介绍C 基本符号、单词、数据及其类型 第三章 简单程序 介绍常量、变量、表达式、简单程序、赋值、I/0 。
程序设计 第四章 函数 第五章流程控制 第八章再论函数 第九章程序开发和结构化程序设计 简单介绍模块化程序设计思想,引进子程序和函数概念 讲述结构化程序设计的顺序、分支、循环三种程序逻辑 第八章再论函数 进一步介绍函数,讲述参数、递归程序设计 第九章程序开发和结构化程序设计 程序风格、自顶向下逐步求精的程序设计技术、程序的文档,以及穷举法和试探法;
数据组织 第六章 数组 第七章 指针 第十章 文件及其操作 第十一章 结构体和共用体 第十二章 动态数据结构
第一章 基本知识 程序设计语言 C语言简况 程序设计语言形式化描述 C程序结构 算法及其描述工具PAD 本章小结 作业
程序设计语言(1) 机器语言 1010 1001 0001 0110 0000 0001 0011 1100 0001 1000 0000 0001 … … … … … … … 0000 0000 0000 0000
程序设计语言(2) 汇编语言 MOV AX ,X CMP AX ,Y JL S1 SUB AX ,15 JMP S2 S1: ADD AX ,15 S2: MOV Y ,AX … … … … … … X DW ? Y DW ?
程序设计语言(3) 高级语言 注意 if (X<Y) Y=X+15; else Y=X-15; 高级语言并不单单指C语言,如VC,BASIC 等语言也属于高级语言范畴。
程序设计语言(4)— 程序的执行 用汇编语言或高级语言编出程序 将源程序录入计算机 由翻译器(汇编程序或编译程序) 将源程序翻译成机器语言程序 由连接程序将机器语言程序连接 生成计算机可执行的程序 将可执行程序送入计算机 并启动计算机执行 得到最后结果
C语言的历史背景 70年代初,C 语言在美国贝尔实验室诞生。它的前身可以追朔到ALGOL60 、CPL 、BCPL 、B 。 1989年ISO公布ISO/IEC 9899:1990 ,简称“C89”。 1995年对C89作修改和补充,称为“C95”。 1999对C进行更大的修订后,公布 ISO/IEC 9899:1999,简称“C99”。 我国于1994年12月4日公布了“中华人民共和国国家标准 GB/T 15272-94 程序设计语言 C”。
C语言的优点 语言简洁、紧凑,使用方便、灵活; C本身是模块式,便于集体分工合作开发大型程序 运算符丰富 数据结构丰富 具有结构化控制结构 与计算机硬件联系紧密,可以直接访问计算机内存,具有位操作 生成目标代码质量高。
C语言的缺点 语法不严格 类型机制不严密,比如字符类型与整数类型没有区别、不检查下标超界 程序设计自由度太大,不利于保证程序的正确性 若程序与计算机硬件联系太密切,则可移植性不好 有些语言成分太复杂,比如运算符 语言本身不能保证程序设计的结构化。
程序设计语言形式化描述 组成 Y=X+15; else Y=X-15; 语法——规则 语义——意义 if (X<Y) 巴克斯-脑尔范式(BNF) 语义——意义 if (X<Y) Y=X+15; else Y=X-15;
BNF 自然语言 计算机语言 BNF 字单词句子语言 字符词法单位(token) 程序语言 一种形式化描述语法的工具,一种表示方法
the big elephant ate the peanut <英语句子> <主语> <谓语> <宾语> <冠词><形容词><名词> <动词> <冠词><名词> the big elephant ate the peanut
G: <英语句子> ∷= <主语><谓语><宾语> <主 语> ∷= <冠词><形容词><名词> <冠 词> ∷= the <形容词> ∷= big <谓 语> ∷= <动词> <动 词> ∷= ate <宾 语> ∷= <冠词><名词> <名 词> ∷= peanut <名 词> ∷= elephant
the big elephant ate the peanut <英语句子> <主语> <谓语> <宾语> <冠词><形容词><名词> <动词> <冠词><名词> the big elephant ate the peanut
the big elephant ate the elephant <英语句子> <主语> <谓语> <宾语> <冠词><形容词><名词> <动词> <冠词><名词> the big elephant ate the elephant
the big peanut ate the peanut <英语句子> <主语> <谓语> <宾语> <冠词><形容词><名词> <动词> <冠词><名词> the big peanut ate the peanut
the big peanut ate the elephant <英语句子> <主语> <谓语> <宾语> <冠词><形容词><名词> <动词> <冠词><名词> the big peanut ate the elephant
文法G对应的句子有: The big elephant ate the peanut The big peanut ate the elephant The big peanut ate the peanut The big elephant ate the elephant
L(G)={ The big elephant ate the peanut The big peanut ate the elephant The big peanut ate the peanut The big elephant ate the elephant }
文法的组成 文法开始符 规则 / 产生式 非终极符 终极符 G: <英语句子> ∷= <主语><谓语><宾语> G: <英语句子> ∷= <主语><谓语><宾语> <主 语> ∷= <冠词><形容词><名词> <冠 词> ∷= the <形容词> ∷= big <谓 语> ∷= <动词> <动 词> ∷= ate <宾 语> ∷= <冠词><名词> <名 词> ∷= peanut <名 词> ∷= elephant 文法的组成 文法开始符 规则 / 产生式 非终极符 终极符
例1.1—无符号整数集合 G: N ∷= D N ∷= ND D ∷= 0 D ∷= 5 D ∷= 1 D ∷= 6 符号“│” 表示 “或者”文法可简写成: G: N ∷= D│ND D ∷= 0│1│2│3│4│5│6│7│8│9
例1.2 集合 {0n1n | n>0} 对应的文法G1 G1:S ∷= 01│0S1 将符号∷= 用→代替
例1.3—标识符 标识符 由字母或开头,后跟任意多个字母或数字组成的字符串 <标识符> → <字母> |<标识符><字母> |<标识符><数字>
例1.4—标识符表 标识符表 一个标识符是标识符表 标识符表后边跟一个逗号“ ,” 和一个标识符还是标识符表 <标识符表> → <标识符> │<标识符表> , <标识符>
C程序结构 < 程 序 > → <编译单元表> <编译单元表> → <编译单元> ▌<编译单元><编译单元表> < 程 序 > → <编译单元表> <编译单元表> → <编译单元> ▌<编译单元><编译单元表> <编译单元> → <顶层声明表> <顶层声明表> → <顶层声明> ▌<顶层声明表> <顶层声明> <顶层声明> → <声明> ▌<函数定义> <函数定义> → <函数定义说明符><复合语句>
C程序实例 文件hello.c #include <stdio.h> void hello(void){ printf(“Hello!\n”); } 程序执行过程 文件startup.c extern void hello(void) int main(void) { hello(); return 0 } hello.c hello.obj startup.exe startup.c startup.obj
软件开发一般过程 实现 可行性研究 需求分析 设计 测试 使用 维护 写出程序 调试程序 概要设计 组装测试 详细设计 确认测试 建立数学模型 找出计算方法 进行算法分析
算法 算法是一个计算过程,具体指明应该进行的操作,描述解决问题的方法和途径,它是程序设计的基础和精髓。 一个有效的算法具有如下特点: 有穷性 确定性 有效性
PAD ( Problem Analysis Diagram) 基本操作 控制结构 顺序结构 分支结构 循环控制结构 函数 操作
顺序控制结构 操作1 操作2 操作3 操作1 操作2 操作3
分支控制结构 单分支 如果XX条件为真,执行操作 如果XX条件为真,执行操作1;否则执行操作2 条件 操作 条件 操作1 操作2
多分支 如果表达式e 满足条件1,执行操作1 满足条件2, 执行操作2 ………… 满足条件n,执行操作n 条件2 条件n 操作1 操作n ... 条件1 条件
循环控制结构 先判断条件循环 重复条件 要重复执行的操作 操作 重复条件 F 结束
后判断条件 重复条件 要重复执行的操作 操作 重复条件 T 结束
函数 函数定义 函数体 函数名 (形参表) RETURN def
函数调用 名 ( 实参表 )
PAD的例子 将A、B两瓶分别盛放的米醋和酱油互换 将A中的米醋放到C中 将B中的酱油放到A中 将C中的米醋放到B中 C←A A←B B←C
X<Y Y=X+15 Y=X-15
KA[IMA]=KA[IMA]+1;IMA=IMA+1 开始 PAD实例 1 2 3 4 5 i = 1 T i <= 2 i=i+1 KA[i] = 0;NO[i] = 0 read(IMA);MAE=3-IMA NO[IMA]=NO[IMA+1] F IMA≠MAE F IMA<MAE KA[IMA]=KA[IMA]+1;IMA=IMA+1 IMA=IMA+1 read(IMA) IMA='9' T printf(KA) 停
i=1; 第1部分 KA[i] = 0; 第2部分 前循环 非i<=2 循环体 NO[i] = 0; i=i+1; read(IMA); 第3部分 MAE=3-IMA; NO[IMA]=NO[IMA+1]; KA[IMA]=KA[IMA]+1 IMA<MAE 前循环 IMA=IMA+1 后循环 第4部分 非IMA==’9’ 循环体 IMA≠MAE 单分支 IMA=IMA+1 read(IMA) printf(KA) 第5部分
i <= 2 i=i+1 KA[i] = 0;NO[i] = 0 T
KA[IMA]=KA[IMA]+1;IMA=IMA+1 NO[IMA]=NO[IMA+1] F IMA≠MAE IMA<MAE F KA[IMA]=KA[IMA]+1;IMA=IMA+1 IMA=IMA+1 read(IMA) IMA='9' T
本章小结 程序设计语言 C语言简况 程序设计语言形式化描述 C程序结构 算法及其描述工具PAD图
作业 1.1 1.2 1.4 1.5 1.12 1.26(1)(2)选作(4)