上海大学级C试题
2023-05-02
来源:好走旅游网
上海大学2014~2015学年度秋季学期试卷(A卷) 成 绩 课程名: 面向对象程序设计 课程号: 08305121 学分: 5 应试人声明: 我保证遵守《上海大学学生手册》中的《上海大学考场规则》,如有考试违纪、作弊行为,愿意接受《上海大学学生考试违纪、作弊行为界定及处分规定》的纪律处分。 应试人 应试人学号 应试人所在院系 题号 得分 一(20) 二(30) 三(25) 四(25) —————————————————————————————————————— 得 分 一、判断题(每小题2分,共20分) 1. 引用在声明时必须对其初始化,以绑定某个已经存在的变量(或对象), 在该引用的生命期内,该绑定不能被更改。 2. 指针变量在定义时必须对其初始化,以锁定某个已经存在的目标变量(或 对象),在该指针变量的生命期内,该指向不能被更改。 3. 值返回的函数(如:double sqrt(double);)的调用表达式(如: sqrt)代表一个无名的临时变量(或对象),一般不将其用作左值。 4. 引用返回的函数,可以返回该函数中值传递的形参变量(或对象)。 5. 任何类都有构造函数、复制构造函数、析构函数、赋值运算符函数。 (√) (×) (√) (×) (√) 6. 有静态数据成员的类,一般地应该考虑为其设计复制构造函数、析构函数。 (√) 7. 将用于输出的插入运算符函数operator<<设计成友元函数的根本原因是 因为进行输出操作时需要访问对象的内部数据成员。 8. 在C++程序中,操作符new的功能与calloc函数的功能完全一样。 9. 创建一个C++字符串对象(如:string str;),则sizeof(str)的值 等于()的值。其中成员函数length为返回字符串的长度。 10. 基类的私有数据成员在派生类中是存在的,但不可直接访问,需要用从基类 继承下来的函数访问。 (√) (×) (×) (×) 得 分 二、填空题(每空2分,共30分)如下设计了结点类Node、链表类LinkList,并将链表类作为结点类的友类,请根据运行结果,完成程序。 #include
using namespace std; class ① LinkList ; (7分)有关构造与析构的顺序 得 运行结果 #include 分 head -> 3 -> 7 -> 2 -> 1 -> NULL using namespace std; class Test head -> 3 -> 7 -> 2 -> 1 -> NULL { head -> NULL public: head -> 3 -> 7 -> 2 -> 1 -> NULL Test(int a=0, int b=0): x(a), y(b) {} ~Test() { if(x==y) cout << \"数据成员的值相同,都等于 \" << x << endl; else cout << \"数据成员的值不同,分别为 \" << x << \\" << y << endl; } friend ostream & operator<<(ostream &out, const Test &t) { out << \"(\" << << \ return out; } 运行结果(1) private: int x, y; (10, 0) }; (0, 0) int main() { (2, 3) Test *p, t1; 数据成员的值不同,分别为 10, 0 p = new Test(10); Test t2(2, 3); 退出程序,返回操作系统 cout << *p << '\\n' << t1 << '\\n' 数据成员的值不同,分别为 2, 3 << t2 << endl; delete p; 数据成员的值相同,都等于 0 cout << \"退出程序,返回操作系统\" << endl; return 0; } 2. 以下两小题所涉及的类设计,头文件如下。 // #include #include using namespace std; class BASE { public: BASE(double x=0, double y=0): _x(x), _y(y) {} virtual void Show(ostream &out) const = 0; protected: double _x, _y; }; ostream & operator<<(ostream &out, const BASE &x) { (out); return out; } class Complex : public BASE { public: Complex(double x=0, double y=0): BASE(x, y) { } void Show(ostream &out) const { if(_x!=0) { out << _x; if(_y>0) out << '+' << _y << 'i'; else if(_y<0) out << '-' << -_y << 'i'; } else { if(_y!=0) cout << _y << 'i'; else cout << _x; } } friend Complex operator+(const Complex &a, const Complex &b) { Complex c; = + ; = + ; return c; } friend Complex operator*(const Complex &a, const Complex &b) { Complex c; = * - *; = * + *; return c; } double abs() { return sqrt(_x*_x + _y*_y); } }; class Point : public BASE { public: Point(double x=0, double y=0): BASE(x, y) { } void Show(ostream &out) const { out << '(' << _x << \ } friend Point operator+(const Point &a, const Point &b) { Point c; = + ; = + ; return c; } }; (10分)测试程序 运行结果 #include \"\" int main() 1+2i { Complex x(1,2), y(3,4), z1(0,1), z2(10); 3+4i cout << x << '\\n' << y << '\\n' 1i << z1 << '\\n' << z2 << endl; 10 cout << \"(): \" << () << endl; z1 = x+y; (): 5 z2 = x*y; 4+6i cout << z1 << '\\n' << z2 << endl; Point a(1, 2), b(3, 4); -5+10i cout << a << '\\n' << b << endl; (1, 2) cout << a+b << endl; return 0; (3, 4) } (4, 6) (8分)测试程序 #include \"\" int main() { Complex x(1, 2), y, z; 运行结果 y = 5+x; z = 5*x; 1+2i cout << x <<'\\n'<< y <<'\\n'<< z << endl; 6+2i cout << x+x << endl; 5+10i 2+4i (1, 2) } Point a(1, 2), b, c; b = a + 1; c = 1 + a; cout << a <<'\\n'<< b <<'\\n'<< c << endl; a = a + a; cout << a+a << endl; return 0; 得 分 四、完成如下类的设计(25分)在GCC编译系统中,unsigned long long数据类型使整型数的取值范围得到扩展(0~2641,即0~18 446 744 073 709 551 615)。为了进一步扩展非负整数的取值范围设计了如下的类。该类数据可精确计算至2123,可处理36~37位非负十进制整数。请在类的声明体外实现5个尚未定义的成员函数或友元函数。最后写出程序的运行结果(每个函数定义4分,运行结果5分)。 // 头文件 #ifndef LLINT_H #define LLINT_H #include using namespace std; class LLINT { public: LLINT(unsigned long long x0=0, unsigned long long x1=0); // 第一参数为低位 LLINT(const char *str); LLINT & operator++(); LLINT operator++(int); friend LLINT operator+(const LLINT &x1, const LLINT &x2); LLINT & operator+=(const LLINT &x); friend ostream & operator<<(ostream &out, const LLINT &x); friend LLINT atoLLINT(const char *str); friend istream & operator>>(istream &in, LLINT &x); friend bool operator> (const LLINT &x1, const LLINT &x2); friend bool operator>=(const LLINT &x1, const LLINT &x2); friend bool operator< (const LLINT &x1, const LLINT &x2); friend bool operator<=(const LLINT &x1, const LLINT &x2); friend bool operator==(const LLINT &x1, const LLINT &x2); friend bool operator!=(const LLINT &x1, const LLINT &x2); protected: static const unsigned long long BBILLION; unsigned long long a1, a0; //a1*1 000 000 000 000 000 000 + a0可表示36~37位十进制非负整数 }; #endif // 源程序文件 #include \"\" #include const unsigned long long // 静态常量数据成员的定义及初始化(10^18) LLINT::LLINT(unsigned long long x0, unsigned long long x1) { // 构造函数 unsigned long long x = x0/BBILLION; a0 = x0 % BBILLION; a1 = x1 + x; } LLINT::LLINT(const char *str) // 转换构造函数(从C-字符串转换) { *this = atoLLINT(str); // 直接利用成员函数实现转换构造 } LLINT LLINT::operator++(int) // 后增量运算符函数 { LLINT temp(*this); ++(*this); return temp; } LLINT operator+(const LLINT &x1, const LLINT &x2) { LLINT s; unsigned long long c = + ; = c % LLINT::BBILLION; = + + c/LLINT::BBILLION; return s; } ostream & operator<<(ostream &out, const LLINT &x) { if!=0) out << << setfill('0')<>(istream &in, LLINT &x) { char str[200]; in >> str; x = atoLLINT(str); return in; } bool operator>(const LLINT &x1, const LLINT &x2) { if > return true; else if == return > ; else return false; } bool operator<(const LLINT &x1, const LLINT &x2) { if < return true; else if == return < ; else return false; } bool operator<=(const LLINT &x1, const LLINT &x2) { if < return true; else if == return <= ; else return false; } LLINT atoLLINT(const char *str) { LLINT x; int i, j=0, n; unsigned long long p0=1, p1=1; for(n=0; str[n]; n++) ; if(n==0) return x; for(i=n-1; i>=0; i--) { if('0'<=str[i] && str[i]<='9') { if(j<18) { += p0*(str[i]-'0'); p0 *= 10; } else if(j<36) { += p1*(str[i]-'0'); p1 *= 10; } j++; } } return x; } // 测试程序 #include \"\" int main() { } LLINT x(\"888 777 666 555 444 333 234 567 890 987 654 321 \"), y(100), z; cout << x << '\\n' << y << '\\n' << z << endl; z = \"999 999 999 999 999 999\"; cout << z++ << endl; cout << z << endl; return 0; 运行结果 // 请在类模板体外定义成员函数及友元函数。【提示】可充分利用已有的函数。 100 // ① (4分)前增量运算符函数重载 0 LLINT & LLINT::operator++() { } a0++; if(a0==BBILLION) { a0 = 0; a1++; } return *this; // ② (4分)加赋值运算符函数重载 LLINT & LLINT::operator+=(const LLINT &x) { *this = *this + x; return *this; } // ③ (4分)关系运算符(大于或等于)函数重载 bool operator>=(const LLINT &x1, const LLINT &x2) { if > return true; else if == return >= ; else return false; } // ④ (4分)关系运算符(等于)函数重载 bool operator==(const LLINT &x1, const LLINT &x2) { return == && ==; } // ⑤ (4分)关系运算符(不等于)函数重载 bool operator!=(const LLINT &x1, const LLINT &x2) { return != || !=; }