program Index2; const cMaxEmberek = 10; { mivel tobb helyen is hivatkozunk majd az emberek maximalis szamara, erdemes ezt a szamot elnevezni, es igy majd jobban ertheto, hogy ha valahova 10-et irunk, akkor az mer' pont 10. nomeg ha szeretnenk pl 20 embert kezelni, akkor csak itt kell atirni es mindenhol, ahol erre a maximalis szamra hivatkoztunuk, ott majd 20-nak lesz veve a cMaxEmberek (a c itt arra utal, hogy ez az azonosito egy Constant, azaz konstans) } type { egy azonositoban (ld. TEmber vagy Emberek) a kezdo nagy T betu arra utal, hogy az egy adat Tipust (Type) jelento azonosito. (az azonositok (identifier) azok a szavak amelyeket te adod valami programozasi elem nevek. pl: valozok, konstansok tipusok (asszem tobb nincs)) } { egy ember adatai } TEmber = record Nev: string[30]; { ez csaj/faszi neve } Kor: integer; { kora (tudod: -32768 .. 32767) } end; TEmberekIndexei = array[1..cMaxEmberek] of integer; { van az embereknek egy olyan tulajdonsaga, amivel biztosan csak ok rendelkeznek egyedul, megpedig a sorszamuk (hogy hanyadikak a sorban). ?!? egy helyen nem allhat ket ember ?!? ez egy ugynevezett azonosito tulajdonsaguk, ez alapjan ugyanis 1 es csak 1 ember osszes egyeb tulajdonsaga kireditheto (az emberek listajabol). nopersze nem jo azonositonak a sorszam, hogyha ez valtozhat (pl az embereket mozgatunk a listaban, embereket veszunk ki a listabol, esetleg ujakat is beteszunk). ennek megoldasarol majd kesobb...} { emberek listaja } TEmberek = array[1..cMaxEmberek] of TEmber; var Emberek: TEmberek; { keszitunk egy konkret listat } EmberekIndexei: TEmberekIndexei; { csinalunk index listat is } Ember1, Ember2: TEmber; { egy-ket hely kell emberek ide-oda pakolasahoz } EmberekSzama: integer; { ennyi embert tartunk epp nyilvan } i, j: integer; { mindenfele szamlalgatashoz } procedure Beolvasas; begin { az emberek listajanak beolvasasa } EmberekSzama := 0; { ennyi emberunk van most } repeat Write('Nev: '); { megmutatjuk, hogy mit kerdezunk } ReadLn(Ember1.Nev); { varjuk ra a valaszt, az embernek a nevet } if Ember1.Nev <> '' then { ha meg nem fejezzuk be a listat, azaz } begin { irtunk be valami nevet, akkor } Write('Kor: '); { megmutatjuk, hogy mit kerdezunk } ReadLn(Ember1.Kor); { varjuk ra a valaszt, az ember korat } Inc(EmberekSzama); { most mar egyel tobb emberunk van } Emberek[EmberekSzama] := Ember1; { berakjuk ot a lista vegere } end; until Ember1.Nev = ''; end; procedure Listazas; begin { ellenorzeskepp kilistazzuk uuket } { csak most az indextombon keresztul nezve } for i := 1 to EmberekSzama do { az elsotol az utolsoig } begin WriteLn(Emberek[EmberekIndexei[i]].Nev, ' ', Emberek[EmberekIndexei[i]].Kor); end; end; procedure Rendezes; var Csere: boolean; { itt jelezzuk, hogy tortent-e meg mozgolodas, } { azaz helyCSERE } begin for i := 1 to EmberekSzama do { az indextomb felveszi az emberek } EmberekIndexei[i] := i; { aktualis sorrendjet } repeat Csere := False; { jelezzuk, hogy meg senki nem mozdult a helyerol ebben a menetben } for i := 1 to EmberekSzama - 1 do begin if Emberek[EmberekIndexei[i]].Nev > Emberek[EmberekIndexei[i + 1]].Nev then begin { es most nem az embereket csak az azonositoikat (az indexuket) cserelgetjuk (igy a csere csak egyetlen szam cserejet jelenti!)} j := EmberekIndexei[i]; EmberekIndexei[i] := EmberekIndexei[i + 1]; EmberekIndexei[i + 1] := j; Csere := True; { jelezzuk, hogy csinaltunk helycseret, marpedig akkor ujra at kell nezni a mindenkit, hogy sorrendben vannak-e mar } end; end; until not Csere; { addig nezegetjuk a gyerekeket, amig mar nem kell } { helyet csereltetnunk koztuk } end; begin Beolvasas; { celszeru nevnek c,b,a-t beirni a gyors proba kedveert } Rendezes; { ezen valtoztattunk } Listazas; { az indexek felhasznalasaval listazunk } end.