Vissza a tananyagokhoz

Algoritmusok, Karakterek és Tömbök

A 3. heti egyetemi tananyagok kidolgozása: prímkereső algoritmus, karakterfüggvények (isalpha, isdigit), a lusta kiértékelés elve, valamint fix méretű tömbök kezelése ciklusokkal.

Egyetemi Alapsablon

Az algoritmusok és tömbök felépítésénél az iostream és az std névtér biztosítja az alapot:

// ==========================================
// EGYETEMI / SULIS C++ ALAPSABLON
// ==========================================
#include <iostream>

using namespace std;

int main() {
    // Algoritmusok kidolgozasa
    return 0;
}
Órai fájl: 3.3.cpp

1. Prímszám Ellenőrző Algoritmus

Egy szám akkor prím, ha pontosan két osztója van (1 és önmaga). Az órai algoritmus elöltesztelő while ciklussal dolgozik: a 2-től induló számlálóval elosztja a vizsgált számot. Optimalizálás: nem kell végigmenni a teljes számig, elegendő a szám feléig (szam / 2) keresni osztót!

// 3. Hét / 3.3.cpp - Prímszám vizsgálat (NJE órai algoritmus)
#include <iostream>
using namespace std;

int main()
{
    int i = 2, szam, osztokszama = 0;
    cout << "Adjon meg egy szamot: ";
    cin >> szam;

    // Elég a szám feléig (szam / 2) vizsgálni az osztókat:
    while (i <= szam / 2 && osztokszama == 0)
    {
        if (szam % i == 0)
        {
            osztokszama++;
        }
        i++;
    }

    if (osztokszama > 0 || szam < 2)
    {
        cout << "A megadott szam nem prim!" << endl;
    }
    else {
        cout << "A megadott szam prim!" << endl;
    }

    return 0;
}
Órai fájl: 3.7.cpp

2. Az ASCII Kódtábla Megjelenítése (0 – 255)

A C++-ban a karakterek (char) valójában egész számok. A for (int i = 0; i < 256; i++) ciklus bejárja a teljes bájt-tartományt, és a (char)i típuskényszerítéssel kirajzolja az ASCII jeleket.

// 3. Hét / 3.7.cpp - Teljes ASCII kódtábla kiíratása (0-255)
#include <iostream>
using namespace std;

int main()
{
    // A 0-tól 255-ig terjedő egész számokat típuskényszerítjük (char) karakterré
    for (int i = 0; i < 256; i++)
    {
        cout << i << ": " << (char)i << endl;
    }

    return 0;
}
Órai fájl: 3.8.cpp

3. Karakterkezelő Függvények (isalpha, isdigit)

A <cctype> szabványos C++ könyvtár gyors függvényeket kínál karaktervizsgálathoz:

  • isalpha(c): Igaz (nem nulla), ha a karakter betű.
  • isdigit(c): Igaz (nem nulla), ha a karakter számjegy (0-9).
  • toupper(c) / tolower(c): Kis- és nagybetűssé alakítás.
// 3. Hét / 3.8.cpp - Karakter vizsgálat: isalpha és isdigit
#include <iostream>
#include <cctype> // Karakterkezelő függvények könyvtára

using namespace std;

int main()
{
    char karakter;
    int betu, szam;

    cout << "Adjon meg egy karaktert: ";
    cin >> karakter;

    // isalpha: nem nulla, ha a karakter betű ('a'-'z', 'A'-'Z')
    // isdigit: nem nulla, ha a karakter számjegy ('0'-'9')
    betu = isalpha(karakter);
    szam = isdigit(karakter);

    if (betu)
    {
        cout << "A megadott karakter betu" << endl;
    }
    else if (szam)
    {
        cout << "A megadott karakter szam" << endl;
    }
    else {
        cout << "A megadott karakter egyeb jel" << endl;
    }

    return 0;
}
3. Hét Elmélet

4. Lusta (Lazy) vs Gyors (Eager) Kiértékelés

A prezentáció részletesen bemutatja a két kiértékelési stratégiát:

Gyors kiértékelés (Eager evaluation):

A program azonnal kiszámítja egy kifejezés értékét, amint hozzárendeli egy változóhoz vagy átadja paraméterként, akkor is, ha később nem használja.

Lusta kiértékelés (Lazy evaluation / Rövidzár):

A program elhalasztja a számítást addig, amíg ténylegesen szükség nincs rá. C++-ban a logikai && és || operátorok pontosan így működnek: ha az első tag eldönti az eredményt, a másodikat nem értékeli ki!

// Lusta (Lazy) vs Gyors (Eager) kiértékelés C++ logikai kifejezésekben
#include <iostream>
using namespace std;

bool ellenorzes() {
    cout << "-> ellenorzes() fuggveny lefutott!" << endl;
    return true;
}

int main() {
    int a = 0;

    cout << "1. Teszt: Logikai ES (&&) rovidzar:" << endl;
    // Mivel (a != 0) HAMIS, a C++ nem értékeli ki a második tagot!
    if (a != 0 && ellenorzes()) {
        cout << "Igaz" << endl;
    } else {
        cout << "Hamis (az ellenorzes() nem futott le, megsporolva az idot!)" << endl;
    }

    cout << "\n2. Teszt: Logikai VAGY (||) rovidzar:" << endl;
    int b = 5;
    // Mivel (b > 0) IGAZ, a C++ azonnal leáll, a jobb oldal nem fut le:
    if (b > 0 || ellenorzes()) {
        cout << "Igaz (az ellenorzes() itt sem futott le!)" << endl;
    }

    return 0;
}
Órai fájl: 3.9.cpp

5. C++ Tömbök Alapjai (Deklaráció, Inicializálás, Összegzés)

A tömb azonos típusú elemek folytonos memóriaterületen tárolt sorozata. Az elemek indexelése mindig 0-tól indul és méret - 1-ig tart.

// 3. Hét / 3.9.cpp - Egész és karakter tömbök kezelése C++-ban
#include <iostream>
using namespace std;

int main()
{
    int tmb[8], osszeg = 0;
    // 8 elemű karaktertömb inicializálása
    char Tmb[8] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };

    // 1. Egész típusú tömb feltöltése a felhasználótól ciklussal és összegzés
    for (int i = 0; i < 8; i++)
    {
        cout << "Adja meg a(z) " << i + 1 << ". elemet a tombnek: ";
        cin >> tmb[i];
        osszeg = osszeg + tmb[i];
    }

    cout << "\nA tomb elemeinek osszege: " << osszeg << endl;

    // 2. Karaktertömb elemeinek megjelenítése
    cout << "\n--- Karaktertomb elemei ---" << endl;
    for (int i = 0; i < 8; i++)
    {
        cout << i + 1 << ". karakter: " << Tmb[i] << endl;
    }

    // 3. Egész számok megjelenítése index szerint
    cout << "\n--- Szamtomb elemei ---" << endl;
    for (int i = 0; i < 8; i++)
    {
        cout << i + 1 << ". szam: " << tmb[i] << endl;
    }

    return 0;
}