c#

C# programozási tételek

C# programozás Programozás

2021.01.14 beadandó feladat

Összegzés

Általában egy tömb elemeinek összegzését jelenti. Általánosan: összeg=összeg+aktuális elem, vagyis új összeg=régi összeg+aktuális elem

Példa: Állítsunk elő 10db 1-100 közötti véletlen számot, töltsünk fel velük egy tömböt. Számoljuk ki a számok összegét! Ha ez megvan, akkor ennek felhasználásával számoljuk ki az átlagukat is!

Megszámlálás

Megszámoljuk, hogy hány olyan elem van, ami egy megadott feltételnek megfelel.

Példa: Számoljuk meg, hány negatív és hány pozitív szám van egy 10 elemű, -100 100 közötti véletlen számokkal feltöltött tömbben!

Eldöntés

Ez az algoritmus eldönti, hogy van-e a tömbben adott tulajdonságú elem. Ha van, a ciklus leáll, break utasítással kilépünk a do while ciklusból. Természetesen meg lehet oldani for ciklussal is.

Példa: Állítsunk elő 5 egész számot, egy 0-100 közötti véletlenszámokból, és döntsük el, van-e közöttük 3-mal osztható!

Kiválasztás

Az adatok közül kiválasztunk egy, vagy több olyan elemet, ami a megadott feltételeknek megfelel. Az algoritmus megadja, hogy az adott elem a tömbben hol helyezkedik el.

Példa: Állítsunk elő 10 véletlen számot -100 és 100 között! Írjuk ki az első pozitív szám indexét és értékét! (plusz az tömb összes elemét, hogy ellenőrizni tudjuk)

Ebben az esetben akár ki is léphetünk a ciklusból, ha megtaláltuk a keresett elemet. A tömb indexelése 0-val kezdődik. Ha -1 kezdőelemet adunk az index változónak, akkor ennek segítségével eldönthető, hogy találtunk–e a feltételnek megfelelő elemet. Ha végigmentünk a tömbön, és -1 maradt az index változónk értéke, akkor nem volt megfelelő szám. Ha -1-nél nagyobb, akkor találtunk megfelelő elemet. FOR és DO .. WHILE ciklussal is:

Maximum/minimum kiválasztás

Rendezetlen elemek közül keressük meg a legnagyobbat/legkisebbet. Karakter és szöveg típusú változókra is érvényes. A for ciklus előtt az első elemet (0.index) tekintjük a legnagyobbnak, majd a for ciklus során végignézzük az elemeket, hogy van-e ennél nagyobb/kisebb elem. Ha az aktuálisan vizsgált elem nagyobb, akkor az lesz az új maximum.

Példa: Állítsunk elő 10db 0-500 közötti véletlen számot, és keressük meg, melyik a legnagyobb!
(keressük meg a legkisebbet is!)
Ellenőrzésként írjuk ki a 10db számot is a képernyőre!

Kérjünk be 5db karaktert, és írjuk ki az abc sorrend szerint elsőt! (ASCII karaktekkód szerint rendez)

Állítson elő véletlenszerűen 28 db számot a [-10, 10] tartományból!

  • Állapítsa meg pozitív vagy negatív számból van-e több? A választ
    és a darabszámokat írja a képernyőre!
  • Hányszor fordult elő a 7-es szám?
  • Van-e a számok között 0, hanyadik indexe van az elsőnek?
  • Adja meg a negatív számok átlagát!
  • Adja meg melyik a legkisebb, és a legnagyobb szám!
  • Melyik volt a pozitív számok közül a legkisebb?
  • Melyik volt a negatív számok közül a legnagyobb?

Kiválogatás

Kiválogatás során egy tömb elemei közül kiválogatjuk azokat, amelyek a megadott feltétel(ek)nek megfelelnek. Ezeket akár egy másik tömbbe is tárolhatjuk.

Generáljunk 20db véletlenszámot 1-100 közötti számokból. Az öttel osztható számokat írassuk ki, és tároljuk egy másik tömbben! Ilyen esetben a másik tömb méretének is célszerű az eredeti tömb méretét megadni, mert akár az is elképzelhető, hogy minden generált szám osztható öttel.

Szétválogatás

Szétválogatás esetén egy tömb minden elemét elhelyezzük a megadott feltételek szerint másik tömbben. A szétválogatás utáni tömbök elemszáma megegyezik az eredeti tömb elemszámával.

Állítsunk elő 20db 1-100 közötti véletlen számot! Válogassuk szét a számokat 3 tömbbe: legyenek a ‘ketto’ tömbben a kettővel osztható számok, a ‘harom’-ban a kettővel nem de hárommal oszthatóak, az ‘egyeb’ tömbben az összes többi. Írassuk ki a tömbök tartalmát!

namespace szetvalogatas
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Szétválogatás");
            int[] a = new int[20];
            int[] ketto = new int[20];
            int[] harom = new int[20];
            int[] egyeb = new int[20];
            int i = 0, j = 0, dbketto = 0, dbharom = 0, dbegyeb = 0;
            Random vsz = new Random();
            for (i=0; i<20; i++)
            {
                a[i] = vsz.Next(101);
                Console.Write("{0} ", a[i]);
                if (a[i]%2==0)
                {
                    ketto[dbketto] = a[i];
                    dbketto++;
                }
                else if (a[i]%3==0)
                {
                    harom[dbharom] = a[i];
                    dbharom++;
                }
                else
                {
                    egyeb[dbegyeb] = a[i];
                    dbegyeb++;
                }
            }
            Console.WriteLine();
            Console.WriteLine("A kettővel osztható számok: ");
            for (j = 0; j < dbketto; j++)
                Console.Write("{0} ", ketto[j]);
                Console.WriteLine();
            Console.WriteLine("A kettővel nem de hárommal oszthtó számok: ");
            for (j = 0; j < dbharom; j++)
                Console.Write("{0} ", harom[j]);
                Console.WriteLine();
            Console.WriteLine("Egyéb számok");
            for (j = 0; j < dbegyeb; j++)
                Console.Write("{0} ", egyeb[j]);
            Console.ReadKey();
        }
    }
}

Lineáris keresés

A lineáris keresés nagyon hasonlít az eldöntésre: egy n elemű sorozatban keresünk adott feltételnek megfelelő elemet. Az algoritmusnak el kell döntenie, van-e az adott feltételnek megfelelő elem. Ha igen, akkor ennek az elemnek a sorszámát keressük.

RENDEZÉSI ALGORITMUSOK

BUBORÉK RENDEZÉS

Nevét onnan kapta, hogy hasonlóan ahhoz, ahogy a pezsgőspohárban szállnak felfelé a buborékok, a rendezés során is minden egyes menetben a fennmaradó elemek közül a legnagyobbat helyezzük át a tömbszelet végére, tetejére. A rendezés során a tömb fennmaradó – még nem rendezett – részén végighaladva az egymás utáni szomszédos elemeket összehasonlítjuk, és ha szükséges megcseréljük őket, hogy közülük mindig a nagyobb helyezkedjen el feljebb; ezt a műveletet aztán a tömbön feljebb lépve addig ismételjük, amíg a fennmaradó rész végéhez nem érünk. A műveletsor végén a rendezetlen rész tetejére mindig a legnagyobb érték kerül majd fel, amelyet a következő menetben már nem veszünk figyelembe. A ciklust egészen addig ismételjük a fennmaradó – egyre kisebb – halmazon, amíg már csak egyetlen elem marad ebben, amely ebben az esetben a halmaz legkisebb eleme lesz, miközben a tömb fennmaradó része az összes nála nagyobb elemet fogja tartalmazni, növekvő sorrendben.

Az algoritmus műveletigénye a tömb méretének négyzetével arányos, ezért nagy tömböknél nem javasolt a használata, mert rendkívül lassú futáshoz vezet. Ilyen esetekre a gyorsrendezés vagy az összefésülő rendezés használata ajánlott. A minimumkiválasztásos és a beszúrásos rendezések általában hatékonyabbak a buborékrendezésnél.

Egy szemléletes video a YouTube-ról, és egy másik.

Beszúrásos rendezés

Működése leginkább a kártyalapok egyenként való kézbe vételéhez és a helyükre igazításához hasonlítható. Van a kezünkben 10,9,K,A és felveszünk egy J-t, akkor a 10-es után fogjuk beszúrni, de az előtte levő elemeket is rendezi, tehát 9, 10, J, K, A lesz az eredmény. Ezzel persze nincs ki a sorunk pókernél…

Vesszük a soron következő elemet, és megkeressük a helyét a tőle balra lévő, már rendezett részben, majd a kereséssel párhuzamosan a nagyobb elemeket rendre eggyel jobbra mozgatjuk. Az aktuális elemet egy segédváltozóban tároljuk, mert a mozgatások során értéke felülíródhat egy nagyobb elemmel.

Ezen algoritmus használata akkor igazán előnyös, ha az adatsorunk már részben rendezett. Továbbá akkor igen hatékony, ha egy rendezett sorozatot bővítünk és a bővítés után is szeretnénk, hogy a sorozat rendezett maradjon. Az algoritmus futási ideje legjobb esetben konstans, vagyis a gép sebességétől függ, az elemektől nem. Legrosszabb esetben pedig négyzetes.

Frissítve: 2024.05.01.