资源描述
东南大学08级C++(下)上机试卷A和答案解析
(考试时间80分钟,卷面成绩100分)
学号 姓名 机位号
说明:首先在Z盘建立一个以自己的学号命名的文件夹,用于存放上交的*.CPP文件,考试结束前根据机房要求,将这个文件夹传送到网络服务器上,注意:提交时只保留文件夹中的CPP文件。
一、改错题 (50分)
【要求】调试程序,修改其中的语法错误及少量逻辑错误。只能修改、不能增加或删除整条语句,但可增加少量说明语句和编译预处理指令。
【注意】源程序以“学号f1.cpp”命名,存入自己学号文件夹。
【题目】以下程序用于构造一个空的数组对象,通过调用插入函数建立按升序排列的数组,并输出数组内容。
【含错误的源程序】
#include<iostream>
#include<iomanip>
using namespace std;
class Array{
int *p;
int last; //最后一个元素下标
public:
Array(int=20); //创建一定长度的空表,给定长度缺省值为20
~Array();
void insertOrder(int); //在升序表中插入一个元素,使之仍然升序
void print();
};
void Array::Array(int max){ //错误行
last=-1;
p=new int[]; //初始化为给定长度 //错误行
}
Array::~Array(){delete p[];} //错误行
void print(){ //错误行
for(int i=0;i<=last;i++) cout<<setw(4)<<p[i];
cout<<endl;
}
void Array::insertOrder(){ //将关键字插入到数组中某个位置 //错误行
if(last=-1){last++; p[last]=key;} //错误行
int i=last;
while(i>=0&&key<p[i]){
p[i+1]=p[i]; //错误行
i--;
}
p[i]=key; //错误行
last++;
}
void main(){
Array a(); //创建数组 //错误行
int t;
for(int i=0;i<10;i++){ //读入10个数据创建一个升序数组
cin>>t;
a.insertOrder(int t); //错误行
}
print(); //输出数组 //错误行
}
二、编程题(50分)
【注意】源程序以“学号f2.cpp”命名,存入自己学号文件夹。
【题目】以下程序定义了一个整型数组类Array,数组长度为30个元素。数组的初始化数据来源以及程序结束后数组的数据保存都指向工程文件夹下的文本文件”vdata.txt”。即,创建数组对象时,在构造函数中读该取文件获得数据(首次创建对象时文件是打不开的,数组就没有初始化值),当程序结束时,析构函数将数据写入上述文件。
【说明】本程序的执行流程是,创建数组对象并初始化,向数组中添加一些数据。请按以上说明和要求将下面程序补充完整,并调试运行。
#include<iostream>
#include<fstream>
using namespace std;
class Array;
ostream& operator<<(ostream &os,Array &a);
class Array{
int v[30];
int last; //最后一个元素下标
public:
Array(); //创建表,从文件中读取数据进行初始化
~Array(); //数据保存到文件中
void insertAfter(int); //在当前表的最后添加一个元素
friend ostream& operator<<(ostream &, Array &); //用于直接输出数组对象
};
Array::Array(){
//此处添加代码
}
Array::~Array(){
//此处添加代码
}
void Array::insertAfter(int t){
last++;
v[last]=t;
}
ostream& operator<<(ostream &os,Array &a){
//此处添加代码
}
void main(){
Array vector; //创建数组
int t;
cout<<vector;
cout<<"向数组添加3个数:";
for(int i=0;i<3;i++){ //向数组中添加3个数据
cin>>t;
vector.insertAfter(t);
}
cout<<"当前数组内容:"<<endl;
cout<<vector;
}
【提醒】上传的学号文件夹中只需包含f1.cpp、f2.cpp及vdata.txt三个文件即可,其余文件上传前尽可删除。
答案解析:
一.改错题
#include<iostream>
#include<iomanip>
using namespace std;
class Array
{
int *p;
int last; //最后一个元素下标
public:
Array(int=20); //创建一定长度的空表,给定长度缺省值为20
~Array();
void insertOrder(int); //在升序表中插入一个元素,使之仍然升序
void print();
};
Array::Array(int max)
{
last=-1;
p=new int[max]; //初始化为给定长度
}
Array::~Array()
{
delete []p;
}
void Array::print()
{ //错误行
for(int i=0;i<=last;i++)
cout<<setw(4)<<p[i];
cout<<endl;
}
void Array::insertOrder(int key)
{ //将关键字插入到数组中某个位置
if(last==-1)
{
last ++;
p[last]=key;
}
else
{
int i=last;
while(i>=0 && key<p[i] )
{
p[i+1]=p[i]; //错误行
i--;
}
p[i+1]=key; //错误行
last++;
}
}
void main()
{
Array a; //创建数组
int t;
for(int i=0;i<10;i++)
{ //读入10个数据创建一个升序数
cin>>t;
a.insertOrder(t);
}
a.print(); //输出数组
}
二.编程题
#include<iostream>
#include<fstream>
using namespace std;
class Array;
ostream& operator<<(ostream &os,Array &a);
class Array
{
int v[30];
int last; //最后一个元素下标
public:
Array(); //创建表,从文件中读取数据进行初始化
~Array(); //数据保存到文件中
void insertAfter(int); //在当前表的最后添加一个元素
friend ostream& operator<<(ostream &, Array &); //用于直接输出数组对象
};
Array::Array()
{
int vv[30];
fstream datafile("d:\\vdata.txt",ios::in);
if(!datafile==0)
{ last=-1;
for(int i=0;!datafile.eof();i++)
{
datafile>>vv[i];
v[i]=vv[i];
last=last+1;
}
datafile.close();
}
}
Array::~Array()
{
fstream datafile ("d:\\vdata.txt",ios::out);
for(int i=0;i<last;i++)
{
datafile<<v[i]<<'\t';
}
datafile.close();
}
void Array::insertAfter(int t)
{
v[last]=t;
last++;
}
ostream& operator<<(ostream &os,Array &a)
{
for(int i=0;i<a.last;i++) //此处添加代码
{
os<<a.v[i]<<'\t';
}
return os;
}
void main()
{
Array vector; //创建数组
int t;
cout<<vector;
cout<<"向数组添加3个数:"<<endl;
for(int i=0;i<3;i++)
{ //向数组中添加3个数据
cin>>t;
vector.insertAfter(t);
}
cout<<"当前数组内容:"<<endl;
cout<<vector;
}
展开阅读全文