Professional Documents
Culture Documents
Algo 1
Algo 1
1. – Összegzés
Feladata:
Megkapja egy számsorozat elemeit és ezeket összeadja.
Pseudo - kód Magyarázat
Függvény Összegzés(A : sorozat) : Elemtip A metódus egy Összegzés nevű, Elemtip (var)
visszatérési értékű függvény lesz, mely
paraméterében egy A sorozatot vár.
Változók Az S változóban számoljuk az értéket, az I
S: Elemtip; változó a ciklusváltozó.
I: Egész;
Algoritmus
S ← 0; S kezdőértéke 0.
Ciklus I ← (1...N) For ciklusnak felel meg. N = az A sor hossza.
S ← S + A[I]; Az S változót minden körben megnöveljük az A
sorozat I-edik elemének értékével.
CVége
Összegzés ← S; Az eredményt visszaadja (return).
FVége;
Programkód
int Összegzés(int[] A)
{
int S = 0;
Feladata:
Megkap egy sorozatot és az azokon értelmezett T tulajdonságot, majd megszámolja, hogy a sorozat
hány tagja rendelkezik ezzel a tulajdonsággal.
Algoritmus
DB ← 0; DB kezdőértéke 0.
Ciklus I ← (1...N) For ciklusnak felel meg. N = az A sor hossza.
HA (T(A[I])) AKKOR Az A sorozat I-edik elemére igaz T tulajdonság?
(if-nek felel meg).
DB ← DB + 1; Ha az adott körben a feltétel teljesül, a DB
változót egyel növeljük.
HVÉGE
CVége
Megszámlálás ← DB; Az eredményt visszaadja (return).
FVége;
Feladata:
Megkap egy sorozatot és az azokon értelmezett T tulajdonságot, majd a sorozat azon elemeit,
amikre passzol a T tulajdonság, egy külön sorozatba gyűjti.
Algoritmus
Y = 0; A B sorozat számlálóját 0-ra állítjuk.
Ciklus I ← (1...N) For ciklusnak felel meg. N = az A sor hossza.
HA (T(A[I])) AKKOR Az A sorozat I-edik elemére igaz T tulajdonság?
(if-nek felel meg).
B[Y] ← A[I] Ha az adott körben a feltétel teljesül, az elemet a
B sorozatba másoljuk.
Feladat:
A függvény egy A sorozatnak megkeresi a legnagyobb elemét és annak értékét visszaadja. (A
bemutatás a minimum értékkel fog zajlani, a maximum megkereséséhez a legbelső „if” relációt kell
megfordítani!).
Algoritmus
MinÉ ← A[1]; Feltételezzük, hogy az A sorozat 1. eleme a
legkisebb.
Ciklus I ← (2...N) For ciklusnak felel meg. N = az A sor hossza.
A 2. elemtől indulunk, mert a ciklus első
futásakor a sorozat első eleme már be van töltve.
HA A[I] < MinÉ AKKOR Az A sorozat I-edik elemére igaz T tulajdonság,
hogy kisebb a jelenlegi MinÉ értéknél? (if-nek
felel meg).
MinÉ ← A[I] Ha az adott körben a feltétel teljesül, az A
sorozat I-edik elemét értékül adjok a MinÉ
változónak.
HVÉGE
CVége
Kiválogatás ← MinÉ; Az eredményt visszaadja (return).
FVége;
Programkód
int MinimumÉ(int[] A)
{
int MinÉ = A[0];
Feladat:
A függvény egy A sorozatnak megkeresi a legnagyobb elemét és annak helyét visszaadja. (A
bemutatás a minimum értékkel fog zajlani, a maximum megkereséséhez a legbelső „if” relációt kell
megfordítani!).
Algoritmus
MinH ← 1; Feltételezzük, hogy az A sorozat 1. eleme a
legkisebb.
Ciklus I ← (2...N) For ciklusnak felel meg. N = az A sor hossza.
A 2. elemtől indulunk, mert a ciklus első
futásakor a sorozat első eleme már be van töltve.
HA A[I] < A[MinH] AKKOR Az A sorozat I-edik elemére igaz T tulajdonság,
hogy kisebb a jelenlegi MinH értéknél lévő
elemnél? (if-nek felel meg).
MinH ← I Ha az adott körben a feltétel teljesül, az I értékül
adódik MinH-nak.
HVÉGE
CVége
Kiválogatás ← MinH; Az eredményt visszaadja (return).
FVége;
Programkód
int MinimumH(int[] A)
{
int MinH = A[0];
Algoritmus
I ← 1; Feltételezzük, hogy az A sorozat 1. eleme a
legkisebb.
Ciklus_Míg (I <= N) ÉS (Nem T(A[I])) While ciklusnak felel meg. Addig fut, míg I
kisebb, mint A hossza, és az aktuális elem nem
felel meg T tulajdonságnak.
I ← I + 1; Ha a ciklus nem ugrott ki, I-t növeljük egyel.
Figyelem!
A C# nyelvben a sorok számozása nullától kezdődik, ez okozhat eltérést a pseudo és a megvalósítás
között!
Programkód (T → az elem páros)
bool Eldöntés(int[] A)
{
int I = 0;
Feladat:
Megkeresi a sorban a T tulajdonságú elemet és logikai változóval jelöli, hogy talált-e. Ezen felül
visszaadja az elem helyét egy külső változó formájában.
Algoritmus
I ← 1;
Ciklus_Míg (I <= N) ÉS (Nem T(A[I])) While ciklusnak felel meg. Addig fut, míg I
kisebb, mint A hossza, és az aktuális elem nem
felel meg T tulajdonságnak.
I ← I + 1; Ha a ciklus nem ugrott ki, I-t növeljük egyel.
Figyelem!
A C# nyelvben a sorok számozása nullától kezdődik, ez okozhat eltérést a pseudo és a megvalósítás
között!
Programkód (T → az elem páros)
bool LinKer(int[] A, out int Hely)
{
int I = 0;
Feladat:
Adott egy A sorozat és egy T tulajdonság. Tudjuk, hogy a sorozatban legalább egy T tulajdonságú
elem van. A kiválasztás visszaadja az első T tulajdonságú elem helyét.
Algoritmus
I ← 1; Feltételezzük, hogy az A sorozat 1. eleme a
legkisebb.
Ciklus_Míg (Nem T(A[I])) While ciklusnak felel meg. Addig fut, míg I
kisebb, mint A hossza, és az aktuális elem nem
felel meg T tulajdonságnak.
Mivel kikötés, hogy A sorozatban lennie kell T
tulajdonságú elemnek, ezért az I<=N relációt
nem kell vizsgálni.
I ← I + 1; Ha a ciklus nem ugrott ki, I-t növeljük egyel.
Figyelem!
A C# nyelvben a sorok számozása nullától kezdődik, ez okozhat eltérést a pseudo és a megvalósítás
között!
Programkód (T → az elem páros)
void KiVálasztás(int[] A, out int Hely)
{
int I = 0;
while (A[I] % 2 != 0)
{
I++;
}
Hely = I;
}
4. Strázsás keresés
Feladat:
Adott egy A sorozat és egy T tulajdonság. Tudjuk, hogy a sorozatban legalább egy T tulajdonságú
elem van, mert a sorozat végére manuálisan beszúrunk egy T tulajdonságú elemet, egy
„strázsaelemet”. A kiválasztás visszaadja az első T tulajdonságú elem helyét.
Algoritmus
I ← 1; A sorozat végére beszúrunk egy T tulajdonságú
A[N+1] ← TtulajdonságúElem elemet.
Ciklus_Míg (Nem T(A[I])) While ciklusnak felel meg. Addig fut, míg az
aktuális elem nem felel meg T tulajdonságnak.
I ← I + 1; Ha a ciklus nem ugrott ki, I-t növeljük egyel.
Figyelem!
A C# nyelvben a sorok számozása nullától kezdődik, ez okozhat eltérést a pseudo és a megvalósítás
között! (Kódrövidítés érdekében itt dinamikus sort, azaz listát használtam)
Programkód (T → az elem páros)
bool StrázsásKer(List<int> A, out int Hely)
{
int I = 0;
A.Add(2);
while (I < A.Count && A[I] % 2 != 0)
{
I++;
}
Hely = I;
return I <= A.Count;
}
5. Lineáris keresés rendezett sorozatban
Feladat:
A fentiekhez hasonlóan egy sorozatban keres, logikai értékkel jelzi, hogy volt-e egy adott elem. Ám
figyelembe veszi azt a lehetőséget, hogy a sorozat aktuális eleme alapján már nem tartalmazhatja a
keresett elemet. Csak rendezett sorozatoknál működik!
Algoritmus
I ← 1;
Ciklus_Míg (I <= N) ÉS (Adat>A[I]) While ciklusnak felel meg. Addig fut, míg I
kisebb, mint A hossza, és az aktuális elem
kisebb, mint a keresett adat.
I ← I + 1; Ha a ciklus nem ugrott ki, I-t növeljük egyel.
Figyelem!
A C# nyelvben a sorok számozása nullától kezdődik, ez okozhat eltérést a pseudo és a megvalósítás
között!
Programkód
bool LinKerRend(int[] A, int Adat, out int Hely)
{
int I = 0;
Feladat:
A bináris keresés a keresés egyik gazdaságosabb formája, működési elve szerint meg tudja tippelni
a keresett elem helyét és csak a megtippelt részben keresni tovább. Csak rendezett sorozatokon
működik!
Feladat:
Vesszük a sorozat első elemét és a többi elemen végigmenve megnézzük, hogy kisebbek-e mint az
első. Ha találunk kisebb elemet, azt kicseréljük a sorozat első elemével, így a sorozat első eleme
lesz a legkisebb.
Figyelem!
A C# nyelvben a sorok számozása nullától kezdődik, ez okozhat eltérést a pseudo és a megvalósítás
között!
Programkód
static void KözvKi(ref int[] A)
{
int J = 0;
int C = 0;
for (int I = J+1; I < A.Length; I++)
{
if (A[I] < A [J])
{
C = A[I];
A[I] = A[J];
A[J] = C;
}
}
}
2. Sorozat rendezése közvetlen kiválasztással
Feladat:
A közvetlen kiválasztás segítségével egy teljes sorozatot rendezünk.
Feladat:
A minimum kiválasztás a közvetlen kiválasztásos rendezés továbbfejlesztése: a cserét csak akkor
hajtja végre, ha már megtalálta a részsorozat legkisebb elemét, így növelve a hatékonyságot.
Feladat:
A buborékrendezés két egymás melletti elemet hasonlít össze és szükség esetén megcseréli azokat.
Így n-1 lépés alatt a legnagyobb elem a sorozat végére kerül. A rendezést n-szer kell végrehajtani,
ám a rendezett részt már nem szükséges figyelembe venni.
Figyelem!
A C# nyelvben a sorok számozása nullától kezdődik, ez okozhat eltérést a pseudo és a megvalósítás
között!
Programkód
void Buborék(ref int[] A)
{
int C = 0;
for (int J = 0; J < A.Length-1; J++)
{
for (int I = 0; I < A.Length-1-J; I++)
{
if (A[I] < A[I+1])
{
C = A[I];
A[I] = A[I+1];
A[I+1] = C;
}
}
}
}
5. Buborékrendezés – javított
Feladat:
A buborékrendezésen sokat lehet javítani különböző módokon.
• izsgáljuk azt, hogy nem vált-e a sorozat idő előtt rendezetté, így kivédhetjuk a felesleges
futásokat.
• Eltároljuk az utolsó csere helyét, így nem kell a már rendezett részsorozatokon fölöslegesen
átfutni.
Pseudo - kód Magyarázat
Eljárás Buborék(A : sorozat) A metódus egy Buborék nevű eljárás lesz, mely
paraméterében egy A sorozatot vár.
VoltCsere: logikai;
UtolsóCsereH: egész;
Algoritmus A „VoltCsere” véltozót igazra kell állítani, hogy
J ← 1; a while ciklus elindulhasson.
VoltCsere ← Igaz;
Ciklus_Míg (J <= N-1) ÉS VoltCsere „While” ciklusnak felel me. Ide nem jó a „For”,
mert a VoltCserét is vizsgálni kell. Ha a körben a
VoltCsere hamis marad, az azt jelenti, hogy a
sorozat rendezetté vált, így a feladat befejeződik.
VoltCsere ← Hamis; A VoltCsere alapértelmezetten minden körben
UtolsóCsereH ← 0; hamis.
Feladat:
A koktélrendezés lényegében egy oda és egy vissza működő buborékrendezés-pár. Ezzel a
megoldással az egyes elemek felváltva „nyulak” és „teknősök”, felgyorsítja a buborékrendezésnél
csak egyesével menetelő elemek mozgását. Tehát ha az első belső ciklus balra haladva növekvő
sorrendbe rendez, akkor a második belső ciklus jobbra haladva növekvő sorrendbe rendez.
Feladat:
Az alapelv szerint mindig egy elem helyét kell megkeresnünk egy rendezett részsorozatban.
Kezdéskor a sorozat első elemét tekintjük a rendezett részsorozatnak, amihez képest helyezzük el a
második elemet. Ezután folytatva N hosszúságú sorozatnál mindig az N+1 -edik elemnek keressük
meg a helyét.
Cvége_Amikor D = 1;
EVége;
Példa:
Sorozat
1 2 3 4 5 6 7 8 9 10
Feladat:
Két, azonos módon rendezett sorozatot mos össze egy harmadik rendezett sorozattá, figyelembe
véve a hosszok közötti különbséget is.
AI ←AI + 1;
CI←CI + 1;
C[ CI ]←B[ BI ];
BI ←BI + 1;
Hvége;
Hvége;
CI ← CI + 1;
CVége;
Ciklus _Míg ( AI <= A. elemszám ) Ha az egyik sorozat hosszabb mint a másik, a
CI←CI + 1; hosszabb sorozat fennmaradó elemei már
biztos, hogy mind nagyobbak, mint az eddig
C[ CI ]←A[ AI ]; elhelyezett elemek, tehát egyszerűen a végére
AI←AI + 1; kell írni őket C sorozatnak.
CVége;
Ciklus _Míg ( BI <= B. elemszám )
CI←CI + 1;
C[ CI ]←B[ BI ];
BI←BI + 1;
EVége;
Figyelem!
A C# nyelvben a sorok számozása nullától kezdődik, ez okozhat eltérést a pseudo és a megvalósítás
között!
Programkód
void Összefuttatás(int[]A, int[] B, out int[] C)
{
C = new int[A.Length + B.Length];
int AI = 0;
int BI = 0;
int CI = 0;
while (AI < A.Length && BI < B.Length)
{
if (A[AI]<B[BI])
{
C[CI] = A[AI];
AI++;
}
else if(A[AI] > B[BI])
{
C[CI] = B[BI];
BI++;
}
else
{
C[CI] = A[AI];
AI++;
CI++;
C[CI] = B[BI];
BI++;
}
CI++;
}
while (AI < A.Length)
{
C[CI] = A[AI];
AI++;
}
while (BI < B.Length)
{
C[CI] = B[BI];
BI++;
}
}
Luhn algoritmus
1 2 3 4 5 6 7 8 9 10 11 12 13
Származási hely Gyártó Termék azonosító Ellenőrző
Az ellenőrző kódot úgy képezzük, hogy az első 12 számot paritásától függően 1-el vagy 3-al
megszorozzuk, majd ezeket összegezzük. Az ellenőrző kód az az egyjegyű szám lesz, mellyel az
összeg tízzel oszthatóvá tehető.
Pseudo - kód
Függvény Luhn(A : kód): logikai
Változók
I: egész;
SUM: Elemtip;
Algoritmus
SUM ← 0;
Ciklus J ← (1...N)
HA (I MOD 2)=0 Akkor
HA 2*A[i] > 9 Akkor
SUM ← SUM + 2*A[I] – 9;
KÜLÖNBEN
SUM ← SUM + 2*A[I] ;
Hvége;
KÜLÖNBEN
SUM ← SUM + A[I] ;
Hvége;
CVége
Luhn ← (SUM MOD 10) = 0;
EVége;
Verem
• A verem egy homogén, szekvenciális adatszerkezet.
• Alapját egy tömb képezi.
• Elemeihez csak az „egyik végén” férünk hozzá, vagyis azt az elemet tudjuk először kivenni,
amit utoljára beletettünk.
• Használható például posztfixes matematikai számítások kiértékelésére. (A posztfixes jelölés
azt jelenti, hogy a képletben az operátor nem az operandusok közé, hanem azok elé kerül.
Pl.: +(2, 5)).
Sor
• A sor a verem fordítottja: egyik végét írni, míg másik végét olvasni lehet.
• A legelőször belekerülő elemet olvashatjuk ki először.
• Homogén adatszerkezet, alapját szintén egy tömb képezi.
Fontosabb fogalmak
• Hatékonyság:
◦ Egy algoritmus hatékonysága az elvégzéséhez szükséges időből és az általa létrehozott
és tárolt adatok mennyiségétől függ.
• Folyamatábra:
◦ Egy algoritmust szemléltető, irányított gráf.
◦ Csomópontjai utasításokat, élei adatokat írnak le.
• Leírónyelv:
◦ A programozáson alapuló, de egyik programnyelvhez sem kötődő nyelv, mellyel
programnyelvektől kötetlenül lehet algoritmusokat tervezni és leírni.
• Vezérlési szerkezetek:
◦ Az algoritmusok utasításainak sorrendjét lehet ezekkel szervezni.
◦ Szekvencia:
▪ Ez a vezérlési szerkezet a benne megadott utasítások egyszeri, minden feltételtől
független, a megadás sorrendjében történő végrehajtását biztosítja
◦ Szelekció (if):
▪ Elágazás.
▪ Adott egy tulajdonság. A Szelekció programsorait csak akkor hajtjuk végre, ha a
tulajdonság igaz.
▪ Lehet egyágú vagy többágú elágazás is.
◦ Iteráció:
▪ A benne szereplő programrészt adott számszor, vagy egy tulajdonságtól függően újra
és újra végrehajtja.
▪ Létezik belőle elöltesztelő, hátultesztelő, igazra kiugró, hamisra kiugró és előírt
lépésszámú.