高级语言程序设计——从C语言到c++(西安电子科技大学出版社)

C语言(大一上)

第一章
1、源程序文件 .c 目标程序文件 .obj 可执行文件. exe
2、c语言的注释(不对程序运行产生任何作用;在源程序中对特定的代码进行解释,起的标记相应代码的作用,增强程序的可读性)
单行注释:// 双斜线到本行结束为注释部分
多行注释:// 两个符号之间均为注释,无论是在一行或者多行
3、c语言程序设计的基本单位是函数
4、在一系列的函数中,必须有一个也只能有一个以main为名的函数,这个函数称为主函数。整个函数从主函数开始执行,一般也是以主函数结束。
5、c语言的语法规定“;”是一条语句的终止符号,每一条可执行语句都必须以分号结束;多条语句可以在一行书写,也可以在多行书写。
6、变量(程序中用来存放数据的对象,在程序运行期间值可以被改变)
C语言规定变量必须先定义,后使用,包括定义变量的数据类型和数据名。
定义变量名的规则:
1 )变量名只能由数字、字母和下划线组成
2 )变量名的第一个字符只能是下划线或者字母
注意:
1、大小写对于变量名是不同的
2、不能使用main等c语言的字符作为变量名
3、变量不能重复定义(若变量重复定义,则编译器会给出错误信息)
4、若变量在定义之后、使用之前并没有赋值,变量中储存的数据不稳定,则编译程序时不会出错,但程序的执行结果会出错。
变量的赋值可以在定义的时候,也可以在使用时。
定义变量的同时对变量进行赋值称为变量的初始化。
7、 标准输入输出函数
printf函数(格式控制字符串,变量列表)
scanf函数(格式控制字符串,变量列表)
注意:
1、函数printf可以只有一个参数,即省略参数变量列表
2、函数scanf中变量列表的每一个变量前都需要有地址符号“&”
8、函数
函数的定义包括两部分:函数头 函数体
函数名的定义规则同变量名一样
定义的基本格式:
数据类型 函数名(参数列表) //函数头
{ //函数体
语句…

}
函数的声明:
数据类型 函数名(参数列表)

第二章
c语言的基本数据类型包括整型、浮点型。
整型类:包括字符型、枚举型、整型。其中整型又包括短整型、整型、长整型、长长整型。
浮点型:包括单精度型、双精度型、长双精度型。
第一节
1、整型数据:没有小数点部分的整数数据。
整数数据以二进制补码形式在内存中存储。
整型常量(整型常数,可正可负)的三种形式:八进制整数(0开头)、十进制整数、十六进制整数(0x开头)
二进制
进位规则:逢二进一
借位规则:借一当二
数据在计算机中主要是以二进制补码的形式存储。对于正数,原码、反码、补码都是一样的。对于负数而言,其补码等于其绝对值的反码加1。
2、整型变量
基本类型:int
短整型:short int(short)
长整型:long int (long)
双长整型:long long int (long long)
字节是数据存储的单位。
整型数据的正负之分,在c语言中是用有符号数与无符号数的概念来定义的。修饰符:有符号(signed)、无符号(unsigned);无符号表示该数据一定为正。
数据溢出:数值超过了该类型的取值范围。数据溢出,一般c语言编译器不会报错。
附表1 整型数据的取值范围
3、整型常量
附表2 整型常量的后缀
4、整数的存储
系统根据数据类型分配存储空间,先将整数转化为二进制数,写出其的二级制补码,从右治左填(填完后若前面有空位,进行补零)。有符号数,其最左边一位(最高位)表示符号位,该位数字为1,表明其为负数;若该位数字为0,则表示其为非负数(0或正数)。负数在计算机中存放的补码是该数的绝对值的原码取反再加1。(步骤:负数取绝对值——对其取反(0变1,1变0)——再加1)
第二节
字符型数据在计算机中是以对应的ASCII码来存储的,并且字符型数据也以其对应的ASCll 码值参与运算。
ASCll码使用指定的7位二进制数组合来表示,其中包含了英文26个大写字母,26个小写字母、数字1-9、33个英文标点符号以及33个控制字符。
附表3 ASCll码表
1、字符型变量
字符型变量:存放程序中使用的字符型数据,关键字char
unsigned与signed定义字符型变量时,两者取值范围不同。
附表4 字符型数据的存储单元长度和取值范围
2、字符型常量(单字节字符)
字符型常量是单引号括起来的字符,如’a’
附表5 转义字符表
八进制转义字符\(377是八进制转义字符的上限)
十六进制转义字符\x(\xFF是十六进制转义字符的上限)
第三节
1、浮点型数据的三种类型:单精度(float) 双精度(double) 长双精度(long double)
其有效数字分别为六位,15-16位,18-19位。
2、浮点型数据再内存中的存储方式,由三部分构成:
符号 尾数部分 指数
尾数部分占的位数越多,表示的浮点数的有效数字越多,精度越高;指数部分占的位数越多,则能表示的数值范围越大。
3、浮点数只能近似地表示某个实数
4、C语言标准中,在一个实数向浮点数进行格式转换时,只保证六位有效数字。
5、常用1e-6(即0.00001)表示很小的数,当某个浮点数小于此数时,即可认为该数趋近于0;若两个浮点数的差小于1e-6,则可认为这两个浮点数相等。
6、浮点型常量
表示:
浮点数后加上后缀,f或F表示float型,l或L表示double型。无后缀,默认double型。
科学计数法,用指数符号(e或E)进行表示 浮点数e+(-)指数
第四节
输入输出相对计算机而言;输入:键盘、鼠标;输出:显示器、打印机
标准输入输出函数被定义在头文件“stdio.h”中,其中包括与标准输入输出有关的变量定义、宏定义和对于函数的声明。
1、printf函数(输出列表可以省略)
Printf函数包含两个参数:格式控制字符串 输出列表
输出列表所要输出的数据个数应该与格式控制字符串中指定的数据格式的个数一一对应。(当输出列表中的个数大于格式控制字符串中的个数:多,输出错误数据;少,多出的那一部分不被输出)
2、格式控制字符(将输出数据转换为指定格式)
一般形式 %[标识][宽度][精度]格式控制符
附表6 printf格式控制符
3、标识
标识 格式控制符 输出
未指定 右对齐,左边填充0或空格

  •   左对齐,右边填充0或空格
    
  •   输出结果为有符号数
    

空格 输出结果为正数,显示空格;输出结果为负数,显示负号。
#o 加前缀0
x或X 分别加上前缀0x,0X
g或G 显示小数点和无意义的0
E或e或f 显示小数点
c,d,i,s,u 无作用
4、[宽度][精度]
整型数据,[精度]无作用。指定宽度为m时,若输出的整型数据的位数小于m,左端补空格;若输出的整型数据的位数大于m,按实际长度输出。
浮点型数据,两个均有作用。宽度作用同整型数据;精度:指定精度为n,若浮点型数据的小数点后位数小于n,则右端补0;若大于n,四舍五入输出n位小数。
若精度大于宽度,忽略宽度。
4、scanf 函数
scanf函数的两个参数:格式控制字符串 地址列表
地址列表中包含的是不同变量的地址,而不是变量名。&,取地址运算符。
地址列表所要包含的地址个数应该与格式控制字符串中指定的数据格式的个数一一对应。
Scanf 函数没有标识和精度控制项
附表7 scanf函数中的格式控制符
在格式控制字符串中,除了格式控制符和其他字符,在输入数据时应该输入与这些字符完全相同的字符,并且按照顺序输入。
注意:
1、输入数据的间隔
2、连续输入字符时,包括分隔符和转义字符在内的所有可以用键盘敲入的字符都被视为有效的字符输入。
3、连续输入数据时,以下符号可以间隔数据
空格符、水平制表符、回车换行符;
不属于数值的非法字符;
使用域宽设定数据长度
4、getchar函数与putchar函数
getchar函数:输入一个字符
putchar函数:输出一个字符
一般格式 getchar() putchar()

第三章
第一节
1、运算符:特定的符号,用来表示对数据执行的特定操作(操作符)
2、分类标准:参与运算对象的多少
分类:单目运算符(一元) 双目运算符(二元) 三目运算符(三元)
分类标准:参与运算的对象的结合方向
分类:从左到右 从右到左
分类标准:实现运算对象的作用不同
分类:算数运算符 赋值运算符 关系运算符 逗号运算符 操作运算符等
3、表达式的最基本形式是一个数据,也称为操作数(操作数可以是任何形式的常量和变量)
4、C语言规定了运算符的优先级和结合性
注意:a=b=2+3表达的意义:用b=2+3给变量a赋值
5、表达式和语句的区别:表达式的结尾不加分号,二语句必循以分号标识结束。
表达式语句:表达式+分号
第二节
1、算术运算符为双目运算符,结合性从左到右,包括+,-,,/,%。运算符%称为模运算符或者求余运算符。
2、运算符的优先级
+,-低;
,%,/高
注意:
1、除法运算符“/”连接的两个操作数为整型数据时,结果向零取整,不进行四舍五入,直接舍去小数部分。(5/2=2)
只有除法运算符连接的两个操作数中有浮点型数据时,才会出现小数部分。(5/2.0=2.5或5.0/2=2.5)
2、求余运算符“%”连接的两个操作数必须同为整型数据。
第三节
1、赋值运算符为双目运算符,结合性为从右到左,包括赋值运算符(=)和复合赋值运算符(*=,/=,%=,+=,-=),赋值运算符的优先级低于算术运算符
2、赋值运算:将运算符右边的额数赋给左边的数
注意:1、赋值运算符左边的操作数必须为变量(有接受数据的存储单元)
2、右边的操作数可以是常量,变量,以及表达式,只要保证要确定的值就可以。
3、赋值运算符两侧的操作数类型不一致时,系统自动将右操作数的类型转换为左操作数(变量)的类型。(数据类型转换时,注意转换前后的取值范围是否越界)
第四节
1、自增自减运算符,单目运算符,结合性从右到左,包括++,–。自增自减运算符的优先级大于算术运算符
2、自增运算符“++”:实现对操作数的值加1
自减运算符“–”:实现对操作数的值减1
3、自增运算符,自减运算符要求操作数的值时允许被改变的,即操作数必须时变量(更新后的值能够被存储)
4、区分i++与++i
++i:先执行i=i+1,再使用i的值
I++:先使用i的值,再i=i+1
第五节
1、关系运算符,双目运算符,结合性从左到右,包括<,>,<=,>=,,!=
2、符号
表示等于,即判断两个操作数是否相等;符号!=表示不等于,即判断或者比较两个参与运算的操作数是否相等
3、操作数可以是变量,也可以是常量或者表达式,但是操作数必须右一个确定的值。
4、关系运算符的优先级:<,>,<=,>=大于==,!=
5、关系表达式用于判断这两个操作数之间的关系是否成立,如果关系成立,则表达式的结果为真,即表达式的值为1;如果关系不成立,则表达式的结果为假,即表达式的值为0.此外,也规定了表达式的值为int型,输出的控制字符要使用%d。
注意:关系表达式的值不是整型数值1或者就是整型数值0
第六节
1、逻辑值:“1”表示该逻辑运算的结果式“成立”;“0”表示该逻辑运算的结果是“不成立”。
2、逻辑运算符:单目运算符(!) 双目运算符(&&、 ||)
注意:逻辑运算符不关心操作数的值具体为多少,只需要知道操作数的值是否为0,将0的操作数转换为逻辑值“假”;将值为非0的操作数的值转换为逻辑值“真”
3、符号&&表示逻辑与,双目运算符,左右两边操作数的值全部为真(值为非0),表达式的结果才为真(值为1),否则表达式的结果为假(值为0),即“全真才真”
4、符号||表示逻辑与,双目运算符,左右两边操作数的值全部为假(值为0),表达式的结果才为假(值为0),否则表达式的结果为真(值为1),即“有真就真”
注意:&&运算符与||运算符具有“短路”特性,即一旦能够确定最终结果,便不执行后续的运算。
5、符号!表示逻辑非,单目运算符,结合性从右至左,作用是:对操作数的值取反,即颠倒0和1
附表9 逻辑运算的真值表
非0 的值都认为是真,而将0值认为是假
注意:0与什么都是0;真或什么都是真
当逻辑或运算符的第一个操作数为真时,忽略对另一个操作数的运算,直接得到该表达式的结果为真。
第七节
C语言中的逗号的用途:
1、作为分隔符使用;
2、作为运算符使用;
1、逗号运算符,又称为“顺序求值运算符”,结合性从左到右;即按照从左到右的顺序,依次计算各个表达式的值;整个逗号表达式的值即为表达式n的值。
第八节
1、系统自动将运算符连接的不同类型转换为同一类型,称为“隐式类型转换”
2、隐式转换的规则:将“短”的数据累心转换为“长”的数据类型,精度低的向精度高的转换,取值数值范围小的向取值范围大的转换,以提高运算精度。
附表10 隐式强制类型转换规则
注意:隐式类型转换值针对参与计算的数据的类型进行转换,并不实际改变变量的类型。
第九节
1、强制转换类型符为单目运算符,优先级与+,-,%相同。
注意:区分隐式类型转换与强制类型转换
隐式类型转换是为满足计算机的需要而由系统自动实现的,这样的类型转换是符合算法要求的;强制类型转换是由设计者人为控制的,在处理前要看其转换是否会影响算法的逻辑性和结果的正确性。
强制类型转换值针对参与计算的数据的类型进行转换,并不实际改变变量的类型

章末注意:
1、判断两个变量或者表达式的值是否相等的关系运算符是“==”,而不是“=”
2、逗号表达式的值为最好一个操作数的值
3、除了赋值运算符,所有双目运算符的结合性都是从左至右
4、除了“()”运算符外,单目运算符的优先级最高,结合性从右至左
5、“&&”和“||”都具有短路特性
附表11 运算符及其优先级

第四章
结构化程序设计的三种基本结构:顺序结构 循环结构 选择结构
三种结构都遵循的原则:一个入口,一个出口

第一节
1、顺序结构:(最简单)结构中各语句按自上而下的顺序依次执行
2、顺序结构在执行的过程中不会有任何的跳转或变化
第二节
1、选择结构:程序根据对当前条件的判断,选择不同的分支执行指定的语句。
2、分类标准:分支的多少
分类:单分支 双分支 多分支
分类标准:使用的关键字不同
分类:if语句 switch语句
3、if语句
基本形式:单分支选择结构,双分支选择结构,多分支选择结构
单分支选择结构:
(1)基本格式
if(表达式)
语句1;
或者
if(表达式)
{
语句1;
语句2;
…;
语句n;
}
(2)括号内的表达式即为单分支选择结构是否执行的条件。如果条件成立,即表达式的值为非0,执行选择结构中的语句;如果表达式不成立,即表达式的值为0,则不执行选择结构中的语句,直接执行选择结构后的语句。(结构图)
(3)注意:若选择结构中必须包含多个语句,需要用“{”和“}”括起来,形成复合语句;复合语句要么全部执行,要么一条也不执行。
双分支选择结构
(1)基本格式
if(表达式)
语句1;
else
语句2;
或者
if(表达式)
{
语句1;
语句2;
…;
语句n;
}
else
{
语句1;
语句2;
…;
语句n;
}
(2)括号内的表达式即为单分支选择结构是否执行的条件。如果条件成立,即表达式的值为非0,执行选择结构中的语句;如果表达式不成立,即表达式的值为0,则不执行选择结构中的语句,直接执行选择结构后的语句。(结构图)
(3)注意:两条路线,只能选择其中一条或一组执行
多分支选择结构
(1)基本格式
if(表达式1)
语句1;
else if(表达式2)
语句2;

else if(表达式n-1)
语句n-1;
else
语句n;
4、if语句的嵌套
If语句的嵌套:if语句中包含一个或多个if语句
基本格式:
if(表达式1)
if(表达式2)
语句1;
else (表达式3)
语句2;
else
if(表达式4)
语句3;
else(表达式5)
语句4;
注意:if语句的书写,确定每一层的错位。
选择判断语句中出现if…else结构时,无论是否if语句嵌套,也无论嵌套了多少层,else总是与距离它最近的if匹配成对
在if和else之后有且只能有一条内嵌语句,若要包含多条语句,需要用花括号将几个语句限定成一条复合语句。
If语句可以嵌套,但是必循是一条if语句完整地包含另一个if语句,即两个分支结构可以嵌套但是不能有交叉。
5、条件运算符(三元运算符)
基本格式:
表达式1?表达式2:表达式3
执行过程:先计算表达式1的值,如果为真,执行表达式2;如果为假,执行表达式3.
条件运算符可以自成一条语句,也可以作为一条语句的组成部分出现
6、switch语句
(1)基本格式
switch(表达式)
{
case 整型常量表达式1; 语句1; break;
case 整型常量表达式2; 语句2; break;

case 整型常量表达式n-1; 语句n-1; break;
default; 语句n; break;
}
注意:
1、语句部分可以是一条语句,也可是多条语句。Switch语句的格式中,即使是多条语句,也不强制使用花括号。
2、语句后的break表示停止、中断,即结束对switch语句的执行。
3、Default语句部分指缺省情况,如果switch中所有语句都不执行,就执行default 语句。
4、Case之后的常量可以是整型常量,也可以是常量表达式,并且不能出现两个case之后的常量表达式的值相同的情况。(即每一个case分支的整型常量表达式的值必须互不相同)。
5、若switch中表达式的值与任意一个case之后的值都不匹配,而且该语句后也没有default部分,则不执行switch中的任何语句。
6、Switch语句用花括号限定一个复合语句,其中可以包含多条case语句和最多一条default语句。

第三节
1、循环结构的特点:在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环调件,反复执行的程序段称为循环体。
2、While循环(当型循环)
处理过程:先判断表达式是否成立(即对表达式求解),如果表达式成立(值为非0),则执行循环体中的语句;执行完中,再次对表达式求解,只要表达式的值为非0,则循环体会被反复执行;直到表达式的值为0(即循环条件不成立),才结束循环结构的执行。
3、do-while循环(直到型循环)
(1)基本格式:
do
语句1;
while(表达式);
(2)处理过程:首先执行循环体中的条件,然后求解while表达式的值,只要表达式的值为非0(即循环条件成立),循环体将被反复执行,直到表达式的值等于0(循环条件不成立)。
4、while与do-while的基本区别
Do-while型循环结构中的循环体至少会被执行一次,而while型循环结构可能一次都不会被执行。
5、for循环
(1)基本格式
for(表达式1;表达式2;表达式3)
语句1;
或者
for(表达式1;表达式2;表达式3)
{
语句1;
语句2;

语句n;
}
表达式1:控制循环控制变量的初始化,一般式赋值表达式
表达式2:循环条件,一般为关系表达式或者逻辑表达式
表达式3:通常用于更新循环控制变量的值,使循环条件能够不成立,从而结束循环,一般多为自增或自减表达式。
(2)执行过程
变量的初始化——判断循环条件是否成立——更新循环变量的值——判断循环条件是否成立…
注意:
1、表达式1,3的位置上可以出现逗号表达式
2、任意省略表达式1、2、3和循环体内的语句可以被省略(相应位置的分号不能省)
3、循环结构中的表达式2也可以被省略,但是当它被省略后,就没有了循环条件,即循环将永远地执行下去。
4、循环结构中的表达式3也可以省略,求解表达式的过程即更新循环变量的过程,使得循环条件不成立,从而结束循环。如果省略表达式3,则需要在循环体语句中保证循环条件可以不成立,以便结束循环,避免姓曾死循环。
5、三种循环的比较
循环变量的初始化:while型 和do-while循环循环变量的初始化应该在进入语句之前完成;for循环中可由表达式1实现。
循环结束条件:while和do-while语句,循环体内应包含使循环趋于结束的语句;在for循环中可由表达式3实现。
6、循环结构的嵌套
循环结构的嵌套:一个循环结构包含另一个完整的循环结构
注意:循环嵌套只能是一个循环结构包含另外一个完整的循环结构,即两个循环结构可以套但是不可以交叉。
7、break语句与continue语句
Break语句:可以出现在switch结构中,并且可以用于三种循环结构中,可以结束其所在的选择结构或者循环结构的执行。
Continue语句:只能出现在循环结构中,执行continue语句可以提前结束本次循环,即循环体内continue语句后的语句将不再执行,而直接进入下一次循环的判断执行。
Break语句与continue语句的区别:
Continue语句只结束本次循环;而break语句则结束整个循环
Continue语句只限于循环结构,break语句则可以用于循环结构和switch结构

第五章
数组:数组是具有同一类型的有序数据的集合
第一节
1、一维数组
(1)基本格式:
类型符 数组名 [常量表达式]
类型符:用于指定数组的数据类型
数组名:表示某一个特定数组的标识符
[常量表达式]用来表示数组长度,说明所包含元素的个数
注意:C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值,因此方括号中的“常量表达式”可以是整型常量或整型常量表达式,但不能是常量。
(2)数组元素的应用
c语言规定,数组必须先定义,后使用。
数组中的每个元素的类型由数组的类型决定,每一个数组元素由统一的数组名和唯一的下表决定。下标可以是常量,变量或者表达式,但必须有确定的整数值。
数组的下标从“0”开始;所有元素以各自的下标为顺序,在内存中占用一段连续的存储单元。
注意:在定义数组和引用数组元素中[ ]中表达式表达的含义不同
定义数组中,“[ ]”中的数据不能是变量,其值代表数组长度,即元素个数。
引用数组元素时,“[ ]”中的数据可以是变量,其值代表元素的下标,即元素在数组中的位置。
(3)一维数组初始化
数组的初始化:在定义数组的时候,同时为各数组元素赋值。
初始化的几种方式:
直接为全部元素赋值,按顺序将数值一次赋给数组中各元素
int a[10]={1,2,3,4,5,6,7,8,9,10};
省略数组长度,可以由初始化式中数值的个数确定其长度

若初始化中数值的个数小于数组的长度,则不足的部分默认初始值为0
利用上一特性,可以方便地为全部元素赋初值0
注意:
初始化式以花括号限定,初始化式不允许完全为空,即花括号内至少要有一个数值。
(4)一维数组的存储形式
数组的所有元素在内存中以连续字节的形式存放,数组内各元素所占内存的大小由该数组的数据类型决定。整个数组所占内存的大小=一个元素所占内存的大小*元素个数
数组名本身就是数组首元素的地址。
引用数组元素时,首先通过数组名找到该数组的起始地址,再通过元素下标计算出该元素的地址。
注意:C语言不对数组的越界访问进行检查,即可以把数组存储单元以外的存储单元当作这个数组的元素来访问

第二节 二维数组
1、二维数组的定义
基本格式
类型符 数组名 [常量表达式][常量表达式]
类型符:指定数组的数据类型
常量表达式:指定二维数组的行数,列数
数组长度(元素个数)=行数列数
二维数组的行、列下标都是从0开始的
注意:二维数组在内存中以“行优先”的原则存储元素
二维数组所占内存大小=长度
数据结构所占的内存
2、二维数组元素的引用
二维数组常与两层嵌套的循环结构结合使用,通过外层循环控制行下标及内层循环控制列下标
3、二维数组的初始化
初始化的几种形式
在初始化式中,以花括号来限定数组中每一行的值
省略上式中的限定行的花括号,按元素在内存中的排列顺序依次赋值
当可以通过初值的个数确定数组的长度时,可以不指定行的长度,但是列的长度不能省略。
若初值的个数小于数组的长度,那么初始化中的不足部分默认为0
按初始化在花括号的限定依次为各行中的元素赋初值,不足部分默认为0
为某一行赋初值0,限定行的花括号不能省略且至少包含一个初值0

第三节 符数组
字符数组:用来存放字符型数据的数组
字符数组中的每一个元素在内存中占用一个字节的存储单元,用来存取一个字符
1、字符数组的定义
基本格式
char 数组名[常量表达式][常量表达式]
2、字符数组的初始化
几种初始化常用的形式:
按元素在内存中的排列顺序,将字符一次赋给数组中各元素。如果花括号中所提供的字符个数大于数组长度,则按语法错误处理。
在定义字符数组时,若为全部元素赋初值,对于一维数组可以省略数组长度。
如果初始化式中字符个数小于数组长度,则不足部分默认为空,即“\0”
注意:字符数组的初始化与数值数值的初始化基本相同,只是初始值为字符常量,由单引号限定。
3、字符数组的引用
%c:用来逐个引用数组元素
4、使用字符数组处理字符串
注意:
字符串是字符数组;字符数组不一定是字符串
C语言规定字符“\0”作为字符串结束的标志
使用字符初始化字符数组时,初始化式由花括号限定且每个初值由单引号限定,字符初值之间用逗号隔开;使用字符串初始化字符数组时,初始化式的花括号可以省略,整个字符串由双引号限定。同时,系统会自动向数组的末端添加一个字符“\0”作为结束标志。
因此,使用字符串定义的数组长度为字符串长度再加一个字节。
注意:如果数组长度小于字符串长度,字符串中多出的字符将不被存储。
5、字符串的输出与输入
%s:将字符串一次性的输入或输出
(1)以%s形式输出字符数组
输出列表参数不是数组元素(变量),而是数组名(数组的首元素地址)
系统从字符数组的首元素地址开始,将存储单元内的字符依次输出,直到遇见(但不包括)第一个“\0”(空字符)为止。
(2)以%s形式输入字符数组

系统从字符数组的首元素地址开始,将连续输入的字符一次写入存储单元,直到遇到输入的分隔符(制表符“Tab”、空格“Space”或者回车符“Enter”),在有效字符后自动添加一个“\0”,并且结束输入。
注意:在对字符进行初始化的时候,若字符串长度小于数组长度时,多出的数组长度全部被赋值为“\0”;而使用“%s”输入数组时,遇见第一个分隔符时,系统旨在有效字符后面添加一个“\0”,其余多出的数组元素,其值并不确定。
(3)以%s的形式一次性输入与输出多个字符串
注意:在输出时,需要认为地添加字符串数组之间的分隔符号

第四节
字符串输出函数(puts函数)与字符串输入函数(gets函数)
1、puts函数
作用:以第一个“\0”作为结束标志,用一个字符数组中的有效字符输入到终端,并将“\0”转换为“\n”输出
调用的一般格式
Puts(字符数组名);
注意:puts函数的参数只要一个,所以只能用于输出一个字符数组;若需要输出多个字符串,则需要调用多个puts函数
2、gets函数
作用:以回车键“Enter”作为结束标志,将一个字符串数组输入到字符数组中,并且将“Enter”转化为“\0”输入
调用的一般格式
Gets(字符数组名);
注意:两个函数均不关心字符数组的大小,因此必须将用于输入,输出的字符数组长度定义得足够大,否则将导致输入、输出越界
使用gets函数输入字符串,只在有效字符后面添加一个“\0”,字符数组中为写入部分的元素,其值并不确定。
字符串处理函数被定义在头文件<string.h>

第五节应用
本章的几个函数
一维数组的应用:将一组数据逆序输出
二维数组的应用:寻找数组内元素的最大最小值 矩阵相乘的算法
求矩阵对角线元素之和 寻找二维数组的鞍点

第六章 函数
使用函数的目的:实现特定的功能
函数的分类
分类标准:程序设计的角度
分类:标准库函数(根据C语言标准定义的,设计程序时只需要包含相应的头文件即可调用)自定义函数(为解决专门的程序需求而自行编写的函数)

第一节
1、定义函数的基本格式
返回值类型 函数名(形式参数列表)
{
声明部分;
语句部分;
}
函数的定义包括两部分:函数首部 函数体
函数首部:即从“{”开始,到“}”结束的代码块
函数体:声明部分 语句部分
程序在执行的过程中,主函数可以通过函数名调用不同的函数,即将程序的控制权交给被调用函数,并且执行被调用函数的函数体,以实现被调用函数的特定功能。在被调用函数结束后,程序的控制权又回到主函数的调用位置,继续执行主函数体内的后续语句。
2、函数名
函数名,即函数的标识符。
程序是通过函数名来找到该函数所在内存单元的,从而实现对该函数的调用。
3、返回值类型与return语句
函数的类型即是定义时的返回值类型,一般情况下,函数完成特定的功能或者数据处理之后,会将处理结果反馈给调用者(也称为主调对象),这个被反馈的结果称为返回值。
注意:
(1)在绝大多数情况下,函数定义的返回值类型与return语句中的返回值的数据类型一致。
(2)在定义函数时,如果不规定返回值的类型,则默认该函数返回值类型为int型。
(3)如果调用某一个函数只是为了实现一组特定的操作,而不需要获得反馈的结果,可将该函数的返回值类型定义为void型,函数体内则不需要使用return语句。(比如空函数,在程序设计中起到临时占位的作用,为以后的程序或则功能扩展留下空间)。
(4)函数定义的返回值类型与return语句中返回值的类型不一致时,则以函数定义的返回值类型为准,将return语句中返回值数据进行强制转换。
(5)Return语句中的返回值可以是常量。
(6)一条return语句只能有一个返回值;一个函数可以有多个return语句,但是程序执行的过程中只能有一条return语句会被执行。
(7)一旦执行return语句,把处理结果返回给主调对象,把控制权交还给主调对象,并结束函数的调用。
4、函数的形参与实参
大多数情况下,主调对象和被调函数之间需要通过各自的参数实现数据传递。函数的参数分为形式参数(形参)和实际参数(实参)。
定义函数时,函数首部中的参数为形参;调用函数时,调用表达式中的参数为实参。
一些约束条件:
(1)在定义函数时,需要在函数首部说明形参的类型与名称。多个形参,参数之间用逗号隔开;若函数调用时不需要主调对象传递数据,则在定义函数时可以没有形参,但是函数名后的括号不能省。
(2)调用函数时,形参和实参必须数目一致,类型相同。如果实参与形参类型不一致,以形参的类型为准,将实参的数据强制转换后,再向形参传递数据。
(3)实参可以是常量,也可以是变量。
5、函数间的类型传递
函数之间的数据传递,指的是主调函数与被调函数之间的数据传递。主调函数通过实参向被调函数传递数据,被调函数也可以通过返回值向主调函数传递数据,可以认为,函数间的数据传递是双向的。
函数间的类型传递,要求数据间的类型比配,数目一致。
6、函数的定义与函数的声明
函数的定义是确定函数功能的过程,包括定义函数名、返回值类型、形参及其类型、函数体四个部分。在程序中,所有的函数都是平行关系,定义函数时时分别进行、相互独立的。一个函数从不属于另一个函数,不能定义在另一个函数里,即函数不能嵌套定义。
函数的声明,只需要函数首部即可;函数声明是条语句,需要以“;”来标示声明语句的结束。
注意:
形参是属于被调用函数的变量,函数被调用之前形参并不存在。

第二节
一个C程序有且只有一个主函数,程序的运行从主函数开始,并且在主函数结束。主函数只能被系统调用,而不能被程序中其他任何函数调用。
常用的函数调用包括常规调用、嵌套他、调用和递归调用。
1、常规调用
三种形式:
(1)函数调用语句。被调函数由于仅完成特定的操作而无返回值,所以可以单独作为一条语句使用。
(2)函数表达式。函数作为语句的一部分,当被调函数的返回值传递给主调函数并参与后续运算。
(3)函数参数。该形式将函数调用直接作为函数的实参。
2、嵌套调用
允许嵌套调用函数
附表 11 函数的嵌套调用的一般流程
3、递归调用
递归调用:指一个函数直接或者间接调用函数本身。
递归调用的条件:问题能够分解成几个子问题;子问题可以直接求解或者属于同一类型
注意:递归步必循与原始问题相似,但规模要小于原始问题,每次递归后都要能够简化原始问题,并最终收敛于终止条件。
第三节
使用数组元素作为函数参数时,实参为数组元素,形参为变量,是将数组元素的值传递给形参变量;使用数组名作为函数参数时,实参为数组名,形参则相应地定义为数组,时将实参数组的首地址(即数组名)传递给形参数组。
1、数组的元素作函数实参(单向的值传递)
2、数组名作函数实参
数组名是数组首元素的地址,因此在数组名作为函数实参时,不是传递的数组元素的值,而是在传递数组存储单元的起始地址。
(1)数组名作为函数实参时,被调函数的形参不能定义为基本类型变量。
(2)被调函数的形参被定义为数组时,且与实参数组类型相同。在函数调用时,将实参的起始地址传递给形参,使得两个数组的起始位置相同,即实参数组和形参数组共同使用同一段存储单元。
注意:C语言编译系统对形参数组的大小不做检查,只是将实参的首元素地址传递给形参数组。
第四节函数的应用
计算两个整数的最大公约数和最小公倍数
二维数组的转置
第五节
变量的作用域决定了变量的有效范围,即变量在什么范围内可以被引用。
1、局部变量
局部变量(内部变量):即在函数内定义的变量、函数的形式参数以及在函数内的复合语句中定义的变量
函数内定义的变量及函数的形式参数,其有效性被限制在本函数内;复合语句中定义的变量只能在该复合语句中使用。
2、全局变量
全局变量(外部变量):在函数外定义的变量
有效范围:从定义函数的位置开始到所在的源文件结束,可以被本源文件内的所有函数引用。
变量的引用和定义的一些规则
(1)在同一个作用域中,不允许存在同名的变量。
(2)没有包含关系的作用域中,同名的变量单独存在,互不影响
(3)若在由包含关系的作用域中存在同名变量,则外层变量在内层中不可见,即在内层中被引用的是作用域小的变量。
尽量避免使用全局变量的原因:
(1)全局变量在程序的程序的整个执行过程中始终占用存储单元
(2)函数引用全局变量会降低函数的通透性
(3)使用全局变量过多,会降低程序的清晰性,较难判断出每一个瞬时外部变量的值
第六节
变量的生存期决定了变量存在的时间,即变量在什么时候具有存储空间。
注意:变量的作用域与生存期之间存在一定的联系,但是两者并非是完全一一对应的关系。
变量的生存期由变量的存储方式决定,分为静态存储和动态存储两种方式。
静态存储:在程序运营期间由系统分配固定的存储空间的方式,变量永久存放在静态存储区中,直到程序结束
动态存储:在程序运营期间根据需要进行动态地分配存储空间的方式,变量临时存放在动态存储区中,直到作用域结束。
四种存储类别:自动的(auto) 静态的(static) 寄存器的(register) 外部的(extern)
1、动态存储区的变量
自动变量:由关键字auto声明的局部变量
自动变量存放在动态存储区,系统在调用函数时给函数的自动变量分配存储空间,在函数调用结束后自动释放这些存储空间。
注意:如果在定义局部变量的时候,不指明存储类别,系统默认自动变量处理。即,未用static声明的局部变量都是自动变量
2、静态存储区的变量
全局变量和用static声明的局部变量存放在静态存储区,在程序运行的过程中占据固定的存储单元,直到程序执行完毕才被释放。
注意:
动态存储区的变量在函数调用时赋值,没调用一次函数,重新赋一次初值;
静态存储区的变量的变量在编译时赋初值,即只赋初值一次,在程序运行的时候已经有初值;以后每次调用函数都不再重新赋值,而只是保留上次函数调用结束后的值。
动态存储区的变量如果不赋初值,存储单元内的值时不确定的;静态存储区的变量如果不赋初值,系统自动赋值0.
区分全局变量与静态局部变量:
全局变量可以被所以函数引用;静态局部变量不能被其他函数引用(函数调用结束之后依然存在)
3、寄存器变量(register)
寄存器变量:用register声明的自动变量
注意:只有自动变量可以定义为寄存器变量;计算器内的寄存器的数目是有限的,不能定义多个寄存器变量。
4、外部变量
全局变量的有效范围是从定义函数的位置开始到所在的源文件结束,可以被本源文件内的所有函数引用。
用extern对全局变量进行声明,可以扩展全局变量的作用范围
声明变量的两种情况:
(1)需要建立存储空间的(如“int a;”)为“定义性声明”;简称定义
(2)不需要建立存储空间的(如“extern a;”)为“引用性声明”,简称引用
即声明包括定义;但定义不一定是声明
使用static声明的全局变量是静态外部变量,静态外部变量可以拒绝被作用域外的函数扩展引用。
5、总结
变量的作用域:变量在某个文件或者函数的范围内是有效的
变量的生存期:变量在某一时刻是存在的
附表 12 变量的生存期
注意:
局部变量默认为动态存储,用static声明以后,该变量才被存储在静态存储区。全局变量全部都是静态存储,用static声明以后,该变量的作用域被限于本文件中

第七章
第一节
1、系统通过地址来找到相应的对象,即地址指向对象,因此地址也被称为“指针”。对象的指针就是该对象所在存储单元的首字节地址。
第二节
1、指针变量:专门用来存放地址的变量
2、指针运算符:*
3、直接访问与间接访问
直接访问:通过变量名访问变量的方式
间接访问:通过指针变量获取地址从而访问该地址对应的变量的方式
4、几个重点理清的概念
(1)地址:内存中存储单元的编号
(2)变量:内存中某个特定的存储单元
(3)变量的地址:某一变量所在的存储单元的地址编号
(4)变量的名称:为该存储单元所定义的名称,便于程序设计。
(5)变量的值:存放在特定存储单元中的数据。
(6)指针:地址
(7)变量的指针:变量的地址
(8)指针变量:存放地址的变量
(9)指向变量的指针变量:存放某个特定变量地址的指针变量,通过该变量指针可以指向特定的变量
5、定义指针变量的基本格式: 类型 变量名
6、
:类型符,表明定义的变量类型为指针类型
类型:声明指针变量指向的变量的类型
7、无论指针变量指向的是何种类型,系统都为指针变量分配4个字节的存储单元;指针变量存放的是变量的地址,地址作为一个整数值,在内存中以二进制补码的形式存储
8、指针变量:先赋值,再引用
9、指针变量赋值的方式
(1)在定义指针变量的同时对它进行初始化
(2)定义指针变量后,再为它赋值
注意:当不确定指针变量指向的变量时,应该将指针变量赋为空值,即该指针变量不指向任何变量。C语言规定,有效数据的指针不指向地址为0的存储单元,即值为0的指针不能指向有效数据。
10、两种运算符:
“&”:取地址运算符 “”:指针运算符
11、几个注意点:
(1)定义时的“p”与引用时的“p”是不同的,前一个是类型符,后一个是指针运算符
(2)指针变量所指向的变量,其类型必循与指针变量的基类型相同
12、指针变量的运算
C语言允许指针与一个整数进行加减运算,以实现移动指针的目的
&,
:单目运算符,结合性自右向左
指针变量可以做自增自减运算,1指的是移动一个基类型的数据长度单位;如变量p的基类型为int,那么P++就是原来的地址加4
指针所指向的变量做自增自减运算,–(*p)或(p)–,表示指针所指向的变量的值减一
自增自减运算符,加括号区分
13、指针变量做函数参数
使用指向变量的指针作为函数参数,将主调函数中实参的地址传递给形参,而实参与形参共用该实参变量所指向的内存空间,在被调函数中改变形参所指向的变量的值,实际上就是改变主调函数实参变量所指向的变量的值。
注意:指针变量做函数参数,传递的是地址,因此形参必须是指针类型。在被调函数声明时,不能省略对形参的类型说明和指针类型”
“的说明

第三节
数组时同类型数据的有序集合,数组名就是数组首元素的地址。
1、指向数组元素的指针
指针引用数组元素:将数组的首元素地址赋给与数组类型相同的指针变量,建立指针变量岛该数组首元素的指向关系,并且通过执行指针的加减运算,使得指针指向数组中的各个元素。
如:p=&a,p1-p2 有意义;但不能a++(常量不能自加)
此时存在下列关系:
P=a=&a p+i=a+i=&a[i] *p=*a=a[0] (p+i)=(a+i)=a[i]
若p指向数组的第i个元素,则存在下列关系
*(p++)=a[i++] *(p–)=a[i–] *(++p)=a[++i] *(p–)=a[–i]
注意:对于数组元素的引用不能过界
2、指向数组元素的指针作函数参数
将指向数组元素的指针作为实参传递给被调函数的形参,可以在被调函数中通过改变形参指针直接改变主调函数中的数组元素。
变量:数组名或者指向数组元素的指针变量
形参必须是指针变量且其类型与数组类型一致。

第四节
多维数组:同一类型数据的有序集合,存储形式与一维数组的存储形式相同,即所有元素按顺序占用一段连续的内存空间。
1、通过指针引用二维数组
a[i]+j 表示a[i][j]的地址
(a[i]+j) 表示元素a[i][j]
((a+i)+j) 与
(a[i]+j)等价
2、指向数组的指针
系统在处理数组时,递归处理
比如一个二维数组a[3][4],C语言将它视为一个一维数组,以行为单位,视为“a[3]”
(1)元素的地址
a+0,数组a[3]的第一个元素的地址
a+1,数组a[3]的第二个元素的地址
a+2,数组a[3]的第三个元素的地址
(2)元素的名称
a[0],数组a[3]第一个元素的名称,即数组a[3][4]第0行一维数组的名称
a[1],数组a[3]第二个元素的名称,即数组a[3][4]第1行一维数组的名称
a[2],数组a[3]第三个元素的名称,即数组a[3][4]第2行一维数组的名称
(3)指针形式
*(a+0),数组a[3]的第1个元素,即a[0]
*(a+1),数组a[3]的第2个元素,即a[1]
*(a+2),数组a[3]的第3个元素,即a[2]
(4)推导
三个对应的等价
附表 13 二位数组的表现形式及其含义
3、指向数组的指针作函数参数
应用:用指向数组的指针作函数参数,在被调函数中输出特定学生的成绩,并且计算它的总成绩和平均分

第五节
类型为char型的指针变量,也称为字符指针。字符指针可以指向一个字符变量,也可以指向一个字符数组。C语言将字符串作为字符数组处理,以“\0”作为字符串结束的标志。
1、字符串的引用形式
(1)定义一个字符数组,将字符串存入该数组中,如:
char c1[]=”I am happy”
printf(“%s\n”,c1)
(2)定义一个字符指针,建立对字符串的指向关系,如:
char *string=”I am happy”;
printf(“%s\n”,string);
2、指向字符串的指针
注意:
(1)字符指针中存放的是地址,不是字符串
(2)字符指针的指向方式可以改变,但是不能改变数组名的指向关系
(3)不能使用字符串对字符数组名赋值;因为虽然数组名和指针都是地址,但是指针式变量,可以被改变,数组名是常量,不能被变更
(4)建立字符指针与字符串的指向关系,不能修改该字符指针指向的内容,因为字符串是常量;建立指针对字符数值的引用关系,可以变更指针所指向的数组的内容
3、指向字符串的指针作函数参数
在函数调用的过程中,以指向字符串的指针作为函数实参,可以在被调函数中通过改变形参指针所指向的变量,影响主调函数中的字符串

第八章
第一节
C语言允许用户建立由不同数据类型组成的构造类型,这种数据类型被称为结构体类型。
1、结构体类型的声明
结构体类型声明的一般形式
struct 结构体名
{
成员列表;
}
结构体名:(结构体标记)习惯上,把首字母大写
成员列表:又称“域表”,由一对花括号括起,列表中的每一个成员都是结构体中的一个域,可以被声明为已知的任何数据类型,声明成员的方法与定义变量相同。
2、使用结构体变量
声明结构体变量,只是创建了一种数据类型,系统不会为类型分配存储单元。
使用结构体类型定义变量的三种形式:
(1)先声明结构体类型,再定义变量(最常用)
(2)声明结构体类型的同时定义变量
(3)不指定结构体名称而直接定义结构体类型变量(不指定类型名称,必须再声明类型的同时定义变量)
结构体变量的大小等于各成员所占存储空间的总和(实际上,可能会大于)
3、结构体变量的初始化和引用
结构体变量的成员的引用的一般格式
结构体变量名.成员名
“.”:成员运算符,结合性从左至右
4、结构体数组
一个结构体变量可以存放一组不同类型的数据。
定义结构体数组的方法和定义结构体变量类似

第二节
共用体:某一时刻只能有一个数据存在
C语言允许使用共同体类型,实现再同一段内存单元中存放不同类型的数据。
共用体变量的大小等于最长的那个变量的长度
1、共用体类型的声明
一般形式
union 共用体名
{
成员列表;
}
列表中的各个成员可以被声明为已知的任何数据类型,声明成员的方法与定义变量相同;无论是声明成员的数据类型还是声明共用体类型,都要以“;”结束,
2、共同体变量的定义
三种方式:
(1)先声明共用体类型,再定义变量
(2)声明共用体类型的同时定义变量
(3)不指定共用体类型名称而直接定义共用体类型变量
共用体变量的长度是占用内存单元最多的成员的长度
3、共用体变量的初始化和引用
共用体变量的所有成员将共用同一段内存单元,从同一地址开始存取数据。新存入的成员数据将会覆盖之前存放再内存单元中的成员数据,即再任何情况下,共用体变量的所有成员中只有其中的一个成员有效。
C语言允许以初始化的形式为共用体变量的第一个成员指定初始值。
注意:无法通过初始化同时为共用体的所有成员指定初始值。
C语言不允许直接引用共用体变量,而只能对共用体变量中的某个成员进行引用。

第三节
枚举:将变量的可能取值一一列举出来,以后对于变量的引用,只限于列举出来的取值。
1、枚举类型的声明
一般形式
Enum 枚举类型名
{
枚举元素列表;
}
C语言将枚举元作符号常量处理,每一个枚举元素代表一个整数常量,故也称枚举常量。(即不能对枚举元素赋值)。默认情况下,第一个枚举元素值为0,之后的依次加1。但是可以再声明枚举类型时专门指定某个枚举元素的值,之后的枚举元素值依次加一。
注意:
结构体和共用体类型的成员是变量,需要在类型结构中用语句声明,以“;”标识结束;枚举元素作为符号常量,在类型声明中一一列举,元素之间用“,”间隔。结构体变量和共用体变量可以在类型声明之外对自己的成员赋值,枚举元素不是变量,不能在类型声明之外对它们重新赋值。
2、枚举变量的定义
三种方式:
(1)先声明枚举类型,再定义变量
(2)声明枚举类型的时候同时定义变量
(3)不指定枚举类型的名称而直接定义枚举类型变量
枚举变量的取值只能从所有枚举元素中选择其一,而每个枚举元素代表一个整数常量,因此C语言中枚举变量的大小为4字节长度。
3、枚举变量的初始化和引用
可以在定义枚举变量的同时对其进行初始化,也可以在定义之后对变量赋值并引用。
枚举元素和枚举变量可以参加整型参与的运算,但是注意参与运算不能让枚举变量获得一个不在枚举元素列表中的值。

第四节
C语言允许用关键字typedef指定新的类型名来代替已有的类型名
Typedef只能用于声明新类型名,不能用来定义变量。

第九章
第一节
1、结构化设计程序
(1)自顶向下
(2)逐步细化
(3)模块化设计
(4)结构化编码
2、面向对象编程的四个特征
抽象:当多个相同事物或有共性的事物出现时,应该组合到一起进行分析处理,对某类具体事物进行概括,提取出共性的部分,即抽象。
抽象包括数据抽象与行为抽象。数据抽象定义了数据类型和施加于该类型上的操作,并限定了对象的
封装:把抽象出来的行为和数据放到一起,对对象的数据访问只能通过已经定义的规则。

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页