Jump to content

[pascal] Problem z kalkulatorem.


Perykles

Recommended Posts

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

Napisałem: wywala jak wpisuje działanie. Włączam program, wpisuje działanie i wtedy wyskakuje exitcode=106. Zmieniłem tak:

 

Writeln('Podaj dzialanie: ');

Readln(a);

Readln(dzialanie);

Readln(b );

 

Co jeszcze trzeba zrobić, żeby nie wywalało?

Link to comment
Share on other sites

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 to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...