Kalkulator dziwny problem

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

 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.
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

read

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

read(a,b);

Zamień to na:

ReadLn(A);
ReadLn(B);
0

No to tak to co pokazuje mi sie po nieudanej kompilacji

(61,7) Error:Ordinal expression expected

co do

 read(a,b)

na innym prostym kalkulatorze mi działało

kompilator to Free Pascal IDE

0

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

Czy aby to na pewno jest dobrze?

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.

0

to znaczy dla jakich zmiennych mam podać wartość

integer 

tylko dla i czy jeszcze innych ?

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:

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

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

0

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

0

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

repeat 

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

0
  1. Ostatnie działanie na potędze:
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
0

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

wyszedł mi w SPACJA końcu pod kodem

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.
 
0

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

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)

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

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.	
 
0

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

0

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

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
var x:Char;
//...
  Case x of
    '+':
    '-':
    itd...
  end;
0

dzieki za pomoc ze zrozumieniem polecenia case teraz mi wychodzi

 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.
0

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

case x of
  '*','8': w:=a*b;
  itd...
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1