Требуется совет по программе Си/С++

У меня возникла проблема. У меня просто программа по графику и уравнению, я отдельно написал и то и другое, но у меня не работает оно всё вместе. Часть с графиком:

#include <Windows.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#define graphic(x) (x * x - 2 * x + 4) //график который будет строится

int main(void) {
    float x;
    HDC hDC = GetDC(GetConsoleWindow());
    HPEN Pen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
    SelectObject(hDC, Pen);
    MoveToEx(hDC, 0, 85, NULL);
    LineTo(hDC, 200, 85);
    MoveToEx(hDC, 100, 0, NULL);
    LineTo(hDC, 100, 170);
    for (x = -8.0f; x <= 8.0f; x += 0.01f) // O(100,85) - center
    {
        MoveToEx(hDC, 10 * x + 100, -10 * graphic(x) + 85, NULL); // 10 - scale
        LineTo(hDC, 10 * x + 100, -10 * graphic(x) + 85);
    }
    getch();
    return 0;
}

Часть с функцией перевода уравнения в нормальный вид.

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

struct node {
    string key;
    node * left;
    node * right;
};

struct nd {
    double date;
    nd * next;
};

nd * Head;
void Push_nd(double date) {
    nd * temp = new nd;
    temp->date = date;
    temp->next = Head;
    Head = temp;
    return;
}

void Print_nd() {
    nd * q = Head;
    while (q) {
        cout << "\nОтвет:\t" << q->date;
        q = q->next;
    }
    return;
}

int Priority(char c) {
    switch (c) {
    case '%':
        return 5;
    case '^':
        return 4;
    case '+':
    case '-':
        return 2;
    case '*':
    case '/':
        return 3;
    }
    return 1000;
}

double Pop() {
    if (Head == 0)
        return 0;
    double i = Head->date;
    Head = Head->next;
    return i;
}

node * MakeTree(string * Term, size_t first, size_t last) {
    int nest = 0;
    node * Tree = new node;
    if (first == last) {
        Tree->key = Term[first];
        Tree->left = Tree->right = 0;
        return Tree;
    }
    int minprt = 100;
    size_t k;
    for (size_t i = first; i <= last; i++) {
        size_t size_perem = Term[i].size();
        int prt;
        if (size_perem > 1) {
            prt = 100;
            if (prt <= minprt) {
                minprt = prt;
                k = i;
            }
        } else {
            char c = Term[i][0];
            if (c == '(') {
                nest++;
                continue;
            }
            if (c == ')') {
                nest--;
                continue;
            }
            if (nest > 0) {
                continue;
            }
            prt = Priority(c);
            if (prt <= minprt) {
                minprt = prt;
                k = i;
            }
        }
    }
    if (minprt == 100 && Term[first][0] == '(' && Term[last][0] == ')')
        return MakeTree(Term, first + 1, last - 1);
    Tree->key = Term[k];
    Tree->left = MakeTree(Term, first, k - 1);
    Tree->right = MakeTree(Term, k + 1, last);
    return Tree;
}

void LPK(node * Tree) {
    if (!Tree) {
        return;
    }
    LPK(Tree->left);
    LPK(Tree->right);
    cout << Tree->key << "|";
    if (Tree->key.size() > 1 || isdigit(Tree->key[0])) {
        char * date;
        date = new char[Tree->key.size()];
        for (int i = 0; i < Tree->key.size(); i++) {
            date[i] = Tree->key[i];
        }
        Push_nd(atof(date));
        delete date;
    }
    if (Tree->key == "+") {
        double x1 = Pop();
        double x2 = Pop();
        Push_nd(x1 + x2);
    }
    if (Tree->key == "-") {
        double x1 = Pop();
        double x2 = Pop();
        Push_nd(x2 - x1);
    }
    if (Tree->key == "/") {
        double x1 = Pop();
        double x2 = Pop();
        Push_nd(x2 / x1);
    }
    if (Tree->key == "*") {
        double x1 = Pop();
        double x2 = Pop();
        Push_nd(x1 * x2);
    }
    if (Tree->key == "^") {
        double x1 = Pop();
        double x2 = Pop();
        Push_nd(pow(x2, x1));
    }
    if (Tree->key == "%") {
        double x1 = Pop();
        double x2 = Pop();
        Push_nd(fmod(x2, x1));
    }
    return;
}

bool isOperandSym(int ch) { return isalnum(ch) || ch == '_' || ch == '.' || ch == ','; }

size_t SizeTree(const string & s, size_t n) {
    size_t p = 0;
    bool inTerm = false;
    for (int i = 0; i < n; i++) {
        if (isOperandSym(s[i])) {
            if (!inTerm) {
                inTerm = true;
                ++p;
            }
        } else {
            if (inTerm)
                inTerm = false;
            if (!isspace(s[i]))
                ++p;
        }
    }
    return p;
}

string Input_perem(const string & s) {
    cout << "Введите значение переменной:" << s << endl;
    string name_perem;
    cin >> name_perem;
    return name_perem;
}

void MakeTerm(string * Term, size_t n, const string & s, int * k) {
    for (int i = 0; i < n; i++) {
        if (isOperandSym(s[i])) {
            char name[100] = "";
            int z = 0;
            while (isOperandSym(s[i]) && i < n) {
                name[z] = s[i];
                z++;
                i++;
            }
            string name1 = name;
            size_t size_name = name1.size();
            int date_or_name = 1;
            if (size_name == 1) {
                if (isdigit(name[0])) {
                    Term[(*k)] = name;
                    (*k)++;
                } else {
                    string name_perem = Input_perem(name1);
                    Term[(*k)] = name_perem;
                    (*k)++;
                }
            } else {
                date_or_name = 0;
                for (int i = 0; i < size_name; i++) {
                    if (isdigit(name[i]) || name[i] == ',' || name[i] == '.') {
                        date_or_name++;
                    }
                }
                if (date_or_name != size_name) {
                    string name_perem = Input_perem(name1);
                    Term[(*k)] = name_perem;
                    (*k)++;
                } else {
                    Term[(*k)] = name;
                    (*k)++;
                }
            }
        }
        if (s[i] == '(' || s[i] == ')') {
            Term[(*k)] = s[i];
            (*k)++;
        }
        if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/' || s[i] == '^' || s[i] == '%') {
            Term[(*k)] = s[i];
            (*k)++;
        }
    }
    return;
}
int main() {
    setlocale(0, "");
    size_t n;
    size_t size_term = 0;
    int k = 0;
    string s, s2;
    char mm[256];
    cout << "Введите уравнение: ";
    getline(cin, s2);
    n = s2.size();
    for (int i = 0; i < n; i++)
        if (s2[i] == '=')
            for (int j = i + 1; j < n; j++)
                mm[l++] = s2[j];
    s = mm;
    n = s.size();
    size_term = SizeTree(s, n);
    string * Term = new string[size_term];
    MakeTerm(Term, n, s, &k);
    node * Tree = MakeTree(Term, 0, size_term - 1);
    LPK(Tree);
    Print_nd();
    return 0;
}

У меня просто ступор. Может вы ещё подскажите как сделать код более компактным


Ответы (0 шт):