#include <stdio.h> // printf, scanf(_s)
#include <stdlib.h> // RANAD_MAX, malloc
#include <math.h> // matematikai készlet
#include <time.h> // time
//Függvények prototípusa //.h fájlban a helyük
double szumma(double, double, double);
void haromszoros(double);
void csere_a(int a, int b);
void csere_p(int* a, int* b);
//tömb átadása
double tatlag(double* t, int n); // pointer + méret
void tkiir(double* t, int n); // pointer + méret
//2D-s pont
struct p2D
{
double x;
double y;
};
struct p2D felez(struct p2D A, struct p2D B);
void kiir(struct p2D P); // érték szerinti paraméter átadás
void torol(struct p2D* P); // pointeres, hogy meg lehessen változtatni
double szakaszhossz(struct p2D* szakszhossz, int meret);
int main(void)
{
// véletlen szám generátor
srand((unsigned int)time(NULL));
int a = 5;
int b = 10;
// függvények hívása
double c = szumma(a, b, 3);
if (isnan(c)) //értelmes-e a visszakapott adat?
printf("Nincs megoldas\n");
else
haromszoros(c);
// nem működik
csere_a(a, b); // csak érték átadás történik
printf("a: %i b: %i\n", a, b);
// pointeres verzió
csere_p(&a, &b); // az adatok címét kell megadni
printf("a: %i b: %i\n", a, b);
int meret;
printf("Dinamikus tomb merete:");
scanf("%d", &meret); // menet közben derül ki, mennyi elemre is van szükség
double* t = (double*)malloc(sizeof(double) * meret); // dinamikus tömb
for (int i = 0; i < meret; i++)
t[i] = (double)rand() / RAND_MAX * 1000 - 500; // -500 és 500 közötti
printf("Atlag: %3.2lf\n", tatlag(t, meret)); // tömb átadása fgv.-nek
// statikus struktúrák
struct p2D A = { 10,20 };
struct p2D B, C;
B.x = 0;
B.y = 10;
C = felez(A, B); // fgv. hívása
struct p2D* D = &C; // pointer
printf("Fele [%.2lf;%.2lf]\n", C.x, C.y);
printf("Fele [%.2lf;%.2lf]\n", (*D).x, D->y);
kiir(C);
kiir(*D);
torol(&C);
torol(D);
// HF szakasz hossza
// dinamikus tömb
struct p2D* szakasz = (struct p2D*)malloc(sizeof(struct p2D) * meret);
for (int i = 0; i < meret; i++)
{
szakasz[i].x = i; // így is lehetne: (*(szakasz + i)).x = i;
szakasz[i].y = t[i]; // így is lehetne: (szakasz + i)->y = t[i];
}
// függvény segítségével határozzuk meg a szakaszok hosszát
printf("A szakaszok hossza: %.3lf\n", szakaszhossz(szakasz, meret));
// dinamikus tartalmak felszabadítása
free(t);
free(szakasz);
return 0;
}
// függvény visszatérési értékkel
double szumma(double a, double b, double c)
{
if (a < 0) return NAN; // ha nincs értelmes visszatérési érték, akkor Not a Number-el tér vissza
return a + b + c;
}
// eljárás (nincs visszatérési értéke)
void haromszoros(double szam)
{
printf("A szam haromszorosa: %lf", szam * 3);
}
// érték szerinti paraméter átadás
void csere_a(int a, int b) //a és b lokális egész számok
{
int tmp = a; a = b; b = tmp;
}
// mutató használata
void csere_p(int* a, int* b) //a és b egészre mutató pointerek
{
int tmp = *a; *a = *b; *b = tmp;
}
// double tomb átlagát adja
double tatlag(double* t, int n)
{
double summa = 0;
for (int i = 0; i < n; i++) summa += t[i];
return summa / n;
}
// double tomb elemeit írja ki
void tkiir(double* t, int n)
{
for (int i = 0; i < n; i++) printf("%f\n",t[i]);
}
// 2 pont felezőpontja
struct p2D felez(struct p2D A, struct p2D B)
{
struct p2D fele;
fele.x = (A.x + B.x) / 2;
fele.y = (A.y + B.y) / 2;
return fele;
}
// point koordinátáinak kiírása
void kiir(struct p2D P)
{
printf("[%.2f;%.2f]", P.x, P.y);
}
// point koordinátái 0,0
void torol(struct p2D* P)
{
P->x = 0;
(*P).y = 0;
}
// szakaszok hossza
double szakaszhossz(struct p2D* P, int meret)
{
double hossz = 0;
for (int i = 0; i < meret - 1; i++)
hossz += sqrt(pow(P[i].x - P[i + 1].x, 2) + pow(P[i].y - P[i + 1].y, 2));
return hossz;
}