rendered paste body/* main.cc
*******************
* Author: Thomas Karpiniec
* Last Modified: 16 Dec 2005
*/
#include <iostream>
void numberCycle(int totalNum, int currentNum, double* selectFrom, double* addTo);
void operatorCycle(int totalNum, int currentNum, int* addTo, double* numbers);
void orderCycle(int totalNum, int currentNum, double* numbers, int* operators, int* order);
int main(int nArgs, char* pszArgs[])
{
double numbers[4] = {1.0,3.0,4.0,6.0};
numberCycle(4,1,numbers,NULL);
return 0;
}
void numberCycle(int totalNum, int currentNum, double* selectFrom, double* addTo)
{
if (addTo == NULL)
addTo = new double[totalNum];
for (int i = 0; i < (totalNum-currentNum + 1); i++)
{
addTo[currentNum - 1] = selectFrom[i];
if (totalNum - currentNum == 0)
{
std::cout << addTo[0] << addTo[1] << addTo[2] << addTo[3] << std::endl;
// AddTo now points to an array of integers - pass it off.
operatorCycle(3, 1, NULL, addTo);
}
else
{
double newSelectFrom[totalNum];
for (int j = 0; j < totalNum; j++)
newSelectFrom[j] = selectFrom[j];
newSelectFrom[i] = newSelectFrom[totalNum-currentNum];
numberCycle(totalNum, currentNum + 1, newSelectFrom, addTo);
}
}
}
void operatorCycle(int totalNum, int currentNum, int* addTo, double* numbers)
{
if (addTo == NULL)
addTo = new int[totalNum];
for (int i = 0; i < 4; i++)
{
addTo[currentNum-1] = i;
if (currentNum == totalNum)
{
std::cout << addTo[0] << addTo[1] << addTo[2] << std::endl;
// AddTo now points to an array of operators represented as integers
// Grab it and the existing "numbers" array, and pass it off
orderCycle(3,1,numbers,addTo,NULL);
}
else
{
operatorCycle(totalNum, currentNum + 1, addTo, numbers);
}
}
}
void orderCycle(int totalNum, int currentNum, double* numbers, int* operators, int* addTo)
{
if (addTo == NULL)
addTo = new int[totalNum];
for (int i = 0; i < (totalNum - currentNum + 1); i++)
{
double current;
switch (operators[currentNum - 1])
{
case 0:
current = (double)(numbers[currentNum + i] + numbers[currentNum - 1 + i]);
break;
case 1:
current = (double)(numbers[currentNum + i] - numbers[currentNum - 1 + i]);
break;
case 2:
current = (double)(numbers[currentNum + i] * numbers[currentNum - 1 + i]);
break;
case 3:
current = (double)(numbers[currentNum + i] / numbers[currentNum - 1 + i]);
break;
default:
current = 0;
}
double newNumbers[totalNum + 1];
int newOperators[totalNum];
for (int j = 0; j < (totalNum + 1); j++)
{
newNumbers[j] = numbers[j];
newOperators[j] = operators[i];
}
newNumbers[currentNum - 1] = current;
for (int j = i; j < (totalNum - 1); j++)
{
newNumbers[j] = newNumbers[j+1];
newOperators[j] = newOperators[j+1];
}
addTo[currentNum - 1] = i;
orderCycle(totalNum, currentNum + 1, newNumbers, newOperators, addTo);
}
}
void displayResult()
{
}