c 入门经典习题集

更新时间:2023-09-16 15:10:01 阅读量: 高中教育 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

c++入门经典习题集.txt骗子太多,傻子明显不够用了。我就是在路上斩棘杀龙游江过河攀上塔顶负责吻醒你的公主。C++入门经典习题集

第一章:基本概念******************************* (1):c++程序至少包含一个main()函数 (2):函数的可执行部分由包含在一对花括号中的语句组成 (3):一对花括号定义了一个语句块 (4):语句用分号结束 (5):关键字是C++中有特殊含义的一组保留字,程序中的实体不能与C++语言中的任何关键字同名

第二章:基本数据类型和计算************************** (1):数值和字符常量被称为字面量 (2):可以把整数字面量定义为十进制,十六进制,或八进制 (3):浮点字面量必须包含小数点和指数,或者两者都包含 (4):C++的所有字面量和变量都有给定的类型 (5):Char类型的变量可以存储单个字符,占用一个字节,char类型在默认的情况下是带符号的,也可以是不带符号的,这取决于编辑器,也可以使用,signed 和 unsigned char 类型的变量存储整数 (6):类型wchat_t 可以存储宽字符,占用两个字节,这也取决于编辑器 (7):变量的名称和类型出现在声明语句中,以一个分号结束,声明一个变量,如果给该变量分配了空间内存,那么也就定义了该变量 (8):变量的声明可以指定初始值,这是一种良好的编程习惯 (9):可以用const保护基本数据类型的"变量"值,编辑器程序源代码文件中检查是否试图修改声明为const的变量

练习题:

1:编写一个程序,计算圆的面积.该程序应提示输入圆的半径,使用公式area = pi*radius*radius 计算面积,在显示结果

2:使用第一题的解决方案,改进代码,使用户输入所需的位数,控制输出的精度 (提示, 使用setprecision()操纵程序)

3:在生日那天,你得到了一个卷尺和一个可以确定角度的仪器,例如测量水平线和树高之间的夹角,如果你知道自己与树之间的距离d和眼睛平视量角器的高度h,就可以用下面的公式计算出树的高 h+d*tan(angle)

创建一个程序,从键盘上输入h, d ,angle 输出树的高度

第三章:处理基本数据类型*************************** (1):关键字typedef允许定义其他类型的同义词 (2):关键字extern允许引用在另一个文件中定义的全局变量.

练习题

1:编写一个程序,计算用户输入非0整数的倒数,该程序应把计算的结果存储在double类型的变量中,再输出它

2:创建一个程序提示用户以十进制形式输入一个整数,在对其二进制表示的最后一位就反,也就是说,如果最后一位是 1 ,那么就把它改为 0,反之亦然,结果应显示为一个十进制数(老师提示:将这个数与1异或就可以了)

3:编写一个程序,计算矩形搁板的一层可以容纳多少个正方形的盒子,且不会出现盒子悬垂的情况,使用double类型的变量表示搁板的长度和深度(单位是英尺),以及盒子一边的长度(单位是英寸),从键盘上读取这些值,需要声明并初始化一个常量,用于把英尺转换为英寸,在一个语句中,计算搁板的一层可以容纳多少个盒子,并把结果赋给一个long的变量

4:如果不运行下面的代码,能不能看出这些代码的输出结果? unsigned int k = 430u;

unsigned int j = (k >> 4) & ~ (~0 << 3); std::cout<

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:请看下面的一段程序

#include #include #include #include using namespace std;

int main() {

string text = \ \\\\had\\\Had had the exminers' appeoval.\

string word = \

cout<

for(int index=0;(index=text.find(word, index)) != string::npos; index += (int)word.length(),count++);

cout<<\

<

搜索子字符串"had",找出其中所有"had"单词,且不考虑大小写(提示:复制原字符串) 4:编写一个程序,从键盘上读取一任意长度的文本字符串,在提示输入要在该字符串中查找的单词,程序应查找出现在字符串中的所有单词,不考虑大小写,在用与单纯中字符个数相同的的星号来替换该单词,然后输出新字符串,注意必须是替换整个单词,例如:如果用户输入了字符串"Our house is at your disposal.",要查找的单纯是our,则得到的字符串应该是"***house is at your disposal."而不是\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:请看下面的程序 #include #include #include #include #include using namespace std;

int main() {

int height[10]; int count = 0; char reply = 0; do {

cout<

<<\ cin>>height[count++];

cout<<\ cin>>reply;

}while(count < 10 && std::tolower(reply) == 'y'); if(count == 10) {

cout<

double average = 0.0; for(int i=0;i

average += height[i]; average /= count; cout<

<<\

/*<

int above_average = 0; for(int i=0;i

if(height[i] > average) above_average++; cout<<\

<<(above_average == 1?\ <

<<(above_average == 1?\ <<\ <

这段程序使用了整数数组计算一组人的平均身高,再计算出有多少人的身高超过平均身高 修改上面的程序,使用动态内存来存储学生的信息,使程序可以处理任意学生的信息

4:二维数组是数组的数组,而数组可以通过指针动态创建,如果动态数组创建的数组元素也是指针,数组的每个元素都可以存储数组的地址,使用这个概念,创建一个数组,其中包含三个数组指针,每个数组都可以包含六个int类型的值,把第一个整数数组的值设为1到6,下一个数组的元素值设置为第一个数组元素的平方,第三个数组的元素值设为第一个整数数组的三次方,输出3个数组的内容,再释放已分配的内存.

第八章:使用函数编程***************************** (1):函数是一个自包含的代码单元,它有着已定义好的目的,一般的程序总是包含大量的小函数,而不是包含几个大函数 (2):函数定义包含了函数名称,参数和返回类型的函数头,以及包含函数的可执行代码的函数体 (3):函数原型允许编辑器处理对该函数的调用,但此时函数定义可能没有处理 (4):由于给函数传送参数的按值传递机制,是传送原参数的副本,因此原参数值不能在函数中访问 (5):给函数传送指针可以修改该指针指向的值,但指针本身是按值传送 (6):把指针参数声明为const 可以防止修改原来的值 (7):可以把数组的地址作为指针传送给函数 (8):使用引用给函数传送值,即按引用传送机制,可以避免按值传送参数中的隐含复制过程,在函数中不应该修改的值都应该声明为const (9):为函数的参数指定默认值后,只要参数有默认值,就允许有选择的省略参数 (10):从函数中返回引用,允许在等号运算符的左边使用该函数,把返回类型声明为const引用,可以阻止在等号运算符的左边使用该函数 练习题

1:编写一个value_input(),它接受两个整型参数和一个提示用户输入字符串参数,函数会提示所输入的值应在参数指定的范围之内,函数应一直提示用户输入值,直到输入的值有效为止.

在程序中使用该value_input()函数,获取用户的生日,验证月份,日期,

年份是否有意义,最后以下面的格式在屏幕上输出该生日 Noverber 21, 1977

这个程序应使各个函数month(), year(), day(),管理对数字的输入,最后注意不要忘里闰年

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(),它把两个数值加在一起,返回它们的和,提供处理,int, double 和 string类型的重载版本,测试它们是否能处理下面的调用 int n = plus(3, 4);

double d = plus(3.2, 4.2); string s = plus(\

string s1 = \ string s3 = plus(s1, s2);

给string 版本的函数传送参数的最有效方式是什么? 为什么下面的调用不工作? d = plus (3, 4.2);

2:把函数plus()变成一个模板,测试它是否能用于处理数值类型,该摸板是否

能处理第1题中的语句plus(\?,为什么?提出问题的一种解决方法.

3:STL提供了三角函数sin(), cos(), tan(),这些函数都带有一个double参数,返回一个double的值,要使用它们需要包含标准库头文件<cmath>,编写一个函数calc(),

它带用两个参数,一个double值和一个指向三角函数的指针,返回把函数应用于double值的结果,编写一个函数,测试所写的函数,如果该函数通过了测试,就建立一个函数指针数组,存储这三个三角函数,并测试它们

4:有一个递归函数,称为Acherman函数,它广泛应用于计算机科学和数学,其定义如下:

如果m和n是整数,若n>=0,且 m>=0,则 如果m == 0,则ack(m, n) = n+1

如果n == 0,且m>0, 则ack(m, n) = ack(m-1, 1)

如果m > 0且n>0, ack(m, n) = ack(m-1, ack(m, n-1))

编写一个程序递归计算Ackerman函数,假定n为0到5之间的值,m为0到3之间的值,进行测试,这个函数的一个特性是,如果m和n有小幅度的增加,递归的次数(或深度)就会有非常大的增加,所以不要递归计算n>8或m>3的情形,实际上一台计算机没有足够的能力计算这种情形

第十章:程序文件和预处理指令************************* (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_this(const string& s) 和

print_that(const string& s),这两个函数又调用了第三个函数print(const string& s),输出传送给它的字符串

在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,每个命名空间都包含一个函数print(const string& s),这些函数都具有相同的函数签名,区分它们的唯一方式是命名空间的名称,在print.pp文件中实现这两个函数,输出命名空间的名称和字符串

现在让print_this()调用在命名空间print1中声明的函数.让print_that()调用在命名空间print2中声明的函数,运行程序,验证是否调用了正确的函数

提示:从上面可以看出,在print_this()和print_that()中调用print()函数有三种不同的方式,即三种不同语法形式 4:修改main()例程,只有定义了预处理符号DO_THIS,才能调用print_this(),否则就调用print_that()

修改代码,定义一个宏PRINT(),定义了DO_THIS后就让PRINT(abc)----注意没有引号--调用print_this(\,否则就调用print_that(\

第十一章:创建自己的数据类型************************* (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实现成员函数add(), subtract(), multiply(),对当前对象和Integer的参数值进行加,减和乘法运算,在类中用main()演示这些函数的操作,main()创建了几个Integer对象,它们分别包含值4,5,6,7,8,在使用些对象计算4*5的三次方,加6*5的二次方,再加7*5,再加8的值,实现这些函数,使计算和结果的输出在一个语句中完成

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个对象的稀疏数组声明如下:

SparseArray words(100);

为类实现下标运算符,以使用数组表示法提取或存储元素。如果在下标运算符函数中超出了合法的索引范围,就抛出了异常(提示:在内部使用链表,让每个节点存储一个元素及其下标)。

第十八章 类模版************************* 本章小结:

1、类模板定义了一系列类类型。

2、类模板的实例是根据给定的模版参数集,从该模版中生成的类定义。 3、声明类模板类型的对象,就会对类模板进行隐式实例化。

4、类模版的显式实例化,会根据类模版的给定参数集定义一个类。

5、对于类模版中类型参数的参数,其类型可以是基本类型、类类型、指针或引用类型。 6、非类型参数可以是整型类型、枚举类型、指针或引用。

7、类模板的部分说明可以根据原类模板中参数的一组限定子集,定义一个新模板。 8、类模板的完全说明可以根据原类模板的所有参数参数,定义一个新模板。

9、类模板的友元可以是函数、类、函数模板或类模板。 10、普通的类可以把类模板或函数模板声明为友元。 练习

1、第17章的练习题要求创建一个稀疏数组类。这里则要求定义一个一维稀疏数组的模板,存储任意类型的对象,而且只有存储在数组中的元素才能占用内存。元素的个数可以由模板的一个实例存储,该个数是不应有限制的。该模板可以用于定义一个稀疏数组,该数组包含double类型的元素指针,语句如下:

SparseArrayvalues;

为模板定义下标运算符,以便象普通的数字那样提取和设置元素值。如果在某个索引位置不存在元素,下标运算符就应该返回由对象类的默认构造函数创建的对象。在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、编写一个程序,借助键盘读取任意个名称和关联的电话号码(其格式是”Laurel , Stan”

5431234),把他们存储在map容器中,给定一个名称,就可以提取电话号码。在输入一系列名称和电话号码后,对map进行随机访问,提取一个随即电话号码。

4、利用上一题的代码,使用一个迭代器列出map的内容。

5、给上一题添加代码,用multimap替换map容器,为给定的名称列出所有的电话号码,作为查询的相应。

发表于 @ 2007年10月10日 11:29:00 | 评论( 3 ) | 编辑| 举报| 收藏

旧一篇:Microsoft Visual Studio .NET 2003安装过程图解 | 新一篇:设计模式和极限编程 查看最新精华文章 请访问博客首页相关文章 Source code of CIH[转载]C语言程序设计入门学习六步曲比较C#中的readonly与constJava入门实例classpath及package详解(转帖)教程 -- 编写 Javascript 代码C语言的保留关键字typedef 和 define#define与const的区别

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lihuaidong521/archive/2007/10/10/1818095.aspx

本文来源:https://www.bwwdw.com/article/i1xh.html

Top