#include <iostream>
#include <iomanip>
#include <ctime>
#include <cmath>
#include <string>
#include "fgv.hpp"
#include "szinek.h"
#include <locale.h>
using namespace std;
// === STATIC, INLINE, EXTERN, PREPROCESSZOR MAGYARÁZATOK ===
/*
static kulcsszó (függvény előtt):
- Ha egy függvényt static-kal jelölsz meg egy forrásfájlban (.cpp),
akkor az a függvény csak abban a fájlban lesz látható (nem "exportálódik" másik fordítási egységbe).
- Ez védi a függvényt a névütközéstől nagyobb projekteknél, és a linker nem fogja keresni máshol.
- Használata főleg segédfüggvényekhez, amiket csak az adott file-ban akarsz megtartani.
inline kulcsszó:
- Az inline függvények "beillesztődnek" a hívás helyére, ha a fordító úgy dönt.
- Fontosabb szerepe, hogy ha egy függvényt headerbe (több helyre) írsz, akkor
inline-nal megengeded, hogy több példányban is leforduljon (nem lesz linker error).
- Nem kell, ha: Deklaráció a headerben, azaz csak prototípus, definíció a .cpp-ben
extern kulcsszó:
- Az extern kulcsszóval deklarált változó "valahol máshol" van ténylegesen létrehozva (definiálva).
Itt csak bejelented, hogy létezik.
- Így másik forrásfájlban is el tudod érni azt a globális változót, de csak egy helyen lehet a definíció!
Példa:
// globals.cpp
int laborszam = 42; // Itt van a memóriában
// main.cpp
extern int laborszam; // Csak deklaráljuk, NEM hozunk létre új változót
- A main-ben így simán tudod használni, mintha itt hoztad volna létre.
#ifdef / #endif direktívák:
- Feltételes fordítást tesznek lehetővé. A közöttük lévő kód CSAK akkor fordul le, ha a makró definiálva van.
- Használhatod pl. DEBUG üzemmódhoz.
#define DEBUG
#ifdef DEBUG
// debug kód
#endif
- A makrót megadhatod a forrásban (#define), vagy fordításkor (g++ main.cpp -DDEBUG)
#pragma region / #pragma endregion
- Összecsukható blokkok a modern editorokban (VS Code, Visual Studio, CLion, stb.)
- A fordítóra nincs hatással, csak a kód átláthatóságát növeli!
- Bármilyen blokkot összecsukhatóvá tehetsz velük.
#pragma message
- Fordításkor jelenít meg üzenetet a build kimenetben.
- Pl. #pragma message("Ez csak egy figyelmeztetés!")
*/
// Segédfüggvény (csak ebben a file-ban látható, nem exportálódik)
static double negyzet(double x) {
return x * x;
}
// Saját stream-manipulátor (headerben inline, main-ben static is lehet)
inline static std::ostream& dendl(std::ostream& os) {
return os << std::endl << std::endl;
}
// Extern példa: valódi definíció a globals.cpp-ben!
extern int laborszam;
int main() {
setlocale(LC_ALL, ""); // magyar ékezetek
srand((unsigned int)time(nullptr));
cout << FELKOVER << KEK << "=== Labor: Függvények, Tömbök, Sablonok, Overload ===" << ALAP << dendl;
#pragma region Dinamikus tömb létrehozása, feltöltése és kiíratása
int meret;
cout << FELKOVER << SARGA << "Add meg, hány elemet szeretnél a tömbbe: " << ALAP;
cin >> meret;
if (meret < 3) {
cout << FELKOVER << PIROS << "Legalább 3 elem kell az átlagoláshoz!" << ALAP << endl;
return 1;
}
int* egesz_tomb = new int[meret];
double* valos_tomb = new double[meret];
for (int i = 0; i < meret; i++) {
egesz_tomb[i] = rand() % 201 - 100; // -100..100
valos_tomb[i] = (double)(rand()) / RAND_MAX * 200 - 100;
}
cout << FELKOVER << SARGA << "Egész szám tömb:" << ALAP << " ";
for (int i = 0; i < meret; i++)
cout << KEK << setw(5) << egesz_tomb[i] << ALAP;
cout << dendl;
cout << FELKOVER << CIAN << "Valós szám tömb:" << ALAP << " ";
for (int i = 0; i < meret; i++)
cout << ZOLD << setw(8) << setprecision(4) << valos_tomb[i] << ALAP;
cout << dendl;
#pragma endregion
#pragma region Tömbátlagok és overload példák
cout << SARGA << "Egész tömb átlaga (szélsőértékek nélkül): "
<< ZOLD << tomb_atlag(egesz_tomb, meret) << ALAP << dendl;
cout << CIAN << "Valós tömb átlaga (szélsőértékek nélkül): "
<< KEK << tomb_atlag(valos_tomb, meret) << ALAP << dendl;
cout << LILA << "Értelmetlen overload teszt (paraméter nélkül): "
<< PIROS << tomb_atlag() << ALAP << dendl;
cout << LILA << "Értelmetlen overload teszt (4.5): "
<< PIROS << tomb_atlag(4.5) << ALAP << dendl;
#pragma endregion
#pragma region Sablonos és referenciás csere bemutató
int a = 5,
b = 13;
cout << FELKOVER << "Csere előtt: " << ALAP
<< ZOLD << "a = " << a << ALAP << ", "
<< KEK << "b = " << b << ALAP << dendl;
csere(&a, &b);
cout << SARGA << "Mutatós csere után: "
<< ZOLD << "a = " << a << ALAP << ", "
<< KEK << "b = " << b << ALAP << dendl;
csere_referencia(a, b);
cout << CIAN << "Referenciás csere után: "
<< ZOLD << "a = " << a << ALAP << ", "
<< KEK << "b = " << b << ALAP << dendl;
csere_sablon(a, b);
cout << LILA << "Sablonos csere után: "
<< ZOLD << "a = " << a << ALAP << ", "
<< KEK << "b = " << b << ALAP << dendl;
string sz1 = "alma", sz2 = "körte";
csere_sablon(sz1, sz2);
cout << FELKOVER << SARGA << "Sablonos csere stringgel: " << ALAP
<< ZOLD << "sz1 = " << sz1 << ALAP << ", "
<< KEK << "sz2 = " << sz2 << ALAP << dendl;
#pragma endregion
#pragma region Függvénypointerek és névtér
matematikai_fgv* f = negyzet;
cout << CIAN << "Függvénypointer (negyzet): "
<< ZOLD << "f(3) = " << f(3) << ALAP << dendl;
f = sin;
cout << CIAN << "Függvénypointer (sin): "
<< ZOLD << "f(3) = " << f(3) << ALAP << dendl;
korszeru::kiir(42);
#pragma endregion
#pragma region Extra dolgok
// INFINITY példa
cout << FELKOVER << KEK << "INFINITY kulcsszó használata:" << ALAP << dendl;
double vegtelen = INFINITY,
nulla = 0,
osztas_nullaval = 1.0 / nulla;
cout << SARGA << "Az INFINITY konstans értéke: " << ALAP << ZOLD << vegtelen << ALAP << endl;
cout << SARGA << "1.0 / 0.0 eredménye: " << ALAP << ZOLD << osztas_nullaval << ALAP << dendl;
if (osztas_nullaval == INFINITY) {
cout << FELKOVER << ZOLD << "A lebegőpontos osztás nullával eredménye: INFINITY" << ALAP << dendl;
}
//1. módszer
//#define DEBUG
//2.: Solution Explorerben → Properties → Configuration Properties → C/C++ → Preprocessor (Előfeldolgozó), ide be: DEBUG
//Előző félévben pl. _CRT_SECURE_NO_WARNINGS makróval már találkozhattunk.
#ifdef DEBUG
cout << FELKOVER << PIROS << "[DEBUG] Ez csak akkor látszik, ha a DEBUG makró be van kapcsolva!" << ALAP << dendl;
cout << FELKOVER << LILA << "[DEBUG] Változó laborszam értéke (extern példa): " << laborszam << ALAP << dendl;
#endif
// #pragma message: fordítási figyelmeztetés (build időben, nem futásidőben!)
#pragma message ("Fordítási figyelmeztetés: Ez egy demonstrációs program!")
#pragma endregion
#pragma region Dinamikus memória felszabadítás
delete[] egesz_tomb;
delete[] valos_tomb;
#pragma endregion
cout << FELKOVER << ZOLD << "=== A labor vége! ===" << ALAP << dendl;
KIEMELT("Köszönöm a figyelmet", "Sok sikert a pluszpontszerző feladathoz!");
return 0;
}