高级程序语言设计 3 知识点总结函数.docx
- 文档编号:24224577
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:20
- 大小:23.09KB
高级程序语言设计 3 知识点总结函数.docx
《高级程序语言设计 3 知识点总结函数.docx》由会员分享,可在线阅读,更多相关《高级程序语言设计 3 知识点总结函数.docx(20页珍藏版)》请在冰豆网上搜索。
高级程序语言设计3知识点总结函数
高级程序语言设计(32002)>知识点总结>函数
函数知识点、重点与难点
知识点:
需要掌握函数的定义与调用,能进行编写函数,了解并会使用常用的C语言系统函数,函数调用中参数的传递方法,变量的作用域与生存期。
重点与难点:
递归函数编写与解读。
函数定义与调用
C语言中的函数可分为系统函数及自定义函数,而系统函数以函数库的形式提供。
C语言中提供了丰富的库函数。
这些函数包括常用的数学函数,包括了对字符和字符串进行处理的函数,也包括了进行输入输出处理的各种函数等。
在本节中将主要讨论自定义函数。
函数定义的一般格式如下:
数据类型函数名(形式参数声明)
{函数体}
其中数据类型为调用此函数后的返回值类型。
函数体为实现该函数功能的语句集合。
函数体中可通过return语句指明返回值或结束函数执行。
函数调用格式如下:
函数名(实参表)
调用时,形式参数表的次序应与实际参数一一对应。
形式参数在行参列表中被定义,多个形式参数之间以逗号隔开,对每个形式参数应指明其名字和类型。
形式参数可以被看成是函数的内部变量,它只在函数内部才有意义。
一旦函数执行完毕,形式参数所占的存储空间将被系统收回。
被调用函数的定义如果出现在调用函数之前,在调用函数中,对被调用的函数可以不加说明。
但被调用函数的定义出现在调用函数之后,则需对被调用函数进行说明。
函数在说明时,函数的返回值类型、参数的类型不能省略,但参数名可以省略。
函数的嵌套调用
C语言不允许在一个函数体内定义另一个函数,各函数间都应平行,即在一个函数内不能嵌套另一个函数,函数只能嵌套调用而不能嵌套定义。
函数的嵌套调用是指一个函数调用另一个函数。
函数递归调用
在函数内部直接或间接地对自身调用,这种调用称为递归调用。
被递归调用的函数称为递归函数。
递归函数内部对自身的每一次调用都会导致一个与原问题相似而范围上要小一点的新问题。
构造递归函数的关键在于寻找递归算法和终结条件。
一般来说,只要对问题的每一次求解过程进行分析归纳,就可以找出问题的共性,获得递归算法。
终结条件是为了终结函数的递归调用而设置的一个标记。
递归调用不应也不能无限制的执行下去,所以必须设置一个条件来检验是否需要停止递归函数的调用。
终结条件的设置可以通过分析问题的最后一步求解而得到。
递归可分为直接递归和间接递归。
例:
编写程序,求阶乘n!
。
分析:
因为n!
=n*(n-1)!
设:
n!
=facto(n),即(n-1)!
=facto(n-1),函数facto调用facto函数本身,这里只是参数不同而已。
所以facto(n)=n*facto(n-1)
voidmain()
{intn;floaty;
printf("inputaintegernumber:
");
scanf("%d",&n);
y=facto(n);
printf("%d!
=%15f",n,y);
}
从以上分析可以看出,函数facto(n)要调用它本身facto(n-1),因而可以用递归的方法编写此程序。
intfacto(intn)
{if(n<0)
printf("n<0,dataerror!
");
if(n==1||n==0)
return
(1);\
elsereturn(n*facto(n-1));
}
高级程序语言设计(32002)>知识点总结>基础知识
基础知识知识点、重点与难点
知识点:
常见的数据类型、变量定义、常见的运算符、数组(包括一维数组和二维数组)定义与使用、指针的概念及指针的移动以及字符串的定义与使用。
重点与难点:
各数据类型表示数据的范围、整除与取余运算、自增与自减运算、各种类型混合运算时的自动转换、类型的强制、运算符的优先级、常用字符串函数的程序实现、指针对数组元素的引用。
数据类型及变量定义
无符号长整型
unsignedlong
4
0~4,294,967,295
单精度实型
float
4
3.4e-38~3.4e+38(绝对值)
双精度实型
double
8
1.7e-308~1.7e+308(绝对值)
字符型
char
1
-128~127
C语言中常用数据类型及占用字节数见下表:
常用的基本数据类型符(VisualC++6.0)
数据类型
数据类型符
占用字节数
表示范围
整型
Int4-2,147,483,648~2,147,483,647
短整型short2-32,768~32,767
长整型long4-2,147,483,648~2,147,483,647
无符号整型
unsignedint
40~4,294,967,295
无符号短整型
unsignedshort
2
0~65,535
变量定义的一般格式:
数据类型变量名表
变量名用标识符表示。
标识符只能由字母、数字和下划线三种字符组成(不能以数字为首)。
变量名表中若有多个变量,需用逗号分隔。
运算符与表达式
在C语言中基本运算符有算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、逗号运算符、条件运算符等。
1、算术运算符
算术运算符有:
+、-、*、/、%,分别为加、减、乘、除、求余运算符。
这些运算符需要两个运算对象,称为双目运算符。
还有++和--运算符,只需要一个运算对象,称为单目运算符。
除求余运算符外,运算对象可以是整型,也可以是实型。
双目运算符两边运算数的类型必须一致才能进行操作。
所得结果的类型与运算数的类型一致。
如果双目运算符两边运算数的类型不一致,如一边是整型数,另一边是实型数时,系统将自动把整型转换为实型数,使运算符两边的类型达到一致后,再进行运算。
如:
1/2.0;表达式1/2.0自动把1转化为1.0,然后再运算1.0/2.0;其运算结果为0.5。
而表达式l/2;由于类型相同,运算结果为整型数,其值为0。
自动类型转化规则如下:
(l)运算符两边一个是短整型,一个是长整型,则短整型转换成长整型,然后进行运算。
(2)运算符两边一个是有符号整型,一个是无符号整型,则有符号整型转换成无符号型,然后进行运算。
在类型转换除了自动类型转换外,C语言还支持强制类型转换。
强制类型转换的格式如下:
类型名)<表达式>
如:
表达式3.0/2的结果为1.5,但(int)3.0/2的结果为1。
由于使用了强制类型转换将3.0转换为整数3,因此,(int)3.0/2的值与3/2的值相同,都为1。
自加运算符“++”和自减运算符“--”的运算结果是使运算对象的值增1或减1。
自加、自减运算符的运算对象只能是变量,不能为常量或表达式。
自加、自减运算符既可做为前缀运算符(如++i),也可做为后缀运算符(如i++)。
但若作为前缀运算符时,则先做自增(或自减)运算,然后才做其他,若作为后缀运算符时,则先做其他,再做自增(或自减)运算。
如若i=5,则在执行j=++i后,i的值为6,j的值也为6。
因为执行时先做自增,使i的值为6,然后再将i的值赋给j,使j的值也为6。
若i=5,则在执行j=i++后,i的值为6,j的值也为5。
因为执行时先将i的值赋给j,使j的值也为5,然后再做自增,使i的值为6。
2、关系运算符
关系运算符主要有:
==(相等)、!
=或<>(不等)、<(小于)、>(大于)、<=(小于等于)、>=(大于等于)等。
关系运算符的优先级见下表:
关系运算符
符号
优先级<(小于),>(大于),<=(小于或等于),>=(大于或等于)高
==,!
=(不等于)低
3、逻辑运算符
逻辑运算符主要有:
&&(逻辑与)、||(逻辑或)、!
(逻辑非)。
逻辑运算符的功能见下表:
ABA&&BA||B!
A
逻辑运算符与赋值运算符、算术运算符、关系运算符之间从高到低的运算优先次序是:
!
(逻辑非)、算术运算、关系运算、&&(逻辑与)、||(逻辑或)、赋值运算。
4、位操作运算符
位操作运算符主要有:
&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移)、>>(右移)等。
位操作运算符及其功能见下表:
位运算符及其功能
运算符作用优先级
~按位取反1
<<、>>左移、右移2
&按位与3
^按位异或4
|按位或5
5、赋值运算符
赋值运算符主要有:
基本的赋值运算符为“=”。
在C语言中,可以对变量连续赋值,其格式为:
<变量1>=<变量2>=……<变量n>=<表达式>;
先计算<表达式>值,再将其值赋给<变量n>,从右到左。
例如:
a=b=c=1等效于a=(b=(c=1));
其他的与算术运算相结合的符值运算符有+=、-=、*=、/=、%=,与位运算相结合的符值运算符有<<=、>>=、&=、^=、|=。
其功能见下表:
赋值运算及其功能
赋值运算符
表达式
等价的表达式+=a+=b+ca=a+(b+c)-=a-=b+ca=a-(b+c)
*=a*=b+ca=a*(b+c)
/=a/=b+ca=a/(b+c)
%=a%=b+ca=a%(b+c)
<<=a<<=na=a< >>=b>>=nb=b>>n &=a&=ba=a&b ^=a^=ba=a^b |=a|=ba=a|b 6、条件运算符 条件运算符的格式为: ? : 由条件运算符组成的表达式为: 条件运算符表达式=表达式1? 表达式2∶表达式3; 功能如下图所示。 > 条件表达式的执行顺序为: 先求解第一个表达式,若为非0,再求解第二个表达式,该表达式的值就为整个表达式的值;若第一个表达式的值为0,则求解第三个表达式,该表达式的值就作为整个表达式的值。 7、其他运算符 长度测试运算符sizeof: 用于测试某个类型变量所占用计算机内存空间的字节长度。 格式: sizeof(类型名) 逗号表达式: 用逗号将表达式连接起来的式子。 逗号表达式的一般形式为: 表达式1,表达式2,…,表达式n 逗号表达式的功能: 先计算表达式1,最后计算表达式n。 最后一个表达式的值就是此逗号表达式的值。 8、各种运算符的优先级 各种运算符的优先级见下表。 运算符及其优先级汇总表 类别 运算符 名称 优先级 结合性 强制 下标 成员 () [] ->、. 类型转换、参数表、函数调用 数组元素的下标 结构型或共用型成员 15 自左向右 逻辑 位 增1减1 指针 算术 长度 ! ~ ++、-- &、* +、- sizeof 逻辑非 位非 增加1、减少1 取地址、取内容 取正、取负 数据长度 14 自右向左 算术 *、/、% 乘、除、模 13 自左向右 +、- 加、减 12 位 <<、>> 左移位、右移位 11 关系 >=、>、<=、< 大于等于、大于、少于等于、少于 10 ==、! = 相等、不相等 9 位 & 位逻辑按位与 8 ^ 位逻辑按位异或 7 | 位逻辑按位或 6 逻辑 && 逻辑与 5 || 逻辑或 4 条件 ? : 条件 3 自右向左 赋值 = 赋值 2 自反赋 值 +=、-=、*=、/=、%=、&=、^=、|=、<<=、>>= 加赋值、减赋值、赋值 除赋值、模赋值、位与赋值 位按位加赋值、位或赋值 位左移赋值、位右移赋值 逗号 逗号 1 自左向右 数组 1、一维数组的定义 类型说明符数组名[整型常量表达式]; 类型说明符表示数据存放的类型,整型常量表达式为数组下标,表示数组元素的个数。 如: inta[10]; 它表示定义10个元素的整型数组,数据名为a,a也是这5个元素存储区的首地址,因而a的地址值不能改变。 数组允许的下标值为0~9。 访问数组元素格式: 数组名[下标] 如a[3]访问了数组a中的第四个元素。 2、一维数组的初始化与赋值 (1)数组的初始化 ①在定义数组时对数组元素可赋以初值。 如: staticinta[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始化后,它相当于: a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8,a[9]=9。 ②初始化时可以只对一部分元素赋初值。 例如: staticinta[10]={0,1,2,3,4}; ③在对全部数组元素赋初值时,可以不指定数组长度。 例如: staticinta[5]={1,0,3,5,7};与staticinta[]={1,0,3,5,7};等效。 (2)程序中给数组的元素赋值 inta[10]; a[2]=2;a[3]=3; 3、二维数组的定义 类型说明符数组名[常量表达式1][常量表达式2]; 常量表达式1表示二维数组的行数,常量表达式2表示二维数组的列数。 例,floata[3][4]; 它表示定义了数组名为a的3行4列的实型数组。 4、二维数组的初始化 (1)分行给二维数组赋初值。 例: statica[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 以上赋值把第一个花括号内的数据赋给第一行元素,第二个花括号内的数据赋给第二行元素…,即按行赋值。 (2)可以将所有的数据写在一个花括号内,按数组排列的顺序对各元素赋值。 例: staticinta[3][3]={1,2,3,4,5,6,7,8,9}; (3)可以对数组的部分元素赋初值。 如: staticinta[3][4]={{l},{5},{9}}; 以上赋值的结果是: 数组第一列的元素分别赋了初值1,5,9。 (4)如果对二维数组的全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省略。 例: inta[3][3]={1,2,3,4,5,6,7,8,9};与a[][3]={1,2,3,4,5,6,7,8,9};等价。 又如: staticinta[][3]={{1,2,3},{4},{6,10}};定义了三行三列的一个数组,数组第一行的元素分别赋了初值1,5,9。 第二行的第一列赋了初值4。 第三行的第一列和第二列分别赋了初值6,10。 指针 1、指针变量的定义 定义指针变量的一般形式如下: 类型名*指针变量名1[=<初值表达式>],*指针变量名2,…; 类型是指指针变量所指的地址上存储内容的类型。 例: int*p1,*p2; 2、指针变量的赋值 一个指针变量可以通过 (1)赋值; (2)初始化;(3)分配内存空间等不同的“渠道”来获得一个确定的地址值,从而指向一个具体的对象。 (1)直接赋值 如: intk=1,*p; p=&k; (2)初始化 如: intk; int*p=&k;的功能是定义了整型指针变量p,并交将指针p赋初值为整型变量k的地址。 (3)通过标准函数获得地址值。 可以通过调用库函数malloc()和calloc()在内存中开辟动态存储单元,并把所开辟的动态存储单元的地址赋给指针变量。 例如: int*p; pp=(int*)malloc(sizeof(int)); C语言中有一个特殊的指针值NULL,即全部二进制为0的值,表示空指针。 3、指针变量的运算 (1)取指针变量所指的值 取指针变量所指的存储单元内容的形式为: *指针; 如数据定义如下: intk=5,*p=&k; 上面定义指明指针变量p的值为变量k的地址,因此*p的值为k的值5。 需给指针变量p所指的存储单元赋值为20的语句为*p=20。 但对指针所指的存储空间赋值前,必须先赋指针的值,否则所赋的值将存入不确定的地址。 (2)指针变量的移动 所谓移动指针就是对指针变量进行加上或减去一个整数、或通过赋值运算,使指针变量指向相邻的存储单元。 因此,只有当指针指向一串连续的存储单元时,指针的移动才有意义。 当指针指向一串连续的存储单元时,可以对指针变量进行自增、自减运算,也可以对指向同一串连续存储单元的两个指针进行相减的运算;除此之外,不可以对指针进行任何其他的算术运算。 设指针p指向数值为60的存储空间的地址,则p++、*p++、*++p、++*p、*p--、*--p、--*p的含义如下。 p++;表示向高地址移动指针,使指针变量p指向存储空间为70的地址上。 *p++;表示取60的值,然后使指针p指向存储单元为70的地址上。 *++p;先使指针p指向存储单元为70的地址上,然后取值70。 ++*p;表示对p所指的值60增加1,然后取值61。 *p--;表示取值60,然后使指针p指向存储单元50的地址上。 *--p;先使指针p指向存储单元50的地址上,然后取值50。 --*p;表示对60的值减1,然后取值59。 4、一维数组与指针 在数组中,数组名名代表了数组的首地址。 设有定义如下: inta[5],*p; 则p=a为一个正确的赋值语句,其功能为p指向数组a中的第一个元素。 数组元素a[i]也可表示为: *(a+i)。 5、二维数组与指针 设二维数组的定义如下: inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}; C语言允许把一个二维数组分解为多个一维数组来处理。 因此数组a可分解为三个一维数组,即a[0],a[1],a[2]。 每一个一维数组又含有四个元素。 设数组a的首地址为1000,则该二维数组可表示如下: 数组元素及元素的地址表示如下: 二维数组的元素及地址的表示方法 二维数组的元素表示 二维数组的元素地址表示 二维数组行首地址表示 数组[i][j] &数组[i][j] 数组[I] *(*(数组名+i)+j) *(数组名+i)+j) 数组[I] *(数组名[i]+j) 数组名[i]+j *(数组+i) 6、指针数组 指针数组是指由指针组成的数组,即指针变量的集合,实质上是一个数组,其元素为指针。 指针数组定义形式为: 类型*数组名[指针数组元素的个数]; 例: char*a[7]; 7、二级指针 一个指针变量所指向的地址中存放的变量仍为一个指针变量,而被指向的指针变量指向一个具体的非指针变量,这个指针称二级指针 二级指针定义: <数据类型>**<指针名>; 例数据定义如下: int**p; inta,*q; q=&a; p=&q;; 它们的含义如下图所示: 字符串 C语言本身并没有设置一种类型来定义字符串变量,字符串是借助于字符型一维数组来存放的,以字符‘\0’作为字符串结束标志,它的ASCII代码值为0,‘\0’占用存储空间、不输出,但不计入串的实际长度。 如: chars[10]={'H','e','l','l','o','! ','\0'};或chars[10]="Hello! ";都实现了字符串的定义,并且两种定义等价。 每一个字符串常量都分别占用内存中一串连续的存储空间,以存储空间的首地址表示字符串,因而可以用字符指针变量指向字符串的首地址,例: char*sp; sp="Hello! ";或写成: char*sp="Hello! "; 如字符串复制函数strcpy实现语句如下: voidstrcpy(char*to,char*from) { while(*to++=*from++); } 此函数中,最后一次while循环时,先赋值’\0’后,再判定循环条件。 该函数也可以写成下面形式: voidstrcpy(char*to,char*from) { while(*from! ='\0') { *to=*from; to++; from++; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级程序语言设计 知识点总结 函数 高级 程序语言 设计 知识点 总结