Case

rk7771

case - słowo kluczowe rozpoczynające właściwą instrukcję warunkową

Słowo case wraz z Of tworzą instrukcję warunkową (case..of). Może być używana jako
zamiennik instrukcji warunkowych If ... Then. Stosuje się ją w przypadku mało efektywnego wykorzystania instrukcji if ... then, tzn. gdy należy sprawdzić większą liczbę możliwych warunków.

Instrukcja case ma to do siebie, że działa jedynie na typach wyliczeniowych jak Char, Byte, Integer, Cardinal itp., nie można jej na przykład użyć aby sprawdzić zawartość zmiennej typu String.

Składnia instrukcji Case ... Of:

case wyrażenie of
  wybór 1: (kod);
  ...
  wybór n: (kod);
  else
  (kod)
end;

Przykład użycia instrukcji Case ... Of:

case RadioGroup1.ItemIndex of
  0: IdFTP1.TransferType := ftAscii;
  1: IdFTP1.TransferType := ftBinary;
end;

Zakresy

Dużą zaletą instrukcji case..of jest możliwość sprawdzania wartości ?od ? do?. Przykładowo, jeżeli wartość zmiennej Mandat zawiera się między 10 a 15, zostanie wykonana konkretna czynność. Oto przykład takiego programu:

program Foo;

{$APPTYPE CONSOLE}

var
  Mandat : Integer;

begin
  Randomize;
  Mandat := Random(50)+1; // dodajemy 1, aby nie zostało wylosowane 0

  case Mandat of
    1..10: Writeln('E, 10 zł. Może jeszcze zapłacę?');
    11..20: Writeln('20 zł ? nie będę miał na chleb!');
    21..50: Writeln('50 zł ? Panie władzo... może dogadamy się w inny sposób?');
  end;

  Readln;
end.

Dzięki zastosowaniu zakresów pierwsza instrukcja zostanie zrealizowana w przypadku, gdy zmienna Mandat będzie miała wartość od 1 do 10.

Kilka instrukcji

W instrukcji case..of możemy również zawierać, więcej niż jedną instrukcję dla każdej wartości lub zakresu wartości zmiennej. Aby to zrobić instrukcja case..of wymaga od nas umieszczenia kodu w bloku begin..end. Oto przykład takiej konstrukcji:

program Foo_2;

{$APPTYPE CONSOLE}

var
  Mandat : Integer;

begin
  Randomize;
  Mandat := Random(50)+1; // dodajemy 1, aby nie zostało wylosowane 0

  case Mandat of
    1..10: Writeln('E, 10 zł. Może jeszcze zapłacę?');
    11..20: Writeln('20 zł ? nie będę miał na chleb!');
    21..50:
    begin 
      Writeln('50 zł ? Panie władzo... może dogadamy się w inny sposób?');
      Writeln('Co ja powiem żonie?');
    end;
  end;

  Readln;
end.

W powyższym kodzie w przypadku wystąpnia ostatniego z podanych zakresów wykonają się dwie instrukcje.

Słowo kluczowe else w instrukcji case..of

Słowo kluczowe else umożliwia nam zareagowanie gdy żaden ze sprawdzanych warunków nie zostanie spełniony. Po słowie kluczowym else zapisujemy instrukcje, które mają się wykonać w przypadku gdy zmienna przyjmie inną, nieprzewidzianą wartość. Oto przykład takiego zapisu:

program Foo_3;

{$APPTYPE CONSOLE}

var
  Mandat : Integer;

begin
  Randomize;
  Mandat := Random(100)+1; // dodajemy 1, aby nie zostało wylosowane 0

  case Mandat of
    1..10: Writeln('E, 10 zł. Może jeszcze zapłacę?');
    11..20: Writeln('20 zł ? nie będę miał na chleb!');
    21..50:
    begin
      Writeln('50 zł ? Panie władzo... może dogadamy się w inny sposób?');
      Writeln('Co ja powiem żonie?');
    end; //<-- ten średnik nie jest konieczny
    else Writeln('Tym razem tylko pouczenie.'); //po else nie stawiamy dwukropka
  end;

  Readln;
end.

Zobacz też:

8 komentarzy

@lankusiek:
Spróbuj tak:

//TYLKO JEŻELI: I < 0
I := I + (I * 2); //Odwrócenie liczby (tak na szybko myślałem)
Case I Of
 5: Writeln('-5'); //Ponieważ cyfra była odwrócona: 5 = -5
 //Itd...
End;
I := I - (I * 2); //Odwrócenie liczby (spowrotem)

Oczywiście I to Integer, Extended, Float, itp.

A co z wartościami ujemnymi ?
i:integer;
begin
case i of
-1..-99: funkcja1;

tak się niestety nie da:/

Domyśliłem się 5s później ale jako od dawna nie delfiarz, arta nie tykałem ;)

Case costam of
1: Begin
funkcja1;
funkcja2;
End;
2:funkcja3;
end;

Wszędzie na sieci [nawet u nas] jest przykład z jedną instrukcją dla każdego wyboru. A co, jak chcę tam dać więcej? Niestety, jak to w Pascalu bywa, intuicja tu zawodzi, bo takie coś nie działa:

case costam of
  1: funkcja1; funkcja2;
  2: funkcja3;
end;
    21..50: Writeln('50 zł ? Panie władzo... może dogadamy się w inny sposób?');

łapówka? :D

Przydałoby się też napisać o rekordach-uniach - tam też jest wykorzystywane case.

Jak dla mnie, to brakuje tu jeszcze else. W instrukcji Case można użyć else tak jak w innych językach np. default czy tym podobnych.

Dobre poprawki !