Enrere Mòdul 7
Fonaments de programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 
Ús típic de les unions

En aquesta pràctica veurem dos dels usos més corrents de les unions.

 

Desenvolupament de la pràctica

Si tenim estructures amb camps del mateix tipus, moltes vegades ens pot interessar referir-nos a aquests camps com si fossin un vector. En aquest cas, les unions poden ser molt útils:

Definiu un projecte nou anomenat m7p071 i afegiu-li un arxiu de font C/C++ anomenat m7p071.cpp. Escriviu el següent codi:

//m7p071.cpp: Introducció de notes.

#include <stdio.h>

struct notes {
      int mat, fis, inf,qui, fil ; 
};

union alumne {
      struct notes N; 
      int not[5]; 
} ; 



void main(){
      int ct;
      alumne joan;

    joan.N.mat=10;
    joan.N.fis=9;
    joan.N.inf=7;
    joan.N.qui=9;
    joan.N.fil=10;

    printf("mat\tfis\tinf\tqui\tfil\n");
    for (ct=0;ct<5;ct++){
        printf("%d\t",joan.not[ct]);

    }
}

Explicació del programa

Un dels avantatges de les variables d'estructura és que el nom de camp pot identificar d'alguna forma el seu contingut. En el programa anterior, la variable joan.N.mat conté la nota de matemàtiques de l'alumne joan. No obstant, en moltes ocasions és més convenient  que tots els camps d'una mateixa variable d'estructura (en el cas que siguin del mateix tipus) es puguin referenciar mitjançant un índex. Això s'ha aconseguit en aquest programa amb una variable d'unió.

joan és una variable del tipus unió alumne. Aquesta variable conté alhora una variable d'estructura i un vector. Ambdós tipus són un conjunt de 5 enters que comparteixen el mateix espai de memòria. La variable joan té un total de 5x4=20 octets. El contingut del primer dels enters d'aquesta variable es pot accedir amb joan.N.mat o bé amb joan.not[0] segons interessi.

Per calcular, per exemple, la nota mitjana és més convenient la segona notació:

for (mitjana=0,ct=0;ct<5;ct++) mitjana=mitjana+joan.not[ct];
mitjana=mitjana/5;

 

Una segona aplicació comú de les variables d'unió és passar a una funció un tipus indefinit, per exemple, en aquest programa, la mateixa funció impr es pot fer servir per imprimir enters, nombres reals o cadenes de caràcters. Aquesta és una alternativa al programa de la pràctica 3 del mòdul 5 que feia servir per aquest propòsit els punters tipus void.

Definiu un projecte nou anomenat m7p072 i afegiu-li un arxiu de font C/C++ anomenat m7p072.cpp. Escriviu el següent codi:

//m7p072.cpp: Funció d'argument de tipus indefinit

#include <stdio.h>
#include <string.h>

union nombre {
    int i;
    float f;
    double d;
    char cad[12];
};

void impr(nombre a, char c);

void main(){

    union nombre a;

    a.i=23;impr(a,'i');
    a.f=5.25;impr(a,'f');
    a.d=6.25E256;impr(a,'d');
    strcpy(a.cad,"Visual C++");impr(a,'s');
}


void impr(nombre a, char c){
    switch (c){
      case 'i':
         printf("a=%d\n",a.i);
         break;
      case 'f':
         printf("a=%f\n",a.f);
         break;
      case 'd':
         printf("%g\n",a.d);
         break;
      case 's':
         printf("a=%s\n",a.cad);
    }
}

Explicació del programa

Aquest programa defineix la funció impr amb dos arguments, un del tipus union nombre i un altre del tipus char. Segons el valor d'aquest últim paràmetre, la funció sap de quin tipus és la variable a passada. Segons aquest tipus, la funció imprimeix el seu valor.