-1 #IND Frage
Ich bin derzeit am schreiben eines c++ für binäre Bäume. Das ganze ist geschrieben, doch egal welchen Ausdruck ich will zu bewerten, halte ich mit der Eingabeaufforderung den Befehl sagen Sie mir, -1.#IND. Irgendwelche Ideen auf, eine Lösung für dieses Problem oder sogar, was das bedeutet?
Vielen Dank im Voraus
Code:
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
template<typename T> struct TreeNode
{
TreeNode(const T& value, TreeNode<T>* left = NULL, TreeNode<T>* right = NULL)
{
Value = value;
Left = left;
Right = right;
}
T Value;
TreeNode<T>* Left;
TreeNode<T>* Right;
bool IsLeaf() const
{
return Left == NULL && Right == NULL;
}
};
double ValueOf(TreeNode<char>* treeNode)
{
if ( treeNode->IsLeaf() )
{
return treeNode->Value - '0';
}
else
{
switch(treeNode->Value)
{
case '+':
return ValueOf(treeNode->Left) + ValueOf(treeNode->Right);
break;
case '-':
return ValueOf(treeNode->Left) - ValueOf(treeNode->Right);
break;
case '*':
return ValueOf(treeNode->Left) * ValueOf(treeNode->Right);
break;
case '/':
return ValueOf(treeNode->Left) / ValueOf(treeNode->Right);
break;
}
}
}
void main()
{
string expression;
cout << "Please enter an expression: ";
cin >> expression;
TreeNode<char> *newLeaf;
TreeNode<char> *treeRoot;
TreeNode<char> *currentNode;
TreeNode<char> *newRoot;
TreeNode<char> *newChild;
treeRoot = NULL;
currentNode = treeRoot;
for (int i = 0; i < expression.length(); i++)
{
if ( (expression[i] >= 0 ) || ( expression[i] <= 9 ) )
{
newLeaf = new TreeNode <char> (expression[i]);
if ( currentNode == NULL)
{
treeRoot = currentNode = newLeaf;
}
else
{
currentNode->Right = newLeaf;
}
}
else if ( (( expression[i] == '+' || expression[i] == '-') || (expression[i] == '*' || expression[i] == '/' )) && currentNode->Right == NULL )
{
newRoot = new TreeNode <char> (expression[i]);
newRoot->Left = treeRoot;
treeRoot = newRoot;
currentNode = newRoot;
}
else if (expression[i] == '*' || expression[i] == '/')
{
newChild = new TreeNode <char> (expression[i]);
newChild->Left = currentNode->Right;
currentNode->Right = newChild;
currentNode = newChild;
}
}
double result = ValueOf(treeRoot);
cout << "The result is: " << result << endl;
system("pause");
}
- "Ich habe ein Auto und egal wie ich den Schlüssel drehen, es lässt sich nicht einschalten. Warum?" Kann Ihnen nicht sagen, ohne zu sehen, das ganze Auto...Zeig uns deinen code, was dein input ist, was Sie erwarten und was Sie bekommen.
- Da sind Sie, sir.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
ValueOf
Funktion wird automatisch return random Quatsch, wenn es passiert, übergeben werden, etwas, das nicht ein Blatt und nicht Wert einer der vier Rechen-op-Zeichen. In diesem Fall, zu versuchen, um anzuzeigen, dass zufällige Unsinn produzieren können alle Arten von verrückten Ergebnisse. Das wäre kein Problem, wenn der rest des Codes garantiert, dass das nicht passieren könnte. Leider ...Den code, -- nehme ich an -- ist bestimmt zum Parsen von Ausdrücken kann sehr leicht produzieren solche Dinge. Zum Beispiel: angenommen, Sie geben Sie den Ausdruck
12
. Dann zunächst einen Knoten mit nur1
erstellt wird; dann eine2
erstellt gemacht und das Rechte Kind des1
Knoten. Das bedeutet, dass der letztere nicht mehr als ein Blatt. Bang.Nun, natürlich ist das nicht die Art von Ausdruck, den Sie im Sinn hatte. Also, warum funktioniert es also nicht OK, wenn Sie eingeben, sagen,
1+2
? Nun, hier ist die wichtigste Sache, die tötet Sie:Werden sollte
&&
, nicht||
. Damit die anderen bits von Ihrem parser nie benutzt! (Und natürlich sind Sie am Ende mit einem Baum, der nicht das geringste bisschen Sinn.)||
bug-und single-zitiert jene stellen, zumindest einige Ausdrücke werden korrekt analysiert und ausgewertet. Eine einfache eine, die nicht ist1*2+3
. Hier ist ein Tipp, um herauszufinden, was geht da schief: wenn die+
gesehen,currentNode->Right
ist nicht null.Bedeutet dies, dass Sie etwas illegales zu einem
double
oderfloat
(wie wenn man die Wurzel einer negativen Zahl). Siehe auch hier: http://www.johndcook.com/IEEE_exceptions_in_cpp.html