版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象的程序设计语言C++面向对象的程序设计语言C++面向对象程序设计语言前言第1节C++语言概述第2节数据类型和表达式第3节预处理和语句第4节函数和作用域第5节类和对象(一)第6节类和对象(二)第7节继承性和派生类第8节多态性和虚函数第9节C++的I/O流库面向对象程序设计语言前言面向对象的程序设计语言1、面向对象的程序设计语言必须支持下列概念:封装的对象类和实例的概念类间的继承多态性2、面向对象程序设计语言的基本特征:对象、类、继承性、信息隐藏、强类型化、并发性、持久性。面向对象的程序设计语言1、面向对象的程序设计语言必须支持下列1.1C语言与面向对象的C++
(1)C语言既具备高级语言的结构和编程环境,又提供类似于汇编语言那样的系统资源操纵能力及程序执行效率。适合解决有实时要求的问题。C语言的主要特点:(2)有丰富的运算符和数据类型,表达式类型多样化,可以方便地实现在其他语言中较难实现的运算,对各种不同类型的程序设计都有良好的适应性。(3)以函数为基础实现程序的结构化设计,支持大型程序的多文件构成及单个文件独立编译,适合大型复杂程序的设计。(4)语言简洁、紧凑,使用方便、灵活,书写形式自由。(5)可移植性好。1.1C语言与面向对象的C++(1)C语言既具备高级语言1.1C语言与面向对象的C++
C++是由C发展成为的以面向对象为主要特征的语言。作为C语言的超集,C++继承了C的所有优点,又对数据类型做了扩充,使得编译系统可以检查出更多类型错误。C++支持面向对象程序设计,通过类和对象的概念把数据和对数据的操作封装在一起,通过派生、继承、重载和多态性等特征实现了软件重用和程序自动生成,使得大型复杂软件的构造和维护变得更加有效和容易。1.1C语言与面向对象的C++C++是由C发展成为的以面1.2C++对面向对象程序设计方法的支持C++支持数据封装(数据抽象)C++中,类是支持数据封装的工具,对象则是数据封装的实现;C++中包含有私有、公有和保护成员
每个可能的消息对应一个相应的方法,方法通过函数来定义;C++中通过发送消息来处理对象C++中允许友元破坏封装性C++中允许函数名和运算符重载C++支持继承性C++支持动态联编1.2C++对面向对象程序设计方法的支持C++支持数据封装1.2.2C++对C语言的改进增加了新的运算符:::,new,delete等;改进了类型系统,增加了安全性;引进了引用概念;允许函数重载,允许设置缺省参数,提高了编程的灵活性;引进了内联函数,提高了程序的效率;可以根据需要随时对变量进行说明;1.2.2C++对C语言的改进增加了新的运算符:::,n1.3C++程序的编辑、编译和运行一、编辑:源文件的扩展名为.cpp二、编译1、预处理过程词法分析:单词语法分析:构造程序的格式符号表:程序中的各种符号及其属性错误处理程序:生成目标代码:目标文件扩展名.obj2、编译过程3、连接过程:可执行文件扩展名.exe三、运行1.3C++程序的编辑、编译和运行一、编辑:源文件的扩展名1.3C++程序的编辑、编译和运行(续)源程序.cpp目标文件.obj可执行文件.exe编译器连接器磁盘中的#include文件C++库文件.LIB1.3C++程序的编辑、编译和运行(续)源程序.cpp目标1.4.1C++的字符集大小写的英文字母:a~z,A~Z数字字符:0~9特殊字符1.4.1C++的字符集大小写的英文字母:a~z,A~Z数1.4.2词法记号1、关键字(保留字)表1-1C++的关键字1.4.2词法记号1、关键字(保留字)表1-1C++的关1.4.2词法记号(续)2、标识符组成规则:以字母或下划线开始,其后跟零个或多个字母、数字或下划线;不能以数字开始正确标识符:Result,DoubleList,_first,first_错误标识符:1first标识符的长度任意(受编译器限制);区分字母的大小写;不能使用系统的保留字;例如:ADD,Add,add1.4.2词法记号(续)2、标识符组成规则:以字母或下划线1.4.2词法记号(续)3、运算符单目双目三目运算符5、分隔符(){},分隔符:4、各种文字数字字符文字串文字文字布尔文字;1.4.2词法记号(续)3、运算符单目双目三目运算符5、分1.4.3空白一、空白包括:空格、制表符、换行符、注释功能:指示词法记号的开始和结束位置;二、注释/*……*///1.4.3空白一、空白包括:空格、制表符、换行符、注释功能1.5C++程序的结构一、C++示范程序#include<iostream.h>voidmain(){cout<<"Helloworld!"<<endl;}二、C++程序的组成预处理命令输入输出函数语句变量其他I/O流库,提供所有的输入输出操作cout:流类对象<<:插入符提供屏幕输出;提供键盘输入:cin:流类对象>>:提取符例如:cout<<"Pleaseinputtwointegers:";cin>>a>>b;endl:换行;1.5C++程序的结构一、C++示范程序#include1.6vc++程序设计环境1.VC++可视化集成开发环境1.6vc++程序设计环境1.VC++可视化集成开发环境(1)建立控制台程序的基本步骤建立一个程序,运行后输出“ThisisaC++program.”,源程序如下:#include<iostream.h>voidmain(){ cout<<"ThisisaC++program"<<endl;}创建新工程创建C++源程序文件编译连接和运行源程序关闭、打开工作区2.VC++环境下的程序开发实例
(1)建立控制台程序的基本步骤2.VC++环境下的程序开发实输出结果输出结果(2)基于MFC的程序开发的基本步骤这里以设计一个如下图所示的对话框窗口程序(2)基于MFC的程序开发的基本步骤建立新的工程文件建立新的工程文件选择可视化控件拖到对话框窗口 进入编辑屏幕后,首先规划对话框窗口的布局,确定对话框窗口的界面。在控件面板中选择相应的控件后拖放到对话框窗口的适当位置
选择可视化控件拖到对话框窗口设置控件的属性 在属性对话框中设置控件的属性,如“StaticText”、“Button”控件的“Caption”属性为新生成的类定义公有数据成员和方法设置控件的属性为新的对话框类添加方法
即为对话框中的某些控件添加事件代码。比如本例希望单击“Button1”按钮后,能将IDC_Edit1中的文本复制到IDC_Edit2中来,就需要为“Button1”按钮添加“单击”事件代码,下面是该事件的实现代码:voidCExampleDlg::OnButton1(){ //TODO:Addyourcontrolnotificationhandlercodehere CStringstrExpression; m_edit1.GetWindowText(strExpression); m_edit2.SetWindowText(strExpression);}最后Compile或Build程序,得到可执行的应用程序为新的对话框类添加方法第2节数据类型和表达式2.1基本数据类型2.2常量和变量2.3数组类型2.4枚举类型2.5指针和引用2.6运算符2.7表达式2.8类型定义第2节数据类型和表达式2.1基本数据类型2.1基本数据类型一、基本数据类型整型int浮点型(实型)字符型char基本数据类型逻辑型bool空值型void单精度浮点数float双精度浮点数double用于函数和指针2.1基本数据类型一、基本数据类型整型int浮点型(实型)2.1基本数据类型(续)二、数据类型修饰符signed:有符号unsigned:无符号short:短型long:长型说明:3)
long修饰符还适用于双精度浮点数;2)上述修饰符均可用于整型和字符型;1)类型修饰符可以修饰除void、bool类型以外的其他类型;2.1基本数据类型(续)二、数据类型修饰符signed:有2.1基本数据类型(续)三、基本数据类型列表表2-1C++的基本数据类型2.1基本数据类型(续)三、基本数据类型列表表2-1C+2.1基本数据类型(续)说明:1)表中的[int]可以省略,即在int之前有修饰符出现时,可以省略关键字int;2)单精度类型float、双精度类型double、长精度类型longdouble统称浮点类型;3)char类型和各种int类型统称整型类型;char类型变量在内存中以它的ASCII码值的形式存储;4)字宽(字节)取决于操作系统和编译器的实现,可用sizeof验证;2.1基本数据类型(续)说明:1)表中的[int]可以省2.2.1常量一、整型常量(无小数部分)1、表示方法十进制八进制十六进制2、十进制表示由0~9的数字组成不能以0开始无前缀例:132,-3453、八进制表示由0~7的数字组成以0为前缀例:010,-05364、十六进制表示由0~9的数字及A~F的字母(大小写均可)组成以0x或0X为前缀例:0x7A,-0X3de2.2.1常量一、整型常量(无小数部分)1、表示方法十进制2.2.1常量(续)5、说明:1)长整型用L(或l)做后缀表示。例如:32765L,793l;2)无符号型用U(或u)做后缀表示。例如:4352U,3100u;3)unsignedlong型用后缀U(或u)和L(或l)一起表示,L与U的先后顺序无关。例如:49321ul,37825LU,41152Lu;4)无后缀时,整型常量类型按如下顺序确定:
int,(unsigned),long,unsignedlong十进制时无2.2.1常量(续)5、说明:1)长整型用L(或l)做后2.2.1常量(续)二、浮点型常量由整数部分和小数部分构成;只有十进制表示;一般表示形式(小数表示形式):整数部分与小数部分可以省去一部分,但不能全部省去;例如:5.,.25,4.072.2.1常量(续)二、浮点型常量由整数部分和小数部分构成2.2.1常量(续)科学表示形式:在小数表示法后面加E(或e)表示指数;例如:23.5E6,.032E-5,.3e10指数部分可正可负,但必须为整数;浮点常量的缺省数据类型为double型;后缀F(或f)表示float类型;后缀l(或l)表示longdouble类型;2.2.1常量(续)科学表示形式:在小数表示法后面加E(或2.2.1常量(续)三、字符常量由一对单引号括起的一个字符表示;其值为所括起字符在ASCII表中的编码;所括起字符的表示方法:图形表示法该方法适用于有图形符号的可打印字符;例如:'A','a','*'转义序列表示法该方法适用于所有字符,尤其是无图形符号的不可打印字符;2.2.1常量(续)三、字符常量由一对单引号括起的一个字符2.2.1常量(续)转义序列表示方法:以反斜线(\)开头,后跟字符的ASCII码值;八进制表示:\ddd;例如:\101十六进制表示:\xhh;例如:\x41表2-2C++中常用转义序列符2.2.1常量(续)转义序列表示方法:以反斜线(\)开头,2.2.1常量(续)四、布尔常量有两个值:true和false;五、字符串常量(串常量,字符串)一对双引号括起的字符序列,字符序列可以包含空格、转义序列或任何其他字符,这些字符不一定是C++字符集中的字符,只要C++编译器支持即可;例如:"Thisisastring;"串常量与字符常量的区别:2.2.1常量(续)四、布尔常量有两个值:true和f2.2.1常量(续)由一个字符型变量存放由一维数组存放字符常量串常量用单引号括起用双引号括起字符串有一个结束符,该结束符用'\0'表示字符常量'a'在内存中占用一个字节字符串常量"a"在内存中占用两个字节可进行加、减法运算可进行连接、拷贝运算2.2.1常量(续)由一个字符型变量存放由一维数组存放字符2.2.1常量(续)六、符号常量用来表示C++中的常量,即用一个与常量相关的标识符来替代常量;优点:增加可读性,增强可维护性;例如:PI表示3.1415926定义方法:使用类型说明符const;例如:constintsize=80;定义的符号常量必须初始化;一个符号常量可看作是一个只读变量,由const定义的常量的值不可以改变;2.2.1常量(续)六、符号常量用来表示C++中的常量,即Line1: #include<iostream.h>Line2: constdoublepi=3.1415;Line3: constdoubler;Line4: voidmain()Line5: {Line6: doubleperimeter,area;Line7: perimeter=2*pi*r;Line8: pi=3.14;Line9: area=pi*r*r;Line10: cout<<perimeter<<","<<area<<endl;Line11: }
2.2.1常量(续)constdoubler=3.2;错误错误,不能修改pi的值Line1: #include<iostream.h>2.地址值2.2.2变量一、变量的三个基本要素名字类型值三要素数据值地址值intc;c=5;内存5......c地址值1000H变量类型变量名数据值二、变量的定义可以在程序中随时定义变量,只要在该变量被使用前定义即可;定义格式:<类型><变量名表>;例如:inta,b,c;doublex,y,z;地址值2.2.2变量一、变量的三个基本要素名字类型值三要素2.2.2变量(续)同一程序块内不可以定义同名变量;初始值变量定义时可赋初始值;声明格式:数据类型标识符1(初始值1),…,标识符n(初始值n);数据类型标识符1=初始值1,…,标识符n=初始值n;例如:doubleprice=15.5;intsize=100;未被初始化的变量的值或者是默认值,或者是无效值,由变量类型决定;变量可被赋值,由变量名标识;2.2.2变量(续)同一程序块内不可以定义同名变量;初始值2.3数组类型数目固定、类型相同的若干个变量的有序集合;2.3数组类型数目固定、类型相同的若干个变量的有序集合2.3.1数组的定义1、格式<类型><数组名>[<大小1>][<大小2>]…;说明:方括号([])表示数组的维;某维的大小必须是大于1的常量表达式;2、示例inta[3];charb[3][5];constintsize=80;intm[size];2.3.1数组的定义1、格式<类型><数组名>[<大小12.3.2数组的赋值1、数组元素的表示下标表示:<数组名>[<下标表达式1>][<下标表达式2>]…;说明:<下标表达式>为常量表达式;下标从0开始;各个元素在内存中按其下标的升序顺序连续存放;指针表示:2.3.2数组的赋值1、数组元素的表示下标表示:<数组名>2.3.2数组的赋值(续)2、数组元素赋初值利用初始值表(由一对花括号括起来的若干数据项组成)实现;数组元素的个数要大于等于初始值表中数据项的个数;例如:inta[5]={1,2,3,4,5};inta[4]={5,4};intb[2][3]={{1,2,3},{4,5,6}};intb[2][3]={1,2,3,4,5,6};3、数组元素的赋值例如:intm[3];m[0]=5;m[1]=3;m[2]=1;2.3.2数组的赋值(续)2、数组元素赋初值利用初始值表(2.3.3字符数组说明:字符数组是指数组元素是char类型的数组;注意字符常量、字符数组与字符串常量的区别;例如:chars1[4]={'a','b','c','d'};字符数组chars2[5]={'a','b','c','d','\0'};字符数组(字符串常量)等价于chars2[5]="abcd";chars3[5]="abcde";╳chars3[]="abcde";2.3.3字符数组说明:字符数组是指数组元素是char类型2.4枚举类型枚举类型是若干个有名字的整型常量的集合;2.4枚举类型枚举类型是若干个有名字的整型常量的集合;2.4.1枚举声明和枚举变量一、枚举声明enum<枚举名>{<枚举表>};<枚举表>由若干个枚举符组成,多个枚举符之间用逗号分隔;枚举符是用标识符表示的整型常量,又称枚举常量;枚举常量的值默认为最前边的一个为0,其后的值依次加1;枚举常量的值也可显式定义,未显式定义的则在前一个值的基础上加1;2.4.1枚举声明和枚举变量一、枚举声明enum<枚举名2.4.1枚举声明和枚举变量(续)二、枚举变量例如:enumday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};enumday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};枚举变量的值不一定互不相同;enum<枚举名><枚举变量名表>;多个枚举变量之间用逗号分隔;例如:enumdayd1,d2,d3;enumday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}d1,d2,d3;2.4.1枚举声明和枚举变量(续)二、枚举变量例如:enu2.4.2枚举变量的值其值是该枚举变量所属的枚举声明的枚举表的某一个枚举符;利用枚举符所表示的整型值给枚举变量赋值时,需要进行类型强制;例如:d1=Sun;d2=Sat;
d3=(enumday)4;2.4.2枚举变量的值其值是该枚举变量所属的枚举声明的枚举2.5.1指针1、什么是指针指针是用来存放某个变量的地址值的一种变量;指针的类型是它所指向变量的类型;指针本身数据值的类型是unsignedlongint型;例如:inta(5);int*p=&a;内存1000H5...a地址值1000H3000Hp2.5.1指针1、什么是指针指针是用来存放某个变量的地址值2.5.1指针(续)2、如何定义指针例如:int*pi;char(*pa)[3];float*pl;int(*pf)();char*pc;int*pp;<类型>*<指针名1>,*<指针名2>,…;3、指针的赋值(内存地址值)指针必须被赋值后才可使用;一般变量、数组元素、结构成员的地址值为变量名前加运算符&;数组的地址值用该数组名表示;2.5.1指针(续)2、如何定义指针例如:<类型>*<指2.5.1指针(续)函数的地址值用该函数的名字表示;例如:inta,b[10];doublesin(doublex);int*p=&a,*p=&b[3];double(*pf)();inta[10],*p=a;pf=sin;3、指针的运算赋值运算。例如:inta,*p=&a,*q;q=p;一个指针可以加上或减去一个整数值;2.5.1指针(续)函数的地址值用该函数的名字表示;例如:a与&a[0]相同2.5.2指针和数组1、C++中指针与数组的关系C++通过指针访问数组中的每个元素;2、一维数组的指针表示法C++中规定:任何一个数组的名字是一个常量指针,其值是该数组的首元素的地址值;例如:inta[5];数组表示法:a[i],i=0,1,2,3,4
指针表示法:*(a+i)a与&a[0]2.5.2指针和数组1、C++中指针与数组的2.5.2指针和数组(续)3、二维数组的指针表示法intb[2][5];数组表示法:b[i][j]i=0,1;j=0,1,2,3,4指针表示法:*((b+i)+j)*(b[i]+j)(*(b+i))[j](&b[0][0]+5*i+j)4、三维数组的指针表示法(同二维)5、示例2.5.2指针和数组(续)3、二维数组的指针表示法int2.5.2指针和数组(续)例2.1:分析下列程序的输出结果。#include<iostream.h>voidmain(){staticinta[5]={5,4,3,2,1};inti,j;i=a[0]+a[4];j=*(a+2)+*(a+4);cout<<i<<endl<<j<<endl;}输出644a[1]5a[0]3a[2]2a[3]1a[4]aa+2a+42.5.2指针和数组(续)例2.1:分析下列程序的输出结果2.5.3引用标识对象的一种机制;对对象存储地址的抽象,但引用不是值;引用有类型;变量的别名;1、定义格式<类型>&<引用名>(<变量名>);或<类型>&<引用名>=<变量名>;2、初始化与赋值定义引用时必须初始化;可以将一个引用赋给某个变量;引用可被赋值;2.5.3引用标识对象的一种机制;对对象存储地址的抽象,但2.5.3引用(续)示例:inta=3;int&m=a;intn=m;int*p=&m;m=m+5;3a8pm3n定义引用并初始化将引用赋值给变量a=8,对引用的操作就是对被引用者的操作3、引用的功能用做函数的参数或函数的返回值;函数不能返回对局部对象的引用;2.5.3引用(续)示例:3a8pm3n定义引用并初始化将2.5.3引用(续)示例:int&f(intindex,inta[]){intr=a[index];returnr;}错,r是局部对象4、指针与引用的区别指针通过地址间接访问某个变量,引用通过别名直接访问某个变量;引用必须初始化,一旦被初始化后不得再作为其他变量的别名;正确:int&r=a[index];为什么?2.5.3引用(续)示例:错,r是局部对象4、指针与引用的2.5.3引用(续)例2.4:分析下列程序的输出结果。#include<iostream.h>voidmain(){intval(5);int&refv=val;refv=refv+5;;cout<<refv<<endl;int*p=&refv,val1(refv);cout<<*p<<"\t"<<val1<<endl;}输出1010102.5.3引用(续)例2.4:分析下列程序的输出结果。#i2.6.1算术运算符1、普通算术运算符单目算术运算符:-(取负)、+(取正);双目算术运算符:+、-、*、/、%(只用于int型);单目运算符优先级高于双目运算符;2、增1和减1运算符单目运算符:++、--;++运算符的功能:由该运算符组成的表达式具有一定的值;由该运算符组成的表达式计算后,其变量值要发生改变;2.6.1算术运算符1、普通算术运算符单目算术运算符:-(2.6.1算术运算符(续)++运算符的两种方式:前缀方式与后缀方式;前缀方式与后缀方式的区别:前缀运算表达式的值为原来变量值加1;后缀运算表达式的值为原来变量值;两种方式的变量的值都加1;示例:inta(1);++a;intb(1);b++;表达式++a的值为2,变量a的值为2;表达式b++的值为1,变量b的值为2;2.6.1算术运算符(续)++运算符的两种方式:前缀方式与2.6.2关系运算符双目运算符:>、<、>=、<=、==、!=前四种优先级高于后两种;2.6.2关系运算符双目运算符:>、<、>=、<=、==、2.6.3逻辑运算符双目运算符:&&、||优先级:&&、||、!单目运算符:!2.6.3逻辑运算符双目运算符:&&、||优先级:&&、|2.6.4位操作运算符1、逻辑位运算符单目逻辑位运算符:~双目逻辑位运算符:&、|、^双目逻辑位运算符的优先级:&、|、^;2、移位运算符双目运算符:<<、>>;<<时移掉的位被丢弃,右边移出的空位补0;>>时移掉的位被丢弃,左边移出的空位补0或符号位;2.6.4位操作运算符1、逻辑位运算符单目逻辑位运算符:~2.6.5赋值运算符简单赋值运算符:=复合赋值运算符:+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=2.6.5赋值运算符简单赋值运算符:=复合赋值运算符:+=2.6.6其他运算符1、三目运算符格式:d1?d2:d3功能:先计算d1,若其非零,表达式的值为d2的值,否则为d3的值;表达式类型:d2和d3中类型较高者的类型;2、逗号运算符格式:d1,d2,…,dn表达式的值和类型:由最后一个表达式确定;优先级在所有运算符中最低;3、sizeof运算符2.6.6其他运算符1、三目运算符格式:d1?d2:d3功2.6.6其他运算符(续)格式:功能:返回其后的类型说明符或表达式所表示的数在内存中所占的字节;4、单目运算符&和*&:取地址;*:用在指针名前,表示取指针的内容;5、强制类型运算符sizeof(<类型说明符>);或sizeof(<表达式>);格式:<类型说明符>(<表达式>);或(<类型说明符>)<表达式>;2.6.6其他运算符(续)格式:功能:返回其后的类型说明符2.6.6其他运算符(续)强制类型转换可将高类型转换为低类型,是一种不安全的转换;示例:doublef(3.85);inth;h=int(f);该转换是暂时的,一次性的;示例:inta(3),m;doubleb;b=3.56+double(a);m=a+5;2.6.6其他运算符(续)强制类型转换可将高类型转换为低类2.7.1表达式的种类由运算符和操作数组成的式子;常见的表达式算术表达式;逻辑表达式;关系表达式;赋值表达式;条件表达式;逗号表达式;2.7.1表达式的种类由运算符和操作数组成的式子;常见的表2.7.1表达式的种类(续)注意事项:连续的两个运算符之间用空格分隔;可用括号来改变运算符优先级;双目运算符的左右可以用空格符和操作数分开;过长的表达式可分成几个表达式;2.7.1表达式的种类(续)注意事项:连续的两个运算符之间2.7.2表达式的值和类型一、确定表达式的值二、表达式求值方法与确定类型的方法先确定运算符的功能;确定计算顺序:先考虑优先级,再考虑结合性;2.7.2表达式的值和类型一、确定表达式的值二、表达式求值2.7.2表达式的值和类型(续)例2.6:分析下列程序的输出结果(算术表达式)。#include<iostream.h>voidmain(){unsigneda(0xab),b(20);a&=b;a^=a;cout<<a<<"\t"<<b<<endl;intx(-3),y(5);x>>y;x<<=y;x|=y^~y;y&=~x+1;cout<<x<<"\t"<<y<<endl;}输出:020-112.7.2表达式的值和类型(续)例2.6:分析下列程序的输2.7.2表达式的值和类型(续)例2.7:分析下列程序的输出结果(关系表达式)。#include<iostream.h>voidmain(){charx('m'),y('n');intn;n=x<y;cout<<n<<endl;n=x==y-1;cout<<n<<endl;n=('y'!='Y')+(5>3)+(y-x==1);cout<<n<<endl;}输出:1132.7.2表达式的值和类型(续)例2.7:分析下列程序的输2.7.2表达式的值和类型(续)例2.8:分析下列程序的输出结果(逻辑表达式)。#include<iostream.h>voidmain(){intx,y,z;x=y=z=1;--x&&++y&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&++y&&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&y--||++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;}输出:011122212注意逻辑表达式的求值方法2.7.2表达式的值和类型(续)例2.8:分析下列程序的输2.7.2表达式的值和类型(续)例2.9:分析下列程序的输出结果(条件表达式)。#include<iostream.h>voidmain(){inta(3),b(4),c;c=a>b?++a:++b;cout<<a<<","<<b<<","<<c<<endl;c=a-b?a+b:a-3?b:a;cout<<a<<","<<b<<","<<c<<endl;}3,5,53,5,8注意三目运算符的判断条件输出2.7.2表达式的值和类型(续)例2.9:分析下列程序的输2.7.2表达式的值和类型(续)例2.10:分析下列程序的输出结果(赋值表达式)。#include<iostream.h>voidmain(){intx(1),y(3),z(5);x+=y*=z-=2;cout<<x<<","<<y<<","<<z<<endl;x*=y/=z-=x;cout<<x<<","<<y<<","<<z<<endl;x=y=z=2;z=(x+=2)+(y+=4)+2;cout<<x<<","<<y<<“,"<<z<<endl;}输出:10,9,3-10,-1,-74,6,122.7.2表达式的值和类型(续)例2.10:分析下列程序的2.7.2表达式的值和类型(续)例2.11:分析下列程序的输出结果(逗号表达式)。#include<iostream.h>voidmain(){inta,b,c;a=1,b=2,c=a+b+3;cout<<a<<","<<b<<","<<c<<endl;c=(a++,a+=b,a+b);cout<<a<<","<<b<<","<<c<<endl;}1,2,64,2,6输出2.7.2表达式的值和类型(续)例2.11:分析下列程序的2.7.3表达式中的类型转换一、隐含转换双目运算中操作数的类型转换;是一种保值转换,转换类型由低到高;转换规则:intunsignedlongunsignedlongdoubleshort,charfloat二、强制转换显式强制转换(通过强制转换运算符实现);2.7.3表达式中的类型转换一、隐含转换双目运算中操作数的2.7.3表达式中的类型转换(续)隐式强制转换:在赋值表达式中,当左值(赋值运算符左边的值)和右值(赋值运算符右边的值)的类型不同时,一律将右值类型强制转换为左值的类型;在函数有返回值的调用中,将return后面的表达式的类型强制转换为该函数的类型;显式隐式赋值表达式函数返回值隐含转换强制转换类型转换2.7.3表达式中的类型转换(续)隐式强制转换:在赋值表达2.8类型定义1、格式typedef<已有类型名><新类型名表>;例如:typedefdoublewages,bouns;wagesweekly;bounsmonthly;2、自定义类型的作用改善程序的可读性,增加所定义变量的信息书写简练提高程序的可移植性2.8类型定义1、格式typedef<已有类型名><新第3节预处理和语句3.1预处理功能3.2语句3.3选择语句3.4循环语句3.5转向语句第3节预处理和语句3.1预处理功能3.1预处理功能一、预处理命令及预处理功能1、预处理命令C++源程序中包含的各种编译命令在程序被正常编译之前执行;预处理命令不是C++语言的一部分;2、预处理功能由预处理命令实现的功能;二、常用的预处理命令文件包含命令宏定义命令3.1预处理功能一、预处理命令及预处理功能1、预处理命令C3.1预处理功能(续)以"#"为引导;每条预处理命令单独占用一行,同一行不能有其他预处理命令和语句;三、预处理命令使用说明条件编译命令停止编译命令预处理命令的位置可以放在开头、中间和结尾;预处理命令可以续行,续行符为"\";预处理命令不是语句,不能以分号(;)结束;3.1预处理功能(续)以"#"为引导;每条预处理命令单3.1.1文件包含命令一、功能指示C++编译器将一个文件(头文件)的内容嵌入到该指令所在的文件中该指令所在位置处;头文件指存放与标准函数有关的信息,或者存放符号常量、类型定义、类和其他复杂类型的定义以及与程序环境相关信息的.h文件;二、格式#include
<文件名>由系统提供并放在指定子目录中的头文件;#include
"文件名"由用户定义,放在当前目录或其他目录下的头文件或其他源文件;3.1.1文件包含命令一、功能指示C++编译器将一个文件(3.1.1文件包含命令(续)三、说明文件包含命令一般放在程序头;一条文件包含命令只能包含一个文件;文件名:myfile.h#include"myfile2.h"#include"myfile3.h"文件包含命令可以嵌套;包含文件不易过多;3.1.1文件包含命令(续)三、说明文件包含命令一般放在程3.1.2宏定义命令一、功能用来将一个标识符定义为一个字符串,该标识符称为宏名,被定义的字符串称为替换文本;二、宏定义命令格式1、两种定义格式简单宏定义带参数的宏定义2、简单宏定义定义符号常量,例如:#definePI3.1415#define<宏名><字符串>3.1.2宏定义命令一、功能用来将一个标识符定义为一个3.1.2宏定义命令(续)#define与const定义符号常量的区别const产生一个具有类型的符号#define仅产生文本替换,而不管内容是否正确constdoublePI=3.1415;#definePI3.1415使用const可以定义一个局部常量,可局部在一个函数体内用#define定义的常量的作用域是从定义时开始,直到使用#undef取消定义时为止,如果不取消定义,直到整个文件结束使用const定义常量是一个说明语句,用分号(;)结束使用#define定义常量是一个预处理命令,不能用分号(;)结束3.1.2宏定义命令(续)#define与const定义符3.1.2宏定义命令(续)说明书写#define命令时,<宏名>与<字符串>之间用空格分隔,不能使用等号连接;使用#define定义的标识符不是变量,它只用作宏替换,不占用内存;#define是一条预处理命令,不用分号结束,它所定义的标识符等价于其后的字符串;标识符被宏定义后,在取消这次宏定义之前,不允许重新对它进行宏定义;宏定义可以嵌套,已定义的标识符可以用来定义新的字符串;3.1.2宏定义命令(续)说明书写#define命令时,<3.1.2宏定义命令(续)说明<宏体>应写在一行上,如果需要写在多行时,需使用续行符(\)结束,并在其后按下回车键;<宏名>与左括号之间不能出现空格,否则空格右边都将作为宏体;定义带参数的宏体时,宏体中与参数名相同的字符序列适当地加上括号,可以避免宏替换后出现的优先级问题;C++中,带参数的宏定义常由内联函数取代;3、带参数的宏定义#define<宏名>(<参数表>)<宏体>3.1.2宏定义命令(续)说明<宏体>应写在一行上,如果需3.1.2宏定义命令(续)例3.1:分析下列程序的输出结果。#include<iostream.h>voidmain(){intb(5);#defineb2#definef(x)b*(x)inty(3);cout<<f(y+1)<<endl;#undefbcout<<f(y+1)<<endl;#defineb(3)cout<<f(y+1)<<endl;}输出:82012简单宏定义带参数的宏定义b=2b=5b=33.1.2宏定义命令(续)例3.1:分析下列程序的输出结果3.1.2宏定义命令(续)4、替换正文中的操作符##与###:将它两边的操作数连接成一个符号;#:将它右边的操作数变成一个字符串文字;例如:#defineCON(a,b)a##bdoublei=CON(5,E-10)doublei=5E-10;#defineSTR(a)#acout<<STR(Programmingisfun!)<<endl;cout<<"Programmingisfun!"<<endl;5、取消宏定义命令#undef<标识符>3.1.2宏定义命令(续)4、替换正文中的操作符##与##3.1.3条件编译命令一、功能用来定义某些编译内容要在满足一定条件下才参与编译,否则不参与编译;可使同一源程序在不同的编译条件下产生不同的目标代码。二、格式格式一:#ifdef<标识符><程序段1>#else<程序段2>#endif或#ifdef<标识符><程序段1>#endif3.1.3条件编译命令一、功能用来定义某些编译内容要在3.1.3条件编译命令(续)格式二#ifndef<标识符><程序段1>#else<程序段2>#endif或#ifndef<标识符><程序段1>#endif格式三#if<常量表达式1><程序段1>#elif<常量表达式2><程序段2>#elif<常量表达式3><程序段3>...#else<程序段n+1>#endif3.1.3条件编译命令(续)格式二格式三3.1.3条件编译命令(续)例3.2:分析下列程序的输出结果。#include<iostream.h>#defineA10voidmain(){#ifA>0cout<<"a>0"<<endl;#elifA<0cout<<"a<0"<<endl;#elsecout<<"a==0"<<endl;#endif}输出:a>03.1.3条件编译命令(续)例3.2:分析下列程序的输出结3.1.3条件编译命令(续)例3.3:避免重复引用某个头文件。//main.cpp#include"myfile1.h"#include"myfile2.h"//myfile1.h#include"myhead.h"//myfile2.h#include"myhead.h"改进://myfile1.h#ifndefMYHEAD_H#defineMYHEAD_H#include"myhead.h"#endif//myfile2.h#ifndefMYHEAD_H#defineMYHEAD_H#include"myhead.h"#endif3.1.3条件编译命令(续)例3.3:避免重复引用某个头文3.1.3条件编译命令(续)例3.4:用于调试。调试时:#defineDEBUG1...#ifDEBUG=1cout<<"OK"<<endl;#endif...调试后:#defineDEBUG0...3.1.3条件编译命令(续)例3.4:用于调试。调试时:调3.1.4停止编译命令一、格式#error<字符序列>二、功能当编译器遇到该指令时,显示“字符序列”,即错误信息,然后停止对该程序的编译,从而可以在编译阶段发现程序中的错误;三、示例假设country值为:US、ENGLAND、CHINA程序中有如下语句:3.1.4停止编译命令一、格式#error<字符序列>二3.1.4停止编译命令(续)//…#else#errorYoudefinecountryincorrectly#endif当country的值不是上述三者之一时,编译器将显示:然后停止编译。Youdefinecountryincorrectly3.1.4停止编译命令(续)//…当country的值3.2语句1、表达式语句和空语句表达式语句:任何一个表达式加上分号(;);空语句:只有一个分号(;)的语句;2、复合语句和分程序复合语句:由两条或两条以上的程序构成,并由一对花括号括起;分程序:又称块结构,含有一条或多条说明语句的复合语句;3.2语句1、表达式语句和空语句表达式语句:任何一个表达式3.3.1条件语句if(<条件1>)<语句1>elseif(<条件2>)<语句2>elseif(<条件3>)<语句3>...elseif(<条件n>)<语句n>else<语句n+1>说明:if语句可以嵌套,在此情况下,else与最近的一个没有与else配对的if配对。3.3.1条件语句if(<条件1>)<语句1>说3.3.2开关语句switch(<整型表达式>){case<整常型表达式1>:<语句序列1>case<整常型表达式2>:<语句序列2>...case<整常型表达式n>:<语句序列n>default<语句序列n+1>}注意:
在执行语句序列中如果遇到break语句,则退出switch语句,执行后面的语句;如果其后的语句序列中没有break语句,则一直执行至switch语句结束。3.3.2开关语句switch(<整型表达式>)注3.3.2开关语句(续)例3.5:分析下列程序的输出结果。#include<iostream.h>voidmain(){inti(1),j(0),m(1),n(2);switch(i++){case1:m++;n++;case2:switch(++j){case1:m++;case2:n++;}case3:m++;n++;break;case4:m++;n++;}cout<<m<<','<<n<<endl;}
输出:4,53.3.2开关语句(续)例3.5:分析下列程序的输出结果。3.4循环语句1、while循环语句while(<条件>)<语句>;2、do-while循环语句do<语句>while(<条件>);do-while循环与while循环的区别:do-while循环至少执行一次循环体,while循环可能一次也不执行循环体;3、for循环语句for
(d1;d2;d3)<语句>;4、多重循环3.4循环语句1、while循环语句while(<条件>3.5转向语句1、goto语句格式:goto<语句编号>;goto语句只能在一个函数内进行转向;2、break语句格式:break;适用情况:用于开关语句的语句序列中,其功能是退出开关语句,执行其后的语句;用于循环体中,其功能是用来退出该重循环;3、continue语句格式:continue;功能:在循环体中用来结束本次循环;3.5转向语句1、goto语句格式:goto<语句编号第4章函数和作用域4.1函数的基本概念4.2函数的定义和说明4.3函数的调用4.4函数的参数4.5内联函数4.6函数重载4.7异常处理基础4.8作用域第4章函数和作用域4.1函数的基本概念返回类型为void类型的函数抽象为过程抽象4.1函数的基本概念函数结构:由花括号括起来的一个语句序列;函数抽象:使用标识符对语句序列进行的抽象;函数调用:函数级上的控制抽象,一种控制转移;参数化:在函数抽象中对其所操作的值进行抽象的过程;形参与实参函数抽象与过程抽象函数抽象的目的是进行求值过程抽象的目的是更新对象C++中只有函数抽象返回类型为4.1函数的基本概念函数结构:由花括号括起来的一4.2.1函数的定义格式<类型><函数名>(<参数表>){<若干条语句>}说明:<类型>为函数返回值类型,若为void,则为过程调用;<参数表>中的参数为形参,在函数被调用时进行初始化,从而从被调用处获得数据;函数体4.2.1函数的定义格式<类型><函数名>(<参数4.2.2函数的说明方法(函数的声明)一、函数的说明原则如果一个函数定义在先,调用在后,调用前可以不必说明;如果一个函数定义在后,调用在先,调用前必须说明;二、函数的说明方法(原型说明)<类型><函数名>(<参数表>);三、示例参数表中的参数名称可以省略4.2.2函数的说明方法(函数的声明)一、函数的说明原则如4.2.2函数的说明方法(续)#include<iostream.h>voidfun1(),fun2(),fun3();voidmain(){cout<<"Itisinmain."<<endl;fun2();cout<<"Itisbackinmain."<<endl;}voidfun1(){cout<<"Itisinfun1."<<endl;fun3();cout<<"Itisbackinfun1."<<endl;}例4.1:分析下列程序的输出结果。函数原型声明4.2.2函数的说明方法(续)#include<iost4.2.2函数的说明方法(续)voidfun2(){cout<<"Itisinfun2."<<endl;fun1();cout<<"Itisbackinfun2."<<endl;}voidfun3(){cout<<"Itisinfun3."<<endl;}Itisinmain. Itisbackinfun1.Itisinfun2.Itisbackinfun2.Itisinfun1.Itisbackinmain.Itisinfun3.输出4.2.2函数的说明方法(续)voidfun2()It4.3.1函数的值和类型说明:实参表的个数由形参决定,用来初始化实参,多个实参用逗号分隔;实参的个数与类型必须与形参的个数与类型完全一致;一、函数调用格式<函数名>(<实参表>);实参对形参的初始化按其位置进行;4.3.1函数的值和类型说明:实参表的个数由形参决定,用来4.3.1函数的值和类型(续)关于return语句的说明:有返回值的return语句可以返回一个表达式的值,从而实现函数之间的信息传递;无返回值的函数必须用void说明其返回类型;二、返回语句格式格式一:return<表达式>;格式二:return;4.3.1函数的值和类型(续)关于return语句的说明:4.3.2函数的传值调用一、传值调用的分类二、传值调用的实现机制和特点传值调用:传递变量本身的值(数据值);传址调用:传递变量的地址值;用法:调用函数的实参用常量、变量(数据)值或表达式值,被调用函数的形参用变量;实现机制:系统将实参拷贝一个副本给形参(数据值);特点:形参值的改变不影响实参值;4.3.2函数的传值调用一、传值调用的分类二、传值调用的实4.3.2函数的传值调用(续)#include<iostream.h>voidswap1(intx,inty){inttemp;temp=x;x=y;y=temp;cout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap1(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}例4.2:分析下列程序的输出结果(传值调用)。输出:x=9,y=5a=5,b=94.3.2函数的传值调用(续)#include<iost4.3.3函数的传址调用传址调用的实现机制和特点用法:调用函数的实参用地址值,被调用函数的形参用指针;实现机制:让形参的指针直接指向实参;特点:可以通过改变形参所指向的变量值来影响实参值;4.3.3函数的传址调用传址调用的实现机制和特点用法:调用4.3.3函数的传址调用(续)#include<iostream.h>voidswap2(int*x,int*y){inttemp;temp=*x;
*x=*y;
*y=temp;cout<<"x="<<*x<<","<<"y="<<*y<<endl;}voidmain(){inta(5),b(9);swap2(&a,&b);cout<<"a="<<a<<","<<"b="<<b<<endl;}输出:x=9,y=5a=9,b=5例4.3:分析下列程序的输出结果(传址调用)。4.3.3函数的传址调用(续)#include<iost4.3.4函数的引用调用(C++特有)引用调用的实现机制和特点用法:调用函数的实参用变量名,被调用函数的形参用引用;实现机制:直接通过引用来改变实参的数据值;特点:起到传址调用的作用,但比传址调用更方便、更直接;4.3.4函数的引用调用(C++特有)引用调用的实现机制和4.3.4函数的引用调用(续)#include<iostream.h>voidswap3(int&x,int&y){inttemp;temp=x;
x=y;
y=temp;cout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap3(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}输出:x=9,y=5a=9,b=5例4.4:分析下列程序的输出结果(引用调用)。4.3.4函数的引用调用(续)#include<iost4.3.4函数的引用调用(续)三种调用方式比较4.3.4函数的引用调用(续)三种调用方式比较4.4.1函数参数的求值顺序当一个函数带有多个参数时,C++语言没有规定函数调用时实参的求值顺序;编译器根据对代码进行优化的需要自行规定对实参的求值顺序;在实参中注意不要使用带有副作用的运算符,此时可能产生二义性;例4.5:由于使用对参数求值顺序不同的编译器造成的二义性。4.4.1函数参数的求值顺序当一个函数带有多个参数时,C+4.4.1函数参数的求值顺序(续)#include<iostream.h>intadd(intx,inty){returnx+y;}voidmain(){intx(4),y(6);intz=add(++x,x+y);cout<<z<<endl;}产生二义性可能的结果(按照编译器对实参求值顺序不同):自左至右,两个实参的值分别为5和11;自右至左,两个实参的值分别为5和10;4.4.1函数参数的求值顺序(续)#include<io注意:函数参数求值顺序与参数默认值补足顺序不同参数求值顺序:由编译器决定求值方向;参数默认值补足顺序:自左向右4.4.2设置函数参数的默认值C++中,在函数声明或定义时可以为一个或多个参数指定缺省参数值;intadd(intx,inty=10);进行函数调用时,若未指定足够的实参,则编译器将按从左向右的顺序用函数声明或定义中的缺省值来补足所缺少的实参;add(15);add(15,10);注意:4.4.2设置函数参数的默认值C++中,在函数声明或4.4.2设置函数参数的默认值(续)在一个指定了缺省值的参数的右边,不能出现没有指定缺省值的参数;voidf(intx,inty=1,intz);在给某个参数指定缺省值时,不仅可以是一个数值,而且可以是任意复杂的表达式;intf();……voiddelay(intk,inttime=f());错误例如:f(2,4);理想:f(2,1,4),实际:z参数未被赋值4.4.2设置函数参数的默认值(续)在一个指定了缺省值的参4.4.2设置函数参数的默认值(续)#include<iostream.h>voidfun(inta=1,intb=3,intc=5){cout<<"a="<<a<<","<<"b="<<b<<","<<"c="<<c<<endl;}voidmain(){fun();fun(7);fun(7,9);fun(7,9,11);cout<<"OK!"<<endl;}输出:a=1,b=3,c=5a=7,b=3,c=5a=7,b=9,c=5a=7,b=9,c=11OK!例4.6:分析下列程序的输出结果。4.4.2设置函数参数的默认值(续)#include<i普通函数内联函数4.5.1内联函数引入的原因目的
解决程序中一些函数体代码不是很大,但又频繁地被调用的函数的函数调用的效率问题。解决方法以目标代码的增加为代价来换取时间上的节省;即在编译时将函数体中的代码替换到程序中,增加目标程序代码量,进而增加空间开销,从而在时间开销上不像函数调用时那么大。普通函数内联函数4.5.1内联函数引入的原因目的解决程4.5.2内联函数的定义方法在函数定义的前面加上关键字inline
inlineintadd(intx,inty,intz){returnx+y+z;}4.5.2内联函数的定义方法在函数定义的前面加上关键字in4.5.3使用内联函数的注意事项在内联函数内不允许用循环语句或开关语句;内联函数的定义必须出现在该内联函数第一次被调用之前;类结构中所有在类说明内部定义的函数都是内联函数;对内联函数不能进行异常接口说明;内联函数无法递归调用;内联函数具有与带参数的宏定义#define相同的作用和相似的机理,但内联函数具有宏定义的所有优点而没有其缺点,它消除了宏定义的不安全性。
4.5.3使用内联函数的注意事项在内联函数内不允许用循环语include<iostream.h>#definef(x)x*x
voidmain(){ intx(2); cout<<f(x)<<endl; cout<<f(x+1)<<endl;}程序运行结果:45原因:f(x) 替换为2*2f(x+1) 替换为2+1*2+1include<iostream.h>inlineintf(intx){ returnx*x;}voidmain(){ intx(2); cout<<f(x)<<endl; cout<<f(x+1)<<endl;}程序运行结果:49原因:f(x) 替换为 2*2f(x+1) 替换为 3*34.5.3使用内联函数的注意事项include<iostream.h>include<i4.6函数重载函数重载是指同一个函数名可以对应着多个函数的实现;要求:编译器能够唯一确定调用一个函数时应执行哪个函数代码;条件:参数个数不同;参数类型不同;注意:
返回值类型不能作为重载条件;4.6函数重载函数重载是指同一个函数名可以对应着多个函数的4.6.1参数类型不同的重载函数#include<iostream.h>intadd(int,int);doubleadd(double,double);voidmain(){cout<<add(5,10)<<endl;cout<<add(5.0,10.5)<<endl;}intadd(intx,inty){cout<<"int"<<endl;returnx+y;}例4.7:分析下列程序的输出结果。两个add函数的参数类型不同4.6.1参数类型不同的重载函数#include<ios4.6.1参数类型不同的重载函数(续)doubleadd(doublex,doubley){cout<<"double"<<endl;returnx+y;}输出int15double15.54.6.1参数类型不同的重载函数(续)doubleadd4.6.2参数个数不同的重载函数#include<iostream.h>intmin(inta,intb);intmin(inta,intb,intc);intmin(inta,intb,intc,intd);voidmain(){cout<<min(13,5,4,9)<<endl;cout<<min(-2,8,0)<<endl;}intmin(inta,intb){returna<b?a:b;}例4.8:分析下列程序的输出结果。三个min函数的参数个数不同4.6.2参数个数不同的重载函数#include<ios4.6.2参数个数不同的重载函数(续)intmin(inta,intb,intc){intt=min(a,b);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 空调过滤器更换规程
- 一例恶性心律失常患者的护理个案
- 电梯轿厢检修规程
- 水污染治理技术考试试题及答案
- 电力建设安全监管强化措施
- 骨隐球菌病护理查房
- 湿巾抑菌持久性安全性能评价
- 教育培训行业规范制度
- 锡林浩特《房产策划师》冲刺押题卷
- 护理质量与急诊护理
- (二模)2026年合肥市高三第二次教学质量检测语文试卷(含答案)
- 广东省广州市白云广雅中学2024-2025学年八年级下学期数学期中考试卷(含答案)
- 2025年四川省烟草专卖局(公司)招聘考试笔试试题(含答案)1
- 2026年西部计划志愿者招募考试题库及答案
- 2025-2026人教版高中地理选择性必修二期末综合检测练习卷(含解析)
- 产业链数字化全链条协同机制研究
- 2026年水利工程质量检测员网上继续教育考试题库200道完整版
- GB/Z 141-2025蓄电池和蓄电池组起动用铅酸蓄电池减少爆炸危险的装置性能检验的试验方法
- 校服代售合同范本
- 2026年河南交通职业技术学院单招职业适应性考试题库及参考答案详解
- 前瞻性队列研究的随访失访控制策略
评论
0/150
提交评论