一 读程序, 写结果 ( 每题 4 分, 共 40 分 ) 1. 写出下列程序运行结果 class test friend test operator+(const test &p1, const test &p2) return test(p1.data1 + p2.data1, p1.data2 + p2.data2); friend ostream &operator<<(ostream &os, const test &obj) os << obj.data1 << '\t' << obj.data2 << endl; return os; private: int data1; double data2; 上海交通大学试卷 ( 2017 至 2018 学年第 _ 一 _ 学期 ) 班级号 学号 姓名 课程名称 成绩 ; test(int d1 = 0,double d2=0) data1 = d1; data2 = d2; test t1(3,1.9), t2(4), t3; cout << t1 << t2 << t3; cout << t1 + t2 + 1 << endl; 第 1 页共 14 页
我承诺, 我将严格遵守考试纪律 承诺人 : 题号得分批阅人 ( 流水阅卷教师签名处 ) 2. 请写出下列程序运行结果 class test friend void print(const test &obj) cout << obj.data2 << endl; friend test &get(test &obj) test *p = new test(obj); return *p; int data1; char *data2; test(const char *s1= NULL) data1 = strlen(s1); data2 = new char[data1+1]; strcpy(data2, s1); test(const test &s1) if (s1.data1 <= 2) data1 = s1.data1; data2 = new char[data1+1]; strcpy(data2, s1.data2); else data1 = s1.data1-2; data2 = new char[data1+1]; strcpy(data2, s1.data2+2); ~test() delete data2; ; test a( abcde ); test b = a; test &c = a; print(a); print(b); print(get(a)); print(c); 第 2 页共 14 页
3. 写出下列程序的执行结果 class outofrange ; template <class T, int N> class Sample T data[n]; Sample() for (int i = 0; i < N; ++i) data[i] = T(i); Sample(T x[]) for (int i = 0; i < N; ++i) data[i] = x[i]; Sample &operator++() for (int i = 0; i < N; ++i) ++data[i]; return *this; T &operator[](int n) if ( n < 0 n >= N) throw outofrange(); else return data[n]; void disp() const for (int i = 0; i < N; ++i) cout << setfill ('#') << setw(4) << data[i]; cout << endl; operator T() const T sum = 0; for (int i = 0; i < N; ++i) sum += data[i]; return sum; ; char *s = abcde ; Sample<double, 5> s3; Sample<char, 5> ss(s); try ++ss; ss.disp(); s3.disp(); cout << s3 << endl; s3[5] = 8.9; s3.disp(); catch (outofrange) cout << " 下标越界 " << endl; 第 3 页共 14 页
4. 写出以下程序的执行结果 class base char data; base(char n = '0' ): data(n) base &operator++() ++data; return *this; virtual void f1(int n) data += n; virtual void f2(int n) data -= n; void print() const cout << data << " "; ; class d1 : public base int data; d1(int n1 ): base(n1 + 'a'), data(n1) d1 &operator++() ++data; return *this; void f1() ++data; void f2(int d) data -= d; void print() const base::print(); cout << data << endl; ; d1 obj1(4); base *bp = &obj1; ++obj1; obj1.print(); bp->f1(1); bp->print(); bp->f2(1); obj1.print(); ++(*bp); obj1.print(); 5. 请指出下面程序中的四个错误, 并说明原因 class test static int cnt1; const int cond; int data; test(int n1=0, int n2 = 0) data = n1; cond = n2; ++cnt1; static void print() cout << cnt1 << cond << endl; bool check() return data == 0; void display() const cout <<data<< " "<< cnt1 << " " << cond <<endl; ; void f(const test &obj) obj.display(); if (obj.check()) cout << true ; else cout << false ; 第 4 页共 14 页
test a(10); f(a); test::print(); 6. 请指出下面程序中的四个错误, 并说明原因 class test friend test operator+(const test &p1, const test &p2) return test(p1.data1 + p2.data1, *(p1.data2) + *(p2.data2)); friend ostream &operator<<(ostream &os, const test &obj) os << obj.data1 << '\t' << *(obj.data2) << endl; return os; private: int data1; double *data2; test(int d1 = 0,double d2=0) data1 = d1; data2 = new double(d2); operator double() const return data1 + *data2; ; test t1(3,1.9), t2(4,2.3), t3; t3 += t1; cout << t3 << endl; cout << t2 + 1 << endl; cout << t2-1 << endl; cout << t2 % 3 << endl; 第 5 页共 14 页
7. 写出下面程序的执行结果 class base friend ostream &operator<<(ostream &os, const base &obj) os << obj.data << ; return os; char data; base(char n = '0' ): data(n) base &operator++() ++data; return *this; virtual void print() const cout << data << " "; ~base() cout << 析构 base << endl; ; class d1 : public base int data; d1(int n1 ): base(n1 + 'a'), data(n1) d1 &operator++() ++data; return *this; void print() const base::print(); cout << data << endl; ~d1() cout << 析构 d1 << endl; ; base *f1(base &obj) ++obj; return &obj; d1 obj1(2); base *bp = new d1(4) ; f1(obj1)->print(); f1(*bp)->print(); delete bp; 第 6 页共 14 页
8. 写出下列程序的执行结果 假设 short 占 2 个字节,double 占 4 个字节, 内存地址用 4 个字节表示 template <class T> void fun(t s[], int size, T &sum1, T &sum2 ) if (size == 0) return; if (size == 1) sum1 += s[0]; return; sum1 += s[0]; sum2 += s[1]; fun(s+2, size-2, sum1, sum2); short a[] = 1,2,3,4,5,6,7,8,9, *p = a ; short b[] = 1,3,5,7,9,11; short sum1 = 0, sum2 = 0; double c[] = 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8; double sumd1 = 0, sumd2 = 0; fun(b, 6, sum1, sum2); cout << sum1 << << sum2 << endl; sum1 = sum2 = 0; fun(a, sizeof(a)/sizeof(short), sum1, sum2); cout << sum1 << << sum2 << endl; sum1 = sum2 = 0; fun(p, sizeof(p)/sizeof(short), sum1, sum2); cout << sum1 << << sum2 << endl; fun(c, sizeof(c)/sizeof(double), sumd1, sumd2); cout << sumd1 << << sumd2 << endl; 第 7 页共 14 页
9. 写出以下程序的输出结果 #include <iostream> #include <fstream> using namespace std; int main( ) int tmp, i; ofstream f1("file1"); ifstream f2; for (i = 1; i <= 5; ++i) f1.write(reinterpret_cast<const char *>( &i), sizeof(int)); f1.close(); f2.open("file1"); f2.read(reinterpret_cast<char *>( &i), sizeof(int)); cout << i << endl; f2.seekg(sizeof(int), ios::cur); f2.read(reinterpret_cast<char *> (&i), sizeof(int)); cout << i << endl; f2.close(); f1.open("file2"); for (int i = 1; i <= 5; ++i) f1 << i << ' '; f1.close(); f2.open("file2"); f2.seekg(2); f2 >> i; cout << i << endl; f2.seekg(6); f2 >> i; cout << i << endl; f2.close(); 第 8 页共 14 页
10. 写出下面程序的执行结果 class test protected: int data; test(int d = 10) data = d; virtual void print() const cout << data << endl; virtual ~test() cout << data << " 析构 test\n"; ; class test1:public test char *data1; test1():test(5) data1 = new char[6]; strcpy(data1, "abcde"); test1(const char *s):test(strlen(s)) data1 = new char[strlen(s)+1]; strcpy(data1,s); test1 &operator=(const test1 &obj) if (&obj == this) return *this; data = obj.data; data1 = new char[data+1]; strcpy(data1,obj.data1); return *this; void print() const cout << data << " " << data1 << endl; ~test1() cout << data1 << " 析? 构 1\n"; delete data1; ; void f(test *tp) tp->print(); delete tp; test1 *tp1 = new test1("12345"); test &tt = *tp1; tp1->print(); tt.print(); f(tp1); 第 9 页共 14 页
二 程序填空 ( 每空 2 分, 共 20 分 ) 1. 以下是直接选择排序的递归实现, 请填空 template <class T> void Sort(T a[], int size) int min = 0; T tmp; if ( ) ; for (int k = 0; k < size; ++k) if (a[k] < min]) ; ; tmp = a[0]; a[0] = a[min]; a[min] = tmp; Sort(, ); 第 10 页共 14 页
2. 下面程序计算一组整数的和 这组整数可以是十进制 八进制或十六进制 如果程序的可执行文件名为 calc, 则在命令行界面可以输入 calc 12 012 0x12 计算 12 + 012 + 0x12 的结果, 程序将输出 40 int convert(const char *s) int d = 0; int flag; if (*s == '0') ++s; if (*s == 'x') flag = 16; ++s; else flag =8; else flag = 10; switch (flag) case 10: for (; *s; ++s) ; break; case 8: for (; *s; ++s) break; case 16: for (; *s; ++s) ; return d; int main( ) int sum = 0; for ( ) sum += convert(argv[i]); cout << sum << endl; 第 11 页共 14 页
四. 编程 ( 共 40 分 ) 1.(10 分 ) 以下是一个有 row 行 col 列的二维的整型数组类的定义及使用, 请将类定义补充 完整 class Matrix int *data; int row, col; ; Matrix b(3, 4), c; for (int i = 0; i < 3; ++i) for (int j = 0; j < 4; ++j) b[i][j] = i * j; c= b; for (int i = 0; i < 3; ++i) cout << endl; for (int j = 0; j < 4; ++j) cout << c[i][j] <<'\t'; Matrix d = c; for (int i = 0; i < 3; ++i) cout << endl; for (int j = 0; j < 4; ++j) cout << d[i][j] <<'\t'; 第 12 页共 14 页
2. (20 分 ) 以下是一个不带头结点的整型单链表类的定义 请实现其中的构造函数和析构 函数 在此单链表类的基础上派生一个整型队列类 queue 队列用于模拟现实生活中的排 队 新加入队列者只能排在队尾, 离开队列者只能是排在最前面的元素 队列的行为有 : Enqueue: 将元素 x 插入队列 Dequeue: 删除排在最前面的元素 Head: 返回最前面的元素值 isempty: 判队列空 class list protected: struct node int data; node next; ; ; node *head; list(); ~list(); 第 13 页共 14 页
3. (10 分 ) 硬币找零问题 对于给定的零钱, 找出所需的最少硬币数及每个硬币的个数 设计一个函数 int coin(int diffcoin[], int diffcoinnum, int change, int coinused[]) 函数的返回值是所需的最少硬币数, 函数参数的含义是 : diffcoin: 硬币的币值 diffcoinnum: 不同硬币数, 即数组 diffcoin 的规模 change: 所需找零的零钱 coinused: 最优方案中所用的每个硬币的个数如果 diffcoin 的值是 :1 5 10 20 21 25, 则调用 coin(diffcoin, 6, 64,coinUsed) 的返回值是 4, 数组 coinused 的内容是 :1 0 0 0 3 0, 表示用了一个 1 分的硬币和 3 个 21 分的硬币 要求 : (1) 写出所用的算法设计思想, 即采用枚举法 贪婪法 分治法 动态规划 还是回溯法 (2) 描述你的算法过程 (3) 写出完整的 C++ 函数 第 14 页共 14 页