Skocz do zawartości

Problem z napisabiem kalkulatora w Pascal'u


Recommended Posts

Wydaje mi się że nie co tu dużo mówić więc odrazu przejdę do problemu.

Kod:

program kelkulejtor;

var l1, l2: integer;

znak: char;

begin

Read(l1, znak, l2);

if znak = '+' then

write(l1+l2)

else

if znak = '-' then

write(l1 - l2)

else

{itd. kolejne działania}

writeln('maciej z klanu');

end.

Błąd występuje przy wpisywaniu wartości z jakiegoś powodu typ char nie może rozpoznać znaków mat.(z liczbami jest ok) Z góry dzięki za pomoc.

Ps.wolałbym nie dostać "gotowca" ale pomęczyć się z tym sam.

Link to post
Share on other sites

Czy struktura musi być taka jak w podanym przez Ciebie kodzie? Moim zdaniem prościej byłoby zrobić kalkulator z menu, pozbyć się zmiennej typu char a zamiast niej dorzucić jedną zmienną typu integer, która odpowiadałaby za typ działania. Poza tym, dla znaków matematycznych nie potrzebujesz żadnej zmiennej, nie ma kompilatora, który ów działań nie rozpoznaje. Ponadto, zamiast if, możesz użyć case of.

Link to post
Share on other sites

Jeżeli będzie więcej działań to case ... of ... by kod był wydajniejszy.

Złe jest wczytywanie danych. Kiedy wczytujesz liczby a następnie po środku masz string czy char. On nie wie kiedy jest koniec tego stringu czy charu. W char może się zawierać także i liczba jednak w integer nie może się zawierać litera czy znak. Dlatego masz między innymi runtime error. 

 

Przy wczytywaniu w jednej lini. najpierw jest l1.

wpisujesz 2+ i masz runtime error, bo on nie wie gdzie jest koniec tej liczby.

 

troszku to zawiłe. 

 

Jeżeli wszystko będziesz wczytywał po enterze to będzie działać: 

Readln(l1);
Readln(znak);
Readln(l2);

Jeżeli chcesz żeby było tak jak jest to musisz napisać inaczej. 

Okej edit:

Chwilę musiałem nad tym posiedzieć. ok 30 minut. Musiałem sobie przypomnieć pascala. W sposób który ty chcesz zrobić, trzeba użyć stringów. Odczytać działanie i wpisać je do stringa. Następnie stringa podzielić na dwa stringi (liczby) i znak. Potem dwa stringi zamienić na dwie liczby. Następnie zrobić warunki poprzez odczytany znak.  

 

Proszę bardzo, świeżo napisany, z 4 podstawowymi działaniami. CRT potrzebne do zaokrąglenia liczby w dzieleniu, stąd też dodatkowa zmienna typu real. Jeżeli chcesz robić operacje na liczbach niecałkowitych to będzie trzeba przerobić kod. 

program Kalkulator_by_Rexlu;
Uses CRT;
var
dlugosc, l1, l2,i: integer;
dzialanie, sl1, sl2: string;
dzielenie: real;

znak:char;
begin

Write('Wpisz dzialanie: ');
readln(dzialanie);
dlugosc:=length(dzialanie);

for i:=1 to dlugosc do
begin
  if (dzialanie[i]='+') or (dzialanie[i]='-') or (dzialanie[i]='*') or (dzialanie[i]='/') then
    begin
      znak:=dzialanie[i];
      sl1:=copy(dzialanie, 1, i-1);
      sl2:=copy(dzialanie, i+1, dlugosc-i);
      break;
    end;
end;

Val(sl1,l1);
Val(sl2,l2);
writeln;
case znak of
  '+': Writeln('Wynik: ',l1+l2);
  '-': Writeln('Wynik: ',l1-l2);
  '*': Writeln('Wynik: ',l1*l2);
  '/': begin dzielenie:=l1/l2; Writeln('Wynik: ',dzielenie:1:2); end;
else
  Writeln('Wystapil Blad');
end;

readln();
end.

Jeżeli pomogłem daj mi plusika :)

Edytowane przez Rexlu
  • Popieram 1
Link to post
Share on other sites

Jeżeli będziesz miał pytania daj znać :) jeżeli chcesz wyślę ci ten kod z przerobieniem jeszcze tak by był odporny na złośliwego użytkownika oraz działał na liczbach niecałkowitych.

 

Ach, niech tam, napisałem go :) http://forum.benchmark.pl/topic/168813-gotowiec-kalkulator-stringowy/

Edytowane przez Rexlu
Link to post
Share on other sites

Edit:

Właśnie sprawdziłem, gdyż nie byłem pewien. W c++ taki problem nie występuje i twój pomysł jak najbardziej, świetnie się spisuje :)

#include <iostream>
int main()
{
	int liczba1,liczba2;
	char znak;
	
	std::cin >> liczba1;
	std::cin >> znak;
	std::cin >> liczba2;
	
	if (znak=='+')
	std::cout << "Wynik: " << liczba1+liczba2 << std::endl;
	
	if (znak=='-')
	std::cout << "Wynik: " << liczba1-liczba2 << std::endl;
	
    return 0;
} 

Jednak to są dogodności wyższego języka. Przy wpisywaniu ignoruje samo spacje (pascal się wywali, w kodzie to uwzględniam). Niezależnie jak wpiszemy czy:

 

- 25+5

 

- czy 25 + 5

 

czy też:

25

+

5

 

To i tak prawidłowo wczyta nam zmienne. Niestety w pascalu wszystko to trzeba uwzględnić. Dlatego pascal świetnie się nadaje do nauki, tak aby programista o wszystkim myślał =) Pascal nie wybacza.

Edytowane przez Rexlu
Link to post
Share on other sites

Powiem Ci tak. Java a java na androida to delikatnie inna sprawa. Ja od razu na przekór, bez podstaw javy zabrałem sięza pisanie swojej apki, która ma ponad 110tyś pobrań na ten moment: https://play.google.com/store/apps/details?id=app.pelnoletnosc

 

Może i grałeś :) Długo była w rankingach, ostatnio wypadłą z głównego, ale jeszcze powinna być w najlepszych w kategori quizy.

 

Jednak, miałem podstawy algorytmiki (pascal świetnie do tego się nadaje). Czyli co można zrobić dzięki petli, dzięki warunkom i cuda nie widy podstawowymi rzeczami :)

Przyda ci się nazewnictwo w języku angielskim.

 

Na początku oczywiście napisałem proste rzeczy jak wyświetl napis po prostu. Próbowałem czytać jakieś poradniki, jednak to na nic. Jedyne warte uwagi filmy, lecz niestety już stare znajdziesz na thenewboston, jeżeli chodzi o androida. Jeżeli wiesz co chcesz napisać. Czyli użycie pętli itp. Jeżeli wiesz w jaki sposób to formułujesz pytanie po angielsku dodajesz java android i szukasz w google :) Praktycznie wszystko jest na przykładach rozpisane. Analizujac przyklady napiszesz swoj kod. Nie mowie ze to latwa droga, ale tak sie nauczysz najwiecej i najszybciej, lecz moze nie najlepiej - to taki mały minus. 


Ps. Jeżeli chodzi o książkę to jej nie znam, jednak jeśli jest faktcznie w miarę napisana to dasz sobie radę i się nauczysz też fajnych rzeczy :).

 

Jednak pisanie konsolowe, a z interfejsem graficznym, troszku się różni. 

 

A i nie porywaj się od razu na jakieś platformówki czy inne. Do bardziej zaawansowanych gierek musiałbyś zainteresować się silnikiem unity. 

 

PS2. swoja droga zaczynam się zastanawiać, czy ten błąd nie wynika z winy kompilatora do Pascala niżeli jako z Pascala.  W czym pisałeś? Ja sprawdzałem twój kod i swój w devpascal.

Edytowane przez Rexlu
Link to post
Share on other sites

Naleśniczek a na czym polega onp?

Już lepiej napisać to w cpp na strumieniach, a nie bawić się w coś co było w LO.

 

Książki rusz głową raczej nie są zbyt obszerne w wiedzę. Imho najlepszy wybór do cpp to książki Eckelsa.

 

Jak pisał Rexlu apki na Android-a w Javie to inna sprawa niż zwykła Java SE. Jak napiszesz coś to zrozumiesz.

Jak się ogarnie to jest bardzo przyjemne. Jest dużo tutoriali. Nie brakuje gotowych rozwiązań na StackOverflow. API czy Parsery nie są problemem. Jak chcesz zaadaptować jakiś gotowy algorytm w Javie nie ma większych problemów(ostatnio Ranlux-a kopiowałem). Nie testowałem jak wydajnościowo mają się do apek pisanych w Qt(możliwość kompilacji dla iOS) ale w stosunku do np. APP inventora jest to ponad 10k krotnie szybsze wykonywanie kodu.

Edytowane przez helfi
Link to post
Share on other sites

Ta, pełno gotowych nawet algorytmów czy kodu na zasadzie kopiuj wklej (oczywiście trzeba mieć pojęcie jak to zastosować i co to robi w jaki sposób) jest na StackOverflow po wpisaniu zagadnienia. 

Link to post
Share on other sites

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...