问答题

[说明]
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]; //没有越界提示

【参考答案】

这是一道要求读者掌握类模板和友元的使用方法的程序设计题。本题的解答思路如下。
模板可以实现逻辑相同、数据类型不......

(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)
热门 试题

问答题
制订标准书号的目的是实现图书的国际统一编码,以便于实现计算机化的图书管理,使出版社内的医书管理、书库中的图书管理及书店的图书销售管理具有更高的工作效率和管理水平。标准书号由“ISBN”, 10个数字(0-9)组成,采用“ISBN 组号—出版者号—书名号—校验码”的格式。其中,出版者号规定为 2-7位数字。对较大的出版社分配比较短的码,留出较长的书名号为更多的书进行编码。 标准书号的最后一位是校验码。设置校验码可以大大减少录入错误造成的管理混乱。校验码一般由计算机程序产生。当操作人员录入前9个数字后,计算机就会自动启动计算校验码的过程,输出正确的校验码。在书店(或书库),不论是建库还是查询检索,在手工输入带校验码的标准书号后,计算机就会自动启动校验过程,判断是否输入错误。 在图3-17计算校验码的过程中,首先要计算部分S值,即S=10*a(1)十9*a(2)+8*a(3)+…+2*a (9)。此时需要使用循环处理。在循环开始之前,应设置初始值S=0。在循环体内,应执行语句“S+=(11-I) *a(I)”或“S+=(1+I)*a(10-I)”(注意,其中的乘号“*”不要丢失)。该循环应对循环变量I=1~9进行(步长默认为1)控制,因此,(2)空缺处应填入“9”,(3)空缺处所填写的内容是“S+(11-I)*a[I]->S”或“S+(1+I)*a(10-I)->S”。 接着再计算该S值除以11的余数R。显然0≤R≤10。 由于“校验码a(10)的设置应使 S=10*a(1)+9*a(2)+8*a(3)…+1*a(10)能被11整除”,即余数R与校验码之和应能被11整除,因此校验码应等于MOD(11-R,11),即(4)空缺处所填写的内容是“MOD(11-R,11)”。若读者在该空缺处填写“MOD(11-R)”,则是没有考虑R=0这一情况。当校验码等于10时,还应以符号×表示。 在对标准书号的校验过程(图3-16)中,首先要将校验码为×的情况转换成数据10,以便于后续计算。为了计算S=10*a(1)+9*a(2)+8*a(3)+…+1*a(10),需要使用循环处理。在循环开始之前,应设置初始值S=0,循环变量I从1到10(步长默认为1)。在循环体内,应执行语句“S+=(11-I)*a(1)”或“S+=I*a(11 -I)”。因此(1)空缺处所填写的内容是“(11-I)*a(I)”或“I*a(11-I)”。 在图3-16中,计算出S值之后,还应判断S除以11的余数是否为0。若余数为0,说明S能够被11整除,表示校验结果正确;若余数不为0,则说明输入的标准书号有错(可能是校验码输入有错,也可能是前面的数字输入有错)。。此时计算机应输出相应的错误提示信息,提醒信息录入人员仔细校对改正。