Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program cegesautok;
- {$mode objfpc}
- uses sysutils;
- // Konstansok definiálása: bemeneti fájl neve, mező elválasztó
- Const filename = 'autok.txt';
- Const elvalaszto = ' ';
- // Rekord definiálása a fájl egy sorában található adatok tárolásához
- type
- TKiBeHajtas = record
- nap: integer;
- ido: string;
- rendszam: string;
- szemelyAzon: integer;
- kmAllas: integer;
- kibe: integer;
- end;
- // Globális változók definiálása: a rekordok, valamint a rekordok száma
- var
- KiBeHajtasok: array[1..500] of TKiBeHajtas;
- rekordSzam: integer;
- // Egy sor rekorddáá alakítása
- // Átmeneti 6 elemű string tömbbe tesszük, majd megfelelő konverziók után a rekord mezőit beállítjuk
- function sorFelbont(sor: String): TKiBeHajtas;
- var mezok: array[1..6] of string;
- idx: integer;
- begin
- idx := 1;
- while pos(elvalaszto, sor)>0 do
- begin
- mezok[idx] := copy(sor, 1, pos(elvalaszto, sor) - 1);
- delete(sor, 1, pos(elvalaszto, sor));
- inc(idx);
- end;
- mezok[idx] := sor;
- result.nap := StrToInt(mezok[1]);
- result.ido := mezok[2];
- result.rendszam := mezok[3];
- result.szemelyAzon := StrToInt(mezok[4]);
- result.kmAllas := StrToInt(mezok[5]);
- result.kibe := StrToInt(mezok[6]);
- end;
- // Bemeneti fájl felolvasása
- // Soronként olvassuk a fájlt, meghívjuk a sorral a rekoddá alakítást és berakjuk a rekordok tömbjébe
- function fajlBeolvasas(fname: String) : integer;
- var F: TextFile;
- sor: String;
- rekordok: integer;
- begin
- rekordok := 0;
- assign(F, fname);
- reset(F);
- while not EOF(F) do
- begin
- readln(F, sor);
- inc(rekordok);
- KiBeHajtasok[rekordok] := sorFelbont(sor);
- end;
- close(F);
- result := rekordok;
- end;
- // 2. feladat
- // A tömb végéről indulva addig megyünk, míg egy kihajtást (kibe=0) nem találunk. Azt az autót vitték ki utoljára
- procedure feladat2;
- var i: integer;
- begin
- writeln('2. feladat');
- i:=rekordSzam;
- while KiBeHajtasok[i].kibe<>0 do
- begin
- dec(i);
- end;
- writeln(IntToStr(KiBeHajtasok[i].nap) + '. nap rendszám: ' + KiBeHajtasok[i].rendszam);
- end;
- // 0/1 ki/behajtás érték szöveggé konvertálása
- function kiBeStr(kibe: integer): String;
- begin
- if kibe = 0 then
- Result := 'ki'
- else
- Result := 'be'
- end;
- // 3. feladat
- // Addig megyünk a listában, míg a nap száma nem nagyobb, mint a beadott. Ha egyenlő, akkor kiírjuk az adatokat
- procedure feladat3;
- var nap, i: integer;
- begin
- WriteLn('3. feladat');
- Write('Nap: ');
- ReadLn(nap);
- WriteLn('Forgalom a(z) ' + IntToStr(nap) + '. napon:');
- i := 1;
- while KiBeHajtasok[i].nap <= nap do
- begin
- if KiBeHajtasok[i].nap = nap then
- begin
- WriteLn(KiBeHajtasok[i].ido + ' ' + KiBeHajtasok[i].rendszam + ' ' + IntToStr(KiBeHajtasok[i].szemelyAzon) + ' ' + kiBeStr(KiBeHajtasok[i].kibe));
- end;
- inc(i);
- end;
- end;
- // 4. feladat
- // Ha a kihajtásokat +1-nek, a behajtásokat -1-nek számoljuk, akkor ezek összege megadja a vissza nem hozott autók számát
- procedure feladat4;
- var i: integer;
- cnt: integer;
- begin
- WriteLn('4. feladat');
- cnt := 0;
- for i:=1 to rekordSzam do
- begin
- if KiBeHajtasok[i].kibe = 0 then
- inc(cnt)
- else
- dec(cnt);
- end;
- WriteLn('A hónap végén ' + IntToStr(cnt) + ' autót nem hoztak vissza.');
- end;
- // 5. feladat
- // Egy stringbe felfűzzük azokat a rendszámokat, amiket már feldolgoztunk. Végigmegyünk a tömbön, ha az adott rendszám még nem szerepel
- // a felfűzött string-ben, akkor a lista végéről megkeressük az azonos rendszámhoz tartozó utolsó rekordot
- // ekkor az utolsó rekord km állása mínusz az első km állás adja a megtett km-t
- procedure feladat5;
- var i, j: integer;
- feldolgozott: String;
- begin
- WriteLn('5. feladat');
- feldolgozott := '';
- for i:=1 to rekordSzam do
- begin
- if pos(KiBeHajtasok[i].rendszam, feldolgozott) = 0 then
- begin
- feldolgozott := feldolgozott + KiBeHajtasok[i].rendszam;
- j := rekordSzam;
- while KiBeHajtasok[j].rendszam<>KiBeHajtasok[i].rendszam do
- dec(j);
- WriteLn(KiBeHajtasok[i].rendszam + ' ' + IntToStr(KiBeHajtasok[j].kmAllas-KiBeHajtasok[i].kmAllas) + ' km');
- end;
- end;
- end;
- // 6. feladat
- // Egy kihajtott rendszámhoz megkeressük a hozzá tartozó behajtást (a következő azonos rendszámú rekord a tömbben)
- // Ha a behajtás km - kihajtás km nagyobb, mint az eddig letárolt maximum, akkor ezt tároljuk és hozzá a személy azonosítóját
- procedure feladat6;
- var maxkm, i, j, szemely: integer;
- begin
- maxkm := 0;
- WriteLn('6. feladat');
- for i:=rekordSzam downto 2 do
- begin
- if KiBeHajtasok[i].kibe = 1 then
- begin
- j := i-1;
- while KiBeHajtasok[j].rendszam<>KiBeHajtasok[i].rendszam do
- dec(j);
- if KiBeHajtasok[i].kmAllas-KiBeHajtasok[j].kmAllas>maxkm then
- begin
- maxkm := KiBeHajtasok[i].kmAllas-KiBeHajtasok[j].kmAllas;
- szemely := KiBeHajtasok[i].szemelyAzon;
- end;
- end;
- end;
- WriteLn('Leghosszabb út: ' + IntToStr(maxkm) + ' km, személy: ' + IntToStr(szemely));
- end;
- // 7. feladat
- // Bekérjük a rendszámot, majd megyünk végig a tömbön. Ha egyezik a rendszám és az egy kihajtás, akkor soremelés nélkül kiírjuk az
- // adatokat a file-ba. Ha behajtás, akkor soremeléssel.
- procedure feladat7;
- var i: integer;
- rsz: String;
- F: TextFile;
- begin
- WriteLn('7. feladat');
- Write('Rendszám: ');
- ReadLn(rsz);
- assign(F, rsz+'_menetlevel.txt');
- Rewrite(F);
- for i:=1 to rekordSzam do
- begin
- if KiBeHajtasok[i].rendszam = rsz then
- begin
- if KiBeHajtasok[i].kibe = 0 then
- Write(F, IntToStr(KiBeHajtasok[i].szemelyAzon) + chr(9) + IntToStr(KiBeHajtasok[i].nap) + '.' + chr(9) + KiBeHajtasok[i].ido + chr(9) + IntToStr(KiBeHajtasok[i].kmAllas) + ' km' + chr(9))
- else
- WriteLn(F, IntToStr(KiBeHajtasok[i].nap) + '.' + chr(9) + KiBeHajtasok[i].ido + chr(9) + IntToStr(KiBeHajtasok[i].kmAllas) + ' km');
- end;
- end;
- close(F);
- WriteLn('Menetlevél kész.');
- end;
- begin
- rekordSzam := fajlBeolvasas(filename);
- feladat2;
- feladat3;
- feladat4;
- feladat5;
- feladat6;
- feladat7;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement