/* esimerkki 2 - tietueet */ /* tietueet ovat kätevä tapa paketoida suuri joukko yksittäisiä, * mahdollisesti keskenään eri tyyppisiä tiedon palasia yhdeksi * kokonaisuudeksi. */ #include /* tietue (struct) määritellään seuraavanlaisesti: */ /* ensin varattu sana (avain sana, sininen sana ;-)) 'struct', sitten * nimi tietueelle. Sitten, aaltosulut, joiden sisään kirjoitetaan * tietueen kentät. Kentät kertovat mitä tietoa tähän tietueeseen voi * pistää. */ struct mydata { int n; double volume; /* <-- näitä sanotaan kentiksi */ double mass; }; /* <-- puolipiste pitää muistaa laittaa viimeisen aaltosulkeen * perään */ /* yleensä puolipistettä ei ikinä tule }:n jälkeen - structin sulkevan * aaltosulun jälkeen se kuitenkin tulee! Se on siinä siksi että jos * ohjelmoija haluaa, voisi hän määritellä tietuemuuttujia */ /* tehdään myös yksi funktio, joka saa structeja argumenteikseen: */ double density(struct mydata data); /* tämä palauttaa structeja */ struct mydata readdata(); void main() { /* tietue muuttujia tehdään kuten mitä tahansa muuttujia, tyyppi on * silloin 'struct tietueennimi'. Esim tässä pari 'struct mydata' * tyyppistä muuttujaa: */ struct mydata data1; struct mydata data2 = { 2, 10, 2}; /* tietueet voidaan alustaa näin, * luvut tulee samassa järjetyksessä * kuin tietueen määrittelyssä */ struct mydata *ptr; /* tietuemuuttujat ovat nyt niinkuin säiliöitä, joihin voi pistää * tietueen määrittelyssä kerrottuja tiedonjyviä. Tietuemuuttujassa * oleviin kenttämuuttujiin viitataan kirjoittamalla tietuemuuttujan * perään piste (.) ja sitten kentän nimi: */ data2.n = 1; /* data2:n kenttään 'n' pistetään 1 */ data2.volume = 10; /* kenttään 'volume' 10 */ data2.mass = 20; /* jne... */ /* kun tietuepointterien kenttiin viitataan pisteen sijasta -> * merkillä */ /* Nuoli (->) merkintä on vain lyhennys rakenteesta (*ptr).kenttä! */ ptr = &data1; /* ptr osoittaa data1:een */ ptr->n = 1; ptr->volume = 10; ptr->mass = 1; /* elikkä meillä on nyt: TIETUEET, jotka ovat kokoelmia joitain * mahd. erityyppisiä KENTTIÄ, ja nyt me voidaan tehdä muuttujia, * TIETUEMUUTTUJIA, joiden KENTTÄMUUTTUJIIN me voidaan pistää * kaikenlaista tietoa. Tietoa on nyt helppo käsitellä kun se on * mukavassa taskuunmahtuvassa paketissa (tietuemuuttujassa!) */ /* funktiot voivat saada tietueita argumentteinään -- silloin * sulkuihin kirjoitetaan vain tietuemuuttujan nimi */ printf("data1 density = %lf\n", density(data1)); /* funktiot voivat myös palauttaa tietueita. */ /* tässä readdata antaa tuloksenaan jonkin tietueen struct mydata, * joka sijoitetaan data2 muuttujaan */ data2 = readdata(); } /* funktio density laskee jonkin tiheyden annetusta datasta. */ double density(struct mydata data) { double rho; rho = data.mass / data.volume; return (rho); } /* readdata lukee datan scanfilla, ja antaa tuloksenaan luetun * tietueen. */ struct mydata readdata() { struct mydata data; scanf("%d%lf%lf", &data.n, &data.volume, &data.mass); return (data); }