Vissza

Labor 8, haladóknak


Struktúrák, Unionok
I.
Egy szövegállomány minden egyes sora egy vezetéknevet, egy keresztnevet, egy dátumot (év, hónap, nap) tartalmaz. Olvassuk ki ezeket az adatokat egy stuktútra típusú tömbe és határozzuk meg minden esetben, hogy az adott személy :
     a. az évhányadik napján született
     b. a hét melyik napján született (vasárnap, hétfő, stb...)
     c. mikor van a névnapja, melyhez használjuk ezt az állományt.
    Pl:
    Varga Katalin 2004 4 16 -> 76, Kedd, November 25
    Székely János 2000 9 7 -> 251, Csütörtök, December 27

Megjegyzés: Egy év akkor szökőév, ha
osztható 4-gyel és nem osztható 100-zal vagy osztható 400-zal.

II.
1. Hasonlítsuk össze a qsort rendezési időigényeit egy struktúra tömb esetében, ha egyszer a tömbelemek cseréjekor az egész strukturát felcseréljük, másodszor, meg csak a struktúrára ráirányított mutatókat cseréljük fel. (segítség)
2. Határozzuk meg egy egész, illetve egy valós számokat tartalmazó tömb elemeinek az átlagértékét. Az adatok eltárolására alkalmazzuk a következő uniont (segítség):
enum Tipus { Egesz, Valos };
struct Szamsor {
    enum Tipus fajta;
    int n;
    union {
        struct { int *etomb; } egeszAdat;
        struct { double *vtomb; } valosAdat;
    } szamsorAdat;
};


Megoldott feladatok:
1. Egy struktúra típusú tömb rendezése, abban az esetben, mikor a struktúrára ráirányított mutatók cseréjét végezzük:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define M 50000

typedef struct Szemely{
    int kod;
    char nev[20];
}Szem;

int comp (const void*, const void *);

int main(){
    Szem *tomb;
    Szem **p;
    int i;
    clock_t st, fs;
    tomb = (Szem*)calloc(M, sizeof(Szem));
    p = (Szem**)calloc(M, sizeof(Szem*));
    for(i=0; i<M; ++i)
        p[i] = (Szem*)calloc(M, sizeof(Szem));
    for(i=0; i<M; ++i){
        p[i] = &tomb[i];
    }
  
    printf("Sorting...");
    st = clock();
    qsort(p, M, sizeof(Szem*), comp);
    fs = clock();
    printf("\n\nSorting time: %lf\n\n", (double)(fs-st)/CLOCKS_PER_SEC);
}

int comp (const void* a, const void *b){
    Szem**x = (Szem**)a;
    Szem**y = (Szem**)b;
    return (*x)->kod - (*y)->kod;
}
}

2. Határozzuk meg egy téglalap, egy négyzet és egy kör területét:
#include <stdio.h>
#include <stdlib.h>

#define _USE_MATH_DEFINES
#include <cmath>


enum AlakzatTipus { Teglalap, Kor, Negyzet };
struct Alakzat {
    enum AlakzatTipus fajta;
    union {
        struct { int mag, szel; } teglalapAdat;
        struct { int sugar; } korAdat;
        struct { int oldal;} negyzetAdat;
    } alakzatAdat;
};

double terulet(struct Alakzat* s);
int main()
{
    Alakzat *s = (Alakzat*)malloc(sizeof(Alakzat));
    int x, y1, y2, z;
    s->fajta = Kor;
    printf("A kor sugara: ");
    scanf("%i", &x);
    s->alakzatAdat.korAdat.sugar = x;
    printf("Kor terulet: %lf\n\n", terulet(s));

    s->fajta = Teglalap;
    printf("A teglalap magassaga: ");
    scanf("%i", &y1);
    printf("A teglalap szelssege: ");
    scanf("%i", &y2);

    s->alakzatAdat.teglalapAdat.mag = y1;
    s->alakzatAdat.teglalapAdat.szel = y2;
    printf("Teglalap terulet: %lf\n\n", terulet(s));

    printf("A negyzet oldala: ");
    scanf("%i", &z);
    s->fajta = Negyzet;
    s->alakzatAdat.negyzetAdat.oldal = z;
    printf("Negyzet terulet: %lf\n\n", terulet(s));
    free (s);


    return 0;
}

double terulet(struct Alakzat* s) {
    if( s->fajta == Teglalap ) {
        int mag, szel;
        mag = s->alakzatAdat.teglalapAdat.mag;
        szel = s->alakzatAdat.teglalapAdat.szel;
        return szel * mag;
    } else if ( s->fajta == Kor ) {
        int sugar;
        sugar = s->alakzatAdat.korAdat.sugar;
        return M_PI * sugar * sugar;
    }
    else if (s->fajta == Negyzet){
        int oldal = s->alakzatAdat.negyzetAdat.oldal;
        return oldal*oldal;
    }
}

Vissza