[C] Kalkulator Odwrotnej Notacji Polskiej

0

Witam!

Tworzę kalkulator liczb rzeczywistych i wydaje mi się, że jestem na dobrej drodze do zakończenia swojej pracy. Aby jednak do tego doszło, muszę jeszcze obliczyć wyrażenie ONP.

Udało mi się wywalczyć, aby program wczytywał wyrażenie (jeśli błędne, to raportuje błąd) i konwertował je do ONP, czyli wyrażenie:

((2.3+7.45)/3.1+(14-3)*4.8)/2

konwertuje do następującego:
2.3 7.45 + 3.1 / 14 3 - 4.8 * + 2 /

(przykład z Wikipedii rozszerzony o liczby 'z przecinkami').

Napotkałem teraz na problem, przy próbie obliczania wartości wyrażenia ONP.
Przy wczytywaniu i konwertowania wyrażenia pracowałem na tablicach przechowujących wartości char.
Teraz najprawdopodobniej muszę wykorzystać funkcję atof z stdlib.h, ale nie bardzo sobie z tym radzę...
Czy ktoś mógłby mi w tym pomóc?

0

ale jaki masz konkretnie problem ? Nie umiesz wywołać funkcji ?

double liczba = atof("2.3");

0

mam na przykład tablicę znaków:
char tablica[] = {2,.,3, ,4,.,7, ,+,\0}

czyli jest to:
2.3 4.7 +

I teraz chciałbym obliczyć wartość tego wyrażenia, czyli wrzucić na stos 2.3, wrzucić na stos 4.7, teraz natrafiam na +, więc pobieram ze stosu liczby i przypisuję do zmiennych:

operand1 ma przyjąć wartość 4.7
operand2 ma przyjąć wartość 2.3

Teraz pozostaje wrzucić na stos operand2+operand1

Problem polega na tym, że nie wiem, jak wrzucać i zdejmować ze stosu całą liczbę (czyli 2.3)

0

ja bym radzil tak, abys po kazdej liczbie w tablicy jako nastepny znak dopisywal jakis znaczek ktory nie wystepuje w wyrazeniach :P np "płotek" ( # ). Wtedy bys mogl zrobic fora lub while'a ktory by pobieral te liczby az do tego znaku, wtedy wiadomo kiedy liczba sie konczy a kiedy zaczyna. Sam osobiscie czesto tak robie :P.

np

[2,.,4,#,4,.,8]

Jezeli o to Ci chodzi ;p.

0

w sumie chyba nie ma znaczenia, czy będzie to spacja (tak, jak w 'mojej' tablicy), czy hash (tak, jak w 'Twojej').
Mój problem polega na tym, że nie do końca wiem, jak zrobić z tej tablicy oddzielne liczby...

np. {2,.,3, ,4,.,7, ,+} i 'wyciągnąć' z tej tablicy liczby typu double - jedna 2.3, a druga 4.7

0

aaaa xD
nie zauwazylem spacji :P
bierzesz char*, robisz while ze dopoki nie znajdzie spacji w tablicy, to ma zapisywac to do stringa. a jak bedzie spacja w tablicy to break i atof. Chyba powinno tak dzialac.
Jeszcze lookne u siebie zaraz ;p.

0

czyli ma to być wskaźnik na tablicę typu char (char* tablica), wypełnić tą tablicę znakami aż do napotkania spacji, zrobić double liczba=atof(tablica) i teraz rzucić liczba na stos typu double?

0

własnie to mnie dziwi, bo w wielu ksiazkach jest napisane ze robi sie "stringi" w sposob

char* tab[50];

ale ja jak kiedys to kompilowalem to jakos mi nie dzialalo ;p.
ale jak napiszesz

char* napis;

to jest uznawane jako nie wskaznik, ale zwykla zmienna gdzie mozesz zapisywac zwykly tekst a nie pojedynczy znak;

np:

char * napis;
napis = "hello world";
printf("%s", napis);

no i wyswietli hello world ;p.

ale zeby dodac do tego znak to jest jakas funkcja ktora dodaje do char*, ale nie moge cos jej znalezc.

0

hmmm...
generalnie chyba nie można zrobić
char* tablica[50];

tzn. musi być albo char tablica[50], albo char* tablica=calloc(50, sizeof(char))

0

tzn jest to wskaznik ;p

na razie doszedlem do tego ze funkcja jest w string.h i sie zwie strcat

ale cos mi ciezko z char na char* zamienic xd.

0

osobiscie nie korzystam z C spod DOSa ale z C++ Buildera i tam jest AnsiString i jest z tym o wiele latwiej, bo mozna normalnie uzywac '+'.

a w C jakos nigdy nie lubialem tego char* ;D.

0

jeśli się nie mylę, to strcat dopisuje do obecnej tablicy string z innej tablicy, ale nie wiem, do czego konkretnie zmierzasz...

tzn. z dopisywaniem nie mam większych problemów - raczej głowię się nad przerobieniem tych znaków na liczby

0

no właśnie nie mam żadnego wyboru jeśli chodzi o środowisko - niestety musi to być czyste C ;p

0

ja doszedlem do czegos takiego ;p

	float zz;
	char dupa[100];
	char znak[1];
	char z;
	z = '4';
	znak[0] = z;
	znak[1] = '\0';
	strcat(dupa, "2.");
	strcat(dupa, znak);

	zz = atof(dupa);

zmienna zz zwraca idealnie bo patrzylem podczas pauzy w programie na wartosci zmiennych ;p.
ale nie umiem wyswietlic tego przez printf ;p. a juz mi sie udalo xd nie ta zmienna wpisalem ;p.

i przerobic to na petle i powinno byc git;p

0

no dobra, dzięki wielkie. wstanę z rana i to pomęczę - może w końcu uda mi się skończyć ten projekt ;p

0

jakby co to pisz, czasami zajze na te forum, a i tak widze ze malo osob tu w ogole pomaga cos i próbuje sie wysilic.

1 użytkowników online, w tym zalogowanych: 0, gości: 1