还剩16页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
C++入门经典习题集第一章基本概念*******************************(1):c++程序至少包含一个main函数 (2)函数的可执行部分由包含在一对花括号中的语句组成 (3)一对花括号定义了一个语句块 (4)语句用分号结束 (5)关键字是C++中有特殊含义的一组保留字,程序中的实体不能与C++语言中的任何关键字同名 第二章基本数据类型和计算************************** (1)数值和字符常量被称为字面量 (2)可以把整数字面量定义为十进制,十六进制,或八进制 (3)浮点字面量必须包含小数点和指数,或者两者都包含 (4)C++的所有字面量和变量都有给定的类型 (5)Char类型的变量可以存储单个字符,占用一个字节,char类型在默认的情况下是带符号的,也可以是不带符号的,这取决于编辑器,也可以使用,signed和unsignedchar类型的变量存储整数 (6)类型wchat_t 可以存储宽字符,占用两个字节,这也取决于编辑器 (7)变量的名称和类型出现在声明语句中,以一个分号结束,声明一个变量,如果给该变量分配了空间内存,那么也就定义了该变量(8)变量的声明可以指定初始值,这是一种良好的编程习惯 (9)可以用const保护基本数据类型的"变量"值,编辑器程序源代码文件中检查是否试图修改声明为const的变量练习题 1编写一个程序,计算圆的面积.该程序应提示输入圆的半径,使用公式area=pi*radius*radius 计算面积,在显示结果 2使用第一题的解决方案,改进代码,使用户输入所需的位数,控制输出的精度(提示, 使用setprecision操纵程序) 3在生日那天,你得到了一个卷尺和一个可以确定角度的仪器,例如测量水平线和树高之间的夹角,如果你知道自己与树之间的距离d和眼睛平视量角器的高度h,就可以用下面的公式计算出树的高h+d*tanangle 创建一个程序,从键盘上输入hd,angle 输出树的高度 第三章处理基本数据类型*************************** (1)关键字typedef允许定义其他类型的同义词 (2)关键字extern允许引用在另一个文件中定义的全局变量.练习题 1编写一个程序,计算用户输入非0整数的倒数,该程序应把计算的结果存储在double类型的变量中,再输出它 2创建一个程序提示用户以十进制形式输入一个整数,在对其二进制表示的最后一位就反,也就是说,如果最后一位是 1 ,那么就把它改为 0,反之亦然,结果应显示为一个十进制数老师提示将这个数与1异或就可以了 3编写一个程序,计算矩形搁板的一层可以容纳多少个正方形的盒子,且不会出现盒子悬垂的情况,使用double类型的变量表示搁板的长度和深度(单位是英尺),以及盒子一边的长度(单位是英寸),从键盘上读取这些值,需要声明并初始化一个常量,用于把英尺转换为英寸,在一个语句中,计算搁板的一层可以容纳多少个盒子,并把结果赋给一个long的变量 4如果不运行下面的代码,能不能看出这些代码的输出结果? unsignedintk=430u;unsignedintj=k4~~03;std::coutj;5编写一个程序,从键盘上读取四个字符,把它们放在一个四字节的整型变量中,把这个变量的值显示为一个十六进制.分解变量的四个字节,以相反的顺序输出它们,先输出低位字节第四章选择和决策****************************** (1)可以使用比较运算符比较两个值,得到一个bool类型的值,它可以是true或false (2)可以把bool转换为整型--true强制转换为 1,false转换为0(3)可以把数值强制转换为bool类型--0 强制转换为false 非0转换为true(4)if语句可以根据条件表达式的值执行一个语句或语句块,如果条件是true或非 0 值就执行语句和语句块,反之就不执行 (5)if---else语句给简单的if语句提供了另一个选项,如果条件为false或0,就执行else语句 (6)switch语句可以根据整数表达式的值,从一组固定的选项中选择 (7)条件运算符根据一个表达式的值,选择两个值中的一个 (8)使用goto语句,可以无条件的分支带有指定标签的语句练习题 1创建一个程序,提示用户输入一个1到100之间的整数,使用if语句判断该整数是否在设定的范围之内,如果是,在判断整数是否大于,小于或等于50 2编写一个程序,接受用户输入的一个字符,使用标准库函数判断它是否为一个元音字母,是否为小写字母,最后输出小写字母,再把字符编码输出为一个二进制的值 3编写一个程序,只使用条件运算确定输入的整数是否是20或小于20,大于且小于30,大于30,且不超过100,或者大于100 4编写一个程序,提示用户输入0美圆,和10美圆之间的一个钱款(允许使用小数)判断该钱款,包含多少个25美分,10美分,5美分,和1美分,并把该信息输出到屏幕上,输出的结果在语法上应该是有意义的(如,只需要一个 1 角,输出就应该写为1dime 而不1dimes)第五章循环********************************* (1)循环定义了一个作用域,在循环内定义的变量不能在循环内部访问,特别是for循环 (2)在循环中执行break语句会立即退出循环 (3)do-while循环至少执行一次,只要条件为真就继续执行循环 (4)在循环中执行continue语句会跳过当前迭代的剩余语句,如果循环条件允许就直接执行下次循环 (5)一定要注意循环条件不能永远为真,否则将会用远循环,当然你可以用break强制退出循环练习题 1编写一个程序,输出1到用户输入的数字之间的所有奇数的平方 2创建一个程序,它使用while循环累加用户输入的随机个数的整数和,最后输出所有数字的总和,和浮点数类型的平均值 3创建一个程序,它使用do--while循环计算用户在一行上输入的非空白字符的个数,在第一次遇到输入中的#字符时,停止记数 4创建一个程序,输出8个随机大小写字母或数字组成的密码,允许输入重复的字符 5创建一个程序,循环25次,打印出1到10的数字,和20到25的数字 6抽奖时要求在1-49之间6个不同的随机数,编写一个程序,每次运行时生成5个抽奖选项 7在1-49之间选择7个数(这7个数有用户输入) 然后自动输出这7个数的所有排序(如,输入123, 则输出,123,321,231,132,312)第六章数组和字符串***************************** (1)数组是同一类型的数值的命名集合,它们存储在连续的内存块中,每个值都可以通过一个或多个索引值来访问 (2)一维数组需要一个索引值来引用其元素,二维数组需要两个索引值,n维数组需要n个索引值 (3)数组的元素可以用在等号的左边和表达式中,其方法和相同类型的变量一样 (4)char类型的一维数组可以用于存储非空字符串 (5)可以让编辑器根据声明语句中初始化值的个数来决定数组中最左边的一维大小 (6)可以把char类型的而维数组用做非空字符串的一维数组 (7)String类型存储了一个字符串,它不需要中止字符,因为sting会跟踪字符串的长度 (8)在string变量名后面的方括号中指定索引值,就可以访问string对象中的个个字符,索引值从0开始 (9)使用+运算符可以把string对象与字符串字面量,字符或另一个string对象连接起来 (10)String类型的对象可以用函数来搜索,修改,和提取字符串 (11)字符串中的存储位置为size_t类型的整数值 (12)声明string类型的数组与声明其他类型的数组所采用发方法是一样的 (13)wstring类型的对象包含wchar_t类型的字符串练习题 1创建一个数组,存储至多100个学生的姓,创建另一个数组,存储每个学生的成绩(0-100)使用一个循环,提示用户给这些输入姓名和成绩,计算平均成绩并显示,然后在一个表中显示所有学生的姓名和成绩 2一位气象学家每天(周一到周五)都要记录大气的湿度三次(早晨,中午和晚上)编写一个小程序,让用户按年代顺序把这些记录输入到一个5行3列的 float数组中,接着并计算每天的平均湿度和每天3次的星期平均值 3请看下面的一段程序 #includestdlib.h#includestdio.h#includeiostream#includestringusingnamespacestd;intmain{stringtext=SmithwhereJoneshadhad\hadhad\hadhad\had\.\n\Hadhad\Hadhadtheexminersappeoval.;stringword=had;coutendlThestringis:endltextendl;intcount=0;forintindex=0;index=text.findwordindex!=string::npos;index+=intword.lengthcount++;coutYoutextcontainedcountoccurrencesof\word\.endl;return0;}搜索子字符串"had",找出其中所有"had"单词,且不考虑大小写(提示复制原字符串) 4编写一个程序,从键盘上读取一任意长度的文本字符串,在提示输入要在该字符串中查找的单词,程序应查找出现在字符串中的所有单词,不考虑大小写,在用与单纯中字符个数相同的的星号来替换该单词,然后输出新字符串,注意必须是替换整个单词,例如如果用户输入了字符串"Ourhouseisatyourdisposal.",要查找的单纯是our,则得到的字符串应该是"***houseisatyourdisposal."而不是***houseisaty***disposal.5编写一个程序,提示输入两个字符串,在测试它们,看看其中一个字符茶是否为另一个字符串颠倒字母顺序而得到的第七章指针********************************* (1)指针是一个包含地址的变量 (2)使用地址运算符&可以获取变量的地址 (3)要引用指针指向的值,应使用间接运算符*.它也被称为解除引用运算符 (4)可以对存储在指针中的地址加减整数值,其结果就象指针引用一个数组一样,指针会变为整数值所指定的数组元素的个数 (5)运算符new会分配自由存储区中的一块内存,返回所分配的内存地址,使它可以在程序中使用 (6)运算符delete可以释放用运算符new分配的内存块 (7)reinterpret_cast运算符号可以把一种类型的指针转换为另一种类型练习题 1编写一个程序声明并初始化一个数组,其中包含前50个偶数,使用数组表示法输出该数组中的数字,每一行显示10个数字,在使用数组表示法逆序输出这些数字 2创建一个程序,在键盘上读取数组的大小,对这个数组进行动态分配内存,以存储浮点数值,使用指针表示法初始化数值的所有元素,是索引位置为n元素值是1.0除以(n+1)的平方,使用指针表示法计算出元素的总和,对该总合除以6,输出该结果的平方根,试着给该程序提供更大的数组大小,例如超过1000000元素,结果有什么有趣的地方吗? 3请看下面的程序#includestdlib.h#includestdio.h#includeiostream#includestring#includecctypeusingnamespacestd;intmain{intheight
[10];intcount=0;charreply=0;do{coutendlEnteraheightasanintegralnumberofinches:;cinheight[count++];coutDoyouwanttoenteranotheryorn;cinreply;}whilecount10std::tolowerreply==y;ifcount==10{coutendlMaximumheightcountreached.endl;}doubleaverage=
0.0;forinti=0;icount;i++average+=height[i];average/=count;coutendlAverageheightisaverageinches./*avergaeinches*/endl;intabove_average=0;forinti=0;icount;i++ifheight[i]averageabove_average++;coutThereabove_average==1is:areabove_averageheightabove_average==1:saboveaverageendl;return0;}这段程序使用了整数数组计算一组人的平均身高,再计算出有多少人的身高超过平均身高修改上面的程序,使用动态内存来存储学生的信息,使程序可以处理任意学生的信息 4二维数组是数组的数组,而数组可以通过指针动态创建,如果动态数组创建的数组元素也是指针,数组的每个元素都可以存储数组的地址,使用这个概念,创建一个数组,其中包含三个数组指针,每个数组都可以包含六个int类型的值,把第一个整数数组的值设为1到6,下一个数组的元素值设置为第一个数组元素的平方,第三个数组的元素值设为第一个整数数组的三次方,输出3个数组的内容,再释放已分配的内存.第八章使用函数编程***************************** (1)函数是一个自包含的代码单元,它有着已定义好的目的,一般的程序总是包含大量的小函数,而不是包含几个大函数 (2)函数定义包含了函数名称,参数和返回类型的函数头,以及包含函数的可执行代码的函数体 (3)函数原型允许编辑器处理对该函数的调用,但此时函数定义可能没有处理 (4)由于给函数传送参数的按值传递机制,是传送原参数的副本,因此原参数值不能在函数中访问 (5)给函数传送指针可以修改该指针指向的值,但指针本身是按值传送 (6)把指针参数声明为const可以防止修改原来的值 (7)可以把数组的地址作为指针传送给函数 (8)使用引用给函数传送值,即按引用传送机制,可以避免按值传送参数中的隐含复制过程,在函数中不应该修改的值都应该声明为const (9)为函数的参数指定默认值后,只要参数有默认值,就允许有选择的省略参数 (10)从函数中返回引用,允许在等号运算符的左边使用该函数,把返回类型声明为const引用,可以阻止在等号运算符的左边使用该函数练习题 1编写一个value_input,它接受两个整型参数和一个提示用户输入字符串参数,函数会提示所输入的值应在参数指定的范围之内,函数应一直提示用户输入值,直到输入的值有效为止. 在程序中使用该value_input函数,获取用户的生日,验证月份,日期,年份是否有意义,最后以下面的格式在屏幕上输出该生日 Noverber211977 这个程序应使各个函数monthyearday管理对数字的输入,最后注意不要忘里闰年 2编写一个程序,它要求输入一字符串或一个字符数组,并反转它的顺序,使用什么类型的参数最好? 用main函数测试该函数,提示用户输入一个字符串,反转其顺序,在输出反转后的字符串 3编写一个程序,它接受2到4个命令行参数,如果用少于2个或多于4个参数调用该程序,就输出一个消息,告诉用户该怎么做,然后退出,如果参数的个数是正确的,就输出参数,一行输出一个参数 4修改上一题中的程序,让他只接受两个参数,把第二个参数传送给第2题中的字符串反转函数,输出反转后的字符串 5编写一个程序,它返回long变量中最小值的引用,编写另一个函数,它返回较大值的引用,使用这两个函数生成斐波纳契级元素,即1,1,2,3,5,8,13..............序列,其中每个数都等于前两个数之和,元素的个数有用户指定(提示把序列中的两个数存储在n1和n2中,它们都从1开始,如果把两个数的和存储在较小的变量中,并输出教大的值,就会得到希望的结果,难点就是为什么这是可行的)第九章函数********************************* (1)重载函数是名称相同,但参数列表不相同的函数,重载函数不能仅通过返回类型来区分 (2)函数签名由函数名和参数个数及类型来确定的,在调用重载函数时,编辑器会检查函数签名,把它与可用的函数做比较,然后选择合适的函数 (3)函数模板是自动生成重载函数的一种方法 (4)函数模板有一个或多个参数,这些参数通常是类型变量,也可以是非类型的变量,函数模板的实例,即函数定义,有编辑器为每个对应于一组唯一模板参数的函数调用用创建的 (5)可以使用函数指针来存储有对应返回类型,参数类型和个数的任一函数地址 (6)可以使用函数指针来调用它包含的地址上的函数,还可以把函数指针作为函数参数来传送 (7)递归函数是调用它自身的函数,采用递归方式算法有时可以得到非常简明的代码,但与实现同一算法的其他方法相比,采用递归方式常常需要更多的执行时间练习题 1创建一个函数plus,它把两个数值加在一起,返回它们的和,提供处理,intdouble和 string类型的重载版本,测试它们是否能处理下面的调用 intn=plus34;doubled=plus
3.
24.2;strings=plushello;strings1=aaa;strings2=bbb;strings3=pluss1s2; 给string版本的函数传送参数的最有效方式是什么? 为什么下面的调用不工作? d=plus
34.2; 2把函数plus变成一个模板,测试它是否能用于处理数值类型,该摸板是否能处理第1题中的语句plushello?,为什么?提出问题的一种解决方法. 3STL提供了三角函数sincostan,这些函数都带有一个double参数,返回一个double的值,要使用它们需要包含标准库头文件<cmath>,编写一个函数calc它带用两个参数,一个double值和一个指向三角函数的指针,返回把函数应用于double值的结果,编写一个函数,测试所写的函数,如果该函数通过了测试,就建立一个函数指针数组,存储这三个三角函数,并测试它们 4有一个递归函数,称为Acherman函数,它广泛应用于计算机科学和数学,其定义如下 如果m和n是整数,若n=0且 m=0则 如果m==0则ackmn=n+1如果n==0且m0则ackmn=ackm-11如果m0且n0ackmn=ackm-1ackmn-1编写一个程序递归计算Ackerman函数,假定n为0到5之间的值,m为0到3之间的值,进行测试,这个函数的一个特性是,如果m和n有小幅度的增加,递归的次数(或深度)就会有非常大的增加,所以不要递归计算n8或m3的情形,实际上一台计算机没有足够的能力计算这种情形第十章程序文件和预处理指令************************* (1)程序中的每个实体都只能有一个定义 (2)名称可以有内部链接属性,即该名称可以在一个转换单元中访问,名称也可以有外部链接属性,即名称可以在任何单元中访问,名称还可以没有链接属性,即名称只能在定义它的块中访问 (3)头文件也可以包含源文件需要的定义和声明,头文件还可以包含模板和类型定义,枚举,常量,函数声明,内联函数定义,以及指定的命名空间,按照约定,头文件使用扩展名.h (4)把函数定义和全局变量放在源文件中,C++源文件的扩展名是.cpp (5)通过#include指令可以把头文件的内容插入到.cpp文件中 (6)Cpp文件是转换单元的基础,编辑器会处理转换单元,以生成对象文件 (7)命名空间定义一个作用域----在这个作用域内声明的所有名称都附加了命名空间的名称,不在显示命名空间作用域内声明的名称就在全局命名空间中 (8)一个命名空间可以由几个独立的同名命名空间声明组成 (9)在不同的命名空间中声明的相同名称是不同的 (11)为了在命名空间的外部引用在命名空间中声明的标识符,需要指定命名空间的名称和标识符,两者之间用作用域解析运算符分隔开 (12)在某个命名空间声明的名称,在这个命名空间中使用时,可以不加限定符 (13)预处理器执行预处理指令,在编译代码之前传送转换单元中的源代码,处理完所有的指令后,转换单元就只包含C++代码,没有预处理指令了 (14)可以使用条件预处理指令,确保头文件的内容在一转换单元中没有重复 (15)可以使用条件预处理指令,控制是否在程序中包含跟踪或其他诊断调试代码 (16)assert宏允许在执行过程中测试逻辑条件,如果逻辑条件为假,就输出一个消息,并终止程序练习题 1有一个程序调用用了两个函数print_thisconststrings和print_thatconststrings,这两个函数又调用了第三个函数printconststrings,输出传送给它的字符串 在4个源文件中实现这3个函数和main函数,并提供3个头文件,分别包含print_this,print_that和print的原型确保头文件只包含一次,main.cpp包含的#include语句最少 2修改上题的程序,使print函数使用一个全局整数变量来计算它被调用的次数,在main调用print_this和print_that输出这个变量的值 3在print.h头文件中,删除print的已有原型,再创建两个命名空间print1和print2,每个命名空间都包含一个函数printconststrings,这些函数都具有相同的函数签名,区分它们的唯一方式是命名空间的名称,在print.pp文件中实现这两个函数,输出命名空间的名称和字符串 现在让print_this调用在命名空间print1中声明的函数.让print_that调用在命名空间print2中声明的函数,运行程序,验证是否调用了正确的函数 提示从上面可以看出,在print_this和print_that中调用print函数有三种不同的方式,即三种不同语法形式 4修改main例程,只有定义了预处理符号DO_THIS,才能调用print_this,否则就调用print_that 修改代码,定义一个宏PRINT,定义了DO_THIS后就让PRINTabc----注意没有引号--调用print_thisabc,否则就调用print_thatabc第十一章创建自己的数据类型************************* (1)结构类型是程序中的一个新数据类型 (2)结构对象是带有成员的对象,这些成员在默认情况下可以公开访问,结构可以有数据成员和函数成员 (3)可以使用对象名和句点分隔的成员来引用结构对象的成员,其中句点称为成员选择运算符 (4)联合一种数据类型,它的对象可以使用同一个内存块在不同的时刻存储几种不同变量的值(也许类型也不同) (5)在声明联合对象时,只能为联合的第一个成员提供对应类型的初始值 (6)结构的数据成员可以是任意类型,包括其他结构,但数据成员的类型不能与包含它的结构的类型相同 (7)聚合是创建时可以用花括号中的初始值列表来初始化的实体 (8)可以在自由存储区动态创建对象,但必须在指针中存储这些对象的地址 (9)可以使用间接成员选择运算符访问对象的成员练习题 1编写一个简单的货币转换程序,为此,需要在货币对象中关联两个实体货币类型和把货币转换为美元的转换因子,设计一个结构来表示货币对象,编写一个程序,让用户从一个列表中选择转换的货币类型,在任意两种货币中转换,用户应输入值,并获得转换后的结果,如果输入一个负值,就退出程序 2(较难)提供一种方式,让用在运行程序时添加新的货币类型 3实现本章中"更复杂的结构"一节中描述的SharedData结构,扩展改结构(及相关的枚举类型),以及存储4种类型的指针,测试一下,看看是能否存储变量的指针 4编写一个函数,它接受ShareData对象数组,并以[array_element]type=value形式输出每个元素的值,例如 [0] double=
37.2[1]float*=2.5 在合适的main函数中测试这个函数第十二章类********************************* (1)类提供了定义自己的数据类型的一种方式,类可以反映某个问题所需要的对象类型 (2)类可以包含数据成员和成员函数,类的成员函数总是可以自由访问该类中的数据成员 (3)类的对象用构造函数来创建和初始化,在声明对象时会自动调用构造函数,构造函数可以重载,以提供初始化对象的不同方式 (4)类的成员可以指定为public,此时它们可以由程序中的任何函数自由访问,另外类的成员还可以指定为private,此时它们只能被类的成员函数和友元函数访问 (5)类的数据成员可以定义为static,无论类中创建了多少个对象,类中的静态数据成员都只有一个 (6)可以在类对象的成员函数中访问类的静态数据成员,它们不是类对象的一部份,类对象的大小不包括静态数据成员的字节数 (7)即使没有创建类的对象,类的静态函数成员也存在,并可以调用 (8)类的每个非静态函数成员上都包含this指针,它指向调用该函数的当前对象 (9)类的静态函数成员不包含this指针 (0)类中声明为const的成员函数不能修改类对象的数据成员,除非数据成员声明为mutable (11)把类对象的引用用作函数调用的参数,可以避免产生把复杂对象传送给函数的系统开销 (12)副本构造函数可以用类中已有的对象初始化同一个类中的新对象,如果没有定义类的构造函数,编辑器就会生成默认的副本构造函数练习题 1创建一个简单的类Integer,它只有一个私有数据成员int,为这个类提供构造函数,并使用它们输出创建对象的消息,提供类的成员函数,获取和设置数据成员,并输出该值,编写一个测试程序,创建和操作至少3个Integer对象,验证不能直接给数据成员赋值 在测试程序中获取,设置和输出每个对象的数据成员值,以验证这些函数 2修改上一题类Integer的构造函数,把数据成员初始化为初始化列表中的0,并实现类的副本构造函数 编写一个成员函数,比较当前对象和作为参数传送的Integer对象,如果当前对象小于参数,该函数就返回-1,如果他们相等函数就返回0,如果当前对象大于参数,函数就返回+1,测试该函数的两个版本第一个版本的参数按值传送,第二个版本的参数按引用传送,在调用该函数时,构造函数会输出什么结果?解释出现这种结果的原因 类中的函数不能是重载函数,为什么? 3为类Integer实现成员函数addsubtractmultiply对当前对象和Integer的参数值进行加,减和乘法运算,在类中用main()演示这些函数的操作,main()创建了几个Integer对象,它们分别包含值4,5,6,7,8,在使用些对象计算4*5的三次方,加6*5的二次方,再加7*5,再加8的值,实现这些函数,使计算和结果的输出在一个语句中完成 4修改题2的解决方法,把compare函数实现为Integer的一个友元第十三章类的操作****************************** (1)只能通过构造函数的初始化列表来初始化类的引用成员,引用不能用赋值语句来初始化 (2)只要给函数按值传递对象,就会调用副本构造函数,其结果是传送给类的副本构造函数的参数必须是一个引用 (3)如果在类的成员函数中动态分配内存,就中要执行析构函数来释放内存,实现副本构造函数和副本赋值运算符 (4)把类的所有成员都声明为private,就可以限制对类的访问,此时,只有友元类可以创建该类类型的对象 (5)嵌套类是把自己的定义放在另一个类定义的内部,嵌套类的名称在包含类的作用域内,为了在包含类的外部引用嵌套的类类型,类型名称必要用包含类的名称来限定 (6)如果嵌套类的定义防在包含类的私有部分,嵌套类类型的对象就不能在包含类的外部创建 练习题 1编写一个类Sequence,在自由存储区中按照升序存储整数数值的递增序列,序列的长度和起始值在构造函数中提供,确保该序列至少有两个值,默认有10个值,从0开始(0,1,2,3,4,5,6,7,8,9),需要足够的内存空间来存储该序列,再用要求的值来填充内存. 提供show()函数列出该序列,释放分配给该序列的内存,(注意确保释放所有的内存),创建并输出5个随机长度(长度有限)的序列和一个默认的序列,来演示这类的操作 2编写一个函数来比较这两个序列,如果Sequence对象有不同的长度,它们就是不同的,如果Sequence对象有相同的长度,但是对应的值不同,它们也是不同的,只有Sequence对象有相同的长度,且对应的值也相同,它们才是相同的,把这个函数编写为Sequence类的一个成员 3重新编写比较函数,把它作为Sequence类的一个友元,如何改变参数和调用该函数的方式?最好使用什么技术 4a标准库包含一个string类,但创建自己的string类可以弄明白设计和编写sC++类的许多问题,使用基本的char数据类型编写一个string类,看看它如何隐藏使用C样式字符串的复杂性 为MyString类创建一个头文件,把它放在自己的命名空间中,给这个类提供两个私有数据成员,整型长度和char*,char*指向对象所管理的字符串,为什么要把长度作为该类的一个数据成员存储4b:创建一个类的实现文件(.CPP),并提供构造函数,从下面的数据类型中构建MyString对象 一个字符串字面量,(例如constchar*类型),以便编写MyStrings1hello 一个重复多次的字符,默认的重复次数应是1,使用这个构造函数的例子如MyString s2c5一个整数值,这样MyStrings310就存储了字符串"10" 这些构造函数是显式的还是隐式的?构造函数在需要时应提供错误处理4c:构造函数为存储字符串而分配内存,提供一个析构函数,在删除对象时正确的释放内存4d:编写一个类的副本构造函数,以便从其他字符串中创建和初始化MyString对象4e:给类添加一些成员函数 返回字符串的长度 输出字符串 索引从0开始,找出某个字符或子字符串在字符串中的位置,如果没有找到则返回-1 现在可以编写一个测试程序,以各种方式创建并处理mystring对象,保证所有的成员都工作正常 第十四章运算符重载 (1)在类中可以重载任何运算符,以提供针对该类的功能,但作用域解析符(),条件运算符(?),成员访问运算符(.),解除类成员指针的引用运算符(.*)和sizeof运算符不能重载 (2)运算符函数可以定义为类的成员或全局运算符函数 (3)如果一元运算符定义为类的成员函数,操作数就只类对象 (4)如果一元运算符定义为全局运算符函数,操作数就是函数的参数 (5)如果二元运算符定义为类的成员函数,左操作数就是类对象,右操作数就是函数的参数 (6)如果二元运算符定义为全局运算函数,第一个参数指定左操作数,第二个参数指定为右操作数 (7)要重载递增运算符,需要用两个函数分别提供运算符前缀和后缀形式,实现后缀运算符的函数有一个int类型的额外参数,它仅用于与前缀函数区分,递减运算符也是这样 (8)实现+=运算符重载的函数可以用在+函数的实现上,所有op=运算符都是这样 (9)智能指针是一个操作类似于指针的对象,智能指针的一种形式是迭代给定类型的对象的复杂集合,采用的方式与一般指针类似,标准模板库广泛使用了这种形式练习题 1这些练习都建立在第13章练习题的基础上,首先为MyString类提供一个重载的赋值运算符,确保它不是自我赋值,用下面的语句测试这个运算符是否工作正常,其中s1s2s3都是MyString的对象 s1=s2;s1=s1;s1=s2=s3; 2重载加运算符,提供字符串连接功能,测试s1=s2+s3;语句正确运行,提供+=运算符,这个运算符返回什么值? 3重载[],提供对字符串中单个字符的访问,于是,s1
[4]返回s1中的5第个字符,如果确保它可以于等号的两端 4提供==,!=,<,>运算符的重载,用于比较MyString对象,这些布尔运算符应返回什么类型?检查表达式ifs1==s2? 5(教难)重载()运算符,从MyString对象返回一个子字符串,于是s123返回从s1
[2]开始的三个字符第十五章继承******************************** (1)类可以派生自一个或多个基类,此时派生类在其所有的基类中继承成员 (2)单一继承就是从一个基类中派生新类,多重继承就是从两个或多个基类中派生新类 (3)访问派生类的继承成员由两个因素控制基类中成员的访问指定符和在派生类声明中基类的指定访问符 (4)创建派生类对象一般需要按顺序(从一般的基类开始到最特殊的直接基类)调用所有直接和间接基类的构造函数,之后执行派生类的构造函数 (5)派生类构造函数可以在初始化类表中显式调用直接基类的构造函数 (6)在派生类中声明的成员名,如果与继承的成员名相同,就会遮盖继承的成员,为了访问被遮盖的成员,可以使用作用域解析运算符和类名来限定成员名 (7)如果派生类有两个或多个直接基类,就会包含同一个类的两个或多个继承子对象,此时把重复的类声明为虚基类,就可以避免出现重复练习题 1定义一个基类,它包含两和私有成员,一个是string,存储动物的名称(例如"Fido"或Yogi),另一个是整数成员,weight包含该动物的重量,该类还包含一个公共函数who,它可以显示一个消息,给出对象的名称和重量,把用做公共基类,派生两个类lion和Aardvatk,再编写一个main()函数,创建lion和Aardvatk对象(Leo,400磅,"Algernon",50磅),为派生类对象调用who成员,说明who成员在两个派生类中继承的来的 2在类中,把who函数的访问指定符改为peotected但类中的其他内容不边,现在修改派生类,使原来的main函数仍能工作 3在上一题中,把基类成员who的访问指定符改为public,但把who函数实现为每个派生类的成员,且在输出消息中显示派生类名,现在修改main函数,为每个派生类对象调用who的基类版本和派生类版本 4定义一个类Person,它包含数据成员agename和gender,从Person中派生一个类Employee,在新类中添加一个数据成员,存储个人的number,再从Employee中派生一个类Executive,每个派生类都应定义一个函数,来显示相关的信息,(名称和类型,如"FredSmithisanEmployee").编写一个main函数,生成两个数组,一个数组包含5个Executive对象,另一个数组包含5个一般的Employee对象,然后显示它们的信息,另外,调用Employee类继承的成员函数,显示的信息第十六章虚函数和多态性*************************** (1)多态性是指通过指针或引用调用函数,而且调用是动态解析的,即在程序执行时确定调用哪个函数 (2)基类中的函数可以声明为vitual,在派生于该基类的所有类中,这会迫使该函数总是虚函数,在通过指针或引用调用函数时,函数调用就是动态解析的,函数调用的对象类型,将确定所使用的函数版本 (3)使用对象或直接成员选择运算符来调用虚函数,该函数调用就是动态解析的,即在编译期间进行解析 (4)如果基类包含虚函数,就应把基类的虚函数声明为vitual,这会为确保动态创建的派生类对象选择正确的函数 (5)纯虚函数没有定义,基类的虚函数在函数声明的最后加上=0,就变成了纯虚函数 (6)包含一个或多个纯虚函数的类被称为抽象类,这种类不能创建对象,在该类的任何派生类中,必须定义所继承的所有纯虚函数,否则该派生类也是抽象类,也不能创建类的对象 (7)虚函数的默认参数值是静态赋予的,如果虚函数的的基类版本有默认的参数值,在派生类中指定的默认参数值就会被忽略,因为虚函数调用是动态解析的 (8)可以声明类成员的指针,它们可以是数据成员的指针,也可以是函数成员的指针,这类指针需要与对象,对象的引用或指针一起使用,来引用成员指针定义的对象的类成员练习题 1在15章的练习中,定义了一个基类Animal,它包含两个私有数据成员,一个是string成员,存储动物的名称("Fido"),一个是整数成员weight存储了动物的重量(单位是磅),该基类还包含一个公共的虚拟函数who和一个纯虚函数sound,公共的虚拟函数who返回一个string对象,该对象包含了Animal对象的名称和重量,纯虚函数sound()在派生类中应返回一个string对象,表示该动物发出的声音,把Animal类作为一个公共基类,派生至少三个类SheepDog和Cow在每个类中实现sound函数 定义一个类Zoo,它至多可以在一个数组中存储50种不同类型的动物(使用指针数组),编写一个main函数,创建给定数量的派生类对象的随机序列,在Zoo对象中存储这些对象的指针,使用Zoo对象的一个成员函数,输出Zoo中每个动物的信息,以及每个动物发出的声音 2定义一个BaseLength,它把长度存储为一个整数值,从BaseLength中派生一个成员函数length,该函数返回一个指定长度的double值,从BaseLength中派生一些类InchesMetersYardsPerches,并重写基类的length函数,把长度返回为相应单位的double值,(1英寸=25.4毫米,1米=1000毫米,1码=36英寸,1杆(US)=5.5码),定义一个main函数,读取一系列不同单位的长度,创建相应的派生类对象,把它们的地址存储在 BaseLength* 类型的数组中,以毫米和原单位输出每个长度 3定义转换运算函数,把第二题中的每个派生类型转换为其他派生类型,例如,在Inches类中,定义成员operatorMetersoperatorPerches和operatorYards,在main中添加代码,以4种不同的单位输出每个长度值(转换运算符不需要指定返回值,因为返回类型在名称中隐含了) 4使用转换的构造函数代替转换运算符,完成第3题第十七章程序错误和异常处理*************************第十八章类模板第十九章输入输出操作第二十章标准模板库(STL)第十六章虚函数和多态性************************本章小结
1、多态性是通过指针或引用调用函数,而且调用是动态解析的,即在程序执行时确定调用哪个函数
2、基类中的函数可以声明为virtual,在派生于该基类中的所有类中,这会迫使该函数总是虚函数在通过指针或引用调用虚函数时,函数调用就是动态解析的函数调用的类型将确定所使用的函数版本
3、使用对象和直接成员选择运算符来调用虚函数,该函数调用就是静态解析的,即在编译期间解析
4、如果基类包含虚函数,就应把该函数声明为virtual这会确保为动态创建的派生类对象选择正确的析构函数
5、纯虚函数没有定义基类中的虚函数在函数声明的最后加上=0,就变成了纯虚函数
6、包含一个或多个纯虚函数的类称为抽象类,这种类不能创建对象在该类的任何类中,必须定义所继承的所有纯虚函数否则该派生类业是抽象类,也不能创建该类的对象
7、虚函数的默认参数值是静态赋予的,如果虚函数的基类版本有默认参数值,在派生类中指定的默认参数值就会被忽略,因为虚函数是动态解析的
8、可以声明类成员的指针他们可以是数据成员的指针,也可以是函数成员的指针这类指针要与对象、对象的引用或指针一起使用,来引用成员指针定义的对象的类成员练习
1、定义一个基类Animal,它包含两个私有数据成员,一个是string,存储动物的名称例如Fido,另一个是整数成员weight,包含该动物的重量单位是磅该类还包含一个公共虚拟成员函数who和一个纯虚函数sound公共的虚拟成员函数who返回一个string对象,表示该动物发出的声音把Animal类作为一个公共基类,派生至少三个类Sheep、Dog和Cow,在每个类中实现Sound函数定义一个类ZOO,他至多在一个数组中存储50种不同类型的动物(使用指针数组)编写一个MAIN()函数,创建给定数量的派生类对象的随机序列,在ZOO对象种存储这些对象的指针使用ZOO对象的一个成员函数,输出ZOO中每个动物的信息,以及每个动物发出的声音
2、定义一个类Baselength,把他的长度存储为一个整数值,单位是毫米,该类有一个成员函数length,该函数返回一个指定长度的double值从Baselength中派生一些类Inches、Meters、Yards和Perches,并重写基类的length函数,把长度返回为相应单位的double值(1英寸=254毫米,1米=1000毫米,1码=36英寸,1杆(US)=
5.5码)定义一个main函数,读取一系列不同单位的长度,创建相应的派生对象,把他们的地址存储在Baselength*类型的数组中以毫米和原单位输出每个长度
3、定义转换运算符函数,把第2题中的每个派生类型转换为其他派生类型例如,在Inches类中,定义成员operatorMeters、operatorPerches和operatorYards在main中添加代码,以4种不同的单位输出每个长度值(转换运算符不需要指定返回值,因为返回类型在名称中隐含了)
4、使用转换的构造函数代替转换运算符,完成第3题第十七章程序错误和异常处理*************************本章小结
1、异常是用于在程序中警示错误的对象
2、可能抛出异常的代码通常包含在try块中
3、处理在try块中抛出的各种类型异常的代码放在该try块后面的一个或多个catch块中
4、Try块及其catch块可以嵌套在另一个try块中
5、参数为基类类型的处理程序可以捕获派生类类型的异常
6、如果异常没有被catch块捕获,就调用terminate函数,该函数会接着调用abort
7、标准库定义了一组标准异常
8、异常说明限制了函数可以抛出的异常类型
9、如果函数抛出的异常类型不在该函数的异常说明的允许范围之内,就会调用unexcepted函数
10、可以改变unexcepted函数的默认操作,方法是实现自己的excepted处理程序,把该函数指针传递给set_unexcepted函数,以建立该处理程序
11、构造函数的函数try块可以包含初始化列表和构造函数体
12、Uncaught_exceptioned函数允许检测因抛出异常而调用的析构函数练习
1、从标准exception类中派生自己的异常类CurveBall,表示一个随机错误,再编写一个函数,在时间过了大约25%时抛出这个异常(一种方式是生成一个1到20之间的随机数,如果该数小于或等于5,就抛出异常)定义函数main,调用这个函数1000次,记录并显示异常抛出的次数
2、定义另一个异常类TooManyExceptions,在第1题中,当捕获的异常超过10次时,就从CurveBall异常的catch块中抛出这个类型的异常
3、在第一题的代码中实现自己的中断处理程序,在抛出TooManyExceptions异常时显示一个消息
4、在稀疏数组中,大多数元素的值都是0或空给类型为string指针的一维稀疏数组元素定义一个类,仅存储数组中的非0元素元素的个数应指定为构造函数参数,因此至多可以存储100个对象的稀疏数组声明如下SparseArraywords100;为类实现下标运算符,以使用数组表示法提取或存储元素如果在下标运算符函数中超出了合法的索引范围,就抛出了异常(提示在内部使用链表,让每个节点存储一个元素及其下标)第十八章类模版*************************本章小结
1、类模板定义了一系列类类型
2、类模板的实例是根据给定的模版参数集,从该模版中生成的类定义
3、声明类模板类型的对象,就会对类模板进行隐式实例化
4、类模版的显式实例化,会根据类模版的给定参数集定义一个类
5、对于类模版中类型参数的参数,其类型可以是基本类型、类类型、指针或引用类型
6、非类型参数可以是整型类型、枚举类型、指针或引用
7、类模板的部分说明可以根据原类模板中参数的一组限定子集,定义一个新模板
8、类模板的完全说明可以根据原类模板的所有参数参数,定义一个新模板
9、类模板的友元可以是函数、类、函数模板或类模板
10、普通的类可以把类模板或函数模板声明为友元练习
1、第17章的练习题要求创建一个稀疏数组类这里则要求定义一个一维稀疏数组的模板,存储任意类型的对象,而且只有存储在数组中的元素才能占用内存元素的个数可以由模板的一个实例存储,该个数是不应有限制的该模板可以用于定义一个稀疏数组,该数组包含double类型的元素指针,语句如下SparseArraydoublevalues;为模板定义下标运算符,以便象普通的数字那样提取和设置元素值如果在某个索引位置不存在元素,下标运算符就应该返回由对象类的默认构造函数创建的对象在main函数中使用这个模版,在一个稀疏数组的随机位置上存储20个int类型的随机元素值,随机数的范围是32到212,索引值的范围是0到499,输出非0元素值及其索引位置
2、为链表定义一个模板,允许从链表的最后开始向前遍历链表,再从列表的开始向后遍历列表(每个节点都需要前一个节点的指针和下一个节点的指针)在一个程序中使用该模板,把每个散文或诗歌中的单词存储为字符串对象,再以逆序方式显示他们,一行显示5个单词
3、使用链表和稀疏数组模板创建一个程序,在至多有26个链表的稀疏数组中,存储散文或诗歌中的单词,每个列表都包含首字母的相同单词输出这些单词,在输出时,对这些单词分组,使每一组单词具有相同的首字母,并在一个新行上显示该组中的单词(在指定模板参数时,应在连续的字符之间加上空格,否则会被解释为按位右移运算符)
4、在SparseArray模板中添加insert函数,该函数在数组的最后一个元素后面添加一个元素使用这个函数和一个SparseArray实例完成上一题,其中,该实例的元素是存储了string对象的SparseArray对象第十九章输入输出操作*************************本章小结
1、标准库支持字符流、二进制(字节)流和字符串流的输入输出操作
2、输入和输出的标准是cin和cout,还有错误流cerr和clog
3、提取和插入运算符提供了格式化的流输入输出操作
4、文件流可以与磁盘上的文件关联起来,进行输入、输出或输入输出
5、文件大开模式决定了是从流中读取数据,还是给流写入数据
6、如果创建了一个文件输出流,并把它与未有文件本身使用的文件名关联起来,就会创建该文件
7、文件有开头、结尾和当前位置
8、可以把文件流的当前位置改为以前记录的某个位置这位置与流开头的偏移量为正,
9、结尾的偏移量为负,而与流当前位置的偏移量可以为正,也可以为负
10、为了支持类对象的流操作,可以重载插入和提取运算符,使这些运算符函数成为类的友元
11、字符串流类提供了string对象的输入输出操作练习
1、编写一个Time类,把小时、分钟和秒存储为整数提供一个重载的插入运算符(),把时间以hh::mm::ss的格式输出到任意输出流上
2、给time类提供一个简单的提取运算符operator,它可以以hh::mm::ss格式读取时间值如何复制“”符号?(提示用什么类型的变量存储“”?)
3、编写一个程序,把时间记录到文件中编写一个匹配程序,读取文件中的时间值,把他们显示到屏幕上
4、编写一个程序,从标准输入中读取文本行,再把他们写到标准输出上,删除所有的前导空白,把多个空格转换为一个空格对键盘输入测试该程序,再对从文件中读取的字符测试该程序编写第二个程序,把小写字母转换为大写形式,在测试他们第二十章标准模板库*************************本章小结
1、STL通过三类模板提供了功能容器、迭代器和算法
2、容器提供了存储和组织任意类型的对象的各种方式,但要存储的对象类型必须满足元素的基本要求
3、迭代器是操作方式像指针的对象迭代器是智能指针的示例
4、迭代器可以访问容器中的对象,或从流中提取对象
5、迭代器成对使用时,可以在序列的半开间隔中定义一组对象第一个对象包含在间隔中,而最后一个对象不包含在间隔中
6、算法是一般化的标准函数,可以处理迭代器指定的对象集
7、算法独立于容器,但可以通过迭代器应用于任何容器中的对象练习
1、编写一个程序,使用Vector存储任意个城市,这些城市借助键盘读取为string对象,再输出他们
2、在上一题中添加代码,使用sort算法按照升序对出城市排序,之后输出他们
3、编写一个程序,借助键盘读取任意个名称和关联的电话号码(其格式是”LaurelStan”5431234),把他们存储在map容器中,给定一个名称,就可以提取电话号码在输入一系列名称和电话号码后,对map进行随机访问,提取一个随即电话号码
4、利用上一题的代码,使用一个迭代器列出map的内容
5、给上一题添加代码,用multimap替换map容器,为给定的名称列出所有的电话号码,作为查询的相应发表于@2007年10月10日 11:29:00|评论3|编辑|举报|收藏旧一篇:MicrosoftVisualStudio.NET2003安装过程图解|新一篇:设计模式和极限编程查看最新精华文章请访问博客首页相关文章SourcecodeofCIH[转载]C语言程序设计入门学习六步曲比较C#中的readonly与constJava入门实例classpath及package详解转帖教程--编写Javascript代码C语言的保留关键字typedef和define#define与const的区别本文来自CSDN博客,转载请标明出处http://blog.csdn.net/lihuaidong521/archive/2007/10/10/
1818095.aspx。