Skocz do zawartości

[pascal] Problem z kalkulatorem.


Perykles

Polecane posty

Witam,

Zrobiłem dzisiaj w pascalu prosty kalkulator obliczający sumę, różnicę, iloczyn i iloraz z dwóch liczb. Zacząłem się zastanawiać, jak wyprowadzić wynik z więcej niż 2 liczb, oraz jak wyliczyć wynik z liczb dziesiętnych. Zacząłem pisać program w pascalu:

 

Uses CRT;

var a,w:real;
   dzialanie:char;
   i,n:integer;

Begin
   Clrscr;
   Writeln('Kalkulator - wersja 1');
   Writeln('-----------------------');
   Writeln;
   Writeln('Wybierz dzialanie jakie chcesz wykonac: ');
   Writeln;
   Writeln('Dodawanie wcisnij +');
   Readln(dzialanie);

   IF dzialanie:=+ THEN
       writeln('Podaj ile liczb chcesz sumować');
   readln(n);
   suma:=0;
   for i:=1 to n do
   begin
        writeln('Podaj ', i ,' liczbe:');
        readln(a);
        suma:=suma+a;
   end;
   writeln (' Suma podanych liczb przez ciebie wynosi: ', suma:2:2);


 Else

 End;

 Readln;

 Readkey;

End.

 

Umieściłem go w kalkulatorze, ale wyskakują błędy. Co mam zrobić, żeby jakoś napisać ten kalkulator tak, żeby obliczał też ułamki dziesiętne?

Link do komentarza
Udostępnij na innych stronach

Zmieniłem to w tym programie co napisałem w poprzednim poscie ale i tak wyskakują błędy. Moze dlatego ze juz trochę się zagmatwałem w tym próbowaniu obliczyć ułamki dziesiętne. Sprawdziłem, czy działa to co napisałeś w innym programie, który troszkę zmodyfikowałem. Na początku był taki:

 

Uses CRT;

var a,b,w:extended;
   dzialanie:char;

Begin
Clrscr;
 Writeln('Kalkulator - wersja 1');
 Writeln('-----------------------');
 Writeln;
 Writeln('Wybierz dzialanie jakie chcesz wykonac: ');
 Writeln;
 Writeln('Dodawanie wcisnij +');
 Writeln('Odejmowanie wcisnij -');
 Writeln('Mnozenie wcisnij *');
 Writeln('Dzielenie wcisnij /');
 Readln(dzialanie);

 Writeln('Podaj pierwsza liczbe: ');
 Read(a);
 Writeln('Podaj druga liczbe: ');
 Read(b);

 Case dzialanie of

 '+':writeln('Wynik wynosi: ',a+b);
 '-':writeln('Wynik wynosi: ',a-b);
 '*':writeln('Wynik wynosi: ',a*b);
 '/':writeln('Wynik wynosi: ',a/b);

 Else

 End;

 Readln;

 Readkey;

End.OP-zg!r&i-z
#zębzź\"jdŁZvyźłvZ{z9{Ł7'zxśźmyĘk)iz7pbs6i)ę-&óy-)d7ZźŚunŚ'&ŹśJ0jxk
k
'Ę\"zb'ĄŁŚ''3m挌Zbs6śZvjXśĘVĘxŚkćfZŹqQU
IP()ąąŃ(ąĄ()  (
ą(]Ńą- ąąŃ(]Ńą(]Ńą(]Ńą
]ąĄ(]Ńą(]ŃąŹ
(]Ńą=(]Ńą5(]Ńą
ąź(]ŃąAŃ(IąĄą((
% ąŹźQ!8((]ŃąAą(IĄ(]Ń
ąAą(IĄ((% ąQ!8((]ŃAąŃĄŃŹ
(IĄ((
ą((ŹŃą]Źą(Ńą]
Źą(Ńą]Źą(źŃą
]Źą(Ńą]ŹąĄ((ą((
((Ią((I()

 

Chciałem zrobić jakoś tak, że jak się wybierze pierwiastkowanie to "wybierz liczbe" wyswietli się tylko raz, a jak się wybierze inne działania, to wyświetli się dwa razy. Ale coś jest nie tak i wyświetla cały czas błędy. Widzisz gdzieś tutaj błąd?

Link do komentarza
Udostępnij na innych stronach

Zainteresuj się tym: http://pl.wikipedia.org/wiki/Odwrotna_notacja_polska

Sposób zapisywania działań tak, aby wyeliminować konieczność analizowania zapisu.

Alternatywnie możesz stworzyć własny system zapisu.

 

Jeżeli to ma być używalne, to unikaj konstrukcji w stylu:

>> x

>> o

>> y

 

Żeby dodać 2 liczby nie potrzebuję kalkulatora. A jak będę chciał policzyć więcej, to najlepszym kalkulatorem będzie ten wymagający najmniej "rozmawiania" z nim. Narzędzia nie-interaktywne są wydajne. Narzędzia interaktywne co najwyżej wygodne.

Czyli zamiast powyższego robimy

>> linia

konwersja tekstu na działanie

obliczenia

zapamiętanie wyniku w zmiennej gotowej do użycia w następnym działaniu

Link do komentarza
Udostępnij na innych stronach

IF dzialanie<>'p' THEN
begin

 Writeln('Podaj pierwsza liczbe: ');
 Read(a);
 Writeln('Podaj druga liczbe: ');
 Read(b);
end

 else
begin

 Write('Podaj liczbe z ktorej chcesz wyciagnac pierwiastek: ');
 Read(a);
end;

 

A druga liczba w pierwiastkowaniu może spełniać rolę stopnia tego pierwiastka. Tak samo w potęgowaniu - pierwsza liczba to podstawa, a druga wykładnik.

Etharnion - 2D RPG

Szukam grafika chętnego do współpracy przy projekcie.

Link do komentarza
Udostępnij na innych stronach

Uses CRT;

var a,b,w:real;
   dzialanie:char;

Begin
Clrscr;
 Writeln('Kalkulator - wersja 1');
 Writeln('-----------------------');
 Writeln;
 Writeln('Podaj dzialanie: ');
 Readln(a,dzialanie,b);


 Case dzialanie of

 '+':writeln('Wynik wynosi: ',a+b:2:2);
 '-':writeln('Wynik wynosi: ',a-b:2:2);
 '*':writeln('Wynik wynosi: ',a*b:2:2);
 '/':writeln('Wynik wynosi: ',a/b:2:2);

 Else

 End;

 Readln;

 Readkey;

End.

 

Jak zapisać w tej linijce: Readln(a,dzialanie,b ); żeby, program wczytal np. dzialanie 2+2? Zmieniłem ten kalkulator tak jak pisałeś, ale wywala jak wpisuje działanie, jakaś podpowiedź co tutaj jest źle? ;)

Link do komentarza
Udostępnij na innych stronach

Adam: spacja jest lepsza, bo łatwiej (szybciej) się wciska spację niż enter

A wczytywać trzeba całą linię do stringa, a później dopiero sprawdzać czym dany znak jest. Np. [a-z] nazwa zmiennej, jak na jej końcu są nawiasy, to nazwa funkcji. [1-9,0] - wartość do obliczeń, [+-*^%!] (inne?) operatory działań. Spacja oddziela od siebie kolejne elementy.

Jak masz działanie zapisane w RPNie, to możesz je od razu wykonywać, jeżeli w czymś wymagającym zmiany kolejności wykonywania działań w stosunku do kolejności zapisu, to trzeba najpierw jakoś to ogarnąć. Czyli albo zamieniasz to na inną, jednoznaczną strukturkę, albo szukasz działania, które możesz wykonać od razu, przepisujesz działanie do innej zmiennej zastępując te działania ich wynikami, i wracasz do punktu pierwszego tak długo, aż nie znajdziesz żadnego działania do wykonania - co znaczy, że algorytm się zakończył.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...