面向对象程序设计C 文件管理序列号:[K8UY-K9IO69-O6M243-OL889-F88688]
学习中心/函授站_ 潍坊学习中心
姓名杜君学号
西安电子科技大学网络与继续教育学院
2015学年上学期
《面向对象程序设计(C++)》期末考试试题
(综合大作业)
考试说明:
1、大作业于2015年4月3日公布,2015年5月9日前在线提交;
2、考试必须独立完成,如发现抄袭、雷同、拷贝均按零分计。
一、简答题(10分)
1.1(3分)C++提供了哪些循环语句?它们各自的特点是什么?
解答:C++提供了三种循环语句for、while和do-while。
while循环语句先判断是否满足循环条件,如果满足循环条件,则执行一次循环体,再判断是否执行下一次循环,否则退出循环。
do-while循环语句先执行一次循环体后再判断是继续执行循环体还是退出循环。
for循环先设置循环变量的初值,再判断是执行循环体还是退出循环体。如果执行了循环体,再改变循环变量值后,判断是执行下一次循环体还是退出循环,依此类推。
1.2(3分)在C++中什么可以充当友元?友元是否可以继承,为什么?
解答:在C++中函数和类都可以充当友元,分别称为友元函数和友元类。
友元不可以继承,因为友元不是类的成员。
1.3(4分)若派生类以private方式从一个基类派生,派生类的对象可以访问基类中的那些成员?派生类的成员函数可以访问基类中的那些成员?
解答:若派生类以private方式从一个基类派生,派生类的对象不能访问基类中的任何成员;派生类的成员函数可以访问基类中的public和protected成员。
二、填空题(每空1分,共20分)
2.1 break语句在循环结构中的功能是退出其所在的循环,continue 语句的功能是结束本次循环。
2.2有一段程序为:while (表达式)
语句1 语句2
……
当表达式的值为非0时,执行执行循环体一次;当表达式为0时,执行退出while循环。
2.3 使用关键字 inline 说明的函数称为内联函数。编译时,源程序中所有对该函数的调用被替换为此函数的定义
2.4数组名代表的是该数组的首地址;数组元素作为函数
2.5在C++中,类A的每一个非静态成员函数都有一个隐藏的指针类型的形参this,它指向当前正在操作的对象,其类型为A* const。
2.6 C++语言引入了异常处理机制,用throw语句“抛出”异常,然后用相应的语句catch 捕获被“抛出”的异常,并做出相应的处理。
2.7在C++语言中,用 new 表达式来创建动态的类对象;用delete 表达式释放动态类对象。
2.8 C++支持两种类型的多态,编译时多态和运行时多态。运行时多态是通过虚函数来实现的,编译时多态多态是通过函数重载来实现的。
2.9 纯虚函数就是没有函数体的虚函数,包含纯虚函数的类称为抽象类。
2.10在某些应用中,需要程序中属于某个类的所有对象共享某个数据。在C++语言中,为了不破坏数据的封装性,需将所要共享的数据说明为类的私有成员,即用关键字_ private ____说明的类成员。
三、选择题(每题2分,共20分)
3.1在下列给字符数组赋值语句中, A 是错误的。已知,char s[5]。
A.s[0] = 'm'; B.s[5] = 'n'; C.s[1] = 'a'; D.s[2] = 'b';
3.2下列对结构变量赋值的描述中, C 是错误的。
A.结构变量可以使用初始值表对它初始化
B.可以给一个结构变量的各个成员赋值
C.可将任意已知的结构变量名赋给一个结构变量
D.可将一个已知结构变量名赋给相同结构类型的另一个结构变量
3.3下列if语句中,条件为真的语句是 B 。
A.if(0) B.if(3) C.bool bFlag = ture; if(!bFlag)
D.if(a)
3.4若i的初值为1, B 能输出1到10的整数。
A.if(i++ < 10) cout << i; B.do cout << i; while(++i <= 10);
C. while(i++ < 10) cout << i; D.switch(++i <= 10) cout << i;
3.5在下面的程序中,若实参a与形参x以引用传递的方式传递信息,实参b与形参y以值传递的方式传递信息,那么从函数compute返回主程序后,a和b的值分别为 A 。
Main Program void compute(x, y)
A
12 D.1和12
3.6下列关于运算符重载的描述中, B 是正确的。
A.运算符重载可改变其优先级B.运算符重载不改变其语法结构
C.运算符重载可改变其结合性D.运算符重载可改变其操作数的个数
3.7 为了使类中的成员能够被类的对象通过成员运算符访问,则应该把成员的访问权限定义为 A 。
A.public B.protected C.private D.packaged
3.8 假设A是一个类,那么执行语句“A a, b(3), *p;”,调用了
C 次构造函数。
A.2 B.3 C.4 D.5
3.9 假设类AB用成员函数的方式重载加法运算符,以实现两个AB
类对象的加法,并返回相加的结果,则该成员函数的声明为
B 。
A.AB operator + (AB &a, AB &B); B.AB operator +
(AB&);
C.operator + (AB a); D.AB & operator + ();
3.10 下列对C++中静态数据成员的描述中,正确的是 A 。
A.静态数据成员是类的所有对象共享的数据
B.类的每个对象都有自己的静态数据成员
C.类的不同对象有不同的静态数据成员值
D.静态数据成员不能通过类的对象来调用
四、读程题(每题5分,共20分)
4.1给出下列源程序的输出结果。
#include
int add(int *x, int n) {
int sum , i;
for(sum = 0, i = 0; i < n; i++) sum += *(x+i);
return sum;
}
void main(){
int arr[] = {1, 3, 5, 7}; cout << add(arr, 4) << endl;
}
解:第一个调用 add(int) 返回 4+1 = 5 第二个调用 add(int,int) 返回 4 + 5 = 9
4.2 指出下列类定义中的3处错误。
#include
class A {
public:
A() { a1 = a2 = 0; cout << "Default constructor called.\n"; }
A(int i, int j) {
a1 = i; a2 = j; cout << "Constructor called.\n";
}
void print() {
cout << "a1 = " << a1 <<" , " << "a2 = " << a2 << endl;
}
private:
int a1, a2;
};
void main() {
A x, y(3,9);
x.print();
y.print();
}
解:<:print1();不要class ;endl:,要返回类型{
A:
void print2();good"主义class只在定义时用; class B;不要class
}:public A
{
public#include<
};iostream>:
void print1()
{
cout<
//
}
};"/
using namespace std:print2() /:;
class A
{
public; /,其他不要用
void B;
boy.print2();<
void main()
{
B boy
4.3 给出下述源程序的运行结果。
#include
#include
struct Student {
char *name;
double score;
}*p;
void main() {
Student s1;
p = &s1;
p->name = (char *)new char[50];
p->score = 95.5;
strcpy(p->name, "Ma ping");
cout << p->name << ',' << (*p).score << endl;
}
解:
输出的是Ma ping 95.5
4.4 给出下述源程序的运行结果并说明该程序的功能。
#include
int add(int a, int b = 5);
void main()
{ int m = 5;
cout << "sum1 = " << add(m) << endl;
cout << "sum2 = " << add(m, add(m)) << endl;
cout << "sum3 = " << add(m, add(m, add(m))) << endl;
}
int add(int x, int y)
{ return x + y; }
sum1 = 10
sum2 = 15
sum3 = 20
解:void main(void)
{
cout< //在m(::c+=a+b+c)调用中,::c为全局c, a+b+c中的c为局部c } 五、编程题(每题15分,共30分) 5.1有n个整数已按由小到大的顺序排列好,要求输入一个整数,把它插入到原有数列中,而且仍然保持有序,同时输出新的数列。(插入时应考虑到插入的数的各种可能性,比所有的数都小;比所有的数都大;在最大数和最小数之间) 解:printf(",8.h>%d ",n;k;),a[i]);11,6;i++){ k=i; for(i=0;i< int main(){ int a[11]={0:\stdio;i< if(n< } } for(i=0;\10; a[k]=n;i++) printf(",3;i>,4;;,&n),7;%d" break#include< printf(",9; scanf("i--) a[i]=a[i-1];a[i]){ for(i=10;n"请输入N值,2; int i,k,10},5; return 0;n") 5.2 利用运算符重载,定义复数类的加法与减法,使之能够执行下列运算。 解:Complex a(4.0, 6), b(7.4, 2), c(0, 0); c = a + b; c = 4.1 + a; c = b + 2.3; #include #include using namespace std; class Complex { public: Complex() { real=0.0; imag=0.0; } Complex(float r,float i) { real=r; imag=i; } Complex operator+(Complex &); Complex operator-(Complex &); Complex operator+(float); friend Complex operator-(float,Complex &); friend Complex operator+(float,Complex &); Complex operator-(float); void print() { if(real>0) cout< else if(real<0) cout< else cout< } private: float real; float imag; }; Complex Complex::operator+(Complex &c2) { Complex c; c.real=real+c2.real; c.imag=imag+c2.imag; return c; } Complex Complex::operator+(float c1) { Complex c; c.real=c1+real; c.imag=imag; return c; } Complex operator+(float c1,Complex &c2) { Complex c; c.real=c2.real+c1; c.imag=c2.imag; return c; } Complex Complex::operator-(Complex &c2) { Complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return c; } Complex operator-(float c1,Complex &c2) { Complex c; c.real=c1-c2.real; c.imag=-c2.imag; return c; } Complex Complex::operator-(float c2) { Complex c; c.real=real-c2; c.imag=imag; return c; } int main() { Complex a(2,5),b(7,8),c; c=a+b; c.print(); c=4.1+b; c.print(); c=a-8; c.print(); c=a+3.3; c.print(); c=4-b; c.print(); return 0; }