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.