导图社区 C语言
C语言——程序设计和c语言,算法,顺序程序设计,选择结构程序设计,循环节构程序设计,利用数组处理批量数据。函数,指针,其他数据类型,文件处理。
编辑于2022-10-06 19:20:18 江苏省C语言
一个C程序可以由若干个源程序文件(编译时以文件模块为单位)组成 一个源文件可以由若干个函数和预处理指令以及全局变量声明部分 一个函数由数据声明部分和执行语句组成
1. 程序设计和C语言
程序:一组计算机能识别和执行的指令
计算机语言
机器语言
定义
机器指令:计算机能够直接识别和接受的二进制代码
机器语言:机器指令的集合
特点
难学,难记,难写,难检查,难修改,难以推广使用
符号语言
符号汇编语言 汇编语言
定义
符号语言:用一些英文字母和数字表示一个指令
汇编程序:把符号语言的指令转换成机器指令
代真或汇编:转换的过程
特点:比机器语言简单好记一些,但仍然难以普及
不同计算机的机器语言和汇编语言是互不通用的
高级语言
20世纪50年代创造出了第一个计算机高级语言—FORTRAN语言
可迁移
定义
编译程序
把源程序转换成目标程序的软件
源程序
用高级语言写的程序
目标程序
机器指令的程序
发展阶段
非结构化的语言
编程风格较随意,没有严格规范,只要求符合基本的语法规则
程序中的流程可以随意跳转
难以阅读和维护
结构化语言
规定程序必须由良好特性的基本结构构成
流程不可随意跳转,自上而下的执行
结构清晰,易于编写、阅读和维护
面向对象的语言
C++,C#,Visual Basic和Java
C语言
发展
祖先:BCPL语言
B语言
过于简单,功能有限
特点
过于简单 没有数据类型
精炼,接近硬件
C语言
具有多种数据类型
特点
语言简洁、紧凑,使用方便灵活
运算符丰富
数据类型丰富
具有结构化的控制语句
语法限制不太严格,程序设计自由度大
C语言允许直接访问物理地址,能进行位操作
用C需要编写的程序可移植性好
生成目标代码质量高,程序执行效率高
程序
结构
一个程序有一个或多个源程序文件组成
预处理指令
全局声明
函数定义
函数是C程序的主要组成部分
一个C语言程序是有一个或多个函数组成的,其中必须有且只有一个main函数
很容易实现程序的模块化
一个函数包括两个部分
函数首部
函数名
函数类型
函数属性
函数参数名
参数类型
一个函数名后面必须跟一对圆括号,里面写
函数体
声明部分
执行部分
函数总是从main函数开始执行
程序中对计算机的操作是由函数中的C语句完成的
在每个数据声明和语句的最后必须有一个分号
C需要本身不提供输入输出语句
程序应当包含注释
运行步骤和方法
上机输入和编辑源程序
文件以.c作为后缀,生成源程序文件
对源程序进行编译
阶段
预编译
正式编译
作用
对源程序进行检查,判定有无语法方面的错误
把源程序转换成二进制形式的目标程序.obj,此时的源程序没有消失
直接连接处理
把所有编译后得到的目标模块连接装配起来,再与函数库相连接成一个整体,生成一个可供计算机执行的目标程序,称为可执行程序
连接编辑程序:完成上述工作
运行可执行程序,得到运行结果
程序设计的任务
问题分析
设计算法
编写程序
对源程序进行编辑、编译和连接
运行程序,分析结果
编写程序文档
2. 算法
概念
算法:对操作的描述(为解决一个问题而采取的方法和步骤)
算法+数据结构=程序
数据结构:对数据的描述
分类
数值运算算法
非数值运算算法
特性
有穷性
一个算法应该包含有限的操作步骤,而不能是无限的
确定性
每一个步骤都应该是确定的,而不应该是含糊的、模棱两可的
有效性
算法中的每一个步骤都应该能有效的执行,并得到确定的结果
有零个或多个输入
有一个或多个输出
表示
用自然语言表示
用流程图表示
部分
表示相应操作的框
带箭头的流程线
框内外必要的文字说明
结构
1.只有一个入口 2.只有一个出口 3.结构内的没一部分都有机会被执行到 4.结构内不存在“死循环”
顺序结构
选择结构
循环结构
while型
until型
用伪代码表示
用计算机语言表示
设计算法
实现算法
结构化程序设计算法
方法
自顶而下,逐步细化
自顶而下
逐步细化
模块化设计
结构化编码
3. 顺序程序设计
数据
定义
常量
整型常量
实型常量
十进制小数形式
指数形式
e或E之前必须有数字,后面必须为整数
字符常量
普通字符
用’’括起来的一个字符
’ab’、’12’不是字符
字符常量只能是一个字符
转义字符
字符串常量
用“”把若干个字符括起来
符号常量
用#define指令,指定用一个符号名称代表一个常量
注意行末没有分号
优点: 含义清楚(定义时应该见名知意) 在需要改变程序中多处用到的同一个常量时,能做到一改全改
没有名字的不变量
变量
区分变量名和变量值
必须先定义,后使用
一个有名字的,具有特定属性的一个存储单元
常变量
常变量具有变量的基本属性:有类型,占存储单元,只是不允许改变其值
有名字的不变量
标识符
大小写敏感
用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列
一个对象的名字
只能由字母、数字和下划线3种字符组成 且第一个字符必须为字母或下划线
数据类型
基本类型
整数类型
基本整型int
存储单元长度:2或4个字节
在存放整数的存储单元中,最左面的一位是用来表示符号的 0为正,1为负
存储方式:用整数的补码形式存放
一个整数的补码是此数的二进制形式 一个负数的补码:先求此数的绝对值的二进制,再对每一位取反,再加一
短整型short int或short
存储单元长度:2个字节
存储方式:用整数的补码形式存放
长整型long int或long
存储单元长度:4个字节
存储方式:用整数的补码形式存放
双长整型long long int或long long
存储单元长度:8个字节
存储方式:用整数的补码形式存放
字符型char
存储单元长度:1个字节
存储方式:按其代码(整数)形式
字符与字符代码
127个
字符变量
整型变量又可分为有符号类型signed和无符号类型unsigned 便于充分利用变量的值的范围 无符号类型变量最左位不再表示符号
布尔型bool
浮点类型
实数的指数形式称为浮点数 规范化的指数形式:小数部分中小数点前的数字为0,后第一位数字不为0
单精度浮点型float
存储单元长度:4个字节
存储方式:以规范化的二进制数指数形式存放
双精度浮点型double
存储单元长度:8个字节
存储方式:以规范化的二进制数指数形式存放
复数浮点型float_complex,double_complex,long long_complex
存储单元长度:8或16个字节
枚举类型enum
程序中用户定义的整数类型
算术类型—值为数值
派生类型
指针类型*
数组类型[]
结构体类型struct
组合类型
共用体类型union
函数类型
空类型void
运算符与表达式
运算符
算术运算符
基本的算术运算符
正负号运算符
加减运算符
乘除运算符
两个实数相除的结果为双精度类型,两个整数相除的结果为整数
向零整除
-5/3=-1
求余运算符
参加的操作数为整数,结果也是整数
求值结果与被除数的符号相同
自增,自减运算符
只能用于变量,不能用于常量和表达式
作用是使变量的值加1或减1
++i,--i
在使用i前,完成操作
i++,i--
在使用后,完成操作
关系运算符
大于(等于)小于(等于)号
判等
==
!=
逻辑运算符
非且或
位运算符
<<,>>,~,|,^,&
赋值运算符
条件运算符
?:
逗号运算符
指针运算符
*和&
求字节数运算符
sizeof
强制类型转换运算符
一般形式:(类型名)(表达式)
强制转换时得到一个所需类型的中间数据,而原来的变量类型为发生变化
成员运算符
.->
下标运算符
其他
优先级
条件运算符优先于赋值运算符,低于关系运算符和算术运算符
结合性
先左后右
算术运算符
先右后左
赋值运算符
混合运算
+,-,*,/运算中存在float或double类型时,结果为double
int与float或double类型进行运算,结果为double
字符形数据与整型数据进行运算,即把ASCII代码与整型数据进行运算
同一个字母,小写=大写+32
C语句
分号是语句中不可缺少的组成部分
控制语句
作用:用于完成一定的控制功能
形式
if()…else…
循环语句
for()…
do…while()
continue
break
switch
return
goto
函数调用语句
由一个函数调用加一个分号构成
表达式语句
由一个表达式加一个分号构成
空语句
作用
可以用来作为流程的转向点—流程从程序其他地方转到此语句处
作为循环语句中的循环体—表示循环体什么也不做
复合语句
数据的输入和输出
概念
注意点
所谓的输入输出是以计算机主机为主体而言的
C语言本身不提供输入输出语句,输入和输出操作是由C标准函数库中的函数来实现的
在使用系统函数时,要在程序文件的开头用预处理指令#include把有关头文件放在本程序中
printf函数
一般格式
printf(格式控制,输出列表)
格式控制和输出列表都是函数的参数
格式控制
是用双撇号括起来的一个字符串,称“转换控制字符串”,简称“格式字符串”
包括
格式声明
%格式字符
作用:将输出的数据转换成指定的格式然后输出
普通字符
在输出时原样输出的字符
输出表列
定义:程序语言输出的一些数据,可以是常量,变量或表达式
一般形式:printf(参数1,参数2,参数3,…参数n)
格式字符
d格式符
作用:用于输出一个有符号的十进制整数
在输出时,按十进制整型数据的实际长度输出,正数的符号不输出
可以在格式声明中指定域宽 %5d
靠右对齐,空格补齐
其他格式
%ld
%lld
c格式符
作用:用于输出一个字符
可以在格式声明中指定域宽 %5c
靠右对齐,空格补齐
整数输出
在0-127范围内,利用ASCII码转换
超出范围后,进行截断
s格式符
作用:用于输出一个字符串
f格式符
作用:用于输出实数,以小数形式输出
类型
基本型:%f
实数中的整数部分全部输出,小数部分输出6位
指定型:%m.nf
m为数据宽度
n为小数位数
多余部分四舍五入
对齐型:%-m.nf
数据向左靠,右端补空格
e格式符
作用:以指数形式输出实数
类型
基本型%e
小数点前必须有且只有1位非零数字
数字部分的小数位数为6
指数部分占5列
其中e占一列
指数符号占一列
指数占3列
指定型%m.ne
i格式符
作用:按十进制整型数据数据的实际长度输出
同d字符
o格式符
作用:以八进制整数形式输出
输出的数值不带符号
将符号位一起作为八进制数的一部分输出
可以得到存储单元中实际的存储情况
x格式符
作用:以十六进制数形式输出整数
u格式符
作用:用来输出无符号型数据,以十进制整数形式输出
g格式符
作用:用来输出浮点数
不输出无意义的0
一般形式:附加字符 格式字符
格式字符
格式附加字符
l
m
n
-
putchar函数
只能输出一个字符,而不能输出整数!
一般形式:putchar(c)
scanf函数
一般形式
scanf(格式控制,地址表列)
地址表列:由若干个地址组成的表列
变量的地址
字符串的首地址
格式声明
以%开始,以一个格式字符结束,中间插入附加的字符
格式字符的间隔符号与输入字符的符号相对应
注意点
格式控制后应当是变量地址
格式字符的间隔符号与输入字符的符号相对应
在用“%c”格式声明输入字符时,空格字符和转义字符中的字符都作为有效数字输入
输入数值时,两个数值之间需要插入空格
输入字符时,不需要插入
输入数值数据时,若输入空格,回车,Tab或非法字符(不属于数值的字符),认为该数据结束
getchar函数
只能接受一个字符
包括控制字符
一般形式:getchar()
4. 选择结构程序设计
if语句
一般形式
if(表达式)语句1 [语句2]
表达式可以是关系表达式,逻辑表达式或者数值表达式
if(表达式)语句1
if(表达式)语句1 else语句2
if(表达式)语句1 else if(表达式2) 语句2 … else 语句n
格式
一般写为锯齿状
注意
if语句无论写在几行上,都是一个语句
内嵌语句也可以是一个if语句
关系运算符和关系表达式
关系运算符
大于(等于)小于 (等于)号
优先级高
判等
优先级低
==
!=
关系表达式
定义:用关系运算符将两个数值或数值表达式连接起来的式子
关系表达式的值是一个逻辑值,即真或假
逻辑运算符和逻辑表达式
逻辑运算符
&& 逻辑与
|| 逻辑或
双目运算符
! 逻辑非
单目运算符
逻辑表达式
逻辑表达式的值应该是一个逻辑量“真”或“假”
关于真假
逻辑运算中,1真0假
判断一个量时,0假非0真
在求解中,并不是所有的逻辑运算符都被执行
类比python中的惰性求解
逻辑型变量
源文件中用#include指令包含了头文件stdbool.h
子主题
定义逻辑变量用类型符_Bool
条件运算符和条件表达式
条件运算符
?
唯一一个三目运算符
条件表达式
一般形式:表达式1?表达式2:表达式3
选择结构的嵌套
定义:在if语句中又包含一个或多个if语句
一般格式
注意if与else的配对关系,else只会与它上面的最近的未配对的if配对
switch语句
作用:多分支选择语句
一般形式
switch(表达式) { case 常量1:语句1 case 常量2:语句2 … case 常量n:语句n default: 语句n+1 }
注意
switch后面的括号内的表达式,其值的类型应为整数类型
数值类型
字符型
布尔类型
最多只有一个default语句,可惜没有
case无序性
每一个case常量必须互不相同
case编号只起标记作用
没有break语句,会连续执行
case语句虽然包含了一个以上执行语句,但可以不用花括号括起来,系统会自动执行
多个case标号可以共用一组执行语句
case′A′: case′B′: case'C':…;break;
5. 循环结构程序设计
while语句
一般形式:while(表达式)语句
语句即循环体
表达式称为循环条件表达式
真时执行
只要循环条件表达式为真,就执行循环体语句
先判断,再执行
do…while语句
一般形式:do 语句 while(表达式);
先执行,再判断
for语句
一般形式
for(表达式1;表达式2;表达式3) 语句
for(循环变量赋初值;循环条件;循环变量增值) 语句
具体作用
表达式1设置初始条件,只执行一次
表达式2是循环条件表达式,用于判断是否继续循环
表达式3作为循环的调整
注意
表达式1可以省略,但分号不可以
表达式2可以省略
循环无终止进行
表达式3可以省略
设计者应保证循环正常结束
表达式1
设置变量初值的赋值表达式
与循环变量无关的其他表达式
表达式2
关系表达式或逻辑表达式
数值表达式或字符表达式
表达式1可以定义变量并赋初值
循环状态的改变
break语句
作用:提前终止循环,接着执行循环体下面的语句
循环嵌套时,只终止内层循环
只能用于循环语句和switch语句之中,不能单独使用
continue语句
作用:提前结束本次循环 ,接着执行下次的循环
6. 利用数组处理批量数据
数组
概念
数组:一批具有同名的同属性的数组
数组名
特点
数组是一组有序数据的集合
数组中的每一个元素都属于同一个数据类型
数组中的每一个元素可以由一个数组名和下标来确定
一维数组
定义
一般形式:类型符 数组名[常量表达式]
数组名的命名规则与变量名相同,遵循标识符号命名规则
常量表达式即数组长度
引用
只能引用数组元素而不能一次整体调用整个数组全部元素的值
表示形式:数组名[下标]
初始化
定义:定义数组时,给各数组元素赋值
类别
在定义数组时对全部数组元素赋予初值
此时可以不指定数组长度
部分数组元素赋值
空余位置用0补齐
数组元素全为0
此时可简写
二维数组
常被称为矩阵
定义
一般形式:类型说明符 数组名[常量表达式][常量表达式]
常量表达式前者为行,后者为列
存储时
元素排列顺序是按行存放的
各元素的排列是连续排列的,是线性的
引用
表示形式:数组名[下标] [下标]
初始化
类别
分行赋初值
全部赋初值
此时前一个下标可以省,但后一个不可以省
对部分元素赋初值
空余位置用0补齐
字符数组
定义
用来存放字符数据的数组
一个元素存放一个字符
初始化
在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的
定义时必须初始化
空余位置用空字符补齐
字符串
字符串的实际长度一定大于有效长度
字符串结束标志’\0’
遇到即表示字符串结束
输入输出
逐个字符输入输出
格式符:%c
将整个字符串一次输入输出
格式符:%s
注意
输出的字符中不包括结束符
用%s输出时,printf函数中的输出项是字符数组名
输出时遇到结束符结束
如果一个字符数组包含一个以上’\0’,则遇第一个输出就结束
scanf函数中输出项如果是字符数组名,不需要加地址符
字符串处理函数
输出
puts函数
作用:将一个字符串输出到终端
一般形式:puts(字符数组)
注意
输出的字符串可以包含转义字符
输出以空字符为终止
只能输出一个字符串
输入
gets函数
作用:从终端输入一个字符串到字符数组,包括终止符
一般形式:gets(字符数组)
注意
返回的函数值是字符数组的起始地址
只能输入一个字符串
连接
strcat函数
作用:把两个字符数组中的字符串连接起来,函数调用得到字符数组1的地址
一般形式:strcat(字符数组1,字符数组2)
注意
字符数组必须足够大
连接时将字符串1后面的空字符取消
复制
strcpy函数
作用:将字符串2复制到字符数组1中去
一般形式:strcpy(字符数组1,字符串2)
注意
字符数组1必须定义的足够长
字符数组1必须写成数组名形式
字符串2
字符数组名
字符串常量
本质上是逐个替代,因此字符数组1后面可能未变化
strncpy函数
作用:将字符串2中前面n个字符复制到字符数组1中去
一般形式:strncpy(字符数组1,字符串2,数值)
复制时不包括空字符
比较
strcmp函数
作用:字符串比较
一般形式:strcmp(字符串1,字符串2)
规则
将两个字符串自左至右逐个字符相比
全部字符相同,则认为两个字符串相等
若出现不相同的字符,则以第一对不相同的字符的比较结果为准
小写字母大于大写字母
结果值为整数
相同,函数值为0
大于,函数值为正整数
小于,函数值为负整数
计算长度
strlen函数
作用:测量字符串的有效长度
一般形式:strlen(字符数组/字符串)
大小写转换
strlwr函数
作用:转换成小写字母
一般形式:strlwr(字符串)
strupr函数
作用:转换成大写字母
一般形式:strupr(字符串)
使用时应当用头文件#include<string.h>
7. 函数
作用
用来完成一定的功能
函数的名字反映其代表的功能
注意
一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件
一个源程序文件可以为多个C程序共用
一个源程序文件由一个或多个函数以及其他有关内容
C程序执行从main函数开始,以main函数结束
所有函数都是平行的,互相独立
函数除了main函数之外可以相互调用,但不可以嵌套定义
分类
用户使用角度
库函数
用户自己定义的函数
函数形式角度
无参函数
有参函数
定义函数
先定义,后使用
函数定义
指定函数的名字
见名知意
指定函数的类型
指定函数的参数的名字和类型
指定函数的功能
定义方法
定义无参函数
一般形式
类型名 函数名() { 函数体 }
类型名 函数名(void) { 函数体 }
函数体包括声明部分和语句部分
定义有参函数
类型名 函数名(形式参数表列) { 函数体 }
定义空函数
类型名 函数名() {}
作用:程序的结构清楚,可读性好,以便扩充新功能方便,对程序结构影响不大
调用函数
一般形式
函数名(实参表列)
调用形式
函数调用语句
函数表达式
函数带回一个确定的值以参加表达式的运算
函数参数
数据传递
形式参数和实际参数
形式参数:在定义函数时函数名后面括号中的变量名称
实际参数:在主调用函数中调用一个函数是,函数名后面括号中的参数
虚实结合
定义:在调用函数过程中发生的实参和形参间的数据传递
注意
实参可以是常量,变量或表达式,但要求他们有确定值
实参和形参的类型应该相同或赋值兼容
调用过程
在定义函数中指定的形参,在未出现函数调用,他们并不占内存中的存储单元,在发生函数调用时,函数的形参被临时分配内存单元
将实参对应的值传递给形参
在执行函数期间,由于形参已经有值,就可以利用形参进行有关预的运算
通过return语句将函数值带回到主调函数
返回值的类型与函数类型一致
不需要返回值时就不用return语句,此时函数的类型应定义为void类型
调用结束,形参单元被释放,实参单元仍保留并维持原值,没有改变
实参向形参的数据传递是值传递,单向传递
形参的值发生改变,不会改变主调函数的实参的值
返回值
函数的返回值是通过函数中的return语句获得的
一个函数可以有1个以上的return语句
函数值的类型
在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致
函数类型决定返回值的类型
对于不带回值的函数,应当用定义函数为void类型
函数声明和函数原型
调用条件
被调用的函数必须是已经定义的函数
使用库函数时需要调用相应的库函数
如果使用用户自己定义的函数,而该函数的位置再调用它的函数后面,应该在主调函数中对被调用的函数做声明
函数原型
函数的首行(函数的首部)
作用:能减少编写程序时可能出现的错误
函数声明
函数的声明比函数定义中的首行多一个分号
一般形式
函数类型 函数名(参数类型1参数名1,…);
函数类型 函数名(参数类型1,…);
注意
对函数的定义和声明并不相同
函数的定义是指对函数功能的确立
包括指定函数名,函数值类型,形参及其类型以及函数体等
函数的声明的作用则是把函数的名字,函数类型以及形参的类型,个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查
函数的递归调用
定义:在调用一个函数的过程中出现直接或间接调用该函数本身
分类
直接调用
间接调用
数组作为函数参数
数组元素
只可以做实参,不可做形参
形参是被函数调用时临时分配存储单元 数组是一个整体
值传递
单向传递—从实参到形参
数组名
实参
传递数组首元素的地址
形参值的改变会影响实参
形参
注意
应该在主调函数和被调用函数分别定义数组
实参数组和形参数组数据类型应该一致
定义被调用函数时,指定其大小是不起任何作用的
因为C语言编程系统并不检查形参数组大小
在定义数组时可以在数组名后面跟一个空的方括号
多维数组名
实参
传递数组首元素的地址
形参值的改变会影响实参
形参
注意
在对形参数组定义时,第一维可以省略,第二维不可以
存储类别
按作用域区分
局部变量
在函数的开头定义
在函数内的复合语句内定义
注意
主函数内定义的变量也只在主函数中有效
不同函数中可以使用同名的变量
形式参数也是局部变量
包括
自动变量,即动态局部变量(离开函数,值就消失)
自动变量(auto变量)
包括
函数的形参
函数中定义的局部变量
定义:在调用函数时,系统会分配存储空间,结束时自动释放存储空间的变量
可以省略
自动变量在函数调用时赋初值
若定义时不赋值,则会分配一个不确定的值
静态局部变量(离开函数,值仍保留)
静态局部变量(syatic局部变量)
变量在函数调用后不消失而继续保留原值(占用的存储单元不释放)
静态局部变量属于静态存储类别,在静态存储区分配存储单元
静态局部变量在编译时赋初值,且只赋值一次
若定义时不赋值,则会分配0或空字符
其他函数不能调用
寄存器变量(离开函数,值就消失)
寄存器变量(register变量)
定义:将局部变量的值放在CPU的寄存器中,需要时直接从寄存器中取出参加运算
(形式参数可以定义为自动变量或寄存器变量)
全局变量
在函数的外部定义
注意
设置全局变量的作用是增加了函数间数据联系的渠道
存放在静态存储区中
不必要时不使用
全局变量在程序的全部执行过程中都占用存储单元
使函数的通用性降低
使用过多会降低程序的清晰性
作用域是从变量的定义处开始,到本程序文件的末尾
作用域的扩展与限制
在一个文件内扩展外部变量的作用域
在引用之前用关键字extern对该变量做外部变量声明,表示把该外部变量的作用域扩展到此位置
此时类型名可以省写
将外部变量的作用域扩展到其他文件
将外部变量的作用域限制在本文件中
在定义外部变量时加一个static声明
静态外部变量:加上static声明,只能用于本文件的外部变量
包括
静态外部变量(只限本文件引用)
外部变量(非静态的外部变量,允许其他文件引用)
按生存期区分
每一个变量和函数都有两个属性
数据类型
数据的存储类别
静态存储方式
定义:在程序运行期间由系统分配固定的存储空间的方式
包括
静态局部变量
静态外部变量(函数外部静态变量)
外部变量(用extern声明后,允许其他文件引用)
动态存储方式
定义:在程序运行期间根据需要进行动态的分配存储空间的方式
包括
自动变量(本函数内有效)
寄存器变量(本函数内有效)
形式参数(本函数内有效)
按变量值的存储位置区分
内存中静态存储区
包括
静态局部变量
静态外部变量(函数外部静态变量)
外部变量(允许其他文件引用)
内存中动态存储区
包括
自动变量
形式参数
CPU中的寄存器
包括
寄存器变量
变量声明和定义
定义:建立存储空间的声明
声明:不需要建立存储空间的声明
内部和外部函数
内部函数
只能被本文件中其他函数所调用
一般形式:static 类型名 函数名(形参表)
外部函数
可供其他文件调用
一般形式:extern 类型名 函数名(形参表)
extern可以省略
8. 指针
简介
指针
一个变量的地址称为该变量的指针
指针变量
专门用来存放另一变量的地址的变量
访问地址
直接访问
直接按变量名进行访问
间接访问
变量i的地址存放在另一变量中,然后通过该变量来找到i的地址,从而访问i变量
一组概念
p
指针变量名
*p
存储单元的值
指针变量
定义
一般形式
类型名 *指针变量名
定义时必须指定基类型
变量的指针的含义
存储单元编号表示的地址
指向的存储单元的数据类型
指针变量中只能存放指针,不能被赋其他值
指针变量可以有空值p=NULL
引用
给指针变量赋值
引用指针变量指向的变量
引用指针变量的值
做函数参数
作用:将一个变量的地址传送到另一个函数中
引用数组
数组元素的指针
定义
数组元素的地址
数组名代表数组中首元素的地址
p=&a[0];
p=a;
两者等价
引用时指针的运算
条件:当指针指向数组元素时可以进行以下运算
加一个整数
p+1指向同一数组中的下一个元素
减一个整数
p-1指向同一数组中的上一个元素
自加运算
*p++等效于*(p++)
先指向,再自增
*(++p)
先自增,再指向
++(*p)
指针指向内容的自增
自减运算
两个指针相减
前提:指针变量p1和p2都指向同一数组,
结果:两个地址之差除以数组元素的长度
意义:所指元素的相对距离
指针引用数组元素
方法
下标法
a[i]
指针法
*(a+i)
利用指针引用数组元素,比较方便灵活
数组名做函数参数
当用数组名做参数时,形参数组元素值的改变会影响到实参数组
实参数组名代表一个固定的地址
实参和形参的对应关系
形参和实参都用数组名
实参用数组名,形参用指针变量
实参和形参都用指针变量
实参为指针变量,形参为数组名
指针变量作实参时,必须有确定值,指向一个已定义的对象
引用多维数组
多维数组元素的地址
a
首行的首地址
*(a+0)
0行0列元素地址
a[0]
0行0列元素地址
*a
0行0列元素地址
a+1
1行首地址
&a[1]
1行首地址
*(a+1)
1行0列元素地址
a[1]
1行0列元素地址
a[1]+2
1行2列元素的地址
*(a+1)+2
1行2列元素的地址
&a[1][2]
1行2列元素的地址
*(a[1]+2)
1行2列元素的值
*(*(a+1)+2)
1行2列元素的值
a[1][2]
1行2列元素的值
指针变量
指向数组元素的指针变量
相当于将二维数组转化为一维数组
a[i][j]在数组中的相对位置的计算公式为i*m+j
指向一维数组的指针变量
作函数参数
引用字符串
字符串引用方式
以数组名和%s格式声明输出该字符串
数值型数组的元素只能逐个输出
用字符指针变量指向一个字符串常量,通过字符指针变量引用
字符指针做函数参数
实参和形参对应关系
均为字符数组名
字符数组名和字符指针变量
字符指针变量和字符数组名
均为字符指针变量
字符指针变量与字符数组的比较
字符数组由若干个元素组成,每个元素存放一个字符;而字符指针变量中存放的是地址
赋值方式
可以对字符指针变量赋值
不能对数组名赋值
初始化含义不同
把字符串第一个元素的地址赋值给字符指针变量
将字符串赋给数组中的各元素
存储单元内容
编译时字符指针变量只分配一个存储单元
编译时为字符数组分配若干个存储单元
指针变量的值是可以改变的,数组名是一个常量,不可改变
字符数组名各元素的值是可以改变的,但字符指针变量指向的字符串常量的内容是不可被取代的(即不可以对他们再赋值)
引用方式
均可以使用下标法和地址法
用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串
指向函数的指针
函数的指针
编译系统为函数代码分配的存储空间的起始地址
函数调用
通过函数名调用函数
通过指针变量访问它所指向的函数
使程序更简洁和专业
声明函数
定义函数指针变量
一般形式:类型名(*指针变量名)(函数参数表)
指向函数
指向时,只需要函数名而不用参数
一个指针变量可以先后指向同类型的函数
调用函数
调用时,只需将(*p)代替函数名即可
对指向函数的指针变量不能进行算术运算
用指向函数的指针作函数参数
指向函数的指针变量的一个重要用途就是把函数的地址作为参数传递到其他函数
返回指针值的函数
一般形式
类型名 *函数名(参数表列)
指针数组和多重指针
动态内存分配
malloc函数
原型
void*malloc(unsigned int size)
作用
在内存的动态存储区中分配一个长度为size的连续空间
返回值
成功则返回所分配区域的第一个字节的地址
失败则返回空指针
calloc函数
原型
void*calloc(unsigned n,unsigned size)
作用
在内存的动态存储区中分配n个长度为size的连续空间
返回值
成功则返回所分配区域的地址
失败则返回空指针
free函数
原型
void*free(void*p)
p应是最近一次调用calloc函数和malloc函数时得到的函数返回值
作用
在内存的动态存储区中分配n个长度为size的连续空间 释放指针变量p所指向的动态空间
返回值
无返回值
realloc函数
原型
void *realloc(void*p,unsigned int size)
作用
改变分配动态空间的大小
9. 其他数据类型
结构体
由用户自己建立的有不同类型数据组成的组合型数据类型
变量
声明
一般形式
struct 结构体名 {成员列表};
成员格式:类型名 成员名;
定义
先声明,再定义
声明类型与定义变量分离,比较灵活
声明同时定义
一般形式
struct 结构体名 { 成员列表 }变量名表列;
不指定类型名而直接定义变量
struct { 成员列表 }变量名表列;
初始化
定义时初始化
定义后初始化
引用
引用方式
结构体变量名.成员名
只能对结构体变量中的每个成员分别进行输入和输出
如果成员本身是结构体类型,则需要一级一级的利用成员运算符
结构体变量的成员可以进行各种运算
同类的结构体变量可以相互赋值
可以引用结构体变量成员的地址,也可以引用结构体变量的地址
结构体数组
定义
一般形式
struct 结构体名 {成员列表}数组名[数组长度];
先声明,再定义
结构体类型 数组名[数组长度];
初始化
在定义数组的后面加上={初值表列};
必须按顺序对应
结构体指针
指向结构体变量的指针
方法
结构体变量.成员名
结构体指针变量.成员名
结构体指针名->成员名
结构体变量及其指针作函数参数
用结构体变量的成员作参数
值传递
用结构体变量作实参
值传递
用指向结构体变量的指针作实参
链表
概念
链表:动态地进行存储分配的一种数据类型
头指针
结点:链表中的每一个元素
用户需要的实际数据
下一个结点的地址
表尾
静态链表
所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放
动态链表
在程序执行过程中,一个一个的开辟结点和输入各结点的数据,并建立起前后相连的关系
建立链表
输出链表
共用体
共用体:使不同的变量共享同一段内存的数据结构
一般形式
union 共用体名 {成员表列 }变量表列;
定义类型
声明的同时定义
分开进行
引用
不能引用共用体变量,而只能引用共用体变量中的成员
特点
同一个内存段可以用来存放不同的数据类型,但在每一瞬间只能存放其中一个成员
可以对共用体变量初始化,但初始化表中只能有一个常量
允许对指定的一个成员初始化
共用体变量中起作用的是最后一次被赋值的成员
共用体变量的地址和他和成员的地址是同一地址
不能对共用体变量名赋值
允许同类型的共用体变量互相赋值
枚举类型
枚举类型:只有几种可能的值的变量的数据类型
一般形式
enum[枚举名]{枚举元素列表}
注意
每一个枚举元素都代表一个整数,默认从0开始
可以按初始化时指定的数值进行判断比较
10. 文件处理
基本概念
文件
存储在外部介质上数据的集合
程序文件
源程序文件.c
目标文件.obj
可执行文件.exe
文件的内容是程序代码
数据文件
映像文件(二进制文件)
文本文件(ASII文件)
在存储前需要进行转换
供程序运行时读写的数据
数据流
数据的输入输出
表示信息从源到目的端的流动
包括
标准输入流
标准输出流
标准出错输出流
文件名
唯一的文件标识
包括
文件路径
文件名主干
命名规则遵循标识符的命名规则
文件后缀
表示文件的性质
文件缓冲区
缓冲文件系统
系统自动的在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区
文件类型指针
打开关闭文件
fopen函数
一般形式
fopen(文件名,使用文件方式)
使用文件方式
r
只能用于向计算机输入而不能用作向该文件输出数据
w
只能用于向该文件写数据,而不能用来向计算机输入
a
在文件尾添加数据
rb
wb
ab
打开二进制文件
+
即可输入,也可用来输出
文件读写位置标记在文件末尾
常用方法
if((fp=fopen("file","r"))==NULL) {printf("cannot open the file\n"); exit(0); }
fclose函数
一般形式
fclose(文件指针)
顺序读写数据文件
读写字符
fgetc函数
调用形式:fgetc(fp)
功能:从fp指向的文件读入一个字符
输出成功,返回输出的字符串
输出失败,返回EOF(-1)
fputc函数
调用形式:fputc(ch,fp)
功能:把字符串ch写到文件指针变量fp所指向的文件中
输出成功,返回输出的字符串
输出失败,返回EOF(-1)
feof函数
功能:检查文件读写位置标记是否移到文件末尾
读写字符串
fgets函数
调用形式:fgets(str,n,fp)
功能:从fp指向的文件读入一个长度为n-1的字符串,存放在字符数组str中
输出成功,返回地址str
输出失败,返回NULL
fputs函数
调用形式:fputs(str,fp)
功能:把str所指向的字符串写到文件指针变量fp所指向的文件中
输出成功,返回0
输出失败,返回非0值
格式化方式读写文件
fprintf(文件指针,格式字符串输出表列)
fscanf(文件指针,格式字符串输出表列)
二进制方式读写
fread(buffer,size,count,fp)
fwrite(buffer,size,count,fp)
释义
buffer:地址
用来存放从文件读入的数据的存储区的地址
把此地址开始的存储区中的数据向文件输出
size:要读写的字节数
count:要读写多少个数据项
随机读写数据文件
文件位置标记及其定位
文件位置标记
文件位置标记的定位
rewind函数
功能:使文件位置标记指向文件开头
形式:rewind(fp)
fseek函数
功能:改变文件位置标记
形式:fseek(文件类型指针,位移量,起始点)
起始点
文件开始位置
名字:SEEK_SET
用数字代表:0
文件当前位置
名字:SEEK_CUR
用数字代表:1
文件末尾位置
名字:SEEK_END
用数字代表:2
位移量
以起始点为基点
数据类型:long型
一般用于二进制文件
ftell函数
功能:测定文件位置标记的当前位置
形式:ftell(fp)
相对于文件开头的位移量表示
文件读写出错检测
ferror函数
调用形式:ferror(fp)
返回0则表示未出错
返回非0表示出错
clearerr函数
交换值
降序排列3个整数
用户区
程序区
动态存储区
函数形式参数
函数中定义的没有用关键字static声明的变量,即自动变量
函数调用时的现场保护和返回地址等
静态存储区
全局变量
汉诺塔问题
分析
将n-1个盘从一个座上移到另一个座上
将一个盘子从一个座上移到另一个座上
代码
打擂台算法
排序
冒泡排序
优点:比较简单,空间复杂度较低,是稳定的
缺点:时间复杂度太高,效率慢
选择排序
优点:一轮比较只需要换一次位置
缺点:效率慢,不稳定
两种比较
区别
冒泡排序是比较相邻的两个数;选择排序是按顺序比较,找最值
冒泡排序每一轮比较后,位置不对就要换位置;选择排序则每一轮只换一次
冒泡排序是通过数找位置;选择排序也是通过位置找数
循环的比较
一般情况下可以相互替代
while语句需要在循环体内完成自增,for语句则不用
while语句需要先行设置初值
三中循环可以用break语句和continue语句结束循环
补充
优先级
条件运算符优先于赋值运算符,低于关系运算符和算术运算符
赋值语句
赋值运算符
=
复合的赋值运算符
赋值表达式
定义:将一个变量和一个表达式连接起来的式子
一般形式:变量 赋值运算符 表达式
作用:将一个表达式的值赋给一个变量
计算
赋值
左值
一般为变量
右值
赋值过程中的类型转换
类型一致,直接进行赋值
类型不一致
浮点型数据赋给整型变量时,舍弃小数部分
整型数据赋给单双精度变量时,数值不变,但以浮点数形式存储到变量中
double型数据与float变量互换时,改变有效数字
字符型数据赋给整型变量时,,赋给ASCII代码
将一个占字节多的整型数据赋给占字节少的整形变量或字符变量时,只将其低字节部分赋给变量
赋值语句
变量赋初值
类型转换
强制类型转换
系统自动进行的类型转换
常量类型
整型常量
不带小数点的数值
存储单元长度:2个字节(或者按照其数值大小系统自动改变数据类型,更改存储单元长度)
浮点型常量
凡以小数形式和指数形式出现的实数
存储单元长度:8个字节
C程序中的实型常量都是双精度浮点型常量
C语言
一个C程序可以由若干个源程序文件(编译时以文件模块为单位)组成 一个源文件可以由若干个函数和预处理指令以及全局变量声明部分 一个函数由数据声明部分和执行语句组成
1. 程序设计和C语言
程序:一组计算机能识别和执行的指令
计算机语言
机器语言
定义
机器指令:计算机能够直接识别和接受的二进制代码
机器语言:机器指令的集合
特点
难学,难记,难写,难检查,难修改,难以推广使用
符号语言
符号汇编语言 汇编语言
定义
符号语言:用一些英文字母和数字表示一个指令
汇编程序:把符号语言的指令转换成机器指令
代真或汇编:转换的过程
特点:比机器语言简单好记一些,但仍然难以普及
不同计算机的机器语言和汇编语言是互不通用的
高级语言
20世纪50年代创造出了第一个计算机高级语言—FORTRAN语言
可迁移
定义
编译程序
把源程序转换成目标程序的软件
源程序
用高级语言写的程序
目标程序
机器指令的程序
发展阶段
非结构化的语言
编程风格较随意,没有严格规范,只要求符合基本的语法规则
程序中的流程可以随意跳转
难以阅读和维护
结构化语言
规定程序必须由良好特性的基本结构构成
流程不可随意跳转,自上而下的执行
结构清晰,易于编写、阅读和维护
面向对象的语言
C++,C#,Visual Basic和Java
C语言
发展
祖先:BCPL语言
B语言
过于简单,功能有限
特点
过于简单 没有数据类型
精炼,接近硬件
C语言
具有多种数据类型
特点
语言简洁、紧凑,使用方便灵活
运算符丰富
数据类型丰富
具有结构化的控制语句
语法限制不太严格,程序设计自由度大
C语言允许直接访问物理地址,能进行位操作
用C需要编写的程序可移植性好
生成目标代码质量高,程序执行效率高
程序
结构
一个程序有一个或多个源程序文件组成
预处理指令
全局声明
函数定义
函数是C程序的主要组成部分
一个C语言程序是有一个或多个函数组成的,其中必须有且只有一个main函数
很容易实现程序的模块化
一个函数包括两个部分
函数首部
函数名
函数类型
函数属性
函数参数名
参数类型
一个函数名后面必须跟一对圆括号,里面写
函数体
声明部分
执行部分
函数总是从main函数开始执行
程序中对计算机的操作是由函数中的C语句完成的
在每个数据声明和语句的最后必须有一个分号
C需要本身不提供输入输出语句
程序应当包含注释
运行步骤和方法
上机输入和编辑源程序
文件以.c作为后缀,生成源程序文件
对源程序进行编译
阶段
预编译
正式编译
作用
对源程序进行检查,判定有无语法方面的错误
把源程序转换成二进制形式的目标程序.obj,此时的源程序没有消失
直接连接处理
把所有编译后得到的目标模块连接装配起来,再与函数库相连接成一个整体,生成一个可供计算机执行的目标程序,称为可执行程序
连接编辑程序:完成上述工作
运行可执行程序,得到运行结果
程序设计的任务
问题分析
设计算法
编写程序
对源程序进行编辑、编译和连接
运行程序,分析结果
编写程序文档
2. 算法
概念
算法:对操作的描述(为解决一个问题而采取的方法和步骤)
算法+数据结构=程序
数据结构:对数据的描述
分类
数值运算算法
非数值运算算法
特性
有穷性
一个算法应该包含有限的操作步骤,而不能是无限的
确定性
每一个步骤都应该是确定的,而不应该是含糊的、模棱两可的
有效性
算法中的每一个步骤都应该能有效的执行,并得到确定的结果
有零个或多个输入
有一个或多个输出
表示
用自然语言表示
用流程图表示
部分
表示相应操作的框
带箭头的流程线
框内外必要的文字说明
结构
1.只有一个入口 2.只有一个出口 3.结构内的没一部分都有机会被执行到 4.结构内不存在“死循环”
顺序结构
选择结构
循环结构
while型
until型
用伪代码表示
用计算机语言表示
设计算法
实现算法
结构化程序设计算法
方法
自顶而下,逐步细化
自顶而下
逐步细化
模块化设计
结构化编码
3. 顺序程序设计
数据
定义
常量
整型常量
实型常量
十进制小数形式
指数形式
e或E之前必须有数字,后面必须为整数
字符常量
普通字符
用’’括起来的一个字符
’ab’、’12’不是字符
字符常量只能是一个字符
转义字符
字符串常量
用“”把若干个字符括起来
符号常量
用#define指令,指定用一个符号名称代表一个常量
注意行末没有分号
优点: 含义清楚(定义时应该见名知意) 在需要改变程序中多处用到的同一个常量时,能做到一改全改
没有名字的不变量
变量
区分变量名和变量值
必须先定义,后使用
一个有名字的,具有特定属性的一个存储单元
常变量
常变量具有变量的基本属性:有类型,占存储单元,只是不允许改变其值
有名字的不变量
标识符
大小写敏感
用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列
一个对象的名字
只能由字母、数字和下划线3种字符组成 且第一个字符必须为字母或下划线
数据类型
基本类型
整数类型
基本整型int
存储单元长度:2或4个字节
在存放整数的存储单元中,最左面的一位是用来表示符号的 0为正,1为负
存储方式:用整数的补码形式存放
一个整数的补码是此数的二进制形式 一个负数的补码:先求此数的绝对值的二进制,再对每一位取反,再加一
短整型short int或short
存储单元长度:2个字节
存储方式:用整数的补码形式存放
长整型long int或long
存储单元长度:4个字节
存储方式:用整数的补码形式存放
双长整型long long int或long long
存储单元长度:8个字节
存储方式:用整数的补码形式存放
字符型char
存储单元长度:1个字节
存储方式:按其代码(整数)形式
字符与字符代码
127个
字符变量
整型变量又可分为有符号类型signed和无符号类型unsigned 便于充分利用变量的值的范围 无符号类型变量最左位不再表示符号
布尔型bool
浮点类型
实数的指数形式称为浮点数 规范化的指数形式:小数部分中小数点前的数字为0,后第一位数字不为0
单精度浮点型float
存储单元长度:4个字节
存储方式:以规范化的二进制数指数形式存放
双精度浮点型double
存储单元长度:8个字节
存储方式:以规范化的二进制数指数形式存放
复数浮点型float_complex,double_complex,long long_complex
存储单元长度:8或16个字节
枚举类型enum
程序中用户定义的整数类型
算术类型—值为数值
派生类型
指针类型*
数组类型[]
结构体类型struct
组合类型
共用体类型union
函数类型
空类型void
运算符与表达式
运算符
算术运算符
基本的算术运算符
正负号运算符
加减运算符
乘除运算符
两个实数相除的结果为双精度类型,两个整数相除的结果为整数
向零整除
-5/3=-1
求余运算符
参加的操作数为整数,结果也是整数
求值结果与被除数的符号相同
自增,自减运算符
只能用于变量,不能用于常量和表达式
作用是使变量的值加1或减1
++i,--i
在使用i前,完成操作
i++,i--
在使用后,完成操作
关系运算符
大于(等于)小于(等于)号
判等
==
!=
逻辑运算符
非且或
位运算符
<<,>>,~,|,^,&
赋值运算符
条件运算符
?:
逗号运算符
指针运算符
*和&
求字节数运算符
sizeof
强制类型转换运算符
一般形式:(类型名)(表达式)
强制转换时得到一个所需类型的中间数据,而原来的变量类型为发生变化
成员运算符
.->
下标运算符
其他
优先级
条件运算符优先于赋值运算符,低于关系运算符和算术运算符
结合性
先左后右
算术运算符
先右后左
赋值运算符
混合运算
+,-,*,/运算中存在float或double类型时,结果为double
int与float或double类型进行运算,结果为double
字符形数据与整型数据进行运算,即把ASCII代码与整型数据进行运算
同一个字母,小写=大写+32
C语句
分号是语句中不可缺少的组成部分
控制语句
作用:用于完成一定的控制功能
形式
if()…else…
循环语句
for()…
do…while()
continue
break
switch
return
goto
函数调用语句
由一个函数调用加一个分号构成
表达式语句
由一个表达式加一个分号构成
空语句
作用
可以用来作为流程的转向点—流程从程序其他地方转到此语句处
作为循环语句中的循环体—表示循环体什么也不做
复合语句
数据的输入和输出
概念
注意点
所谓的输入输出是以计算机主机为主体而言的
C语言本身不提供输入输出语句,输入和输出操作是由C标准函数库中的函数来实现的
在使用系统函数时,要在程序文件的开头用预处理指令#include把有关头文件放在本程序中
printf函数
一般格式
printf(格式控制,输出列表)
格式控制和输出列表都是函数的参数
格式控制
是用双撇号括起来的一个字符串,称“转换控制字符串”,简称“格式字符串”
包括
格式声明
%格式字符
作用:将输出的数据转换成指定的格式然后输出
普通字符
在输出时原样输出的字符
输出表列
定义:程序语言输出的一些数据,可以是常量,变量或表达式
一般形式:printf(参数1,参数2,参数3,…参数n)
格式字符
d格式符
作用:用于输出一个有符号的十进制整数
在输出时,按十进制整型数据的实际长度输出,正数的符号不输出
可以在格式声明中指定域宽 %5d
靠右对齐,空格补齐
其他格式
%ld
%lld
c格式符
作用:用于输出一个字符
可以在格式声明中指定域宽 %5c
靠右对齐,空格补齐
整数输出
在0-127范围内,利用ASCII码转换
超出范围后,进行截断
s格式符
作用:用于输出一个字符串
f格式符
作用:用于输出实数,以小数形式输出
类型
基本型:%f
实数中的整数部分全部输出,小数部分输出6位
指定型:%m.nf
m为数据宽度
n为小数位数
多余部分四舍五入
对齐型:%-m.nf
数据向左靠,右端补空格
e格式符
作用:以指数形式输出实数
类型
基本型%e
小数点前必须有且只有1位非零数字
数字部分的小数位数为6
指数部分占5列
其中e占一列
指数符号占一列
指数占3列
指定型%m.ne
i格式符
作用:按十进制整型数据数据的实际长度输出
同d字符
o格式符
作用:以八进制整数形式输出
输出的数值不带符号
将符号位一起作为八进制数的一部分输出
可以得到存储单元中实际的存储情况
x格式符
作用:以十六进制数形式输出整数
u格式符
作用:用来输出无符号型数据,以十进制整数形式输出
g格式符
作用:用来输出浮点数
不输出无意义的0
一般形式:附加字符 格式字符
格式字符
格式附加字符
l
m
n
-
putchar函数
只能输出一个字符,而不能输出整数!
一般形式:putchar(c)
scanf函数
一般形式
scanf(格式控制,地址表列)
地址表列:由若干个地址组成的表列
变量的地址
字符串的首地址
格式声明
以%开始,以一个格式字符结束,中间插入附加的字符
格式字符的间隔符号与输入字符的符号相对应
注意点
格式控制后应当是变量地址
格式字符的间隔符号与输入字符的符号相对应
在用“%c”格式声明输入字符时,空格字符和转义字符中的字符都作为有效数字输入
输入数值时,两个数值之间需要插入空格
输入字符时,不需要插入
输入数值数据时,若输入空格,回车,Tab或非法字符(不属于数值的字符),认为该数据结束
getchar函数
只能接受一个字符
包括控制字符
一般形式:getchar()
4. 选择结构程序设计
if语句
一般形式
if(表达式)语句1 [语句2]
表达式可以是关系表达式,逻辑表达式或者数值表达式
if(表达式)语句1
if(表达式)语句1 else语句2
if(表达式)语句1 else if(表达式2) 语句2 … else 语句n
格式
一般写为锯齿状
注意
if语句无论写在几行上,都是一个语句
内嵌语句也可以是一个if语句
关系运算符和关系表达式
关系运算符
大于(等于)小于 (等于)号
优先级高
判等
优先级低
==
!=
关系表达式
定义:用关系运算符将两个数值或数值表达式连接起来的式子
关系表达式的值是一个逻辑值,即真或假
逻辑运算符和逻辑表达式
逻辑运算符
&& 逻辑与
|| 逻辑或
双目运算符
! 逻辑非
单目运算符
逻辑表达式
逻辑表达式的值应该是一个逻辑量“真”或“假”
关于真假
逻辑运算中,1真0假
判断一个量时,0假非0真
在求解中,并不是所有的逻辑运算符都被执行
类比python中的惰性求解
逻辑型变量
源文件中用#include指令包含了头文件stdbool.h
子主题
定义逻辑变量用类型符_Bool
条件运算符和条件表达式
条件运算符
?
唯一一个三目运算符
条件表达式
一般形式:表达式1?表达式2:表达式3
选择结构的嵌套
定义:在if语句中又包含一个或多个if语句
一般格式
注意if与else的配对关系,else只会与它上面的最近的未配对的if配对
switch语句
作用:多分支选择语句
一般形式
switch(表达式) { case 常量1:语句1 case 常量2:语句2 … case 常量n:语句n default: 语句n+1 }
注意
switch后面的括号内的表达式,其值的类型应为整数类型
数值类型
字符型
布尔类型
最多只有一个default语句,可惜没有
case无序性
每一个case常量必须互不相同
case编号只起标记作用
没有break语句,会连续执行
case语句虽然包含了一个以上执行语句,但可以不用花括号括起来,系统会自动执行
多个case标号可以共用一组执行语句
case′A′: case′B′: case'C':…;break;
5. 循环结构程序设计
while语句
一般形式:while(表达式)语句
语句即循环体
表达式称为循环条件表达式
真时执行
只要循环条件表达式为真,就执行循环体语句
先判断,再执行
do…while语句
一般形式:do 语句 while(表达式);
先执行,再判断
for语句
一般形式
for(表达式1;表达式2;表达式3) 语句
for(循环变量赋初值;循环条件;循环变量增值) 语句
具体作用
表达式1设置初始条件,只执行一次
表达式2是循环条件表达式,用于判断是否继续循环
表达式3作为循环的调整
注意
表达式1可以省略,但分号不可以
表达式2可以省略
循环无终止进行
表达式3可以省略
设计者应保证循环正常结束
表达式1
设置变量初值的赋值表达式
与循环变量无关的其他表达式
表达式2
关系表达式或逻辑表达式
数值表达式或字符表达式
表达式1可以定义变量并赋初值
循环状态的改变
break语句
作用:提前终止循环,接着执行循环体下面的语句
循环嵌套时,只终止内层循环
只能用于循环语句和switch语句之中,不能单独使用
continue语句
作用:提前结束本次循环 ,接着执行下次的循环
6. 利用数组处理批量数据
数组
概念
数组:一批具有同名的同属性的数组
数组名
特点
数组是一组有序数据的集合
数组中的每一个元素都属于同一个数据类型
数组中的每一个元素可以由一个数组名和下标来确定
一维数组
定义
一般形式:类型符 数组名[常量表达式]
数组名的命名规则与变量名相同,遵循标识符号命名规则
常量表达式即数组长度
引用
只能引用数组元素而不能一次整体调用整个数组全部元素的值
表示形式:数组名[下标]
初始化
定义:定义数组时,给各数组元素赋值
类别
在定义数组时对全部数组元素赋予初值
此时可以不指定数组长度
部分数组元素赋值
空余位置用0补齐
数组元素全为0
此时可简写
二维数组
常被称为矩阵
定义
一般形式:类型说明符 数组名[常量表达式][常量表达式]
常量表达式前者为行,后者为列
存储时
元素排列顺序是按行存放的
各元素的排列是连续排列的,是线性的
引用
表示形式:数组名[下标] [下标]
初始化
类别
分行赋初值
全部赋初值
此时前一个下标可以省,但后一个不可以省
对部分元素赋初值
空余位置用0补齐
字符数组
定义
用来存放字符数据的数组
一个元素存放一个字符
初始化
在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的
定义时必须初始化
空余位置用空字符补齐
字符串
字符串的实际长度一定大于有效长度
字符串结束标志’\0’
遇到即表示字符串结束
输入输出
逐个字符输入输出
格式符:%c
将整个字符串一次输入输出
格式符:%s
注意
输出的字符中不包括结束符
用%s输出时,printf函数中的输出项是字符数组名
输出时遇到结束符结束
如果一个字符数组包含一个以上’\0’,则遇第一个输出就结束
scanf函数中输出项如果是字符数组名,不需要加地址符
字符串处理函数
输出
puts函数
作用:将一个字符串输出到终端
一般形式:puts(字符数组)
注意
输出的字符串可以包含转义字符
输出以空字符为终止
只能输出一个字符串
输入
gets函数
作用:从终端输入一个字符串到字符数组,包括终止符
一般形式:gets(字符数组)
注意
返回的函数值是字符数组的起始地址
只能输入一个字符串
连接
strcat函数
作用:把两个字符数组中的字符串连接起来,函数调用得到字符数组1的地址
一般形式:strcat(字符数组1,字符数组2)
注意
字符数组必须足够大
连接时将字符串1后面的空字符取消
复制
strcpy函数
作用:将字符串2复制到字符数组1中去
一般形式:strcpy(字符数组1,字符串2)
注意
字符数组1必须定义的足够长
字符数组1必须写成数组名形式
字符串2
字符数组名
字符串常量
本质上是逐个替代,因此字符数组1后面可能未变化
strncpy函数
作用:将字符串2中前面n个字符复制到字符数组1中去
一般形式:strncpy(字符数组1,字符串2,数值)
复制时不包括空字符
比较
strcmp函数
作用:字符串比较
一般形式:strcmp(字符串1,字符串2)
规则
将两个字符串自左至右逐个字符相比
全部字符相同,则认为两个字符串相等
若出现不相同的字符,则以第一对不相同的字符的比较结果为准
小写字母大于大写字母
结果值为整数
相同,函数值为0
大于,函数值为正整数
小于,函数值为负整数
计算长度
strlen函数
作用:测量字符串的有效长度
一般形式:strlen(字符数组/字符串)
大小写转换
strlwr函数
作用:转换成小写字母
一般形式:strlwr(字符串)
strupr函数
作用:转换成大写字母
一般形式:strupr(字符串)
使用时应当用头文件#include<string.h>
7. 函数
作用
用来完成一定的功能
函数的名字反映其代表的功能
注意
一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件
一个源程序文件可以为多个C程序共用
一个源程序文件由一个或多个函数以及其他有关内容
C程序执行从main函数开始,以main函数结束
所有函数都是平行的,互相独立
函数除了main函数之外可以相互调用,但不可以嵌套定义
分类
用户使用角度
库函数
用户自己定义的函数
函数形式角度
无参函数
有参函数
定义函数
先定义,后使用
函数定义
指定函数的名字
见名知意
指定函数的类型
指定函数的参数的名字和类型
指定函数的功能
定义方法
定义无参函数
一般形式
类型名 函数名() { 函数体 }
类型名 函数名(void) { 函数体 }
函数体包括声明部分和语句部分
定义有参函数
类型名 函数名(形式参数表列) { 函数体 }
定义空函数
类型名 函数名() {}
作用:程序的结构清楚,可读性好,以便扩充新功能方便,对程序结构影响不大
调用函数
一般形式
函数名(实参表列)
调用形式
函数调用语句
函数表达式
函数带回一个确定的值以参加表达式的运算
函数参数
数据传递
形式参数和实际参数
形式参数:在定义函数时函数名后面括号中的变量名称
实际参数:在主调用函数中调用一个函数是,函数名后面括号中的参数
虚实结合
定义:在调用函数过程中发生的实参和形参间的数据传递
注意
实参可以是常量,变量或表达式,但要求他们有确定值
实参和形参的类型应该相同或赋值兼容
调用过程
在定义函数中指定的形参,在未出现函数调用,他们并不占内存中的存储单元,在发生函数调用时,函数的形参被临时分配内存单元
将实参对应的值传递给形参
在执行函数期间,由于形参已经有值,就可以利用形参进行有关预的运算
通过return语句将函数值带回到主调函数
返回值的类型与函数类型一致
不需要返回值时就不用return语句,此时函数的类型应定义为void类型
调用结束,形参单元被释放,实参单元仍保留并维持原值,没有改变
实参向形参的数据传递是值传递,单向传递
形参的值发生改变,不会改变主调函数的实参的值
返回值
函数的返回值是通过函数中的return语句获得的
一个函数可以有1个以上的return语句
函数值的类型
在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致
函数类型决定返回值的类型
对于不带回值的函数,应当用定义函数为void类型
函数声明和函数原型
调用条件
被调用的函数必须是已经定义的函数
使用库函数时需要调用相应的库函数
如果使用用户自己定义的函数,而该函数的位置再调用它的函数后面,应该在主调函数中对被调用的函数做声明
函数原型
函数的首行(函数的首部)
作用:能减少编写程序时可能出现的错误
函数声明
函数的声明比函数定义中的首行多一个分号
一般形式
函数类型 函数名(参数类型1参数名1,…);
函数类型 函数名(参数类型1,…);
注意
对函数的定义和声明并不相同
函数的定义是指对函数功能的确立
包括指定函数名,函数值类型,形参及其类型以及函数体等
函数的声明的作用则是把函数的名字,函数类型以及形参的类型,个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查
函数的递归调用
定义:在调用一个函数的过程中出现直接或间接调用该函数本身
分类
直接调用
间接调用
数组作为函数参数
数组元素
只可以做实参,不可做形参
形参是被函数调用时临时分配存储单元 数组是一个整体
值传递
单向传递—从实参到形参
数组名
实参
传递数组首元素的地址
形参值的改变会影响实参
形参
注意
应该在主调函数和被调用函数分别定义数组
实参数组和形参数组数据类型应该一致
定义被调用函数时,指定其大小是不起任何作用的
因为C语言编程系统并不检查形参数组大小
在定义数组时可以在数组名后面跟一个空的方括号
多维数组名
实参
传递数组首元素的地址
形参值的改变会影响实参
形参
注意
在对形参数组定义时,第一维可以省略,第二维不可以
存储类别
按作用域区分
局部变量
在函数的开头定义
在函数内的复合语句内定义
注意
主函数内定义的变量也只在主函数中有效
不同函数中可以使用同名的变量
形式参数也是局部变量
包括
自动变量,即动态局部变量(离开函数,值就消失)
自动变量(auto变量)
包括
函数的形参
函数中定义的局部变量
定义:在调用函数时,系统会分配存储空间,结束时自动释放存储空间的变量
可以省略
自动变量在函数调用时赋初值
若定义时不赋值,则会分配一个不确定的值
静态局部变量(离开函数,值仍保留)
静态局部变量(syatic局部变量)
变量在函数调用后不消失而继续保留原值(占用的存储单元不释放)
静态局部变量属于静态存储类别,在静态存储区分配存储单元
静态局部变量在编译时赋初值,且只赋值一次
若定义时不赋值,则会分配0或空字符
其他函数不能调用
寄存器变量(离开函数,值就消失)
寄存器变量(register变量)
定义:将局部变量的值放在CPU的寄存器中,需要时直接从寄存器中取出参加运算
(形式参数可以定义为自动变量或寄存器变量)
全局变量
在函数的外部定义
注意
设置全局变量的作用是增加了函数间数据联系的渠道
存放在静态存储区中
不必要时不使用
全局变量在程序的全部执行过程中都占用存储单元
使函数的通用性降低
使用过多会降低程序的清晰性
作用域是从变量的定义处开始,到本程序文件的末尾
作用域的扩展与限制
在一个文件内扩展外部变量的作用域
在引用之前用关键字extern对该变量做外部变量声明,表示把该外部变量的作用域扩展到此位置
此时类型名可以省写
将外部变量的作用域扩展到其他文件
将外部变量的作用域限制在本文件中
在定义外部变量时加一个static声明
静态外部变量:加上static声明,只能用于本文件的外部变量
包括
静态外部变量(只限本文件引用)
外部变量(非静态的外部变量,允许其他文件引用)
按生存期区分
每一个变量和函数都有两个属性
数据类型
数据的存储类别
静态存储方式
定义:在程序运行期间由系统分配固定的存储空间的方式
包括
静态局部变量
静态外部变量(函数外部静态变量)
外部变量(用extern声明后,允许其他文件引用)
动态存储方式
定义:在程序运行期间根据需要进行动态的分配存储空间的方式
包括
自动变量(本函数内有效)
寄存器变量(本函数内有效)
形式参数(本函数内有效)
按变量值的存储位置区分
内存中静态存储区
包括
静态局部变量
静态外部变量(函数外部静态变量)
外部变量(允许其他文件引用)
内存中动态存储区
包括
自动变量
形式参数
CPU中的寄存器
包括
寄存器变量
变量声明和定义
定义:建立存储空间的声明
声明:不需要建立存储空间的声明
内部和外部函数
内部函数
只能被本文件中其他函数所调用
一般形式:static 类型名 函数名(形参表)
外部函数
可供其他文件调用
一般形式:extern 类型名 函数名(形参表)
extern可以省略
8. 指针
简介
指针
一个变量的地址称为该变量的指针
指针变量
专门用来存放另一变量的地址的变量
访问地址
直接访问
直接按变量名进行访问
间接访问
变量i的地址存放在另一变量中,然后通过该变量来找到i的地址,从而访问i变量
一组概念
p
指针变量名
*p
存储单元的值
指针变量
定义
一般形式
类型名 *指针变量名
定义时必须指定基类型
变量的指针的含义
存储单元编号表示的地址
指向的存储单元的数据类型
指针变量中只能存放指针,不能被赋其他值
指针变量可以有空值p=NULL
引用
给指针变量赋值
引用指针变量指向的变量
引用指针变量的值
做函数参数
作用:将一个变量的地址传送到另一个函数中
引用数组
数组元素的指针
定义
数组元素的地址
数组名代表数组中首元素的地址
p=&a[0];
p=a;
两者等价
引用时指针的运算
条件:当指针指向数组元素时可以进行以下运算
加一个整数
p+1指向同一数组中的下一个元素
减一个整数
p-1指向同一数组中的上一个元素
自加运算
*p++等效于*(p++)
先指向,再自增
*(++p)
先自增,再指向
++(*p)
指针指向内容的自增
自减运算
两个指针相减
前提:指针变量p1和p2都指向同一数组,
结果:两个地址之差除以数组元素的长度
意义:所指元素的相对距离
指针引用数组元素
方法
下标法
a[i]
指针法
*(a+i)
利用指针引用数组元素,比较方便灵活
数组名做函数参数
当用数组名做参数时,形参数组元素值的改变会影响到实参数组
实参数组名代表一个固定的地址
实参和形参的对应关系
形参和实参都用数组名
实参用数组名,形参用指针变量
实参和形参都用指针变量
实参为指针变量,形参为数组名
指针变量作实参时,必须有确定值,指向一个已定义的对象
引用多维数组
多维数组元素的地址
a
首行的首地址
*(a+0)
0行0列元素地址
a[0]
0行0列元素地址
*a
0行0列元素地址
a+1
1行首地址
&a[1]
1行首地址
*(a+1)
1行0列元素地址
a[1]
1行0列元素地址
a[1]+2
1行2列元素的地址
*(a+1)+2
1行2列元素的地址
&a[1][2]
1行2列元素的地址
*(a[1]+2)
1行2列元素的值
*(*(a+1)+2)
1行2列元素的值
a[1][2]
1行2列元素的值
指针变量
指向数组元素的指针变量
相当于将二维数组转化为一维数组
a[i][j]在数组中的相对位置的计算公式为i*m+j
指向一维数组的指针变量
作函数参数
引用字符串
字符串引用方式
以数组名和%s格式声明输出该字符串
数值型数组的元素只能逐个输出
用字符指针变量指向一个字符串常量,通过字符指针变量引用
字符指针做函数参数
实参和形参对应关系
均为字符数组名
字符数组名和字符指针变量
字符指针变量和字符数组名
均为字符指针变量
字符指针变量与字符数组的比较
字符数组由若干个元素组成,每个元素存放一个字符;而字符指针变量中存放的是地址
赋值方式
可以对字符指针变量赋值
不能对数组名赋值
初始化含义不同
把字符串第一个元素的地址赋值给字符指针变量
将字符串赋给数组中的各元素
存储单元内容
编译时字符指针变量只分配一个存储单元
编译时为字符数组分配若干个存储单元
指针变量的值是可以改变的,数组名是一个常量,不可改变
字符数组名各元素的值是可以改变的,但字符指针变量指向的字符串常量的内容是不可被取代的(即不可以对他们再赋值)
引用方式
均可以使用下标法和地址法
用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串
指向函数的指针
函数的指针
编译系统为函数代码分配的存储空间的起始地址
函数调用
通过函数名调用函数
通过指针变量访问它所指向的函数
使程序更简洁和专业
声明函数
定义函数指针变量
一般形式:类型名(*指针变量名)(函数参数表)
指向函数
指向时,只需要函数名而不用参数
一个指针变量可以先后指向同类型的函数
调用函数
调用时,只需将(*p)代替函数名即可
对指向函数的指针变量不能进行算术运算
用指向函数的指针作函数参数
指向函数的指针变量的一个重要用途就是把函数的地址作为参数传递到其他函数
返回指针值的函数
一般形式
类型名 *函数名(参数表列)
指针数组和多重指针
动态内存分配
malloc函数
原型
void*malloc(unsigned int size)
作用
在内存的动态存储区中分配一个长度为size的连续空间
返回值
成功则返回所分配区域的第一个字节的地址
失败则返回空指针
calloc函数
原型
void*calloc(unsigned n,unsigned size)
作用
在内存的动态存储区中分配n个长度为size的连续空间
返回值
成功则返回所分配区域的地址
失败则返回空指针
free函数
原型
void*free(void*p)
p应是最近一次调用calloc函数和malloc函数时得到的函数返回值
作用
在内存的动态存储区中分配n个长度为size的连续空间 释放指针变量p所指向的动态空间
返回值
无返回值
realloc函数
原型
void *realloc(void*p,unsigned int size)
作用
改变分配动态空间的大小
9. 其他数据类型
结构体
由用户自己建立的有不同类型数据组成的组合型数据类型
变量
声明
一般形式
struct 结构体名 {成员列表};
成员格式:类型名 成员名;
定义
先声明,再定义
声明类型与定义变量分离,比较灵活
声明同时定义
一般形式
struct 结构体名 { 成员列表 }变量名表列;
不指定类型名而直接定义变量
struct { 成员列表 }变量名表列;
初始化
定义时初始化
定义后初始化
引用
引用方式
结构体变量名.成员名
只能对结构体变量中的每个成员分别进行输入和输出
如果成员本身是结构体类型,则需要一级一级的利用成员运算符
结构体变量的成员可以进行各种运算
同类的结构体变量可以相互赋值
可以引用结构体变量成员的地址,也可以引用结构体变量的地址
结构体数组
定义
一般形式
struct 结构体名 {成员列表}数组名[数组长度];
先声明,再定义
结构体类型 数组名[数组长度];
初始化
在定义数组的后面加上={初值表列};
必须按顺序对应
结构体指针
指向结构体变量的指针
方法
结构体变量.成员名
结构体指针变量.成员名
结构体指针名->成员名
结构体变量及其指针作函数参数
用结构体变量的成员作参数
值传递
用结构体变量作实参
值传递
用指向结构体变量的指针作实参
链表
概念
链表:动态地进行存储分配的一种数据类型
头指针
结点:链表中的每一个元素
用户需要的实际数据
下一个结点的地址
表尾
静态链表
所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放
动态链表
在程序执行过程中,一个一个的开辟结点和输入各结点的数据,并建立起前后相连的关系
建立链表
输出链表
共用体
共用体:使不同的变量共享同一段内存的数据结构
一般形式
union 共用体名 {成员表列 }变量表列;
定义类型
声明的同时定义
分开进行
引用
不能引用共用体变量,而只能引用共用体变量中的成员
特点
同一个内存段可以用来存放不同的数据类型,但在每一瞬间只能存放其中一个成员
可以对共用体变量初始化,但初始化表中只能有一个常量
允许对指定的一个成员初始化
共用体变量中起作用的是最后一次被赋值的成员
共用体变量的地址和他和成员的地址是同一地址
不能对共用体变量名赋值
允许同类型的共用体变量互相赋值
枚举类型
枚举类型:只有几种可能的值的变量的数据类型
一般形式
enum[枚举名]{枚举元素列表}
注意
每一个枚举元素都代表一个整数,默认从0开始
可以按初始化时指定的数值进行判断比较
10. 文件处理
基本概念
文件
存储在外部介质上数据的集合
程序文件
源程序文件.c
目标文件.obj
可执行文件.exe
文件的内容是程序代码
数据文件
映像文件(二进制文件)
文本文件(ASII文件)
在存储前需要进行转换
供程序运行时读写的数据
数据流
数据的输入输出
表示信息从源到目的端的流动
包括
标准输入流
标准输出流
标准出错输出流
文件名
唯一的文件标识
包括
文件路径
文件名主干
命名规则遵循标识符的命名规则
文件后缀
表示文件的性质
文件缓冲区
缓冲文件系统
系统自动的在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区
文件类型指针
打开关闭文件
fopen函数
一般形式
fopen(文件名,使用文件方式)
使用文件方式
r
只能用于向计算机输入而不能用作向该文件输出数据
w
只能用于向该文件写数据,而不能用来向计算机输入
a
在文件尾添加数据
rb
wb
ab
打开二进制文件
+
即可输入,也可用来输出
文件读写位置标记在文件末尾
常用方法
if((fp=fopen("file","r"))==NULL) {printf("cannot open the file\n"); exit(0); }
fclose函数
一般形式
fclose(文件指针)
顺序读写数据文件
读写字符
fgetc函数
调用形式:fgetc(fp)
功能:从fp指向的文件读入一个字符
输出成功,返回输出的字符串
输出失败,返回EOF(-1)
fputc函数
调用形式:fputc(ch,fp)
功能:把字符串ch写到文件指针变量fp所指向的文件中
输出成功,返回输出的字符串
输出失败,返回EOF(-1)
feof函数
功能:检查文件读写位置标记是否移到文件末尾
读写字符串
fgets函数
调用形式:fgets(str,n,fp)
功能:从fp指向的文件读入一个长度为n-1的字符串,存放在字符数组str中
输出成功,返回地址str
输出失败,返回NULL
fputs函数
调用形式:fputs(str,fp)
功能:把str所指向的字符串写到文件指针变量fp所指向的文件中
输出成功,返回0
输出失败,返回非0值
格式化方式读写文件
fprintf(文件指针,格式字符串输出表列)
fscanf(文件指针,格式字符串输出表列)
二进制方式读写
fread(buffer,size,count,fp)
fwrite(buffer,size,count,fp)
释义
buffer:地址
用来存放从文件读入的数据的存储区的地址
把此地址开始的存储区中的数据向文件输出
size:要读写的字节数
count:要读写多少个数据项
随机读写数据文件
文件位置标记及其定位
文件位置标记
文件位置标记的定位
rewind函数
功能:使文件位置标记指向文件开头
形式:rewind(fp)
fseek函数
功能:改变文件位置标记
形式:fseek(文件类型指针,位移量,起始点)
起始点
文件开始位置
名字:SEEK_SET
用数字代表:0
文件当前位置
名字:SEEK_CUR
用数字代表:1
文件末尾位置
名字:SEEK_END
用数字代表:2
位移量
以起始点为基点
数据类型:long型
一般用于二进制文件
ftell函数
功能:测定文件位置标记的当前位置
形式:ftell(fp)
相对于文件开头的位移量表示
文件读写出错检测
ferror函数
调用形式:ferror(fp)
返回0则表示未出错
返回非0表示出错
clearerr函数
交换值
降序排列3个整数
用户区
程序区
动态存储区
函数形式参数
函数中定义的没有用关键字static声明的变量,即自动变量
函数调用时的现场保护和返回地址等
静态存储区
全局变量
汉诺塔问题
分析
将n-1个盘从一个座上移到另一个座上
将一个盘子从一个座上移到另一个座上
代码
打擂台算法
排序
冒泡排序
优点:比较简单,空间复杂度较低,是稳定的
缺点:时间复杂度太高,效率慢
选择排序
优点:一轮比较只需要换一次位置
缺点:效率慢,不稳定
两种比较
区别
冒泡排序是比较相邻的两个数;选择排序是按顺序比较,找最值
冒泡排序每一轮比较后,位置不对就要换位置;选择排序则每一轮只换一次
冒泡排序是通过数找位置;选择排序也是通过位置找数
循环的比较
一般情况下可以相互替代
while语句需要在循环体内完成自增,for语句则不用
while语句需要先行设置初值
三中循环可以用break语句和continue语句结束循环
补充
优先级
条件运算符优先于赋值运算符,低于关系运算符和算术运算符
赋值语句
赋值运算符
=
复合的赋值运算符
赋值表达式
定义:将一个变量和一个表达式连接起来的式子
一般形式:变量 赋值运算符 表达式
作用:将一个表达式的值赋给一个变量
计算
赋值
左值
一般为变量
右值
赋值过程中的类型转换
类型一致,直接进行赋值
类型不一致
浮点型数据赋给整型变量时,舍弃小数部分
整型数据赋给单双精度变量时,数值不变,但以浮点数形式存储到变量中
double型数据与float变量互换时,改变有效数字
字符型数据赋给整型变量时,,赋给ASCII代码
将一个占字节多的整型数据赋给占字节少的整形变量或字符变量时,只将其低字节部分赋给变量
赋值语句
变量赋初值
类型转换
强制类型转换
系统自动进行的类型转换
常量类型
整型常量
不带小数点的数值
存储单元长度:2个字节(或者按照其数值大小系统自动改变数据类型,更改存储单元长度)
浮点型常量
凡以小数形式和指数形式出现的实数
存储单元长度:8个字节
C程序中的实型常量都是双精度浮点型常量