Object Pascal/Instrukcje strukturalne

program struktur;

var
   i, j, silnia: integer;
   z: char;

begin
   writeln('Witaj!');

   begin
      write('Na początek jakieś instrukcje w bloku. ');
      write('Nic szczególnego z tego nie wynika. ');
      writeln('Chociaż blok liczy się za jedną instrukcję');
      readln; {przypominam, że średnik przed end nie jest konieczny}
   end;

   write('Podaj liczbę całkowitą: ');
   readln(i);

   if i > 0 then {instrukcja warunkowa: "jeśli i > 0 to"}
      writeln('To jest liczba dodatnia.');

   writeln('Jeszcze raz, z bardziej rozbudowaną instrukcją.');

   if i > 0 then {"jeśli i jest większe od 0 to"}
      writeln('To jest liczba dodatnia.') {ważne - brak średnika}
   else {"a jeżeli nie jest"}
      writeln('To jest liczba ujemna (chyba, że 0).');

   write('Podaj kolejną liczbę całkowitą: ');
   readln(i);

   {zagnieżdżanie instrukcji warunkowych}
   if i > 0 then
      if i mod 2 = 0 then
         writeln('To jest liczba dodatnia parzysta.')
      else
         writeln('To jest liczba dodatnia nieparzysta.')
   else
      if i mod 2 = 0 then
         writeln('To jest liczba niedodatnia parzysta.')
      else
         writeln('To jest liczba niedodatnia nieparzysta.');

   write('Czy mam odejmować? (t/n) ');
   readln(z);

   if z='t' then
   begin            {i tu przyda się instrukcja złożona}
      write('i=');
      readln(i);
      write('j=');
      readln(j);
      writeln('i-j=', i-j);
   end;

   writeln('Zajmijmy się jeszcze liczbą ', i);

   {trochę mniej instrukcji}
   if i > 0 then
      if i mod 2 = 0 then
         writeln('To jest liczba dodatnia parzysta.')
      else
         writeln('To jest liczba dodatnia nieparzysta.')
   else
      if i mod 2 = 0 then
         writeln('To jest liczba niedodatnia parzysta.');

   {A to nie działa tak, jak można by się spodziewać}
   if i > 0 then
      if i mod 2 = 0 then
         writeln('To jest liczba dodatnia parzysta.')
   else
      if i mod 2 = 0 then
         writeln('To jest liczba niedodatnia parzysta.')
      else
         writeln('To jest liczba niedodatnia nieparzysta.');

   {begin end jest niezbędne}
   if i > 0 then
   begin
      if i mod 2 = 0 then
         writeln('To jest liczba dodatnia parzysta.');
   end
   else
      if i mod 2 = 0 then
         writeln('To jest liczba niedodatnia parzysta.')
      else
         writeln('To jest liczba niedodatnia nieparzysta.');

   write('Podaj ocenę: ');
   readln(i);

   case i of
      1: writeln('niedostateczny');
      2: writeln('dopuszczający');
      3: writeln('dostateczny');
      4: writeln('dobry');
      5: writeln('bardzo dobry');
      6: writeln('celujący');
      7: begin
         writeln('geniusz?');
         writeln('nieprawidłowa ocena');
      end;
      else writeln('nieprawidłowa ocena');
   end;

   writeln('Przyszedł czas na pętle.');
   readln;

   for i := 1 to 100 do
      write(i, ' ');
   writeln;
      
   writeln('Podaj liczbę, której silnię mam policzyć');
   readln(i);
   
   silnia := 1;
   for j := i downto 2 do {dla j od i do 2 w dół }
   begin
      silnia := silnia * j;
      write(j, ' * ');
   end;
   writeln('1 = ', silnia);

   writeln('Teraz będzie się powtarzać, aż wpiszesz "f".');

   repeat {powtarzaj}
      writeln('powtarzam'); {tutaj nie potrzeba begin-end}
      readln(z);
   until z='f'; {aż z="f"}

   writeln('a teraz będzie się powtarzać, póki wpisujesz "f".');

   {początkowe z="f" jest zapewnione przez poprzednią pętlę}

   while z='f' do {póki z="f" rób}
      readln(z);

   {Na koniec dziwne zjawisko}
   writeln('Pętla for nie przejmuje się zmianami wartości po swoim rozpoczęciu.');
   i := 10;
   for j := 1 to i do
   begin
      writeln(j); {wypisze liczby od jednego do dziesięciu}
      {j := 5;} {co więcej nie pozwala na ręczną zmianę zmiennej pętli - to byłby błąd}
      i := 5;
   end;

   writeln('Ten przykładowy program jest strasznie długi, a i tak nie obejmuje wszystkich funkcji. W każdym razie na razie żegna.');
   readln;

end.