Visual C++ 2008入门经典 第九章练习题

// 第九章练习题.cpp: 主项目文件。

//第一题:
//1 没有定义析构函数,没有销毁p指针
//2 默认构造函数没有初始化p指针
//看到答案以后,自己还是想得太少了
/*#include <iostream>
using namespace System;
using namespace std;
class CBadClass
{
private:
	int len;
	char* p;
public:
	CBadClass(const char* str = 0):len(0)
	{
		if(p) //判断是否存在p指针
		{
		    len = strlen(str); //开度
			p = new char[len+1]; //创建指针
			strcpy_s(p, len+1, str); //复制内容到新的指针上
		}
	}
};
int main(array<System::String ^> ^args)
{

	CBadClass pClass("Xlc");

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

//第二题:
//这是一个可以合理的CHawk类可以从CBird继承,但是COStrich不行,因为鸵鸟不能飞
//一个更好的类层次结构为代表鸟,让让鸵鸟,企鹅不会飞的鸟
//一个单独的类来表示,下面的层次结构允许
/*class CBird
{
protected:
	int wingSpan; //翼展的类型
	int eggSize;  //蛋的大小
};
//不会飞类型的飞的类
class CFilightlessBird : public CBird
{
};
//代表可以飞的鸟类基类也是从CBird继承的
class CFlyingBird : public CBird
{
protected:
	int airSpeed;
	int altitued;
public:
	virtual void fly(){
	    altitued = 100;
	}
};*/



//第三题
//抽像类,因为virtual void Print() const =0,为一个纯虚函数
/*#include <iostream>
using namespace System;
using namespace std;
class CBase
{
protected:
	int m_anInt;
public:
	CBase(int n):m_anInt(n){ cout<<"Base constructor"<<endl; }
	virtual void Print() const = 0;
	virtual ~CBase(){
	    cout<<"CBase 析构函数"<<endl;
	}
};

class MCBase : public CBase
{
private:
	char* p;
	int len;
public:
	MCBase(char* str, int n):CBase(n), len(0)
	{
		if(p){
		    len = strlen(str);
			p = new char[len+1];
			strcpy_s(p, len+1, str);
		}
	}

	virtual void Print() const
	{
	    cout<<"m_anInt:"<<m_anInt<<endl;
		cout<<"p:"<<*p<<endl;
	}
	~MCBase(){
		cout<<"MCBase 析构函数"<<endl;
	    delete p;
	}
};

int main(array<System::String ^> ^args)
{
	//MCBase mcbase = new MCBase("xlc", 55);
	MCBase* pbase;
	MCBase mcbase("Xlc", 55);
	mcbase.Print();
	pbase = &mcbase;
	pbase->Print();

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


//第四题
/*#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>  //For rand_s function
using namespace System;
using namespace std;
class CBinaryTree
{
private:
	//定义一个嵌套类
	class CNode
	{		
	public:
		//构造函数
		CNode(int n):value(0),m_pLeft(0), m_pRight(0){}

		//指出节点的值
		void listNode()
		{
			//如果左边的指针不为空值
			if(m_pLeft != 0){
			    m_pLeft->listNode(); //传到的值中去
			}
			cout<<setw(12)<<endl; //显示12空格
			if(++listCount % 5 == 0){
			     cout<<endl; //显示一换行
			}
			if(m_pRight != 0){ //右边指针
			     m_pRight->listNode();
			}		    
		}		
		int value;     //值
		CNode* m_pLeft;//左边的指针
		CNode* m_pRight;//右边的指针
		static int listCount; //一个静态函数
	};
	CNode* m_pRoot; //定义一个首指针CNode
public:
	//构造函数
	CBinaryTree() : m_pRoot(0){}
	//声明添加函数
	void add(int n); 
	//两个参数的添加函数
	//相对于一个给定的节点添加一个值
	void add(int n, CNode* pNode); 

	//列出所有列表
	void listNodes()
	{
	     CNode::listCount = 0;
		 if(m_pRoot == 0)
		      cout<<"Binary tree is empty"<<endl;
		 else
			   m_pRoot->listNode();
	}
};
//定义静态变量的值
int CBinaryTree::CNode::listCount = 0;

void CBinaryTree::add(int n)
{
	if(m_pRoot == 0){
	    m_pRoot = new CNode(n);
	}else{
	    add(n, m_pRoot);
	}
};
//相对于一个给定的节点添加一个值
void CBinaryTree::add(int n, CNode* pNode)
{
	//如果值相等
	if(n == pNode->value){ //那么将值放到当前pNode的左边
		//定义一个新的CNode指针
	    CNode* pNewNode = new CNode(n);
		CNode* pTemp = pNode->m_pLeft;
		pNode->m_pLeft = pNewNode;
		pNewNode->m_pLeft = pTemp;

    //如果n大于当前指针的值
	}else if(n > pNode->value)
	{
		//先判断当前指针的右值是否为0
		//那么值接为当前指针的左值创建一个指针
		//否则就是在前m_pRight上面添加值
		if(pNode->m_pRight == 0){
		    pNode->m_pRight = new CNode(n);
		}else{
		    add(n, pNode->m_pRight); //这里直到找到等于或者他的值或者右边值为空的性情况才会被插入
		}
	}else{
        //应该只有一种情况了,那就是n < pNode->value
		//跟在插入右边值的一样
		if(pNode->m_pLeft ==0){
		     pNode->m_pLeft = new CNode(n);
		}else{
		     add(n, pNode->m_pLeft);
		}
	}
}




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

	CBinaryTree tree;
	unsigned int number = 0; //无符号的整型

	double max = 1000000.0;
	for(int i=0; i<100; i++){
		//取一个随机数放入number中
		if(rand_s(&number) != 0) //成功是返回0???
			cout<<"随机数生成器失败!"<<endl;
		number = static_cast<unsigned int>(static_cast<double>(number)/UINT_AMX*max)+1;
		tree.add(number); //插入tree
		cout<<setw(12)<<endl;

		//换行
		if((i+1) % 5 ==0){
		   cout<<endl;
		}

		cout<<"树的输出:"<<endl;
		tree.listNodes();
	}
    system("pause");
	return 0;
}*/

//第五题
/*#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>  //For rand_s function
using namespace System;
using namespace std;
ref class CBinaryTree
{
private:
	//定义一个嵌套类
	ref class CNode
	{		
	public:
		//构造函数
		CNode(int n):value(n),m_pLeft(nullptr), m_pRight(nullptr){}

		//指出节点的值
		void listNode()
		{
			//如果左边的指针不为空值
			if(m_pLeft != nullptr){
			    m_pLeft->listNode(); //传到的值中去
			}
			//cout<<setw(12)<<value; //显示12空格
			Console::Write(L"{0, 12}", value);
			if(++listCount % 5 == 0){
			     cout<<endl; //显示一换行
			}
			if(m_pRight != nullptr){ //右边指针
			     m_pRight->listNode();
			}		    
		}		
		int value;     //值
		CNode^ m_pLeft;//左边的指针
		CNode^ m_pRight;//右边的指针
		static int listCount; //一个静态函数
	};
	CNode^ m_pRoot; //定义一个首指针CNode
public:
	//构造函数
	CBinaryTree() : m_pRoot(nullptr){}
	//声明添加函数
	void add(int n); 
	//两个参数的添加函数
	//相对于一个给定的节点添加一个值
	void add(int n, CNode^ pNode); 

	//列出所有列表
	void listNodes()
	{
	     CNode::listCount = 0;
		 if(m_pRoot == nullptr)
		      cout<<"Binary tree is empty"<<endl;
		 else
			   m_pRoot->listNode();
	}
};
//定义静态变量的值
//int CBinaryTree::CNode::listCount = 0;

void CBinaryTree::add(int n)
{
	if(m_pRoot == nullptr){
	    m_pRoot = gcnew CNode(n);
	}else{
	    add(n, m_pRoot);
	}
};
//相对于一个给定的节点添加一个值
void CBinaryTree::add(int n, CNode^ pNode)
{
	//如果值相等
	if(n == pNode->value){ //那么将值放到当前pNode的左边
		//定义一个新的CNode指针
	    CNode^ pNewNode = gcnew CNode(n);
		CNode^ pTemp = pNode->m_pLeft;
		pNode->m_pLeft = pNewNode;
		pNewNode->m_pLeft = pTemp;

    //如果n大于当前指针的值
	}else if(n > pNode->value)
	{
		//先判断当前指针的右值是否为0
		//那么值接为当前指针的左值创建一个指针
		//否则就是在前m_pRight上面添加值
		if(pNode->m_pRight == nullptr){
		    pNode->m_pRight = gcnew CNode(n);
		}else{
		    add(n, pNode->m_pRight); //这里直到找到等于或者他的值或者右边值为空的性情况才会被插入
		}
	}else{
        //应该只有一种情况了,那就是n < pNode->value
		//跟在插入右边值的一样
		if(pNode->m_pLeft ==nullptr){
		     pNode->m_pLeft = gcnew CNode(n);
		}else{
		     add(n, pNode->m_pLeft);
		}
	}
}


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


	CBinaryTree^ tree = gcnew CBinaryTree;
	unsigned int number = 0; //无符号的整型

	Random^ generator = gcnew Random;

	for(int i=0; i<20; i++)
	{
	    number = generator->Next(1, 1000000);
		tree->add(number);
		Console::Write(L"{0,12}", number);
		if((i+1) % 5 == 0){
		    Console::WriteLine();
		}

		cout<<"现在开始循环树:"<<endl;
		tree->listNodes();
	}
	system("pause");
	return 0;
}*/


//第六题
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>  //For rand_s function
using namespace System;
using namespace std;

//定义一个通用类,前面说的已经记不起了where T:IComparable???
generic<typename T> where T:IComparable ref class BinaryTree
{
private:
	ref class Node
	{
	public:
		Node(T n):value(n), left(nullptr), right(nullptr){}
		void listNode()
		{
			if(left != nullptr){
			    left->listNode();
			}		
			Console::WriteLine(format, value);
			if(++listCount % 5 ==0){
			     Console::WriteLine();
			}
			if(right != nullptr){
			    right->listNode();
			}
		}
		T value;
		Node^ left;
		Node^ right;
		static int listCount;
		static String^ format;
	};

	Node^ root;
	static int width;

public:
	BinaryTree() : root(nullptr){}

	void add(T o);
	void add(T o, Node^ node);

	void listNodes()
	{
		Node::format = L"{0, "+(width+2)+L"}"; //定义显示的空格数
		Node::listCount = 0;
		if(root ==nullptr){
		    Console::WriteLine(L"列表显示为空!");
		}else{
		    root->listNode();
		}
	}
};

//定义添加方法
generic<typename T>
void BinaryTree<T>::add(T o)
{
	if(root == nullptr){
	    root = gcnew Node(o);
	}else{
	    add(o, root);
	}

	width = System::Math::Max(width, o->ToString()->Length);
};

generic<typename T>
void BinaryTree<T>::add(T o, Node^ node)
{
	if(o == node->value){
	   Node^ newNode = gcnew Node(o);
	   Node^ temp = node->left;
	   node->left = newNode;
	   newNode->left = temp;
	}else if(o->CompareTo(node->value) > 0){
		if(node->right == nullptr){
		     node->right = gcnew Node(o);
		}else{
		     add(o, node->right);
		}
	}else{
		if(node->left == nullptr){
		     node->left = gcnew Node(o);
		}else{
		     add(o, node->left);
		}
	}
};


int main(array<System::String ^> ^args)
{
	BinaryTree<int>^ tree = gcnew BinaryTree<int>;
    unsigned int number = 0;
	Random^ generator = gcnew Random;

	for(int i=0; i<100; i++){
	    number = generator->Next(1, 1000000);
		tree->add(number);
		Console::Write(L"{0,12}", number);
		if((i+1) % 5 == 0){
		    Console::WriteLine();
		}
	}
	Console::WriteLine(L"Output from the tree is:");
	tree->listNodes();

	array<String^>^ words = {L"Success", L"is", L"the", L"ability", L"to",
	                         L"go", L"from", L"one", L"failure", L"to", 
	                         L"another", L"with", L"no", L"loss", L"of",
	                         L"enthusiasm"};
	BinaryTree<String^>^ strTree = gcnew BinaryTree<String^>;
	int lineCount = 0;
	for each(String^ str in words){
	     strTree->add(str);
		 Console::Write(L"{0,12}", str);
		 if(++lineCount % 5 == 0){
		     Console::WriteLine();
		 }
	}

	Console::WriteLine(L"\n\nOutput from the tree is:");
	strTree->listNodes();
	Console::WriteLine();

    system("pause");
	return 0;
}


/*#include <iostream>
using namespace System;
using namespace std;
int main(array<System::String ^> ^args)
{



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

  

posted @ 2012-11-10 23:56  简单--生活  阅读(421)  评论(0编辑  收藏  举报
简单--生活(CSDN)