140 likes | 307 Views
Struktuurid vol2. Struktuuride initsialiseerimisest. Struktuuri initsialiseerimine, kui andmed on järjest esitatud: toode kaup1 = { 4.00 , " Kurk " }; Struktuuri initsialiseerimine, kui andmed on suvalises järjekorras: toode kaup2 = {. hind = 0.50 , . nimetus = " Kapsas " };
E N D
Struktuuride initsialiseerimisest • Struktuuri initsialiseerimine, kui andmed on järjest esitatud:toodekaup1={4.00, "Kurk"}; • Struktuuri initsialiseerimine, kui andmed on suvalises järjekorras:toodekaup2={.hind=0.50, .nimetus="Kapsas"}; • Struktuuride massiivi initsialiseerimine esimesel meetodil:toodekaubad[]={{0.40, "Kiirnuudlid"}, {0.70,"Pelmeenid"}};
Näide 1 1 #include <stdio.h> 2 3 typedefstruct{ 4 float hind; 5 char nimetus[30]; 6 } toode; 7 8 intmain(void){ 9 toodekaup= {.hind=0.50, .nimetus="Kapsas"}; 10 toodekaubad[]={ 11 {0.40, "Kiirnuudlid"}, {0.70,"Pelmeenid"} 12 }; 13 printf("%.2f eur - %s\n", kaup.hind, kaup.nimetus); 14 printf("%.2f eur - %s\n", kaubad[0].hind, kaubad[0].nimetus); 15 printf("%.2f eur - %s\n", kaubad[1].hind, kaubad[1].nimetus); 16 return 0; 17 }
Struktuur struktuuris • Ühe struktuuri saab teise sisse paigutada • Struktuuride järjestus kirjeldamisel on oluline! • Eraldajana struktuuride vahel kasutusel punkt typedefstruct{ unsigned paev; unsigned kuu; unsigned aasta; } kuuPaev; typedefstruct{ char eesnimi[15]; char perenimi[15]; kuuPaevkp; } isik;
Näide 2 intmain() { isiktootaja; strcpy(tootaja.eesnimi, "Andres"); strcpy(tootaja.perenimi, "Haab"); tootaja.kp.aasta= 1985; tootaja.kp.kuu= 4; tootaja.kp.paev= 14; printf("%s %s - %u.%u.%u", tootaja.eesnimi, tootaja.perenimi, tootaja.kp.paev, tootaja.kp.kuu, tootaja.kp.aasta); return 0; } typedefstruct{ unsigned paev; unsigned kuu; unsigned aasta; } kuuPaev; typedefstruct{ char eesnimi[15]; char perenimi[15]; kuuPaevkp; } isik;
Struct tagastusega funktsioon • Meenutame, et struktuur oli andmetüüp – seega ka funktsiooni tagastus võib olla struktuur • Struktuur tüüpi funktsioon tagastab ühetervikliku struktuuri. Loome struktuuri tüübidefinitsiooni Loome funktsiooni prototüübi Loome funktsiooni typedefstruct{ intx, y; } punkt; punktsisestaPunkt(); punktsisestaPunkt(){ punktajutine; ajutine.x = 5; ajutine.y = 7; return ajutine; }
Näide 3 1 #include <stdio.h> 2 #include <math.h> 3 4 typedefstruct{ 5 intx, y; 6 } punkt; 7 8 punktsisestaPunkt(intnr); 9 10 intmain(){ 11 punktsirge[2]; 12 sirge[0]=sisestaPunkt(1); 13 sirge[1]=sisestaPunkt(2); 14 printf("Loigupikkus on %.2f", sqrt(pow(sirge[1].x - sirge[0].x, 2) + pow(sirge[1].y - sirge[0].y, 2))); 15 return 0; 16 } 17 18 punktsisestaPunkt(intnr){ 19 punktajutine; 20 printf("Sisestapunkti %d x ja y kordinaat\n> ", nr); 21 scanf("%d %d", &ajutine.x, &ajutine.y); 22 return ajutine; 23 }
Viitamisega seotud operatsioonid • int *p // viida deklareerimine • &muutuja // muutujalt aadressi pärimine • *p // viidatava väärtuse poole pöördumine • p = &muutuja // viidale muutuja aadressi omistamine • *p = 55 // viidatavale mälupesale andmete kirjutamine • printf("%p", p) // viidal salvestatud aadressi trükkimine • printf("%d", *p) // viidataval aadressil olevate andmete trükkimine
Viitadest visuaalselt #include <stdio.h> intmain(void){ intnum=25, *p; p=# return 0; } *p0199FF8A num 25
Viidad ja massiivid visuaalselt *p48F9AC91 intarray[]={5,3,7,3,5}; int*p; p =array; array[0]5 array[1]3 array[2]7 array[3]3 array[4]5 *(p+0) *(p+1) *(p+2) *(p+4) *(p+3)
Viidad ja struktuurid • Struktuuridele annab samamoodi viidata structtootaja{ inttootajaKood; char eesnimi[20]; char perenimi[20]; float tunnitasu; }; structtootaja indrek; structtootaja *strPtr; strPtr = &indrek;
Viida kaudu pöördumine Need 2 kirjutusviisi on samaväärsed! (*strPtr).tootajakood; (*strPtr).eesnimi; (*strPtr).perenimi; (*strPtr).tunnitasu; strPtr->tootajakood; strPtr->eesnimi; strPtr->perenimi; strPtr->tunnitasu; Peab meeldima!
Näide 4 1 #include <stdio.h> 2 #include <string.h> 3 4 typedefstruct{ 5 inttootajaKood; 6 char eesnimi[20]; 7 char perenimi[20]; 8 float tunnitasu; 9 } tootaja; 10 11 void trykiInfo(tootaja*ptr); 12 13 intmain(void) { 14 tootajaIndrek={75, "Indrek", "Tamm", 2.75}; 15 trykiInfo(&indrek); 16 return 0; 17 } 18 19 void trykiInfo(tootaja*ptr){ 20 printf("Tootaja %06d, %s %s teenibtunnis %2.2f", 21 ptr->tootajaKood, ptr->eesnimi, ptr->perenimi, ptr->tunnitasu); 22 }
Tunnitöö • Loe sisse failidest ja salvesta struktuuridesse: • Tooted – tootekood, toote nimetus • Laoseis – tootekood, laoseis • Sorteeri tooted toote nime alusel tähestikulises järjekorras • Väljasta ainult need tooted, mille laojääk on alla 5 ühiku • Kasuta vähemalt ühes funktsioonis viitasid struktuurile!