13. fejezet: Irány az érettségi!

Ebben a fejezetben bemutatom egy érettségi feladat teljes megoldását, és a megoldás célszerű menetét. Ezzel le is zárjuk az alapvető programozási eszközök témáját, és a következő fejezettel belekezdünk a grafikus alkalmazások készítésébe.
A mintafeladat a 2012. év nyári érettségije lesz. Először nagyon alaposan olvassuk el a feladat leírását! Egy bemeneti mintafájlt feltöltöttem az oldalra.

A nagyvárosokon belül, ha csomagot gyorsan kell eljuttatni egyik helyről a másikra, akkor sokszor a legjobb választás egy kerékpáros futárszolgálat igénybevétele. A futárszolgálat a futárjainak a megtett utak alapján ad fizetést. Az egyik futár egy héten át feljegyezte fuvarjai legfontosabb adatait, és azokat eltárolta egy állományban. Az állományban az adatok rögzítése nem mindig követi az időrendi sorrendet. Azokra a napokra, amikor nem dolgozott, nincsenek adatok bejegyezve az állományba.
A fájlban legalább 10 sor van, és minden sor egy-egy út adatait tartalmazza egymástól szóközzel elválasztva. Az első adat a nap sorszáma, ami 1 és 7 közötti érték lehet. A második szám a napon belüli fuvarszám, ami 1 és 40 közötti érték lehet. Ez minden nap 1-től kezdődik, és az aznapi utolsó fuvarig egyesével növekszik. A harmadik szám az adott fuvar során megtett utat jelenti kilométerben, egészre kerekítve. Ez az érték nem lehet 30-nál nagyobb.
Például:
1 1 5
1 2 9
3 2 12
1 4 3
3 1 7

A 3. sor például azt mutatja, hogy a hét harmadik napján a második fuvar 12 kilométeres távolságot jelentett.


Az adatok beolvasását (1. feladat) már meg is tervezhetjük. Minden út három adatot tartalmaz, melyeket három tömbben (nap, fuvar, hossz) tárolunk. Mivel naponta legfeljebb 40 út lehet, ezért a tömbök maximális mérete 280. Darabolással, konvertálással most nem lesz gond.
db:=0;
while not eof(f) do begin
  db:=db+1;
  readln(f,nap[db],fuvar[db],hossz[db]);
end;

Most olvassuk el az összes feladatot, és gondoljuk végig, van-e olyan rész, amely több feladatban is szerepel!

2. Írja ki a képernyőre, hogy mekkora volt a hét legelső útja kilométerben! Figyeljen arra, hogy olyan állomány esetén is helyes értéket adjon, amiben például a hét első napján a futár nem dolgozott!
3. Írja ki a képernyőre, hogy mekkora volt a hét utolsó útja kilométerben!
4. Tudjuk, hogy a futár minden héten tart legalább egy szabadnapot. Írja ki a képernyőre, hogy a hét hányadik napjain nem dolgozott a futár!
5. Írja ki a képernyőre, hogy a hét melyik napján volt a legtöbb fuvar! Amennyiben több nap is azonos, maximális számú fuvar volt, elegendő ezek egyikét kiírnia.
6. Számítsa ki és írja a képernyőre, hogy az egyes napokon hány kilométert kellett tekerni!
7. A futár az egyes utakra az út hosszától függően kap fizetést az alábbi táblázatnak megfelelően:
1 – 2 km 500 Ft
3 – 5 km 700 Ft
6 – 10 km 900 Ft
11 – 20 km 1 400 Ft
21 – 30 km 2 000 Ft
Kérjen be a felhasználótól egy tetszőleges távolságot, és határozza meg, hogy mekkora díjazás jár érte! Ezt írja a képernyőre!
8. Határozza meg az összes rögzített út ellenértékét! Ezeket az értékeket írja ki a dijazas.txt állományba nap szerint, azon belül pedig az út sorszáma szerinti növekvő sorrendben az alábbi formátumban:
1. nap 1. út: 700 Ft
1. nap 2. út: 900 Ft
1. nap 3. út: 2000 Ft

9. Határozza meg, és írja ki a képernyőre, hogy a futár mekkora összeget kap a heti munkájáért!

Látható, hogy a 2., 3., és 8. feladat mindegyike megoldható az utak időrend szerinti növekvő rendezésével, míg az eredeti sorrendre nincs szükség. Ezért beolvasás után rendezhetjük az utakat (többszempontú rendezés).
for i:=1 to db-1 do begin
  min:=i;
  for j:=i+1 to db do
    if (nap[j]<nap[min]) or ((nap[j]=nap[min]) and (fuvar[j]<fuvar[min]))
    then min:=j;

  x:=nap[min]; nap[min]:=nap[i]; nap[i]:=x;
  x:=fuvar[min]; fuvar[min]:=fuvar[i]; fuvar[i]:=x;
  x:=hossz[min]; hossz[min]:=hossz[i]; hossz[i]:=x;
end;

A 4. és 5. feladat megoldásához megszámolhatjuk, melyik nap hány fuvar volt. Erre egy napifuvar[1..7] tömböt használunk, melynek 7 eleme a hét egyes napjaira vonatkozó fuvarok száma. Mivel a ciklusban nap[i] egy 1 és 7 közötti szám, a napifuvar[nap[i]] kijelöli a napifuvar tömb megfelelő elemét.
for i:=1 to 7 do napifuvar[i]:=0;
for i:=1 to db do napifuvar[nap[i]]:=napifuvar[nap[i]]+1;

A 6. feladat ehhez hasonló, csak nem a fuvarok számát, hanem összhosszát kell kiszámítani (napihossz[1..7] tömb).
for i:=1 to 7 do napihossz[i]:=0;
for i:=1 to db do napihossz[nap[i]]:=napihossz[nap[i]]+hossz[i];

A 7., 8. és 9. feladat mindegyike felhasználja az útdíjtáblázatot. Ezért célszerű egy függvényt írni, amely adott hosszra megadja az útdíjat, és a feladatokban ezt a függvényt hívni.
function utdij(hossz:integer):integer;
 begin
  if hossz<3 then ututdij:=500
  else if hossz<6 then utdij:=700
  else if hossz<11 then utdij:=900
  else if hossz<21 then utdij:=1400
  else utdij:=2000;
 end;

Ennyi előkészület után nekiláthatunk a feladatoknak.
2. Ez hossz[1] lesz.
3. Ez pedig hossz[db].
4. Kiírjuk 1 és 7 között azokat az i-ket, melyekre napifuvar[i]=0.
5. Maximumkiválasztás napifuvar tömbre.
6. Az adatok a napihossz tömbben vannak.
7. Az utdij függvény hívása.
8. Végigmegyünk a három tömbön, és mindegyik lépésben kiírjuk utdij(hossz[i])-t.
9. Összegezzük az utdij(hossz[i])-ket.

Egyszerű volt, ugye?

Feladat

51. Írd meg a programot!
ċ
András Lutter,
2014. dec. 28. 5:08
Comments