Требуется совет по программе Си/С++
У меня возникла проблема. У меня просто программа по графику и уравнению, я отдельно написал и то и другое, но у меня не работает оно всё вместе. Часть с графиком:
#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;
}
У меня просто ступор. Может вы ещё подскажите как сделать код более компактным