《C++程序设计》习题解答

《C十十程序设计》习题解答第1章C++概述1 .填空题(1)在面向对象程序设计中,对象是由 ヽ 和 封装在ー起构成的实体2)在面向对象程序设计中,类是具有 和 的对象的集合,它是对ー类对象的抽象描述3)面向对象程序设计最突出的特点就是 ヽ 和4) Ch•语言包含头文件的格式有两种,即 和 〇(5) C++源程序要经过 ヽ ヽ 和 四个环节,才能在屏幕上显示结果6)每个C++程序都从 函数开始执行7)每个函数体都以 开始,以 结束8) C++程序中的每条语句以 结束¢9) C++程序的头文件和源程序的扩展名分别为 和,目标程序的扩展名为,可执行程序的扩展名为10)在C++程序中使用基本输入/输出语句需包含的头文件是,应放 在程序的»(11)在C++程序中注释语句有 和 两种格式12)C++程序的续行符为 〇(13)如果从键盘输入语句给变量X,则输入函数的形式为;如果再将变 量X的值显示在屏幕上,其输出函数的形式为14) C++程序中的“endl”在输出语句中起 作用参考答案:(1)对象名,ー组属性数据,ー组操作(2)相同属性数据,操作(3)封装性,继承性,多态性(4) includeく文件名,扩展名〉,include”文件名,扩展名"(5)编辑,编译,连接,运行(6)主函数⑺{ヽ}(8)分号:(9) .h, .cpp, .obj, .exe(10) #include
A.数据隐藏 B.信息 C.数据抽象 D.对数据的操作(2) C++源程序的扩展名是(A. c B. exe C. cpp D. pch(3)把高级语言程序转换为目标程序需使用( )»A.编辑程序 B.编译程序 C.调试程序 D.运行程序(4) C++语言与C语言相比最大的改进是( )A.安全性 B.复用性 C.面向对象 D.面向过程(5)以下叙述不正确的是( ).A. C++程序的基本单位是函数B. 一 C++程序可由一个或多个函数组成C. ー个C++程序有且只有一个主函数D. C++程序的注释只能出现在语句的后面参考答案:(1) D (2) C (3) B (4) C (5) D3 .简答题(1)试比较面向对象程序设计、结构化程序设计和模块化程序设计2)解释以下概念:类对象封装数据抽象继承多态(3)简述C++语言有哪些特点参考答案:(1)结构化程序设计强调从程序结构和风格上研究程序设计结构化程序设计的程序代 码是按顺序执行的,有一套完整的控制结构,函数之间的参数按一定规则传递,不提倡使用 全局变量,程序设计的首要问题是“设计过程’模块化程序设计将软件划分成若干个可单独命名和编址的部分,称之为“模块模块化 程序设计的设计思路是“自顶向下,逐步求精’‘,其程序结构是按功能划分成若干个基本模块, 各模块之间的关系尽可能简单,在功能上相对独立。
模块和模块之间隔离,不能访问模块内 部信息,即这些信息对模块外部是不透明的,只能通过严格定义的接口对模块进行访问模 块化程序设计将数据结构和相应算法集中在ー个模块中,提出了“数据结构+算法=程序设计” 的程序设计思想模块化能够有效地管理和维护软件研发,能够有效地分解和处理复杂问题 但它仍是ー种面向过程的程序设计方法,程序员必须时刻考虑所要处理数据的格式,对不同 格式的数据做相同处理或对相同数据格式做不同处理都要重新编程,代码可重用性不好面向对象程序设计面对的是一个个对象,用ー种操作调用ー组数据把数据和有关操作 封装成一个对象各个对象的操作完成了,总的任务也就完成了他适用于编写大型程序 结构化程序设计和模块化程序设计适用于比较小的程序,他要求细致的描写程序设计的每个 细节2)类:在面向对象程序设计中,类是具有相同属性数据和操作数据的函数的封装,它 是对ー类对象的抽象描述对象:在面向对象程序设计中,对象是由对象名、ー组属性数据和一组操作封装在ー起 构成的实体其中属性数据是对象固有特征的描述,操作是对这些属性数据施加的动态行为, 是ー系列的实现步骤,通常称之为方法封装:封装是ー种数据隐藏技术,在面向对象程序设计中可以把数据和与数据有关的操 作集中在ー起形成类,将类的一部分属性和操作隐藏起来,不让用户访问,另一部分作为类 的外部接口,用户可以访问。
数据抽象:抽象的作用是表示同类事物的本质,C++中的数据类型就是对一批具体的数 的抽象类是对象的抽象,对象是类的特例继承:在面向对象程序设计中,继承是指新建的类从已有的类那里获得已有的属性和操 作多态:在面向对象程序设计中,多态性是指相同的函数名可以有多个不同的函数体,即 ー个函数名可以对应多个不同的实现部分3)面向对象程序设计最突出的特点就是封装性、继承性和多态性①封装性封装是ー种数据隐藏技术,在面向对象程序设计中可以把数据和与数据有关的操作集中 在ー起形成类,将类的一部分属性和操作隐藏起来,不让用户访问,另一部分作为类的外部 接口,用户可以访问类通过接口与外部发生联系,用户只能通过类的外部接口使用类提供 的服务,而内部的具体实现细节则被隐藏起来,对外是不可见的②继承性在面向对象程序设计中,继承是指新建的类从已有的类那里获得已有的属性和操作已 有的类称为基类或父类,继承基类而产生的新建类称为基类的子类或派生类由父类产生子 类的过程称为类的派生通过继承,程序可以在现有类的基础上声明新类,即新类是从原有 类的基础上派生出来的,新类将共享原有类的属性,并且还可以添加新的属性继承有效地 实现了软件代码的重用,增强了系统的可扩充性。
③多态性在面向对象程序设计中,多态性是指相同的函数名可以有多个不同的函数体,即ー个函 数名可以对应多个不同的实现部分在调用同一函数时,由于环境的不同,可能引发不同的 行为,导致不同的动作,这种功能称为多态它使得类中具有相似功能的不同函数可以使用 同一个函数名多态既表达了人类的思维方式,又减少了程序中标识符的个数,方便了程序 员编写程序多态是面向对象程序设计的重要机制4 .编程题编写程序在屏幕上显示字符串“欢迎大家学习C++语言!”,并按照书中介绍练习C++语 言的上机实现过程参考答案:#include
(6)表达式1<3&&5<7的值是,表达式!(5<8)112<6的值是 〇(6) 表达式a+b
include A. witch B. break C. main D. continuefloatcharcincase(2)下列四组变量命名,不符合Visual C++变量命名规则的是( )〇A. cc B. 6xC. wlD. ye_78avercharyear78wo(3)假设有两个变量a=65432和b=a*2,在保证数据正确存储的前提下,以下变量类型定义错误的是( )A.int a;int b;Consigned short a;unsigned short b;(4)在if语句中的表达式(A,只能是关系表达式C.只能是逻辑表达式 (5)以下程序的输出结果为(A.tl=true B.tl=8t2=false t2=0t3=true t3=-l#include 3) while与do-while语句的主要区别是什么?参考答案:(1)在C++语言中,字符串常量和字符常量是不同的字符串常量是用ー对双引号括 起来的字符序列例如‘” a"、"123"、"hello"等都是字符串常量一般字符常量是用ー对单 引号括起来的一个字符,其值为ASCH码值例如,宣、ハ'$、5等都是合法的字符常量2) C++语言提供了两种定义符号常量的方法:①用const语句定义符号常量这种方法是C++语言中广泛采用的定义符号常量的方法,其一般格式为:const数据类型符号常量=表达式:②用#define语句定义符号常量这是C语言中定义符号常量的方法,其中#define是预处理指令其缺点是不能显示声 明常量的类型其一般格式为:#define常量名常量值(3) while把循环条件判断放在循环体执行前,而do-while循环条件判断放在循环体 执行后,不管循环条件是否成立,它都至少执行一次循环体4) 程题(1)求100以内的自然数中奇数之和2)求100以内能被13整除的最大自然数3)有一个函数如下所示:'x (x 4)输入3个整型数,按由大到小的顺序输出显示5)根据从键盘输入的表示星期几的数字,输出它对应的英文名称6)从键盘输入ー个整数,求其阶乘7)编写ー个简易计算器程序,根据用户输入的运算符做两个数的加、减、乘或除运 算8)编写程序在屏幕上打印如下图案 * *参考答案:(1) #include 3)当一个函数没有返回值时,函数的类型应定义为4)在C++中,函数的参数传递可有三种形式,即 ヽ 和(5)在函数体外定义的变量是 变量;在函数体内定义的变量是变量6)在C++的一个程序内可以定义多个同名的函数,称为7)在ー个函数的定义或声明前加上关键字,该函数就声明为内联函数8)若在一个函数中又调用另ー个函数,则称这样的调用过程为函数的 调用9)在调用ー个函数的过程中出现直接或间接调用该函数本身,就称作函数的调 1n110)在程序中可以使用系统函数,但是要在程序的 说明函数所在的头文件名tn)以下程序的输出结果为include A,函数是构成C++程序的基本元素B,程序总是从第一个定义的函数开始执行C.主函数是C++程序中不可缺少的函数D,在函数调用之前,必须要进行函数的定义或声明(2)以下函数声明正确的是( )〇A. double fun(int x,int y) B. double fun(int x;int y)C. double fun(int x,int y); D. double fun(int x, y);(3)当ー个函数无返回值时,函数的类型应为( )A.任意 B. void C. int D. char(4)下列关于函数声明说法不正确的是( ).void fun(void);A.函数声明是一条独立的语句,必须以分号结尾B.函数声明通常放在程序的开始部分C.函数fun无参数传入D.函数fun返回一个值,其类型为void(5)下列关于return语句的说法错误的是( )A,在函数中通过return语句返回一个函数值B. return语句中表达式的类型决定函数返回的类型C.在无返回值的函数体中可以没有return语句D,当函数返回值的类型为void时,函数中不应出现return (表达式)(6)下列关于重载函数的说法正确的是( )«A.重载函数必须具有不同的返回值类型B.重载函数形参个数必须不同C.重载函数必须具有不同的形参列表D.重载函数名可以不同(7) ー个函数为 voidf(int,float=W),另一个函数为 void f(int),则它们( )。 A.不能在同一个程序中定义B.可以在同一个程序中定义并可重载C.可以在同一个程序中定义,但不可重载D.以上说法均不正确(8)下列函数定义中正确的是( )A. double fun(double x,y)double z;B. double fun(double x, double y)return x/y;z=x/y;return z;}D. double fun(double x, double y)C. double fun(double x,y)z=x/y; z=x/y;return z; return x/y;} )(9)下列关于默认参数值函数说法错误的是( )A. C++中,允许设置参数的默认值B,必须从参数表最右边的参数开始,设置参数的默认值C,在函数声明和函数定义中,默认参数的值必须相同D,函数调用时,带默认值的参数无实参输入时,使用默认值(10)下列程序的输出结果为( )〇A. 10,20,30 B. 35,7,5 C. 35,20,10 D. 10,20,35#include D.无法确定D. x=25A. void B. float C. intfun(void) {float x=3.0,y;y=x*x/2; return (y);)(13)下列程序的输出结果为( )〇A. x=15 B. x=17 C. x=23#include 在定义函数之前 常用函数原型加以说明函数原型通常位于程序代码的开始处在函数原型说明中也可以不给出参数名,只给出 类型如果函数调用在函数定义之前则必须声明若在后则可以不用声明3)内联函数是在函数名第一次出现时在函数名之前冠以关键字inline0在程序编译时, 编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换使用内联函数,加快了程序的执行速度,节省程序运行时的开销4)函数重载是指同一个函数名可以对应着多个不同函数的实现原则:函数重载要求编译器能够唯一地确定调用ー个函数时应执行哪个函数代码确定 函数时,编译器是通过函数的参数个数、参数类型和参数顺序来区分的也就是说,进行函 数重载时,要求同名函数参数个数不同、参数类型不同或参数顺序不同否则,将无法确定 是哪ー个函数体5)在使用函数的嵌套调用时要注意函数的返回地址,在函数体执行完毕后,一定要 返回调用该函数的主调函数,不能出现越级返回的情况6)第一阶段:递推将原问题不断分解为新的子问题,逐渐从未知向已知递推,最 终达到已知的条件,即递归结束的条件,这时递推阶段结束第二阶段:回归从已知条件出发,按照递推的逆过程,逐一求值回归,最后达到递归 的开始处,结束回归阶段,完成递归调用。 7)在函数或者类内说明的变量是局部变量全局变量是在函数和类外部定义的变量8) C++将所提供的系统函数的说明分别放在不同的头文件中,即.h文件,在程序中 使用系统函数时,要在程序开始处说明函数所在的头文件名4.编程题(1)从键盘输入10个浮点数,求其和及其平均值要求写出其和及平均值的函数2)编写函数fun,函数首部为double fun(int n),其功能是计算5 =2八的值,并通过 函数值返回主调函数 I(3)输入一个年份,判断是否是闰年4)写出ー个函数,使从键盘输入的ー个字符串反序存放,并在主函数中输入、输出 该字符串5)编写一个函数,其功能是:输入全班学生的成绩,以负数结束输入,统计学生人 数,作为函数值返回主调函数,并计算平均分,通过函数ave返回主调函数参考答案:(1) void sa()(float x,sum=0,ave=0;coutvv”请输入10个符点数:“ vvendl;for(int i=0;i<10;i++) {cin»x;sum=sum+x;}ave=sum/10;n«ave«endl;cout«M10个符点数的和为:"vvsumvv”;平均值为: }(2) double fun(int n)(int sum=O,fac=l;for(int i=l;i<=n;i++){fac=fac*i;sum=sum+fac;)retum(sum);}(3) void leap(int year){int flag;if(year%4==0)if(year%100==0)if(year%400==0) flag=l;else flag=0;else flag=l;else flag=0;if(flag) coutcvyearvv"年是闰年"vvendl;else cout«year«H不年是闰年,*«endl;}(4) #include (2)若定义float b[3][4];则b数组中含有 个 类型的数组元素 (3)在C++中二维数组的存放顺序为4)耍使一个数组a[5]中全部元素的值为〇,可以定义为5)以下程序段为数组a中所有元素输入数据,请填空void main(){int i,a[5];for(i=0;i<5;i++)cin»;}(6)以下程序按2行3列输出二维数组,请填空include A. int a(10); B. int n=10,a[n];C. int n; D. #define SIZE 10;cin»n; int a[SIZE];int a[n];(3)下列数组说明和初始化正确的是( )«A. int a[5]=0; B. int b[3]={ 1,2,3,4};C. float c[ ]={ 1,2,3}; D. float d={53,6.0};(4)下列数组说明和初始化错误的是( )〇A. int a[2][3]={l,2,3,4,5,6}; B. int b[ ][3]={2,3,4,5};C. int c[3][2]={{1},{2},{3}}; D. float d[3][ ]={5.3,6.0,6.8};(5)若有以下定义,则对a数组元素错误的引用是( )«int a[5]={l,2,3,4,5);A. a[0] B. a[2] C. a[a[4]-2] D. a[5](6)若有以下定义,则数组元素a{3}的值是( )int a[5]={ 1,2,3};A.O B. 1 C.2 D. 3(7)若有以下定义,则对a数组元素正确的引用是( )〇float a[2][3]={ 1,2,3,4,5,6};A. a[l] B. a[0][3] C. a⑵⑵ D.a[l][l](8)若有以下定义,则数组元素b[2][2]的值是( )〇intb[][3]={{l},{2,3},{4,5,6},{7});A. 0 B. 3 C. 5 D. 6(9)下列对字符数组s初始化错误的是( )〇A. char s[5]={Habcn}; B. char s[5]={ V, V};C. char s[5]= n n; D. char s[5]=',abcdeu;(10)对两个数组a和b进行初始化:char a[ ]=nabcden;B. a与b长度相同char b[ ]= {fa', 'b\ 'c','d\ 'e'}; 则下列叙述正确的是( )。 A . a与b完全相同C. a与b中都存放字符D. a数组比b数组长度长D. 8D. 123ABCde(11)若有以下定义,则对字符串的操作错误的是( )char s[10]= ,'program,,,t[ ]= "testn;A. strcpy(s,t) B. cout«strlen(s);C. strcat(s,t) D. cin»t;(12)下列程序的运行结果是( )A.O B.6 C.7#include 2)定义ー个整型的二维数组,每个数组元素的赋值规则为:行下标值加上列下标值3)定义一个整型的二维数组,要求使用二重循环将每个数组元素都赋值为24)统计输入字符串中数字,字母和其它字符的个数5)从键盘上任意输入15个数,找出其中的最大数及其位置6)从键盘上任意输入15个数,按照从大到小的顺序输出(7)从键盘上任意输入15个小写字母,变成大写字母后按反序输出8) Erarosthenes法求100以内的所有素数,按从小到大依次排列所谓Erarosthenes 法:1不是素数,除去它:2是素数,则它的倍数不是素数,去掉它们:3是素数,则它的 倍数不是素数,去掉它们依次类推,直到所给定的数9)打印如下图形参考答案:(1) #include 结束:“;cin»s;while(s[i]!=W){if(s[i]>=,0,&&s[i]<=,9t) digit++;else if(s[i]>='a"&&s[i]<=,z,lls[i]>=,A,&&s[i]<='Z,) letters++;elseother++;i++;1coutvv”数字个数为:"vvdigitvvendl;coutvv”字符个数为:u«letters«endl;cout< v"其他字符:" < 表示该元素不是素数 inti;for (i=l;i<=N;i++)a[i]=l;i=l;while((i<=N)&&(a[i]=1)){if(i=l)a[i]=0;//l不是素数else(int j=i+l;while(j<=N)(if(j%i=O)a[j]=O;j++;)i++; coutvv”输出100以内的素数:"vvendl;for(i=l;i<=N;i++)if(a[i]=l)cout«i«'\t';cout«endl;)(9) #include include