#include <stdio.h>
#include <time.h>
#include <locale.h>
#include <time.h>
#include <math.h>
#define tombmeret 5
int main() {
setlocale(LC_ALL, "");
srand((unsigned int)time(NULL));
//for (KEZDŐÉRTÉK; FELTÉTEL; INKREMENTÁLÁS) { ...törzs... }
//A for ciklus valójában egy speciális while ciklus!
//A for ciklus szintaxisa és működése átalakítható egy while ciklusra.
//for (int i = 0; i < 5; i++) {
// printf("%d\n", i);
//}
//int i = 0;
//while (i < 5) {
// printf("%d\n", i);
// i++;
//}
int kezd_ev = 1970, aktualis_ev = 2025, szokoevek_szama = 0;
//for (kezd_ev; kezd_ev < aktualis_ev; kezd_ev++) { //1. Jó kód - külső változó a kezdeti feltétel: miért nem érdemes? A kezd_ev elmegy aktualisig,
// fölösleges tárolás+hibalehetőség ha még később használnánk
// if (kezd_ev % 4 == 0) {
// szokoevek_szama++;
// if (kezd_ev % 100 == 0)
// szokoevek_szama--;
// if (kezd_ev % 400 == 0)
// szokoevek_szama++;
// }
//}
//printf("szököévek száma: %i\n", szokoevek_szama);
//printf("kezd_ev=%i\n", kezd_ev);
for (int kezd_ev=1970; kezd_ev < aktualis_ev; kezd_ev++) { //2. "Jobb" kód
if (kezd_ev % 4 == 0) {
szokoevek_szama++;
if (kezd_ev % 100 == 0)
szokoevek_szama--;
if (kezd_ev % 400 == 0)
szokoevek_szama++;
}
}
printf("szököévek száma: %i\n\n", szokoevek_szama);
printf("------------------------------------------------------------------------------------------------\n");
//for (kezd_ev, kezd_ev < aktualis_ev; kezd_ev++;) { //Tipikus hiba #1 bemutatása
//Nem lép ki a ciklusból
//for (int kezd_ev = 1970 < aktualis_ev; kezd_ev++;) { //Tipikus hiba #2 bemutatása - kezd_ev 0-val kezdődik,
//mivel egy értékadás lesz, mint logikai kifejezés
//kiértékelés - kap egy 1-est, mint igaz, majd lépeget.
//és ki se fog lépni a ciklsból
/*
if (kezd_ev % 4 == 0) {
szokoevek_szama++;
if (kezd_ev % 100 == 0)
szokoevek_szama--;
if (kezd_ev % 400 == 0)
szokoevek_szama++;
}
}
printf("szököévek száma: %i\n", szokoevek_szama);
*/
//Statikus tömbök
int tarolo[10]; //0-val kezdődik, 9-el végződik
//int meret = 10; //Nem lehetséges!
//int taroloka[meret]; //Debughoz hasznos lehetőség: #define-al egy konstans használata
int taroloka[tombmeret];
int kontener[] = { 1,2,3,4,5,6,7,8,9,10 };
printf("kontener teljes merete: %i byte\n\
\relso (0.) elemének mérete: %i byte\n", sizeof(kontener), sizeof(kontener[0]));
for (int i = 0; i < 10; i++) { //Ezért nagyon kellemesen olvasható a < 10 feltétel!
tarolo[i] = rand();
printf("%i. random szám: %i\n", i + 1, tarolo[i]);
}
//for (int i = 0; i < sizeof(tarolo); i++) { //Tipikus hiba #3 - sizeof(tarolo) 100-at ad vissza
// tarolo[i] = rand();
// printf("%i. random szám: %i\n", i + 1, tarolo[i]);
//}
for (int i = 0; i < (sizeof(tarolo)/sizeof(int)); i++) { //Lehet így is de tulajdonképpen fölösleges
tarolo[i] = rand();
printf("%i. random szám: %i\n", i + 1, tarolo[i]);
}
for (int i = 9; i >= 0; i--) { //Vigyázat! 9-től kell kezdeni tarolo[10] kicímzés lenne
printf("tarolo[%i] = %i\n", i, tarolo[i]); //>= a 0. elem miatt is.
}
int tarolo2d[2][3];
for (int i = 0; i < 2; i++) { //Ez a két sor felcserélhető
for (int j = 0; j < 3; j++) {
tarolo2d[i][j] = rand();
printf("tarolo2d[%i][%i] = %i\n", i, j, tarolo2d[i][j]);
}
}
int tarolo5d[1][2][3][2][1];
for (int i = 0; i < 1; i++) { //Tetszőleges permutációban is működik...
for (int j = 0; j < 2; j++) {
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 2; l++) {
for (int m = 0; m < 1; m++) {
tarolo5d[i][j][k][l][m] = rand();
printf("tarolo5d[%i][%i][%i][%i][%i] = %i\n", i, j,k,l,m, tarolo5d[i][j][k][l][m]);
}
}
}
}
}
int tomb[tombmeret] = { 64, 34, 25, 12, 22};
printf("Eredeti tömb: \n");
for (int i = 0; i < tombmeret; i++) {
printf("%d ", tomb[i]);
}
printf("\n");
//Buborékrendezés inline
for (int i = 0; i < tombmeret - 1; i++) {
for (int j = 0; j < tombmeret - i - 1; j++) {
if (tomb[j] > tomb[j + 1]) {
int csere = tomb[j];
tomb[j] = tomb[j + 1];
tomb[j + 1] = csere;
}
}
}
printf("Rendezett tömb: \n");
for (int i = 0; i < tombmeret; i++) {
printf("%d ", tomb[i]);
}
printf("\n");
//Véges pontosságú valós számok problémája
double a = 0.1 + 0.2;
double b = 0.3;
//double epsilon = 1e-15;
double epsilon = 1e-20; //Ezzel már nem egyenlő
//Ha a két szám közötti különbség kisebb, mint epsilon, akkor egyenlőnek tekinthetők
if (fabs(a - b) < epsilon) {
printf("A két szám egyenlő.\n");
}
else {
printf("A két szám nem egyenlő.\n");
}
return 0;
}
//Gyakorló feladatok:
//1. Feladat
//Készítsünk egy 2d-s tömböt, amely téglalapok oldalméreteit fogja tárolni.
//Töltsük fel 10-50-ig random számokkal
//A téglalapok területeit írassuk ki sorban és visszafele is
//A téglalapok közül a legnagyobb és legkisebb területűnek területét válasszuk ki - írassuk ki
//A téglalapok egyik oldalának hosszát változtassuk 2-szeresére, a másik oldalak hosszát 3-szorosára
//A téglalapok kerületeit olvassuk be egy tömbbe.
//A kerületeket tartalmazó tömböt vizsgáljuk meg, hány éri el legalább a legnagyobb és legkisebb kerületű téglalapok kerületének átlagát.
//
//2. Feladat
//Olvassunk be egy számot
//a) Döntsük el for ciklussal, hogy az adott szám prímszám-e
//b) Ha nem prím szám hány féle számmal oszható
//c) Melyik osztó szerepel benne a legtöbbször
//
//3. Feladat
//Csináljunk egy n*2*2-es tömböt, töltsük fel számokkal.
//Írassuk ki a tömböknek megfelelő 2*2-es mátrixok determinánsait.
//Döntsük el sorban, hogy van-e valós gyöke a 2x2-es mátrixok karakterisztikus polinomjainak: lambda^2-Trace(M)+det(M)=0, diszkrimináns nemnegatív...
//Ha van intervallumfelezéssel keressük meg közelítőleg.
//
//4. Feladat (2.ZH nehézségi szint)
//b) 3*3-assal is csináljuk meg a determináns kiiratást
//c) Íjunk egy programot ami egy 3x3-as mátrixokhoz tartozó
// karakterisztikus polinom gyökeiből egyet meghatároz intervallumfelezéssel - Tippek: 1 vagy 3 valós gyök van mindig.
//
// lambdák - sajátértékek
// det(M)=lambda1*lambda2*lambda3 (Determináns)
// trace(M)=l1+l2+l3 (Nyom)
// S(M): ae+ai+ei-(bd+cf+gh) (Másodrendű főminorok)
// a b c
// M:= d e f S(M) = ae+ai+ei-(bd+cf+gh)
// g h i
// trace(M) = a+e+i
//
// karakterisztikus polinom: -lambda^3+Trace(M)*lambda^2-S(M)*lambda+detM
//
// Extra tipp a lehetséges intervallumra: Gershgorin-tétel