第3章 语句和函数_第1页
第3章 语句和函数_第2页
第3章 语句和函数_第3页
第3章 语句和函数_第4页
第3章 语句和函数_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

第3章语句和函数C++程序设计语句声明语句执行语句

1、表达式语句

2、基本输入输出语句

3、控制语句

选择语句

循环语句

转向语句空语句复合语句(块语句)赋值语句“=”是最简单的赋值运算符,带有赋值运算符的表达式称为赋值表达式,由赋值表达式组成的语句就是赋值语句结构:变量标识符赋值运算符表达式;【例3.1】赋值语句。intx,y;floata,b,c;x=36; //赋值语句对x赋值36y=x*2+2*3-12;//赋值语句对y赋表达式x*2+2*3-12的值a=36.5; //赋值语句对a赋值36.5b=2.5*a+1.2; //赋值语句对b赋表达式2.5*a+1.2的值c=2.5*3.14-2.7/1.35+2.2;//赋值语句对c赋表达式2.5*3.14-2.7/1.35+2.2的值复合赋值运算符包括:等号与算术运算符结合:

+=、-=、*=、/=、%=等号与位运算符结合:

<<=、>>=、&=、^=、|=结合性:自右向左例如:Inta=3;a+=a*=2;//a=a+(a=a*2)=12Inta=8;a+=a*=a+a;//a=a+(a=a*(a+a))=256赋值运算的类型转换赋值运算符两边类型不一致,编译器会将右值的类型转换成左值的类型字符型赋值给整型变量

将字符型数据放在整型变量低8位,无符号数高8位补0,有符号数高8位补字符型数据的最高位数据Int型赋给longint型,int型数据放在低16位,高位补0Unsigned型赋给longint型,高位补0实型赋给整型,舍弃实数的小数部分整型赋给实数、数值大小不变,存储形式变为浮点数形式条件语句(if语句)功能:是一种选择结构,用来判断给出的条件是否满足,并根据判定结果来决定要执行的操作If语句的三种形式

1、简化的if语句

形式:if(表达式)

语句;

说明:

表达式一般是逻辑、关系表达式,值为0或非0;

语句可以是单条语句,也可以是花括号括起来的多条语句

2、If~else语句

形式:if(表达式)

语句1;

else

语句2;

3、if~elseif语句

形式:if(表达式1)

语句1;

elseif(表达式2)

语句2;

elseif(表达式n)

语句n;

else

语句n+1;If语句的嵌套

if语句中又包含一个或多个if语句

形式:if(表达式1)

{if(表达式2)语句1;

else语句2;}

else

{if(表达式3)语句3;

else语句4;}

功能:实现多路选择功能

注意:else总于最近的未配对的if配对,为了区分层次关系最好用花括弧将相关语句块括起来【例3.3】判断一个数是否大于60。#include<iostream.h>voidmain(){inta;cin>>a;cout<<″大于60吗?″<<endl;if(a>60)cout<<″是″;elsecout<<″否″;}【例3.4】判断一个整数是正数、负数还是0。Voidmain(){inta;cin>>a;if(a>=0)if(a==0)cout<<″零″;elsecout<<″正数″;elsecout<<″负数″;}开关语句(switch语句)形式:switch(表达式)

{case常量表达式1:语句1;break;

case常量表达式2:语句2;break;

case常量表达式n:语句n;break;

default:语句n+1;break;}功能:首先计算switch语句中表达式的值,当表达式的值与某一个case后面常量表达式的值匹配时,执行该case后的语句,遇到break语句退出switch语句;若表达式值与所有case后面的常量值都不匹配,则执行default语句注意:1、case语句及default语句出现的顺序没有影响,但每个case后的常量表达式值必须各不相同;

2、若case后面无break语句,则在执行完case语句后,不再进行条件判断,直接转向下一个case语句继续执行,直到遇到break才能推出switch语句;

3、default语句后的break可省略;

4、多个case语句可共享一组执行语句;

如:switch(grade)

{case‘A’:

case‘B’:

case‘C’:case‘D’:cout<<“及格\n”;break;

default:cout<<“不及格”;}【例3.5】一个产品分为m、p、q3个等级,根据等级可打印相应的产品的价格。switch(grade){case′m′:cout<<″1500″;break;case′p′:cout<<″1000″;break;case′q′:cout<<″500″;break;defaut:cout<<″没有这个等级″;}【例3.6】将月份的阿拉伯数字转换成对应月份的英文单词。#include<iostream.h>voidmain(){intmonth;cin>>month;switch(month){case1:cout<<″January″<<endl;break;case2:cout<<″February″<<endl;break;case3:cout<<″March″<<endl;break;case4:cout<<″April″<<endl;break;case5:cout<<″May″<<endl;break;case6:cout<<″June″<<endl;break;case7:cout<<″July″<<endl;break;case8:cout<<″August″<<endl;break;case9:cout<<″Septemper″<<endl;break;case10:cout<<″October″<<endl;break;case11:cout<<″November″<<endl;break;case12:cout<<″December″<<endl;break;default:cout<<″没有这个月份.″;}}循环语句循环语句主要有三种:for循环语句、while语句和do~while循环语句While语句

形式:while(表达式)

循环体语句;

功能:先判断表达式的值,为真则执行循环体,否则终止循环,循环体内需对循环控制变量进行修改Do~while语句

形式:do循环体语句;

while(表达式);

功能:先执行一次循环体语句,然后判断是否满足循环条件。Do~while语句中循环体至少被执行一次。【例3.7】读入若干个学生的成绩,计算他们的平均成绩。#include<iostream.h>voidmain(){intsum=0,count=0,grade;cin>>grade;while(grade>=0)//0表示输入结束{count++;sum+=grade;cin>>grade;}if(count>0)cout<<″平均成绩是:″<<sum/count<<endl;}【例3.8】求1~15的和。#include<iostream.h>main(){intj=1,sum=0;Dosum+=j++;while(j<16);cout<<″1~15的和是:″<<sum<<endl;}for循环语句形式:for(表达式1;表达式2;表达式3)

循环体语句;功能:先计算表达式1的值,再判断表达式2的值决定是否执行循环体,表达式2的值为真则执行,否则退出循环;没执行完一次循环体后,计算表达式3的值,再判断表达式2的值决定是否继续执行循环。说明:

表达式1是用来初始化循环变量的表达式;

表达式2是循环条件表达式,决定什么时候退出循环;

表达式3是增量表达式,决定循环变量的变化方式。注意:for语句括号内的三个表达式都可以省略,但分号不能省略;

1、省略表达式1,应在for语句前给循环变量赋值;

2、省略表达式2,即不判断结束条件,循环无终止进行,应在循环体中设置转向语句结束循环;

3、省略表达式3,在循环体中应有改变循环变量值的语句。【例3.9】用for语句求1~15的和。intsum=0;for(intj=1;j<=15;j++)sum+=j;也可写为:j=1;for(;j<=15;){sum+=j;j++;}例3.31intm=0;for(intj=1;j<=5;j++)for(intk=1;k<=6;k++)for(intp=1;p<=7;p++)m++;//m=5*6*7=210转向语句转向语句用于控制程序执行顺序,实现程序无条件转移的语句常见的转向语句有4种:

1、break语句

形式:break;

功能:

(1)用于switch语句中,可使程序跳出switch语句,继续执行switch后面的语句;

(2)用于循环语句中,可使程序从最近的封闭循环体中跳出,继续执行循环体后面的语句

2、continue语句(继续语句)

形式:continue;

功能:用于循环语句中,可使程序结束本次循环,即跳过continue后面的语句,转去判断循环控制条件,决定是否进行下一次循环

注意:continue语句只结束本次循环,不结束整个循环结构;

break语句是结束最近一层循环的整个循环结构。【例3.10】读入10个学生的成绩,计算其平均成绩,如果遇到负数则报告出错并退出。#include<iostream.h>voidmain(){intrecord,sum=0;boolflag=true;for(intj=1;j<=10;j++){cin>>record;if(record<0){flag=false;break;}sum+=record;}if(flag)cout<<″平均成绩是:″<<sum/10.0<<endl;elsecout<<″出错″<<endl;}【例3.11】统计一句话(以′.′结束)里字符a的数目。#include<iostream.h>voidmain(){intcount=0;charc;while(c!=′.′){cin>>c;if(c!=′a′)continue;//如果不是字符′a′,则读下一个字符,否则计数器加1count++;}cout<<count;}3、goto语句(无条件转移语句)

形式:goto语句标号;

说明:语句标号是一个标识符,放在某一行语句的前面,后加“:”

功能:使程序无条件跳转到标号所指的语句处执行

注意:在结构化程序设计中尽量不用goto语句4、return语句

形式:return表达式;

功能:停止执行当前函数,指定函数要返回的值,转去执行调用函数后面的语句

注意:return语句后表达式的类型必须与函数类型一致循环嵌套(多重循环)概念:在一个循环体中又包含另一个循环语句称为循环嵌套,又称多重循环说明:for、while、do~while三种循环语句都可以相互嵌套,先执行最里层的循环语句,再依次执行外层的循环语句,注意内外循环不能交叉【例3.12】给一个二维数组的各个元素赋初值。#include<iostream.h>voidmain(){inta[3][4];cout<<″输入整数:″;for(intj=0;j<3;j++)for(intk=0;k<4;k++){cout<<″a[″<<j<<″][″<<k<<″]=:″;cin>>a[j][k];}}函数函数是程序设计语言中实现某项功能的基本单位,程序通过在各个函数之间进行调用来实现总体的功能函数可以是用户自定义的,也可以是系统定义好的标准函数(库函数)一个C++程序中可以有多个函数,但main函数只能有一个,除main函数外,函数地位平等,可以相互调用,main函数不能被其他函数调用函数的定义C++程序中函数需先声明或定义后方可调用形式:函数类型函数名(参数列表)

{函数体}说明:

1、函数类型也就是函数的返回值类型,函数的返回值一般由return语句给出;没有返回值,函数类型为void;没有指定函数类型,默认类型为int;return语句返回值类型与函数类型不一致将自动转换为函数名前的类型;

2、函数名需满足标识符命名规则,后必须跟一对圆括号;

3、函数的参数列表是括号中的0个或多个“,”分隔的形式参数(形参),形参只是一个标识符,用来确定函数参数的个数、位置、类型,在函数调用过程中进行数值传送

4、函数定义是相互独立的,不能在一个函数体中定义另一个函数【例3.13】编写一个返回一个整数的绝对值的函数。intabsolute(ints){intz;//函数体里的变量声明if(s>=0)z=s;elsez=-s;returnz;}函数原型声明在C++中,如果被调用函数在使用时尚未定义,即调用在前定义在后,则必须在函数调用前对其函数原型进行声明形式:函数类型函数名(参数列表);注意:

1、在函数原型声明中,参数名可以省略,但参数的类型和函数类型不可以省略;

例3.13原型声明可写为:intabsolute(int);

2、在函数定义和原型声明中的参数均为形参,它们间的参数名可以不同,但类型、顺序不能变;

3、函数原型声明可以放在主调函数内部,也可以在外部,位于主调函数内部必须位于调用语句之前,在外部需位于主调函数之前函数的参数与返回值形参:定义(声明)函数时,函数名后面括号中的变量名实参:调用函数时,函数名后括号中的参数(或表达式)功能:形参和实参用于实现主调函数与被调函数之间数据的传递;函数未被调用时,形参并不占用实际内存空间,一旦函数被调用,系统将为形参分配空间,并将实参的值放在所分配的空间中形参与实参的传递有两种形式:

传值参数传递、引用参数传递函数的传值参数传递概念:在函数调用时,将实参的值复制到形参的存储空间中,在执行该函数的参数传递方式特点:在函数执行过程中,形参的变化不影响实参的值【例3.21】分析下面的程序,能否实现交换两个数值#include<iostream.h>voidswap(floatx,floaty){floata=x;x=y;y=a;}voidmain(){floatm=6,n=27;cout<<″交换前:″<<endl;cout<<endl<<″m=″<<m<<endl;cout<<″n=″<<n<<endl;swap(m,n);cout<<″交换后:″<<endl;cout<<endl<<″m=″<<m<<endl;cout<<″n=″<<n<<endl;}运行结果:交换前:m=6n=27交换后:m=6n=27函数的引用参数引用:变量或对象的别名格式:类型名&引用名=变量名;说明:

1、变量名必须已定义过,类型应与引用的类型一致;

2、声明引用时必须赋初值,且不能在程序中改变引用的目标;一个变量的引用就是它的别名,不能再是其它变量的别名;

3、声明的引用可当作目标变量一样使用;

4、引用也可将变量地址赋给一个指针变量。【例3.22】引用的定义。intm;int&n=m; //引用n是变量m的别名m=53;cout<<n; //n也是53n+=22; //n变为75,m也是75cout<<m; //输出75【例3.23】用引用实现交换两个数值。#include<iostream.h>voidswap(float&x,float&y) //x和y都是引用参数{floata=x;x=y;y=a;}voidmain(){floatm=6,n=27;cout<<″交换前:″<<endl;cout<<endl<<″m=″<<m<<endl;cout<<″n=″<<n<<endl;swap(m,n);cout<<″交换后:″<<endl;cout<<endl<<″m=″<<m<<endl;cout<<″n=″<<n<<endl;}运行结果:交换前:m=6n=27交换后:m=27n=6设置函数参数的默认值概念:函数的默认参数也称为缺省参数,是在函数定义或声明时就将其中一个或多个参数(形参)进行初始化赋值,使调用函数在参数缺省状态下默认使用该值

例:floatgh(floatm,floatn,floatp=9);

调用gh(6,8)等同于gh(6,8,9)注意:

1、如果不需要使用形参设置的默认值,可以通过实参设置新值;

2、给函数中多个形参部分设置默认值,必须按照从右到左的顺序指定默认值,即为某个参数指定默认值时,其后的参数都必须指定默认值,否则已设默认值将被忽略。Voidfl(doublea,floatb=2.5,intc=1);正确的Voidfl(doublea,floatb=2.5,intc);b的默认值无效3、设置默认值后,实参的个数可以与形参的不同,函数调用时,实参与形参按照从左到右的顺序进行匹配,没有给出实参的,形参就取消指定的默认值。例intsum(inta,intb,intc=5,intd=6);调用sum(3,2,1)等价于sum(3,2,1,6)函数的调用对函数进行过定义或原型声明后即可进行调用,调用过程包括:参数传递、函数体执行、返回主调函数形式:函数名(实参列表)注意:

1、调用无参函数,函数后的括号不能省;

2、实参与形参一一对应,即个数相等、类型匹配、顺序一致(有默认值的可缺省);

3、若函数无返回值,可将函数单独调用作为一条语句,完成一定的操作;

4、若函数有返回值,可将函数作为语句的一部分,利用返回值参与表达式的运算或执行某项操作【例3.14】编写一个程序,输出一个正整数的全部约数。#include<iostream.h>#include<math.h>//调用系统定义的数学函数需要voidsearch(ints){if(s>0){cout<<endl;inth,j;if(sqrt(s)==int(sqrt(s)))cout<<″″<<sqrt(s);//sqrt(s)==int(sqrt(s))判断有无平方根;int(sqrt(s))强制类型转换h=int(sqrt(s));for(j=1;j<=h;j++)//一个整数x,能写成x=m*n,m的值一定不会超过sqrt(x)的if(s%j==0)cout<<″″<<j<<″″<<s/j;}elsecout<<″不是一个正数″<<endl;}voidmain(void){intr;cout<<″请输入一个正数:″<<endl;cin>>r;search(r);}【例3.15】编制一个程序,将一个十进制的一位数变为二进制的数输出。#include<iostream.h>voidconvert(ints){switch(s){case0:cout<<0;break;case1:cout<<1;break;case2:cout<<10;break;case3:cout<<11;break;case4:cout<<100;break;case5:cout<<101;break;case6:cout<<110;break;case7:cout<<111;break;case8:cout<<1000;break;case9:cout<<1001;}cout<<endl;}voidmain(){intp;cout<<″输入一个数字:″;cin>>p;convert(p);}函数的嵌套调用C++中函数定义不允许嵌套定义,但允许函数嵌套调用,即在调用一个函数的过程中又调用另一个函数【例3.16】计算k=sin2r+a2+sins的值。sin的计算公式是:sinx=x-x3/3!+x5/5!-...【例3.16】计算k=sin2r+a2+sins的值。sin的计算公式是:sinx=x-x3/3!+x5/5!-...include<iostream.h>doublemysin(doublex){doublee=1e-6,k=0,t=x;//e是设定的精度intn=1;do{k+=t;n++;t=-t*x*x/((2*n-1)*(2*n-2));}while(t>=e);//书上fabs(t)表示浮点数t的绝对值returnk;}doublejisuan(doubler,doublea,doubles){returnmysin(r)*mysin(r)+a*a+mysin(s);}voidmain(){doubler,a,s;cout<<″输入3个数:″;cin>>r>>a>>s;cout<<jisuan(r,a,s);}函数的递归调用一个函数直接或间接地调用该函数本身,称为函数的递归调用两种方式:

1、直接递归,一个函数中直接调用自身,例3.17;

2、间接递归,一个函数中调用其他函数,其他函数又调用该函数,例3.18;【例3.17】计算函数f(x)。f(x)= 3, 当x=0时 f(x-1)+6, 当x>0时#include<iostream.h>intf(intx){if(x<0)cout<<″参数错误″<<endl;elseif(x==0)return3;elsereturnf(x-1)+6;}voidmain(){intg=35;cout<<″结果为:″<<f(g)<<endl;}运行结果为:213(35×6+3=213)【例3.18】计算函数f(x)。f(x)=0, 当x=0时f(x-1)+3, 当x为正奇数时 f(x-1)+5, 当x为正偶数时#include<iostream.h>intfeven(intx);//声明feven(x)函数,x为偶数时调用intfodd(intx)//fodd(x),x为奇数时调用,x-1为偶数{returnfeven(x-1)+3;}intfeven(intx)//feven(x),x为偶数时调用,x-1为奇数{if(x==0)return0;elsereturnfodd(x-1)+5;}voidmain(){intg=16;if(g%2==0)cout<<feven(g)<<endl;//偶数执行feven(g)elsecout<<fodd(g)<<endl;//奇数执行fodd(g)}执行结果为:64

(g=16,其中有8个奇数、8个偶数,f(g)=8*3+8*5=64)【例3.19】指出下面的程序为什么是错误的。main(){intd;df();}intdf(){cout<<d;}1、函数df()需先定义后使用;2、d为局部变量,df()函数无法使用。例3.18Feven(x)偶数Fodd(x-1)奇数Fodd(x)奇数Feven(x-1)偶数调用调用调用调用函数的重载概念:指同一个函数名可以对应多个不同的函数实现,每一类实现对应一个函数体,这类函数名相同,功能相近,只是参数的类型或个数不同函数参数类型重载

函数参数个数相同,但其类型中至少有一个不同函数参数个数重载

利用函数的参数个数不同实现函数的重载【例3.24】重载函数meet。函数meet有两个功能,如果它的两个参数是char型的,那么函数meet将两者连接起来输出,如果它的两个参数的类型是double型的,那么函数meet将输出两者的和。#include<iostream.h>voidmeet(charx,chary){cout<<″字符串是:″;cout<<x<<y<<endl;}voidmeet(doublex,doubley){cout<<″两数的和是:″;cout<<x+y<<endl;}voidmain(){meet(′a′,′b′);meet(5.6,7.3);}运行结果为:字符串是:ab两数的和是:12.9程序在运行时根据参数类型判别执行哪一个函数体【例3.25】重载函数abs(),求int、float和double类型数据的绝对值intabs(intx){if(x>=0)returnx;elsereturn-x;}floatabs(floatx){if(x>=0)returnx;elsereturn-x;}doubleabs(doublex){if(x>=0)returnx;elsereturn-x;}voidmain(){inta=-357;floatb=63.85;doublec=-6974.26;cout<<abs(a)<<′\t′<<abs(b)<<′\t′<<abs(c)<<endl;}输出结果为:35763.856974.26【例3.26】求若干个参数当中的最大的值,根据参数个数的不同调用不同的max()函数。#include<iostream.h>floatmax(floatx,floaty){if(x>y)returnx;elsereturny;}floatmax(floatx,floaty,floatz){floatb=max(x,y);returnmax(b,z);}Voidmain(){cout<<max(1,2)<<endl;cout<<max(1,2,3);}程序的执行结果是:23系统会根据参数的个数正确地选择执行函数系统函数的调用系统函数是系统预先定义好的,使用时只要在程序前加入正确的头文件就可以调用【例3.27】应用math.h中定义的sin()函数,求0.05到π/4之间的正弦函数值#include<iostream.h>#include<math.h>voidmain(){doublepi=3.14,x=0.05;inti=0;while(x<pi/4){cout<<

温馨提示

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

评论

0/150

提交评论