问答题
请使用VC6或使用[答题]菜单打开考生文件夹proj3下的工程prog3,其中声明了ValArray类,该类在内部维护一个动态分配的int型数组v。ValArray类的成员函数cycle用于对数组元素进行向左循环移动。调用一次cycle后,数组的第二个元素至最后一个元素都将向左移动一个位置,而最左端的元素将循环移动到最右端位置上。例如,若ValArray表示的数组为{1,2,3,4,5},则第一次调用cycle后,数组变为{2,3,4,5,1},第二次调用cycle后,数组变为{3,4,5,1,2},依次类推。请编写成员函数cycle。在main函数中给出了一组测试数据,此情况下程序的输出应该是:
v={1,2,3,4,5}
v={2,3,4,5,1}
v={3,4,5,1,2}
v={4,5,1,2,3}
v={5,1,2,3,4}
要求:
补充编制的内容写在“//********333********”与“//********666********”之间,不得修改程序的其他部分。
注意:程序最后将结果输出到文件out.dat中。输出函数writeToFile已经编译为obj文件,并且在本程序中调用。
//ValArray.h
#include <iostream>
using namespace std;
class ValArray {
int* v;
int size;
public:
ValArray const int* p, int n): size (n)
{
v = new int[size];
for (int i = 0; i<size; i++)
v[i] = p[i];
}
~ValArray() { delete [] v; }
void cycle ();
void print(ostream& out) const
{
out << '{';
for (int i = 0; i <size-1; i++)
out << v[i] << ",";
out << v[size-1] << '}';
}
};
void writeToFile (const char * );
//main. cpp
#include "ValArray. h"
void ValArray::cycle ()
{
//将数组v中的size个整数依次移动到它的前一个单元,其中第一个整数移到原来最后元素所在单元。
//******** 333********
//******** 666********
}
int main ( )
{
const int a[] = {1, 2, 3, 4, 5 };
ValArray v(a, 5);
for (int i = 0; i < 5; i++) {
cout << "v = ";
v.print (cout);
cout << endl;
v.cycle();
}
writeToFile ("");
return 0;
}
【正确答案】for(int i=0; i<size-1; i++) //从0到size~2遍历整数组v,把前位与后位值相互交换
{
int temp=v[i]; //把v[i]赋值给temp
v[i]=v[i+1]; //把v[i+1]赋值给v[i]
v[i+1]=temp; //temp赋值给v[i+1]
}
【答案解析】[考点] 本题考查ValArray类,其中涉及动态数组、构造函数、析构函数、const函数和成员函数。
[解析] 程序要将数组v中的size个整数依次移动到它的前一个单元,其中第一个整数移到原来最后元素所在的单元。for循环语句用于遍历整个数组,每循环一次便将当前元素与后一个元素互换,因此循环变量的取值范围是0~size-2,最后一个元素无须遍历。