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