版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++程序设计主讲:李政伟C++语言应用领域Linux与Unix环境下系统级程序 98%Linux与Unix下网络类程序(非Web) 97%Windows系统级程序 90%Windows网络程序(非Web) 90%游戏程序设计 95%数据库底层程序 95%专业的图形程序 90%图像处理 95%3第1章C++基础1.1程序设计语言简介1.2C++语言的特点与程序结构1.3过程型程序设计1.4面向对象程序设计1.5程序设计环境4机器语言、汇编语言、高级语言、第四代语言、自然语言。Fortran,1954C语言,1972C++由AT&TBell实验室的BjarneStroustrup及其同事于20世纪80年代初在C语言的基础上设计与实现。C++保留了C语言原有的所有优点,增加了面向对象的机制。1.1程序设计语言简介5由C发展而来,与C兼容。C语言程序基本上可以不加修改地用于C++。C的超集,“带类的C”。一种功能强大的混合型的程序设计语言。不要把面向对象和面向过程对立起来,面向对象和面向过程不矛盾,而是各有用途、互为补充。1.2C++语言的特点与程序结构6(1)语句简练、程序结构简单。书写格式自由,语法结构清晰、紧凑。(2)数据类型丰富、齐全。标准C供了整数、实数、字符、字符串等基本数据类型,还提供数组、指针、结构体等构造数据类型。C++还增加了类这一特殊数据类型的定义机制。(3)运算符丰富、齐全,运算能力强,具有直接的硬件处理能力。(4)通用性及可移植性强,程序执行效率高。1.2C++语言的特点与程序结构71.3简单的C++程序例例1.1输出一行字符:“WelcometoC++World.”。
#include<iostream>
//包含头文件iostreamusingnamespacestd;
//使用命名空间stdintmain(){cout<<“WelcometoC++World.";return0;}WelcometoC++World.
1234567优秀程序员的素质之一:使用TAB缩进{}对齐有适当的注释有合适的空行8注释(Comment)程序礼仪,提高可读性,不会增加程序的可执行代码的长度。多用于解释和说明算法、变量的意义、或者解释比较难懂的程序代码。修改代码时一定要修改相关的注释。“//”:有效范围仅一行,即不跨行。“/*……*/”:有效范围可跨多行。习惯:半行或单行的简单注释用“//”,多行的复杂注释用“/*……*/”。1.3简单的C++程序例9例1.2求a和b两个数之和#include<iostream>usingnamespacestd;intmain(){
inta,b,sum;//定义变量
cin>>a>>b;//输入语句
sum=a+b;//赋值语句cout<<"a+b="<<sum<<endl;//输出语句
return0;//如程序正常结束,向OS返回零值}123456↙a+b=5791234567891010例1.3给两个数x和y,求两数中的大者。intmain(){
inta,b,m;
cin>>a>>b;
m=max(a,b);//调用max函数,将返回值赋给mcout<<"max="<<m<<'\n';//输出大数m的值
}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}1825↙max=25注意:数据间用空格间隔,不能以逗号或其他符号间隔。11形式参数PK实际(在)参数形式参数:定义或声明函数或过程时,接在函数名或过程名后括号内的参数。实际(在)参数:调用此函数或过程时,接在函数名或过程名后括号内的参数。同一函数或过程的实际(在)参数与形式参数在个数、次序、类型上必须一一对应。12intmain(){intmax(intx,inty);
//函数作声明
inta,b,c;cin>>a>>b;c=max(a,b);
cout<<"max="<<c<<endl;return0;}例1.3给两个数x和y,求两数中的大者。intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}小技巧:被调函数首部的末尾加分号,即为函数声明。131.2.3C++程序的结构(1)由一个或多个程序单位(文件)构成。(2)程序单位一般包括:①预处理命令。如#include命令。②全局声明部分(函数外)。包括对用户自定义数据类型的声明和变量的定义。③函数。每个程序必须包括一个或多个函数,其中必有且只有一个主函数(main函数)。注:不要求每个程序文件都必须包含以上3部分。14程序设计的一般步骤1.编辑程序“源程序”(sourceprogram)。以.cpp(cplusplus)为后缀。2.对源程序进行编译编译:把源程序翻译成二进制形式的“目标程序(objectprogram)”。一般以.obj(object)或.o作为后缀。出错信息:错误(error);警告(warning)。15程序设计步骤3.将目标文件连接连接:将一个程序的所有目标程序和系统的库文件以及系统提供的其他信息连接起来,形成一个可执行的二进制文件。后缀:.exe。4.运行程序
运行二进制文件(.exe文件),得运行结果。5.分析运行结果如果运行结果不正确,应检查程序或算法是否有问题。16用流程图表示算法ANSI规定了常用流程图符号:起止框判断框处理框输入/输出框注释框流向线连接点17程序设计的一般步骤18程序设计的一般步骤1.3过程型程序设计一个过程型程序应包括以下两方面内容:对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构(datastructure)。对操作的描述。即操作步骤,也就是算法(algorithm)。对于过程型的程序,以用下面的公式表示:程序=算法+数据结构1.3过程型程序设计1.4面向对象程序设计面向对象的程序设计方法最基本的思想就是把客观世界看成一个个相对独立而又相互联系的实体,称为对象。C++支持面向对象的程序设计方法,适合于大、中型软件的开发,它从开发时间、费用到软件的可重用性、可扩充性、可维护性和可靠性等方面,都具有很大的优越性。22例1.4包含类的C++程序。classAccount{public: stringAccountID;//银行卡号
stringname;//储户姓名
floatbalance;//账面金额
voidDeposite(floatmoney){balance+=money;} boolWithdraw(float){){balance+=money;} voidDisplay(){cout<<"卡号:"<<AccountID<<endl; cout<<"姓名:"<<name<<endl; cout<<"余额:"<<balance<<"$"<<endl;}};23intmain(){
Accountlzw;//定义li为Account对象
lzw.balance=0; lzw.AccountID="60138260902390238888"; ="李政伟";cout<<"操作李政伟账户\n"; lzw.Deposite(10000);//存钱到李政伟账户(操作对象为li)
lzw.Withdraw(3000);//从李政伟账户取钱
lzw.Display();//显示李政伟账户信息}例1.4包含类的C++程序。241.5程序设计环境VisualStudio2010集成开发环境25编写C++控制台应用程序步骤操作步骤1、新建一个项目
1)启动VisualStudio20102)新建一个console项目
3)编写源程序2、编译和连接 生成单个项目:Shift+F6 生成解决方案:F63、运行开始执行(不调试):Ctrl+F5启动调试:F5第2章基本数据类型与运算符主讲:李政伟272.1基本数据类型2.2常量2.3变量2.4赋值与算术运算符2.5逻辑运算符和关系运算符2.6其它运算符2.7运算符的优先级与结合性2.8数据类型的转换第2章数据类型与表达式空类型(void)构造类型基本类型短整型(short[int])整型(int)长整型(long[int])单精度型(float)双精度型(double)长双精度型(longdouble)整型字符型(char)浮点型布尔型(bool)数据类型枚举类型(enum)数组类型结构体类型(struct)共用体类型(union)类类型(class)指针类型引用类型292.1基本数据类型(1)整型数据按二进制数形式存储。例,十进制整数85的二进制形式为1010101。(2)int和char前,可加修饰符signed(“有符号”)或unsigned(“无符号”)。302.1C++的数据类型有符号:最大215-1,即32767,最小-32768;无符号:最大216-1,即65535,最小0。表2-1数据类型的字节数名称字节数数值范围短整型(shortint)2-32768~+32767无符号短整型(unsignedshortint)2-32768~+32767整型(int)4-2147483648~+2147483647无符号整型(unsignedint)40~+4294967295长整型(longint)4-2147483648~+2147483647无符号长整型(unsignedlongint)40~+4294967295字符型(char)1-128~+127无符号字符型(unsignedchar)10~255单精度实型(float)43.4*10-38~3.4*1038双精度实型(double)81.7*10-308~1.7*10308长双精度实型(longdouble)81.7*10-308~1.7*10308322.2常量2.2.1什么是常量在程序执行中值不能被改变的量。分类:数值型常量(常数)、字符型常量。如12,0,-3为整型常量,4.6,-1.23为实型常量,包含在两个单撇号之间的字符为字符常量,如'a','x'。逻辑常量:truefalse332.2.2数值常量的表示数值常量区分类型,从字面形式即可识别。1.整型常量(整数)的类型——依据范围(1)[-32768~32767],是shortint型。(2)超出上述范围,
在[-2147483648~2147483647],是longint型。(3)都是signed型。34整型常量的3种表示方式:
(1)十进制整数。如1357,-432,0等。后面加l或L,则是longint型。如123L,0L等。(2)八进制整数。以0打头。如020表示(20)8=(16)10。(3)十六进制整数。以0x(或0X)打头。如0X20表示(20)16
=(32)10。1.整型常量(整数)的类型352.浮点数的表示方法(1)(十进制)小数形式如21.456,-7.98等。由整数部分和小数部分组成,可省略其中之一,但不能同时省略。缺省为double型。后加F或f,为float型,如-43f。后加L或l,为longdouble型。36(2)指数形式(即浮点形式)3.14159的程序表示:0.314159e1,3.14159e0,314.159E-2。一般形式[数符]数字部分指数部分注:无论写成小数还是指数形式,内存中都以指数形式(即浮点形式)存储。2.浮点数的表示方法372.2.3字符常量1.普通的字符常量用单撇号括起来的单个字符。如'a',占一个字节。说明:
①只能包括一个字符,如'aB'
不合法。②区分大小写,如'a'和'A'不同。③单撇号(')是定界符,不属于字符常量。如cout<<'a';输出“a”,而不是“'a'”。382.转义字符常量以“\”开头的字符序列。例,‘\n’代表一个“换行”符。近似于endl。缘由:屏幕上不能显示,无法用一般字符表示,或已作他用。常用的转义字符见表2.2(P20)。2.2.3字符常量393.字符数据在内存中的存储形式及其使用方法不存放字符本身,而存放其ASCII码。若字符变量c1的值为'a',c2的值为'b',则在变量中存放的是97,98。2.2.3字符常量字符型数据和整型数据之间通用。相当于对它们的ASCII码进行运算。40例2.1字符数据与整数进行算术运算intmain(){ charc1='a',c2='b';
c1=c1-32;
c2=c2-32;
cout<<c1<<''<<c2<<endl;return0;}AB414.字符串常量用双撇号""括起来的字母序列。如"abc","a+b","Liping"等。"abc"占4个字节(不是3)。‘\0'只作为字符串的结束标志。如cout<<"abc"<<endl;
输出3个字符abc,而不包括'\0'。42字符串的最后为“\”,则表示续行符,下一行仍是该字符串的一部分,且在两行字符串间无空格。cout<<"WemuststudyC\++hard!";则输出为:WemuststudyC++hard!4.字符串常量#definePRICE
30
//末尾不要加分号intmain(){intnum,total;num=10;total=num*PRICE;cout<<"total="<<total<<endl;return0;}2.2.4符号常量(宏替换常量)30以标识符形式出现的常量。44注:符号常量虽有名字,但不是变量。值在其作用域内不能改变,也不能被赋值。优点:可读性强:含义清楚,见名知意。可维护性高:“一改全改”。
2.2.4符号常量452.3变量2.3.1什么是变量在程序运行期间其值可以改变的量。提供一个有名字的内存区域,在该区域中存放变量的值,可对其进行读写。注意区分变量名和变量值!462.3.2变量名规则标识符(identifier):用来标识变量、符号常量、函数、数组、类型等实体名字的有效字符序列。规定:只能由字母、数字和下划线3类字符组成,且首字符须为字母或下划线。M.D.John,$123,3G64,Lingli,C++,Zh-ling注意1:C++中标识符区分大小写。注意2:变量名不能与C++的关键字、系统函数名和类名相同。472.3.3定义变量须“先定义,后使用”。一般形式:变量类型变量名表列;例,floata,b,c,d,e;定义位置:只需在第一次使用前即可。函数内部、形式参数、函数外部特点一充即无取之不尽,用之不竭48强制定义的目的(1)保证正确使用例,声明部分intstudent;而在执行语句中错写成statent。如statent=30;(2)分配不同长度的存储单元(3)类型检查2.3.3定义变量49对多个变量赋予同一初值,须分别指定。floata=b=c=4.5;可写成floata=4.5,b=4.5,c=4.5;或floata,b,c=4.5;a=b=c;注:若未赋初值,则该变量值不可预测。2.3.4为变量赋初值502.3.5常变量(constantvariable)定义变量时,前加const。例,
constinta=3;
定义常变量时须同时初始化。constinta;a=3;//常变量不能在定义之后被赋值51运算符分类(1)算术运算符
+-*/%
++--(2)关系运算符><
==
>=
<=!=(3)逻辑运算符
&&
||
!(4)位运算符
<<>>&|∧~(5)赋值运算符(=及扩展赋值运算符)(6)条件运算符(?:)52(7)逗号运算符(,)(8)指针运算符(*)(9)引用运算符和地址运算符(&)(10)求字节数运算符(sizeof)(11)强制类型转换运算符((类型)或类型())(12)成员运算符(.)(13)指向成员的运算符(->)(14)下标运算符([])(15)其他(如函数调用运算符())2.4赋值与算术运算符532.4赋值与算术运算符2.4.1赋值运算符与赋值表达式(1)赋值运算符“=”作用:将一个数据赋给一个变量。(2)赋值过程中的类型转换(1)将浮点型数据(单、双精度)赋给整型变量时,舍弃小数部分。(2)将整型数据赋给浮点型变量时,数值不变,但以指数形式存储。54在“=”之前加上其他运算符。例,
x%=y+3等价于x=x%(y+3)注:若右部为含若干项的表达式,则相当于有括号。①x%=y+3②x%=y+3③x=x%(y+3)(莫错为x=x%y+3)(3)复合的赋值运算符()55命题:凡二元(二目)运算符,都可与赋值符一起组合成复合赋值符。C++的复合赋值运算符(共10个)+=,-=,*=,/=,%=,<<=,>>=,&=,∧=,|=优点简洁、高效(3)复合的赋值运算符56(4)赋值表达式赋值表达式:由赋值运算符将变量和表达式连接起来的式子。形式:<变量><赋值运算符><表达式>a=5求解过程:先求赋值运算符右侧的“表达式”的值,然后赋给赋值运算符左侧的变量。赋值运算符左侧的标识符称为“左值”。注:并非任何对象都能作为左值,变量可以,而一般表达式不能,常变量也不能。57赋值运算符右侧的表达式称为“右值”。如b=a;//b是左值c=b;//b也是右值例
a=b=c=5(a=3*5)=4*3赋值表达式作为左值时应加括号。如,a=3*5=4*3(4)赋值表达式582.4.2算术运算符+(加法运算符,或正值运算符。如3+5,+3)-(减法运算符,或负值运算符。如5-2,-3)*(乘法运算符。如3*a)/(除法运算符。如5/3)%(模运算符,或求余运算符,%两侧均应为整型数据,如7%4)。*不能省略不用÷2.4赋值与算术运算符值为359算术表达式和运算符的优先级与结合性算术表达式:用算术运算符和括号将运算对象(操作数)连接起来、符合C++语法规则的式子。运算对象:常量、变量、函数等。运算符的优先级和结合性。先按运算符的优先级高低次序执行。a-b*c,相当于a-(b*c)。优先级相同时,则按“结合方向”处理。602.4.3自增和自减运算符作用:使变量的值增1或减1++i(先自增,后使用)--i(先自减,后使用)i++(先使用,后自增)i--(先使用,后自减)2244i3234jj=i--j=--ij=i++j=++i假定:i的初值为3,j的初值为99999前置运算符后置运算符61注意:(1)仅用于变量,不用于常量或表达式。(2)结合方向:“自右至左(前置)”,
“自左至右(后置)”(4)常用于循环语句,使循环变量自动增1。也用于指针变量,使指针指向下一地址。(3)使用灵活,但在很多情况下可能出现歧义,产生副作用(难点,重点)。2.4.3自增和自减运算符622.5.1逻辑常量和逻辑变量逻辑型常量:false(假)和true(真)逻辑型变量:boolflag=false;falsePK"false"'false'×2.5逻辑运算符和关系运算符632.5逻辑运算符和关系运算符2.5.2逻辑运算和逻辑表达式3种逻辑运算符(1)&&逻辑与(2)||逻辑或(3)!逻辑非
例:a&&b//若a,b为真,则a&&b为真。a||b//若a,b之一为真,则a||b为真。!a//若a为真,则!a为假。关系运算符
①<
(小于)②<= (小于或等于) ③> (大于)④>= (大于或等于) ⑤== (等于)⑥!= (不等于) 642.5.3关系运算和关系表达式优先级相同(高,7)优先级相同(低,8)65算术运算符关系运算符逻辑运算符赋值运算符例:c>a+ba==b<ca=b>c//等效于c>(a+b)//等效于a==(b<c)//等效于a=(b>c)2.5.3关系运算和关系表达式66关系表达式:用关系运算符将两个表达式连接起来的式子。一般形式:表达式关系运算符表达式例:a+b>b+c逻辑值,即true或false。C++中用1代表“true”,用0代表“false”。2.5.3关系运算和关系表达式672.6其他运算符2.6.1逗号运算符与逗号表达式用来将两个表达式连接起来。3+5,6+8一般形式:表达式1表达式2求解过程:先求表达式1,再求表达式2。整个逗号表达式的值是表达式2的值。逗号表达式扩展表达式1,表达式2,表达式3,…,表达式n逗号运算符在所有运算符中级别最低。,2.6.2sizeof()运算符sizeof并不是函数,而是一种单目操作符。操作数可以是一个表达式或类型名,它给出操作数在内存中所占空间的字节数。如:sizeof(int)//结果为4,即整型数据的字节数。sizeof(35)//结果也为4,即整型数据的字节数。2.6其他运算符2.7数据类型的转换不同类型数据进行混合运算时,必须先转换成同一类型,然后再进行运算。(1)隐式转换指不需要进行转换声明,系统自动就可以进行的转换。①赋值时的类型转换。例如:charch='A';inti=ch;②表达式中的类型转换。当表达式中出现不同数据类型时,C++将级别低的数据类型自动转换成级别高的数据类型(即“向高看齐”)。70设i为int,f为float,d为double,e为long:10+'a'+i*f-d/e运算次序:①10+'a',将‘a'转换成整数97,结果为107。②i*f。将i与f都转换成double型。③107+i*f。结果为double型。④e转换成double型,d/e结果为double型。⑤10+'a'+i*f的结果与d/e的商相减,结果为double型。2.7数据类型的转换71不同类型的数据先转换成同一类型,再运算。2.7数据类型的转换(2)显式转换由用户将一个表达式从其原始数据类型强制转换成另一数据类型。显示转换有一下两种声明格式:格式一:(类型)表达式格式二:类型(表达式)例:intx=20,y;floatz=float(3.5);
//将double型3.5显式转换成float型doublew=5.5;y=x/(int)w;//将w的值5.5显式转换成整型数52.7数据类型的转换小结数据类型有整型、实型、字符型等简单数据类型,也有数组、指针、结构体、类等其它数据类型。C++具有丰富的运算符,如算术运算符、关系运算符、逻辑运算符等,其中包含许多C++特有的运算符。表达式是由运算符和操作数组成的符号序列,对表达式进行运算时,要按运算符的优先顺序从高向低进行,同级运算符则按照结合性进行运算。当表达式中的数据类型不一致时,需要按照类型转换规则对操作数进行处理。第3章程序控制主讲:李政伟75第3章程序控制3.1选择结构3.2循环结构3.3跳转结构3.4应用实例76语句(statement)1.声明语句inta,b;可出现在函数中的任何行,即位置无限制。2.执行语句通知计算机完成一定的操作。772.执行语句(1)控制语句①if()~else~(条件语句)②for()~(循环语句)③while()~(循环语句)④do~while()(循环语句)⑤continue(结束本次循环语句)⑥break(中止执行switch或循环语句)⑦switch(多分支选择语句)⑧goto(转向语句)⑨return(从函数返回语句)78(2)函数和流对象调用语句sort(x,y,z);//sort函数调用cout<<x<<endl;(3)表达式语句i=i+1//赋值表达式i=i+1;
//赋值语句语句最后必须出现分号。2.执行语句793.空语句;只有一个分号的语句。什么也不做。用途:用在语法需要一条语句但又不进行任何操作的位置。如for循环中,空while循环体。2.执行语句804.复合语句用{}括起来的语句。如{z=x+y;if(z>100)z=z-100;cout<<z;}语句(statement)813种基本结构顺序结构、选择结构和循环结构是结构化程序设计的3种基本结构。表达式语句YN表达式语句NY语句1语句282编写顺序结构的程序例3.1求一元二次方程式ax2+bx+c=0的根。a,b,c的值在运行时由键盘输入。#include<cmath>
intmain(){floata,b,c,x1,x2;cin>>a>>b>>c;x1=(-b+sqrt(b*b-4*a*c))/(2*a);x2=(-b-sqrt(b*b-4*a*c))/(2*a);cout<<"x1="<<x1<<endl;cout<<"x2="<<x2<<endl;}4.58.82.4↙x1=-0.327612x2=-1.177943.1选择结构3.1.1if语句if语句的两种基本形式:(1)if(表达式)语句(2)if(表达式)语句1else语句284【例3-2】使用if语句实现考试成绩判定。intmain(){ intscore;//考试成绩
cout<<"请输入考试成绩:"; cin>>score; if(score>=60) { cout<<"及格!"; } else { cout<<"不及格!\n"; } return0;}YN及格不及格Score>60853.1.2嵌套的if语句if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3…elseif(表达式m)语句melse
语句n【例3-2】使用嵌套if语句实现考试成绩判定。#include<iostream>usingnamespacestd;intmain(){
intscore;//考试成绩
cout<<"请输入考试成绩:"; cin>>score; if(score<0) { cout<<"非法数据!"; }
//相当于score>=0&&score<60 elseif(score<60) { cout<<"不及格!"; }
//相当于score>=60&&score<70 elseif(score<70) { cout<<"及格!"; }
//相当于score>=70&&score<80 elseif(score<80) { cout<<"中等!"; } else//相当于score>=80 { cout<<"优秀!"; } return0;}873.1.3
条件运算符?:的替代条件运算符(?:)一般形式表达式1?表达式2:表达式3运算规则:先计算表达式1的值,如果表达式1的值为true,那么表达式2被求值;否则表达式3被求值。整个条件表达式的值就是被求值表达式(表达式2或表达式3)的值。doublescore=60.1;boolisPassed=scor<60?false:true;doublescore=60.1;boolisPassed;if(score<60)isPassed=false;elseisPassed=true;等同于3.1.3
条件运算符?:的替代89例3.3输入一字符,若是大写字母,将转换成小写字母;否则,不转换。3.1.3条件运算符和条件表达式intmain(){charch;cin>>ch;
ch=(ch>='A'&&ch<='Z')?(ch+32):ch;
cout<<ch<<endl;return0;}903.1.4switch语句一般形式switch(表达式){case常量表达式1:语句1
case常量表达式2:语句2...
case常量表达式n:语句n
default:语句n+1}=常量1=常量2=常量n表达式语句组1语句组2语句组n语句组n+1yyynnn91说明(1)当与某case子句匹配时,执行此case子句,若与所有都不匹配,执行default子句。(2)每个case表达式的值须互不相同。(3)各case和default的次序不影响执行结果。(4)执行某case子句后,流程控制转移到下一个case子句继续执行。(5)多个case可共用一组执行语句。92【例3-4】根据考试成绩的等级输出百分制分数段。85~10070~8460~69<60errorbreak;break;break;break;break;85~100intmain(){ chargrade; cin>>grade; switch(grade) { case'A':cout<<"80~100\n"; case'B':cout<<"70~79\n"; case'C':cout<<"60~69\n"; case'D':cout<<"<60\n"; default:cout<<"error\n"; } return0;}引例:输入100个同学的成绩,计算平均分。思路1:
floatx1,x2,x3,…,x100; floatsum; cin>>x1>>x2>>…>>x100; sum=x1+x2+…+x100; cout<<sum/100;3.2循环结构943.2.1用while语句构成循环当型循环结构形式:while(表达式)语句作用:表达式为真(非0)时,执行其内嵌语句。特点:先判断,后执行。表达式语句NY95intmain(){inti=1;doublex,s=0;
while(i<=100){cin>>x;s+=x;i++;
}cout<<"avg="<<s/100<<endl;}例3.5输入并求100个学生的平均成绩96直到型循环特点:先执行循环体,后判断条件是否成立。一般形式do
语句
while(表达式);执行过程:先执行一次循环体,然后判别表达式,为真时返回重新执行,为假时循环结束。3.2.2do-while语句表达式语句NY97例3.6用do-while求100位学生的平均成绩voidmain(){ inti=1;doublex,sum=0;
do{ cin>>x; sum=sum+i; i++; }while(i<=100); cout<<“avg="<<sum/100<<endl;}983.2.3for循环格式:for(表达式1;表达式2;表达式3)内嵌语句for(循环变量赋初值;循环条件;循环变量增值)语句执行过程(1)求解表达式1。(2)求解表达式2,若为真,则执行内嵌语句,然后执行第(3)步。否则结束循环,转到第(5)步。(3)求解表达式3。(4)转回第(2)步骤继续执行。(5)执行紧接for循环后的其他语句99表达式2内嵌语句NY表达式1表达式33.2.3for循环格式:for(表达式1;表达式2;表达式3)内嵌语句100for(循环变量赋初值;循环条件;循环变量增值)语句for(i=1,s=0;i<=100;i++){cin>>x;s+=x;}等价于i=1;s=0;do{cin>>x;s+=x;i++;}while(i<=100);i=1;s=0;while(i<=100){cin>>x;s+=x;i++;}3.2.3for循环101(3)for(;;){┆
for(;;){…}}(4)while(){┆
do{…}while();┆}(5)for(;;){┆
while(){…}┆}(6)do{┆
for(;;){…}}while();3.2.4循环嵌套(1)while(){┆
while(){…}}(2)do{┆do{…}while();}while();voidmain(){inti,j;for(i=1;i<10;i++){ for(j=i;j<10;j++) cout<<i<<“*”<<j<<“=”<<i*j<<“”; cout<<‘\n’;}}例3.6打印九九乘法表1033.3跳转结构1.break语句一般格式:break;两种用途:(1)用在switch语句中终止某个case语句。(2)立即结束当前所在层的循环,程序从循环语句后面的第一个语句继续执行。只能用于循环和switch语句内。Thebreakstatementterminatesonlythemosttightlyenclosinglooporswitchstatement
104continue语句2.continue语句一般格式continue;作用:结束本次循环,即跳过循环体中剩余语句,接着进行下一次是否执行循环的判定。continue和break的区别:continue只结束本次循环,不终止整个循环。break结束当前循环过程。voidmain(){for(inti=1;i<=60;i++){ if(i%5!=0)cout<<i<<“年不回”<<endl; else{
cout<<i<<“年回矿大!”<<endl;
break;
}
cout<<“我爱矿大!”; }}例3.7:何时再回矿大!voidmain(){for(inti=1;i<=60;i++){ if(i%5!=0)cout<<i<<“年不回”<<endl; else{cout<<i<<“年回矿大!”<<endl;
continue;
}cout<<“我爱矿大!”; }}例3.8:判断输出结果?3.3.4goto语句在程序设计时,不推荐用goto语句。因为goto语句容易造成程序混乱,降低可读性,另外它还阻止某些编译器优化。但由于C++可用作替代汇编语言,所以goto语句还是不可缺少的。如程序中合理使用,还是有益处的。goto语句要求有一个标号。标号是一个后面跟有冒号的有效标识符。标号必须与使用它的goto语句在同一函数中,即不能在不同函数之间跳转。goto语句的一般形式为:gotolabel;label:其中,label为标号,既可以放在goto语句的前面,也可以放在goto语句的后面。3.3.5return语句return语句用来明确地从一个函数中返回。ANSIC++标准将它归入跳转结构,因为它使程序返回到(即跳回到)调用函数的地方继续执行。return带回的数值即为函数的返回值。3.4 应用实例#include<cmath>intmain(){ inti,b,x; cout<<"请输入一个正整数:\n"; cin>>x;//C行
b=sqrt(x);
//计算x的算术平方根
for(i=2;i<=b;i++) if(x%i==0) break;//A行
if(i>=b+1)//B行
cout<<x<<"是素数"; else cout<<x<<"不是素数"; return0;}【例3-9】判断正整数是否为素数。【例3-10】求解300~400范围内的所有素数。#include<cmath>intmain(){ intx,b,i,n=0;//n为素数计数器
for(x=301;x<400;x+=2){//2以外的偶数都不是素数 b=sqrt(x);
//计算x的算术平方根
for(i=2;i<=b;i++) if(x%i==0) break; if(i>=b+1){ cout<<x<<""; n++; if(n%10==0)//控制每行输出10个数
cout<<endl; } }return0; }111例3.11求F数列前40个数。特点:第1、2个数为1、1。从第3数,每个数是其前面两数之和。即
F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n≥3)古典数学问题:有一对兔子,从出生后第3个月起每月都生一对兔子。小兔子长到第3个月后每月又生一对兔子。设所有兔子都不死,问每月的兔子总数为多少?编写循环结构的程序112#include<iomanip>intmain(){longf1=1,f2=1;inti;for(i=1;i<=20;i++){cout<<setw(12)<<f1<<setw(12)<<f2;if(i%2==0)cout<<endl;
f1=f1+f2;f2=f2+f1;
}}编写循环结构的程序【例3-12】求圆周率π的近似值。#include<cmath>#include<iomanip>intmain(){ doubles=0,x=1;//初始化
longk=1; intsign=1; while(fabs(x)>1e-8){
//项值在比较前要先求绝对值
s+=x;//累加求和
k+=2; sign*=-1; x=sign/double(k);//强制转换使x得到浮点数值
} s*=4;//π值
cout<<"π="<<s<<endl; return0;}3.5小结选择结构包括if和switch语句。在if语句中,else子句为可选项。if和elseif可以组成嵌套if语句。switch语句适合处理多分支情况。循环结构包括while、for和dowhile语句。三种语句在表达能力上完全等价,只在使用形式上有差异。while属于前测试循环语句,而dowhile属于后测试循环语句。for语句又称为计次循环语句,多用于循环次数已知的情况,在实际应用中使用较为广泛。跳转结构有break、continue、goto和return等语句。其中,break用于退出所在的循环或者退出switch语句;continue用于中止本次循环,并开始下一次循环。goto语句一般不推荐使用,而return语句主要用于函数返回。第4章函数主讲:李政伟116第4章函数4.1 概述4.2 函数定义与函数声明4.3 函数的调用4.4 函数重载4.5 函数模板4.6 函数的嵌套调用4.7 递归函数4.8 存储类别4.9 作用域4.10 内部函数和外部函数4.11 预处理指令4.12 应用实例117函数(Function)具备某些功能的一段相对独立的,可以被调用的代码。即用“变量,常量,流程控制”等写成的一行行语句。这些语句以一种约定形式存在着,等待我们去调用它。例:sqrt(x)编程者可以将一个大而复杂的程序分解为若干个相对独立而且功能单一的小块程序(函数),并通过在函数间的调用,来实现总体功能。4.1概述软件重用118函数调用示意图119函数分类分类1——用户使用的角度(1)系统函数,即库函数。由编译系统提供,用户不必自己定义,可直接使用。(2)自定义函数。解决用户的专门需要。分类2——函数的形式(1)无参函数。调用时不必给出参数。(2)有参函数。调用时需给出参数。主调函数和被调用函数之间有数据传递。1204.2函数定义与函数声明定义无参函数的一般形式类型标识符函数名([void]){声明部分语句}
定义有参函数的一般形式类型标识符函数名(形式参数表列){声明部分语句}intMax(intx,inty){returnx>y?x:y;}4.2.2函数的返回值1)函数返回值是通过return语句获得。一个函数中可有一个以上的return语句。在函数被调用执行时,只要遇到一个return语句,就将忽略函数体中剩余代码,立刻返回到主调程序。2)如果函数类型和return语句中表达式值不一致,则以函数类型为准。对数值型数据将自动进行类型转换。3)当函数没有返回值时,返回类型须用void说明,这时函数体中可以没有return语句,也可以有不带表达式的return语句,如下所示:return;1214.2.3函数声明函数声明形式:返回值类型函数名([形参表]);函数声明告诉编译器该函数的返回类型、函数名和形参表。在主调函数定义之前。122intMax(intx,inty){returnx>y?x:y;}intMax(intx,inty);intMax(int,int);intMax(int,double);intMax(int,int,int);123函数定义PK函数声明函数定义:函数功能的确立,包括指定函数名、函数类型、形参及其类型、函数体等。函数声明:把函数名、函数类型以及形参的个数、类型和顺序(注意,不包括函数体)通知编译系统,以便在对包含函数调用的语句进行编译时进行对照检查。函数声明中可不写形参名,只写形参类型。4.3函数的调用调用函数就是执行该函数的函数体。调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数。4.3.1函数调用的概念函数调用的一般形式为:函数名([实参表])形式参数和实际参数形式参数(形参):在定义/声明函数时函数名后面括号中的变量名。实际参数(实参):在调用函数时,函数名后面括号中的参数(常量、变量、表达式)。1241254.3.1函数调用的概念1.函数语句单独作为一个语句。不要求带回值,只要求完成某种操作。2.函数表达式出现在表达式中,要求带回一个值以参加运算。c=2*Max(a,b);3.函数参数作为其他函数的一个实参。m=Max1(a,Max(b,c));126在一个函数中调用另一函数(即被调用函数)需要具备哪些条件呢?对被调用函数的声明和函数原型1.被调用函数必须已经存在(库函数或用户自己定义函数)。但仅有这一条件还不够。2.若使用库函数,应在文件开头用#include将调用有关库函数时所需用到的信息“包含”进来。3.若使用用户自定义函数,且该函数位置在调用它的函数(即主调函数)的后面,则应该在主调函数中对被调用函数作声明(declaration)。127例4.3对被调用的函数作声明floatadd(floatx,floaty){returnx+y;}voidmain(){floatadd(floatx,floaty);
//函数声明
floata,b,c;cout<<"pleaseentera,b:";cin>>a>>b;c=add(a,b);cout<<"sum="<<c<<endl;}128实参和形参:[例4.4]main(){ inta=15,b=20,c; c=Max(a+10,b); cout<<“Max=“<<c;}intMax(intx,inty){ intz; z=x>y?x:y; returnz;}4.3函数参数和函数的值main函数Max函数形参实参15a20bczxy25202525129图4-2Max函数调用4.3函数参数和函数的值130(4)实参对形参的数据传递是“值传递”,即单向传递,只由实参传给形参。注意:实参单元与形参单元是不同的单元。调用结束后,形参单元被释放,实参单元仍保留原值。形参值发生改变,并不会改变主调函数中实参的值。有关形参与实参的说明15a20bxy25204.3.2函数的传值调用voidmain(){intm=10,n=20;cout<<"调用前:"<<"m="<<m<<",n="<<n<<endl;voidInterchange(intx,inty);Interchange(m,n);cout<<"调用后:"<<"m="<<m<<",n="<<n<<endl;}voidInterchange(intx,inty){cout<<"交换前:"<<"x="<<x<<",y="<<y<<endl;inttemp;temp=x;x=y;y=temp;cout<<"交换后:"<<"x="<<x<<",y="<<y<<endl;}131【例4-5】Interchange函数试图交换实参的值。【例4-5】Interchange函数试图交换实参的值。132图4-3传值函数调用默认值参数(默认参数):在编写函数时为形参提供默认值。用户在调用函数时,如果没有为对应参数指定实参值,则系统采用默认值作为函数实参。doubletotalCost(doubleunitPrice,intnum=1,doublediscountRate=0.8)//函数定义{returnnum*unitPrice*discountRate;}在默认值形参右边,不能出现无默认值的形参。doubletotalCost(doubleunitPrice=98.9,intnum,doublediscountRate=0.8)4.3.3默认值参数1331344.4函数的重载intAbs_Int(inta);doubleAbs_Double(doublea);charAbs_Char(chara);函数重载(functionoverloading):用同一函数名定义多个函数,这些函数的参数个数和参数类型不同。特点:一名多用。135例4.6求一个数中绝对值intmain(){
inti=-76;cout<<"i_Abs="<<Abs(i);
doubled=23.56;cout<<“d_Abs="<<Abs(d);
charc=-65;cout<<“c_Abs="<<Abs(c);}intAbs(inta)
{returna>=0?a:-a;}charAbs(chara){returna>=0?a:-a;}doubleAbs(doublea){returna>=0?a:-a;}136*4.5函数模板(functiontemplate)建立一个通用函数,其函数类型和形参类型不具体指定,用虚拟类型来代表。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次。137intmain(){inti=-76,i;doubled=56.87,d;charc1=-65,c;
i=Abs(i1);
//T被int取代
d=Abs(d1);
//T被double取代
c=Abs(c1);
//T被char取代
cout<<"i_Abs="<<i<<endl;cout<<“d_Abs="<<d<<endl;cout<<“c_Abs="<<c<<endl;}*4.5函数模板(functiontemplate)template<typenameT>TAbs(Ta){returna>=0?a:-a;}1384.6函数的嵌套调用不许嵌套定义,但可嵌套调用。【例4-9】用弦截法求下面方程的根。#include<iomanip>#include<cmath>voidmain(){ doublex1,x2,f1,f2,x; do{ cout<<"请输入变量x1,x2的值:"; cin>>x1>>x2; f1=f(x1); f2=f(x2); }while(f1*f2>=0); x=root(x1,x2); cout<<setiosflags(ios::fixed)<<setprecision(7);
cout<<"方程的根为:"<<x<<endl;}【例4-9】用弦截法求下面方程的根。doublef(doublex){//计算f(x) doubley; y=x*x*x-5*x*x+16*x-80; returny;}doublexpoint(doublex1,doublex2){//求弦与x轴交点 doubley;
//在xpoint函数中调用f函数
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1)); returny;}【例4-9】用弦截法求下面方程的根。doubleroot(doublex1,doublex2){//定义root函数,求近似根 doublex,y,y1; y1=f(x1); do{ x=xpoint(x1,x2);//在root函数中调用xpoint函数
y=f(x);//在root函数中调用f函数
if(y*y1>0){ y1=y; x1=x; } else x2=x; }while(fabs(y)>=0.00001); returnx;}【例4-9】用弦截法求下面方程的根。1434.7函数的递归调用递归调用:函数直接或间接地调用该函数本身。分类:直接递归和间接递归直接递归间接递归144long
fac(intn)
//递归函数{longf;if(n<0){cout<<"n<0,dataerror!"<<endl;
//报错并返回
f=-1;}elseif(n==0||n==1)f=1;
//0!和1!的值为1elsef=fac(n-1)*n;
//n>1时,进行递归调用
returnf;
//将f的值作为函数值返回}例4.10用递归方法求n!pleaseinputaninteger:10↙10!=36288001454.8存储类别静态存储方式:在程序运行期间,系统对变量分配固定的存储空间。动态存储方式:在程序运行期间,系统对变量动态分配存储空间。内存中的供用户使用的存储空间
1)程序区(代码区)2)静态存储区3)动态存储区146存储类别:数据在内存中存储的方法。分类自动变量(auto)静态变量(static)寄存器变量(register)外部变量(extern)4.8存储类别1474.8.1自动变量函数中的局部变量,不用关键字static声明。用关键字auto作显式声明。例:intf(inta)
//定义f函数,a为形参{auto
intb,c=3;
//b和c为整型自动变量┆}关键字auto可省略。①auto
intb,c=3;②intb,c=3;两者等价148寄存器变量:变量值放在CPU寄存器中。用关键字register声明。注:对编译系统只是建议性(非强制性)的。当今的编译系统能够识别使用频繁的变量,自动地将这些变量放在寄存器中。4.8.2用register声明寄存器变量寄存器变量的使用可以减少内存与CPU之间的数据交换,从而提高程序执行的效率。1494.8.3用static声明静态局部变量在函数调用结束后不消失而保留原值,在下一次该函数调用时,该变量保留上一次函数调用结束时的值。如:staticintx;Objectsandvariablesdeclaredasstaticretaintheirvaluesforthedurationofthepro
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新化节日活动策划方案(3篇)
- 栈桥楼面踏步施工方案(3篇)
- 沥青起刨施工方案(3篇)
- 甩货活动策划方案(3篇)
- 石材地面结晶施工方案(3篇)
- 绿化项目山火应急预案(3篇)
- 钢筋冬期施工方案(3篇)
- 防火卷帘变更施工方案(3篇)
- 风筝diy策划活动方案(3篇)
- 焦虑症患者的情绪放松练习
- 成品油罐车安全管理制度(3篇)
- 中小学少先队入队仪式争做新时代好队员主题班会模板
- 2023年上海高中学业水平合格性考试历史试卷真题(含答案详解)
- 2024年福建厦门市民族与宗教事务局招聘历年高频考题难、易错点模拟试题(共500题)附带答案详解
- PAC人流术后关爱与健康教育
- GB/T 42623-2023安装于办公、旅馆和住宅建筑的乘客电梯的配置和选择
- 亚磷酸的理化性质和危险特性(表-)
- KXJ04127可编程控制器使用说明书
- YY/T 1789.3-2022体外诊断检验系统性能评价方法第3部分:检出限与定量限
- GB/T 10051.3-2010起重吊钩第3部分:锻造吊钩使用检查
- GQY数字实验室实验手册定稿
评论
0/150
提交评论