问题 问答题

[说明] C++语言本身不提供对数组下标越界的判断。为了解决这一问题,在以下[C++程序]中定义了相应的类模板,使得对于任意类型的二维数组,可以在访问数组元素的同时,对行下标和列下标进行越界判断,并给出相应的提示信息。 [C++程序] #include <iostream.h> template <class T> class Array; template <Class T> class ArrayBody { friend (1) ; T* tpBody; int iRows,iColumns, iCurrentRow; ArrayBody(int IRsz, int iCsz) { tpBody = (2) ; iRows = iRsz; iColumns = iCsz;iCurrentRow = -1; } Public: T& operator[] (int j) { bool row_error, column_error; row_error = column_error =false; try { if (iCurrentRow < 0 || iCurrentRow >= iRows) row_error = true; if (j<0 || j>= iColumns) column_error = true; if (row_error == true || column_error == true) (3) ; } catch(char){ if (row_error == true) cerr << "行下标越界[" << iCurrentRow << "]"; if (column_error = true) cerr << "列下标越界[" << j << "]"; cout << "\n"; } return tpBody[iCurrentRow * iColumns + j]; } ~Arraygody(){delete[]tpBody;} }; template <class T> class Array { ArrayBody<T> tBody; Public; ArrayBody<T> & operator[] (int i) { (4) ; return tBody; } Array(int iRsz, int iCsz) : (5) { } }; void main() { Array<int> a1(10,20); Array<double> a2(3,5); int b1; double b2; b1 = a1[-5][10]; //有越界提示:行下标越界[-5] b1 = a1[10][15]; //有越界提示:行下标越界[10] b1 = a1[1][4]; //没有越界提示 b2 = a2[2][6]; //有越界提示:列下标越界[6] b2 = a2[10][20]; //有越界提示:行下标越界[10]列下标越界[20] b2 = a2[1][4]; //没有越界提示 }

答案

参考答案:

解析:这是一道要求读者掌握类模板和友元的使用方法的程序设计题。本题的解答思路如下。 模板可以实现逻辑相同、数据类型不同的程序代码的复制,模板机制可以减轻编程和维护的工作量和难度。模板可以分为函数模板和类模板。类模板的一般定义形式为: template<类型形参表>class类名{类声明体} 在所有出现类模板的地方不能直接用类名表示,需要加上<类型形参表>。 友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明。为了与该类的成员函数加以区别,说明时在前面加上关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 友元可以是一个函数,该函数被称为友元函数。友元也可以是一个类,该类被称为友元类。 本试题中,(1)空缺处的前面是友元关键字friend,但程序中没有独立的函数,所以只能是另一个模板类Array,即(1)空缺处所填写的内容是“class Array<T>”。 在类模板ArrayBody的定义中,声明了成员变量“T tpBody”,且在析构函数中有“delete[]tpBody;”。由于在C++中,delete总是和new成对出现的,因此(2)空缺处应该使用new对tpBody进行初始化。通过程序中“return tpBody[iCurrentRow*iColumns+i];”语句可知,该题中采用的是以一维数组来模拟二维数组的创建。在构造函数有两个参数,分别为行数和列数。因此(2)空缺处所填写的内容是“new T[iRsz*iCsz]”。 (3)空缺处所在的语句前后有try{...}和catch{...}语句序列,这是C++中典型的异常处理搭配语句。因为(3)空缺处所在的语句前面已进行了如下处理,当有行下标越界时,置row_error=true;当有列下标越界时,置column_error=true。(3)空缺处前面的判断是“row_error==true||column_error==tree”,即只要有行下标越界或是列下标越界就执行(3)空缺处的语句。而错误处理语句已放在catch中予以处理。catch是当正常程序段发生异常时才执行的,并且程序中指明了是catch(char),所以只要在(3)空缺处抛出一个catch异常,即可进行错误处理。故(3)空缺处所填写的语句是“throw,’e’”,其中throw之后可以填写任意的字符常数。 对于Array类中的(4)、(5)空缺处所填写的内容。首先看(5)空缺处,该空缺处显然是进行变量赋初值等相关的初始化工作。而Array类只有一个成员变量tBody,且tBody是ArrayBody类型的ArrayBody的构造函数需要传递两个参数,分别代表数组的行和列,因此(5)空缺处应填入“tBody(iRsz,iCsz)”。 通过main函数中对a1和a2的实例化,就可大致了解整个程序。在main函数中实例化Array,而在类 Array的构造函数对tBody这个变量进行实例化。此时就以一维数组的形式创建了二维数组。在类Array中[]运算符重载函数中返回了一个ArrayBody类,而在ArrayBody也存在着[]运算符重载函数,并且在ArrayBody的重载函数中对行下标和列下标同时进行了检查,且返回了一个T类型。对Array<int>来说,就是返回了int,即数组的一个元素。通过对类ArrayBody的观察发现,在整个ArrayBody中并没有任何地方对iCurrentRow进行赋值,而在ArrayBody的[]运算符重载中却利用其对数组行下标进行判断,而数组的行下标只在Array的[]运算符重载中出现,那(4)空缺处就应该是对类ArrayBody 的成员变量iCurrentRow进行赋值,本题的该空缺处所填入的内容是“tBody.iCurrentRow=i”。

口语交际,情景问答题

材料概括分析题(15分)    

阅读下面的材料,完成5-6题。

从时间上看。传统并非是已成过去的事实,传统反映的是一种文化上的承传,那种跨越过去、现在也伸向未来的内在精神性因素;今天我们咀嚼传统,也并不是为了发思古之幽情,去追忆既往的斑斑陈迹,而是为了解读我们身上所携带的文化基因,从而获得继续前行所需的智慧力量。人事有代谢,往来成古今,每个人都是历史驿站的过客,当我们在这个驿站打量着眼前景色的时候,我们看到的是一脉时间的流,那种连着过去、现在和未来的时间的流。传统的精神内核在一个“传”上,就像禅宗中所说的灯录一样,灯灯相连,   光光无限,构成了一个明亮的世界。只要你是一个“客”,你就无法游离于这时间的流之外。与其只是茫然地随着这流沉浮,还不如俯下身来,在那时间的汀渚上,拈几片贝壳,去做装点意识宫殿的陈设,采几株芦苇,去做打通天地的智慧灵根。

虽然我们目光盯住中国文化的精华。但要点并不在知识的累积,我们兴趣点在于其中的处世智慧、做人品格,在于其中含有的人生意趣,还有那些和今天的我们仍然息息相通的精神气质,我们将这些活的精神称为精华。应该说这是一种活的精华。我们的选择和解读意在帮助读者领略:孔子如何将我们从卑俗的小我引向理想国,庄子怎样将我们从狭隘的江河带向茫茫的大海,李白的狂放中孕育着怎样的潇洒不凡,杜甫的低昂中包含着几多的沉着痛快,孙子的兵法中显示出多么机敏的做人功夫,孔明韬略中透露出多么博大的胸襟……我们读它们,就是读其中和我们相通的性灵。

5.根据上文,谈谈如何才能利用中国文化的精华来“装点意识宫殿”,获得“打通天地的智慧”?(6分)(不超过70字)

答:                                                                                                                                                  

6.你认为在弘扬中国传统文化方面我们应该做哪些具体的工作?(9分)

答:     

判断题