Witam
piszę program, który ma obliczać wartość wyrażeń z jedną niewiadomą. Wszystko planuję zrobić przy pomocy ONP, ale od kilku dni myślę i nie mogę wymyślić jakiegoś fajnego sposobu na obliczanie takich wyrażeń.
Przykładowe wyrażenie: (4+5)*(1-x)=15
Nie mam pomysłu w jaki sposób liczyć takie wyrażenia.
Liczę na jakieś sugestie jak rozłożyć dane na stosach lub inaczej się za to zabrać ,aby wszystko jakoś się liczyło.
Nie wiem w jaki sposób ma mi to pomóc z ONP, ale dzięki :D
Co ma ONP do rozwiązywania równań z jedną niewiadomą w pierwszej potędze?
Z ONP łatwo się przechodzi do drzewa.
W drzewie łatwo się przenosi.
Dzięki za pomoc, cały dzień próbowałem napisać coś co działałoby jak takie drzewo. Na razie nic nie wychodzi. W życiu nie używałem drzewa. Może pokaże co wypociłem:
Plik wyznacz.h
#include "zmienna.h"
#include <stdlib.h>
struct ArNODE
{
ArNODE *left, *right;
char op;
double val;
};
struct stosT
{
ArNODE node;
stosT *next;
};
void initTr(stosT *head)
{
head->next = NULL;
}
void push(stosT *stos, ArNODE node)
{
stosT *nowy = (stosT*)malloc(sizeof(ArNODE));
nowy->node = node;
nowy->next = stos->next;
stos->next = nowy;
}
ArNODE pop(stosT *l)
{
if (l->next == NULL)
return l->node;
ArNODE elem = l->next->node;
void* x = l->next;
l->next = l->next->next;
free(x);
return elem;
}
ArNODE drzewo(char* onp, zmienna **tab);
I niedokończone drzewo:
#include "Wyznacz.h"
#include <string.h>
ArNODE drzewo(char* onp, zmienna **tab)
{
stosT stos;
initTr(&stos);
ArNODE *v;
for (int i = 0; i < strlen(onp); i++)
{
v = new ArNODE;
if (onp[i] == '+' || (onp[i] == '-' && onp[i + 1] == ' ') || onp[i] == '*' || onp[i] == '/')
v->op = onp[i];
else if ((onp[i] >= '0' && onp[i] <= '9') || (onp[i] == '-' && onp[i + 1] != ' '))
{
char* temp = (char*)malloc(100);
int j = 0;
while (onp[i]!=' ')
temp[j++] = onp[i++];
temp[j] = '\0';
v->val = atof(temp);
v->op = '0';
}
else if (onp[i] >= 'a' && onp[i] <= 'z')
{
char* temp = (char*)malloc(100);
int j = 0;
while (onp[i] != ' ')
temp[j++] = onp[i++];
temp[j] = '\0';
v->val = find_var(tab, temp);
v->op = '0';
}
push(&stos, v);
}
return pop(&stos);
}
Musisz korzystać z odwrotnej notacji polskiej?
Wolałbym, już mam to zrobione i nie za bardzo uśmiecha mi się pisanie wszystkiego od nowa + czytałem, że do drzewa ONP jest potrzebne. Chyba, że ma ktoś jakiś pomysł jak to zrobić tylko przy użyciu ONP i stosów, bo wiem, że się da tylko nie wiem jak :)
ONP nie jest wcale potrzebne do tworzenia drzewa - wręcz przeciwnie, tylko spowalnia cały proces...