应用题 请使用VC6或使用【答题】菜单打开proj3下的工程文件proj3。本题创建一个小型字符串类,字符串长度不超过100。程序文件包括proj3.h、proj3.cpp、writeToFile.obj。补充完成重载赋值运算符函数,完成深复制功能。
屏幕上输出的正确结果应该是:
Hello!
Happy new year!
要求:
补充编制的内容写在“// ********333********”与“// ********666********”两行之间。不得修改程序的其他部分。
注意:
程序最后调用writeToFile函数,使用另一组不同的测试数据,将不同的运行结果输出到文件out.dat中。输出函数writeToFile已经编译为obj文件。
//proj3.h
#include <iostream>
#include <iomanip>
using namespace std;
class MiniString
{
public:
friend ostream operator << (ostream output, const MiniString s) //重载流插入运算符
{output << s.sPtr; return output;}
friend istream operator >> (istream input, MiniString s) //重载流提取运算符
{char temp[100]; //用于输入的临时数组
temp[0] = '\0'; //初始为空字符串
input >> setw(100) >> temp;
int inLen = strlen(temp); //输入字符串长度
if(inLen ! = 0)
{
s.length = inLen; //赋长度
if (s.sPtr! = 0) delete[]s.sPtr; //避免内存泄漏
s.sPtr = new char[s.length +1];
strcpy(s.sPtr, temp); //如果s不是空指针,则复制内容
}
else s.sPtr[0] = '\0'; //如果s是空指针,则为空字符串
return input;
}
void modString(const char * string2 ) //更改字符串内容
{
if (string2 ! = 0) //如果string2不是空指针,则复制内容
{
if (strlen(string2) ! = length)
{
length = strlen (string2);
delete []sPtr;
sPtr = new char [length +1]; //分配内存
}
strcpy(sPtr, string2);
}
else sPtr [0] = '\0'; //如果string2是空指针,则为空字符串
}
MiniString operator = (const MiniString otherString);
MiniString (const char * s = ' '):length((s ! = 0) ? strlen(s):0) //构造函数
{
s Ptr = 0;
if (length! =0)
setString(s);
}
~MiniString() //析构函数
{delete [] sPtr;}
private:
int length; //字符串长度
char * sPtr; //指向字符串起始位置
void setString(const char * string2) //辅助函数
{
sPtr = new char[strlen(string2) +1]; //分配内存
if(string2 ! = 0) strcpy(sPtr, string2); //如果string2不是空指针,则复制内容
else sPtr[0] = '\0'; //如果string2是空指针,则为空字符串
}
};
//proj3.cpp
#include <iostream>
#include <iomanip>
using namespace std;
#include 'proj3.h'
MiniString MiniString::operator = (const MiniString otherString)
{//重载赋值运算符函数。提示:可以调用辅助函数setString
// ********333********
// ********666********
}
int main()
{
MiniString str1 ('Hello!'), str2;
void writeToFile(const char *);
str2 = str1; //使用重载的赋值运算符
str2.modString ('Happy new year!');
cout << str1 << '\n';
cout << str2 << '\n';
writeToFile (' ');
return 0;
}
应用题 请使用VC6或使用[答题]菜单打开proj2下的工程proj2,该工程中包含一个程序文件main. epp,其中有日期类Date、人员类Person及排序函数sortByName和主函数main的定义。请在程序中的横线处填写适当的代码并删除横线,以实现上述类定义和函数定义。此程序的正确输出结果应为:
按姓名排序
排序前:
张三 男 出生日期:1978年4月20日
王五 女 出生日期:1965年8月3日
杨六 女 出生日期:1965年9月5日
李四 男 出生日期:1973年5月30日
排序后:
李四 男 出生日期:1973年5月30日
王五 女 出生日期:1965年8月3日
杨六 女 出生日期:1965年9月5日
张三 男 出生日期:1978年4月20日
注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。
#include<iostream>
using namespace std;
class Date {//日期类
int year, month, day;//年、月、日
public:
Date(int year, int month, int day): year(year), month(month), day(day) {}
int getYear()const {return year;}
int getMonth()const {return month;}
int getDay()const {return day;}
};
class Person {//人员类
char name[14];//姓名
bool is_male;//性别,为true时表示男性
Date birth—date;//出生日期
public:
Person(char*name, bool is_male, Date birth_date)
//**********found**********
:______
{
strcpy(this->name, name);
}
const char*getName()const {return name;}
bool isMale()const {return is_male;}
Date getBirthdate()const {return birth_date;}
//利用strcmp()函数比较姓名,返回一个正数、0或负数,分别表示大于、等于、小于
int compareName(const Person p)const {
//**********found**********
______}
void show() {
cout<<endl;
cout<<name<<'<<(is_male?'男': '女')<<'<<'出生日期: '<<birth_date. getYear()<<'年'//显示出生年
//**********found**********
______//显示出生月
<<birth_date. getDay()<<'日';//显示出生日
}
};
void sortByName(Person ps[], int size) {
//将人员数组按姓名排列为升序
for(int i=0; i<size-1; i++) {
//采用选择排序算法
int m=i;
for(int j=i+1; j<size; j++)
if(ps [j]. compareName(ps[m])<0)
m=j;
if(m>i) {
Person P=ps[m];
ps[m]: ps[i];
ps[i]=P;
}
}
}
int main() {
Person staff[]= {
Person('张三', true, Date(1978, 4, 20)),
Person('王五', false, Date(1965, 8, 3)),
Person('杨六', false, Date(1965, 9, 5)),
Person('李四', true, Date(1973, 5, 30))
};
const int size=sizeof(staff)/sizeof(staff[0]);
int i;
cout<<endl<<'按姓名排序';
cout<<endl<<'排序前:';
for(i=0; i<size; i++) staff[i]. show();
sortByName(staff, size);
cout<<endl<<endl<<'排序后:';
for(i=0; i<size; i++) staff[i]. show();
cout<<endl;
return 0;
}
应用题 请使用VC6或使用[答题]菜单打开proj2下的工程proj2,其中有矩阵基类MatrixBase、矩阵类Matrix和单位阵UnitMatrix的定义,还有main函数的定义。请在横线处填写适当的代码并删除横线,以实现上述类定义。此程序的正确输出结果应为:
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
1 0 0 0 0 0
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1
注意:只能在横线处填写适当的代码,不要改动程序中的其他内容,也不要删除或移动“//****found****”。
#include<iostream>
using namespace std;
//矩阵基础类,一个抽象类
class MatrixBase {
int rows, cols;
public:
MatrixBase(int rows, int cols): rows(rows), cols(cols) {}
int getRows()const {return rows;}//矩阵行数
int getCols()const {return cols;}//矩阵列数
virtual double getElement(int r, int c)const=0;//取第i个元素的值
void show()const {//分行显示矩阵中所有元素
for(int i=0; i<rows; i++) {
cout<<endl;
for(int i=0; j<cols; j++)
//**********found**********
cout<<______<<' ';
}
}
};
//矩阵类
class Matrix: public MatrixBase {
double*val;
public:
//**********found**********
Matrix(int rows, int cols, double m[]=NULL):______ {
//**********found**********
val=______;
for(int i=0; i<rows*cols; i++)
val[i]=(m==NULL?0.0: m[i]);
}
~Matrix() {delete[]val;}
double getElement(int r. int c)const {return val[r*getCols()+c];}
};
//单位阵(主对角线元素都是1,其余元素都是0的方阵)类
class UnitMatrix: public MatrixBase {
public:
UnitMatrix(int rows): MatrixBase(rows, rows) {}
//单位阵行数列数相同
double getElement(int r, int c)const {
//**********found**********
if(______)return 1.0;
return 0.0;
}
};
int main() {
MatrixBase*m;
double d[][5]= {{1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7}};
m=new Matrix(3, 5,(double*)d);
m->show();
delete m;
cout<<endl;
m=new UnitMatrix(6);
m->show();
delete m;
return 0;
}
选择题 有如下程序:
#include<iostream>
#include<iomanip>
using namespace std;
int main(){
cOUt<<setw(10)<<serfill('x')<<setprecision(8)<<left;
cout<<12.3456793<<______<<98765;
return 0;
}
若程序的输出是12.345679x98765xxxxx,则划线处缺失的部分是______。
选择题 下列有关C++流的叙述中,错误的是______。
选择题 下列关于派生类构造函数和析构函数的说法中,错误的是______。
选择题 以下程序的输出结果是______。
#include<iostream.h>
long fun(int n)
{ long s;
if(n==1||n==2)s=2;
else s=n-fun(n-1);
return S;
}
void main(){ cout<<fun(3);}
选择题 程序调试的任务是______。
选择题 有如下程序:
#include<iostream>
using namespace std;
class test{
private:
int a;
public:
test0{cout+'constructor'+endl;}
test(int a){cout+a+endl;)
test(const testtest)
{
a=test.a;
cout+,,copy constructor'+endl;
}
test(){Cout+'destructor'+endl;}
};
int main()
{
test A(3);
return 0;
}
运行时输出的结果是______。
选择题 已知类模板Test定义如下:
template<typename T1, typename T2>
Class Test{
public:
void foo(T2 t);
};
则以下针对foo函数的类外定义中语法正确的是______。
选择题 若有以下程序:
#include <iostream>
using namespace std;
class point
{
private:
int x, y;
public:
point ( )
{
x=0;
y=0;
}
void setpoint(int x1,int y1)
{
x=x1;
y=y1;
}
void dispoint ()
{
cout<<'x='<<x<<' , '<<'y='<<y<<end1;
}
};
int main ( )
{
point *p=new point;
p->setpoint (5, 12);
p->dispoint ();
return 0;
}
程序运行后的输出结果是______。
选择题 从工程管理角度,软件设计一般分为两步完成,它们是 。
选择题 下列描述中正确的是______ 。
选择题 如果一个类至少有一个纯虚函数,那么该类称为 。
选择题 运算符重载时不需要保持的性质是______
选择题 下列关于文件流的描述中,正确的是______。
选择题 已知类MyClass中有一个只需要一个double型参数的构造函数,且将运算符“-”重载为友元函数。若语句序列
MyClass x(4.2), y(6.5), z(0.0);
z=8.1-y;
y=x-2.8;
能够正常运行,运算符“operator-”应该在类中声明为______。
选择题 表达式10>5&&6%3的值是______
选择题 下面程序中对一维坐标点类Point进行运算符重载
#include<iostream>
using namespace std;
class Point{
public:
Point(int val){x=val;}
Point operator++(){x++;return *this;}
Point operator++(int){Point old=*this;++(*this);return old;}
Int GetX()const{return x;}
private:
int x;
};
int main()
{
Point a(10);
cout<<(++a).GetX();
cout<<a++.GetX();
return 0;
}
编译和运行情况是______。
选择题 下面关于break语句的描述中,不正确的是______。