还剩22页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第2章C++编程基础程序设计工作主要包括数据结构(即数据类型)和算法(操作步骤)的设计程序中最基本的元素是数据类型,确定了数据类型,才能确定变量空间的大小和其上的操作;算法是由一系列控制结构组成每种语言都是用一组字符来构造有意义的语句,C++语言的字符集由下述字符构成:英文字母A~Z,a~z数字字符0~9特殊字符空格!#%^*_(下划线)+=:-~/\‘“;.{}[]
2.1数据类型与表达式一个程序要运行,就要先描述算法描述一个算法应先说明算法要用的数据,数据以变量或常量的形式来描述,每个变量或常量都有数据类型C++中的数据类型分为基本类型和非基本类型,见图2-1基本类型是C++编译系统内置的,非基本类型也称是用户定义数据类型,即用户自己定义的数据类型,字符型char整型int整数integer短整形short长整形long基本类型逻辑型bool单精度型float实数floating双精度型double数据类型长双精度型longdouble枚举型enum数组型非空数据类型[]指针型非空数据类型*非基本类型空类型void结构体类型struct共用体类型union类class图2-1C++数据类型数据类型的定义确定了其内存所占空间大小,也确定了其表示范围表1-1列出了基本数据类型的取值范围需要说明的是,在不同的系统中,每个变量类型所占的字节数目可能有所不同,这里列出的是在VC++编译环境中的情况表2-1常用基本数据类型描述类型说明长度表示范围备注bool逻辑型1falsetruechar字符型1-128~127-27~27-1unsignedchar无符号字符型10~2550~28-1short短整形2-32768~32767-215~215-1unsignedshort无符号短整型20~655350~216-1int整型4-2147483648~2147483647-231~231-1unsignedint无符号整型40~42949672950~232-1long长整型4-2147483648~2147483647-231~231-1unsignedlong无符号长整型40~42949672950~232-1float浮点型4-
3.4×1038~
3.4×10387位有效位double双精度8-
1.7×10308~
1.7×1030815位有效位longdouble长双精度8-
1.7×10308~
1.7×1030815位有效位
2.
1.1常量所谓常量是指在程序运行的整个过程中其值始终不可改变的量,常量有以下几种1.整型常量整型常量即以数码形式出现的整数,包括正整数、负整数和零整型常量的表示形式有十进制、八进制和十六进制十进制整型常量的一般形式为[±]若干个0~9的数字八进制整型常量的一般形式为[±]0若干个0~7的数字十六进制整型常量一般形式为[±]0x若干个0~9的数字及A~F的字母整型常量可以用后缀字母L(或l)表示长整型,后缀字母U(或u)表示无符号型,也可同时用后缀L和U(大小写无关)2.实型常量实型常量又称浮点小数,在C++语言中,实型常量只使用十进制表示,有两种表示形式一般形式例如
16.5,-
13.5等指数形式例如
0.565E+2表示
0.565×102,-
34.4E-3表示-
34.4×10-3,实型常量默认为double型,如果后缀F(或f)则为float型3.字符常量字符常量是单引号括起来的一个字符,如’a’,’G’,’’,’$’等另外,还有一些字符是不可显示字符,也无法通过键盘输入,例如响铃、换行、制表符、回车等等这样的字符常量该如何写到程序中呢?C++提供一种称为转义序列的表示方法来表示这些字符,表2-2列出了C++预定义的转义序列表2-2C++预定义的转义序列字符形式ASCII码十六进制功能\n0A换行\t09横向跳格(即跳到下一个输出区)\v0B竖向跳格\b08退格\r0D回车\a07响铃\\5C反斜杠字符“\”\’27单引号\”22双引号\dddddd八进制1到3位8进制数所代表的字符\xhhHh1到2位16进制数所代表的字符4.字符串常量字符串常量简称字符串,是用一对双引号括起来的字符序列,例如”China”就是一个字符串常量5.布尔常量布尔型常量只有两个false假和true真
2.
1.2变量在程序的执行过程中其值可以变化的量称为变量,变量需要用标识符来命名变量在使用之前需要首先声明其类型和名称变量声明的形式如下类型标识符变量名1,变量名2,…,变量名n;在声明一个变量的同时,也可以给它赋以初值
2.
1.3引用引用是个别名,当建立引用时,程序用另一个变量或对象(目标)的名字初始化它自此,引用作为目标的别名而使用,对引用的改动实际是对目标的改动引用的声明形式为类型标识符引用名=目标名或类型标识符引用名=目标名其中
①引用名是为引用型变量所起的名字,它必须遵循变量的命名规则
②前面的数据类型就是它所引用目标的数据类型在此要特别说明的是引用在声明时必须进行初始化,即指出该引用是哪一个对象的别名,这里的目标名可以是变量名,也可以是以后将要介绍的对象名而且引用一旦声明,就以对应目标的内存单元地址作为自己的地址,并且不再改变,从一而终例如,引用一个整型变量intsomeInt;intrInt=someInt;声明rInt是对整数的引用,初始化为引用someInt在这里,要求someInt已经声明或定义引用不是值,不占存储空间,声明引用时,目标的存储状态是不会改变的例2-1如何建立和使用引用例题#includeiostream.hvoidmain{intsomeInt;intrInt=someInt;someInt=6;coutsomeInt:someIntendl;coutrInt:rIntendl;rInt=7;coutsomeInt:someIntendl;coutrInt:rIntendl;}程序运行结果为someInt6rInt6someInt7rInt7在上述程序中,引用rInt用someInt来初始化以后,无论改变someInt或rInt,实际上都是指someInt,两个的值都一样,对引用的理解可以见图2-2someIntrInt图2-2引用与变量的关系需要注意的是,引用在声明时必须初始化,否则会产生编译错误
2.
1.4表达式表达式由运算符、运算对象和括号组成1.运算符C++语言中定义了丰富的运算符,如算术运算符、关系运算符、逻辑运算符等等,有些运算符需要两个操作数,使用形式为操作数1运算符操作数2这样的运算符称为二元运算符(或二目运算符)另一些运算符只需要一个操作数,称为一元运算符(或单目运算符)运算符具有优先级与结合性在表2-3中列出了C++中全部运算符的优先级与结合性2.表达式在任何高级程序设计语言中,表达式都是最基本的组成部分,也就是说程序中的大部分的语句是由表达式构成的可以简单地将表达式理解为用于计算的公式,它由运算符例如+-*/、运算对象也称操作数,可以是常量、变量等等和括号组成执行表达式所规定的运算,所得到的结果值便是表达式的值表达式在使用时要注意以下几点
①一个常量或标识对象的标识符是一个最简单的表达式,其值是常量或对象的值
②一个表达式的值可以用来参与其它操作,即用作其它运算符的操作数,这就形成了更复杂的表达式
③包含在括号中的表达式仍是一个表达式,其类型和值与未加括号时的表达式相同当表达式中出现了多种类型数据的混合运算时,首先需要进行类型转换,其次才计算表达式的值表达式中的类型转换分为两种隐含转换和强制转换表2-3运算符优先级优先级运算符结合性1[]().-后置++后置--左→右2前置++前置--sizeof&*+(正号)-(负号)~!右→左3(强制转换类型)右→左4*-*左→右5*/%左→右6+-左→右7左→右8==左→右9==!=左→右10左→右11^左→右12|左→右13左→右14||左→右15:右→左16=*=/=%=+=-====^=|=右→左17,左→右(l)隐含转换在混合运算时,对于二元运算符要求两个操作数的类型一致,若参加运算操作数类型不一致时,系统自动对数据进行转换(即隐含转换),具体的规则如下算术运算和关系运算转换的基本原则是将低类型数据转换为高类型数据各种类型的高低顺序如下charshortintunsignedlongunsigned-longfloatdouble低高逻辑运算符要求参与运算的操作数必须是bool型,如果操作数是其它类型,则系统自动将其转换为bool型转换方法是非0数据转换为true,0转换为false位运算的操作数必须是整数,当二元位运算的操作数是不同类型的整数时,编译系统会自动进行类型转换赋值运算要求左值(赋值运算符左边的值)与右值(赋值运算符右边的值)的类型相同
(2)强制类型转换强制类型转换又称为显式转换,是通过类型标识符和括号来实现的,其语法形式有两种类型标识符表达式或(类型标识符)表达式
2.2程序的控制结构
2.
2.1选择结构用if语句可以实现简单选择结构其语法形式为if(表达式)语句1else语句2执行顺序是首先计算表达式的值,若表达式值为true,则执行语句1;否则执行语句2if语句中的语句2可以为空,当语句2为空时,else可以省略,成为如下形式if(表达式)语句1其中语句1和语句2不仅可以是一条语句,而且可以是大括号括起来的多条语句,即复合语句
2.
2.2switch语句如果在算法中,虽然需要进行多次判断选择,但都是判断同一个表达式的值,这样就没有必要在每一个嵌套的if语句中都计算一次表达式的值,为此C++中有switch语句专门来解决这类问题switch语句的语法形式如下switch(表达式){case常量表达式1语句1case常量表达式2语句2…case常量表达式n语句ndefault语句n+1}使用switch语句应注意下列问题:
①switch后面括弧内的括弧“表达式”的值只能是整型、字符型、枚举型
②各常量表达式的值不能相同,且次序不影响执行结果
③每个case分支可以有多条语句,但不必用{}
④每个case语句只是一个入口标号,通常我们只需执行一个case后的语句,因此,每个case分支的最后应该加break语句,用来结束整个switch结构否则从入口点开始一直执行到switch结构的结束点
⑤当若干分支需要执行相同操作时,可以使多个case分支共用一组语句
2.
2.3循环结构在C++中有三种循环控制语句1.while语句while语句的语法形式while(表达式)语句执行顺序是判断一个条件表达式(循环控制栏件),以便决定是否应当进入和执行循环体当条件满足时进入循环,不满足该条件时则不再执行循环2.do-while语句语法形式do语句while(表达式);执行顺序是当流程执行到do后,立即执行循环体语句,然后在判断循环条件表达式的值表达式为true时,继续执行循环体,表达式为false则结束循环,该语句结构使循环至少执行一次3.for语句for语句的使用最为灵活,既可以用于循环次数确定的情况,也可以用于循环次数未知的情况for语句的语法形式如下for(表达式1;表达式2;表达式3)语句for语句的执行流程为
①首先计算表达式1的值;
②再计算表达式2,如果表达式2的值为false,则退出循环
③如果表达式2的值为true,则执行一次循环体,然后计算表达式3的值;
④转回
②,表达式2的值决定是否继续执行循环体一个循环体内可以包含另一个完整的循环结构,构成多重循环while、do-while、和for三种循环语句可以互相嵌套
2.
2.4其它控制语句1.break语句break语句只用于switch语句或循环体中时,作用是使程序从switch语句内跳出或结束循环,继续执行逻辑上的下一条语句2.continue语句continue语句仅用于循环体中,其作用是结束本次循环,接着开始判断循环条件,决定是否继续执行下一次循环3.goto语句goto语句的语法格式为goto语句标号其中“语句标号”是用来表示语句的标识符,放在语句的最前面,并用冒号“”与语句分开
2.3函数C++语言中的函数分为三种,一是主函数(即main函数);二是系统提供的标准函数,又称库函数标准函数由系统定义,在程序中可以直接调用;三是用户自定义函数这里只介绍自定义函数的定义和使用
2.
3.1函数定义一个完整的函数定义由两部分组成,即函数头与函数体函数定义的一般语法形式为类型标识符函数名说明符形式参数表{说明性语句序列;实现函数功能的语句系列;}其中类型标识符规定了函数的返回值类型函数的返回值是返回给主调函数的处理结果,由函数体部分的return语句带回无返回值的函数其类型标识符为void,不必有return语句形式参数表,简称形参表的内容如下类型l形参名1,类型2形参名2,…,类型n形参名n
2.
3.2调用函数调用函数必须遵守先定义后调用的原则,否则,需要在调用函数之前在主调函数中声明函数原型函数原型声明形式为类型标识符被调函数名含类型说明的形参表;函数的调用形式函数名实参1,实参2,,实参n
2.
3.3默认参数的函数在函数定义中通过赋值运算就可指定默认参数值一旦程序在调用该函数时,如果给出实参,则用实参初始化形参;如果没有给出实参,则C++编译系统自动以预先赋值的默认参数值作为传入数值需要特别注意默认形参值必须按从右向左的顺序定义在有默认值的形参右面,不能出现无默认值的形参因为在调用时,实参初始化形参是按从左向右的顺序
2.
3.4内联函数内联函数与一般函数不同的是,它不是在调用时发生转移,而是在编译时将函数体嵌入在每一个调用语句处这样就相对节省了参数传递、系统栈的保护与恢复等的开销内联函数的定义形式为inline类型标识符被调函数名含类型说明的形参表{函数体}注意
①内联函数体内一般不能有循环语句和switch语句;
②内联函数的定义必须出现在第一次被调用之前;
③对内联函数不能进行异常接口声明因此,只有很简单而使用频率很高的函数才被说明为内联函数内联函数会扩大目标代码,使用时要谨慎例2-2内联函数例题#includeiostream.h#includeiomanip.hinlineintmaxintaintb{ifabreturna;elsereturnb;}voidmain{intabcd;a=210;b=150;c=20;d=maxab;d=maxdc;//编译时两个调用处均被替换为max函数体语句coutThebiggestofsetw5asetw5bsetw5cisdendl;}程序运行结果为Thebiggestof21015020is
2102.
3.5系统函数的使用系统函数的原型声明已经全部由系统提供了,并且已分类存在于不同的头文件中程序员需要做的事情,就是用include指令嵌入相应的头文件,然后便可以使用系统函数
2.4数组数组是一种构造数据类型,是具有统一名称和相同类型的一组数据元素的集合,它占用连续内存单元进行存储组成数组的对象称为该数组的元素,数组元素可存储的数据类型由声明时指定的C++语言数据类型决定
2.
4.1一维数组数组在使用前必须先声明声明一个一维数组的形式如下类型标识符数组名[数组长度]注意数组长度是个常量表达式数组中的每个元素可以当成普通的变量使用访问一维数组元素的形式如下数组名[下标]注意下标的值也是从0开始,不能超过该维的长度减1一维数组的初始化有如下两种形式形式1类型标识符数组名[数组长度]={第0个元素值,第1个元素值,…,第n-1个元素值}形式2类型标识符数组名[]={第0个元素值,第1个元素值,...,第n个元素值}
2.
4.2多维数组多维数组的声明形式如下类型标识符数组名[长度1][长度2]…[长度n]访问多维数组中的元素数组名[第1维下标][第2维下标]…[第n维下标]二维数组的初始化形式如下形式1类型标识符数组名[第1维长度][第2维长度]={{第0个第2维数据组},{第1个第2维数据组},….,{第n-1个第2维数据组}}其中n等于第1维长度形式2类型标识符数组名[第1维长度][第2维长度]={{第0个元素值,第1个元素值,….,第m个元素值}其中m小于或等于第1维长度*第2维长度
2.
4.3数组应用1.排序数组元素排序是与数组有关的最重要的算法所谓数组元素排序,是指将数组中的所有元素的位置重新排列,使得数组元素的值按照递增或递减有序排列排序有很多方法,常用的有选择排序法和冒泡排序法选择排序法是很朴素的排序方法,它的思想很简单先找到数组中最大的元素,将这个元素放到数组的最前端;然后在剩下的数组元素中再找出最大的元素,把它放在剩下的这些元素的最前端,如此下来,就能使数组中的元素以递减序排列了冒泡排序法是交换排序法的一种,其基本思路是两两比较待排序的序列中的相邻元素,如果不满足顺序要求,就交换这两个元素,这样,第1轮比较完毕后,数组中的最大或最小元素就像气泡一样“冒”到数组的最尾部,可以认为由这个元素组成的只有一个元素的子序列是已经排好序的;然后对剩下的元素继续上述过程,直到全部元素有序例2-3已知一个一维数组中的元素为
1、
7、
3、
22、
9、5,现要求以递增顺序对这个数组中的元素进行排列,结果为
1、
3、
5、
7、
9、22,下面给出冒泡排序法的程序代码#includeiostream.hvoidmain{inta
[6]={1732295};intijtflag;fori=0;i6;i++{flag=0;forj=0;j6-i-1;j++ifa[j]a[j+1]{t=a[j];a[j]=a[j+1];a[j+1]=t;flag=1;}ifflag==0break;}cout排序后的数组为\n;fori=0;i6;i++couta[i]\n;}2.查找数组元素查找是与数组有关的另一种重要算法常用的查找方法有顺序查找法和二分查找法顺序查找法的思路很朴素,也容易实现,但效率不高二分查找法的效率很高,但要求数组在查找前已经排好序顺序查找法的思路按顺序逐个访问数组元素,并将其同要找的值比较,直到找到与要查找的值相同的元素二分查找法的思路首先假设数组已经按增序排好序取位于数组中间的元素同要查找的值比较,如果待查值等于这个元素的值,则查找结束如果待查值小于这个元素的值,则要查找的元素肯定在数组的左半边,将数组左半边看成完整的数组,继续使用二分查找法查找如果待查值大于这个元素的值,则要查找的元素肯定在数组的右半边,将数组右半边看成完整的数组,继续使用二分查找法查找二分法查找函数代码#includeiostream.hvoidefFindintDataArray[]intnSizeintfValue{intflag=0;//设置flag为查找标记intnStart=0;//开始元素下标intnEnd=nSize-1;//结尾元素下标intnMid;//二分法中间元素下标whilenStart=nEnd{nMid=nStart+nEnd/2;//计算中间元素下标ifDataArray[nMid]==fValue{flag=1;//标记查找成功break;//退出循环}/*如果待查找的值大于中间元素的值取后半边继续查找;否则取前半边继续查找*/iffValueDataArray[nMid]nStart=nMid+1;elsenEnd=nMid-1;}ifflagcout元素找到了!是第nMid+1个endl;elsecout在数组中没有要找的元素!endl;}3.统计当需要知道一个元素在数组中出现的次数时,就要用到统计的算法常用的统计方法有顺序查找统计法和借用数组下标值的统计方法顺序查找统计,即按顺序逐个访问数组元素,每找到一个要统计的元素,就给计数器变量加一借用数组下标值进行统计方法是一种技巧性算法,主要借用统计元素的一些特性,比如整除某数后的商均相等或其值就等于数组下标等来进行例2-4输入若干整数,其值均在1至4的范围内,使用借用数组下标值进行统计方法统计每个整数的出现的次数的程序代码如下#includeiostream.hvoidmain{inttj
[4]={0000};//存放统计结果inttjData;cout请输入数据1~4输入其它时结束endl;cintjData;whiletjData0tjData5//限定数据范围的循环{tj[tjData-1]++;//注意数组tj的下标[tjData-1]作用cintjData;};cout统计结果为endl;forinti=0;i4;i++couti+1tj[i]endl;}程序运行结果为请输入数据1~4输入其它时结束1234126统计结果为1∶22∶23∶14∶
12.
4.4数组作为函数的参数要将整个数组作为参数传递给函数,可通过传递不带方括号的数组名来进行,其形式大体上有以下两种形式形式1类型标识符函数名类型标识符数组名[],int长度形式2类型标识符函数名类型标识符数组名[长度]第一种形式适于处理不同长度的数组,数组的实际长度通过另一个参数传递给函数,而第二种形式只可用于传递长度固定的数组不管哪一种形式,传递给函数的都不是数组本身,而是保存数组第0个元素的内存单元的地址,即存储数组的起始地址,这样,被调用函数就可以得到实际数组的准确存放位置因此,被调用函数在函数体中修改数组元素时,实际上是修改原内存地址中的数组元素例2-5某次歌唱比赛有5名选手参加,有6名评委分别为选手打分,得分如下表2-4所示表2-4歌唱比赛记分表评委号选手号
12345619.
319.
209.
009.
409.
359.
2029.
719.
529.
509.
669.
499.
5738.
898.
809.
109.
258.
909.
0049.
389.
509.
409.
209.
908.
9059.
308.
849.
409.
459.
108.89规定的积分规则是每位选手去掉一个最高分,再去掉一个最低分,然后取剩下的得分的平均分编写程序计算各选手的成绩,并在窗口输出选手号和成绩程序代码如下#includeiostream.hdoubleContextdoublepArry[]intnNum//评分函数{intnInum;doublefMarkfMaxfMin;//定义记录成绩、最高分、最低分的变量fMark=fMax=fMin=pArry
[0];fornInum=1;nInumnNum;nInum++{ifpArry[nInum]fMaxfMax=pArry[nInum];ifpArry[nInum]fMinfMin=pArry[nInum];fMark+=pArry[nInum];//fMark先记录着所有评委的总分}returnfMark-fMax-fMin/4;//计算出平均分并返回调用函数}voidmain{doublepfSoreData
[5]
[6]={{
9.
319.
209.
009.
409.
359.20}{
9.
719.
529.
509.
669.
499.57}{
8.
898.
809.
109.
258.
909.00}{
9.
389.
509.
409.
209.
908.90}{
9.
308.
849.
409.
459.
108.89}};intnRow;cout.precision3;//设置小数点后的位数fornRow=0;nRow5;nRow++{coutnRow+1号选手成绩为;coutContextpfSoreData[nRow]6endl;}}程序运行结果为1号选手成绩为
9.262号选手成绩为
9.563号选手成绩为
8.974号选手成绩为
9.375号选手成绩为
9.17注意本例调用函数形式为ContextpfSoreData[nRow],6,将二维数组的第一维数组名作为实际参数传递给了形式参数,由此可进一步理解二维数组是若干个一维数组所组成的概念
2.
4.5数组与字符串在C语言中没有字符串变量类型,为了表示字符串,要用到字符数组字符型数组就是数组元素的类型是字符型的数组,它是通过字符数组的每一个元素保存字符串内的每一个字符来进行处理而在VC++中,是由其MFC类库中提供的功能完善的字符串类CString来完成对字符串的各种功能1.字符数组的初始化字符型数组通常有两种特殊的初始化方法,形式如下形式1char数组名[]=字符串形式2char数组名[]={字符串}这两种形式产生的效果是相同的,它们会产生一个以字符串常量中的每个字符为数组元素且在末尾加个“\0”的特殊数组,例如charpMyStrinq[]=Thisisacomputer;执行后,pMyString数组中的元素依次是T,h,i,s,,a,’,c,o,m,p,u,t,e,r,\0它等同于charpMyString[]={T,h,i,s,,a,’,c,o,m,p,u,t,e,r,\0};或charpMyStrinq[]={Thisisacomputer};2.字符串的基本运算在C++语言的库函数中提供了各种字符串运算的函数,可以直接调用我们在此给出其中的求字符串长度、字符串复制和字符串连接3种运算的具体实现方法,理解这些运算,有助于提高对字符串和字符数组的认识与理解
(1)求字符串的长度假设字符串保存在数组pString中,求字符串长度的程序代码如下charpString[]=abcd;intnSize=0;whilepString[nSize]!=’\0’nSize++;执行完毕后,整型变量nSize中保存的值就是字符串pString的长度
(2)字符串的复制字符串的复制的方法是将源字符型数组中的字符依次赋予给目的字符型数组,直到碰到“\0”(或0)为止假设源字符串保存在数组pSource中,目的字符型数组为pDestination,则字符串复制的程序段如下charpSource[]=abcd;charpDestination[]=
[5];//源字符串长度+1intnIndex=0;whilepSource[nSize]!=’\0’{pDestination[nIndex]=pSource[nIndex];nIndex++;}pDestination[nIdex]=’\0’;//标识字符串结束
(3)字符串的连接字符串的连接就是将一个字符串连接到另一个字符串的末尾在进行字符串连接时,先要找到被要连接的字符串的尾部,然后从尾部的位置开始将另一个字符串复制过来假设源字符串保存在字符数组pDest中,要连接进来的字符串保存在字符数组pTocat中,则进行字符串连接的程序代码为charpTocat[]=efg;charpDest
[8]=abcd;//8=现字符串长度+要连接进来的字符串长度+1intnSize=0;intnIndex=0;whilepDest[nSize]!=0//找到被要连接的字符串的尾部nSize++;do{pDest[nSize++]=pTocat[nIndex];nIndex++;}whilepTocat[nIndex]!=’\0’;pDest[nSize]=’\0’;
2.5指针指针就是指向内存中某个单元的地址值所有的变量、数组、对象都是保存在内存中的,凡是保存在内存中的信息,必须知道它在内存中的位置,在计算机中,引用了“地址”这个词来代表内存的某个位置内存以字节为单位编址,称为内存地址
2.
5.1指针型变量1.指针型变量的声明指针型变量是保存指针数据类型的变量定义指针变量的一般形式是:类型标识符*指针变量名2.指针的基本操作与指针有关的基本运算符有以下两个:1变量名,为取地址运算符,用来获取变量的首地址2*指针变量名,*为指向运算符,用来获取指针变量所指向变量的值和*运算符都是单目运算符,其优先级高于所有双目运算符,采用从右到左的结合性3.指针变量的初始化与引用指针变量所赋的初值必须是所定义数据类型的变量地址一个指针变量在使用之前必须先赋初值再使用,不然的话,程序运行时很可能出现不可预见的故障,如果没有具体明确的变量地址要被赋值,可以先赋以NULL4.指针的算术运算对于非void*型的指针型变量,只能进行加一个整数、减一个整数和两个指针变量相减3种运算void*型指针变量不能做任何算术运算将一个非void*型的指针型变量做加上或减去一个整数的运算,实际上就是对地址进行加法或减法运算,这种加法和减法运算按照某种单位进行这种单位就是该指针所指向的变量的数据类型所占用的字节数5.const修饰符与指针const与指针在一起使用,情况比较复杂,可简单归纳为三种指向常量的指针、常指针和指向常量的常指针
(1)指向常量的指针是指一个指向常量的指针变量,例如constchar*name=chen;//声明一个名为name的指针变量name
[3]=a;//错误,不容许改变指针所指的常量name=zhang;//正确,可以改变指向常量的指针name的值
(2)常指针是指把指针本身,而不是它指向的对象声明为常量,例如char*constname=chen;//声明一个名为name的常指针name
[3]=a//正确,所指的数据可以改变name=zhang;//错误,不容许改变指针本身
(3)指向常量的常指针是指这个指针本身不能改变,它所指向的数据值也不能改变例如:constchar*constname=chen;//声明一个指向字符型常量的常指针name
[3]=a;//错误,不能改变指针所指的值name=zhang;//错误,不能改变指针本身注意:如果用const定义的是一个整型常量,关键字int可以省略;常量一旦被建立,在程序的任何地方都不能再更改如果没有给常量定义一个初始值,C++假定初始值为零,并且不允许以后再给它赋值;函数参数也可以用const进行说明,用于保证实参在该函数内部不被改动,大多数C++编辑器能对具有const参数的函数能进行更好的代码优化
2.
5.2指针与字符串前面我们已经讲过,以字符数组的形式对字符串进行存储与处理的,而数组与指针又紧密相连数组名就保存着字符串在内存的起始地址,因此,字符串实质与char*型指针相对应例如用字符数组的形式:charpString[]=IloveChina!;如果直接用字符型指针的形式,可以表示为char*cString=IloveChina!;使用char*型指针变量要注意以下两点
①char*型指针变量可以在定义时进行初始化,其形式为char*指针变量名=字符串;
②char*型的指针变量或函数参数既可以用于接收字符串常量,也可以接收字符型数组例如:charpString[]=IloveChina!;char*myString=Thisisastring.;myString=pString;例2-6使用char*型指针变量重写字符串的复制的程序代码#includeiostream.hvoidcopy_stringchar*fromchar*tofor;*from!=\0;from++to++*to=*from;*to=\0;//赋值字符串结束标识}voidmain{charpSource[]=Iamateacher.;charpDestination[]=youareastudent.;//pDestination字符串长度≥pSource字符串长度copy_stringpSourcepDestination;coutpSourceendl;coutpDestinationendl;}程序运行结果为Iamateacher.Iamateacher.C++提供了许多操作字符串数据的标准库函数,如比较字符串、搜索字符串中的字符、确定字符串长度等,只要我们在使用它们前在应用程序的开头添加包含“string.h”头文件的预处理命令#includestring.h,我们在程序设计时就可直接引用下表2-5总结了这些函数表2-5C++字符串处理库标准库中常用的字符串操作函数函数原型函数说明char*strcpychar*s1constchar*s2将字符串s2复制到字符数组s1中返回s1的值char*strncpychar*s1constchar*s2n将字符串s2中最多n个字符复制到字符数组s1中返回s1的值char*strcatchar*s1constchar*s2将字符串s2添加到字符串s1后面s2的第一个字符覆盖s1的null终止符返回s1的值char*strncatchar*s1constchar*s2n将字符串s2中最多n个字符添加到字符串s1后面s2的第一个字符覆盖s1的null终止符返回s1的值intstrcmpconstchar*s1constchar*s2比较字符串s1与字符串s2函数在s1等于、小于或大于s2时分别返回
0、小于0或大于0的值intstrncmpconstchar*s1constchar*s2n比较字符串sl中的前n个字符与字符串s2函数在s1的前n个字符等于、小于或大于s2时分别返回
0、小于0或大于0的值intstelenconstchar*s确定字符串长度返回null终止符之前的字符数
2.6构造数据类型本节主要介绍结构体、共用体和枚举类型,它们同数组一样被称为构造类型另外还介绍使用typedef将一个普通的标识符定义为类型标识符的方法
2.
6.1结构体1.结构体类型的定义定义一个结构体类型只是向C++系统通报该结构体类型的名称和各成员的组成,C++对结构体类型并不分配内存,只有在定义结构体变量时,C++才为结构体变量分配内存定义一个结构体类型的一般形式是struct结构体类型名{类型标识符成员名l;类型标识符成员名2;…类型标识符成员名n;};2.结构体变量的声明声明结构体变量一般有两种形式,分别是结构体类型名变量名struct结构体类型名变量名另外,声明结构体变量也可在定义结构体类型的同时进行,其形式为struct[结构体类型名]{类型标识符成员名l;类型标识符成员名2;…类型标识符成员名n;}[变量1,变量2,…变量n];3.结构体变量的初始化所谓结构体变量的初始化,就是在定义结构体变量的同时,对它的每个成员赋初值,形式与数组赋初值非常相似,其形式为结构体类型变量名={表达式1,表达式2,…,表达式n}4.结构体变量的引用访问一个结构体变量的成员的形式是结构体变量名.成员名如果一个结构体中包含另一个结构体作为成员,则访问该成员中的成员时,要使用如下形式结构体变量名.结构体成员名.成员名
2.
6.2共用体在需要用同一段内存空间保存不同类型数据时,就必须使用共用体类型它主要用于节省内存空间与进行数据共享共用体类型在定义上和使用上同结构体很相似,不同之处在于结构体中的成员所占用的空间是分开的,而共用体中的成员所占用的空间是共享的定义共用体类型,其方法同定义结构体也很相似union[共用体名]{类型标识符成员名1;类型标识符成员名2;…类型标识符成员名n;}[变量1,变量2,…,变量k,];声明共用体变量的形式是共用体类型名变量名注意共用体变量不允许给赋初始值共用体变量中成员的访问形式是共用体变量名.成员名
2.
6.3枚举类型枚举类型也是一种构造类型,是一种允许用符号代表数据的C++语言的数据类型,它是一系列有标识名的整型常量的集合,其主要功能是增加程序代码的可读性定义形式如下enum枚举类型名{〈枚举常量表〉}[枚举变量]说明缺省时,系统为每一个枚举常量都对应1个整数,并从0开始,逐个增1,这些缺省的值也可重新指定习题2-1简答题
(1)ifx=3和ifx==3这两条语句的差别是什么
(2)画出求解以下问题的流程图
①有两个瓶子A和B,分别盛放醋和酱油,要求将它们互换
②依次将10个数输入,要求将其中最大的数打印出来
③求两个数m和n的最大公约数
(3)函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗?
(4)比较值调用和引用调用的相同点与不同点
(5)什么叫内联函数?它有哪些特点?
(6)当实参为一个数组名时,对应的形参必须是什么类型?2-2编程题
(1)根据以下函数关系编写程序,对输入的每个x值,计算出相应的y值0x<0x0≤x<10y=1010≤x<20-
0.5x+2020≤x<40-240≤x
(2)编程求1000之内的所有“完数”所谓“完数”,是指一个数恰好等于它的因子之和例如,6是完数,因为6=1+2+3
(3)编程打印乘法九九表*1234567891123456789224681012141618336912151821242744812162024283236551015202530354045661218243036424854771421283542495663881624324048566472991827364554637281
(4)编程实现输入一个成绩,输出相应的五分制成绩设90分以上为“A”,80分至89分为“B”,70分为至79分为“C”,60分至69分为“D”,60分以下为“E”
(5)用递归的方法编写函数求5!并观察递归调用的过程
(6)定义一个求绝对值函数的模板
(7)编写程序,打印如下的杨辉三角形111121133114641
(8)将一个一维数组中相同的元素删除的只保留一个,然后按由大到小的顺序输出
(9)编写程序,求出两个4×4的矩阵A与B的和及差,并按矩阵形式输出进一步考虑求出矩阵A与B的乘积
(10)应用指针,编写字符串连接处理函数
(11)应用指针,编写一个函数strcmp ,实现两字符串s1和s2的比较如果s1=s2,则返回值为0如果返回它们二者第1个不同字符的ASCII码差值,并且若s1s2,则输出正值;若s1s2,则输出负值
(12)输入10个国家名称,用指针数组实现排序输出无符号数unsigned6。