Fizikus C labor

1. óra: ismerkedés a fejlesztőkörnyezettel2. óra: ciklusok3. óra: számelméleti feladatok
4. óra: számítás valós számokkal5. óra: sok adat beolvasása, tömbök6. óra: iteráció, könyvtári sztringkezelő függvények
7. óra: függvények és sztringek8. óra: cím szerinti és tömb paraméterek, struktúrák, dinamikus tömbök9. óra: rendezés, fájlkezelés, parancssori paraméterek
10. óra: állapotgép, szabványos I/O átirányítása11. óra: rekurzió, gyakorlás12. óra: láncolt listák, fák
13. óra: NHF beadás

Rajzoljunk a konzol ablakba Windowson

9. alkalom: cím szerinti és tömb paraméterek, struktúrák, dinamikus tömbök

1. feladat

Írj függvényt, amely két komplex szám valós és képzetes részét kapja két-két, double típusú változóban, kiszámítja és (cím szerinti paraméterként) visszaadja a két komplex szám összegét! Egészítsd ki teljes programmá, amelyben kipróbálod a függvényt!

2. feladat

Definiálj struktúrát kompex számok tárolására! Írj függvényt, amely összeszoroz két komplex számot! Mutasd be a függvény használatát!

3. feladat

Írj egy-egy függvényt, amely egy valós számokból álló tömbben megkeresi a legkisebb értéket, és
a) visszaadja azt.
b) paraméterként visszaadja azt.
c) visszaadja az indexét.
d) visszaadja a címét.

4. feladat

Írj függvényt, amely lemásol egy egész számokból álló tömböt!

5. feladat

Írj függvényt, amely egy egész számokból álló tömböt kap, és egy éppen megfelelő méretű dinamikus tömbben visszaadja a bemenő tömbben szereplő páros értékeket! Teljes programban mutasd be a függvény használatát! Tipp: az eredmény tömb méretét is vissza kell adni.

6. feladat

Definiálj struktúrát valós 2D vektor tárolására! Írj függvényt, amely 2D vektorok tömbjét kapja, és egy éppen megfelelő méretű dinamikus tömbben adja vissza a 2-nél hosszabb vektorokat! Teljes programban mutasd be a függvény használatát!

Az órai feladatok mintamegoldása

1. feladat
#include <stdio.h>

void komplex_add(double re1, double im1, double re2, double im2, double *pre, double *pim){
    *pre = re1 + re2;
    *pim = im1 + im2;
}

int main(){
    double re1=3.14, im1=6.92, re2, im2;

    komplex_add(re1, im1, 10.0, -2.0, &re2, &im2);

    printf("%g%+gi\n", re2, im2);

    return 0;
}

 

2. feladat
#include <stdio.h>

typedef struct { double re,im; } Komplex;

Komplex szorzo(Komplex a, Komplex b){
    Komplex eredmeny;
    eredmeny.re = a.re*b.re - a.im*b.im;
    eredmeny.im = a.re*b.im + b.re*a.im;
    return eredmeny;
}

int main(){
    Komplex x={3,-2}, y={5,7}, z;

    z = szorzo(x,y);
    printf("%g%+gi\n",z.re,z.im);
    
    return 0;
}

 

3. feladat
#include <stdio.h>

double keres_a(double t[], int meret){
    int i,min;

    min=0;
    for(i=1; i<meret; i++){
        if(t[i]<t[min])
            min = i;
    }

    return t[min];
}

void keres_b(double t[], int meret, double *ret){
    int i,min;

    min=0;
    for(i=1; i<meret; i++){
        if(t[i]<t[min])
            min = i;
    }

    *ret = t[min];
}

int keres_c(double t[], int meret){
    int i,min;

    min=0;
    for(i=1; i<meret; i++){
        if(t[i]<t[min])
            min = i;
    }

    return min;
}

double* keres_d(double t[], int meret){
    int i,min;

    min=0;
    for(i=1; i<meret; i++){
        if(t[i]<t[min])
            min = i;
    }

    return &t[min]; // Tömbelem címe.
}

int main(){
    double tomb[10] = { 1, 2, 3, -5, 6, 4, 3.14, -6.1, 125e8, 999.999 };
    double eredmeny,*pmin;
    int index;

    printf("%g\n", keres_a(tomb,10));
    keres_b(tomb,10,&eredmeny);
    printf("%g\n", eredmeny);
    printf("%g\n", tomb[keres_c(tomb,10)]);
    printf("%g\n", *keres_d(tomb,10));

    return 0;
}

 

4. feladat
void masol(int cel[], int forras[], int meret){
    int i;
    for( i=0; i<meret; i++ )
        cel[i] = forras[i];
}

int main(){
    int a[6]={1, 2, 3, 4, 5, 6}, b[6]; // A céltömb lehetne nagyobb is, mint a forrás
    masol(b,a,6); // tömböt másolni b=a; módon nem lehet, az elemeket egyenként kell
    return 0;
}

 

5. feladat
#include <stdio.h>
#include <stdlib.h>

int * parosak(const int be[], size_t n, size_t * ki_n) {
    size_t db = 0;
    for (size_t i = 0; i < n; i++)
        if (be[i] % 2 == 0)
            db++;
    int * ki = (int*)malloc(db*sizeof(int));
    *ki_n = db; // Méret visszaadása
    size_t j = 0;
    for (size_t i = 0; i < n; i++)
        if (be[i] % 2 == 0) {
            ki[j] = be[i]; // Különböző indexek!
            j++;
        }
    return ki;
}

int main() {
    int t[10] = {6, -5, -4, 77, 1000, 0, -1111, -888, 911, 366 };
    size_t n;
    int * ki = parosak(t, 10, &n);
    for (size_t i = 0; i < n; i++)
        printf("%d\n", ki[i]);
    free(ki);
    return 0;
}

 

6. feladat
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct {
    double x, y;
} Vektor;

double Vektor_hossz(const Vektor v) {
    return sqrt(v.x*v.x + v.y*v.y);
}

Vektor * hosszuak(const Vektor be[], size_t n, size_t * ki_n) {
    size_t db = 0;
    for (size_t i = 0; i < n; i++)
        if (Vektor_hossz(be[i]) > 2)
            db++;
    Vektor * ki = (Vektor*)malloc(db*sizeof(Vektor));
    *ki_n = db; // Méret visszaadása
    size_t j = 0;
    for (size_t i = 0; i < n; i++)
        if (Vektor_hossz(be[i]) > 2){
            ki[j] = be[i]; // Különböző indexek!
            j++;
        }
    return ki;
}

int main() {
    Vektor t[5] = { {3,2}, {-1,1}, {-1.5,1.5}, {0,0}, {5,1} };
    size_t n;
    Vektor * ki = hosszuak(t, 5, &n);
    for (size_t i = 0; i < n; i++)
        printf("(%g, %g)\n", ki[i].x, ki[i].y);
    free(ki);
    return 0;
}