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 = "Smith, where Jones had had \"had had\", had had \"had\"."
                                        "\n \"Had had\" Had had the exminers' appeoval.";
         string word = "had";
         cout<          int count = 0;
         for(int index=0;(index=text.find(word, index)) != string::npos; index += (int)word.length(),count++);
         cout<<"You text contained"
                   <                    <                    <          return 0;
 }
搜索子字符串"had",找出其中所有"had"单词,且不考虑大小写(提示:复制原字符串)
      4:编写一个程序,从键盘上读取一任意长度的文本字符串,在提示输入要在该字符串中查找的单词,程序应查找出现在字符串中的所有单词,不考虑大小写,在用与单纯中字符个数相同的的星号来替换该单词,然后输出新字符串,注意必须是替换整个单词,例如:如果用户输入了字符串"Our house is at your disposal.",要查找的单纯是our,则得到的字符串应该是"***house is at your disposal."而不是"***house is at y*** 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<                             <<"Enter a height as an integral number of inches:";
                   cin>>height[count++];
                   cout<<"Do you want to enter another (y or n)?";
                   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<                    <<"Average height is"<                    /*<                    <          int above_average = 0;
         for(int i=0;i                    if(height[i] > average)
                            above_average++;
         cout<<"There"
                   <<(above_average == 1?"is":"are")
                   <                    <<(above_average == 1?" ": "s ")
                   <<"above average"
                   <          return 0;
}
这段程序使用了整数数组计算一组人的平均身高,再计算出有多少人的身高超过平均身高
修改上面的程序,使用动态内存来存储学生的信息,使程序可以处理任意学生的信息
   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("he", "llo");
              string s1 = "aaa"; string s2 = "bbb";
              string s3 = plus(s1, s2);
       给string 版本的函数传送参数的最有效方式是什么?
       为什么下面的调用不工作?
       d = plus (3, 4.2);
     2:把函数plus()变成一个模板,测试它是否能用于处理数值类型,该摸板是否能处理第1题中的语句plus("he","llo')?,为什么?提出问题的一种解决方法.
     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的情形,实际上一台计算机没有足够的能力计算这种情形

你可能感兴趣的:(程序代码,C++代码)