previous next Up Title Contents Index

13.7 Tietueet, union ja enum


struct:n tapainen varattu sana on union, jolla tehdään päällekkäin olevia muistialueita, joilla on eri tilanteessa eri käyttö. Esimerkiksi henkilötietueessa naisilla voisi olla synnyttanyt_lapsia ja miehillä armeija_kayty, jotka jakaisivat saman muistialueen (huom. esimerkki tehty -91).

c-taul\union.c - vaihtuva muistipaikan tyyppi

	#include <stdio.h>                               Matti                    
	                                                 ---------------------------
	typedef enum {                                   |          -------------  |
	  mies,                                          |nimi:     |M|a|t|t|i|0|  |
	  nainen                                         |          -------------  |
	} tSukupuoli;                                    |sukupuoli:| 0 |          |
	                                                 |          -----          |
	typedef union {                                  |tiedot:   | 1 |          |
	  int syn_lapsia;                                ---------------------------
	  int armeija_kayty;                             Maija                       
	} tTiedot;                                       ---------------------------
	                                                 |          -------------  |   
	typedef struct {                                 |nimi:     |M|a|i|j|a|0|  |  
	  char       nimi[40];                           |          -------------  | 
	  tSukupuoli sukupuoli;                          |sukupuoli:| 1 |          |   
	  tTiedot    tiedot;                             |          -----          |  
	} tHenkilo;                                      |tiedot:   | 4 |          |    
	                                                 ---------------------------    
	void tulosta_henkilo(tHenkilo *henkilo) 
	{ 
	  printf("Nimi: %- 40s\n",henkilo- >nimi);
	  switch (henkilo- >sukupuoli) {
	    case mies:
	      printf("Mies, armeija käyty: %d\n",henkilo- >tiedot.armeija_kayty);
	      break;
	    case nainen:
	      printf("Nainen, synnyttanyt lapsia: %d\n",henkilo- >tiedot.syn_lapsia);
	      break;
	    default: printf("Eunukki\n");
	  }
	}
	
	int main(void)
	{
	  tHenkilo Matti = {"Matti",mies,1}, Maija = {"Maija",nainen,4};
	
	  tulosta_henkilo(&Matti);
	  tulosta_henkilo(&Maija);
	  return 0;
	}
Tällä kurssilla emme kuitenkaan suosittele union- tyyppisten muuttujien käyttöä! Mieluummin käytämme olioita ja polymorfismia.

Edellä enum tarkoitti lueteltua tyyppiä, jolloin mies vastasi vakiota 0 ja nainen vakiota 1. Tähän palataan myöhemmin.

Tehtävä 13.127 union

Mitä union.c ohjelma tulostaa. Piirrä kuva tietueista jos union vaihdettaisiinkin structiksi.
Korvaa enum sekä sen nainen ja mies #define- vakiolla.

Tehtävä 13.128 Tietue tietueessa

Olkoon meillä seuraavat C- määritykset:
	typedef struct {
	  char nimi[50];
	  int  paino;
	  int  ika;
	} Elain_tiedot;
	
	typedef struct {
	  char laji[40];
	  Elain_tiedot elain;
	  int nro; 
	} Laji_tiedot;
	
	int main(void)
	{
	  Laji_tiedot miuku;
	  ...
	  return 0;
	}
Täydennä ... - kohtaan seuraavat "sijoitukset" muuttujalle miuku:
	  laji  <-  "Kissa"
	  nro   <-   5
	  nimi  <-  "Miuku"
	  paino <-  3
	  ika   <-  5
Piirrä kuva miuku - muuttujasta sijoitusten jälkeen.

Tehtävä 13.129 Miukusta olio

Muuta edellisen tehtävän tietueet C++ - luokiksi ja tee sijoituksien avuksi metodit, jotka hoitavat sijoitukset. Saat nyt - tottakai - käyttää myös C++:n string- luokkaa.


previous next Up Title Contents Index