C++语言基础ppt课件_第1页
C++语言基础ppt课件_第2页
C++语言基础ppt课件_第3页
C++语言基础ppt课件_第4页
C++语言基础ppt课件_第5页
已阅读5页,还剩491页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,1,C+语言基础,盐城工学院惠为君,.,2,C+概述,C+的特点发展历史和未来(CC+(ATconstintNumber_of_Student=100;常变量必须也只能在说明时进行初始化;常变量初始化之后,不允许再被赋值;常变量必须先说明后使用;常变量存储在数据区,并且可以按地址访问,编译时系统对常变量进行类型检查。C+建议使用常变量,而尽量不使用字面常量。,2.3.3结束,.,26,2.1.7变量,1变量说明,2变量赋初值,变量,在程序中是指可以改变值的量;变量必须用标识符进行标识,称为变量名;变量有类型之分,如整形变量、字符变量等;任何变量都必须先说明后使用;一是便于编译程序为变量分配空间,二是便于编译时进行语法检查;变量使用的第一步,是给变量赋初始值;,ok,.,27,变量说明,在C+中,变量说明的一般格式为:存储类型数据类型变量名1,变量名2,变量名n;,下面是变量说明的几个例子:inti,j,k;/说明三个整型变量i,j,kfloatx,y,z;/说明三个实型变量x,y,zcharc1,c2;/说明两个字符型变量c1,c2doubledx;/说明一个双精度型变量dx,变量说明结束,.,28,变量赋初值,(1)变量说明时直接赋初值。例如:inta=3,b=4,c=5;floatx=3.0;(2)用赋值语句赋初值。严格的说,只有前者可称赋初值例如:floatx,e;x=3.5;e=2.71828;,结束,给变量赋初值称为初始化,有两种方法:,.,29,2.2基本运算符,对常量和变量进行运算是通过运算符来实现的.常量和变量通过运算符组成C+表达式,由表达式再组成C+语句.运算符是完成对常量和变量进行运算的符号.把参与运算的对象称为操作数.,按照要求的操作数的个数,运算符分为单目(一元)运算符、双目(二元)运算符和三目(三元)运算符。单目运算符只对一个操作数运算,如负号运算符“”等;双目运算符要求有两个操作数,如乘号运算符“*”等;三目运算符要求有三个操作数,三元运算符只有一个“?:”。,.,30,1.算术运算符,ok,.,31,运算符重载:当两个操作数均为整数时,*和/重载为整乘和整除,结果为整数,除法运算后舍去小数取整。如:5/4/结果为1,整数,当两个操作数均为整数,%定义为求余运算,也称求模运算,结果为两个整数相除后的余数。如果两个整数中有负数,则先用两数绝对值求余,最后结果的符号与被除数相同。例如6%3/结果为06%7/结果为67%6/结果为1,.,32,C+中算术运算应注意数据溢出问题,即运算结果超出对应数据类型的表示范围。编译程序只会对除法运算时除数为0这种情况提示出错,而特别容易溢出的整数的加、减和乘法运算产生溢出的情况,系统不作为错误处理,程序将继续执行并产生错误的计算结果。因此,程序设计者必须在程序中解决检查并处理整数溢出问题。,只要有一个操作数是实数,两个操作数均转换为double型,*和/重载为普通的乘和除,结果是实数:5/4.0/结果为1.25,实数,.,33,2.关系运算符和逻辑运算符,ok,关系运算符都是二元运算符,包括:(大于)、(不小于)、(小于)、(不小于)、=(等于)和!=(不等于)。关系运算符完成两个操作数大小的比较,结果为逻辑值true(真)或false(假)。每种可比较大小的数据类型,都重载了关系运算符。不同类型,自动转换为同一类型后,采用对应关系运算符进行比较。,在C+中这两个逻辑值与整数之间有一个对应关系,真对应1,假对应0;反过来,0对应假,非0整数对应真。所以关系运算结果可以作为整数参与算术运算、关系运算、逻辑运算及其他运算。,.,34,2.关系运算符和逻辑运算符,设有定义floata=3.2;intb=5;则:3ab/结果是?,根据右结合原则其运算过程如下:,a,5,b,3.2,3,F,即0,F即0,.,35,逻辑运算符,.,36,逻辑运算符用来进行逻辑运算。其操作数和运算结果均为逻辑量。运算结果同样可以作为一个整数参与其他运算。,由于逻辑值和整数之间的对应关系,也允许整型和字符型操作数进行逻辑运算:21/左值不能是常数x+y=z;/左值不能是表达式constintN=30;N=40;/左值不能是常变量,.,43,5.自增自减运算,运算分前置和后置两种,前置是先增减后引用,即先对变量自加或自减,用新的值参与其他运算;后置则是先引用后增减,即用变量原来的值参与其他运算,然后再对变量进行自加或自减,例如:inti=5,j=5,m,n;m=i+;/后置;相当于m=i;i=i+1;/结果:i的值为6,m的值为5;n=+j;/前置;相当于j=j+1;n=j;/结果:j的值为6,n的值为6;,意义:使变量当前值加1或减1,再赋给该变量。要求:操作数只能是变量,不能是常量或表达式;,ok,.,44,sizeof()运算符,用于计算一个操作数类型或一个变量的字节数。一般格式为:sizeof(数据类型)或sizeof(变量名)例如:sizeof(int)值为4sizeof(float)值为4doublex;sizeof(x)值为8,结束,.,45,2.2.2表达式,1算术表达式,2关系表达式,3逻辑表达式和逻辑表达式求值的优化,4赋值表达式与复合赋值表达式,5逗号表达式,ok,.,46,1.算术表达式,使用时注意:1、表达式中每个变量都有确定的值时才能进行表达式求值;2、考虑到算术运算溢出和精度问题,应避免:(1)两个很接近的数直接相减;(2)除数是一个很小的数;(3)整数的连续乘运算。,ok,由算术运算符连接的表达式称为算术表达式,例如:a+b*3;,.,47,2.关系表达式,例如:abc/*等同于(ab)c,先求ab的值,再将结果0或1与c比较大小*/a+bc+d/*等同于(a+b)(c+d),结果为0或1*/y=ab/*计算ab的值0或1赋给y,y的值为0或1*/,由关系运算符连接的表达式。值为true或false。,ok,.,48,3.逻辑表达式和逻辑表达式求值的优化,由逻辑运算符连接的表达式称为逻辑表达式。逻辑表达式的值为true或false。这个值可对应整数1或0参与其他运算。,ok,已知:inta=10,b=20,c=30;floatx=1.8,y=2.4;,ay|ay)|(a变量名1变量名2变量名n;cout实现将数据输出到显示器的操作,一般格式为:cout,.,58,3.1.1十进制数据的输入输出,请看下例:inti,j;floatx,y;coutij;/Dcinxy;cout则程序输出:i=10j=20 x+y=13.1输出时各数据间是无间隔的,因此应当有意输出一些间隔符,ok,.,59,3.1.2输入字符数据cin与cin.get()的区别(1)cin例如:charc1,c2,c3;cinc1;/Acinc2c3;程序执行到A行时,等待用户输入数据。若输入:Abc则cin分别将字符A、b、c赋给变量c1、c2、c3。cin自动跳过输入的空白字符(包括空格,制表,backspace和回车等)。,.,60,(2)cin.get()例如:charc1,c2,c3,c4;cin.get(c1);/Bcin.get(c2);cin.get(c3);程序执行到B行时,若输入:Ab则执行结果是:字符A、空格、字符b分别赋给变量c1、c2、c3;输入行中仍保留回车符。cin.get()把从键盘上输入的所有字符,包括空白字符,都作为输入字符赋给字符变量,.,61,关于字符的输出,请看下例,假定字符c1、c2、c3的值分别为字符a、b和c,执行以下语句序列:coutc1tc2n;coutc3endl;coutOkendl;屏幕上将输出:abcOk输出时字符之间是无间隔的,如果想让字符间有间隔,必须输出间隔符,.,62,补充.字符串输入输出,向一个字符数组中输入字符串时,用函数getline()。getline()以用户按下回车键作为结束,在此之前的所有输入都放入字符数组中:cin.getline(char,int)其中第一个参数是已经定义的字符数组名,第二个参数是读入字符的最多个数n(包括字符串结束符/0)。,ok,常用cout输出字符串。双引号中的字符串常量照原样输出,程序中通常通过输出字符串常量来输出一些提示信息。字符数组将输出串结束符前所有字符。,.,63,补充:字符串输入输出,函数保证在执行时总会为字符串的结束符保留一个字节。当键盘的输入字符(字节)数多于(n1)时,后面的字符不会进入字符数组,字符串结束符自动加在字符数组的最后一个字节中。当输入字符数少于该值时,字符串结束符自动加在输入到字符数组中的最后一个字符的后面。请看下例:charcity11;cin.getline(city,10);/输入城市名最多5个中文字cout“城市名:“cityi;/输入为八进制数cinhexj;/输入为十六进制数cink;/输入仍为十六进制数cindecl;/输入为十进制数cout”hex:”i=”hexiendl;cout”dec:”j=”decjt;cout”k=”kendl;cout”oct:”l=”octl;coutdecbc;coutb)max=a;elsemax=b;if(cmax)cout“最大数为:”cendl;elsecout“最大数为:”maxbc;coutb)if(ac)max=a;/ab且acelsemax=c;/ab且ac)max=b;/acelsemax=c;/a=b且bccout最大数max=bc;coutb,if语句,ok,.,75,要特别注意else和if的配对关系。C+规定了if和else的“就近配对”原则,即相距最近且还没有配对的一对if和else首先配对。按上述规定,第二种嵌套形式中的else应与第二个if配对。如果根据程序的逻辑需要改变配对关系,则要将属于同一层的语句放在一对“”中。如第二种嵌套形式中,要让else和第一个if配对,语句必须写成:if(表达式1)if(表达式2)语句1;else语句2;第二种嵌套形式较容易产生逻辑错误,而第一种形式配对关系则非常明确,因此从程序可读性角度出发,建议尽量使用第一种嵌套形式。,.,76,请看以下两个语句:/语句1:if(n%3=0)if(n%5=0)coutn是15的倍数endl;elsecoutn是3的倍数但不是5的倍数endl;/语句2:if(n%3=0)if(n%5=0)coutn是15的倍数endl;elsecoutncount;if(count5)discount=1;elseif(count10)discount=0.9;elsediscount=0.8;amount=price*count*discount;cout购买件数:countendl;cout单价:pricet折扣:“discountendl;cout总价:amountbc;couta=atb=btc=cendl;delta=b*b-4*a*c;,求一元二次方程的根源程序,.,83,if(fabs(delta)0)delta=sqrt(delta);x1=(-b+delta)/(2*a);x2=(-b-delta)/(2*a);cout方程有两个不同实根:;coutx1=x1tx2=“x2endl;else/delta0cout方程无实根!endl;请在VC+平台上运行,输入不同的系数,使程序所有分支都可以被执行一次。,.,84,3.1.2条件运算符“?:”,if语句在某些情况下可以用条件运算符“?:”来简化表达。“?:”是一个三元运算符,其构成的表达式格式为:?:执行逻辑:先计算表达式1,若其值为真(或非0),则计算表达式2(不计算表达式3),并将该值作为整个表达式的值;反之,即表达式1的值为假或为0,则计算表达式3(不计算表达式2),并将该值作为整个表达式的值。例如:inta=6,b=7,min=ab?a:b;/min=6min=ascore;switch(score)caseA:casea:coutexcellent;break;caseB:caseb:coutgood;break;default:coutfair;(5)从形式上看,switch语句的可读性比嵌套if语句好,但不是所有多选一的问题都可由开关语句完成,这是因为开关语句中限定了条件表达式的取值类型。,ok,.,88,switch语句例子,【例36】运输公司对所运货物实行分段计费。设运输里程为s,则运费打折情况如下:s250不打折扣250=s5002%折扣500=s10005%折扣1000=s20008%折扣2000=s300010%折扣3000=s15%折扣设每公里每吨的基本运费为p,货物重量为w,折扣为d,则总运费f为:f=p*w*s*(1-d)设计程序,当输入p、w和s后,计算运费f。,.,89,算法,1、输入每吨运费p、货物重量w、运输里程s;2、根据运输里程s计算折扣d;3、计算总运费f=p*w*s*(1-d);4、输出计算结果;算法细化:2、根据运输里程s计算折扣d分析:如果用switch语句,必须使表达式符合语法要求,分析发现,里程s的分段点均是250的倍数,因此,将里程s除以250,取整数商,便得到若干整数值。,ok,.,90,switch(c=s/250)case0:d=0;break;case1:d=0.02;break;case2:case3:d=0.05;break;case4:case5:case6:case7:d=0.08;break;case8:case9:case10:case11:d=0.1;break;default:d=0.15;,s250不打折扣250=s5002%折扣500=s10005%折扣1000=s20008%折扣2000=sws;c=s/250;switch(c)case0:d=0;break;case1:d=0.02;break;case2:case3:d=0.05;break;case4:case5:case6:case7:d=0.08;break;case8:case9:case10:case11:d=0.1;break;default:d=0.15;f=p*w*s*(1-d);cout运输单价为pt重量为wt里程为sendl;cout折扣为dendl;cout运费为fopnum2;switch(op)case+:coutnum1opnum2=num1+num2endl;break;case-:coutnum1opnum2=num1-num2endl;break;case*:coutnum1opnum2=num1*num2endl;break;case/:coutnum1opnum2=num1/num2endl;break;default:coutop是无效运算符!;常量表达式采用字符型,上机运行一下。,.,93,循环控制语句是三种基本流程控制语句之一。C+提供以下三种循环语句:,while语句do-while语句for语句,4.3循环结构程序设计,.,94,4.3.1while语句,while语句也称为当循环。语句格式为:while(表达式)循环体语句;,图3.1while语句的执行流程图,求表达式的值,表达式值为真?,是,否,执行循环体语句,.,95,while语句,【例48】求1+2+3+4的值。,ok,N个连续整数相加算法1、设置变量i用来放被加数,变量sum用来放和值,并初始化;2、从第一个数开始,依次将被加数赋给i,并进行操作sumsum+i;3、输出sum;细化算法2:while(还有被加数)i=当前被加数;sum+=i;i准备接受下一个被加数;,.,96,源程序如下:#includevoidmain()inti=1,sum=0;/循环初始条件while(i=4)sum+=i;i+;/修改循环条件coutsum=sumendl;在VC+平台上运行,试一试是否正确,ok,.,97,while语句,注意:在有循环语句的程序中,通常循环开始前对循环条件进行初始化;而在循环体语句中要包含修改循环条件的语句,否则循环将不能终止而陷入死循环。C+表达方式灵活,上例中的循环语句还可以写成:while(i=n)sum+=i+;或者while(sum+=i+,i=n);/循环体为空语句修改程序后在VC+平台上运行,看是否正确,.,98,4.3.2do-while语句,do-while语句称为直到循环,格式为:do循环体语句while(表达式),否,是,表达式的值为真?,执行循环体语句,求表达式的值,图3.2do-while语句的执行流程图,.,99,do-while语句,do/while语句和while语句的区别:多数情况下可以互相替代。区别是do/while语句至少执行一次循环体后再判断循环条件是否满足;while语句先判断条件是否满足,然后才执行循环体。,.,100,【例49】输入一段文本,统计文本的行数、单词数及字符数。假定单词之间以空格或跳格或换行符间隔,且文本开始没有空行。算法分析:1、逐个读入文本中的字符,直到读到一个输入结束符EOF为止。2、如何算行数?行结束标志为读到字符n;3、如何算单词数?设一个变量isword,读到字符时isword=1,读到间隔符时isword=0;如果读到一个间隔符而此时isword值为1,则说明刚读完一个单词;(如果读到一个字符而此时isword值为0,则说明刚开始读一个单词;)4、如何算字符数?,do-while语句,ok,.,101,算法,1、设置变量line、word、ch分别代表行数、单词数、非分隔字符数,并初始化;设置变量isword来辅助统计单词数;2、do从键盘读入一个字符c;if(c=n)line+;if(是单词开头)word+;if(c不是分隔符)ch+;while(c!=EOF);3、输出统计结果。,将下面的程序在VC+平台上运行,试一试是否正确,.,102,#includevoidmain()charc;intline=0,word=0,ch=0;/ch为非分隔字符数intisword=0;doc=cin.get();if(c=n)line+;/遇换行符行数+1if(c!=,.,103,4.3.3for语句,for循环语句的格式为:for(;),ok,.,104,for语句、while语句、do/while语句实现相同的功能:1+2+3+4,inti=1,sum=0;/循环初始条件while(i=4)sum+=i;i+;/修改循环条件,inti=1,sum=0;/循环初始条件dosum+=i;i+;/修改循环条件while(i=4);,for(inti=1,sum=0;i=4;i+)sum+=i;/*习惯上:表达式1:循环初始条件;表达式2:循环终止条件;表达式3:修改循环条件*/,ok,.,105,for语句的应用,for语句的几点说明:1、是先判断型的,同while语句;2、使用更为灵活:三个表达式可以是任意表达式,因此他们就可以实现循环初始化、计算、修改循环条件等任务,而不一定非在循环体中进行;,.,106,for语句的应用,【例411】设计程序输出Fibonacii数列的前20项,要求每行输出5个数据。Fibonacii数列定义如下:,算法分析:除了第0项和第1项外,每一项都是由类似方法产生,即前两项之和;所以求当前项时,只需要记住前两项;程序不需要为每一项设置专用变量;属递推算法。,.,107,算法:1、设置变量n表示第几项,变量f1和f2用来记住当前项f3之前的两项;变量初始化n=0;2、while(当前项不到第20项)if(当前项是第0项)f1=0;if(当前项是第1项)f2=1;if(当前项是第2项或更高项)f3=f1+f2;按要求输出f3;f1=f2;f2=f3;/记住最近两项当前项后移一位;,.,108,【例311】设计程序输出Fibonacii数列的前20项,要求每行输出2个数据。Fibonacii数列定义如下:程序如下:/文件名:Ex3_11.cpp#include#includevoidmain()intfib0=0,fib1=1,fib2;coutsetw(5)fib0setw(5)fib1endl;for(intn=3;n=20;n+)fib2=fib0+fib1;coutsetw(5)fib2;if(n%5=0)coutnum;cout0);for(inti=0;isubscript;i+)/整数的反向组合num=num*10+digiti;cout反向后整数为:numendl;在VC+平台上运行,试一试是否正确,.,113,4.3.5循环的嵌套,【例313】打印九九表。打印格式为:*123456789112243369991827364554637281,当循环语句中的循环体中又有循环语句时,就构成了嵌套循环。嵌套层次一般不超过3层,已保证可读性。,.,114,循环的嵌套,分析:1、计算机的输出是按行进行的,因此可以先用一个循环语句输出第一行表头。2、表中各行数据的输出可以用下面的算法描述:for(i=1;i10;i+)couti;/输出行号输出第i行数据;/Acoutendl;/准备输出下一行,.,115,3、第A行需要进一步细化。由于第i行数据是一组有规律的数列,每个数的值是其所在行与列的乘积,因此输出第i行可以:for(j=1;j10;j+)coutsetw(4)i*j;4、按上述算法输出的每一行都将有九列,即打印出的是矩形表而不是下三角形表。进一步分析发现每一行的列数与所在行数相关,因此要输出三角形表,上面的循环语句需稍作修改:for(j=1;j=i;j+)coutsetw(4)i*j;将此语句放到顶层算法的A行即可。,循环的嵌套,.,116,算法:1、输出表头,用一个循环语句即可;2、输出表体:for(i=1;i10;i+)couti;/输出行号输出第i行数据;/Acoutendl;/准备输出下一行3、A行细化:for(j=1;j=i;j+)coutsetw(4)i*j;,循环的嵌套,.,117,在VC+平台上运行下面的程序:#include#includevoidmain()coutsetw(3)*setw(4);for(inti=1;i10;i+)coutsetw(4)i;/输出表头(乘数)coutendlendl;for(i=1;i10;i+)coutsetw(3)isetw(4);/输出行号(被乘数)for(intj=1;j=i;j+)coutsetw(4)i*j;/输出表中数据(乘积)cout2);令整型变量k=sqrt(m)2、判断m是否素数:设置辅助整型变量i,使i从2开始直到k依次测试m能否整除i,若能,则不是素数;for(i=2;im;if(m=2)coutk)coutm是素数endl;/循环提前终止表示是非素数elsecoutm不是素数endl;在VC+平台上运行,改一下,使程序自动算出100以内的素数,.,122,4.3.2continue语句,continue语句只能用在循环语句中,用来终止本次循环。当程序执行到continue语句时,将跳过其后尚未执行的循环体语句,开始下一次循环。下一次循环是否执行仍然取决于循环条件的判断。continue语句与break语句的区别在于,continue语句结束的只是本次循环,而break结束的是整个循环。,.,123,例:输出1100内3的倍数。分析:设置整型变量I从1变化到100,依次测试I是否3的倍数,算法属于穷举法。for(I=1;I=100;I+)if(I%3!=0)continue;/I不是3的倍数,不输出,继续下一个I;输出I的值;/I是3的倍数才输出,.,124,4.3.3goto语句,goto语句和标号语句一起使用,所谓标号语句是用标识符标识的语句,它控制程序从goto语句所在的地方转移到标号语句处。goto语句会导致程序结构混乱,可读性降低,而且它所完成的功能完全可以用算法的三种基本结构实现,因此一般不提倡使用goto语句。但在某些特定场合下goto语句可能会显出价值,比如在多层循环嵌套中,要从深层地方跳出所有循环,如果用break语句,不仅要使用多次,而且可读性较差,这时goto语句可以发挥作用。,.,125,4.3.4return语句,return语句用于结束函数的执行,返回调用者,如果是主函数,则返回至操作系统。利用一个return语句可以将一个数据返回给调用者。通常,当函数的返回类型为void时,return语句可以省略,如果使用也仅作为函数或程序结束的标志。,.,126,在结构化程序设计中,函数是将任务进行模块划分的基本单位。,第四章函数和编译预处理,在面向对象的程序设计中,对数据的操作总是封装在函数中,一个函数描述一种操作。不要完全按模块思想讲。也是让学生处于面向对象程序设计的氛围中。这样第5章的教学会顺利一些。,要掌握函数的使用,必须理解函数调用时的内部实现机制,以及与此相关的内存分配机制、变量生命期和作用域。,本章还将介绍关于函数重载的概念,介绍递归算法、内联函数、默认参数函数以及多文件组织、编译预处理、工程文件的概念和运行库函数。,.,127,第四章函数和编译预处理,51函数的定义与调用,5.5内联函数,54作用域和存储类,53函数的嵌套和递归调用,52函数的参数传递,返回值及函数原型说明,59程序多文件组织,58编译预处理,57函数重载,56具有缺省参数值的函数,.,128,5.1函数的定义与调用,5.1.1函数概述,5.1.2函数定义,5.1.3函数调用,.,129,4.1.1函数概述,函数是C+程序的基本组成模块。,通过函数,可以把一个复杂任务分解成为若干个易于解决的小任务。充分体现结构化程序设计由粗到精,逐步细化的设计思想。,组成C+程序的若干函数中,有一个称为main()(Winmain())函数,是程序执行的入口,它可以调用其他函数。而其他一般函数既可以调用也可以被调用。函数之间的调用关系见下图:,.,130,5.1.1函数概述,.,131,5.1.1函数概述,函数按是否带有参数,分为:无参函数和有参函数,4.1.1结束,函数按其是否系统预定义分为两类:一类是编译系统预定义的,称为库函数或标准函数,如一些常用的数学计算函数、字符串处理函数、图形处理函数、标准输入输出函数等。这些库函数都按功能分类,集中说明在不同的头文件中。用户只需在自己的程序中包含某个头文件,就可直接使用该文件中定义的函数。另一类是用户自定义函数,用户可以根据需要将某个具有相对独立功能的程序定义为函数。,.,132,5.1.2函数的定义,1.无参函数,2.有参函数,.,133,1无参函数,定义格式为:数据类型函数名(void)函数体,例:下面函数的功能是打印一个表头voidTableHead()cout*endl;cout*example*endl;cout*=y?x:y);voidmain()floatx,y;coutxy;coutx和y中较大数为max(x,y)endl;,.,138,5.2函数的参数传递、返回值及函数原型说明,521函数的参数传递及传值调用,523函数原型说明,522函数返回值,.,139,函数调用首先要进行参数传递,参数传递的方向是由实参传递给形参。传递过程是,先计算实参表达式的值,再将该值传递给对应的形参变量。一般情况下,实参和形参的个数和排列顺序应一一对应,并且对应参数应类型匹配(赋值兼容),即实参的类型可以转化为形参类型。而对应参数的参数名则不要求相同。,5.2.1函数的参数传递及传值调用,按照参数形式的不同,C+有两种调用方式:传值调用和引用调用。顾名思义,传值调用传递的是实参的值,本章主要介绍传值调用。关于引用调用,将在第五章类与对象中介绍。,.,140,5.2.1函数的参数传递及传值调用,调用power(a,3),函数power(a,3),return912673,主程序后续语句,【例52】说明实参和形参对应关系的示例。#include#includefloatpower(floatx,intn)/求x的n次幂floatpow=1;while(n-)pow*=x;returnpow;voidmain()intn=3;floatx=4.6;charc=a;coutpower(x,n)=power(x,n)endl;coutpower(c,n)=power(c,n)endl;coutpower(n,x)=power(n,x)bc;area=TriangleArea(a,b,c);if(area=-1)cout(a,b,c)不能构成三角形!endl;elsecout三角形(a,b,c)面积为:areachoice;while(choice=4);switch(choice)case1:account_report();break;case2:engineering_report();break;case3:marketing_report();break;,.,146,voidmenu_print()cout”系统功能:”endl;cout”1财务报表”endl;cout”2工程报表”endl;cout”3市场报表”endl;cout”选择业务序号:”;voidaccount_report()/生成财务报表voidengineering_report()/生成工程报表voidmarketing_report()/生成市场报表;,.,147,5.2.3函数原型说明,【例54】输出所有满足下列条件的正整数m:10mb;cout=a)intt;/具有块域t=a;a=b;b=t;/交换a,b的值couta=atb=bb;cout调用前:实参a=a,b=bendl;swap(a,b);/传值cout调用后:实参a=a,b=bendl;voidswap(inta,intb)/a,b作用域为swap()cout调用中endl;cout交换前:形参a=“a,b=bendl;intt;t=a;a=b;b=t;/交换swap()中的a,b的值cout交换后:形参a=a,b=bendl;,.,155,块作用域,由VC+平台运行,结果如下:输入两整数:35调用前:实参a=3,b=5调用中交换前:形参a=3,b=5交换后:形参a=5,b=3调用后:实参a=3,b=5交换失败,局部变量具有局部作用域使得程序在不同块中可以使用同名变量。这些同名变量各自在自己的作用域中可见,在其它地方不可见。,.,156,块作用域,对于块中嵌套其它块的情况,如果嵌套块中有同名局部变量,服从局部优先原则,即在内层块中屏蔽外层块中的同名变量,换句话说,内层块中局部变量的作用域为内层块;外层块中局部变量的作用域为外层除去包含同名变量的内层块部分。,如果块内定义的局部变量与全局变量同名,块内仍然局部变量优先,但与块作用域不同的是,在块内可以通过域运算符“:”访问同名的全局变量。,.,157,200300,内i=500,内j=600,内n=500+600=1100,1100500600,100,200+300=500,500,500200300,外部i=200,外部j=300,【例】显示同名变量可见性。intn=100;#includevoidmain()inti=200,j=300;coutntitjendl;/内部块inti=500,j=600,n;n=i+j;coutntitjendl;/输出局部变量ncout:nendl;/输出全局变量nn=i+j;/修改全局变量coutntitjendl;,.,158,2文件作用域,文件作用域也称全局作用域。定义在所有函数之外的标识符,具有文件作用域,作用域为从定义处到整个源文件结束。文件中定义的全局变量和函数都具有文件作用域。如果某个文件中说明了具有文件作用域的标识符,该文件又被另一个文件包含,则该标识符的作用域延伸到新的文件中。如cin和cout是在头文件iostream.h中说明的具有文件作用域的标识符,它们的作用域也延伸到嵌入iostream.h的文件中。,.,159,3函数原型作用域,函数原型不是定义函数,在作函数原型声明时,其中的形参作用域只在原型声明中,即作用域结束于右括号。正是由于形参不能被程序的其他地方引用,所以通常只要声明形参个数和类型,形参名可省略。,.,160,存储类型决定了变量的生命期,变量生命期指从获得空间到空间释放之间的时期。,5.4.2存储类型,存储类型的说明符有四个:auto,register,static和extern。前两者称为自动类型,后两者分别为静态和外部类型。,本节重点掌握static和extern这两种类型的使用和区别。具体说,区分局部变量和静态局部变量,全局变量和静态全局变量。,.,161,auto:前面提到的局部变量都是自动类型。其空间分配于块始,空间释放于块终,且由系统自动进行。自动变量保存在栈中,且是在程序运行过程中获得和释放空间,未初始化时值为随机数。,5.4.2变量的存储类型,register:为提高程序运行效率,可以将某些变量保存在寄存器中,即说明为寄存器变量,但不提倡使用。,static:静态变量。根据被修饰变量的位置不同,分为局部(内部)静态变量和全局(外部)静态变量。所有静态变量均存放在全局数据区,编译时获得存储空间,未初始化时自动全0,且只初始化一次。,.,162,局部静态变量的作用域为块域,但生命期为整个文件。即当块结束时,局部静态变量空间仍然保持,直到整个程序文件结束时该局部静态变量空间才释放,生命期结束。,局部静态变量,【例】自动变量与局部静态变量的区别。(演示),.,163,#includest()staticintt=100;/局部静态变量t+;returnt;at()intt=100;/自动变量t+;returnt;voidmain()inti;for(i=0;i5;i+)coutat()t;coutendl;for(i=0;i5;i+)coutst()t;coutendl;,5.4.2变量的存储类型,1,2,3,4,5,101,101,101,101,101,.,164,5.4.2变量的存储类型,1,2,101,3,4,5,102,103,104,105,#includest()staticintt=100;/局部静态变量t+;returnt;at()intt=100;/自动变量t+;returnt;voidmain()inti;for(i=0;i5;i+)coutat()t;coutendl;for(i=0;i5;i+)coutst()t;cout0;loops-);voidmain()delay(3);cout“延时3个时间单位endl;delay();/等同于delay(5)cout“延时5个时间单位endl;,5.6缺省参数,1,2,3,延时3个时间单位,1,2,3,4,5,延时5个时间单位,.,168,缺省参数通过表达式给出,所以可以使用函数调用,如:intfun1(inta=rand();参数a缺省时,可由随机数发生函数当场产生,编译时定的是调什么函数。,5.6缺省参数,缺省参数可以有多个,但所有缺省参数必须放在参数表的右侧,即先定义所有的非缺省参数,再定义缺省参数。这是因为在函数调用时,参数自左向右逐个匹配,当实参和形参个数不一致时只有这样才不会产生二义性。,一个参数只能在一个文件被指定一次缺省实参,习惯上,缺省参数在公共头文件包含的函数声明中指定,否则缺省实参只能用于包含该函数定义的文件中的函数调用。例如:intfun2(int,int=10,int=20);/函数原型中给出缺省值。参数名也可省略voidfun1()intfun2(inta,intb,intc)/定义中不再给出缺省值,.,169,5.7函数重载,在C+中,如果需要定义几个功能相似,而参数类型不

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论