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

// 第八章深入理解类 练习题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;

}

  

你可能感兴趣的:(2008)