Kalkulator dziwny problem

2011-10-13 21:30
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.
edytowany 3x, ostatnio: Mazek, 2011-10-13 21:36

Pozostało 580 znaków

2011-10-13 21:45
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);

edytowany 4x, ostatnio: Patryk27, 2011-10-13 21:48

Pozostało 580 znaków

2011-10-13 21:49
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

edytowany 2x, ostatnio: Mazek, 2011-10-13 21:52

Pozostało 580 znaków

2011-10-13 21:52
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.


edytowany 4x, ostatnio: Patryk27, 2011-10-13 21:56

Pozostało 580 znaków

2011-10-13 21:59
0

to znaczy dla jakich zmiennych mam podać wartość

integer 

tylko dla i czy jeszcze innych ?

Pozostało 580 znaków

2011-10-13 22:02
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ć :]


Pozostało 580 znaków

2011-10-13 22:03
0

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-10-13 22:07
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ć ?

Pozostało 580 znaków

2011-10-13 22:18
0
  1. Ostatnie działanie na potędze:
    for i:= 1 to b do w:= w*a;
  2. Zamień wszystkie wystąpienia Read na Readln
  3. Zamiast używać 5 razy instrukcję if ... then, zastosuj case

Pozostało 580 znaków

2011-10-13 22:52
0

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

wyszedł mi wkoń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.
edytowany 1x, ostatnio: Mazek, 2011-10-13 22:53

Pozostało 580 znaków

2011-10-13 23:15

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)

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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