Program Feladatsor_3_400;

(*

  Feladat:

    Adott N ember neve és személyi száma.

    Rendezzük az a 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=Karakter^11

         menu:Menu, Menu=(RendNev,RendSzSz)

     Ki: emberek':(Nev x SzemSzam)^*

     Ef: N=Hossz(emberek) ES MINDEN i ELEME [1..N]: emberek(i).Nev>’’

     Uf: emberek' ELEME Permutacio(emberek)  ES

         menu=RendNev  => Rendezett{Nev}(emberek')  ES

         menu=RendSzSz => Rendezett{SzemSzam}(emberek')

     Def: Rendezett{SzemSzam}: (Nev x SzemSzam)^* --> Logikai

          Rendezett{SzemSzam}(X):=Rendezett(X.SzemSzam)

          Rendezett{Nev}: (Nev x SzemSzam)^* --> Logikai

          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 az inputfile 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{menubillentyű};

    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 az m-szerinti 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.