			C	programozs hzi feladat - Hasznlt autk nyilvntartsa

Irtk:
Burny Endre
Rz Ferenc

1995. mjus

																Programozi lers

A program f jellemzi

- a problmkat megoldsuknl elemi egysgekre bontottuk fel (strukturltan
programoztunk). Ez biztostja a hibk elkerlst, knny felkutatst s
javtst, valamint a program tovbbfejlesztsnek s bvtsnek lehetsgt

- az egyszer fggvnyek hasznlata a forrskd rthetsgt is szolglja

- az adatok trolsra egyirnyban lncolt listt hasznl.
	A dinamikus adatszerkezet a memria racionlis felhasznlst biztostja


Az adatok tpusai

A program alapvet vltoztpusa 'listaelem' struktura. Kt mezje van: az
'autotipus' struktura s a kvetkez listaelemre mutat pointer.
Az 'autotipus' strukturnak hat mezje van:

				'tipus'- 20 karakterbl ll string
				'szin' - 10 karakterbl ll string
				'ar' s 'km' - long, mivel nagy egsz szmokra van szksg
				'kor' es 'fogyasztas'
													- egsz szmok (int).

Ezen kvl ltezik mg az 'irol' nev felsorolt tpus, melynek elemei 'IRAS'
s 'OLVASAS' (0 s 1 rtkekkel), valamint a boolean nev felsorolt tpus,
melynek elemei 'FALSE' s 'TRUE'.


Fggvnyek


void igen_nem(boolean *result)

Vr mindaddig, mg meg nem nyomjuk az 'i' s 'n' gombok valamelyikt. A
getch() fggvny egy karaktert ad vissza. Ezt talaktjuk nagybetv, majd
sszehasonltjuk 'I'-vel vagy/s 'N'-nel. Ha megegyezik 'I'-vel, a result
vltoz rtke TRUE lesz, 'N' esetn pedig FALSE. Az eredmnyt 'Igen' vagy
'Nem' formban kirja.

void varj(void)

Vr mindaddig, mg meg nem nyomunk egy gombot a billentyzeten. A kbhit()
fggvny rtke ugyanis TRUE-ra vltozik, ha megnyomunk egy gombot.

char *upper(char *s)

Egy stringet ad vissza, amelyben 's' beti nagybetkknt szerepelnek. Egy for
ciklusban vgigjrjuk a stringet, s minden karakterre meghvjuk az toupper()
fggvnyt. Ez a fggvny a betk nagybets alakjt adja vissza. A string
hosszt a strlen() fggvnnyel llaptjuk meg.

boolean egyenlo(autotipus auto1, autotipus auto2,autotipus tures)

Ez a fggvny kt aut adatait hasonltja ssze. Ha a 'auto2' tpusa ill.
szne res string(''), akkor az azt jelenti, hogy a kt aut tpusa ill.
szne klnbzhet. Ellenkez esetben a fggvny rtke FALSE lesz, s nem
vgez tovbbi sszehasonltst (a fggvnybl az return utastssal lpnk
ki).
A tbbi paramter sszehasonltsnl azt vizsgljuk, hogy az rtkek klnb-
sge kisebb-e mint a trshatrban megadott szzalkos eltrs, s 'auto1'
adott mezjnek rtke kisebb-e 'auto2' mezjnek rtktl. Ha valamelyik
felttel nem teljesl, a fggvny rtke false lesz, s abbahagyjuk a tovbbi
sszehasonltst.
Ha a vizsglat sorn nem lptnk ki a fggvnybl, a visszaadott rtk TRUE
lesz. Ez tulajdonkppen nem azt jelenti, hogy a kt sszehasonltott struktura
egyenl hanem azt, hogy 'auto1' rtkei megfelelnek az adott kritriumoknak.

void recfileba(int  f, autotipus aktualis)

Az f-fel elrhet fjlba berja az 'aktualis' strukturt.

void filerecbe(int  f, autotipus *aktualis)

Az f-fel elrhet fjlbl beolvassa a soron kvetkez strukturt, s az adatokat
az 'aktualis' strukturban trolja.

int megnyit(int *f, char *ffile, irol mire)

Megnyitja f fjlt a 'mire'-ben megadott mveletre(IRAS, OLVASAS).Ha valamilyen
hiba trtnt, az _doserrno vltoz rtke nulltl klnbz lesz.

void bezar(int  f)

Becsukja az f-fel elrhet fjlt.

void autoadat(autotipus *aktualis, boolean *result)

A standard inputrl beolvassa egy aut adatait s trolja ket az 'aktualis'
strukturban. Ha az adatok jk, '*result' rtke TRUE lesz, ellenkez esetben
FALSE.

void beszur(mut *elso,autotipus aktualis)

Beiktat egy 'listaelem' tipusu dinamikus strukturt a lista elejre. Paramter-
knt a lista kezdetre muatat pointert vesz t, s a berand adatokat.
Elszr ltrehoz egy j listaelemet a malloc() fggvnnyel, majd az 'aktualis'
strukturban trolt adatokat tmsolja a listaelembe. Az j listaelem kvetkez
elemre mutat pointert a rgi lista kezdetre irnytja, majd a lista
kezdett mutat pointert az j elemre lltja.
Ezzel az j elemet a lista kezdetre fztk be.

void torol(mut *elso, autotipus auto1)

Paramterknt a trlend listaelem adatait tartalmaz strukturt kapja, s a
lista kezdetre mutat pointert.
A trshatrokat a minimlisra lltjuk, gy csak a teljesen megegyez
adatokkal rendelkez strukturrl vesz a keressnl tudomst. Az 'aktualis' nev
segdpointerrel jrjuk be a lista elemeit. Kzben vigyzunk, hogy ne lpjk
tl a lista vgt. Ha megtalltuk a trlend strukturt, az elz listaelem
kvetkez elemre mutat mezjt rlltjuk a a trlend elem utni strukturra,
majd a trlend elem ltal elfoglalt memriarszt felszabadtjuk a free()
fggvnnyel.

void felszabadit(mut *elso)

Az 'elso' mutatval jelzett lista elemeit felszabadtja a free() fggvnnyel..
Egy segdpointerrel megjegyezzk a lista kezdett, majd a lista kezdett
mutat pointert tirnytjuk a kvetkez elemre. Utna a segdpointerrel
jelzett dinamikus vltozt felszabadadtjuk.

void kiir(autotipus elem,boolean mode)

Kirja a standard outputra az 'elem' struktura mezinek rtkeit.

void toltes(char *ffile, mut *lista, int *count)


Megnyitja olvassra a '*ffile' nev fjlt. Ha hiba trtnt, hibazenettel jelzi,
majd gombnyoms utn megszktja a tltst. Ha nincs hiba, akkor beolvassa a
fjl sszes strukturjt s egy egyirny lncolt listban trolja ket. A lista
kezdetre mutat pointert a 'lista' tartalmazza.
Vgl becsukja a fjlt.

void init(void)

Belltja a program mkdshez szksges kezdeti feltteleket.
A listk kezdetre mutat pointereket NULL rtkre lltja, majd betlti a
fjlokban trolt adatokat.

void print_list(mut elso)

Egy listaelemekbl ll lista 'autotipus'-u strukturi mezjeinek adatait
rja ki. A lista kezdett az 'elso' mutat jelzi.
Egy listaelem adatainak kirsa utn a getch() fggvnnyel beolvassa a lenyo-
mott gomb kdjt. Ha az 27 (az 'Esc' gomb kdja), akkor megszaktja a kirst.
Brmely ms gomb esetn kirja a kvetkez elemet (ha az ltezik).

void mentes(char *ffile, mut lista)

Megnyitja rsra az f fjlt, majd a 'lista' mutatval jelzett lista elemeinek
'autotipus' strukturit berja abba. Ha hiba trtnt, hibazenettel jelzi.
Vgl becsukja a fjlt.

void keres(mut elso, autotipus aut, autotipus tures, mut *elsotalalt)

Az 'elso'-vel jelzett listt bejrja az 'aktualis' segdpointerrel. Ha vala-
melyik listaelem  megegyezik az 'auto' strukturval (a 'tures'-ben megadott
hatarok figyelembevtelvel), a listaelemet beszurja egy masik listba,
melynek kezdetre az 'elsotalalt' pointer mutat.


void kereses(void)

Beolvassa a keresend aut adatait s a megengedett eltrsek mrtkt. Az
adatok ellenrzse utn, igen vlasz esetn meghvja a 'keres' fggvnyt.
Ha a 'keres' nem tall megfelel autkat, a 't_lista' rtke NULL lesz, amit
a 'Nincs megfelel aut' zenettel jelez.
Ellenkez esetben listzza a tallt autkat, majd egyenknt kirva ket
megkrdezi a felhasznlt, megveszi-e az autt. Ha a vlasz igen, trli a
nyilvntartott autk listjbl (amelyet a 'kezdet' nev globlis pointer-
vltoz jelez) a megvett autt.
Vgl megsemmisti a tallt autk listjt a 'felszabadit' fggvnnyel.

void deaktiv(int pont)
void aktiv(int pont)

Menpontok kirsra szolgl fggvnyek. A betk sznt a textcolor() s
textbackground() fggvnyek hatrozzk meg.

boolean nem_ures(mut lista)

TRUE rtket ad vissza, ha lista pointerrel jelzett lista nem res.

boolean egy(autotipus a1,autotipus a2)

TRUE rtket ad vissza, ha az 'a1' s 'a2' strukturk mezi teljesen
megegyeznek.

void torles(void)

Elemenknt kirja az autkat tartalmaz lista elemeit, a 't' gomb nyomsra
trli az ppen kirt elemet.


A fprogram

A fprogram teste a feladatok rszekre bontsnak ksznheten rvid s
ttekithet.
A program kezdetn belltja a kezdeti feltteleket ( init fggvny ). Utna
kvetkezik a fmen ciklusa, amelybl 'Esc' gomb lenyomsa vagy a 'Kilps'
menpont kivlasztsa esetn lp ki. A gombnyomsokra egy switch utastsban
reagl, azaz meghvja a szksges fggvnyeket.
Kilpskor lehetsget ad az adatok elmentsre, majd utna felszabadtja
a dinamikus listk ltal foglalt memriaterleteket.


