vargalex

Untitled

Apr 24th, 2020
853
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Program cegesautok;
  2.  
  3. {$mode objfpc}
  4.  
  5. uses sysutils;
  6.  
  7. // Konstansok definiálása: bemeneti fájl neve, mező elválasztó
  8. Const filename = 'autok.txt';
  9. Const elvalaszto = ' ';
  10.  
  11. // Rekord definiálása a fájl egy sorában található adatok tárolásához
  12. type
  13.     TKiBeHajtas = record
  14.         nap: integer;
  15.         ido: string;
  16.         rendszam: string;
  17.         szemelyAzon: integer;
  18.         kmAllas: integer;
  19.         kibe: integer;
  20.     end;
  21.  
  22. // Globális változók definiálása: a rekordok, valamint a rekordok száma
  23. var
  24.     KiBeHajtasok: array[1..500] of TKiBeHajtas;
  25.     rekordSzam: integer;
  26.  
  27. // Egy sor rekorddáá alakítása
  28. // Átmeneti 6 elemű string tömbbe tesszük, majd megfelelő konverziók után a rekord mezőit beállítjuk
  29. function sorFelbont(sor: String): TKiBeHajtas;
  30. var mezok: array[1..6] of string;
  31.     idx: integer;
  32. begin
  33.     idx := 1;
  34.     while pos(elvalaszto, sor)>0 do
  35.         begin
  36.             mezok[idx] := copy(sor, 1, pos(elvalaszto, sor) - 1);
  37.             delete(sor, 1, pos(elvalaszto, sor));
  38.             inc(idx);
  39.         end;
  40.     mezok[idx] := sor;
  41.     result.nap := StrToInt(mezok[1]);
  42.     result.ido := mezok[2];
  43.     result.rendszam := mezok[3];
  44.     result.szemelyAzon := StrToInt(mezok[4]);
  45.     result.kmAllas := StrToInt(mezok[5]);
  46.     result.kibe := StrToInt(mezok[6]);
  47. end;
  48.  
  49. // Bemeneti fájl felolvasása
  50. // Soronként olvassuk a fájlt, meghívjuk a sorral a rekoddá alakítást és berakjuk a rekordok tömbjébe
  51. function fajlBeolvasas(fname: String) : integer;
  52.     var F: TextFile;
  53.         sor: String;
  54.         rekordok: integer;
  55. begin
  56.     rekordok := 0;
  57.     assign(F, fname);
  58.     reset(F);
  59.     while not EOF(F) do
  60.       begin
  61.         readln(F, sor);
  62.         inc(rekordok);
  63.         KiBeHajtasok[rekordok] := sorFelbont(sor);
  64.       end;
  65.     close(F);
  66.     result := rekordok;
  67. end;
  68.  
  69. // 2. feladat
  70. // 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
  71. procedure feladat2;
  72.     var i: integer;
  73. begin
  74.     writeln('2. feladat');
  75.     i:=rekordSzam;
  76.     while KiBeHajtasok[i].kibe<>0 do
  77.         begin
  78.             dec(i);
  79.         end;
  80.     writeln(IntToStr(KiBeHajtasok[i].nap) + '. nap rendszám: ' + KiBeHajtasok[i].rendszam);
  81. end;
  82.  
  83. // 0/1 ki/behajtás érték szöveggé konvertálása
  84. function kiBeStr(kibe: integer): String;
  85. begin
  86.     if kibe = 0 then
  87.         Result := 'ki'
  88.     else
  89.         Result := 'be'
  90. end;
  91.  
  92. // 3. feladat
  93. // Addig megyünk a listában, míg a nap száma nem nagyobb, mint a beadott. Ha egyenlő, akkor kiírjuk az adatokat
  94. procedure feladat3;
  95.     var nap, i: integer;
  96. begin
  97.     WriteLn('3. feladat');
  98.     Write('Nap: ');
  99.     ReadLn(nap);
  100.     WriteLn('Forgalom a(z) ' + IntToStr(nap) + '. napon:');
  101.     i := 1;
  102.     while KiBeHajtasok[i].nap <= nap do
  103.       begin
  104.         if KiBeHajtasok[i].nap = nap then
  105.             begin
  106.                 WriteLn(KiBeHajtasok[i].ido + ' ' + KiBeHajtasok[i].rendszam + ' ' + IntToStr(KiBeHajtasok[i].szemelyAzon) + ' ' + kiBeStr(KiBeHajtasok[i].kibe));
  107.             end;
  108.         inc(i);
  109.       end;
  110. end;
  111.  
  112. // 4. feladat
  113. // 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
  114. procedure feladat4;
  115.     var i: integer;
  116.         cnt: integer;
  117. begin
  118.     WriteLn('4. feladat');
  119.     cnt := 0;
  120.     for i:=1 to rekordSzam do
  121.         begin
  122.         if KiBeHajtasok[i].kibe = 0 then
  123.             inc(cnt)
  124.         else
  125.             dec(cnt);
  126.         end;
  127.     WriteLn('A hónap végén ' + IntToStr(cnt) + ' autót nem hoztak vissza.');
  128. end;
  129.  
  130. // 5. feladat
  131. // 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
  132. // a felfűzött string-ben, akkor a lista végéről megkeressük az azonos rendszámhoz tartozó utolsó rekordot
  133. // ekkor az utolsó rekord km állása mínusz az első km állás adja a megtett km-t
  134. procedure feladat5;
  135.     var i, j: integer;
  136.         feldolgozott: String;
  137. begin
  138.     WriteLn('5. feladat');
  139.     feldolgozott := '';
  140.     for i:=1 to rekordSzam do
  141.         begin
  142.             if pos(KiBeHajtasok[i].rendszam, feldolgozott) = 0 then
  143.                 begin
  144.                     feldolgozott := feldolgozott + KiBeHajtasok[i].rendszam;
  145.                     j := rekordSzam;
  146.                     while KiBeHajtasok[j].rendszam<>KiBeHajtasok[i].rendszam do
  147.                         dec(j);
  148.                     WriteLn(KiBeHajtasok[i].rendszam + ' ' + IntToStr(KiBeHajtasok[j].kmAllas-KiBeHajtasok[i].kmAllas) + ' km');
  149.                 end;
  150.         end;
  151. end;
  152.  
  153. // 6. feladat
  154. // Egy kihajtott rendszámhoz megkeressük a hozzá tartozó behajtást (a következő azonos rendszámú rekord a tömbben)
  155. // 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
  156. procedure feladat6;
  157.     var maxkm, i, j, szemely: integer;
  158. begin
  159.     maxkm := 0;
  160.     WriteLn('6. feladat');
  161.     for i:=rekordSzam downto 2 do
  162.         begin
  163.             if KiBeHajtasok[i].kibe = 1 then
  164.                 begin
  165.                     j := i-1;
  166.                     while KiBeHajtasok[j].rendszam<>KiBeHajtasok[i].rendszam do
  167.                         dec(j);
  168.                     if KiBeHajtasok[i].kmAllas-KiBeHajtasok[j].kmAllas>maxkm then
  169.                         begin
  170.                             maxkm := KiBeHajtasok[i].kmAllas-KiBeHajtasok[j].kmAllas;
  171.                             szemely := KiBeHajtasok[i].szemelyAzon;
  172.                         end;
  173.                 end;
  174.         end;
  175.     WriteLn('Leghosszabb út: ' + IntToStr(maxkm) + ' km, személy: ' + IntToStr(szemely));    
  176. end;
  177.  
  178. // 7. feladat
  179. // 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
  180. // adatokat a file-ba. Ha behajtás, akkor soremeléssel.
  181. procedure feladat7;
  182.     var i: integer;
  183.         rsz: String;
  184.         F: TextFile;
  185. begin
  186.     WriteLn('7. feladat');
  187.     Write('Rendszám: ');
  188.     ReadLn(rsz);
  189.     assign(F, rsz+'_menetlevel.txt');
  190.     Rewrite(F);
  191.     for i:=1 to rekordSzam do
  192.         begin
  193.             if KiBeHajtasok[i].rendszam = rsz then
  194.                 begin
  195.                     if KiBeHajtasok[i].kibe = 0 then
  196.                         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))
  197.                     else
  198.                         WriteLn(F, IntToStr(KiBeHajtasok[i].nap) + '.' + chr(9) + KiBeHajtasok[i].ido + chr(9) + IntToStr(KiBeHajtasok[i].kmAllas) + ' km');
  199.                 end;
  200.         end;
  201.     close(F);
  202.     WriteLn('Menetlevél kész.');
  203. end;
  204.  
  205. begin
  206.   rekordSzam := fajlBeolvasas(filename);
  207.   feladat2;
  208.   feladat3;
  209.   feladat4;
  210.   feladat5;
  211.   feladat6;
  212.   feladat7;
  213. end.
RAW Paste Data