Kalkulator dziwny problem

Kalkulator dziwny problem
MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

Witam jestem nowy na forum . Uczę się programowania w technikum i mam mały problem z tworzeniem kalkulatora w Pascalu chodzi o to ze wyskakuje mi błąd "There were 1 errors compiling module , stopping" i nie wiem co zrobic

Kopiuj
 program kalkulator;
uses CRT;
var
a:real;
b:real;
i:real;
w:real;
x:real;
k :Char;

begin
 clrscr;
 writeLn('Wprowadz dwie liczby');
 read(a,b);
 WriteLn('wprowadz znak dziaania');
 WriteLn('dla znaku + wcisnij 1');
 WriteLn('dla znaku - wcisnij 2');
 WriteLn('dla znaku / wcisnij 3');
 WriteLn('dla znaku * wcisnij 4');
 WriteLn('dla znaku ^ wcisnij 5');
 read(x);
 If (x=1) then
 Begin
  w:=a+b;
  write('Wynik wynosi',w);
  Write(w:0:5);
  k:=ReadKey;
  end
 else

  if (x=2) then
  begin
  w:=a-b;
  write('wynik wynosi: ');
  write(w:0:5);
  k:=ReadKey;
  end
  Else

  if (x=3) then
  begin
  w:=a/b;
  write('wynik wynosi: ');
  Write(w:0:5);
  k:=ReadKey;
  end
  else

  if (x=4) then
  begin
  w:=a*b;
  Write('wynik wynosi: ');
  write(w:0:5);
  k:=ReadKey;
  end
  Else
  
  if (x=5) then
  begin
  w:=1;
  For i:=1 to b do w:=w*x;
  Write('Wynik wynosi: ');
  write(w:0:5);
  end;
 end.
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Jaki kompilator i jaki błąd...

There were 1 errors compiling module , stopping

To nie jest błędem; poszukaj komunikatu wyżej...

BTW, słyszałeś o zasadzie programowania DRY?
http://pl.wikipedia.org/wiki/DRY

Kopiuj
read

Odczytuje jeden znak (cyfra/litera/cokolwiek)!
Użyj ReadLn.
Poza tym nie jestem pewien cd.tego:

Kopiuj
read(a,b);

Zamień to na:

Kopiuj
ReadLn(A);
ReadLn(B);
MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

No to tak to co pokazuje mi sie po nieudanej kompilacji

(61,7) Error:Ordinal expression expected

co do

Kopiuj
 read(a,b)

na innym prostym kalkulatorze mi działało

kompilator to Free Pascal IDE

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

For i:=1 to b do w:=w*x;

Czy aby to na pewno jest dobrze?

Kopiuj
For i:=1 to a do w:=w*b;

Poza tym spróbuj użyć typu 'integer' (w każdym razie nie zaszkodzi sprawdzić ;))

Pani Edyta:
Chodzi o to, że pętla 'for' iteruje wyłącznie po liczbach całkowitych (integer, byte).
Zmień typ zmiennej 'i' na integer.

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

to znaczy dla jakich zmiennych mam podać wartość

Kopiuj
integer 

tylko dla i czy jeszcze innych ?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Powinno wystarczyć, abyś zmienił 'I' na integra.
BTW, jeżeli 'I' będzie integrem, a ciągle będzie wywalało błąd, to zrób tak:

Kopiuj
For i:=1 to round(a) do w:=w*b;
Kopiuj
Round

Zaokrągla liczbę.
PS: zawsze możesz pobawić się pętlą 'repeat', aby tak nie wydziwiać :]

Misiekd
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7923
0

i nie może być typu Real a dlaczego to sobie poczytaj

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

musze przyznać ze repeat nie za bardzo kumam a to mi sie wydaje bardziej zrozumiałe .
a z

Kopiuj
repeat 

to jak to ostatnie działanie na potedze powinno wygladać ?

SI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0
  1. Ostatnie działanie na potędze:
Kopiuj
for i:= 1 to b do w:= w*a;
  1. Zamień wszystkie wystąpienia Read na Readln
  2. Zamiast używać 5 razy instrukcję if ... then, zastosuj case
MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

Dzieki kazdemu kto mi pomagał
samplex komende case odloze na potem bo nie wychodzi mi :)

wyszedł mi w SPACJA końcu pod kodem

Kopiuj
program kalkulator;
uses CRT;
var
a:real;
b:integer;
i:integer;
w:real;
x:real;
k :Char;

begin
 clrscr;
 writeLn('Wprowadz dwie liczby');
 readLn(a,b);
 clrscr;
 WriteLn('wprowadz znak dziaania');
 WriteLn('dla znaku + wcisnij 1');
 WriteLn('dla znaku - wcisnij 2');
 WriteLn('dla znaku / wcisnij 3');
 WriteLn('dla znaku * wcisnij 4');
 WriteLn('dla znaku ^ wcisnij 5');
 readLn(x);
 clrscr;
 If (x=1) then
 Begin
  w:=a+b;
  write('Wynik wynosi',w);
  Write(w:0:0);
  k:=ReadKey;
  end
 else

  if (x=2) then
  begin
  w:=a-b;
  write('wynik wynosi: ');
  write(w:0:0);
  k:=ReadKey;
  end
  Else

  if (x=3) then
  begin
  w:=a/b;
  write('wynik wynosi: ');
  Write(w:0:0);
  k:=ReadKey;
  end
  else

  if (x=4) then
  begin
  w:=a*b;
  Write('wynik wynosi: ');
  write(w:0:0);
  k:=ReadKey;
  end
  Else

  if (x=5) then
  begin
  w:=1;
  For i:=1 to b do w:=w*a;
  Write('Wynik wynosi: ');
  write(w:0:0);
  k:=Readkey;
  end;
 end.
 
SI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 184
0

A cóż takiego trudnego jest w komendzie case? Nic. Za to znakomicie upraszcza kod:

Kopiuj
case x of
  1: w:= a + b;
  2: {Uzupelnij sam pozostale}
  3:
  4:
  5: begin

     end;
end;
Write('Wynik wynosi: ');
Write(w:0:0);
k:= Readkey; 

Teraz zadanie dla Ciebie:
Uzupełnij pozostałe działania i domyśl się, dlaczego dla "5" jest begin .. end
Zauważ też, że instrukcja wypisywania wyniku na ekranie pojawia się tylko raz (zresztą podobnie mogłeś zrobić również w swoim programie, gdzie używałeś instrukcji warunkowej if)

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

no dobra robiłem z case ale wyskakuje mi taki błąd
"Constant and Case types do not match"
a kod wygląda tak i nie wiem czy są jakieś błędy

Kopiuj
program kalkulator;
uses CRT;
var
a:real;
b:integer;
i:integer;
w:real;
x:real;
k :Char;

begin
 clrscr;
 writeLn('Wprowadz dwie liczby');
 readLn(a,b);
 WriteLn('wprowadz znak dziaania');
 WriteLn('dla znaku + wcisnij 1');
 WriteLn('dla znaku - wcisnij 2');
 WriteLn('dla znaku / wcisnij 3');
 WriteLn('dla znaku * wcisnij 4');
 WriteLn('dla znaku ^ wcisnij 5');
 readLn(x);

 case x of
  1 : w:=a+b;
  2 : w:=a-b;
  3 : w:=a/b;
  4 : w:=a*b;
  5 : Begin
 for i:=1 to b do w:=w*a;
 end;

 end;
 WriteLn('Wynik wynosi: ',w:0:5);
 k:=readkey;
end.	
 
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

'X' zamień na liczbę całkowitą (integer), ew spróbuj tak: "case round(x) of" ale to raczej nie będzie działać :]

MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

ale gdy zrobie tak jak mówisz to wynik przy potedze wychodzi zerowy 0.00000

pelsta
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 819
0
  1. Zmienna x, używana w Case, NIE MOŻE być typu Real
  2. Potęga zawsze wychodzi 0 bo wartość początkowa w=0
  3. b dałeś typu Integer. W ten sposób ograniczasz możliwości kalkulatora dla + - * /
  4. Można by zrobić też tak
Kopiuj
var x:Char;
//...
  Case x of
    '+':
    '-':
    itd...
  end;
  • Rejestracja: dni
  • Ostatnio: dni
0

dzieki za pomoc ze zrozumieniem polecenia case teraz mi wychodzi

Kopiuj
 program kalkulator;
uses CRT;
var
a:real;
b:integer;
i:integer;
w:real;
x:char;
k :Char;


begin
 clrscr;
 writeLn('Wprowadz dwie liczby');
 readLn(a,b);
 clrscr;
 WriteLn('wprowadz znak dzialania');
 WriteLn('Wcisnij znak +');
 WriteLn('Wcisnij znak -');
 WriteLn('Wcisnij znak /');
 WriteLn('Wcisnij znak *');
 WriteLn('Wcisnij znak ^');
 readLn(x);
 clrscr;

 case x of
  '+' : w:=a+b;
  '-' : w:=a-b;
  '/' : w:=a/b;
  '*' : w:=a*b;
  '^' : Begin
  w:=1;
 for i:=1 to b do w:=w*a;
 end;

 end;
 WriteLn('Wynik wynosi: ',w:0:5);
 k:=ReadKey;
end.
pelsta
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 819
0

Aby ułatwić wprowadzanie danych do programu możesz zrobić coś takiego:

Kopiuj
case x of
  '*','8': w:=a*b;
  itd...
BZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 64
0

Z resztą warto używać instrukcji case .. of bo przez to kod staje się czytelniejszy. A poza tym gdzieś na tym forum wyczytałem, że ta właśnie instrukcja jest szybsza niż if'y. Poczytaj o zasadzie DRY.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.