版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+ 程序设计基础1第一章 C+语言基础 2一、源程序的编辑、编译、连接与执行编辑:输入、修改、存盘,形成 .cpp文件。编译:编译至无语法错误,形成 .OBJ文件。连接:与系统标准模块连接,形成 .exe文件。执行:运行程序,获得结果。1.1 程序设计语言概述3二、程序错误类型编译错误连接错误运行错误逻辑错误4一、语言特点中级语言,表达能力强;结构化语言,层次清晰,结构紧凑;运算符、数据类型丰富,功能齐全,灵活多样;简洁,方便、灵活;目标代码质量高,快捷高效;可移植性强,适用范围广。1.2 C+程序的基本结构5二、C+程序的基本结构例1 一个简单的 C+程序/ program c101.cp
2、p#includevoid main( )cout”Welcome to C+ world!”; 程序输出结果:Welcome to C+ world! 6例5 从键盘输入两个整数值,计算其和, 并输出结果值。/ program c105.cpp #include void main( ) int i,j,sum;coutij;sum=i+j;cout”The sum is ”sum”.n”; 运行示例Enter two integers:63 58The sum is 121. 7例6 运行下述C+程序将获得与例1相同的输出结果。/ program c106.cpp #include voi
3、d displaymessage1( ) cout”Welcome”;void displaymessage2( ) cout”to”;void displaymessage3( ) cout”C+ world!n”;8void main( )displaymessage1( );displaymessage2( );displaymessage3( );运行示例Welcome to C+ world! 9 C+源程序主要有以下几个特点:C+程序由函数构成,一般用小写字母书写语句结尾要用;程序有且只有一个主函数main(),且()不能少程序体用和括起来函数体中又包括说明部分和执行部分注释以/
4、”开始,后跟注释内容。注释自动在行尾结束。101.3 基本字符集与标识符一、基本字符集数字:0至9英文大、小写字母:A至Z,a至z专用符号:+ - * / = ( ) 等等若干字符对:= != = 等等。特定功能的符号:转义符( 如 n表示换行)11二、标识符标识符(identifier):常量、变量、函数等的名称关键字(保留字) : 在C中有特定含义;预定义标识符(预定义标识符):C预先规定用来标识预定义的命令、库函数等,如include,printf等;允许程序员将系统预定义标识符重新定义;自定义标识符:由程序员根据程序需要而自行选定的名字12作为标识符必须满足以下规则:必须由字母或下划线
5、开头其它部分可由字母、下划线或数字组成大小写字母代表不同的标识符只有前32个字符有效不能使用 C+ 的关键字,尽量不使用系统预定义标识符尽量不要使用l (L) , I ( i ), o (O)等作为标识符13例9 一些符合规则的标识符smart_decisionFLOAT B757例10 几个非法的标识符 1st 不能以数字开头 Two Words 不能包含空格符 What_is_this? 问号符不允许 under-weight 减号符不允许14四、注释注释由/ ”开始,后跟注释内容,于行尾处结束。要连续书写多行注释,则要求每行都以/ ”打头。注释自/*”开始,至*/ ”结束,其间的注释内容
6、允许跨行书写。注释、空格符是分隔符。注释可以加在C程序中任何能使用分隔符的地方。分隔符是指分开两个相邻的词的符号。15例11 以下几种书写注释的形式,均能顺利通过C+编译器的编译。形式一/ the first line,/ the second line,/ and the third line.形式二/*the first line,the second line,and the third line. */ 形式三/* the first line,*/* the second line, */* and the third line. */16例12 下述书写注释的形式,将不能通过C编译
7、器的编译。/ the first line,the second line,and the third line.171.4 简单数据类型 两类数据类型:预定义数据类型和程序员自定义数据类型数据类型定义的作用:规定变量可接受值的集合以及对它所能执行的操作指明对该类型的数据项(即变量)应分配多大内存空间规定能用于该类型数据项的操作;防止数据类型不匹配。18 19Visual C 6.0编译系统系在32位计算机上运行,int型、short型整数将各占内存4个字节 20一、整型类型 整型常量简称整常量。 三种表示整型常量的形式:十进制形式、八进制形式、十六进制形式。十进制整常量: 以非0数字打头的十
8、进制数字串八进制整常量: 以数字0打头的八进制数字串十六进制整常量:以数字和字母的组合0 x或0X打 头的十六进制数字串21例 十进制、八进制、十六进制整常量示例 220 十进制整常量 -560 十进制整常量 06 八进制整常量,相当于十进制数6 0106 八进制整常量,相当于十进制数70 0 x4e 十六进制整常量,相当于十进制数78 0XFF 十六进制整常量,相当于十进制数25522 C允许在变量说明时直接赋予一个初始值,这称为变量初始化。 例 整型变量说明及初始化示例int a,b; /* 说明a,b为基本整型变量 */ /且它们分别具有随机初始值int m=4,p=3,n=2; / 说
9、明m,p,n为基本整型变量, /且它们分别具有初始值4,3,2 23二、实数类型24实型常量简称实常量。实型常量: 十进制小数点形式和科学记数法的指数形式例16 两种形式实常量示例6.365 十进制小数点形式6.8e-5 科学记数法的指数形式,表示6.810-5, 即0.000068。6.8E-5 与上数相同。25实常量缺省认作属于double类型。例17 单精度型实常量与长双精度型实常量示例6.365 双精度(double)实常量3.14159f 单精度(float)实常量3.1415926535897932L 长双精度型实常量,所有小 数位均为有效数字。26例 实型变量说明及初始化示例fl
10、oat radius,diameter,area; /* 说明radius,diameter,area为 单精度型实变量 */ double pi=3.14159265358979; /* 说明pi为双精度型实变量,且具 有相应初始值 */ 27三、字符类型char类型数据用来存放ASCII字符集内的某个字符。C+支持扩展ASCII代码,共包括256个不同字符。28 将字符用单引号括起来,即成一个字符型常量或简称字符常量。例18 字符常量示例 A 表示英文大写字母A的字符常量。 a 表示英文小写字母a的字符常量。 表示空格符字符常量。29例 以下所示均为非法的字符常量表示 字符常量的单引号对内
11、必须有一个字符, 若为空格,应写为 。 Turbo 字符常量的单引号对内只能包含一 个字符。 a a是字符串常量( a0 ), 而 a 才是字符常量。30四、布尔类型bool、false和true均为C+关键字。规定falsetrue。系统将false的值转换为0,将true的值转换为1bool型数据占据1字节内存。31五、常量标识符说明时用关键字const做限定符,且必须为该常量标识符赋值。在整个程序运行期间,不允许改变常量标识符的值。用大写字符序列。例21 常量标识符说明示例const int ZERO=0;const double PI=3.14159;321.5 运算符与表达式初探一、
12、算术运算符与算术表达式33 程序中的算术表达式与一般数学式在表示形式上有所不同: b2 - 4ac 应表示为b*b-4*a*c; sin2x 应表示为sin(2*PI*x),其中假设PI是一个预先定义的一个常量标识符。34二、关系运算符与关系表达式35例 关系运算示例 1+2=3 结果值为1 (true) A=a 结果值为0 (false) A!=a 结果值为1 (true)36例 设int型变量a, b, c分别有值1, 3, 2,则 b*b4*a*c=0结果值为1注意: 算术运算符的优先级高于关系运算符,因此无须用圆括号将该算术表达式括起来。37三、逻辑运算符与逻辑表达式38例 逻辑运算示
13、例 !0结果值为1 (true) !1结果值为0 (false) !5结果值为0 (false) 1 & 5结果值为1 (true) 39运算优先级函数优先括号优先(嵌套括号中内层括号优先) 优先级高者优先优先级相同者按结合规则40运算符类型优先级结合性( )圆括号从左到右+ - !单目运算符从右到左* / %乘法运算符从左到右+ -加法运算符从左到右 =关系运算符从左到右= !=相等测试运算符从左到右&逻辑与从左到右|逻辑或从左到右算术运算符的优先级及结合性高41例 设int型变量a, b, c分别有值1,3,2,则 (a!=0) & (b*b4*a*c=0)与 a!=0 & b*b4*a*
14、c=0 等价,结果值为142四、类型转换 双目运算符两边操作数的类型必须一致。 两种类型转换:隐式类型转换与显式类型转换。隐式类型转换由系统自动进行例23 设已有带初始赋值的变量说明 int a=2, b=4; double f=3.15;则:(a+f)/b的结果为1.2875,double型。432. 显式类型转换强制类型转换。一般形式是 (类型名)表达式 或 类型名(表达式) 其中类型名是一个任意基本数据类型名。例 设已有带初始赋值的变量说明 int a=2, b=4; double f=3.15; (int) (a+f)/b) 结果值为1 (int)(a+f)/b 结果值仍为1,注意:两
15、者运算过程有所不同 强制类型转换的优先级高于/。441.6 赋值语句及简单输入、输出一、赋值语句一般形式为 变量表达式;(=右结合,低优先级)例 int i,j,k; double r;则以下几个语句均为合法的赋值语句: i=j=k=3;i,j,k均有整型值3 r=2.5;r有双精度实型值2.5 i=r;i有整型值2 r=i;r有双精度实型值2.0 45二、赋值表达式一般形式: 变量表达式例33 设有变量说明 int m, n, k; k=(m=5)*(n=4);执行后,int型变量m,n,k将分别有整数值5,4,20。46三、输入输出简述输入、输出标准库函数cin、cout使用标准库函数如c
16、out、cin,需写包含头文件iostream.h。插入运算符”分别用于输出和输入。插入运算符的结合性亦为从左到右,故能按顺序将输入分别赋予相应的变量。输出和输入时,系统对各种类型的数据都能自动进行分析判别并按照缺省格式进行处理,从而无需专门提供格式化串。48例36 下述C程序演示了使用cout语句对各种数据类型的变量、表达式按缺省格式输出的形式#includevoid main( )int i,j,m=4,p=3,n=2;double pi=3.14159265;char ch1=A,ch2=Z;bool ok=true;i=m+p+n;j=m*p/n;couti=m+p+n=m+p+n=i
17、n;49coutj=m*p/n=m*p/n=j n;coutpi=pin;coutch1=ch1,ch2=ch2n;coutok=okn;cout!ok=!okn;运行示例:i=m+p+n=4+3+2=9j=m*p/n=4*3/2=6pi=3.14159ch1=A,ch2=Zok=1!ok=050欲使用这些格式操纵符,需在C程序开头书写如下包含命令 #include 51第二章 程序控制结构52条件控制结构:(选择结构)无条件控制结构:循环控制结构:(重复结构)while 语句、do-while语句、for语句if 语句、switch语句break语句、continue语句、goto语句控制结
18、构532.1 if语句2.1.1 简单if语句形式一 if(表达式) /* 括号不能少 */ 语句 表达式0语句非054表达式 语句1 非0 语句2 0形式二 if (表达式) 语句1 else 语句2 55例3 从键盘输入一个整数,计算它的绝对值并输出。#includevoid main( ) int i,absi; couti; if(i0) absi=i; else absi=-i; cout”The absolute value of ”i” is ”absi=A&ch=a &ch=z) coutch”is an English letter.n”;elsecoutch” is not
19、 an English letter.n”;测试条件不能写成A=ch=Z|a=ch=z572.1.2 条件表达式与条件表达式语句一般形式:表达式1 ?表达式2 :表达式3 例6 使用条件表达式语句实现相同功能。#includevoid main( ) int i,absi; couti; absi=i0?i:-i; cout”The absolute value of ”i” is ”absi”.n”; 582.1.3 复合语句复合语句:一对花括号及其中包含的语句集。 说明语句(可选) 执行语句集使用说明语句的复合语句称为程序块程序中凡可使用单一语句的地方,都可使用复合语句作为特例,函数体也就
20、是一个复合语句592.1.4 扩展if语句与嵌套if语句一般形式: if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式n) 语句n else 语句n+160例9 从键盘输入一个表示百分制成绩的非负整数,按相应的五级记分制(A、B、C、D、F)转换,并输出结果。对于所输入的数据,需判断其合理性,即应为0100之间的某个整数。#includevoid main( ) int score; char grade; coutscore; cout”score:”scoreendl; if(score100) cout=90) grade=A; else if(s
21、core=80) grade=B; else if(score=70) grade=C; else if(score=60) grade=D; else / 0=score60 grade=F; cout”grade:”gradeendl; 运行示例Enter score(0-100):95 score:95grade:A62if语句允许嵌套既定解释规则是:else应与离它最近的那个尚未与其他else匹配的if-相匹配。 例#includemain() int a=2,b=-1,c=2; if(ab) if(b0) c=0; else c+=1; cout”C:”cendl; 输出结果 2 6
22、32.2 switch语句一般形式: switch (表达式) case 常量表达式1:语句1 break; case 常量表达式2:语句2 break; case 常量表达式n:语句n break; default:语句n+1 可以省略default子句64 switch (表达式) case 常量表达式1: 语句1或空; case 常量表达式2: 语句2或空; . . . case 常量表达式n: 语句n或空; default: 语句n+1或空; 将表达式值逐个与case后的常量进行比较:若与其一个相等, 则从该常量下的语句开始向后执行,不再进行判断,直至整个语句结束;若不与任何一个常量相
23、等, 则执行default 后面的语句。 65例10 #includevoid main( ) int score; char grade; coutscore; cout”score:”scoreendl; if(score100) cout”Error-out of range.n”; else66switch(score/10)case 10:case 9:grade=A; break;case 8:grade=B; break;case 7:grade=C; break;case 6:grade=D; break;case 5:case 4:case 3:case 2:case 1:
24、case 0:grade=F; break; cout”grade:”gradeendl;运行示例Enter score(0-100):95score:95grade:A672.3 while语句while语句的一般形式是: while (表达式) 语句 表达式0语句非0 为确定究竟执行循环体多少次,必须仔细选择所需的初值、终值以及增量,否则,会犯”多一错误”或”丢一错误”。 68例12 设ch是个字符变量。ch=A;while(ch=K)coutch;ch=ch+1;cout2) cout”NULL OPERATIONn”;while(true) cout”INFINITE LOOP!n”;
25、 while(getche( )!=X0D); / 这个循环直到键入回车为止 70复合语句do 语句 while (表达式);单一语句do 语句while (表达式);0非0表达式 语句 2.4 do-while语句71例16 承例12,可使用do-while语句实现同样功能。ch=A;do coutch; ch=ch+1; while(ch=K);cout2) cout”NULL OPERATIONn”; / 空操作语句do cout2); / 输出一行文字信息 732.5 for语句一般形式: for (表达式1;表达式2;表达式3) 语句注意:三个表达式可以部分地或全部省略,但分号必须保
26、留。 例23 承例12、例16,可使用for语句实现同样功能。for(ch=A;ch=K;ch=ch+1)coutch;coutendl; 74例27 使用for语句实现循环控制的两种特殊情形for(ch=Z;ch=Y;ch=ch-1) cout”DO NOTHINGn”;/ 相当于空操作语句for(;true;) cout”INFINITE LOOP!n”;/无限循环!应避免此类语句编码752.6 用于循环控制的几个特殊运算符2.6.1 增量运算符与减量运算符76增量运算符”+”:自增运算符。减量运算符”-”: 自减运算符。都是单目运算符,可出现在操作数前(作为前缀)或后(作为后缀)。结合规
27、则是从右到左。77例28 自增、自减运算符”+”、”-”的使用。#includevoid main( )int i=3,j=5;cout”i=”i”,j=”jendl;cout”i+=”i+”,j-=”j-endl;cout”Now i=”i”,j=”jendl;i=3;j=5;cout”i=”i”,j=”jendl;cout” i=”+i ”,-j=”-jendl;cout”Now i=”i”,j=”jendl;运行示例i=3,j=5i+=3,j-=5Now i=4,j=4i=3,j=5i=4,-j=4Now i=4,j=4782.6.2 逗号运算符用于将多个表达式串联在一起,是优先级最低的
28、运算符是双目运算符,其结合规则从左到右由逗号运算符与左右两个操作数组成逗号表达式逗号表达式一般形式: 表达式1,表达式2功能:先求表达式1的值,再求表达式2的值,并以表达式2的值作为该逗号表达式的结果值。79例 计算前N个自然数中所有奇数之和。sum=0;for (counter=1;counter=N;counter=counter+2) sum=sum+counter;改写为for (sum=0,counter=1;counter=N; counter=counter+2) sum=sum+counter;还可改写为for (sum=0,counter=1;counter=N; sum=s
29、um+counter,counter=counter+2); /for循环体为空语句 802.6.3 自反赋值运算符 自反赋值运算符是一个复合运算符。它用于简写赋值表达式。81例 可进一步改写for语句for (sum=0, counter=1; counter=N; counter=counter+2) sum+=counter;或者for (sum=0, counter=1; counter=N; counter+, counter+) sum+=counter;82运算符的优先级及结合性优先级运算符( )+ - + - !* / %+ - = !=&|?:= += -= *= /+ %=
30、,类型圆括号单目运算符乘法运算符加法运算符关系运算符相等测试运算符逻辑与逻辑或条件运算符赋值运算符逗号运算符结合性从左到右从右到左从左到右从左到右从左到右从左到右从左到右从左到右从右到左从右到左从左到右高832.8.1 break语句break一般形式是: break; 功能:用于switch、 while、do-while或for结构中 转换控制流:立即退出该结构,使流程控制 转向执行该结构后的第一条语句。注意:不能用于从if语句的选择结构中跳出。仅能从它自身所在循环体中跳出,即仅实现向”外”跳一层。2.8 break语句、continue语句和goto语句84#includevoid ma
31、in( ) int i,j,min,k; do coutij; while(!(i0&j0); min=i=1;k-) if(i%k=0&j%k=0) break; cout”The greatest common divisor of”i” and ”j” is ” k.endl;例34 求两个正整数i, j的最大公因子,采用穷举法。852.8.2 continue语句continue语句的一般形式是 continue; 功能:从当前位置将流程控制转移至本次循环的结束 位置,并继续执行下一次循环。在while和do- while结构中,执行完continue语句后就立即 测试继续循环的条件。
32、在for结构中,执行完 continue语句后即执行增量表达式,然后测试 继续循环的条件。注意:只用于while、do-while及for这三类循环中。86#include#includevoid main( ) int i=0,n; for(n=101;n=200;n+) if(n%3=0|n%5=0|n%7=0) continue; coutsetw(5)n; if(+i%10=0) coutendl; coutendl;例39 把101200之间除了能被3或5或7整除的数之外所有数输出,每10个数据输出在一行上。872.8.3 goto语句一般形式: goto标号名; 功能:将流程控制转
33、向由标号名所指定的语句处继续 执行。注意:标号名不必特殊地加以定义,它可以是任意合法的标识符标号名加上冒号,就形成一个语句标号语句标号可以出现在任何语句之前88#include #include main() int i, sum=0; i=1; loop: if (i=100) sum+=i; i+; goto loop; cout ”The sum is: ” sum; 例 利用goto语句实现计算前100个自然数之和并输出结果。 89第三章 数组903.1 一维数组3.1.1 一维数组说明一般形式:类型说明符 一维数组名 常量表达式 例1 int ia10; double da20; 9
34、192说明:数组以0为第一元素下标。数组名表示数组第一个元素的地址。数组以元素为单位进行操作,数组不能被整体引用或赋值。93引用一维数组元素: 一维数组名下标 例2 int i, ia10; 欲给数组ia的所有元素均赋以初始值0: for (i=0; i10; i+) iai=0;943.1.2 一维数组的初始化方式一 对数组全部元素赋初值例 int ia10=0,0,0,0,0,0,0,0,0,0;方式二 对数组部分元素赋初值例 int ib10=1,2,3,4,5; 系统将把1,2,3,4,5分别赋予ib的前5个元素,而后5个元素将自动被赋以0值。95方式三 对全部元素赋初值时,可在说明中
35、省 略对数组大小的指定。例 int ia =0,0,0,0,0,0,0,0,0,0; 系统将根据所赋初始值的个数自动确定该一维数组的大小。注意,若此时写 int ia =0; 则其效果将与例10中的不一样,ia只有一个元素。963.1.3 一维数组应用示例 例11 从键盘上任意输入5个整数,然后先按顺 序将它们输出在一行上,再按与输入时的 相反顺序将它们输出在下一行上。 97 #include #includevoid main( )int i,a5;cout”Enter 5 integers:”;for(i=0;iai;for(i=0;i5;i+) coutsetw(4)ai;cout=0;
36、i-) coutsetw(4)ai;coutendl;运行示例Enter5integers:8 6 5 4 18 6 5 4 11 4 5 6 8983.2 多维数组3.2.1 二维数组说明一般形式:类型说明符 二维数组名常量表达式1常量表达式2 例17 int ia34; double da510; 993.2.2 二维数组的初始化二维数组初始化允许用两种形式:例19 形式一 int ia34=0,0,0,0,0,0,0,0,0,0,0,0; 形式二 int ia34=0,0,0,0, 0,0,0,0, 0,0,0,0;100 对二维数组的全部元素赋以初值时,可在数组 说明中省略书写第一维的
37、大小,但第二维的大 小不可缺少。例 int m 5= 1,1,1,1,1, 2,2,2,2,2, 3,3,3,3,3, 4,4,4,4,4 ;1013.2.3 二维数组应用示例例26 计算两矩阵a与b的乘积并输出结果, 其中102分析 两矩阵a(M P)、b(P N)相乘的条件是: 矩阵a的列数=矩阵b的行数=P=3设c=a*b,则有(i=1,2,3,4;k=1,2)103核心语句编码for (i=1;i=M;i+) for (k=1;k=N;k+) s=0; for (j=1;j=P;j+) s+=aij*bjk; / for j cik=s; / for k / for i i=1,2,M
38、; k=1,2,N P=3,M=4,N=2 a(M P)b(P N)c(M N)104C+语言提供了字符串类string(标准标识符)。使用string类必须包含头文件string.h。正确使用string字符串的几点说明:(1)名字空间名字空间是一种方便有用的工具,用其将标识符限定在名字空间,以便防止标识符命名的冲突。3.3 字符串类型string 105C程序中的包含命令 #include#include将改写成 #include #includeusing namespace std;using、namespace都是C+关键字。std是名字空间的名称(代表standard)C+语言所有
39、标准函数库都封装在名为std的名字空间中。使用不带扩展名.h的头文件形式,必须加上using指令。106(2)string变量说明及初始化例31 string变量说明及初始化示例string s1=”I like C very much!”;string s2; /缺省初始值为空串(3)使用赋值运算符”=”对string型变量赋值。例32 s2= ”Do you like C+?”;107(4)string字符串的连接例33 s1=s1+s2; s1=s1+”Yes,I do.”;或: s1+=s2; s1+=”Yes,I do.”;108(5)string字符串的比较 ”、”、”=”、”=”
40、、”!=” (6)string字符串的长度 length是不带参数的函数,它返回某字符串的长度。例:求字符串变量s1的长度。s1.length( )。109第四章 函数110 函数使复杂问题划分成若干目标明确、较易处理的子问题,程序易读写、理解、排错、修改和维护。一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位。一个C程序由一个或多个源程序文件组成。一个源文件可以为多个C程序公用。一个较大的程序,一般将函数和其他内容分别放到若干个源文件中,再由若干个源文件组成一个C程序。这样可以分别编写、分别编译,提高调试效率。4.1 函数概述1114.2 函数定义与调用4.2.1 函数定义1
41、. 无参函数定义函数类型标识符 函数名( ) / 函数首部 语句序列 / 函数体 1122. 有参函数定义函数类型标识符 函数名(形式参数及类型说明表) 语句序列 形式参数及类型说明表:类型名1 形式参数1,类型名2 形式参数2, 1131.函数的数据类型函数返回值允许使用void类型。用于定义不返回值的函数允许在函数定义中省略书写函数类型标识符,系统将默认该函数返回值的类型为int型C+中主函数main应指明函数类型。4.2.2 函数的数据类型和返回值1142.函数的返回值返回函数结果值的语句: return (表达式); 或 return 表达式; 或 return; /可不写若retur
42、n语句中表达式的类型与函数的返回值类型不一致,则将转换成函数的返回值类型在函数体中,可根据需要在多处使用return语句115例7 已给某三角形的三边长,求该三角形的面积float area(float a,float b,float c) float l,s;l=(a+b+c)/2;s=sqrt(l*(l-a)*(l-b)*(l*-c);return (s); 116例 若ch的值是英文大写字母,则返回相对应的英文小写字母;若ch的值是英文小写字母,则返回相对应的英文大写字母;若ch的值是任意其他字符,则返回原字符值不变。 char change(char ch) char c=ch;if
43、(ch=A & ch=a & ch=z) c=ch-32;return (c); 1174.2.3 函数调用的一般形式无参函数调用函数名() 有参函数调用 函数名(实在参数1,实在参数2,) 1184.2.4 函数调用的两种方式 所有允许书写表达式的地方,均可出现对非void型函数的调用。方式一 函数调用可出现在表达式中例 承例7,设已说明实型变量s1,可写 s1=area(3.0,4.0,5.0); 119方式二 void 型函数调用可作为独立的语句出现在程序中例 设定义无返回值函数printviod print() int i; for (i=1;i=5;i+) cout * endl;
44、/由于无返回值,return语句可以省略。若写下述函数调用语句 print();则将输出5行星花串。120例15 编写程序,以键盘输入的三个正实数作 为三角形的三个边长,计算三角形面积 并输出结果。要求判断输入数据的合理 性并使用己知三边长求三角形面积的函 数定义。121 #include #includedouble area(double a,double b,double c)double l,s;l=(a+b+c)/2;s=sqrt(l*(l-a)*(l-b)*(l-c);return(s);122void main( )double a,b,c,s; do cout0):; cina
45、bc; while(!(a0&b0&c0&a+bc&b+ca&c+ab);s=area(a,b,c);coutThe area is s.endl;1234.3 函数原型函数原型:函数必须在使用前先定义,或者先提供函数说明语句进行函数说明。系统预定义标准库函数,其函数原型包含在相应的头文件中。程序员自定义函数,而且函数定义出现在函数调用之后,则必须有函数原型。定义在函数调用之前的函数不要求有单独的函数原型。124无参函数的函数原型其一般形式是函数类型标识符 函数名( );有参函数的函数原型其一般形式是函数类型标识符 函数名(类型名1 形式参数1,类型名2 形式参数2,);或函数类型标识符 函数
46、名(类型名1,类型名2,);125例 承例15。#include#includevoid main( )double area(double a,double b,double c); double a,b,c,s; do cout0):; cinabc; while(!(a0&b0&c0&a+bc&b+ca&c+ab);s=area(a,b,c);coutThe area is s.endl;126double area(double a,double b,double c)double l,s;l=(a+b+c)/2;s=sqrt(l*(l-a)*(l-b)*(l-c);return(s)
47、;1274.4 函数的嵌套调用与递归调用C中所有函数的定义都是平行的;不允许在一个函数的内部再定义其他函数;允许在函数定义中包含对其他函数的调用嵌套调用;允许间接地或直接地调用自身递归调用。128假如一个对象,它部分地由自己组成,或者是用自己来定义,则称它是递归的。递归问题的共性递归的概念 (1)有一个”基本实例”,即结束递归的条件;(2)问题可转化为相似问题,但较原始问题简化;(3)可以应用此转化过程使问题获得解决。递归的概念与数学中的递推、迭代等概念相似。129示例 计算阶乘的递推算法数学公式递推算法130例25 计算某非负整数的阶乘的递归函数定义 long fac(int n) long
48、 f; if (n=0) f=1; else f=n*fac(n-1); return (f); fac(5) fac(5)返回120 5*fac(4) 5*fac(4)返回120 4*fac(3) 4*fac(3)返回24 3*fac(2) 3*fac(2)返回6 2*fac(1) 2*fac(1)返回2 1*fac(0) 1*fac(0) 返回1 1 1131函数调用时,才在内存的栈区为形参分配存储单元,同时还为函数的返回地址、函数的返回值、函数体中所说明的局部变量等分配相应存储单元。函数调用一般要求实参和形参的个数相等,按顺序一一对应,且参数类型赋值匹配。调用函数和被调用函数之间产生数据
49、传递的途径:通过实参和形参结合进行数据传递,并通过return语句把函数值返回调用函数;通过全程变量在两个函数之间传递数据。4.5 通过函数参数传递数据1324.5.1 值参数当用简单变量作为函数传递数据的参数时,数据只能从实参单向传递给形参即按值传递。不管形参的值怎样变化,都不会影响实参的原有取值。例31 下述C程序演示了函数参数传递数据是从实参单向传递给形参,即按值传递。133/ program c411.cpp #includevoid show(int n)n=5;cout“n=“nendl;void main( )int i=1; cout“i=“iendl; show(i); co
50、ut“now i=“iendl;运行示例i=1n=5now i=11344.5.2 引用参数传引用调用:实现参数按传引用方式传递,使实参与形参之间的传递关系可以是双向的,即有去有回。传引用调用时传递的是实参的地址,任何对形参的值的改变都必然反映到实参上。若写如下函数首部void show(int &n)则表示:n是对一个整型变量的引用。135#includevoid swap(int &,int &);void main( )int i,j;coutij;cout”i=”i”,j=”jendl;swap(i,j);cout”now i=”i”,j=”jendl;例33下述程序实现:从键盘输入两
51、个整数,调用带引用参数的函数,交换这两个整数的值并输出结果。136void swap(int &m,int &n)int t;t=m;m=n;n=t;运行示例Enter i,j:100 200i=100,j=200now i=200,j=1001374.5.4 缺省参数 缺省参数也称默认参数。C+允许将有的形参指定为缺省参数,并为它们提供缺省值。当函数调用时省略了与缺省参数相对应的实参时,系统将会把缺省值自动地传递给缺省参数。而当函数调用时写上了实参时,则就把实参的值传递给相应的作为缺省参数的形参,此时其缺省值不起作用。138例35 下述C程序演示了带缺省参数的函数原型、函数定义以及函数调用的
52、编写与使用方法。整型函数volumn用于对已给三边长计算并返回长方体体积。#include#includeconst int DEFAULT=10;int volumn(int length=DEFAULT, int width=DEFAULT, int height=DEFAULT);139void main( )int l,w,h,v; l=5;w=8;h=20; v=volumn(l,w,h);/不用缺省值 cout”For l=”setw(2)”,w=”setw(2)w”,h=setw(2)h”,”setw(2)l”*”setw(2)w”*”setw(2)h”=”setw(4)vend
53、l; l=5;w=8; v=volumn(l,w); /h用缺省值140cout”For l=”setw(2)l”,w=”setw(2)w”,h=”DEFAULT”,”setw(2)l”*”setw(2)w”*”DEFAULT”=”setw(4)vendl;l=5; v=volumn(l); /w,h用缺省值cout”For l=”setw(2)l”,w=”DEFAULT”,h=”DEFAULT”,”setw(2)l”*”DEFAULT”*”DEFAULT”=”setw(4)vendl;v=volumn( ); /l,w,h均用缺省值141cout”For l=”DEFAULT”,w=”DEF
54、AULT”,h=”DEFAULT”,”DEFAULT”*”DEFAULT”*”DEFAULT”=”setw(4)vendl;int volumn(int length,int width,int height)int v;v=length*width*height;return(v);142/* l=5; w=8; h=20; v=volumn(l,w,h); l=5; w=8; v=volumn(l,w); l=5; v=volumn(l); v=volumn( ); */运行示例 For l= 5,w=8,h=20, 5* 8*20= 800 For l= 5,w=8,h=10, 5* 8
55、*10= 400 For l= 5,w=10,h=10, 5*10*10= 500 For l=10,w=10,h=10,10*10*10=10001434.6 数组作为函数参数传递传地址:但当数组名或指针作为形参向被调用函数传递时,调用时指向该数组第一个元素的指针(地址)就被传递给被调用函数。 当一个参数是传地址时,任何对形式参数的值的改变都必然反映到实在参数上。注意数组变量的类型在两个函数中必须相匹配。144例37 函数sort实现将含有n(n1)个元素的整型数组按其值从大到小的顺序重新排列,且放置于原数组之中。#include#includevoid sort(int a ,int n)
56、;void print(int a ,int n);void main( )const int MAX=15; int i,n; int aMAX; docout”Enter n(1=n=”MAXn; while(!(n=1&n=MAX); cout”Enter ”n” integers:”;145for(i=0;iai;cout”Array a is:”endl;print(a,n);sort(a,n);cout”After sorting,now array a is:”endl;print(a,n);146void sort(int a ,int n)int i,j,k,temp; fo
57、r(i=0;in-1;i+) /选择排序 k=i; /设i为最小值位置 for(j=i+1;jaj) /有更小的时 k=j; if(k!=i) temp=ai; ai=ak; ak=temp; 147void print(int a ,int n)int i; for(i=0;in;i+) coutsetw(4)ai; coutendl;1484.7 变量的作用域和存储类别变量的作用域变量都有一个有效的作用域。作用域是指能使该变量保持有定义并能为系统所识别的那一程序区域,即能够引用该变量的程序块。作用域随变量说明时不同存储类别及所处不同位置而有大有小。有局部变量和全局变量两类概念。1494.7
58、.1 局部变量和全局变量函数内部或复合语句块内说明的变量称为局部变量。函数首部中的形参也是局部变量。局部变量的作用域是它所在的函数或复合语句块。不同函数中的变量,可以取相同名字,但它们却是不相干的。在函数外部说明的变量称为全局变量,或称外部变量。全局变量的作用域是从该变量说明的位置开始,直至源文件结束。150例41 局部变量与全局变量#include int a=2,x=3,z; /全局变量a,x,z void p(int x) /局部变量x int a; /局部变量a a=x*x+1; z=a+x; couta,x,zendl; /a,x,z void main() p(a); /全局变量a
59、 couta,x,zendl; 运行示例 5,2,7 2,3,7ax1514.7.3 变量的生存期变量值的可继承范围(分配内存单元)称为该变量的生存期。非静态局部变量的生存期是自进入变量说明所在的函数体或复合语句块开始,直至从函数体或复合语句块退出时为止。而静态局部变量和全局变量的生存期是整个程序运行期间。注意:存在不等于其他函数可以引用。1524.7.4 变量的存储类别存储类别指变量在内存中存储的方式。存储类别确定了变量在内存中的存储位置,从而也确定了该变量的作用域和生存期。内存中的存储区域包括程序代码区、静态存储区和动态存储区三个部分。变量根据其不同的存储类别,可分别分配在静态存储区和动态
60、存储区内。153154四种变量的存储类别说明符: auto 自动的 register 寄存器的 static 静态的 extern 外部的155auto变量凡在函数内或复合函数内说明的变量都是auto变量。存储方式说明符auto可予省略。auto变量在内存的动态存储区分配相应存储单元。auto变量随函数或复合语句块的运行而产生,随函数或复合语句块的执行完毕而消失。auto变量是局部变量,其有效作用域从说明该变量开始,到执行完其所在函数或复合语句块时结束。 1563. static局部变量(与auto变量的主要区别):static局部变量是在静态存储区占据着存储单元,因此即使退出函数或复合语句块
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度工艺美术大师作品授权合同4篇
- 2025年度安全生产风险抵押金缴纳合同样本3篇
- 磨工岗位劳动合同及职业伤害赔偿协议4篇
- 2025年度茶青出口关税减免申请服务合同范本4篇
- 2025年度城市公共安全监控中心建设与运营合同4篇
- 2025年度美发店品牌形象设计与推广合同4篇
- 二零二五版零副食品行业论坛与研讨会组织合同3篇
- 2025年度企业邮箱数据备份与恢复服务合同4篇
- 个人借款协议:2024年版特定双方贷款合同
- 二零二五年文化艺术节承办与赞助合同3篇
- 课题申报书:GenAI赋能新质人才培养的生成式学习设计研究
- 骆驼祥子-(一)-剧本
- 全国医院数量统计
- 2024年医美行业社媒平台人群趋势洞察报告-医美行业观察星秀传媒
- 电工(中级工)理论知识练习题(附参考答案)
- 工业设计概论试题
- 2024-2030年中国商务服务行业市场现状调查及投资前景研判报告
- 高一英语必修一试卷(含答案)(适合测试)
- 中国的世界遗产智慧树知到期末考试答案2024年
- 中国绿色食品市场调查与分析报告
- 手卫生依从性调查表
评论
0/150
提交评论