Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Nimetön Struct ja Union | Edistyneet Structin Käyttötavat
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
C-Rakenteiden Hallinta

bookNimetön Struct ja Union

C-ohjelmointikielessä on anonyymejä rakenteita ja unioneita, jotka mahdollistavat rakenteiden ja unionien määrittelyn ilman nimen määrittämistä.

Mitä ovat anonyymit rakenteet ja unionit?

Anonyymillä unionilla tai rakenteella ei ole tunnistetta. Tämän vuoksi et voi luoda itsenäisiä muuttujia kyseisestä tyypistä; sen sijaan niitä käytetään tyypillisesti muiden rakenteiden sisällä.

// Anonymous union
union {
    char x;
    int y;
};

// Anonymous structure
struct {
    char x;
    int y;
};

Anonyymit rakenteet ja unionit ovat erityisen hyödyllisiä, kun ne sisällytetään toisiin rakenteisiin ja niitä käytetään vain siinä kontekstissa, jossa ne on määritelty.

Käytännön esimerkki

Tarkastellaan tilannetta, jossa halutaan esittää ASCII-taulukko, jossa sama arvo voidaan tulkita joko numeerisena koodina tai merkkisymbolina. Anonyymin unionin käyttäminen rakenteen sisällä mahdollistaa tehokkaan vaihtamisen näiden kahden tulkinnan välillä.

main.c

main.c

copy
123456789101112131415161718192021
#include <stdio.h> struct ASCIItable { // Anonymous union allows dual representation of the same memory union { char symbol; int num; }; }; int main() { struct ASCIItable AZtable; AZtable.num = 65; // ASCII code for 'A' // Print all uppercase letters and their numeric codes for (int i = 0; i < 26; i++) { printf("num = %d | symbol = `%c`\n", AZtable.num + i, AZtable.symbol + i); } return 0; }

Tässä esimerkissä rakenne ASCIItable sisältää anonyymin unionin. Unionin avulla samaa muistialuetta voidaan tulkita joko numeerisena arvona (num) tai merkkinä (symbol).

Kun AZtable.num asetetaan arvoon 65, se vastaa ASCII-koodia merkille 'A'. Käyttämällä samaa muistia, AZtable.symbol edustaa myös merkkiä 'A'. Toistamalla 26 kertaa voidaan tulostaa kaikki isot kirjaimet ja niiden ASCII-koodit, mikä havainnollistaa, kuinka sama muisti voi esittää useita näkymiä tietoihin.

Tehtävä

Swipe to start coding

Luo funktio findFurthestPoint, joka etsii pisteen, joka on kauimpana origosta (0,0) kaksiulotteisella tasolla. Kukin piste esitetään rakenteella Point, joka sisältää anonyymin sisäkkäisen rakenteen, jossa on kentät x ja y.

Funktion tulee laskea jokaiselle pisteelle euklidinen etäisyys kaavalla:

distance = sqrt(x*x + y*y)

ja palauttaa sen pisteen indeksi, jolla on suurin etäisyys.

  1. Laske funktion sisällä ensimmäisen pisteen etäisyys origosta kaavan avulla.
  2. Alusta maxIndex arvolla 0.
  3. Käytä for-silmukkaa, jossa i = 1 ja toista kunnes i = n pisteisiin asti.
  4. Laske jokaiselle pisteelle etäisyys yllä olevalla kaavalla.
  5. Jos etäisyys on suurempi kuin maxDistance, päivitä maxDistance ja maxIndex nykyisen pisteen etäisyyteen ja indeksiin.
  6. Silmukan jälkeen palauta maxIndex kauimmaisen pisteen indeksinä.

Ratkaisu

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 3
single

single

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

close

bookNimetön Struct ja Union

Pyyhkäise näyttääksesi valikon

C-ohjelmointikielessä on anonyymejä rakenteita ja unioneita, jotka mahdollistavat rakenteiden ja unionien määrittelyn ilman nimen määrittämistä.

Mitä ovat anonyymit rakenteet ja unionit?

Anonyymillä unionilla tai rakenteella ei ole tunnistetta. Tämän vuoksi et voi luoda itsenäisiä muuttujia kyseisestä tyypistä; sen sijaan niitä käytetään tyypillisesti muiden rakenteiden sisällä.

// Anonymous union
union {
    char x;
    int y;
};

// Anonymous structure
struct {
    char x;
    int y;
};

Anonyymit rakenteet ja unionit ovat erityisen hyödyllisiä, kun ne sisällytetään toisiin rakenteisiin ja niitä käytetään vain siinä kontekstissa, jossa ne on määritelty.

Käytännön esimerkki

Tarkastellaan tilannetta, jossa halutaan esittää ASCII-taulukko, jossa sama arvo voidaan tulkita joko numeerisena koodina tai merkkisymbolina. Anonyymin unionin käyttäminen rakenteen sisällä mahdollistaa tehokkaan vaihtamisen näiden kahden tulkinnan välillä.

main.c

main.c

copy
123456789101112131415161718192021
#include <stdio.h> struct ASCIItable { // Anonymous union allows dual representation of the same memory union { char symbol; int num; }; }; int main() { struct ASCIItable AZtable; AZtable.num = 65; // ASCII code for 'A' // Print all uppercase letters and their numeric codes for (int i = 0; i < 26; i++) { printf("num = %d | symbol = `%c`\n", AZtable.num + i, AZtable.symbol + i); } return 0; }

Tässä esimerkissä rakenne ASCIItable sisältää anonyymin unionin. Unionin avulla samaa muistialuetta voidaan tulkita joko numeerisena arvona (num) tai merkkinä (symbol).

Kun AZtable.num asetetaan arvoon 65, se vastaa ASCII-koodia merkille 'A'. Käyttämällä samaa muistia, AZtable.symbol edustaa myös merkkiä 'A'. Toistamalla 26 kertaa voidaan tulostaa kaikki isot kirjaimet ja niiden ASCII-koodit, mikä havainnollistaa, kuinka sama muisti voi esittää useita näkymiä tietoihin.

Tehtävä

Swipe to start coding

Luo funktio findFurthestPoint, joka etsii pisteen, joka on kauimpana origosta (0,0) kaksiulotteisella tasolla. Kukin piste esitetään rakenteella Point, joka sisältää anonyymin sisäkkäisen rakenteen, jossa on kentät x ja y.

Funktion tulee laskea jokaiselle pisteelle euklidinen etäisyys kaavalla:

distance = sqrt(x*x + y*y)

ja palauttaa sen pisteen indeksi, jolla on suurin etäisyys.

  1. Laske funktion sisällä ensimmäisen pisteen etäisyys origosta kaavan avulla.
  2. Alusta maxIndex arvolla 0.
  3. Käytä for-silmukkaa, jossa i = 1 ja toista kunnes i = n pisteisiin asti.
  4. Laske jokaiselle pisteelle etäisyys yllä olevalla kaavalla.
  5. Jos etäisyys on suurempi kuin maxDistance, päivitä maxDistance ja maxIndex nykyisen pisteen etäisyyteen ja indeksiin.
  6. Silmukan jälkeen palauta maxIndex kauimmaisen pisteen indeksinä.

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 3
single

single

some-alt