Pętla, funkcja

0
function Bo(a, b, c: integer): integer;
begin
readln(a);
if (a mod 3)=0 then begin
b:=1 ;
b:=a*Bo(a,b,c)  ;   end;
Bo:=b;
end;

Muszę dodać jeszcze warunek, że gdy funkcja przekroczy wartość 300 to ma się zakończyć. Próbowałem, nie udało się. Proszę o pomoc.

0
if Result > 300 Then
 Exit;

?
Sprecyzuj, która zmienna ma to przekroczyć.

0

Ta funkcja ma wczytywać zmienne aż osiągnie pułap 300 lub -300. Czyli, jeśli funkcja ma wartość 303 to nie prosi o podanie następnej liczby. Jeśli ma 297 to prosi o podanie kolejnej liczby. "wczytuje wpisywane z klawiatury liczby do momentu, gdy iloczyn
tych które są podzielne przez 3 przekroczy liczbę 300 lub będzie mniejszy od -300."

0

Napisałeś funkcję, która pobiera dane, sprawdza jakiś warunek, po czym znów wywołuje sama siebie, z takimi samymi parametrami.
Takie coś nie ma końca, a że nic nie jest tam liczone (do reszty kodu nigdy nie dojdzie), to nie dziwota, że nie udało Ci się jej działania ograniczyć.

var // globalne
  Suma: Integer;
  Ilosc: Byte;

procedure Bo;
var
  a: Integer;
begin
  Readln(a);

  case (a mod 3) of
    0: begin
         Inc(Suma, a);
         Inc(Ilosc);
       end;
  end;

  if not ((Suma >= 300) or (Suma <= -300)) then
    Bo
  else
    Writeln('Osiagnieto limit. Suma = ', Suma ,', Ilosc = ', Ilosc);
end;

Nie testowałem, ale powinno działać. To jest bardziej pod Pascala, zadziała w Console Application. W przypadku okienkowej wersji zmienne Suma i Ilosc umiesc w sekcji private, a Writeln zamień na coś innego, np. wstaw tekst do jakiegoś labela.

0

Może prócz krytyki, sugestia jak naprawić błąd? Znam się z funkcjami od tygodnia i to niezbyt dobrze, a z pętlami tydzień dłużej. Więc nie dziwota - wszystko partacze ;) A swoją drogą to ta funkcja się skończy, gdy wpiszę liczbę nie podzielną przez 3.

Problem pozostaje taki, że na mnie doktorantka wymusiła funkcję nie procedurę.

1

Nudziło mi się, więc masz szczęście ;).

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  b: Boolean;
  Suma: Integer;
  Ilosc: Byte;

function Zlicz: Boolean;
var
  a: Integer;
begin
  repeat
    Readln(a);
  until (a mod 3) = 0;

  Inc(Suma, a);
  Inc(Ilosc);

  if not ((Suma >= 300) or (Suma <= -300)) then
    Zlicz := false
  else
    Zlicz := true;
end;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  repeat
    b := Zlicz;
  until b;

  Writeln(Format('Osiagnieto limit. Suma = %d, Ilosc = %d.', [Suma, Ilosc]));
  Readln;
end.
0

Dzięki. Cieszę się, że się nudziłeś ;D.

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