Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Sisäkkäiset Rakenteet | Edistyneet Structin Käyttötavat
C-Rakenteiden Hallinta

bookSisäkkäiset Rakenteet

C-kielessä rakenteet voivat sisältää muita rakenteita jäseniään, perusdatatyyppien kuten int tai char, taulukoiden ja osoittimien lisäksi. Sisäkkäiset rakenteet ovat hyödyllisiä, kun halutaan ryhmitellä toisiinsa liittyvää tietoa loogisella tavalla.

Sisäänrakennettu sisäkkäinen rakenne

Sisäänrakennettu sisäkkäinen rakenne määritellään suoraan ulomman rakenteen sisälle. Tämä tarkoittaa, että sisäkkäinen rakenne on olemassa vain ulomman rakenteen sisällä eikä sitä voi käyttää muualla.

main.c

main.c

copy
123456789101112131415161718192021
#include <stdio.h> struct Person { char name[50]; int age; struct Address { char street[50]; char city[50]; char index[10]; } address; // embedded nested structure }; int main() { struct Person person = { "Sherlock Holmes", 27, {"Baker Street", "London", "221B"} }; printf("Name: %s\n", person.name); printf("Age: %d\n", person.age); printf("Address: %s, %s, %s\n", person.address.index, person.address.street, person.address.city); return 0; }

Tässä esimerkissä Address-rakenne on määritelty Person-rakenteen sisällä, joten se on olemassa vain Person-rakenteen yhteydessä. Sisäkkäisen rakenteen kenttiin pääsee käsiksi käyttämällä person.address, mikä mahdollistaa street, city ja index-kenttien hakemisen. Tämä lähestymistapa on kätevä, kun sisäkkäinen tieto liittyy vain yhteen ulkoiseen rakenteeseen eikä sitä tarvitse käyttää muualla.

Erillinen sisäkkäinen rakenne

Erillinen sisäkkäinen rakenne määritellään itsenäisesti ja liitetään sitten ulkoiseen rakenteeseen. Tämä mahdollistaa sisäkkäisen rakenteen uudelleenkäytön useissa ulkoisissa rakenteissa tai sen itsenäisen luomisen.

main.c

main.c

copy
123456789101112131415161718192021222324
#include <stdio.h> struct Address { char street[50]; char city[50]; char index[10]; }; struct Person { char name[50]; int age; struct Address address; // nested structure }; int main() { struct Address addr = {"Baker Street", "London", "221B"}; struct Person person = {"Sherlock Holmes", 27, addr}; printf("Name: %s\n", person.name); printf("Age: %d\n", person.age); printf("Address: %s, %s, %s\n", person.address.index, person.address.street, person.address.city); return 0; }

Tässä Address määritellään itsenäisesti erillään Person-rakenteesta, joten sitä voidaan käyttää itsenäisesti tai useissa eri rakenteissa. Kun alustetaan Person, annetaan Address-kenttään address-instanssi. Sisäkkäisiin kenttiin päästään käsiksi samalla tavalla käyttäen person.address. Tämä lähestymistapa on joustavampi ja edistää koodin uudelleenkäyttöä sekä modulaarista suunnittelua.

Tehtävä

Swipe to start coding

Jokainen tuote esitetään rakenteella Product, joka sisältää sisäkkäisen rakenteen Manufacturer. Funktion tulee käydä läpi tuotteiden taulukko, tarkistaa kuuluuko tuote määritellylle valmistajalle, ja laskea yhteen kaikkien vastaavien tuotteiden kokonaisarvo (price * quantity).

Toteuta funktio calculateManufacturerTotal, jonka paluuarvotyyppi on float.

  1. Luo funktion sisälle float-tyyppinen muuttuja total ja aseta sen arvoksi 0.0f.
  2. Käytä for-silmukkaa, joka käy tuotteiden taulukon läpi indeksistä 0 arvoon n.
  3. Jokaiselle tuotteelle vertaa tuotteen manufacturer.companyName-kenttää parametrina annettuun companyName-arvoon käyttäen strcmp-funktiota.
  4. Jos nimet täsmäävät, lisää price * quantity muuttujaan total.
  5. Palauta lopuksi muuttujan total arvo.

Ratkaisu

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 1
single

single

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Suggested prompts:

Can you show me an example of how to declare an embedded nested structure in C?

What are the advantages and disadvantages of using embedded versus separate nested structures?

How do I access the fields of a nested structure in C?

close

bookSisäkkäiset Rakenteet

Pyyhkäise näyttääksesi valikon

C-kielessä rakenteet voivat sisältää muita rakenteita jäseniään, perusdatatyyppien kuten int tai char, taulukoiden ja osoittimien lisäksi. Sisäkkäiset rakenteet ovat hyödyllisiä, kun halutaan ryhmitellä toisiinsa liittyvää tietoa loogisella tavalla.

Sisäänrakennettu sisäkkäinen rakenne

Sisäänrakennettu sisäkkäinen rakenne määritellään suoraan ulomman rakenteen sisälle. Tämä tarkoittaa, että sisäkkäinen rakenne on olemassa vain ulomman rakenteen sisällä eikä sitä voi käyttää muualla.

main.c

main.c

copy
123456789101112131415161718192021
#include <stdio.h> struct Person { char name[50]; int age; struct Address { char street[50]; char city[50]; char index[10]; } address; // embedded nested structure }; int main() { struct Person person = { "Sherlock Holmes", 27, {"Baker Street", "London", "221B"} }; printf("Name: %s\n", person.name); printf("Age: %d\n", person.age); printf("Address: %s, %s, %s\n", person.address.index, person.address.street, person.address.city); return 0; }

Tässä esimerkissä Address-rakenne on määritelty Person-rakenteen sisällä, joten se on olemassa vain Person-rakenteen yhteydessä. Sisäkkäisen rakenteen kenttiin pääsee käsiksi käyttämällä person.address, mikä mahdollistaa street, city ja index-kenttien hakemisen. Tämä lähestymistapa on kätevä, kun sisäkkäinen tieto liittyy vain yhteen ulkoiseen rakenteeseen eikä sitä tarvitse käyttää muualla.

Erillinen sisäkkäinen rakenne

Erillinen sisäkkäinen rakenne määritellään itsenäisesti ja liitetään sitten ulkoiseen rakenteeseen. Tämä mahdollistaa sisäkkäisen rakenteen uudelleenkäytön useissa ulkoisissa rakenteissa tai sen itsenäisen luomisen.

main.c

main.c

copy
123456789101112131415161718192021222324
#include <stdio.h> struct Address { char street[50]; char city[50]; char index[10]; }; struct Person { char name[50]; int age; struct Address address; // nested structure }; int main() { struct Address addr = {"Baker Street", "London", "221B"}; struct Person person = {"Sherlock Holmes", 27, addr}; printf("Name: %s\n", person.name); printf("Age: %d\n", person.age); printf("Address: %s, %s, %s\n", person.address.index, person.address.street, person.address.city); return 0; }

Tässä Address määritellään itsenäisesti erillään Person-rakenteesta, joten sitä voidaan käyttää itsenäisesti tai useissa eri rakenteissa. Kun alustetaan Person, annetaan Address-kenttään address-instanssi. Sisäkkäisiin kenttiin päästään käsiksi samalla tavalla käyttäen person.address. Tämä lähestymistapa on joustavampi ja edistää koodin uudelleenkäyttöä sekä modulaarista suunnittelua.

Tehtävä

Swipe to start coding

Jokainen tuote esitetään rakenteella Product, joka sisältää sisäkkäisen rakenteen Manufacturer. Funktion tulee käydä läpi tuotteiden taulukko, tarkistaa kuuluuko tuote määritellylle valmistajalle, ja laskea yhteen kaikkien vastaavien tuotteiden kokonaisarvo (price * quantity).

Toteuta funktio calculateManufacturerTotal, jonka paluuarvotyyppi on float.

  1. Luo funktion sisälle float-tyyppinen muuttuja total ja aseta sen arvoksi 0.0f.
  2. Käytä for-silmukkaa, joka käy tuotteiden taulukon läpi indeksistä 0 arvoon n.
  3. Jokaiselle tuotteelle vertaa tuotteen manufacturer.companyName-kenttää parametrina annettuun companyName-arvoon käyttäen strcmp-funktiota.
  4. Jos nimet täsmäävät, lisää price * quantity muuttujaan total.
  5. Palauta lopuksi muuttujan total arvo.

Ratkaisu

Switch to desktopVaihda työpöytään todellista harjoitusta vartenJatka siitä, missä olet käyttämällä jotakin alla olevista vaihtoehdoista
Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 1
single

single

some-alt