吉大 高级语言程序设计
基础知识
算法——程序设计精髓
什么是算法?
一个计算过程,具体指明应该进行的 操作描述了解决问题的方法和途径
是程序设计的基础和精髓
有效算法的特点
有穷性、确定性、有效性
输入、输出
组成
- 基本操作
表达式、变量赋值、读(输入)、写(输出) - 基本的控制结构
顺序控制结构、分支控制结构、循环控制结构
函数调用、函数返回
算法的表示
- 自然语言 \(\to\) 程序 \(\to\) 流程图(越来越清晰明了)
-
流程图 \(\to\) NS图(NS图是格式化的,但是没有流程图那么清晰,因为NS图是封闭的)
-
PAD图(层次化,很清晰,是开放的)
PAD图
优点:
相比传统的流程图和NS图等,PAD图具有可见性好、结构唯一、易于编制、易于检查和易于修改等优点,更适合讲述程序设计;
同时也避免了直接使用代码讲解算法的呆板和枯燥。
组成:
- 操作序列:一条垂直竖线(顺序的从上向下操作)
- 基本操作:小方块
- 选择:长相如下,P1对应Ture的操作,P2对应False的操作
基本的控制结构的表示:
-
顺序控制结构:操作序列+基本操作
-
if-else分支控制结构:
-
CASE多分支
-
While循环控制结构
-
函数调用、函数返回
程序和计算机程序
▶ 什么是程序:
程序是一个指令序列,也就是用指令 排成的一个工作顺序,工作步骤。
▶ 计算机语言——程序设计语言
与计算机交流
下达指令
程序设计语言分为:机器、汇编、高级
C语言是一种高级语言
C语言程序结构
- 扩入头文件
- 变量声明
- 有效计算部分(函数)
注意:
-
一个C语言程序由若干个编译单位组成(一个c语言文件就是一个编译单位)
-
一个编译单位由若干顶层声明组成
-
声明包括类型定义、变量声明、外部声明、宏、...;
-
有且仅有一个主函数 main。
程序的执行
C语言是编译执行:
对于编译执行,过程如下:
具体执行流程如下:(理想情况下)
实际情况可能会出现各种错误:
- 编译出错:出现语法错误
- 数据出错:终端输入信息错误(数据类型不匹配等等)
- 程序出错:程序输出错误(输出的结果不是我们想要的)
C语言的优点
-
语言简洁、紧凑,使用方便、灵活;
最主要
-
C本身是模块式,便于集体分工合作开发大型程序
-
运算符丰富(36个)
-
数据结构丰富
-
具有结构化控制结构,也就是说用C可以写出结构化程序(
只有顺序、选择、循环数据结构的程序
) -
与计算机硬件联系紧密,可以直接访问计算机内存,具有位操作
编写系统程序方便
-
生成目标代码质量高
C语言的缺点
- 语法不严格
- 类型机制不严密,比如字符类型与整数类型没有区别、不检查下标超界
- 程序设计自由度太大,不利保证程序的正确性
- 若程序与计算机硬件一切,则可移植性不好
- 有些语言成分太复杂,不容易掌握,比如运算符(36个)
- 语言本身不能保证程序设计的结构化
C语言优点远远超过了它的缺点——成为主流语言
课程学习选择:“有所取、有所不取”的策略
- 常用的语言成分——详细准确的介绍。
- 常用但与程序设计方法联系不太紧要的成分——简单介绍
- 不常用且与程序设计方法关系不太大的成分——不涉及
顺序程序设计
基本符号
程序由若干词法单位(相当于单词
)构成,词法单位由一些基本字符 构成。
- 字符集
- 特定符
- 标识符
- 间隔符
- 注释
字符集
任何计算机系统都使用一个可被本系统识别的字符集。
该字符集包括:
- 们常用的字母、数字
- 诸如句号、逗号、括号之类的特殊 字符。 设计
字符集被用于:
- 人与计算机之间以及计算机与计算之间
- 计算机与外部设备之间进行信息交换。
注: 除字符集上的符号以外,其他符号都不允许在C语言程序中出现。
每个字符有两种形态:
- 可视形态: A
- 存储形态: 01000001(二进制) 、 65(十进制)
最常用的字符集--ASCII
ASCII(The American Standard Code for Information Interchange)
-
可视字符
字母: a~z A~Z
数字:0~9
特殊字符:+ - * / 等 -
不可视字符
文本控制符 、 介质控制符 等等
C语言使用的字符集: ASCII的子集
- 字母:a~z A~Z
- 数字 :0~9
- 特殊字符(29个) ! # % ^ & * + || ( ) { }, [ ] /? : < Λ
特定符
▶在程序中起关键作用,定义程序的意义及操作
- “/”表示除法: 7/2 表示整数7除2,结果为3;
- “%”是整数求余(求模),求7整除2后的余数,结果为1;
- for表示循环语句的开始;
- int 是整数类型说明符;
- “{”、“}”分别表示复合语句的开始和结束。
包括:
-
保留字(37个):拼写是固定,并具有特殊的独立的含义及作用。
如:auto,break,int,for等等 -
分隔符(14个): 一个字符组成的特殊符号
如:#( ) [ ] '| ; : { }" , \
-
运算符(36个):定义运算
由一个或多个字符组成的特殊符号
中间不许夹有任何其它符号(包括空格)
标识符
“名字”:用来表示程序中出现的对象。
如:类型、变量、函数...
C语言标识符的构成规则
- 以字母开头的字母、数字序列
- 下划线“_”被作为字母看待
在使用标识符时需要注意以下几点
- 不能与保留字重名, 例如:for、if 等
- 不能与标准标识符重名, 例如:sin、exp等。
- 字母是区分大小写的 例如:identifier ,Identifier 不同
- 尽量与它所代表对象的含义相符
间隔符
间隔符包括:
-
空格
-
行结束符(‘\n’)
-
水平制表符(‘\t’):其在终端和文件中的输出显示相当于按下键盘TAB键效果
-
垂直制表符(‘\v’):让‘\v’后面的字符从下一行开始输出,且开始的列数为“\v”前一个字符所在列后面一列。
-
换页符(‘\f’)
注意:
- 任何由标识符、保留字、 字面常量组成的两个相邻词法单位之间至少应有一个间隔符。
- 多个间隔符一起连用相当于一个。
- 任何词法单位之内不允许有间隔符。
注释
组成
- 由“//”开始,直到该对斜线所在文本行结束
- 由“/”和“/”,括起来的任意一串字符
功能
- 注释是给程序加注解用的,
- 对程序的实际意义没有任何影响,
- 只增加程序的可读性,
- 编译程序把注释作为空白符处理。
意义
- 适当利用间隔符和注释组织程序的印刷格式,
- 使得一个程序在行文上看清晰,易读。
- 是良好的程序设计习惯。
注:C语言对注释格式没有规定,但是建议规范注释格式
数据
程序操作的对象:
-
常量:在程序的执行期间值不变
字面常量:可以书写在程序中的常量
常量标识符(宏定义) -
变量:在程序的执行期间值变化
注意:类型是数据的一个属性。 任意一个特定的常量或者变量都属于某一个数据类型.
字面常量
常量标识符
变量
变量是程序执行期间值可变的数据对象。
- 变量值:程序运行某一刻,变量具有的值。
- 变量属性:
名字
类型
作用域
存储空间
存储地址
编译程序在把高级语言程序翻译成机器语言时:
-
给每个变量都分配一块适当的存储空间,以便随时保存变量的值。这块存储区就是变量的存储区
-
这块存储区的首地址就是变量的地址
-
这块存储区中现行保存的数据就是变量的值
变量地址
- 变量地址:变量在内存中的位置,即内存地址。
- 求地址运算:将单目运算符“&”,缀在变量前, 求相应变量地址。
变量的赋值
注意
-
在同一作用域内:
任何两个变量不许重名,也不许与其它类标识符重名。 -
从程序的静态行文顺序看: 变量的声明必须出所有使
-
从程序的动态执行顺序看:
为变量赋值的操作必须在所有使用值之前。 -
从程序的静态行文顺序看,在变量声明中给变量赋初值处,相应常量表达式必须是可计算的。
语句
程序的一个侧面是描述对数据的操 作。在程序设计语言中,表示对数据操 作的是语句。
表达式
表达式:由运算符连接起来的运算分量组成。
运算分量:变量、常量、函数调用、带括号的表达式等。
表达式优先级
表达式语句
表达式语句=表达式+;
顺序控制结构
数据类型
运算
字符类型
字符类型就是单个字符。
-
C语言中把字符类型看成整数类型,其整数值是在计算机系统字符集中的编码。
-
由于C语言把字符类型看成整数类型,还定义不带符号的字符类型。
-
C语言中,所有关于在整数类型的运算定义,自然也都适用于字符类型。
混合运算
C语言中只有两种简单类型:浮点类型和整数类型
- 字符类型、布尔类型、枚举类型都是整数类型的不同表现 形式。
这样处理类型,更接近计算机数据表示的实质(本来在计 算机内部所有数据都是二进制代码,也都是整数) 简化了概念。
但是,带来后果:
- 类型概念太弱,有时一些不可思意的运算也是合法的; (例,字母A和年龄28相加,不可理解。但是在C中得93)
- 不利于类型检查;
- 不利于保证程序的正确性。
类型转换
隐式转换
单目运算(一元运算、后缀运算)转换规则
-
所有浮点类型不转换
-
语言街长于int类型的整数类型不转换设计
-
短于int类型的带符号整数类型转换成int类型
-
短于int类型的无符号整数类型
▶值可以用int类型表示,转换成int类型
▶值不能用int类型表示,转换成unsigned int类型(已经超过了 int 类型的表示范围
)
强制转换
赋值转换
输入输出
C语言不提供I/O语句, 通过标准函数库中若干标准函数实现I/O。
标准函数库
单字符输入输出
单个字符输出
输出函数:putchar (int型表达式)
操作:
- 把 int型表达式计算出的值转换成字符类型值
- 输出到标准输出设备
函数值
- 输出的int型整数(操作正确)
- EOF(-1) (否则)
例:
char ch='c';
putchar(ch+3);
将显示字符‘F'
格式输出
格式输入
分支程序设计
双分支结构
单分支结构
运算优先级
多分支结构
switch-case
不含break
enum(枚举)
枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量。它可以让数据更简洁,更易读。
枚举语法定义格式为:enum 枚举名 {枚举元素1,枚举元素2,……};
注意: 每个枚举常量可以用一个标识符来表示,也可以指定一个整数值,如果没有指定,那么默认从 0 开始递增。
循环程序设计
先循环后循环
后判断循环
例如:
先判断循环
for循环
例子
多重循环
求最大公因数
函数
函数调用
函数原型--先调用后定义
数组
数组
构造型数据类型 :一个值,由若干其它类型的值构成。
C语言提供3种构造型数据类型:数组、结构体、共用体
▶针对构造类型,要回答的三个问题:
-
他的基础类型是什么?
-
该构造型类型是以什么类型为基点出发构造新类的。
-
构造的方法是什么
-
不同的构造方法形成了不同的构造型数据类型。
-
一个成分的存取方式和使用方法。
不同的类型使用不同形式。
注意事项——数组长度为空
数组声明的最外层可以不指明本维元素个数,而由初始化算子元素 个数决定。
int a[]={0,1,2}; //声明一维数组a,a有三个元素(虽然声明
//没有指出a的长度),初值分别是0,1,2。
int b[][3]={{0,1,2}, {1,2,3}, { 2, 3, 4}},
/*声明二维数组b,b有三行(虽然在声明中没有 指出b数组有几行),每行三个元素。
b中各个 元素的初值分别是:0,1,2,1,2, 3, 2, 3, 4, 5*/
注意:多维数组声明中,若省缺长度,只能是最左边的一维,也就是 最外层一维
。
//下述写法都是错误的
int a[3][ ]= ...
int_b[ ][ ][4]= ...
int c[2][ ][5]= ...
线性表--分类与检索
线性表:每个数据项的类型相同
- 起始数据项只有唯一后继项,没有前驱项;
- 终止数据项只有唯一前驱项,没有后继项;
- 其他数据项 都 个唯一的前驱项;有且仅有 一个唯一的后继项。
数组是典型的线性表。
特殊的线性表:栈、队列
操作:
- 分类:按一定规律排列数据,最简单的分类就是“排序”
- 检索:在给定的数据集合中查找某特定的数据
分类--排序
主元排序
冒泡排序
插入排序
检索
顺序检索
对半检索
字符串
为标志字符串结尾,使用结束符\0'。
- 结束符“0”的ASCII码值为0,是一个不可显示字符,代表“空”。它在 字符串结束处只起标志作用,无任何操作。
C语言中:
- 变量字符串(字符数组),程序员须在程序中自己添加结束标志。
- 常量字符串,系统会自动添加结束。
▶ 没有结束标志,会使有效字符部分与其余无效字符混杂。
“C programming”共有13个字符,但系统自动用14个字符空间保 存它,最后一个位置保存结束符'\0'。
字符串操作——运算
- C语言没有定义字符串上的运算,也不提供施与字符串上 运算的运算符,C语言字符串运算都是通过函数实现的。
- C语言有一字符串运算函数库,头文件是string.h。
类型定义
栈和队列
线性表——队列
在数据管理上,队列的特点是“先进先出”
- 最后进入队列的数据元素最后取出使用;
- 而最先进入队列的数据元素也最先取出使用;
- 数据进入在队尾进行(排在队尾);而取出在队头进行。
队列经常用于组织各种缓冲区(如打印缓冲区)。
▶由于数据总是不断产生送入缓冲区,并不断的被取出使用,所以经常把缓冲区组织成一个环形,即把缓冲区 的首尾接起来。
指针
指针是高级程序设计语言中一个重要的概念
指针是程序中最灵活的成分。正确灵活运用指针,可以
- 有效地表示和使用复杂的数据结构
- 动态分配内存空间,节省程序运行空间,提高运行效率。
- 指针也是程序中最危的理解和使用指针不正确,将给程序带来无法估量的错误后果。
指针类型、基类型
- 在C语言中,任何一个类型都伴随着一个指向 本类型的指针
- 指向T类型的指针为用
T*
,表示T称为该指针类型的基类型。