program HLAVNI_PROGRAM_TRIDENI;

uses crt;

var podminka: char;
    i, j, k, hodnota, pozice: integer;
    existence: boolean;
    vyhledpole: array[1..50] of integer;

procedure Generovani;
begin
  clrscr;
  writeln('Nyni bylo vygenerovano pole 50 cisel v rozsahu 0 - 150.');
  writeln;
  randomize;
  write('Vloz hodnotu. kterou chces v poli hledat : ');
  readln(hodnota);
  for i := 1 to 50 do vyhledpole[i] := random(150);
  writeln;
end;

procedure Vystup1;
begin
  if (existence = true) then
    writeln('Cislo ',hodnota,' se v generovanem poli naleza.')
  else
    writeln('Cislo ',hodnota,' se v generovanem poli nenaleza.');
  writeln;
  writeln('Pole hodnot vypada takto : ');
  for i := 1 to 50 do write(vyhledpole[i]:5);
  writeln;
  writeln('Stiskni ENTER ...');
  readln;
end;

procedure Vystup2;
begin
  if (existence = true) then
    writeln('Cislo ',hodnota,' se v generovanem poli naleza na pozici ',pozice,'.')
  else
    writeln('Cislo ',hodnota,' se v generovanem poli nenaleza.');
  writeln;
  writeln('Pole hodnot vypada takto : ');
  for i := 1 to 50 do write(vyhledpole[i]:5);
  writeln;
  writeln('Stiskni ENTER ...');
  readln;
end;

procedure QuickSort(var pole: array of integer; minimum, maximum: integer);

  procedure Sort(l, r: Integer);
  var pom : integer;
  begin
    i := l;
    j := r;
    k := pole[(l+r) DIV 2];
    repeat
      while pole[i] < k do i := i + 1;
      while k < pole[j] do j := j - 1;
      if i <= j then
      begin
        pom := pole[i];
        pole[i] := pole[j];
        pole[j] := pom;
        i := i + 1;
        j := j - 1;
      end;
    until i > j;
    if l < j then Sort(l, j);
    if i < r then Sort(i, r);
  end;

begin {QuickSort};
  Sort(minimum,maximum);
end;


procedure Vyhlzarazka(var vyhlpole: array of integer; hodn: integer; var exist: boolean);
begin
  exist := FALSE;
  i := 1;
  j := 50;
  while ((i < j) and not(exist)) do
  begin
    if (vyhlpole[i] = hodn) then
      exist := TRUE
    else inc(i);
  end;
end;

procedure Vyhlpuleni(var vyhlpole: array of integer; hodn: integer; var poz: integer; var exist: boolean);
begin
  QuickSort(vyhlpole,1,50);
  exist := FALSE;
  i := 1;
  j := 50;
  repeat
    k := trunc((i + j) div 2);
    if (vyhlpole[k] = hodn) then
    begin
      poz := k + 1;
      exist := TRUE;
    end;
    if (vyhlpole[k] < hodn) then i := k + 1
    else j := k - 1;
  until ((vyhlpole[k] = hodn) or (i > j))
end;

BEGIN
  repeat
    clrscr;
    gotoxy(19,6);  writeln('Program na demonstraci vyhledavacich metod.');
    gotoxy(30,8);  writeln('David Padrta - IVT 1');
    gotoxy(19,12); writeln('Vyhledavani se zarazkou        -  zmackni 1');
    gotoxy(19,13); writeln('Vyhledavani v setridenem poli  -  zmackni 2');
    gotoxy(25,21); writeln('Ukonceni programu  -  zmackni 9');
    podminka := readkey;
    case podminka of
     '1': begin
            Generovani;
            Vyhlzarazka(vyhledpole,hodnota,existence);
            Vystup1;
          end;
     '2': begin
            Generovani;
            Vyhlpuleni(vyhledpole,hodnota,pozice,existence);
            Vystup2;
          end;
    end;
  until (podminka = '9');
  clrscr;
  gotoxy(20,10); write('Uspesne jste ukoncil(a) tento program ...');
  delay(1000);
END.