Az 1. feladat megoldása
Antik könyveim Mivel az átlagszámításhoz egyszerre kell rendelkezésre állnia valamennyi a könyvekről tárolt információnak, először a KONYV.TXT állományt dolgozzuk fel. Vizsgáljuk meg, milyen adatok tárolására lesz szükségünk!
A feladat szempontjából a szerző és a mű címe érdektelen. A kiadó nevéről tudjuk, hogy biztosan elfér 40 karakteren, hiszen a KIADO.DAT állományban is így ábrázoljuk. A kiadás évét célszerű változtatás nélkül megőrizni, hiszen a kérdésre adandó válaszhoz éppen erre lesz szükség. A terjedelem és az eredeti vételár külön-külön nem tárolandó, csak az arányuk kell.
A könyvek számát előre nem ismerjük, ezért a bejegyzésekből láncolt listát építünk. A lista összefűzéséhez egy mutatóra lesz szükségünk. Legegyszerűbben verem szervezésű listát építhetünk, amihez szükségünk lesz még egy mutatóra, ami az első elemet kijelöli. A lista végét egy 0 értékű mutatóval jelezhetjük. listafej
következő kiadó évszám lapérték
∏∏∏ ∏∏∏ ∏∏∏ ∏∏∏
Ennek alapján definiáljunk adattípust a lista elemeinek és a mutatónak!
typedef struct l { struct l *next; char edition[40]; int year; double value_per_page; } list_element,*list_pointer; Szövegszerkesztő program segítségével állítsunk elő egy KONYV.TXT nevű állományt! Pl.: Alexandre Dumas A jávai orvos Európa Könyvkiadó 1968 354 39 Moldova György Éjféli napsütés Urbis Könyvkiadó 2006 186 1700 Leslie L. Lawrence Portugál április Gesta Könyvkiadó 2007 821 1995
Első lépésként írjunk programot, amely beolvassa az állomány minden sorát, és az adatokat kiírja a képernyőre! Így ellenőrizhetjük, hogy valóban minden adatot be tudunk-e olvasni, illetve, hogy minden adatot csak egyszer olvasunk be. A programot úgy kell megírnunk, hogy nem tudhatja előre, hol lesz az adatok vége. Hibás adatok fogadására viszont nem kell felkészítenünk a programot, mert erről a feladat kiírása rendelkezik. Mivel az állomány leírása szerint sorokra tördelt, célszerűen soronként fogjuk beolvasni az fgets() függvény segítségével, az adatokat pedig az sscanf() függvény segítségével olvassuk ki a pufferből.
#include <stdio.h> #include <stdio.h> #include <string.h> int main(){ FILE*f; char puff[80]; char kiado[40]; int s; f=fopen("KONYV.TXT","rt"); while(fgets(puff,78,f)){ printf("%s",puff); fgets(puff,78,f); printf("%s",puff); fgets(puff,78,f); printf("%s",puff); strcpy(kiado,puff); kiado[strlen(puff)-1]='\0'; printf("%s\n",kiado); fgets(puff,78,f); printf("%s",puff); sscanf(puff,"%d",&s); printf("%d\n",s); fgets(puff,78,f); printf("%s",puff); sscanf(puff,"%d",&s); printf("%d\n",s); fgets(puff,78,f); printf("%s",puff); sscanf(puff,"%d",&s); printf("%d\n",s); } fclose(f); return 0; }
/* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /*
amíg sikerül új sort beolvasni kiírjuk a beolvasott sort beolvassuk a következő sort kiírjuk a beolvasott sort beolvassuk a következő sort kiírjuk a beolvasott sort átmásoljuk a kiadó nevét a sorvég karaktert 0-ra cseréljük kiírjuk a kiadó nevét beolvassuk a következő sort kiírjuk a beolvasott sort beolvassuk a kiadás évét kiírjuk a kiadás évét beolvassuk a következő sort kiírjuk a beolvasott sort beolvassuk az oldalak számát kiírjuk az oldalak számát beolvassuk a következő sort kiírjuk a beolvasott sort beolvassuk a vételárat kiírjuk a vételárat
*/ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */
Következő lépésként készítsük el azt a programrészletet, amely a KONYV.TXT beolvasása alapján elkészíti a listát! Ellenőrzésül menjünk végig a listán, és írjuk ki a tárolt adatokat! Mivel a feladat kiírása megköveteli az adatszerkezet felépítésének algoritmusát, ne legyünk lusták megtervezni és rögzíteni az algoritmus lépéseit!
Lista építése: Adatállomány megnyitása Van még beolvasható adat Új listaelem létrehozása Tárolt adatok bemásolása Lapérték kiszámítása és tárolása Elem befűzése a listába Adatállomány lezárása
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct l { struct l *next; char edition[40]; int year; double value_per_page; } list_element,*list_pointer; list_pointer books=0; void read_txt(){ list_pointer temp; FILE*f; char puff[80]; int a,b; f=fopen("KONYV.TXT","rt"); while(fgets(puff,78,f)){ /* amíg sikerül új sort beolvasni temp=calloc(1,sizeof(list_element)); /* lefoglaljuk az új elemet fgets(puff,78,f); /* beolvassuk a következő sort /* beolvassuk a következő sort fgets(puff,78,f); strcpy(temp->edition,puff); /* átmásoljuk a kiadó nevét temp->edition[strlen(puff)-1]='\0';/* a sorvég karaktert 0-ra cseréljük fgets(puff,78,f); /* beolvassuk a következő sort /* beolvassuk a kiadás évét sscanf(puff,"%d",&(temp->year)); fgets(puff,78,f); /* beolvassuk a következő sort sscanf(puff,"%d",&a); /* beolvassuk az oldalak számát fgets(puff,78,f); /* beolvassuk a következő sort sscanf(puff,"%d",&b); /* beolvassuk a vételárat temp->value_per_page=(double)b/a; /* kiszámítjuk a laponkénti vételárat temp->next=books; /* befűzzük az új elemet a listába books=temp; /* beállítjuk a lista új kezdőpontját } fclose(f); }
*/ */ */ */ */ */ */ */ */ */ */ */ */ */ */
void dump(){ list_pointer temp=books; while (temp){ printf("%4d %8.3lf %s\n", temp->year,temp->value_per_page,temp->edition); temp=temp->next; } } int main(){ read_txt(); dump(); return 0; } A read_txt() függvényt változatlanul tudjuk felhasználni, a dump() függvény pedig alkalmas lesz az adatok változásának követésére a bináris adatállomány feldolgozása után. Ahhoz, hogy a KIADO.DAT állományt fel tudjuk dolgozni, először létre kell hoznunk. Ennek legegyszerűbb módja, hogy létrehozunk egy szöveges állományt, és annak sorait írjuk ki a bináris állományba. Ellenőrzésül olvassuk vissza, és írjuk ki a tartalmát! Ha a visszaolvasás sikeres, akkor a programrészletet felhasználhatjuk a bináris állomány feldolgozásában.
#include <stdio.h>
Pl. KIADO.TXT:
Európa Könyvkiadó 1.021 void write_dat(){ Urbis Könyvkiadó FILE*f,*g; 1.032 char puff[40]; Gesta Könyvkiadó double a; 1.005 int i; f=fopen("KIADO.TXT","rt"); g=fopen("KIADO.DAT","wb"); while(fgets(puff,38,f)){ /* amíg sikerül új kiadót beolvasni */ for(i=strlen(puff)-1;i<40;i++)puff[i]='\0'; /* nullázzuk a végét */ fwrite(puff,40,1,g); /* kiirjuk a kiadó nevét */ fgets(puff,78,f); /* beolvassuk a következő sort */ sscanf(puff,"%lf",&a); /* beolvassuk a növekedés mértékét */ fwrite(&a,sizeof(double),1,g); /* kiírjuk a növekedés mértékét */ } fclose(f); fclose(g); } void read_dat(){ FILE*f; char puff[40]; double a; f=fopen("KIADO.DAT","rb"); while(fread(puff,40,1,f)){ /* amíg sikerül új kiadót beolvasni */ fread(&a,sizeof(double),1,f); /* beolvassuk a növekedés mértékét */ printf("%7.4lf %s\n",a,puff); /* kiírjuk a beolvasott adatokat */ } fclose(f); }
int main(){ write_dat(); read_dat(); return 0; } A könyvek aktuális oldalankénti értékének meghatározásához a KIADO.DAT állomány adatait nem kell tárolnunk. Egy-egy kiadó beolvasása után végigszaladunk a listán, és ahol egyezést találunk módosítjuk az értéket. Mivel a módosítást minden könyv esetében pontosan egyszer hajtjuk végre egyúttal megszámlálhatjuk a könyveket, és összegezhetjük az értéküket. Így a feldolgozás során azonnal megkaphatjuk az átlagos értéket, amire a válaszadáskor úgyis szükségünk lesz. Megjegyzés: A program működését gyorsíthatjuk, ha azokat a listaelemeket, amelyeket már feldolgoztunk, áttesszük egy másik listába. Így a következő keresésekkor nem kell újra meg újra elolvasnunk őket. Ez egyúttal védekezés az ellen, ha egy kiadó véletlenül kétszer szerepelne az adatállományban. Erre az esetre azonban nem kell felkészülnünk, mert a feladat kiírása kizárja, ezért ettől a lehetőségtől most eltekintünk. Lista módosítása: Összérték nullázása Könyvek számának nullázása Adatállomány megnyitása Van még beolvasható adat Lista elejére állás Még nem értünk a végére NEM
Kiadó egyezik
IGEN
Bejegyzés módosítása Érték könyvelése Lépés a következő listaelemre Adatállomány lezárása Átlag kiszámítása Bejegyzés módosítása: Könyv korának meghatározása Még nem fogytak el az évek Érték növelése a megadott arányban Évek számának csökkentése Érték könyvelése: Összérték növelése az aktuális értékkel Könyvek számának növelése
Kódoljuk az algoritmust függvény formában! Kiindulásul a read_dat() függvény szerkezetét használjuk. A függvény visszatérési értéke, legyen a könyvek pillanatnyi oldalankénti értékének átlaga!
double update_list(){ list_pointer temp; /* mutató a lista bejárásához */ /* a feldogozandó állomány */ FILE*f; char edit[40]; /* a kiadó neve */ double a; /* az értéknövekedés aránya */ double sum; /* az értékek összege */ int count; /* a könyvek darabszáma */ int diff; /* a kiadás évének távolsága 2012-től */ /* nullázzuk az összeget és a darabszámot sum=count=0; f=fopen("KIADO.DAT","rb"); while(fread(edit,40,1,f)){ /* amíg sikerül új kiadót beolvasni fread(&a,sizeof(double),1,f); /* beolvassuk a növekedés mértékét for(temp=books;temp;temp=temp->next) /* végigmegyünk a listán /* ha a kiadó egyezik if (!strcmp(temp->edition,edit)){ for(diff=2012-temp->year;diff;diff--) /* a köny éveiszer temp->value_per_page*=a; /* növelgetjük az értéket sum+=temp->value_per_page; /* összegezzük az értéket count++; /* növeljük a darabszámot } } fclose(f); return sum/count; /* visszaadjuk az átlagot }
*/ */ */ */ */ */ */ */ */
*/
Az eddig elkészült programrészletek működését ellenőrizhetjük, ha a felépített listáról és annak az idő figyelembe vétele utáni módosított változatáról is készítünk szöveges kimenetet.
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef
struct l { ... } list_element,*list_pointer;
list_pointer books=0; void read_txt(){ ... } double update_list(){ ... } void dump(){ ... } int main(){ read_txt(); dump(); printf("%8.3lf\n",update_list()); dump(); return 0; }
Mi kell még ahhoz, hogy válaszolni tudjunk a feladat kiírásában megfogalmazott kérdésre? Meg kell keresnünk az átlagostól legkevésbé eltérő oldalankénti átlagértékű könyvet, és kiírni a megjelenés évét. Ez egyszerű minimum keresési feladat, amit az elemi vektoralgoritmusok (programozási tételek) tárgyalásakor tanultunk. Az első listaelem lesz a kiindulási pontunk, végigjárjuk a listát, és, ha találunk jobb jelöltet, azt jegyezzük meg. Végül kiírjuk a megtalált listaelemhez tartozó évszámot. Az elem megjegyzéséhez egy mutatóra lesz szükségünk. Ha nem akarjuk minden öszehasonlítás előtt újra kiszámolni a megjegyzett elemhez tartozó értéket, célszerű egy segédváltozóba tölteni, és azzal hasonlítani. Hasonlóképpen, ha nem akarjuk a megjegyzendő értéket újra kiszámolni, miután kiderült, hogy kisebb az előzőnél, egy segédváltozóba kell töltenünk. A C nyelv sajátosságát kihasználva ezt megtehetjük az összehasonlítás kifejezésébe beágyazva, vagy külön utasításként is. Kicsit gyakorlottabb programozóként biztosan az előbbi megoldást választanánk, de a könnyebb áttekinthetőség érdekében – most még – inkább válasszuk szét a két lépést! Tervezzük meg az algoritmust! Válasz a kérdésre: Lista elejére állás Elem helyének megjegyzése Eltérés meghatározása Eltérés megjegyzése minimumként Van még következő elem Lépés a következő listaelemre Eltérés meghatározása NEM
Kisebb az eddigieknél
IGEN
Eltérés megjegyzése minimumként Elem helyének megjegyzése Megjegyzett elemhez tartozó évszám kiírása Kódoljuk az algoritmust függvény formájában!
void answer(double average){ /* a paraméter az átlagos oldalankénti érték list_pointer temp,min_diff; double diff,min; min_diff=temp=books;/*a lista elejére állunk,és megjegyezzük mint a legkisebb helyét diff=temp->value_per_page-average; /* kiszámítjuk az eltérés értékét if (diff<0)diff=-diff; /* meghatározzuk az abszolut értékét min=diff; /* megjegyezzük mint eddigi minimum while(temp->next){ /* amíg van következő elem a listában temp=temp->next; /* a következő listaelemre lépünk diff=temp->value_per_page-average; /* kiszámítjuk az eltérés értékét /* meghatározzuk az abszolút értékét if (diff<0)diff=-diff; if (diff<min){ /* ha kisebb az eddigi minimumnál min=diff; /* megjegyezzük mint eddigi minimum min_diff=temp; /* megjegyezzük az elem helyét } } printf("%4d\n",min_diff->year);/* kiírjuk a megjegyzett elemhez tartozó évszámot }
*/
*/ */ */ */ */ */ */ */ */ */ */
*/
Ezzel a program elkészült. Tervezzük meg, milyen adatokkal fogjuk ellenőrizni hibátlan működését! Az egyes függvényeket külön-külön már teszteltük, most olyan adatokat kell összeállítanunk, amivel az egész működést tudjuk követhetően ellenőrizni. Nem kell sok adat, de gondolnunk kell minden lehetséges esetre. Nem szükséges, hogy az adatok valódiak legyenek. Sokkal fontosabb, hogy egyszerűen követhető legyen a program működése. Legyen 6 könyvünk 3 kiadótól! Az egyiktől 1, a másiktól 2, a harmadiktól 3! A könyvek kora pedig legyen 0, 1, 2, 3, 4 és 5 év! A pillanatnyi oldalankénti átlagot állítsuk be 10 Ft ra, például a 8.4, 9.3, 9.6, 10.1, 10.9, 11.7 értékek segítségével! A programnak nyilván a 10.1 értéket kell megtalálnia. Az egyes kiadóknál az értéknövekedés legyen 10, 15 és 20%-os! A könyvek oldalszámát 250 és 400 között úgy válasszuk meg, hogy a vételár megválasztásával együtt minél jobban közelítsék a tervezett értékeket. Ez egy kis számolgatás útján könnyen teljesíthető. Készítsünk két adatsort! Ha mindkettőre helyes választ kapunk, kellő mélységben teszteltük a programot ahhoz, hogy ismeretlen adatok esetében is megbízhassunk benne. 1. eset KIADÓ ÁTLAG KOR
A 9.3 2
B 8.4 5
A 11.7 0
C 10.1 3
A 9.6 4
C 10.9 1
2. eset KIADÓ ÁTLAG KOR
C 9.3 0
A 8.4 2
C 11.7 5
A 10.1 1
B 9.6 3
A 10.9 4
1. eset KIADÓ ÁTLAG KOR ÁR OLDAL ÉV
A 9.3 2 2480 294 2010
B 8.4 5 2055 394 2007
A 11.7 0 3393 290 2012
C 10.1 3 1720 259 2009
A 9.6 4 2709 343 2008
C 10.9 1 2398 253 2011
2. eset KIADÓ ÁTLAG KOR ÁR OLDAL ÉV
C 9.3 0 2604 280 2012
A 8.4 2 2400 315 2010
C 11.7 5 2193 377 2007
A 10.1 1 3434 357 2011
B 9.6 3 2171 301 2009
A 10.9 4 3031 338 2008
Teszt állományaink tartalma ennek megfelelően a következő lesz: KIADO.TXT
Lapozgass sokat 1.05 Ezt olvasgasd szorgalmasan 1.1 Kiadjuk a kiadhatatlant 1.15
KONYV.TXT (ebből áll elő a KONYV.DAT) 1. eset
2. eset
Kacsa Ferenc Csontkezek erdeje Lapozgass sokat 2010 294 2480 Nagy Adalbert Meszet ettem Ezt olvasgasd szorgalmasan 2007 394 2055 Olajos Alajos Balzsamos esti hangulat Lapozgass sokat 2012 290 3393 Zab Karola Az arany szarvasagancs Kiadjuk a kiadhatatlant 2009 259 1720 Guzsalyos Ede Egy barnamedve kalandjai Lapozgass sokat 2008 343 2709 Szekeres Farkas Nem kapsz kekszet reggelire Kiadjuk a kiadhatatlant 2011 253 2398
Hajas Csongor Kopaszok hajnala Kiadjuk a kiadhatatlant 2012 280 2604 Tolvaj Ferenc Az elveszett bicikli Lapozgass sokat 2010 315 2400 Galagonya Andrea Barackfagylalt Kiadjuk a kiadhatatlant 2007 377 2193 Tavasz Arnold Gondolatok szalmakalpban Lapozgass sokat 2011 357 3434 Csalfa Vazul Pandabocs a vonaton Ezt olvasgasd szorgalmasan 2009 301 2171 Tulok Gergely Farsang a tengeren Lapozgass sokat 2008 338 3031
Az elvárt válasz:
2009
2011
2010
2010
Ha nem volna avulás:
A program elkészült. A program kódját még el kell látnunk néhány megjegyzéssel annak érdekében, hogy egy esetleges későbbi változtatáskor ne kelljen előről kezdeni a tervezést. /******************************************************************************** * Antik könyveim * * A programozás alapjai 1 (BMEVIHIA106) * * HÁZI FELADAT * * Készítette Vitéz András * * Utolsó módosítás: 2012. március 25. * ********************************************************************************/
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct l { struct l *next; char edition[40]; int year; double value_per_page; } list_element,*list_pointer;
/* /* /* /* /*
list_pointer books=0;
/* a könyvek listája
struktúra típus a könyvek listájához a következő bejegyzés mutatója a könyv kiadójának neve a kiadás éve a köny egy oldalának értéke
*/ */ */ */ */
*/
/******************************************************************************** * void read_txt() * * Beolvassa a KONYV.TXT állományt, és láncolt listába helyezi a könyveket. * * A szerző és a mű címe nem kerül tárolásra. * * Az ár és a terjedelem helyett csak az oldalankénti vételár kerül tárolásra. * * A függvényt a main() hívja. * ********************************************************************************/
void read_txt(){ list_pointer temp; FILE*f; char puff[80]; int a,b; f=fopen("KONYV.TXT","rt"); while(fgets(puff,78,f)){ /* amíg sikerül új sort beolvasni temp=calloc(1,sizeof(list_element)); /* lefoglaljuk az új elemet fgets(puff,78,f); /* beolvassuk a következő sort fgets(puff,78,f); /* beolvassuk a következő sort /* átmásoljuk a kiadó nevét strcpy(temp->edition,puff); temp->edition[strlen(puff)-1]='\0';/* a sorvég karaktert 0-ra cseréljük fgets(puff,78,f); /* beolvassuk a következő sort sscanf(puff,"%d",&(temp->year)); /* beolvassuk a kiadás évét fgets(puff,78,f); /* beolvassuk a következő sort sscanf(puff,"%d",&a); /* beolvassuk az oldalak számát fgets(puff,78,f); /* beolvassuk a következő sort sscanf(puff,"%d",&b); /* beolvassuk a vételárat temp->value_per_page=(double)b/a; /* kiszámítjuk a laponkénti vételárat temp->next=books; /* befűzzük az új elemet a listába books=temp; /* beállítjuk a lista új kezdőpontját } fclose(f); }
*/ */ */ */ */ */ */ */ */ */ */ */ */ */ */
/******************************************************************************** * double update_list() * * Beolvassa a KIADO.DAT állományt bejegyzéseit. * * Megkeresi a kiadóhoz köthető könyveket a könyvek kistájában. * * Az oldalankénti ár helyére a könyv korából számított aktuális értéket írja. * * Kiszámítja, és visszaadja az átlagos értékek átlagát. * * A függvényt a main() hívja az answer() aktuális paramétereként. * ********************************************************************************/
double update_list(){ list_pointer temp; /* mutató a lista bejárásához */ FILE*f; /* a feldogozandó állomány */ char edit[40]; /* a kiadó neve */ double a; /* az értéknövekedés aránya */ /* az értékek összege */ double sum; int count; /* a könyvek darabszáma */ int diff; /* a kiadás évének távolsága 2012-től */ /* nullázzuk az összeget és a darabszámot sum=count=0; f=fopen("KIADO.DAT","rb"); while(fread(edit,40,1,f)){ /* amíg sikerül új kiadót beolvasni /* beolvassuk a növekedés mértékét fread(&a,sizeof(double),1,f); for(temp=books;temp;temp=temp->next) /* végigmegyünk a listán if (!strcmp(temp->edition,edit)){ /* ha a kiadó egyezik for(diff=2012-temp->year;diff;diff--) /* a köny éveiszer temp->value_per_page*=a; /* növelgetjük az értéket sum+=temp->value_per_page; /* összegezzük az értéket /* növeljük a darabszámot count++; } } fclose(f); return sum/count; /* visszaadjuk az átlagot }
*/ */ */ */ */ */ */ */ */
*/
/******************************************************************************** * void answer(double average) average: az átlagos oldalankénti érték * * A könyvek listájában megkeresi az átlagostól való minimális eltérést. * * Kiíja a legkevésbé eltérő könyv kiadásának évét. * * Hívásakor paraméterként az update_list() visszatérési értékét kapja. * * A függvényt a main() hívja. * ********************************************************************************/
void answer(double average){ list_pointer temp,min_diff; double diff,min; min_diff=temp=books;/*a lista elejére állunk,és megjegyezzük mint a legkisebb helyét diff=temp->value_per_page-average; /* kiszámítjuk az eltérés értékét if (diff<0)diff=-diff; /* meghatározzuk az abszolut értékét min=diff; /* megjegyezzük mint eddigi minimum while(temp->next){ /* amíg van következő elem a listában temp=temp->next; /* a következő listaelemre lépünk diff=temp->value_per_page-average; /* kiszámítjuk az eltérés értékét /* meghatározzuk az abszolút értékét if (diff<0)diff=-diff; if (diff<min){ /* ha kisebb az eddigi minimumnál /* megjegyezzük mint eddigi minimum min=diff; min_diff=temp; /* megjegyezzük az elem helyét } } printf("%4d\n",min_diff->year);/* kiírjuk a megjegyzett elemhez tartozó évszámot }
*/ */ */ */ */ */ */ */ */ */ */
*/
/******************************************************************************** * int main() * * Nem használ parancssori argumentumokat. * * Közvetlenül hívja a read_txt és az answer() függvényeket. * * Az answer hívásakor paraméterként hívja az update_list() függvényt. * ********************************************************************************/
int main(){ read_txt(); /* answer(update_list());/* return 0; }
létrehozzuk a könyvek vásárláskori adatainak listáját */ az évek figyelembe vételével megválaszoljuk a kérdést */
Ezzel a program fejlesztését és dokumentálását is befejeztük. Érdemes megvizsgálni a továbbfejlesztés lehetőségeit. 1) A program jelenlegi formájában csak a 2012. évben alkalmas a kérdés megválaszolására. Ha azt akarjuk, hogy máskor is használhassuk, célszerű az évszámot makróként definiálni, és a programban csak hivatkozni rá.
#define EV 2012 illetve
for(diff=EV-temp->year;diff;diff--) 2) A feladat kiírásában az év és a feldolgozandó adatállományok is kötöttek voltak. Az imént látott makró használat szükségessé teszi a program újra fordítását minden év esetében. Parancssori argumentumok használatával programunkat rugalmasabbá tehetjük, és nem szükséges újra fordítani a paraméterek változása esetén. Például: hívása lehetne: a kód változása pedig: új globális változó: a függvényekben: read_txt(): illetve:
update_list(): illetve: és
main():
OldBooks 2012 KONYV.TXT KIADO.DAT int ev; read_txt(char*fn) f=fopen(fn,"rt"); update_list(char*fn) f=fopen(fn,"rb"); for(diff=ev-temp->year;diff;diff--) int main(int argc,char**argv){ sscanf(argv[1],"%d",&ev); read_txt(argv[2]); answer(update_list(argv[3])); return 0; }
3) Végezetül, általános esetben – ellentétben a házi feladat kiírásával – mindig gondoskodni kell az esetleges hibás adatok biztonságos kezeléséről.
Ez a dokumentum csak a feladat megoldásának gondolatmenetét hivatott szemléltetni. A beadandó dokumentáció ennek csak kis részét képezi. Reméljük, hogy sikerült megkönnyíteni egyéni munkáját. A tárgy oktatói minden házi feladattal kapcsolatos kérdésben készek a konzultációra. 2012. március Vitéz András