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);
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.