22.01.2013 Views

TT algoritmusok szoveg v014.pdf

TT algoritmusok szoveg v014.pdf

TT algoritmusok szoveg v014.pdf

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

A L G O R I T M U S O K<br />

B M F K V K M A I<br />

INFORMATIKA 1. Laborgyakorlat tananyag<br />

Összeállította: Dr Tuzson Tibor docens<br />

tuzson.tibor@kvk.bmf.hu; tuzsont@hdsnet.hu<br />

2009. tavaszi félév<br />

Tartalom jegyzék:<br />

1. Bevezetı<br />

1.1. Algoritmus fogalma<br />

1.2. Algoritmus története<br />

1.3. Komplexitás elmélet<br />

2. Algoritmus C programok építı elemei, alap függvények<br />

2.1. Két elem egyszerő cseréje.<br />

2.2. Két elem cseréje: animáció késleltetı függvénnyel<br />

3. Rendezı <strong>algoritmusok</strong><br />

3.1. Közvetlen beszúrás rendezés<br />

3.2. Csere rendezés<br />

3.3. Buborék rendezés<br />

3.3.1. Buborék rendezés animálva<br />

3.4. Shell rendezés<br />

3.5. Rendezések: Összefoglalva menü rendszerbe<br />

4. Keresı <strong>algoritmusok</strong>:<br />

4.1. Szekvenciális keresés<br />

4.1.1. Szekvenciális keresés egy tömbben az elsı egyezésig<br />

4.1.2. Az összes elıfordulás szekvenciális keresése.<br />

4.2. Szekvenciális és bináris ismétlıdı keresés függvények segítségével, de csak az elsı<br />

egyezésig.<br />

4.3. Legnagyobb és legkisebb egész keresése tömbben.<br />

5. Oszthatósággal kapcsolatos <strong>algoritmusok</strong>:<br />

5.1. Egy szám osztói.<br />

5.1.1. Egy szám osztóinak kiszámítása for ciklussal<br />

5.1.2. Egy szám osztóinak kiszámítása while ciklussal<br />

5.1.3. Egy szám osztóinak kiszámítása do-while ciklussal<br />

5.1.4. Egy szám osztóinak kiszámítása mindhárom elızı módszerre<br />

5.2. Egy szám prímtényezıs felbontása szorzat és hatványkitevıs formátumban.<br />

5.3. Legnagyobb közös osztó és legkisebb közös többszörös kiszámítása<br />

5.3.1. LKO és LKT próbálkozásos módszerrel.<br />

5.3.2. LKO és LKT törzszényezıs felbontással.<br />

5.3.3. LKO és LKT Euklideszi algoritmussal.<br />

6. Következtetések<br />

7. Irodalomjegyzék<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

1/38


1. Bevezetı<br />

Ez a rövid oktatási segédlet labor gyakorlatokat, mintaprogramokat tartalmaz a C programozást<br />

tanuló hallgatók számára, minimális elméleti kiegészítésekkel. Nem helyettesíti az elıadások<br />

anyagát!<br />

Kizárólag az „<strong>algoritmusok</strong>kal foglalkozó” labor feladatokat tekinti át, a teljesség igénye nélkül. A<br />

komplexebb programokat kis lépésekben építjük fel, így egyes elemek (pl. függvények)<br />

ismétlıdnek. A tananyaghoz tartozó alapelemeket is változatosan igyekszik használni, ilyenek<br />

például a ciklusok, feltételes utasítások, tömbkezelés, kiírás–beolvasás, függvények érték és<br />

címszerinti átadással, stb.<br />

A C programok egyszerőn másolva, CTR C / CTR V áthelyezhetıek a DEVC++ fejlesztı<br />

programba. A mellékelt exe file-okkal meg leellenırizhetı, hogy mit is kell a programnak<br />

végrehajtani. Ha valami hiba történ, ez segítséget nyújthat.<br />

Az elméleti részt az elıadások és az irodalomjegyzékben szereplı bármelyik forrás szolgáltatja,<br />

kiemelten az elıadások jegyzetei [1.], [2.], [3.], továbbá [4.], [5.], [6.], [7.], [8.].<br />

Külön melléklet tartalmazza az összes önálló C forrás kódját és az exe futtatható file-ket is.<br />

1.1. Algoritmus fogalma<br />

Algoritmuson, vagy inkább eljáráson olyan módszert, utasítás(sorozato)t, részletes útmutatást,<br />

receptet értünk, amely valamely felmerült probléma megoldására alkalmas [13], [14].<br />

1.2. Algoritmus története<br />

Az „algoritmus” kifejezés a perzsa tudós, al-Hvárizmí (Abú Dzsafar Muhammad bin Múszá al-<br />

Hvárizmí) munkásságához kapcsolódik. Neve más írásmódban Muhammad ibn Musa Khwarizmi,<br />

vagy Al-Khvorizmi, Al-Khorizmi, eredetiben:<br />

Élt kb. 780-tól kb. 845-ig, szülıvárosa a perzsa Khwārizm, a mai Uzbekistanban van. Az algoritmus<br />

szó szülıvárosából sdodó nevének eltorzított, rosszul latinra fordított változatából ered.[15]<br />

1.3. Komplexitás elmélet<br />

A Komplexitás elmélet a problémák (<strong>algoritmusok</strong>) megoldásának nehézségi fokával foglalkozik. A<br />

komplexitással az algoritmust jellemezzük, ezért technológia független kell legyen. Tehát egy<br />

algoritmus esetében mindegy, hogy még csöves számítógéppel, vagy már szubmikronos CMOS<br />

eszközökkel implementáljuk. Ebben a fejezetben a témakör erısen leegyszerősítve kerül<br />

bemutatásra. [17.], [18.], [19.], [20.].<br />

Kétféle komplexitást defineálhatunk.<br />

• A „térbeli” komplexitás: általában a feladat megoldásához szükséges tároló elemek, vagy<br />

kapcsoló elemek (tranzisztorok, csövek) számával jellemezhetjük.<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

,<br />

2/38


• Az „idıbeni” komplexitást nem a szükséges futási fizikai idıvel jellemzünk, ami<br />

technológiafüggı paraméter, hanem a megoldáshoz szükséges kapcsolások, mőveletek vagy<br />

utasítások számával.<br />

Az egyik legfontosabb kérdés, hogy a bemenet növekedésével hogyan változik a komplexitás. De<br />

mit is jelent a „bemenet”? Ha a bemenet számszerő, akkor figyelembe vehetjük a számok értékét.<br />

Praktikusabb és elterjedtebb, amikor a bemenet nagyságán a bináris reprezentáció bitszámát értjük.<br />

Gyakori az olyan helyzet, amikor nem tudjuk pontosan megbecsülni az algoritmus komplexitását,<br />

de bizonyítani tudjuk, hogy biztosan nem komplexebb, mint egy ismert feladat.<br />

f(n) =O(g(n))<br />

n0<br />

c.g(n)<br />

f(n)<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

n<br />

1. ábra: Nagy O jelölés [17.], [18.]<br />

A „Nagy O” jelölés:<br />

Az 1. ábra jelölései:<br />

• n: a bejövı adatok mérete, általában bitekben.<br />

• Függıleges tengely: Idı vagy térbeli<br />

komplexitás.<br />

• f(n): a vizsgált algoritmusunk komplexitása<br />

• g(n): egy ismert algoritmus komplexitása<br />

• Akkor mondjuk, hogy f(n) algoritmus<br />

komplexitása O(g(n)), ha létezik egy n0 érték,<br />

amitıl felfele, pontosabban, ha n>n0, c.g(n)<br />

biztososan komplexebb mint f(n).<br />

• c: egy konstans szám.<br />

Ezzel egy felsı komplexitási határt határozunk meg<br />

a vizsgált algoritmusunkra nézve.<br />

A g(n) szokásos értékei: n; n 2 ; log n. Amennyiben a növekedést egy n változójú polinommal ki<br />

lehet fejezni akkor polinomiális komplexitású <strong>algoritmusok</strong>ról beszélünk. Ennek két osztályát<br />

különböztetjük meg:<br />

• P komplexitási osztály: amelyik determinisztikus <strong>algoritmusok</strong>kal polinomiális idıben fut.<br />

Ebbe tartoznak, például a rejtjelezı <strong>algoritmusok</strong>.<br />

• NP komplexitási osztály: amelyik nem determinisztikus <strong>algoritmusok</strong>kal polinomiális idıben<br />

fut. Remélik, hogy ebbe tartoznak a rejtjelezést feltörı <strong>algoritmusok</strong>.<br />

Az eddig körülírtak matematikai háttere jól kidolgozott. A kriptográfiában a kérdés éppen fordított.<br />

A támadó <strong>algoritmusok</strong>nál, nem az a kérdés, hogy egy ismert algoritmus komplexitásánál biztosan<br />

nem nehezebb a feladat, hanem fordítva, az a kérdés, hogy bizonyíthatóan minél nem könnyebb a<br />

támadás. Ez a kérdés viszont új és a matematikai tudományok eddig nem adtak kellı megoldásokat<br />

erre. Legalábbis a civil világban.<br />

Érdemes megemlíteni, hogy a nagy O jelölésen kívül léteznek még: kis o, nagy Θ, nagy Ω, kis ω<br />

komplexitási jelölések.<br />

A 2. ábrán [17.], [18.], [19.] több komplexitási szint látható, de az említetteken kívül a többiek ma<br />

nem játszanak szerepet a gyakorlati tudományokban.<br />

3/38


2. ábra: Komplexitás osztályok [17.], [18.], [19.]<br />

2. Algoritmus C programok építı elemei,<br />

alap függvények<br />

2.1. Menü szerkezet:<br />

A késıbbi gyakorlatok egy része menü szerkezetbe lesz szervezve, ezért itt egy egyszerő<br />

bevezetı példa függvény hívással:<br />

/*MENUKEZELES EGYSZERU PELDA*/<br />

#include <br />

#include <br />

void menu(int *sorszam);<br />

EXPTIME - Complete<br />

EXPTIME<br />

PSPACE - Complete<br />

PSPACE<br />

NP-Complete<br />

NP<br />

P<br />

int main()<br />

{<br />

int a=111 ,b=5,c, sor;<br />

do<br />

{<br />

menu(&sor); /* cim szerinti parameter atadas*/<br />

switch (sor)<br />

{<br />

case 1: c=a+b;<br />

printf("\n Egesz osszeadas:\t%i=%i+%i\n",c,a,b);<br />

break;<br />

case 2: c=a-b;<br />

printf("\n Egesz kivonas:\t\t%i=%i-%i\n",c,a,b);<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

4/38


eak;<br />

case 3: c=a*b;<br />

printf("\n Egesz szorzas:\t\t%i=%i*%i\n",c,a,b);<br />

break;<br />

case 4: c=a/b;<br />

printf("\n Maradekos osztasn:\t%i=%i/%i\n",c,a,b);<br />

break;<br />

case 5: c=a%b;<br />

printf("\n Maradekos osztas maradeka:\t%i=%i %%<br />

%i\n",c,a,b);<br />

break;;<br />

}<br />

fflush(stdin);<br />

printf("\nESC: kilepes.\t\tENTER: Folytatas.\n");<br />

}<br />

while(getch()!=27);<br />

return 0;<br />

}<br />

void menu(int *sorszam)<br />

{<br />

int kod;<br />

do<br />

{<br />

printf("\n Valasszon aritmetikai muveletet: \n");<br />

printf(" 1. Szamolja ki a+b\n");<br />

printf(" 2. Szamolja ki a-b\n");<br />

printf(" 3. Szamolja ki a*b\n");<br />

printf(" 4. Szamolja ki a/b\n");<br />

printf(" 5. Szamolja ki a %% b\n");<br />

printf("\nA feladat sorszama: ");<br />

scanf("%d",&kod);<br />

}<br />

while (kod 5);<br />

*sorszam = kod; /* cim szerinti parameter atadas,<br />

tehat nem return-nel*/<br />

printf("\n");<br />

}<br />

/*Keszitette: Dr Tuzson Tibor*/<br />

2.2. Két elem egyszerő cseréje.<br />

A rendezı <strong>algoritmusok</strong> alap építıeleme két elem cseréje [7.]. Erre látunk itt egy egyszerő példát:<br />

/*ALGORIMUSOK - RENDEZES - KET EGESZ CSEREJA KEPERNYO KIJELZESSEL<br />

A program celja ket egesz felcserelese, ami<br />

a rendezo <strong>algoritmusok</strong> alapja.*/<br />

#include <br />

#include <br />

typedef int tomb[2]; // Tipusdefinicio<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

5/38


int main()<br />

{<br />

tomb a; /*legfeljebb 2 elemes tomb, lasd typedef*/<br />

int i,s=0;<br />

/* Beolvasas*/<br />

printf("Ket elem csereje.\n Irjon be ket egesz szamot\n\n");<br />

for (i = 0; i


int main()<br />

{<br />

tomb a; /*legfeljebb 2 elemes tomb, lasd typedef*/<br />

int i,s=0,db=2;<br />

/* Beolvasas*/<br />

printf("Ket elem csereje.\n Irjon be ket egesz szamot\n\n");<br />

for (i = 0; i


{<br />

}<br />

int i;<br />

for (i = 0; i


}<br />

system("PAUSE");<br />

fflush(stdin);<br />

return 0;<br />

void olvas(tomb a, int *n) /* beolvaso függvény*/<br />

{<br />

int i, db;<br />

do<br />

{<br />

printf("Elemek szama (max. 30): ");<br />

scanf("%d",n);<br />

}<br />

while (*n < 2 || *n >20);<br />

for (i = 0; i


}<br />

/*Kiinduló forras: Computerbooks Benko Tiborne - Dr. Poppe Andras<br />

Egyutt Konnyebb A Programozos - C Programozas<br />

Programot módosította Dr Tuzson Tibor 2009*/<br />

3.2. Csere rendezés<br />

Az algoritmus elmélete részletesen megtalálható a [3.]-ban. A szoftver a [7.]-ben található<br />

módosított változata.<br />

/*ALGORIMUSOK - RENDEZES – CSERE max 30 elemes tombon<br />

KEPERNYO KIJELZESSEL, FUGGVENYEKKEL ÉS ANIMACIO NELKUL*/<br />

#include <br />

#include <br />

typedef int tomb[30]; /* Tipusdefinicio */<br />

/*Függvenyek deklaracioi:*/<br />

void olvas(tomb a, int *n); /*Tonbmeret es adatok beolvasasa, max<br />

30 elem*/<br />

void kiir(tomb a, int n); /* Tömb kiirás a képernyre*/<br />

void csere(tomb a, int n); /* buborek rendezes*/<br />

int main(void)<br />

{<br />

tomb x; /*legfeljebb 30 elemes tomb, lasd typedef*/<br />

int i,s=0,db ,sor;<br />

olvas(x,&db);<br />

printf("\nCSERE rendezesi modszer novekvo<br />

sorrendben\nKiindilasi tomb:\n\n\t\t");<br />

kiir(x,db);<br />

csere(x,db);<br />

kiir(x,db);<br />

system("PAUSE");<br />

fflush(stdin);<br />

return 0;<br />

}<br />

void olvas(tomb a, int *n) /* beolvaso függvény*/<br />

{<br />

int i, db;<br />

do<br />

{<br />

printf("Elemek szama (max. 30): ");<br />

scanf("%d",n);<br />

}<br />

while (*n < 2 || *n >20);<br />

for (i = 0; i


}<br />

}<br />

void kiir(tomb a, int n) /* kiiro függvény*/<br />

{<br />

int i;<br />

printf("Aktualis tomb =");<br />

for (i = 0; i


*Függvenyek deklaracioi:*/<br />

void olvas(tomb a, int *n); /* Tonbmeret es adatok beolvasasa,<br />

max 30 elem */<br />

void kiir(tomb a, int n); /* Tömb kiirás a képernyre*/<br />

void buborek(tomb a, int n); /* buborek rendezes*/<br />

int main()<br />

{<br />

tomb x; /*legfeljebb 30 elemes tomb, lasd typedef*/<br />

int i,s=0,db ,sor;<br />

olvas(x,&db);<br />

printf("\nBuborek rendezesi modszer novekvo<br />

sorrendben\nKiindilasi tomb:\n\n\t\t");<br />

kiir(x,db);<br />

buborek(x,db);<br />

kiir(x,db);<br />

system("PAUSE");<br />

fflush(stdin);<br />

return 0;<br />

}<br />

void olvas(tomb a, int *n) /* beolvaso függvény*/<br />

{<br />

int i, db;<br />

do<br />

{<br />

printf("Elemek szama (max. 30): ");<br />

scanf("%d",n);<br />

}<br />

while (*n < 2 || *n >20);<br />

for (i = 0; i


void buborek(tomb a, int n)<br />

{<br />

int i,j, t;<br />

for (i = 1; i=0 && a[j]>a[j+1]; j--) /* Ez a felteteles<br />

csere*/<br />

{<br />

t = a[j];<br />

a[j] = a[j+1];<br />

a[j+1] = t;<br />

printf(" %i Lepes: ",i-j);<br />

kiir(a,n);<br />

}<br />

printf("\n%i Fordulo: ",i);<br />

kiir(a,n);<br />

}<br />

}<br />

/*Kiinduló forras: Computerbooks Benko Tiborne - Dr. Poppe Andras<br />

Egyutt Konnyebb A Programozos - C Programozas<br />

Programot módosította Dr Tuzson Tibor 2009*/<br />

3.3.1. Buborék rendezés animálva<br />

A következıben a buborékrendezést kiegészítettük egy késleltetı függvénnyel és animációval.<br />

Remélhetıleg így izgalmasabban követhetıek a program lépései. A „delay” saját függvény név nem<br />

túl szerencsés, mert az egy C függvényt is jelöl. Javasoljuk átírni „dly”-ra.<br />

/*ALGORIMUSOK - RENDEZES - BUBOREK max 30 elemes tombon<br />

KEPERNYO KIJELZESSEL, FUGGVENYEKKEL ÉS ANIMACIOVAL de meg hibas<br />

nem megyy a delay */<br />

#include <br />

#include <br />

typedef int tomb[30]; /* Tipusdefinicio */<br />

/*Függvenyek deklaracioi:*/<br />

void delay(int k); /* Kesleltetes, hogy animalni<br />

lehessen a kepernyot*/<br />

void olvas(tomb a, int *n); /* Tonbmeret es adatok beolvasasa,<br />

max 30 elem */<br />

void kiir(tomb a, int n); /* Tömb kiirás a képernyre*/<br />

void buborek(tomb a, int n); /* buborek rendezes*/<br />

int main()<br />

{<br />

tomb x; /*legfeljebb 30 elemes tomb, lasd typedef*/<br />

int i,s=0,db ,sor,d=50000;<br />

olvas(x,&db);<br />

printf("\nBuborek rendezesi modszer novekvo<br />

sorrendben\nKiindilasi tomb:\n\n\t\t");<br />

kiir(x,db);<br />

buborek(x,db);<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

13/38


}<br />

kiir(x,db);<br />

system("PAUSE");<br />

fflush(stdin);<br />

return 0;<br />

void delay(int k) /* késleltetı föggvény*/<br />

{<br />

int m,n,l;<br />

for(m=0;m


delay(1000);<br />

for (j = i-1; j>=0 && a[j]>a[j+1]; j--) /* Ez a felteteles<br />

csere*/<br />

{<br />

delay(1000);<br />

t = a[j];<br />

a[j] = a[j+1];<br />

a[j+1] = t;<br />

printf(" %i Lepes: ",i-j);<br />

kiir(a,n);<br />

}<br />

printf("\n%i Fordulo: ",i);<br />

kiir(a,n);<br />

}<br />

}<br />

/*Kiinduló forras: Computerbooks Benko Tiborne - Dr. Poppe Andras<br />

Egyutt Konnyebb A Programozos - C Programozas<br />

Programot módosította Dr Tuzson Tibor 2009*/<br />

3.4. Shell rendezés<br />

Az algoritmus elmélete részletesen megtalálható a [3.]-ban. A szoftver a [7.]-ben található adaptált<br />

változata.<br />

/*ALGORIMUSOK - RENDEZES - SHELL max 30 elemes tombon<br />

KEPERNYO KIJELZESSEL, FUGGVENYEKKEL ÉS ANIMACIO NELKUL*/<br />

#include <br />

#include <br />

typedef int tomb[30]; /* Tipusdefinicio */<br />

/*Függvenyek deklaracioi:*/<br />

void olvas(tomb a, int *n); /* Tonbmeret es adatok beolvasasa,<br />

max 30 elem */<br />

void kiir(tomb a, int n); /* Tömb kiirás a képernyre*/<br />

void shell(tomb a, int n); /* kozvetlen beszúrásos rendezes*/<br />

int main()<br />

{<br />

tomb x; /*legfeljebb 30 elemes tomb, lasd typedef*/<br />

int i,s=0,db ,sor;<br />

olvas(x,&db);<br />

printf("\n Shell rendezesi modszer novekvo<br />

sorrendben\nKiindilasi tomb:\n\n\t");<br />

kiir(x,db);<br />

shell(x,db);<br />

printf("\t");<br />

kiir(x,db);<br />

system("PAUSE");<br />

fflush(stdin);<br />

return 0;<br />

}<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

15/38


void olvas(tomb a, int *n) /* beolvaso függvény*/<br />

{<br />

int i, db;<br />

do<br />

{<br />

printf("Elemek szama (max. 30): ");<br />

scanf("%d",n);<br />

}<br />

while (*n < 2 || *n >20);<br />

for (i = 0; ia[j+k]; j -= k)<br />

{<br />

t = a[j];<br />

a[j] = a[j+k];<br />

a[j+k] = t;<br />

printf("Lepes: ");<br />

kiir(a,n);<br />

}<br />

printf("\nFordulo:");<br />

kiir(a,n);<br />

}<br />

}<br />

}<br />

/*Kiinduló forras: Computerbooks Benko Tiborne - Dr. Poppe Andras<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

16/38


Egyutt Konnyebb A Programozos - C Programozas<br />

Programot módosította Dr Tuzson Tibor 2009*/<br />

3.5. Rendezések: Összefoglalva menü rendszerbe<br />

Az algoritmus elmélete részletesen megtalálható a [3.]-ban. A szoftver a [7.]-ben található adaptált<br />

változata. Az eddigi rendezú <strong>algoritmusok</strong> összefoglalálsa menüvel ellátott egy mintaprogramban,.<br />

/*RENDEZESEK*/<br />

#include <br />

#include <br />

typedef int tomb[30];<br />

void menu(int *sorszam);<br />

void olvas(tomb a, int *n);<br />

void kiir(tomb a, int n);<br />

void buborek(tomb a, int n);<br />

void csere(tomb a, int n);<br />

void kozvetlen(tomb a, int n);<br />

void shell(tomb a, int n);<br />

int main()<br />

{<br />

tomb x;<br />

int db ,sor;<br />

menu(&sor);<br />

switch (sor)<br />

{<br />

case 1: olvas(x,&db); csere(x,db);<br />

printf("\nCsere modszer\n"); kiir(x,db);<br />

break;<br />

case 2: olvas(x,&db); kozvetlen(x,db);<br />

printf("\nKozvetlen beszuras\n"); kiir(x,db);<br />

break;<br />

case 3: olvas(x,&db); buborek(x,db);<br />

printf("\nBuborek modszer\n"); kiir(x,db);<br />

break;<br />

case 4: olvas(x,&db); shell(x,db);<br />

printf("\nShell modszer\n"); kiir(x,db);<br />

break;<br />

case 5: ;<br />

}<br />

fflush(stdin);<br />

system("PAUSE");<br />

return 0;<br />

}<br />

void olvas(tomb a, int *n)<br />

{<br />

int i, db;<br />

do<br />

{<br />

printf("Elemek szama (max. 20): "); scanf("%d",n);<br />

}<br />

while (*n < 2 || *n >20);<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

17/38


for (i = 0; i


}<br />

a[j] = a[j+1];<br />

a[j+1] = t;<br />

}<br />

void shell(tomb a, int n)<br />

{<br />

int i,j, t, k;<br />

for (k = n/2; k>0; k = k/2)<br />

{<br />

for (i = k; i=0 && a[j]>a[j+k]; j -= k)<br />

{<br />

t = a[j];<br />

a[j] = a[j+k];<br />

a[j+k] = t;<br />

}<br />

}<br />

}<br />

}<br />

void menu(int *sorszam)<br />

{<br />

int kod;<br />

do {<br />

printf(" Rendezes modszerei \n");<br />

printf(" 1. Csere\n");<br />

printf(" 2. Kozvetlen beszuras\n");<br />

printf(" 3. Buborek\n");<br />

printf(" 4. Shell\n");<br />

printf(" 5. Kilepes\n");<br />

printf("\nA modszer sorszama: ");<br />

scanf("%d",&kod);<br />

}while (kod 5);<br />

*sorszam = kod;<br />

printf("\n");<br />

}<br />

4. Keresı <strong>algoritmusok</strong>:<br />

Az algoritmus elmélete részletesen megtalálható a [3.]-ban. A szoftverek a [7.]-ben találhatóak<br />

módosított változatai. Szekvenciális és bináris keresésre készült gyakorló program.<br />

4.1. Szekvenciális keresés<br />

Gyakorlási céllal kétféle szekvenciális keresı mintaprogram kerül bemutatásra.<br />

4.1.1. Szekvenciális keresés egy tömbben az elsı egyezésig<br />

Ez a mintaprogram egy meghatározott hosszúságú egész tömbben megkeresi a megadott érték elsı<br />

elıfordulását. Az egész tömböt egy megadott hosszig egy saját függvénnyel billentyőzetrıl töltjük<br />

fel.<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

19/38


*KERESES 1x1*/<br />

/* Csak szekvenciális keresés: egyszer keresi az elsı egyezést.<br />

Helyes kérdés: Van-e vagy sincs legalább egy megfelelı érték a<br />

tönbben? */<br />

#include <br />

#define DB 50 /*Maximlis tombméret amiben keresünk*/<br />

typedef int itomb[DB+1];<br />

typedef int ibuff;<br />

void olvas_int(itomb x, int *m);<br />

int seq_keres(itomb, int, ibuff);<br />

int bin_keres(itomb, int, ibuff );<br />

int main()<br />

{<br />

itomb y;<br />

int n, j, k, t;<br />

ibuff adat;<br />

olvas_int(y,&n);<br />

printf("\nSzekvencialis kereses\n");<br />

printf("adat : "); scanf("%d",&adat);<br />

t = seq_keres(y,n,adat);<br />

if(t >= 0)<br />

printf("%d helye %d\n",adat,t);<br />

else printf("%d hibas adat!\n",adat);<br />

}<br />

fflush(stdin);getchar();<br />

return 0;<br />

void olvas_int(itomb x, int *m)<br />

{<br />

int i;<br />

printf("Egesz tipusu adatok beolvasasa\n");<br />

do<br />

{<br />

printf("Az adatok szama, max=%i : ",DB); scanf("%d",m);<br />

if (*m > DB) printf("Az adatok max. szama : %d ",DB);<br />

}<br />

while (*m < 2 || *m > DB);<br />

}<br />

for ( i = 0; i < *m; i++)<br />

{<br />

printf(" [%2d] = ",i); scanf("%d",&x[i]);<br />

}<br />

int seq_keres(itomb x, int m, ibuff adat)<br />

{<br />

int i = 0;<br />

while ( adat != x[i] && i < m ) { i = i+1; }<br />

if (i >= m) return -1;<br />

else return i;<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

20/38


}<br />

/*Kiinduló forras: Computerbooks Benko Tiborne - Dr. Poppe Andras<br />

Egyutt Konnyebb A Programozos - C Programozas<br />

Programot módosította Dr Tuzson Tibor 2009*/<br />

4.1.2. Az összes elıfordulás szekvenciális keresése.<br />

Ez a mintaprogram abban tér el az elızıtıl, hogy a keresett érték összes elıfordulását kilistázza a<br />

képernyıre, de csak egyszer keres. A [7.] alapján adaptálva.<br />

/*KERESES 1x1*/<br />

/* Csak szekvenciális keresés: egyszer keresi az összes egyezést.<br />

Helyes kérdés: Van-e vagy sincs legalább egy megfelelı érték a<br />

tömbben? */<br />

#include <br />

#define DB 50 /*Maximlis tombméret amiben keresunk*/<br />

typedef int itomb[DB+1];<br />

typedef int ibuff;<br />

void olvas_int(itomb x, int *m);<br />

int seq_keres(itomb, int, ibuff);<br />

int main()<br />

{<br />

itomb y;<br />

int n, j, k, t;<br />

ibuff adat;<br />

char c;<br />

olvas_int(y,&n);<br />

printf("\nAy osszes egyezes szekvencialis keresese\n");<br />

while (1)<br />

{<br />

printf("\nadat : ");<br />

scanf("%d",&adat);<br />

t = seq_keres(y,n,adat);<br />

printf ("\nKivanja folytatni? \n n = NEM\n barmi mas =<br />

folytatas\n");<br />

}<br />

if(getch()=='n') break;<br />

}<br />

fflush(stdin);;<br />

return 0;<br />

void olvas_int(itomb x, int *m)<br />

{<br />

int i;<br />

printf("Egesz tipusu adatok beolvasasa\n");<br />

do<br />

{<br />

printf("Az adatok szama, max=%i : \t",DB); scanf("%d",m);<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

21/38


}<br />

if (*m > DB) printf("Az adatok max. szama : %d \n",DB);<br />

}<br />

while (*m < 2 || *m > DB);<br />

for ( i = 0; i < *m; i++)<br />

{<br />

printf(" [%2d] = ",i); scanf("%d",&x[i]);<br />

}<br />

int seq_keres(itomb x, int m, ibuff adat)<br />

{<br />

int i=0;<br />

printf("\n");<br />

for ( i = 0; i < m; i++)<br />

{<br />

if(adat==x[i])<br />

printf("%d helye %d\n",adat,i);<br />

}<br />

}<br />

/*Kiinduló forras: Computerbooks Benko Tiborne - Dr. Poppe Andras<br />

Egyutt Konnyebb A Programozos - C Programozas<br />

Programot módosította Dr Tuzson Tibor 2009*/<br />

4.2. Szekvenciális és bináris ismétlıdı keresés függvények segítségével, de csak az elsı<br />

egyezésig.<br />

/*KERESES*/<br />

/* szekvenciális és bináris keresés */<br />

#include <br />

#define DB 50 /*Maximlis tombméret amiben keresünk*/<br />

typedef int itomb[DB+1];<br />

typedef int ibuff;<br />

void olvas_int(itomb x, int *m);<br />

int seq_keres(itomb, int, ibuff);<br />

int bin_keres(itomb, int, ibuff );<br />

int main()<br />

{<br />

itomb y;<br />

int n, j, k, t;<br />

ibuff adat;<br />

olvas_int(y,&n);<br />

printf("\nSzekvencialis kereses\n");<br />

printf("Keresesek szama: "); scanf("%d",&k);<br />

for (j = 1; j= 0)<br />

printf("%d helye %d\n",adat,t);<br />

else printf("%d hibas adat!\n",adat);<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

22/38


}<br />

}<br />

printf("\nBinaris kereses\n");<br />

printf("Keresesek szama: "); scanf("%d",&k);<br />

for (j = 1; j = 0)<br />

printf("%d helye %d\n",adat,t);<br />

else printf("%d hibas adat!\n",adat);<br />

}<br />

fflush(stdin);getchar();<br />

return 0;<br />

void olvas_int(itomb x, int *m)<br />

{<br />

int i;<br />

printf("Egesz tipusu adatok beolvasasa\n");<br />

do<br />

{<br />

printf("Az adatok szama, max=%i : ",DB); scanf("%d",m);<br />

if (*m > DB) printf("Az adatok max. szama : %d ",DB);<br />

}<br />

while (*m < 2 || *m > DB);<br />

}<br />

for ( i = 0; i < *m; i++)<br />

{<br />

printf(" [%2d] = ",i); scanf("%d",&x[i]);<br />

}<br />

int seq_keres(itomb x, int m, ibuff adat)<br />

{<br />

int i = 0;<br />

while ( adat != x[i] && i < m ) { i = i+1; }<br />

if (i >= m) return -1;<br />

else return i;<br />

}<br />

int bin_keres(itomb x, int m, ibuff adat)<br />

{ int a,f,k, talal;<br />

a = 0; f = m;<br />

talal = 0;<br />

while ( a < f && ! talal)<br />

{<br />

k = (a+f) / 2;<br />

if (adat < x[k]) f = k-1;<br />

else<br />

if (adat > x[k]) a = k+1;<br />

else talal = 1; /* megtalálta */<br />

}<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

23/38


if( talal) return k;<br />

else return -1; /* nem talált */<br />

} /* bin_keres */<br />

/*Kiinduló forras: Computerbooks Benko Tiborne - Dr. Poppe Andras<br />

Egyutt Konnyebb A Programozos - C Programozas<br />

Programot módosította Dr Tuzson Tibor 2009*/<br />

4.3. Legnagyobb és legkisebb egész keresése tömbben.<br />

A billentyőzetrıl feltöltött egész tömbben keresi a maximum és a minimum értékeket. A program,<br />

egy késleltetı függvény segítségével animáltan írja ki a részeredményeket is<br />

/*ALGORIMUSOK - Minimum - maximum kereses egy 30 elemes tombon,<br />

KEPERNYO KIJELZESSEL, FUGGVENYEKKEL ÉS ANIMACIOVAL */<br />

#include <br />

#include <br />

typedef int tomb[30]; /* Tipusdefinicio */<br />

/*Függvenyek deklaracioi:*/<br />

void olvas(tomb a, int *n); /* Tonbmeret es adatok beolvasasa,<br />

max 30 elem */<br />

int max(tomb a, int n);<br />

int min(tomb a, int n);<br />

void dly(int k);<br />

int main()<br />

{<br />

tomb x; /*legfeljebb 30 elemes tomb, lasd typedef*/<br />

int i,s=0,db ,maximum, minimum;<br />

olvas(x,&db);<br />

printf("\nMaximum kereses:\n\n");<br />

maximum=max(x,db);<br />

printf("\nMinimum kereses\n\n");<br />

minimum=min(x,db);<br />

}<br />

system("PAUSE");<br />

fflush(stdin);<br />

return 0;<br />

void olvas(tomb a, int *n) /* beolvaso függvény*/<br />

{<br />

int i, db;<br />

do<br />

{<br />

printf("Elemek szama (max. 30): ");<br />

scanf("%d",n);<br />

}<br />

while (*n < 2 || *n >30);<br />

for (i = 0; i


}<br />

}<br />

scanf("%d",&a[i]);<br />

int max(tomb a, int n)<br />

{<br />

int i=0,j=0,mx;<br />

mx=a[0];<br />

for (i = 1; i mx)<br />

{<br />

printf("\nAz eddig megtalalt maximum= %i, ami az \t%i-dik<br />

elem a tombben.\n",mx,j);<br />

dly(800);<br />

mx=a[i];<br />

j=i;<br />

}<br />

}<br />

printf("\n A tomb maximuma= %i, az \t%i-dik elem a<br />

tombben.\n\n",mx,j);<br />

return mx;<br />

}<br />

int min(tomb a, int n)<br />

{<br />

int i=0,j=0,mn;<br />

mn=a[0];<br />

for (i = 1; i


{<br />

for(l=0;l


{<br />

if (szam % oszto == 0)<br />

{ printf("%8d",oszto); van++; }<br />

}<br />

if (!van) printf(" Primszam!\n");<br />

}<br />

/*Kiinduló forras: Computerbooks Benko Tiborne - Dr. Poppe Andras<br />

Egyutt Konnyebb A Programozos - C Programozas<br />

Programot módosította Dr Tuzson Tibor 2009*/<br />

5.1.2. Egy szám osztóinak kiszámítása while ciklussal<br />

/*Egy szam osztoit irja ki a kepernyore.<br />

Nem csak a primtenyezoket adja vissza.<br />

Es egyszeru primteszt While ciklussal.*/<br />

#include <br />

#include <br />

void oszto2(long int szam);<br />

int main()<br />

{<br />

int x;<br />

do<br />

{<br />

printf("Szam (>2): "); scanf("%d",&x);<br />

}<br />

while (x


Programot módosította Dr Tuzson Tibor 2009*/<br />

5.1.3. Egy szám osztóinak kiszámítása do-while ciklussal<br />

/*Egy szam osztoit irja ki a kepernyore. Nem csak a primtenyezoket<br />

Es egyszeru primteszt do-while ciklussal*/<br />

#include <br />

#include <br />

void oszto3(long int szam);<br />

int main()<br />

{<br />

int x;<br />

do<br />

{<br />

printf("Szam (>2): "); scanf("%d",&x);<br />

}<br />

while (x


*Egy szam osztoit irja ki a kepernyore, harom modszerrel. Nem<br />

csak a primtenyezoket Es egyszeru primteszt.*/<br />

#include <br />

#include <br />

void oszto1(long int szam);<br />

void oszto2(long int szam);<br />

void oszto3(long int szam);<br />

int main()<br />

{<br />

int x;<br />

do<br />

{<br />

printf("Szam (>2): "); scanf("%d",&x);<br />

}<br />

while (x


}<br />

oszto = 2;<br />

while (oszto


#include <br />

int main()<br />

{<br />

int x;<br />

do{<br />

printf("Szam: "); scanf("%d",&x);<br />

}while (x 0)<br />

{<br />

printf("\nTorzstenyezok:\n");<br />

oszto = 2;<br />

while (szam != 1 && szam > 0)<br />

{<br />

while (szam %oszto != 0)<br />

{<br />

oszto++;<br />

}<br />

szam /= oszto;<br />

printf("%d",oszto);<br />

if (szam != 1)<br />

printf(" * ");<br />

}<br />

}<br />

}<br />

void hatvanykitevos(int szam)<br />

/* a szam felbontása hatványkitevıs alakra*/<br />

{<br />

int oszto = 2, hatv = 1, elozo = 1;<br />

if (szam != 1 && szam > 0)<br />

{<br />

printf("\n\nHatvanykitevos alak:\n");<br />

while (szam != 1 && szam > 0)<br />

{<br />

while (szam % oszto != 0)<br />

{<br />

oszto++;<br />

}<br />

szam /= oszto;<br />

if (oszto == elozo)<br />

hatv++;<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

31/38


else<br />

{<br />

if (elozo != 1)<br />

{<br />

if (hatv > 1)<br />

printf("%d^%d*",elozo, hatv);<br />

else<br />

printf("%d*",elozo);<br />

}<br />

hatv = 1;<br />

}<br />

elozo = oszto;<br />

if (szam == 1)<br />

if (hatv > 1)<br />

printf("%d^%d",oszto,hatv);<br />

else<br />

printf("%d",oszto);<br />

}<br />

}<br />

}<br />

/*Kiinduló forras: Computerbooks Benko Tiborne - Dr. Poppe Andras<br />

Egyutt Konnyebb A Programozos - C Programozas<br />

Programot módosította Dr Tuzson Tibor 2009*/<br />

15.3. Legnagyobb közös osztó (LKO) és legkisebb közös többszörös (LKT) kiszámítása<br />

A következı mintaprogramok az LKO és LKT kiszámításával foglalkozik. Három módszer fogunk<br />

látni, a próbálkozásos (leglassúbb), a törzstényezıs felbontásos és az Euklideszi algoritmuson<br />

alapuló megoldásokat.<br />

5.3.3. LKO és LKT próbálkozásos módszerrel.<br />

/* Az LKO és LKT kiszámítása próbálkozásos módszerrel.*/<br />

#include <br />

#include <br />

void Vegigprobal(int szam1, int szam2);<br />

int main(void)<br />

{<br />

unsigned int x, y;<br />

do<br />

{<br />

printf("1. Szam: "); scanf("%d",&x);<br />

}<br />

while (x < 2);<br />

do<br />

{<br />

printf("2. Szam: "); scanf("%d",&y);<br />

}<br />

while (x < 2);<br />

Vegigprobal(x,y);<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

32/38


}<br />

fflush(stdin);<br />

getchar();<br />

return 0;<br />

void Vegigprobal(int szam1, int szam2)<br />

{<br />

unsigned int eddig, oszto, kozos =1, v;<br />

printf("\nVegigprobal modszerrel\n\n");<br />

if (szam1 > 0 && szam2 > 0)<br />

{<br />

eddig = szam1;<br />

if (szam2 < eddig)<br />

eddig = szam2;<br />

for (oszto = 2; oszto


}<br />

getchar();<br />

return 0;<br />

void Torzstenyezok_lnko(int szam1, int szam2)<br />

{<br />

int s1, s2, lktobb, oszto1, oszto2, v;<br />

printf("\n\nTorzstenyezokre bontas modszerrel\n\n");<br />

if (szam1 > 0 && szam2 > 0)<br />

{<br />

s1 = szam1;<br />

s2 = szam2;<br />

lktobb = 1;<br />

while (szam2 != 1 || szam1 != 1)<br />

{<br />

oszto1 = 2;<br />

oszto2 = 2;<br />

while (szam1 != 1)<br />

{<br />

while (szam1 % oszto1 != 0)<br />

{<br />

oszto1++;<br />

}<br />

if (szam2 % oszto1 == 0)<br />

szam2 /= oszto1;<br />

lktobb*= oszto1;<br />

szam1 /= oszto1;<br />

}<br />

while (szam2 != 1)<br />

{<br />

while (szam2 % oszto2 != 0)<br />

{<br />

oszto2++;<br />

}<br />

szam2 /=oszto2;<br />

lktobb*=oszto2;<br />

}<br />

}<br />

v = s1*s2/lktobb;<br />

printf("Legnagyobb kozos oszto: %d\n",v);<br />

printf("Legkisebb kozos tobbszoros: %d",lktobb);<br />

}<br />

}<br />

/*Kiindulo forras: Computerbooks Benko Tiborne - Dr. Poppe Andras<br />

Együtt Konnyebb a Programozas - C Programozas<br />

Programot modosította Dr Tuzson Tibor 2009*/<br />

5.3.3. LKO és LKT Euklideszi algoritmussal [17.], [18.].<br />

Az Euklideszi algoritmus, ismételt maradékos egész osztásokból áll. Az algoritmus<br />

eredményeképpen a b és a c legnagyobb közös osztóját (LKO) kapjuk meg. A program végén<br />

kiszámítjuk az LKT-t is.<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

34/38


A jelölések:<br />

• b: kiinduló osztandó (nagyobbik egész szám)<br />

• c: kiinduló osztó (kisebbik egész szám)<br />

• qn: egész osztás eredménye (C nyelven a b/c mővelet eredménye). Ez érdektelen a LKO<br />

számításnál.<br />

• rn: egész osztás maradéka (C nyelven a b%c mővelet eredménye). Ez, amit ki kell számolni,<br />

mert az Euklideszi algoritmus ciklusaiban ez megy tovább.<br />

r<br />

r<br />

b<br />

c<br />

1<br />

n − 2<br />

r<br />

n − 1<br />

tehát<br />

( b , c )<br />

=<br />

igy<br />

=<br />

=<br />

=<br />

( r<br />

r<br />

n − 1<br />

:<br />

r<br />

cq<br />

1<br />

=<br />

2<br />

=<br />

q<br />

q<br />

:<br />

r<br />

=<br />

r<br />

,<br />

1<br />

2<br />

3<br />

n − 1<br />

n<br />

M<br />

( c ,<br />

r<br />

+<br />

+<br />

q<br />

n<br />

+<br />

q<br />

r<br />

r<br />

r<br />

n<br />

n + 1<br />

)<br />

1<br />

2<br />

r<br />

3<br />

=<br />

1<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

+<br />

+<br />

)<br />

r<br />

n<br />

r<br />

0<br />

=<br />

n<br />

( b , c )<br />

( r<br />

=<br />

1<br />

r<br />

, 0<br />

, 0<br />

, 0<br />

,<br />

n<br />

r<br />

2<br />

<<br />

<<br />

<<br />

)<br />

r<br />

r<br />

r<br />

, 0<br />

=<br />

3<br />

1<br />

2<br />

<<br />

<<br />

<<br />

<<br />

, 0<br />

r<br />

c<br />

r<br />

r<br />

n<br />

=<br />

1<br />

2<br />

<<br />

r<br />

r<br />

n + 1<br />

( euk<br />

Az Euklideszi algoritmust a fentebb látható képletekkel írhatjuk le. Itt található annak a bizonyítása<br />

is, hogy az utolsó nem nulla maradék, valójában a kiinduló két szám, b és c LKO-ja. [17.], [18.].<br />

Érdemes megfigyelni, hogy egy kicsit „nehezebb” matematikai módszer segítségével a<br />

bonyolultnak látszó LKO számítása, valójában egyetlen mővelet (%) és két adatmozgató utasításból<br />

áll. Leszámítva a ciklusszervezı és a printf-scanf beolvasó-kiíró mőveleteket.<br />

L<br />

M<br />

n − 1<br />

2 )<br />

/* Az LKO, Legnagyobb Kozos Oszto szamitasa az Euklideszi<br />

algoritmus segitsegevel.<br />

Maximalis szam 4 byte, azaz<br />

int változók esetében: 0x7FFFFFFF = 2147483647<br />

unsignek int esetében: 0xFFFFFFFF = 4294967294<br />

LKT esetében az eredmény kell ebbe beleférjen<br />

Fermat Primek<br />

FP1 = 0x00010001 = 2^16+1=65537<br />

FPn = 3, 5, 17, 257 (?)<br />

Javasolét teszt szamparok:<br />

LKO=3 : 196611 51<br />

35/38


LKO=7 : 458759 238<br />

LKO=11 7929977 407<br />

LKO=1578 103417386 36294<br />

*/<br />

#include <br />

#include <br />

int lko(unsigned int x, unsigned int y);<br />

int lkt(unsigned int x, unsigned int y, unsigned int z);<br />

int main(void)<br />

{<br />

unsigned int a,b,l,t; /* b < a*/<br />

printf("Kerek egy szamot szamot:\t"); scanf("%i",&a);<br />

printf("\nKerem egy masik szamot:\t");scanf("%i",&b);<br />

l=lko(a,b);<br />

printf("\n\nAz %i es %i legnagyobb kozosd osztoja LKO=<br />

%i\n",a, b,l);<br />

t=lkt(a,b,l);<br />

printf("\n\nAz %i es %i legnagyobb kozosd osztoja LKT=<br />

%i\n\n",a, b,t);<br />

system("PAUSE");<br />

return 0;<br />

}<br />

int lko(unsigned int x, unsigned int y) /* y < x */<br />

{<br />

unsigned int m; /* Ha y > x akkor csere */<br />

if(y>x)<br />

{<br />

m=x;<br />

x=y;<br />

y=m;<br />

}<br />

while (y != 0)<br />

{<br />

m = x % y;<br />

x = y;<br />

y = m;<br />

}<br />

return x;<br />

}<br />

int lkt(unsigned int x, unsigned int y, unsigned int z)<br />

{<br />

unsigned int v;<br />

v= x*y/z;<br />

return v;<br />

}<br />

/*Keszitette: Dr Tuzson Tibor*/<br />

Érdemes megjegyezni, hogy az Euklideszi algoritmus kibıvitett változata alkamlas a modilo egész<br />

multiplikaív inverzek számítására is.<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

36/38


6. Következtetések<br />

Ez az oktatási segédlet, a teljesség igény nélkül, a C programnyelven megírt <strong>algoritmusok</strong><br />

alaptípusaival foglalkozik. Változatosan próbálja alkalmazi az alap programozási megoldásokat.<br />

A teljességhez számos további alkalmazás bemutatása is hasznos lenne. A rendelkezésre álló 30 óra<br />

Informatika 1. laborgyakorlat, sajnos még ezek gyakorlására sem elégséges. Ennek dacára néhány<br />

jelentıs algoritmus további bemutatása, a legjobb, legszorgalmasabb hallgatók érdeklıdésének<br />

megfelelıen, a késöbbiekben meg fog történni. Csak néhény példát említve:<br />

• A kis és nagy Fermát tétel bemutatása.<br />

• DFT (Diskret Fourie Transzformált) egyszerő diszkrét spektrum analízis példája.<br />

• Shanon mintavételi tételének érzékeltetése, a filmekben ismert Western Szekér kerekének a<br />

visszafele forgásának szimulálásával.<br />

• Modulo egész multiplikatív inverz számítása a kibıvitet Euklideszi algoritmussal.<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

37/38


7. Irodalomjegyzék:<br />

[1.] Dr. Schuster György-Dr. Simán István: C programozás Borland C++ 3.11 környezetben;<br />

2006, BMF<br />

[2.] Sándor Tamás: Algoritmusok; Kézírat<br />

[3.] Sándor Tamás. Takács Gergı: Informatika alapjai II. Távoktatás CD:<br />

Dr. Schuster György Sándor Tamás: Algoritmusok<br />

[4.] http://kvkmai.uw.hu/tantargy.php: BMF KVK MAI honlapja.<br />

[5.] http://venekeiatt.uw.hu/ Venekei Attila honlapja.<br />

[6.] http://mohos.uw.hu/2008_9_1/ Mohos Pál honlapja.<br />

[7.] Benkı Tiborné - Dr. Poppe AndrÁs - Együtt Könnyebb a Programozás - C Programozás<br />

Computerbooks 1994<br />

[8.] http://www.cprogramming.com/tutorial.html : Programming Tutorials<br />

[9.] Cormen, Leiserson, Rivest: Algoritmusok; Mőszaki kk. 1997<br />

[10.] Pere László: UNIX – GNU/Linux; Programozás C nyelven<br />

[11.] http://maven.smith.edu/~thiebaut/java/sort/<br />

D. Thiebaut, -- Smith College;<br />

Rendezı <strong>algoritmusok</strong> ötféle animációja.<br />

[12.] http://www.cs.pitt.edu/~kirk/cs1501/animations/Sort1.html<br />

(University of Pittsburg, Dpt. of Computer Science). Rendezı <strong>algoritmusok</strong> ötféle<br />

animációja.<br />

[13.] http://en.wikipedia.org/wiki/Algorithm<br />

Algorithm: From Wikipedia, the free encyclopedia<br />

[14.] http://hu.wikipedia.org/wiki/Algoritmus Algoritmus<br />

[15.] http://hu.wikipedia.org/wiki/Algoritmus#Az_algoritmusfogalom_t.C3.B6rt.C3.A9nete Az<br />

algoritmusfogalom története<br />

[16.] http://hu.wikipedia.org/wiki/Legnagyobb_k%C3%B6z%C3%B6s_oszt%C3%B3<br />

Legnagyobb közös osztó<br />

[17.] Dr Tuzson Tibor: Adatbiztonság és kriptográfia; BMF KVK fakultatív tanfolyam oktatási<br />

segédlete<br />

[18.] Dr Tuzson Tibor: Adat és Információ Védelem; BMF BGK BT tanfolyam oktatási segédlete<br />

[19.] Alfred J. Menezes, Paul C. van Oorschot and Scott A. Vanstone: Handbookof Applied<br />

Cryptography, CRC Press 2001<br />

[20.] Bruce Schneier: Applied Cryptography: Protocols, Algorithms, and Source Code in C,<br />

Second Edition, John Wiley and Sons Inc., New York, 1996.<br />

[21.] How-Shen Chang: International Data Encryption Algorithm; CS-627-1; Fall 2004. James<br />

Madison University, Harrisonburg<br />

https://users.cs.jmu.edu/abzugcx/public/Student-Produced-Term-Projects/Cryptology-2002-<br />

SPRING/IDEA-by-How-Shen-Chang-2004-FALL.doc<br />

[22.] B. W. Kernighan, D. M. Ritchie.: A C programozási nyelv Mőszaki Könyvkiadó, 1985.<br />

ALGORITMUSOK: Informatika 1. Laborgyakorlat; Összeállította: Dr Tuzson Tibor docens<br />

38/38

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!