Visual C++ 2008入门经典 第八章深入理解类 练习题

时间:2023-02-24 08:31:25
// 第八章深入理解类 练习题2012-11-04
//.cpp: 主项目文件。


//第一题
/*#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
using namespace System;
class ECS
{
private:
	int value;
	bool boolecs;
public:
	ECS(int va=0, bool ecs = false):value(va), boolecs(ecs){
	
	}
	void print();

	//重载运算符+
	ECS operator+(const ECS& e) const
	{
	     return ECS(e.value + value, boolecs || e.boolecs);
	}
	//重载运算符+
	ECS operator+(const int& i) const
	{
	    return ECS(value+i, boolecs);
	}
};
void ECS::print()
{
	if(boolecs){
	   cout<<"E";
	}
	cout<<this->value;
}

//重载全局运算符++
ECS operator+(const int& a, const ECS& ecs)
{
    return ecs + a;
}




int main(array<System::String ^> ^args)
{
	//这里的a=3直接为3,是用的默认构造函数吗?
	ECS a = 3, c;
	ECS b(5,true);

	cout<<"a=";
	a.print();
	cout<<endl;

	cout<<"b=";
	b.print();
	cout<<endl;

	c = a + b;
	cout<<"a + b = ";
	c.print();
	cout<<endl;

	c = 7 + b;
	cout<<"7 + b = ";
	c.print();
	cout<<endl;

	c = a + 9;
	cout<<"a + 9 = ";
	c.print();
	cout<<endl;

	c = 8 + a + 9 + b;
	cout<<"8 + a + 9 + b = ";
	c.print();
	cout<<endl;
    
	system("pause");
	return 0;
}*/

//第二题
/*#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
using namespace System;

class IString
{
private:
	char* p;
	int length;
public:
	IString(const char* ch=0):p(0), length(0)
	{
		if(ch != 0){
		    length = strlen(ch);
			p = new char[length+1];
			strcpy_s(p, length+1, ch);	
		}
	}

	//复制构造函数
	IString(const IString& str)
	{
		//cout<<"str:"<<str<<endl;
		//妈的这里怎么判断是自己的呢
		//if(this === str){		
		//}
		//开始复制
		length = str.length;
		p = new char[length+1];
		strcpy_s(p,length +1, str.p);
	}

	//赋值运算符
	IString& operator=(const IString& str)
	{
	    length = str.length;
		delete p;
		p = new char[length+1];
		strcpy_s(p, length+1, str.p);
		return *this;
	}



	~IString(){
	   delete p;
	}
	
	void print()
	{
	    cout<<"p:"<<p<<" length:"<<length<<endl;
	}

};


int main(array<System::String ^> ^args)
{
	
	IString str("Hello");
	str.print();

    IString str1(str);
	str1.print();



	IString str2("Xlc");
	str2.print();

	IString str3;
	str3 = str2;
	str3.print();

    system("pause");
	return 0;
}*/


//第三题
/*#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
using namespace System;

class IString
{
private:
	char* p;
	int length;
public:
	IString(const char* ch=0):p(0), length(0)
	{
		if(ch != 0){
		    length = strlen(ch);
			p = new char[length+1];
			strcpy_s(p, length+1, ch);	
		}
	}

	IString(const char ch, int len=1):p(0), length(0)
	{
	    length = len;
		if(length > 1){
		     p = new char[length+1];
			 memset(p, ch, length);
			 p[length] = '\0';
		}	
	}

	//另外一个构造函数
	IString(int i):p(0),length(0)
	{
	     char sTmp[20];
		 //_itoa_s(i,buffer,2,10);//10表示10进制2表示字符长度buffer表示存放结果
		 _itoa_s(i, sTmp, 20, 10);

		 cout<<"sTmp:"<<sTmp<<endl;

		 length = strlen(sTmp);
		 if(length > 0){
		     p = new char[length+1];
			 strcpy_s(p, length+1, sTmp);
		 }
	}


	//复制构造函数
	IString(const IString& str)
	{
		//cout<<"str:"<<str<<endl;
		//妈的这里怎么判断是自己的呢
		//if(this === str){		
		//}
		//开始复制
		length = str.length;
		p = new char[length+1];
		strcpy_s(p,length +1, str.p);
	}




	//赋值运算符
	IString& operator=(const IString& str)
	{
	    length = str.length;
		delete p;
		p = new char[length+1];
		strcpy_s(p, length+1, str.p);
		return *this;
	}
    ~IString(){
	   delete p;
	}
	
	void print()
	{
	    cout<<"p:"<<p<<" length:"<<length<<endl;
	}

};


int main(array<System::String ^> ^args)
{
	
	IString str("Hello");
	str.print();
    IString str1(str);
	str1.print();
	IString str2("Xlc");
	str2.print();
	IString str3;
	str3 = str2;
	str3.print();

	IString str4('V', 10);
	str4.print();

	IString str5(5555);
	str5.print();



    system("pause");
	return 0;
}
*/

//第四题
//我感觉不行,刚才也想到了,但没有用this==*str成功
/*#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
using namespace System;

class IString
{
private:
	char* p;
	int length;
public:
	IString(const char* ch=0):p(0), length(0)
	{
		if(ch != 0){
		    length = strlen(ch);
			p = new char[length+1];
			strcpy_s(p, length+1, ch);	
		}
	}
	IString(const char ch, int len=1):p(0), length(0)
	{
	    length = len;
		if(length > 1){
		     p = new char[length+1];
			 memset(p, ch, length);
			 p[length] = '\0';
		}	
	}
	//另外一个构造函数
	IString(int i):p(0),length(0)
	{
	     char sTmp[20];
		 //_itoa_s(i,buffer,2,10);//10表示10进制2表示字符长度buffer表示存放结果
		 _itoa_s(i, sTmp, 20, 10);

		 cout<<"sTmp:"<<sTmp<<endl;

		 length = strlen(sTmp);
		 if(length > 0){
		     p = new char[length+1];
			 strcpy_s(p, length+1, sTmp);
		 }
	}
	//复制构造函数
	IString(const IString& str)
	{
		//cout<<"str:"<<str<<endl;
		//妈的这里怎么判断是自己的呢
		//if(this === str){		
		//}
		//开始复制
		length = str.length;
		p = new char[length+1];
		strcpy_s(p,length +1, str.p);
	}
	//赋值运算符
	IString& operator=(const IString& str)
	{
		//if(*this != str){ //这个刚才都没进去,*this是指当前对像的值了,而str只是一个IString&的引用
		if(this != &str){ //这里应该用this当前的地址不等于str的地址才对,&str取地址
			length = str.length;
			delete p;
			p = new char[length+1];
			strcpy_s(p, length+1, str.p);
		}
		return *this;		
	}
    ~IString(){
	   delete p;
	}	
	void print()
	{
	    cout<<"p:"<<p<<" length:"<<length<<endl;
	}
};


int main(array<System::String ^> ^args)
{
	
	IString str("Hello");
	
    str = str;
	str.print();


    system("pause");
	return 0;
}*/


//第五题
/*
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
using namespace System;

class IString
{
private:
	char* p;
	int length;
public:
	IString(const char* ch=0):p(0), length(0)
	{
		if(ch != 0){
		    length = strlen(ch);
			p = new char[length+1];
			strcpy_s(p, length+1, ch);	
		}
	}
	IString(const char ch, int len=1):p(0), length(0)
	{
	    length = len;
		if(length > 1){
		     p = new char[length+1];
			 memset(p, ch, length);
			 p[length] = '\0';
		}	
	}
	//另外一个构造函数
	IString(int i):p(0),length(0)
	{
	     char sTmp[20];
		 //_itoa_s(i,buffer,2,10);//10表示10进制2表示字符长度buffer表示存放结果
		 _itoa_s(i, sTmp, 20, 10);

		 cout<<"sTmp:"<<sTmp<<endl;

		 length = strlen(sTmp);
		 if(length > 0){
		     p = new char[length+1];
			 strcpy_s(p, length+1, sTmp);
		 }
	}
	//复制构造函数
	IString(const IString& str)
	{
		//cout<<"str:"<<str<<endl;
		//妈的这里怎么判断是自己的呢
		//if(this === str){		
		//}
		//开始复制
		length = str.length;
		p = new char[length+1];
		strcpy_s(p,length +1, str.p);
	}
	//赋值运算符
	IString& operator=(const IString& str)
	{
		//if(*this != str){ //这个刚才都没进去,*this是指当前对像的值了,而str只是一个IString&的引用
		if(this != &str){ //这里应该用this当前的地址不等于str的地址才对,&str取地址
			length = str.length;
			delete p;
			p = new char[length+1];
			strcpy_s(p, length+1, str.p);
		}
		return *this;		
	}

	//重载operator+()运算符
	IString operator+(const char* ch)
	{
		 //int len = strlen(ch);
		 //重新设置长度
		 //int _len = length+len; //两个字符串合并以后的长度
		 //char* temp = new char[_len]; //重新定义字符串指针
		 //当两个字符串合并到一起去
		 //int i=0;
		 //for(i=0; i<length; i++){
		 //    temp[i] = p[i];
		 //}
		 //for(int j=0; i<_len; j++, i++){
		 //     temp[i] = ch[j];
		 //}
		 //temp[_len] = '\0'; //合并成功
		 //cout<<"temp:"<<temp<<endl;
		 //return IString(temp);
		 
		 //上面是自己写的
		 //下面是答案上给的	     
		 return *this + IString(ch);
	}

	IString operator+(const IString& s)
	{
	      size_t _length = length + s.length + 1;
		  char* temp = new char[_length];
		  strcpy_s(temp, _length, p);   //把p复制到temp里面去
		  //cout<<"temp:"<<temp<<endl;
		  //strcpy_s(temp, _length, s.p); //这个也在智能了吧,直接把两个这么合并起来了,还知道第一次的p被加到了什么地方为止
		  //弄不懂这里样
		  //哥我错了,这里用的是strcat_s
		  strcat_s(temp,_length, s.p);
		  //cout<<"temp:"<<temp<<endl;
		  return IString(temp);
	}

	//重载+=
	IString& operator+=(const IString& str)
	{
	     *this = *this + str; //用当前对像+str,因为上面已经重新了该+运算符
		 return *this; //直接返回
	}


    ~IString(){
	   delete p;
	}	
	void print()
	{
	    cout<<"p:"<<p<<" length:"<<length<<endl;
	}
};


int main(array<System::String ^> ^args)
{
	
	IString str("Hello");

	IString str1 = str + " C++";
	str1.print();


	IString str2(" PHPchina");
	str += str2;
	str.print();
    system("pause");
	return 0;
}*/

//第六题
/*
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
using namespace System;
class CStack
{
public:
	CStack(int n=10); //构造函数
	~CStack();        //析造函数
	void push(int i); //追加数据
	int pop();
	void print();
private:
	int* pList;       //定义一个指针
	int size;         //指针长度
	int next;         //当前的索引值
};

//创建一个长度为n的int指定,保存到pList中去
CStack::CStack(int n):size(n),next(0)
{
	pList = new int[size];
}
CStack::~CStack()
{
    delete []pList; //清空pList指针
}


void CStack::push(int i)
{
	//当下一条指针小于99时,就还可以追加上去
	//next是指当前的索引值
	if(next < 99){
	    pList[next++] = i;
	}
}
//返回最后一条值
int CStack::pop()
{
    //cout<<"next:"<<next<<endl;
	return pList[--next];
	//这里的返回并没有把该地址去掉,而只是在next长度中减一了,不能读出来了
}

void CStack::print()
{
     cout<<'[';
	 //这里从最后开始循环到最前面
	 for(int i=next-1; i>=0; i--){
	       //cout<<"i="<<i<<' '<<pList[i];
		  cout<<' '<<pList[i];
	 }
	 cout<<"]"<<endl;
}


int main(array<System::String ^> ^args)
{

	CStack s(20);
	s.push(5);
	s.push(10);
	s.push(8);
	s.print();
	cout<<"最上面的数值为:"<<s.pop()<<endl;
	s.print();
    system("pause");
	return 0;
}*/


//第七题
/*#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
using namespace System;
//ref 引用类
ref class Box
{
public:
	//默认构造函数
	Box()
	{
	     Box(1.0,1.0,1.0);
	}
	//带三个参数的构造函数
	Box(double lv, double wv, double hv)
	{
	     lv = lv <= 0.0 ? 1.0 : lv;
		 wv = wv <= 0.0 ? 1.0 : wv;
		 hv = hv <= 0.0 ? 1.0 : hv;

		 length = lv > wv ? lv : wv;
		 width = wv < lv ? wv : lv;
		 height = hv;
	}
	//计算面积
	double Volume()
	{
	    return length * width * height;
	}
	//属性(property)是很多时髦的面向对象编程语言提供的一种特性。通过属性,程序员可以如同访问成员数据一样访问一组
	property double Length	
	{
		double get(){ return length;}    
	}
	property double Width{
		double get(){ return width;}
	}
	property double Height{
		double get(){ return height;}
	}

	//重载运算符operator+
	Box^ operator+(Box^ box){
	    //返回一个新的Box引用类
		return gcnew Box(length > box->length ? length : box->length,
			             width > box->width ? width : box->width,
						 height + box->height);
	}

	//重载运算符operator/
	int operator/(Box^ box)
	{
	     int tc1 = 0;
		 int tc2 = 0;
		 //第一个的宽度和高度除以box的高宽,看能装下几个
		 tc1 = safe_cast<int>(length / box->length) * safe_cast<int>(width / box->width);

		 //第当前对像的高度除以box的宽度,用当前对像的宽度除以box的高度,看能装几个
		 tc2 = safe_cast<int>(length / box->width) * safe_cast<int>(width/box->length);
         //Console::WriteLine("tc1:{0} tc1:{1}", tc1, tc2);

		 //返回数量
		 return static_cast<int>(height/box->height) * (tc1 > tc2 ? tc1 : tc2);
	}

	//重载运算符operator*();
	Box^ operator*(int n)
	{
		if(n%2 == 0){ //如果是能被2整除的数
			//宽*2 然后高度加n/2
			return gcnew Box(length, 2.0*width, (n/2)*height);
		}else{
		    return gcnew Box(length, width, n*height);
		}
	}

	//重载%运算符
	double operator%(Box^ box)
	{
		 //先用this/box看当前this能装下几个box,然后来*每个box的面积
		 //用当前的面积减去
	     return Volume() - (this/box)*box->Volume(); 
	}

	//重载运算符>=
	bool operator>=(double value)
	{
	     return value >= this;
	}

	//重载<=
	bool operator<=(double value)
	{
	     return value >= this;     
	}

	//重载 > 
	static bool operator>(double value, Box^ box)
	{
	     return value > box->Volume();
	}
	static bool operator<(double value, Box^ box)
	{
	    return value < box->Volume();
	}

	static bool operator>(Box^ box, double value)
	{
	    return value < box->Volume();
	}
	static bool operator<(Box^ box, double value)
	{
	    return value > box->Volume();
	}

	static bool operator>=(double value, Box^ box)
	{
	    return value >= box->Volume();
	}
	static bool operator<=(double value, Box^ box)
	{
	    return value <= box->Volume();
	}

	static bool operator==(double value, Box^ box)
	{
	    return value == box->Volume();
	}
	static bool operator==(Box^ box, double value)
	{
	    return box->Volume() == value;
	}

	static Box^ operator*(int n, Box^ box)
	{
	    return box*n;
	}
private:
	double length;
	double width;
	double height;
};





int main(array<System::String ^> ^args)
{
	Box^ candy = gcnew Box(1.5, 1.0, 1.0);//一块糖的大小
	Box^ candyBox = gcnew Box(7.0, 4.5, 2.0); //一个小包装的大小
	Box^ carton = gcnew Box(30.0, 18.0, 18.0);//一个大礼盒的包装大小

	int numCandies = candyBox / candy; //一个小包装育装多少块	 
	int numCboxes = carton / candyBox;  //一个大礼盒能装多少小包装
	double space = carton % candyBox;   //还余下多少空间

	Console::WriteLine("candyBox能装 {0} 块糖果", numCandies);
	Console::WriteLine("carton能装 {0} candyBox包糖果", numCboxes);
	Console::WriteLine("carton能装 {0} candyBox包糖果后,还余下的空间为{1}", numCboxes, space);

	//长度
	for(double length=3.0; length<=7.5; length+=0.5){
		//宽度
		for(double width = 3.0; width<=5.0; width+=0.5){
		    //高度
			for(double height=1.0; height<= 2.5; height+=0.5){
			       Box^ tryBox = gcnew Box(length, width, height);
				   //装满以事余下的空间要小于一盒tryBox的空间
				   //要能正好装盒candy的数量
				   //并且装装的糖果块数要大于30块
				   if(carton % tryBox < tryBox->Volume() && tryBox % candy == 0.0 && tryBox/candy >= 30)
				   {
					   Console::WriteLine(L"\n\nTrial Box L={0} W={1} H={2}", tryBox->Length, tryBox->Width, tryBox->Height);
					   Console::WriteLine(L"一共能装 {0} 块糖果",tryBox/candy);
					   Console::WriteLine(L"一大礼箱能装 {0} 多少盒", carton/tryBox);
				   }
			}
		}
	}
    system("pause");
	return 0;
}*/


//第八题:
/*
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
using namespace System;
int main(array<System::String ^> ^args)
{
	const int MaxLength = 100;
	//开始处理输
	string str;	
	cout<<"请输入字符串吧(*结束):"<<endl;
	getline(cin,str, '*');
	cout<<"str:"<<str<<endl;


	
	//首先处理一下用户需要替换的单词
	string repString;
	cout<<"请输入你人替换的单词(*结束):"<<endl;
	getline(cin, repString, '*');
	cout<<"repString:"<<repString<<endl;

	//或者放入一个字符串数组中去
	size_t start = 0;
	size_t end = 0;
	size_t count = 0;
	string keyStrings[MaxLength];
    //关键词的数成已经完成
	while(true){
	     start = repString.find_first_not_of(' ', start);
		 if(start == string::npos){
		     break;
		 }
		 end = repString.find_first_of(' ', start);
		 if(end == string::npos){
		     end = repString.length();
		 }
		 if(count > MaxLength){
			 cout<<"超出了字符串数组的长度."<<endl;
		     break;
		 }
		 string s = repString.substr(start, end-start);
		 keyStrings[count++] = s;
		 start = end;
		 end = string::npos;
	}
	//开始查换和替换str字符串中出现的keyStrings的值
	for(size_t i=0; i<count; i++){
		 size_t _start = 0;
		 size_t _end=0;
	     cout<<keyStrings[i]<<endl;
		 while(true){
			 //没有理解这个函数哦
			 //find_first_of是当keyStrings[i]中出现的任意字符,就做数了,而不是字符串
			 _start = str.find_first_of(keyStrings[i], _start);
			 if(_start == string::npos){
			    break;
			 }
			 cout<<"_start:"<<_start<<endl;
			 _end = str.find_first_of(' ', _start);
			 if(_end == string::npos){
			    _end = str.length();
			 }
			 cout<<"开始位置是_start:"<<_start<<" _end:"<<_end<<endl;
			 string s = str.substr(_start, _end-_start);
			 cout<<"s:"<<s<<endl;
			 cout<<endl;
			 _start = _end;
			 _end = string::npos;
		 }
	}
    system("pause");
	return 0;
}
////////////////失败	
*/

//第八题答案上这么写的,练习一下
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
using namespace System;
int main(array<System::String ^> ^args)
{
	string text; //写义字符串text
	const size_t maxwords(100); //最大的字符长度100
	string words[maxwords];     //定义一个长度为100的字符串数组
	size_t wordcount(0);        //当前字符串的长度

	cout<<"输入要搜索的文本以#号结束"<<endl;
	getline(cin,text, '#'); //将输入的字符串保存到text中
	string textcopy(text);  //声明一个textcopy中然后把text初始给他

	//转换为小字
	for(size_t t = 0; t<textcopy.length(); t++)
	{
	     textcopy[t] = tolower(textcopy[t]);
	}

	while(true)
	{
	    cout<<"输入一个词,是要被替换的字符串或输入#号结束:"<<endl;
		cin>>words[wordcount]; //妈的保存到了wrods中去了
		if(words[wordcount] == "#"){ //如果为#退出
		   break;
		}
		//如果输入的长度已经大于了数组的容量,直接退出
		if(++wordcount == maxwords){
		   cout<<"已经超出了字符串数组的最大值"<<endl;
		   break;
		}
	}


	//开始循环查找所输入的需要替换的值了
	for(size_t i = 0; i<wordcount; i++)
	{
	     string wordcopy = words[i];
		 //对当前词转换为小写
		 for(size_t j=0; j<wordcopy.length(); j++){
		      wordcopy[i] = tolower(wordcopy[i]);
		 }

		 //应该是创建一个以wordcopy为长度的字符串,值为*
		 string asterisks(wordcopy.length(), '*');
		 cout<<"Each occurrence of: "<<words[i]<<"  will be replaced by  "<<asterisks<<" . "<<endl;

		 size_t position = 0;
		 //循环条件为在textcopy中查找wordcopy的位置,从position开始,直接为string::npos为止
		 while((position = textcopy.find(wordcopy, position)) != string::npos)
		 {
			 cout<<"position:"<<position<<endl;
			 //如果为位置为0时
			 if(position == 0){
				 //当当前的关键词长度与 text的长度一样时
				 if(position+wordcopy.length() == text.length())
				 {
					  text.replace(position, wordcopy.length(), asterisks); //替换
				 
				 //功能:如果参数是字母字符,函数返回非零值,否则返回零值。
				 //如果该值不为字母 检查过去的这个词不是字母
				 }else if(!isalpha(textcopy[position+wordcopy.length()])){
				      text.replace(position, wordcopy.length(), asterisks);
				 }  

			 //判断textcopy[position-1]的值是否为字母,如果不是字母执行
			 }else if(!isalpha(textcopy[position-1]))
			 {
				 if(position + wordcopy.length() == text.length())
				 {
				     text.replace(position, wordcopy.length(), asterisks);
				 }else if(!isalpha(textcopy[position+wordcopy.length()])){
				     text.replace(position, wordcopy.length(), asterisks);
				 }			 
			 }
			 position += wordcopy.length();
			 //然后移动position的长度
		 }
		 cout<<"处理后的原始字符串是现在:"<<text<<endl;
	}	

    system("pause");
	return 0;
}