Heipä hei! Voisiko joku kertoa mitä struktuurit on ja mitä käytännön hyötyä niistä on. Ja sitten vielä miten sitä käytetään. Jos viitsisitte käytännön esimerkkejä pistellä.
Ja vielä semmoinen toivomus että elkää pistelkö linkkejä, ellei niistä todella ole hyötyä ja postatkaa vain hyödyllisiä kommentteja eikä sellaisia missä kerrotte "Etsi" nappulan hienoista ominaisuuksista.
Eli siis C/C++:lle struktuureja?
No ainakin C:ssä menee yksinkertainen struktuuri näin:
struct kohta { int x; int y; };
jolloin voi olla joko kohta.x tai kohta.y.
..ja noitahan voi tietenkin laittaa taulukkoon.
Vaikka:
struct ukkeli { int x; int y; int health; };
Jolloin voidaan tehdä vaikka peliin taulukko kentällä olevista vastustajista:
ukkeli vastustajataulu[10];
Jolloin päästään vaikka loopissa käsiksi vastustajiin näin:
vastustajataulu[5].x = 10;
Struktuuri eli tietue on C:n tietorakenne, jolla voidaan "paketoida" yhteenkuuluvia tietoja. Tietueen määrittelyssä luodaan abstrakti malli, ja kerrotaan siihen kuuluvat kentät, eli tietynnimiset muuttujat tai jopa toiset tietueet. Tähän tapaan:
struct Henkilo { char nimi[40]; int ika; int puhnro; };
Pelkällä määrittelyllä ei kuitenkaan tehdä vielä mitään, vaan itse ohjelmassa voi luoda vaikka em. Henkilo-tietueita:
Henkilo ekahenkilo = {"Baglair", 16, 123456789};
Tietueen kenttiin voi sitten viitata pisteen avulla:
ekahenkilo.ika = 95; cout << ekahenkilo.puhnro;
Tietueet tuovat ohjelmaan selkeyttä, kun muuttujia tarvittaisiin muuten paljon. C++ ja muut olio-ohjelmointikielet tarjoavat tietueesta vielä paljon kehittyneemmän muodon, luokan. Siinä osa kentistä voidaan määritellä yksityisiksi, jolloin ainoastaan luokka itse voi niitä käyttää. Luokille voi tehdä myös omia jäsenfunktioita - Henkilo-luokalla voisi olla esim. Vaihdanimi, Haenimi jne.
Kannattaa käyttää sitä Etsi-nappulaa. Siinä on paljon hienoja ominaisuuksia :)
Struktuurit eli rakenteet ovat itse määriteltäviä (tai otsikoissa määriteltyjä) ikään kuin muuttujatyyppejä, jotka voivat muodostua useammasta perusmuuttujasta. Käytännön hyödystä esimerkkinä vaikka sellainen, että jos käsittelet koordinaatiston pisteitä, voit käyttää muuttujana suoraan siihen sopivaa rakennetta, eli X- ja Y-koordinaatteja (ja mahd. Z ja monta muuta) ei tarvitse käsitellä jokaista erikseen. Havainnollistava esimerkki:
// Rakenne TPiste (siis Tyyppi Piste), joka sisältää kolme liukulukua struct TPiste { float X, Y, Z; }; // Rakenne TKolmio, joka sisältää kolme pistettä ja kolme lukua struct TKolmio { TPiste A, B, C; float Sivu_AB, Sivu_BC, sivu_CA; // Pituudet }; void Tyhja_Funktio(void) { // Muuttujia TPiste P, Q; TKolmio Kolmikulmio; // C:ssä muuttujamäärittely olisi aina struct-sanan kanssa, // struct TKolmio Kolmikulmio; P.X = 1.0f; P.Y = 2.46f; P.Z = 4.0f; Kolmikulmio.A = P; Kolmikulmio.B = P; Kolmikulmio.B.X = Kolmikulmio.B.Y + 1.4f; }
Edit: Kas, vain muutaman minuutin myöhässä :)
Juuh, mäkään en tykkää valmiista linkeistä, joissa sitten pitäisi osata jotenkin "surffata" siihen oikeaan kohtaan. Parhaita esimerkkejä ovat juuri konkreettiset jutut, miten asia tehdään.
Mutta noihin struktuureihin - toivottavasti harrastat matematiikkaa. Ehdottomasti matemaatikasta löytyy kaikkein ytimekkäimmät ja opettavaisimmat struktuurit:
Kompleksiluku sisnällään toivottavasti ei ole vastemielinen asia. Ainaski mulla fraktaalit iski saman tien. Mutta, struktuurin tarkoitus on kerätä johonkin kontekstiin liittyvät parametrit samaan pakettiin.
Kompleksiluvussa on reaali- ja imaginaariosa. Laskennan yms. käsittelyn kannalta ei ole kauhean kiinnostavaa, miten kompleksilukuihin liittyvät operaatiot sitten suoritetaan ruohonjuuritasolla. Nyt voidaan määritellä kompleksilukustruktuuri ja määritellä kahdelle kompleksilukustruktuurille vaikka kertolasku:
typedef struct { double re; double im; } kompleksi; kompleksi kerro(kompleksi a, kompleksi b) { kompleksi tulo; tulo.re=a.re*b.re-a.im*a.re; tulo.im=a.re*b.im+a.im*b.re; return tulo }
Ja kun en taas muista, miten toi korjattiin, niin tieten kertolasku piti olla:
tulo.re=a.re*b.re-a.im*b.im;
...
Kiitoksia paljon näistä avuista. Vihdoin tajusin struktuurin salaiset salat jotenkuten.
Opettelepa vielä oikea suomenkielinen sana: tietue.
Turhaa niitä alan sanoja kääntelee, sekaisin vaan menee ihmiset. Se on muuten strukti. Jos puhutaan c(++):tä ni puhutaan sitä. Tämäkin on toisaalta tälläinen mielipidejuttu.
vähän offtopic: Imo tälläset suomenkieliset nimet on "rumia" kun kielen osat on englanniksi kummiskin.
if (kolmio_a.pinta_ala < 0) throw virhe("negatiivinen pinta ala");
Ja jos joku etsii jotain ja löytää tänne / jonnekin niin se on paha lukea kun koodi on puoleksi suomeksi (äsken katsoin jotakin php.net:in manualin esimerkkejä ja oli espanjaksi muuttujat. luettavuus kärsii reilusti)
Termiä tietue käytetään yleisesti kirjallisuudessa. On tärkeää osata puhua asioista niiden oikeilla nimillä, jotta muutkin ymmärtävät mistä puhutaan. Minä en ole nähnyt suomenkielisessä kirjallisuudessa puhuttavan muista kuin tietueista, joten kesti todella kauan ymmärtää mistä keskustelussa on kyse.
Pitäisi saada kielenhuoltoa putkaan.
Juuh, semmoinen yhren A4:n muistio, jossa yleisimmät termit, ja niiden eniten käytetyt slangisynonyymit laitettaisiin aina samaan karsinaan.
tietue - struktuuri - strukti - rakenne - objekti - olio - luokka, joista kolmea viimeistä käytetään enemmän C++ yhteydessä.
...
JoinTuanJanohon kirjoitti:
objekti - olio - luokka, joista kolmea viimeistä käytetään enemmän C++ yhteydessä.
Tai ylipäätään olio-ohjelmoinnista puhuttaessa.
Kielenhuollossa on sellainen ongelma, että vaikka käyttäisi mitä tahansa sanaa, jonkun mielestä se on aina väärin. Toiset pitävät enemmän suomenkielisistä sanoista, toiset taas englanninkielisistä. Minä kannatan ehdottomasti suomen kielen käyttämistä, mutta en silti haluaisi ruveta käännyttämään ketään. Siihen on joka tapauksessa tyytyminen, että monta sanaa voi tarkoittaa samaa asiaa.
JoinTuanJanohon kirjoitti:
tietue - struktuuri - strukti - rakenne - objekti - olio
Väitätkö nyt, että nämä kaikki tarkoittavat samaa asiaa? Vai mitä tarkoitat tuolla listalla, eihän struktuuri ole synonyymi sanalle olio =///
Olen huomannut, että toiset termit käännetään automaattisesti, toisia ei. Struktuuria ei käännetä, vaan se on väännös. Taaseen kukaan ei puhu classeista, vaan luokista. Varmaan helposti käännettävät asiat käännetään.
Eikös method tarkoitakin käännettynä menetelmä? Joten pitäisiköhän meidän alkaa puhumaan luokan x menetelmistä :DD Jonkinasteinen raja tässäkin varmaan olisi hyvä olla :))
No en minä varsinaisesti mitään väittänyt, ja siksi käytin suurpiirteisempää ilmaisua "slangisynonyymi". Synonyymejä sanan varsinaisessa merkityksessä ei ehkä voi lainkaan käyttää tällaisessa yhteydessä, mene ja tiedä...
Ja menetelmä on muutoin tosi hyvä ja kuvaava suomenkielinen vastine sanalle "method". Menetelmän synonyymejä muuten ovat: tapa, niksi, menettelytapa, keino, kikka, konsti. Unohtaa ei sovi synonyymia "metodi", koska sitä käytetään melko paljon.
TeeVee kirjoitti:
Eikös method tarkoitakin käännettynä menetelmä?
Riippuu asiayhteydestä. Ohjelmoinnista puhuttaessa käytetään sanaa metodi, ainakin käymälläni Java-kurssilla.
Metodi on pitkälti java-kohtainen nimitys ohjelmassa olevalle aliohjelmalle. Kielestä ja ohjelmointitavasta riippuen samaa asiaa kutsutaan myös funktioksi tai proseduuriksi.
Luokalla ja oliolla on käsittääkseni se ero, että luokka tarkoittaa vain asioiden määrityksiä ja oliot ovat luokan instansseja (ilmentymiä). Tietyssä yhteydessä objekti on synonyymi oliolle, mutta sitä käytetään harvoin (se on suora ja huonohko finglish käännös Object-sanasta).
Hiukan tietokonealaa opiskelleena täytyy todeta, että suuri osa tietotekniikkaan liittyvästä ammattisanastosta on englantia tai siitä johdettua finglishiä. Monella asialla on kyllä suomenkielinenkin nimitys, mutta niitä ei juuri käytetä (esim. DNS domain tai zone). Tästä on seurannut monia huvittavia hetkiä tentissä, kun on pitänyt keksiä hieno suomennos jollekin termille, joka on oppimateriaalissa ja luennoilla esiintynyt vain englanniksi. Ohjelmointiin liittyvä suomalainen termistö on kuitenkin jo aika hyvin vakiintunut, joskin pieniä poikkeavuuksia oikean suomalaisen termin ja finglish termien käytössä esiintyy.
FooBat kirjoitti:
Metodi on pitkälti java-kohtainen nimitys ohjelmassa olevalle aliohjelmalle. Kielestä ja ohjelmointitavasta riippuen samaa asiaa kutsutaan myös funktioksi tai proseduuriksi.
Metodi tarkoittaa luokan jäsenfunktiota hyvin monessa muussakin kielessä. Java nyt vain sattuu olemaan kieli, jossa kaikki funktiot kuuluvat jollekin luokalle, joten siinä ei muunlaisia olekaan.
lainaus:
Tietyssä yhteydessä objekti on synonyymi oliolle, mutta sitä käytetään harvoin (se on suora ja huonohko finglish käännös Object-sanasta).
Olio ei ole suora käännös sanasta object. "Esine" olisi.
Ja sitten suomenkielessä "olion" löyhä synonyymi on "olento", mutta käytännössä (siis biologisessa mielessä) oliolla tarkoitetaan Tunnistamatonta Liikkuvaa Olentoa = UG0, jollainen saattaisi hyvissä olosuhteissa tippua pläjähtää avaruudesta maahan :-)
JoinTuanJanohon kirjoitti:
jollainen saattaisi hyvissä olosuhteissa tippua pläjähtää avaruudesta maahan :-)
Tosin, jos moinen tippua pläjähtää, on luultavaa että kyseinen tapaus palaa poroksi ilmakehässä, ennenkuin ehtii pinnalle asti päästä. Hm, eipä ihme ettei noita alieneita ole paljoakaan näkynyt..
-Grey-
Deewiant kirjoitti:
lainaus:
Tietyssä yhteydessä objekti on synonyymi oliolle, mutta sitä käytetään harvoin (se on suora ja huonohko finglish käännös Object-sanasta).
Olio ei ole suora käännös sanasta object. "Esine" olisi.
Onnistuin kirjoittamaan itseni suohon. Tarkoitin siis sitä, että objekti on object-sanan huono ja suora suomennos. Olio on nimenomaan se epäsuora, mutta melko virallinen suomennos Objectille näissä yhteyksissä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.