Figure 15.2 |
#include <iostream> // cin, cout, cerr, ...
#include <stack> // stack<T>
using namespace std;
string convertDecimal(int number, int base);
int main()
{
cout << "To convert a decimal integer to a different base,\n"
<< " enter a positive integer: ";
int number;
cin >> number;
cout << " then enter the base to which it is to be converted: ";
int base;
cin >> base;
cout << '\n' << convertDecimal(number, base)
<< " is the base-" << base
<< " representation of " << number << endl;
}
char baseDigit(int value);
/* convertDecimal() converts a decimal value to its base representation
* Receive: number, an int; and
* base, an int
* Precondition: number is positive &&
* 2 <= base && base <= 35
* Return: a string giving the base-base representation of number
*/
string convertDecimal(int number, int base)
{
stack<int> intStack;
int remainder;
do
{
remainder = number % base;
intStack.push(remainder);
number /= base;
}
while (number != 0);
string resultString = "";
char digitChar;
while ( !intStack.empty() )
{
remainder = intStack.top();
intStack.pop();
digitChar = baseDigit(remainder);
resultString += digitChar;
}
return resultString;
}
/* Table look-up routine for mapping 0-35 to 0-z
* Receive: value, an int.
* Precondition: 0 <= value && value <= 35
* Return: the 0-z representation of value
*/
char baseDigit (int value)
{
const int VALUES_SUPPORTED = 36;
const char resultArray[VALUES_SUPPORTED] =
{ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
'u', 'v', 'w', 'x', 'y', 'z'};
char result = '*';
if (0 <= value && value < VALUES_SUPPORTED)
result = resultArray[value];
else
cerr << "\n** baseDigit(value): "
<< value << " outside of range 0.."
<< VALUES_SUPPORTED-1 << endl;
return result;
}
-------------------------
Sample runs:
To convert a decimal integer to a different base,
enter a positive integer: 32
then enter the base to which it is to be converted: 2
100000 is the base-2 representation of 32
To convert a decimal integer to a different base,
enter a positive integer: 32
then enter the base to which it is to be converted: 8
40 is the base-8 representation of 32
To convert a decimal integer to a different base,
enter a positive integer: 32
then enter the base to which it is to be converted: 16
20 is the base-16 representation of 32
To convert a decimal integer to a different base,
enter a positive integer: 255
then enter the base to which it is to be converted: 16
ff is the base-16 representation of 255
|
Figure 15.3 |
#include <iostream> // cin, cout, cerr, ...
#include <queue> // queue<T>, priority_queue<T>
using namespace std;
int main()
{
string name = "JoeSmith";
priority_queue<char> pQ;
queue<char> q;
for (int i = 0; i < 5; i++)
{
q.push(name[i]); // insert into normal queue
pQ.push(name[i]); // insert into priority queue
}
while ( !q.empty() ) // output normal queue values
{
cout << q.front();
q.pop();
}
cout << endl;
while ( !pQ.empty() ) // output priority queue values
{
cout << pQ.top();
pQ.pop();
}
cout << endl;
}
----------------- Sample run: JoeSmith tomiheSJ |
Figure 15.5 |
template <typename DataType>
bool BST<DataType>::search(const DataType& item) const
{
Node* currentNode = root; // search pointer
bool found = false; // indicates if item already in BST
while (currentNode != 0 && !found)
{
if (item < currentNode->myValue) // descend left
currentNode = currentNode->myLeft;
else if (item > currentNode->myValue) // descend right
currentNode = currentNode->myRight;
else // item found
found = true;
}
return found;
}
|
Figure 15.6 |
template <typename DataType>
void BST<DataType>::print(ostream& out) const
{
if (myRoot != 0) // if I am not empty
myRoot->print(out); // invoke recursive Node print()
}
template <typename DataType>
void BST<DataType>::Node::print(ostream& out) const
{
if (myLeft != 0) // if my left subtree is not empty
myLeft->print(out); // display its values first
out << myData << ' '; // display my value
if (myRight != 0) // if my right subtree is not empty
myRight->print(out); // display its values last
}
|
Figure 15.7 |
template <typename DataType>
void BST<DataType>::Insert(const DataType & item)
{
Node* currentNode = root, // search pointer
parentNode = 0; // pointer to parent of current node
bool found = false; // indicates if item already in BST
while (currentNode != 0 && !found)
{
parentNode = currentNode;
if (item < currentNode->myValue) // descend left
currentNode = currentNode->myLeft;
else if (item > currentNode->myValue) // descend right
currentNode = currentNode->myRight;
else // item found
found = true;
}
if (found)
cerr << "Item already in the tree\n";
else
{
currentNode = new Node(item); // construct node ctg item
if (parentNode == 0) // empty tree
root = currentNode;
else if (item < parentNode->data) // insert to parent’s left
parentNode->myLeft = currentNode;
else // insert to parent’s right
parentNode->myRight = currentNode;
}
}
|
Figure 15.8 |
#include <iostream>
using namespace std;
#include "DecisionTree.h"
bool playMore();
int main()
{
cout << "\nWelcome to the game of Animal!\n";
DecisionTree dTree("animal.data"); // load knowledge base
do
{
cout << "\nThink of an animal, and I will try to guess it...\n\n";
int winner = dTree.descend(); // 0 == the person,
if (winner)
cout << "\nHa! Even a computer program can beat you...\n";
else
cout << "\nYou were just lucky...\n";
}
while ( playMore() );
} // knowledge base is auto-saved to file by DecisionTree destructor
bool playMore()
{
char answer;
cout << "\nDo you want to play again (y or n)? ";
cin >> answer;
return ((answer == 'y') || (answer == 'Y'));
}
|