program Tridni;

uses crt;

const MaxZaku = 30;
      JmenoSouboru = 'TRIDA.DAT';

type Zak = record
             Cislo : longint;
             Jmeno : string;
             Prumer : Real;
           end;
     SouborZaku = file of Zak;

var Trida : array[1..MaxZaku]of Zak;
    PocetZaku : Integer;
    Data : SouborZaku;
    Prikaz : char;

procedure Inicializace;
 begin
  PocetZaku := 0;
  assign(Data, JmenoSouboru);
  reset(Data);
 end;

procedure UlozNaDisk(var Soubor : SouborZaku);
var i : integer;
begin
  close(Soubor);
  rewrite(Soubor);
  for i := 1 to PocetZaku do write(Soubor,Trida[i]);
  close(Soubor);
  writeln('Data se ukladaji do souboru ',JmenoSouboru,'.');
  reset(Soubor);
 end;

procedure NactiZDisku(var Soubor : SouborZaku);
begin
  PocetZaku := 0;
  reset(Soubor);
  while not(eof(Soubor)) do
  begin
    PocetZaku := PocetZaku + 1;
    read(Soubor,Trida[PocetZaku]);
  end;
  writeln('Data se nacitaji ze souboru ',JmenoSouboru);
  close(Soubor);
  reset(Soubor);
end;

procedure NoviZaci;

  procedure PridejZaka;
  begin
    PocetZaku := PocetZaku + 1;
    with Trida[PocetZaku] do
    begin
      Cislo := PocetZaku;
      write('Jmeno a prijmeni : ');
      readln(Jmeno);
      if Jmeno <> '' then
      begin
        write('Prumer : ');
        readln(Prumer);
      end;
    end;
  end;

begin
  writeln('Prazdne jmeno ukonci vstup.');
  repeat
    PridejZaka;
    if PocetZaku = MaxZaku then writeln('Naplnena kapacita. Ukoncuji vstup.');
  until (Trida[PocetZaku].Jmeno = '') or (PocetZaku = MaxZaku);
  if Trida[PocetZaku].Jmeno = '' then PocetZaku := PocetZaku - 1;
  UlozNaDisk(Data);
end;

procedure SeradAbecedne;
var Pom : array[1..MaxZaku] of Zak;
    Min : Zak;
    i, j, k : integer;
begin
  for i := 1 to PocetZaku do
  begin
    Pom[i].Cislo := Trida[i].Cislo;
    Pom[i].Jmeno := Trida[i].Jmeno;
    Pom[i].Prumer := Trida[i].Prumer;
  end;
  for i := 1 to PocetZaku-1 do
  begin
    Min.Cislo := Pom[i].Cislo;
    Min.Jmeno := Pom[i].Jmeno;
    Min.Prumer := Pom[i].Prumer;
    k := i;
    for j := i+1 to PocetZaku do
      if (Min.Jmeno > Pom[j].Jmeno) then
      begin
        Min.Cislo := Pom[j].Cislo;
        Min.Jmeno := Pom[j].Jmeno;
        Min.Prumer := Pom[j].Prumer;
        k := j;
      end;
    Pom[k].Cislo := Pom[i].Cislo;
    Pom[k].Jmeno := Pom[i].Jmeno;
    Pom[k].Prumer := Pom[i].Prumer;
    Pom[i].Cislo := Min.Cislo;
    Pom[i].Jmeno := Min.Jmeno;
    Pom[i].Prumer := Min.Prumer;
  end;
  for i := 1 to PocetZaku do
  with Pom[i] do
    writeln(Jmeno:35,'   (prumer : ',Prumer:4:2,', poradove cislo : ',Cislo:4,')');
end;

procedure SeradProspechove;
var Pom : array[1..MaxZaku] of Zak;
    Min : Zak;
    i, j, k : integer;
begin
  for i := 1 to PocetZaku do
  begin
    Pom[i].Cislo := Trida[i].Cislo;
    Pom[i].Jmeno := Trida[i].Jmeno;
    Pom[i].Prumer := Trida[i].Prumer;
  end;
  for i := 1 to PocetZaku-1 do
  begin
    Min.Cislo := Pom[i].Cislo;
    Min.Jmeno := Pom[i].Jmeno;
    Min.Prumer := Pom[i].Prumer;
    k := i;
    for j := i+1 to PocetZaku do
      if (Min.Prumer > Pom[j].Prumer) then
      begin
        Min.Cislo := Pom[j].Cislo;
        Min.Jmeno := Pom[j].Jmeno;
        Min.Prumer := Pom[j].Prumer;
        k := j;
      end;
    Pom[k].Cislo := Pom[i].Cislo;
    Pom[k].Jmeno := Pom[i].Jmeno;
    Pom[k].Prumer := Pom[i].Prumer;
    Pom[i].Cislo := Min.Cislo;
    Pom[i].Jmeno := Min.Jmeno;
    Pom[i].Prumer := Min.Prumer;
  end;
  for i := 1 to PocetZaku do
  with Pom[i] do
    writeln(Jmeno:35,'  (prumer : ',Prumer:4:2,', poradove cislo : ',Cislo:4,')');
end;

procedure RuseniZaku;
var Koho : LongInt;

  procedure SmazZaka(Ktereho : LongInt);
  var Pom : Zak;
      i : LongInt;
  begin
    i := 0;
    if Trida[PocetZaku].Cislo = Ktereho then Dec(PocetZaku)
    else
    repeat
      Inc(i);
      if Trida[i].Cislo = Ktereho then
      begin
        Trida[i].Jmeno := Trida[PocetZaku].Jmeno;
        Trida[i].Prumer := Trida[PocetZaku].Prumer;
        Dec(PocetZaku);
      end;
    until i >= PocetZaku;
  end;

begin
  write('Vloz cislo, ktereho zaka chces vypustit : ');
  readln(Koho);
  SmazZaka(Koho);
  UlozNaDisk(Data);
end;

procedure Hlavni_nabidka;
begin
  textbackground(0);
  clrscr;
  textcolor(lightred);
  gotoxy(14,6); writeln('Program na demonstraci databaze zaku a prospechu');
  gotoxy(28,8); writeln('David Padrta  -  IVT 3');
  textcolor(lightred);
  gotoxy(16,11); writeln('ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ');
  textcolor(white);
  gotoxy(16,12); writeln('Vkladani novych zaku        : ');
  gotoxy(16,13); writeln('Ruseni zaku                 : ');
  gotoxy(16,14); writeln('Abecedni serazeni dat       :  ');
  gotoxy(16,15); writeln('Prospechove serazeni dat    :  ');
  textcolor(lightred);
  gotoxy(16,16); writeln('ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ');
  textcolor(white);
  gotoxy(16,17); writeln('Ukonceni programu           :  ');
  textcolor(lightgreen);
  gotoxy(47,12); writeln('zmackni V nebo v');
  gotoxy(47,13); writeln('zmackni R nebo r');
  gotoxy(47,14); writeln('zmackni A nebo a');
  gotoxy(47,15); writeln('zmackni P nebo p');
  gotoxy(47,17); writeln('zmackni K nebo k');
end;

BEGIN
  clrscr;
  Inicializace;
  NactiZDisku(Data);
  repeat
    Hlavni_nabidka;
    Prikaz := readkey;
    writeln;
    case Prikaz of
      'v', 'V' : begin
                   textcolor(white);
                   clrscr;
                   NoviZaci;
                   writeln;
                   writeln('Stiskni ENTER ...');
                   readln;
                 end;
      'r', 'R' : begin
                   textcolor(white);
                   clrscr;
                   RuseniZaku;
                   writeln;
                   writeln('Stiskni ENTER ...');
                   readln;
                 end;
      'a', 'A' : begin
                   textcolor(white);
                   clrscr;
                   SeradAbecedne;
                   writeln;
                   writeln('Stiskni ENTER ...');
                   readln;
                 end;
      'p', 'P' : begin
                   textcolor(white);
                   clrscr;
                   SeradProspechove;
                   writeln;
                   writeln('Stiskni ENTER ...');
                   readln;
                 end;
    end;
  until Prikaz in ['k','K'];
  UlozNaDisk(Data);
END.