Program Feladatsor_3_400;
(*
  Feladat:
    Adott N ember neve és személyi száma.
    Rendezzük az adatokat kívánság szerint név vagy kor szerint.
  Megoldas:
  0. Tetelek
     = Rendezés (név ´s szem.szam 2..7 jegye szerint)
  1. Specifikacio:
     Be: N:Egesz, emberek:(Nev x SzemSzam)^*, Nev=Szoveg, Szemszam=Szoveg^11
         menu:Menu, Menu=(RendNev,RendSzSz)
     Ki: emberek':(Nev x SzemSzam)^*
     Ef: -
     Uf: emberek' ELEME Permutacio(emberek)  ES
         menu=RendNev  => Rendezett{Nev}(emberek')  ES
         menu=RendSzSz => Rendezett{SzemSzam}(emberek')
     Def: Rendezett{SzemSzam}: (Nev x SzemSzam)^* --> (Nev x SzemSzam)^*
          Rendezett{SzemSzam}(X):=Rendezett(X.SzemSzam)
          Rendezett{Nev}: (Nev x SzemSzam)^* --> (Nev x SzemSzam)^*
          Rendezett{Nev}(X):=Rendezett(X.Nev)
*)
  Uses  Newdelay,Crt,Crt22;
  Const MaxN=250;
        NevHossz=10;
  Type  TNev=String[40];
        TSzemSzam=String[11];
        TEmber=Record
                 nev:TNev;
                 szemSzam:TSzemSzam
               End;
        TEmberek=Array [1..MaxN] of TEmber;
        TMenu=(RendNev,RendSzSz,Vege);
  Const CMenu:Array[TMenu] of Char=('N','S','V');
        SMenuk:String[Ord(Vege)+1]='NSV';
  Var   N:LongInt;
        emberek:TEmberek;
        menu:TMenu;

  Procedure Listazas(cim:String; e:TEmberek; db:LongInt);
    Var i,j:Integer;
  Begin
    UjLap(cim,0{nem vár});
    For i:=1 to db do
    Begin
      Writeln(e[i].Nev:40,' (',e[i].szemszam,') ');
    End;{For i}
  End;

  Procedure AdatBeolvasas;
    Var i,j:Integer;
  Begin
    (*
      Beolvasás a specifikált inputról [l. a Crt22 unit leírását!]:
      Figyelem:
        ha a file-input hibás, akkor "végtelen ciklusba" eshet...
    *)
    UjLap('Emberek',0{nem vár});
    Repeat
      Write('Emberek száma:');
      Readln(N);
    Until N in [1..MaxN];
    For i:=1 to N do
    Begin
      Writeln(i:2,'. ember neve és személyi száma');
      Repeat
        Write(' Neve:');
        Readln(emberek[i].Nev);
      Until (emberek[i].Nev>'') {ellenőrizendő lenne az egyediség is!!!};
      Repeat
        Write('Személyi száma:');
        Readln(emberek[i].szemSzam);
      Until emberek[i].szemSzam>'' {ellenőrizendő lenne a helyesség is!!!};
    End;

    {Ellenőrző kiírás a képernyőre:}
    KonzolOutput;
    Listazas('Emberek',emberek,N);
    BillreVar;
    {Visszaváltás az esetleges file-outputra:}
    FileOutput('');

  End;

  Function MenuBe:TMenu;
    Var c:Char;
        i:TMenu;
  Begin
    Writeln(' Rendezési szempont');
    Repeat
      Write(' N(év)/S(zemélyi szám)/V(ége)');
      c:=ReadKey; c:=UpCase(c); Write(c);
    Until Pos(c,SMenuk)>0{menubillentyu};
    i:=RendNev;
    While (i<Vege) and (CMenu[i]<>c) do i:=Succ(i);
    MenuBe:=i
  End;

  Procedure EredmenyKiiras;
  Begin
    (*
      Kiírás a specifikált outputra.
      Azaz ha van outputfile specifikálva, akkor áttérés arra;
      különben marad a konzoloutput.
    *)
    Case menu of
      RendNev : Listazas('Név szerint rendezett',emberek,N);
      RendSzSz: Listazas('Személyi szám szerint rendezett',emberek,N);
    End;
    BillreVar;
  End;

  Procedure Rendezes(Var em:TEmberek; n:LongInt; m:TMenu);
  Begin
    UjLap('Rendezés '+CMenu[m]+'-szerint',0);
    {... ide kell a rendezés ...}
    BillreVar;
  End;

Begin
  {Adatbeolvasás file-ból v. konzolról:}
  AdatBeolvasas;
  {Feldolgozás:}
  menu:=MenuBe; {a menü-kiválasztása csak a billentyûről megy!
                 ReadKey miatt!}
  While menu<>Vege do
  Begin
    Rendezes(emberek,N,menu);
    {Kiírás file-ba v. konzolra:}
    EredmenyKiiras;
    menu:=MenuBe;
  End;
End.