Witam!
Na zaliczenie podstaw programowania dostałem do napisania następujący program:
"Napisać kalkulator liczb rzeczywistych:
- wczytywanie do 20 znaków w postaci działań i liczb
- zachowanie kolejności działań
- obsługa +,-,*,/,^
- zgłaszanie błędów"
Chodzi o to, aby kalkulator potrafił policzyć np. coś takiego:
2*4-(2.1+8)^(3-2)/18
zachowując naturalną kolejność działań, tj: nawiasy, potęgowanie, mnożenie/dzielenie, dodawanie/odejmowanie.
Ma być przy tym odporny na błędy typu dzielenie przez zero, zapisy rozpoczynające lub kończące się działaniami, itp.
Na początku trzeba zająć się przygotowaniem łańcucha znaków podanego przez użytkownika. Na dobry początek napisałem coś takiego:
#include <stdio.h>
#include <ctype.h>
#define MAX_DLUGOSC_WYRAZENIA 20
char* analizuj_wyrazenie(void);
int main()
{
printf("%s\n", analizuj_wyrazenie()); //dla testu funkcji analizuj_wyrazenie
system("PAUSE");
return 0;
}
char* analizuj_wyrazenie(void)
{
int wyrazenie_poprawne=0;
int blad_skladni;
int wczytane_znaki;
int indeks_tablicy;
char znak_tymczasowy;
static char zapis_ifiksowy[MAX_DLUGOSC_WYRAZENIA];
while(wyrazenie_poprawne!=1)
{
blad_skladni=0;
wczytane_znaki=0;
indeks_tablicy=0;
wyrazenie_poprawne=1;
printf("Wprowadz wyrazenie, ktore chcesz obliczyc:\n");
while((znak_tymczasowy=getchar())!='\n' && wczytane_znaki<MAX_DLUGOSC_WYRAZENIA)
{
if(isdigit(znak_tymczasowy) ||
znak_tymczasowy=='+' || znak_tymczasowy=='-' ||
znak_tymczasowy=='*' || znak_tymczasowy=='/' ||
znak_tymczasowy=='^' || znak_tymczasowy=='.' ||
znak_tymczasowy=='(' || znak_tymczasowy==')')
{
zapis_ifiksowy[indeks_tablicy]=znak_tymczasowy;
indeks_tablicy++;
wczytane_znaki++;
}
else
{
if(blad_skladni!=1)
{
printf("!!! Syntax ERROR !!! - blad skladni!\n");
blad_skladni=1;
wczytane_znaki++;
wyrazenie_poprawne=0;
}
}
}
}
return zapis_ifiksowy;
}
Wydaje mi się jednak, że nie jest to do końca dobrze, ponieważ jeśli deklaruję tablicę, zawierającą 20 znaków, a zapełnię ją np. 10, to pozostałe miejsce zostanie uzupełnione przypadkowymi znakami.
Podobno lepiej jest to zrobić przez wskaźniki i dynamiczną alokację pamięci. Próbowałem tak zrobić, ale mam z tym ogromne problemy... Czy ktoś może mi w tym pomóc?
Z góry dziękuję za zainteresowanie tematem.