Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef CNode_h
- #include <vector>
- #include <iostream>
- #include <string>
- #define CNode_h
- using namespace std;
- class CNode {
- public:
- CNode(string sValue, CNode * pParent);
- void vAddChild(CNode * pChild);
- string sGetValue();
- void sSetValue(string sText);
- CNode * pGetParent();
- void pSetParent(CNode * pParent);
- vector<CNode*> * pvGetChildren();
- void sGetValuesOfChildren();
- ~CNode();
- private:
- string sValue;
- vector < CNode* > pvChildren;
- CNode *pParent;
- };
- #endif
- #include "CNode.h"
- CNode::CNode(string sValue, CNode *pParent) {
- this->sValue = sValue;
- this->pParent = pParent;
- }
- void CNode::vAddChild(CNode *pChild) {
- this->pvChildren.push_back(pChild);
- }
- string CNode::sGetValue() {
- return sValue;
- }
- void CNode::sSetValue(string sText) {
- this->sValue = sText;
- }
- CNode * CNode::pGetParent() {
- return pParent;
- }
- void CNode::pSetParent(CNode * pParent) {
- this->pParent = pParent;
- }
- vector<CNode*> * CNode::pvGetChildren() {
- return &pvChildren;
- }
- void CNode::sGetValuesOfChildren() {
- for (int i = 0; i < pvChildren.size(); i++) {
- cout << pvChildren[i]->sGetValue()<<", ";
- }
- }
- CNode::~CNode() {
- for (int i = 0; i < pvChildren.size(); i++) {
- delete pvChildren[i];
- }
- }
- #ifndef CTree_h
- #include "CNode.h"
- #include "CUtils.h"
- #include <cstdlib>
- #include <math.h>
- #define CTree_h
- using namespace std;
- class CTree {
- public:
- CTree();
- CTree(CNode * pRoot);
- string sPrintTree();
- float iCountTree();
- bool bParseExpression(string sText);
- CTree * operator+(const CTree & pcOtherTree);
- void operator=(CTree & pcOtherTree);
- vector<string>* pvGetVariables();
- string sPrintVariables();
- void vRepairTree();
- ~CTree();
- private:
- CNode *pRoot;
- string sPrintHelper(CNode * pStartNode);
- int iIsOperator(string sText);
- void vRepairHelper(CNode * pStartNode);
- float iCountHelper(CNode * pStartNode);
- };
- #endif
- #include "CTree.h"
- CTree::CTree(CNode *pRoot) {
- this->pRoot = pRoot;
- }
- CTree::CTree() {
- this->pRoot = NULL;
- }
- string CTree::sPrintHelper(CNode *pStartNode) {
- string sTemp = "";
- sTemp += pStartNode->sGetValue();
- for (int i = 0; i < pStartNode->pvGetChildren()->size(); i++) {
- sTemp += " ";
- sTemp += sPrintHelper((*(pStartNode->pvGetChildren()))[i]);
- }
- return sTemp;
- }
- string CTree::sPrintTree() {
- return sPrintHelper(pRoot);
- }
- int CTree::iIsOperator(string sText){
- if (sText == "+") return 1;
- if (sText == "-") return 2;
- if (sText == "*") return 3;
- if (sText == "/") return 4;
- if (sText == "sin") return 5;
- if (sText == "cos") return 6;
- return 0;
- }
- float CTree::iCountTree() {
- return iCountHelper(pRoot);
- }
- float CTree::iCountHelper(CNode *pStartNode) {
- float iSum = 0;
- switch (iIsOperator(pStartNode->sGetValue())) {
- case 1: {
- if ((pStartNode->pvGetChildren()->size()) == 2) {
- iSum += (iCountHelper((*(pStartNode->pvGetChildren()))[0]) + iCountHelper((*(pStartNode->pvGetChildren()))[1]));
- }
- break;
- }
- case 2: {
- if ((pStartNode->pvGetChildren()->size()) == 2) {
- iSum += (iCountHelper((*(pStartNode->pvGetChildren()))[0]) - iCountHelper((*(pStartNode->pvGetChildren()))[1]));
- }
- break;
- }
- case 3: {
- if ((pStartNode->pvGetChildren()->size()) == 2) {
- iSum += (iCountHelper((*(pStartNode->pvGetChildren()))[0]) * iCountHelper((*(pStartNode->pvGetChildren()))[1]));
- }
- break;
- }
- case 4: {
- if ((pStartNode->pvGetChildren()->size()) == 2) {
- iSum += (iCountHelper((*(pStartNode->pvGetChildren()))[0]) / iCountHelper((*(pStartNode->pvGetChildren()))[1]));
- }
- break;
- }
- case 5: {
- if ((pStartNode->pvGetChildren()->size()) == 1) {
- iSum += sin(iCountHelper((*(pStartNode->pvGetChildren()))[0]));
- }
- break;
- }
- case 6: {
- if ((pStartNode->pvGetChildren()->size()) == 1) {
- iSum += cos(iCountHelper((*(pStartNode->pvGetChildren()))[0]));
- }
- break;
- }
- case 0: {
- string sTemp = pStartNode->sGetValue();
- iSum += atof(sTemp.c_str());
- break;
- }
- }
- return iSum;
- }
- vector<string> * CTree::pvGetVariables() {
- vector<string> * vTemp = new vector<string>;
- string sTree = sPrintTree();
- int i = 0;
- string sTemp = "";
- bool bIsAdded = false;
- while (i <= sTree.size()) {
- if (sTree[i] != ' ') {
- sTemp += sTree[i];
- i++;
- }
- else {
- while (i + 1 <= sTree.size() && sTree[i + 1] == ' ') {
- i++;
- }
- if (iIsOperator(sTemp) == 0 && CUtils::bIsVariable(sTemp)) {
- for (int i = 0; i < vTemp->size(); i++) {
- if ((*vTemp)[i] == sTemp) bIsAdded = true;
- }
- if (!bIsAdded) {
- vTemp->push_back(sTemp);
- }
- bIsAdded = false;
- }
- sTemp = "";
- i++;
- }
- if (i == sTree.size()) {
- if (iIsOperator(sTemp) == 0 && CUtils::bIsVariable(sTemp)) {
- for (int i = 0; i < vTemp->size(); i++) {
- if ((*vTemp)[i] == sTemp) bIsAdded = true;
- }
- if (!bIsAdded) {
- vTemp->push_back(sTemp);
- }
- bIsAdded = false;
- }
- }
- }
- return vTemp;
- }
- string CTree::sPrintVariables() {
- vector <string> *vTemp = pvGetVariables();
- string sTemp = "";
- for (int i = 0; i < vTemp->size(); i++) {
- sTemp += (*vTemp)[i];
- sTemp += " ";
- }
- delete vTemp;
- return sTemp;
- }
- void CTree::vRepairTree() {
- vRepairHelper(pRoot);
- }
- void CTree::vRepairHelper(CNode *pStartNode) {
- if (iIsOperator(pStartNode->sGetValue()) > 0 && iIsOperator(pStartNode->sGetValue()) < 5) {
- if ((pStartNode->pvGetChildren()->size()) == 1) {
- pStartNode->vAddChild(new CNode("1", pStartNode));
- }
- if ((pStartNode->pvGetChildren()->size()) == 0) {
- pStartNode->vAddChild(new CNode("1", pStartNode));
- pStartNode->vAddChild(new CNode("1", pStartNode));
- }
- }
- if (iIsOperator(pStartNode->sGetValue()) > 4 && iIsOperator(pStartNode->sGetValue()) < 7) {
- if ((pStartNode->pvGetChildren()->size()) < 1) {
- pStartNode->vAddChild(new CNode("1", pStartNode));
- }
- }
- for (int i = 0; i < pStartNode->pvGetChildren()->size(); i++) {
- vRepairHelper((*(pStartNode->pvGetChildren()))[i]);
- }
- }
- bool CTree::bParseExpression(string sText) {
- pRoot = new CNode(CUtils::sGetHead(sText), NULL);
- string sTemp = CUtils::sGetTail(sText);
- CNode * pCurrentNode = pRoot;
- CNode * pTempNode;
- bool bSkipped = false;
- while (sTemp.size() > 0) {
- if (iIsOperator(pCurrentNode->sGetValue()) >= 1 && iIsOperator(pCurrentNode->sGetValue()) <= 4) {
- if (pCurrentNode->pvGetChildren()->size() < 2) {
- pTempNode = new CNode(CUtils::sGetHead(sTemp), pCurrentNode);
- sTemp = CUtils::sGetTail(sTemp);
- pCurrentNode->vAddChild(pTempNode);
- pCurrentNode = pTempNode;
- }
- else {
- if (pCurrentNode->pGetParent() == NULL) {
- bSkipped = true;
- sTemp = CUtils::sGetTail(sTemp);
- }
- else pCurrentNode = pCurrentNode->pGetParent();
- }
- }
- else if (iIsOperator(pCurrentNode->sGetValue()) >= 5 && iIsOperator(pCurrentNode->sGetValue()) <= 6) {
- if (pCurrentNode->pvGetChildren()->size() < 1) {
- pTempNode = new CNode(CUtils::sGetHead(sTemp), pCurrentNode);
- sTemp = CUtils::sGetTail(sTemp);
- pCurrentNode->vAddChild(pTempNode);
- pCurrentNode = pTempNode;
- }
- else {
- if (pCurrentNode->pGetParent() == NULL) {
- bSkipped = true;
- sTemp = CUtils::sGetTail(sTemp);
- }
- else pCurrentNode = pCurrentNode->pGetParent();
- }
- }
- else if (iIsOperator(pCurrentNode->sGetValue()) == 0) {
- if (pCurrentNode->pGetParent() == NULL) {
- bSkipped = true;
- sTemp = CUtils::sGetTail(sTemp);
- }
- else pCurrentNode = pCurrentNode->pGetParent();
- }
- }
- return bSkipped;
- }
- CTree* CTree::operator+(const CTree & pcOtherTree) {
- string sFirstTree = this->sPrintTree();
- string sSecondTree = sPrintHelper(pcOtherTree.pRoot);
- int i = 0;
- string sFinallyTree = "";
- string sTemp = "";
- bool bAdded = false;
- while (i < (sFirstTree.size())) {
- if (sFirstTree[i] != ' ') {
- sTemp += sFirstTree[i];
- i++;
- }
- else if ((!bAdded) && (iIsOperator(sTemp) == 0)) {
- sFinallyTree += " ";
- sFinallyTree += sSecondTree;
- bAdded = true;
- sTemp = "";
- i++;
- }
- else {
- sFinallyTree += " " + sTemp;
- sTemp = "";
- i++;
- }
- if (i == sFirstTree.size()) {
- sFinallyTree += " " + sTemp;
- sTemp = "";
- i++;
- }
- }
- CTree *cTempTree = new CTree;
- cTempTree->bParseExpression(sFinallyTree);
- return cTempTree;
- }
- void CTree::operator=(CTree &pcOtherTree)
- {
- this->pRoot = (pcOtherTree.pRoot);
- }
- CTree::~CTree() {
- delete pRoot;
- }
- #ifndef CUtils_h
- #include <string>
- #define CUtils_h
- using namespace std;
- class CUtils {
- public:
- static bool bIsLetter(char cTemp);
- static bool bIsVariable(string sText);
- static string sGetHead(string sText);
- static string sGetTail(string sText);
- static bool bIsNumber(string sText);
- static bool bIsAuthorizedCharacter(char cTemp);
- };
- #endif
- #include "CUtils.h"
- bool CUtils::bIsLetter(char cTemp) {
- int iAsci = cTemp;
- if ((iAsci >= 65 && iAsci <= 90) || (iAsci >= 97 && iAsci <= 122)) {
- return true;
- }
- return false;
- }
- /*
- bool CUtils::bIsVariable(string sText) {
- for (int i = 0; i<sText.size(); i++) {
- if (bIsLetter(sText[i])) {
- return true;
- }
- }
- return false;
- }
- */
- bool CUtils::bIsNumber(string sText) {
- int iTemp;
- for (int i = 0; i < sText.size(); i++) {
- iTemp = sText[i];
- if (iTemp < 48 && iTemp > 57) {
- return false;
- }
- }
- return true;
- }
- bool CUtils::bIsAuthorizedCharacter(char cTemp) {
- int iTemp = cTemp;
- if ((iTemp >= 48 && iTemp <= 57) || (iTemp >= 65 && iTemp <= 90) || (iTemp >= 97 && iTemp <= 122) || (cTemp == '+') || (cTemp == '-') || (cTemp == '*') || (cTemp == '/') || (iTemp == 32) || (iTemp == 0)) {
- return true;
- }
- return false;
- }
- bool CUtils::bIsVariable(string sText) {
- int iTemp;
- if (sText == "sin" || sText == "cos") {
- return false;
- }
- for (int i = 0; i < sText.size(); i++) {
- iTemp = sText[i];
- if (((iTemp >= 97 && iTemp <= 122) || (iTemp >= 65 && iTemp <= 90))) {
- return true;
- }
- }
- return false;
- }
- string CUtils::sGetHead(string sText) {
- int iIndex = 0;
- string sTemp = "";
- while (iIndex < sText.size() && sText[iIndex] == ' ') {
- iIndex++;
- }
- while (iIndex < (sText.size())) {
- if (sText[iIndex] != ' ') {
- sTemp += sText[iIndex];
- iIndex++;
- }
- else {
- return sTemp;
- }
- }
- return sTemp;
- }
- string CUtils::sGetTail(string sText) {
- int iIndex = 0;
- bool bStop = true;
- string sTemp = "";
- while (iIndex < sText.size() && sText[iIndex] == ' ') {
- iIndex++;
- }
- while (iIndex < (sText.size()) && bStop) {
- if (sText[iIndex] != ' ') {
- iIndex++;
- }
- else {
- bStop = false;
- }
- }
- for (int i = iIndex; i < sText.size(); i++) {
- sTemp += sText[i];
- }
- return sTemp;
- }
- #ifndef CInterface_h
- #include "CTree.h"
- #include <stdlib.h>
- #define CInterface_h
- class CInterface {
- public:
- void vPrintHelp();
- void vStep();
- private:
- CTree *cMainTree = new CTree;
- void vEnter(string sText);
- void vVars();
- void vPrint();
- void vComp(string sValues);
- void vJoin(string sText);
- };
- #endif
- #include "CInterface.h"
- void CInterface::vEnter(string sText) {
- cMainTree = new CTree;
- bool bUnauthorizedCharacters = false;
- string sExpression = "";
- int iIndex = 0;
- while (iIndex < (sText.size())) {
- if (CUtils::bIsAuthorizedCharacter(sText[iIndex])){
- sExpression += sText[iIndex];
- iIndex++;
- }
- else {
- bUnauthorizedCharacters = true;
- iIndex++;
- }
- }
- if (bUnauthorizedCharacters) {
- cout << "W wyrazeniu napotkano niedozwolone znaki, ktore zostaly pominiete!" << endl;
- }
- if (cMainTree->bParseExpression(sExpression)) {
- cout << "W wyrazeniu napotkano wartosci/zmienne nie pasujace do operatorow, ktore zostaly pominiete!" << endl;
- }
- sExpression = cMainTree->sPrintTree();
- cMainTree->vRepairTree();
- if (sExpression != (cMainTree->sPrintTree())) {
- cout << "Wyrazenie wymagalo naprawy! - Naprawiono pomyslnie." << endl;
- }
- cout << "Aktualne wyrazenie: " << cMainTree->sPrintTree()<<endl;
- }
- void CInterface::vVars() {
- if (cMainTree->sPrintVariables().size() < 1) {
- cout << "Brak zmiennych w drzewie." << endl;
- }
- else {
- cout << "Zmienne: " << cMainTree->sPrintVariables() << endl;
- }
- }
- void CInterface::vPrint() {
- cout << "Aktualne drzewo: " << cMainTree->sPrintTree() << endl;
- }
- void CInterface::vComp(string sValues) {
- vector<string> *pvVariables = cMainTree->pvGetVariables();
- if (pvVariables->size() == 0) {
- cout << "Wynik: " << cMainTree->iCountTree() << endl;
- return;
- }
- string sTemp = sValues;
- vector<string> pvValues;
- while (sTemp.size() > 0) {
- pvValues.push_back(CUtils::sGetHead(sTemp));
- sTemp = CUtils::sGetTail(sTemp);
- }
- if (pvVariables->size() != (&pvValues)->size()) {
- cout << "Liczba podanych argumentow nie zgadza sie z liczba zmiennych znalozionych w drzewie!" << endl;
- return;
- }
- for (int i = 0; i < (&pvValues)->size(); i++) {
- if (!CUtils::bIsNumber((pvValues)[i])) {
- cout << "Wsrod podanych wartosci znajduja sie wartosci, ktore nie sa liczba!" << endl;
- return;
- }
- }
- bool bAdded = false;
- string sTree = cMainTree->sPrintTree();
- string sNewTree = "";
- while (sTree.size() > 0) {
- if (CUtils::bIsVariable(CUtils::sGetHead(sTree))) {
- for (int i=0; i < pvVariables->size(); i++) {
- if ((CUtils::sGetHead(sTree)) == (*pvVariables)[i]) {
- sNewTree += " ";
- sNewTree += (pvValues)[i];
- }
- }
- }
- else {
- sNewTree += " ";
- sNewTree += CUtils::sGetHead(sTree);
- }
- sTree = CUtils::sGetTail(sTree);
- }
- cout << "Uzupelnione drzewo: " << sNewTree << endl;
- CTree cNewTree;
- cNewTree.bParseExpression(sNewTree);
- cout << "Wynik: " << cNewTree.iCountTree() << endl;
- }
- void CInterface::vJoin(string sText) {
- CTree cSecondTree;
- bool bUnauthorizedCharacters = false;
- string sExpression = "";
- int i = 0;
- while (i < (sText.size())) {
- if (CUtils::bIsAuthorizedCharacter(sText[i])) {
- sExpression += sText[i];
- i++;
- }
- else {
- bUnauthorizedCharacters = true;
- i++;
- }
- }
- if (bUnauthorizedCharacters) {
- cout << "W wyrazeniu napotkano niedozwolone znaki, ktore zostaly pominiete!" << endl;
- }
- if ((&cSecondTree)->bParseExpression(sExpression)) {
- cout << "W wyrazeniu napotkano wartosci/zmienne nie pasujace do operatorow, ktore zostaly pominiete!" << endl;
- }
- sExpression = (&cSecondTree)->sPrintTree();
- (&cSecondTree)->vRepairTree();
- if (sExpression != ((&cSecondTree)->sPrintTree())) {
- cout << "Wyrazenie wymagalo naprawy! - Naprawiono pomyslnie." << endl;
- }
- cMainTree = *cMainTree + cSecondTree;
- cout << "Aktualne wyrazenie: " << cMainTree->sPrintTree() << endl;
- }
- void CInterface::vPrintHelp() {
- system("cls");
- cout << "Dostepne komendy:" << endl;
- cout << "- enter <formula> - tworzy drzewo na podstawie podanego wyrazenia" << endl;
- cout << "- vars - wypisuje wszystkie zmienne z aktualnego drzewa" << endl;
- cout << "- print - wypisuje aktualne drzewo w postaci prefiksowej" << endl;
- cout << "- comp <var0> <var1>... - obliczenie wyniku dla wprowadzonych wartosci" << endl;
- cout << "- join <formula> - dokleja wyrazenie do obecnego drzewa" << endl;
- cout << "- help - wyswietla liste komend" << endl;
- }
- void CInterface::vStep() {
- cout << "> ";
- string sLine;
- getline(cin, sLine);
- if (!cin) cin.clear();
- if (sLine.length()<1) {
- cout << "Wprowadz komende" << endl;
- vStep();
- }
- else if (CUtils::sGetHead(sLine) == "enter") {
- if (CUtils::sGetTail(sLine).size() > 0) {
- vEnter(CUtils::sGetTail(sLine));
- }
- }
- else if (CUtils::sGetHead(sLine) == "vars") {
- vVars();
- }
- else if (CUtils::sGetHead(sLine) == "print") {
- vPrint();
- }
- else if (CUtils::sGetHead(sLine) == "comp") {
- vComp(CUtils::sGetTail(sLine));
- }
- else if (CUtils::sGetHead(sLine) == "join") {
- if (CUtils::sGetTail(sLine).size() > 0) {
- vJoin(CUtils::sGetTail(sLine));
- }
- }
- else if (CUtils::sGetHead(sLine) == "help") {
- vPrintHelp();
- }
- else {
- cout << "Nie znaleziono podanej komendy." << endl;
- vStep();
- }
- }
- #include "CInterface.h"
- using namespace std;
- int main() {
- CInterface interface;
- interface.vPrintHelp();
- while (true) {
- interface.vStep();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment