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