Tipo di Dati – typedef

Premi qui per scaricare il PDF

Tipo → è un concetto astratto che esprime l’insieme dei valori e le operazioni permesse.

I tipi di dato possono essere:

  • predefiniti (built – in);
  • definiti dal programmatore

Possono essere:

  • Tipi semplici, predefiniti: int, double, float, char;
  • Semplici e definititi dal programmatore (enumerativi);
  • Tipi di dati strutturati e definiti dal programmatore (Array e struct).

Definizione di nuovi tipi

typedef int intero;
intero numero; //Equivale a 
int numero; 

typedef → è la definizione di un sinonimo.

Definizione di tipi enumerativo

//DEFINIAMO UN NUOVO TIPO
typedef enum {gen, feb, mar, apr} tipo_mese; //gen vale 0, feb vale 1 ecc...
tipo_mese mese; 

//DICHIARIAMO LA VARIABILE
enum {gen, feb, mar, apr} mese;

Enumerazione

Normalmente, in C il valore intero 0 significa FALSO, e 1 significa VERO

typedef enum {falso, vero} boolean;

Normalmente le costanti dell’enumerazione sono rappresentate da numeri a partire da 0 in avanti, ma possiamo anche imporre le nostre condizioni

typedef enum {lun = 1, mar, mer, gio, ven, sab, dom} tipo_giorno;

I valori saranno da 1 a 7. lun vale 1, mar val 2 ecc…

Sono definite le operazionie <, ==, > ecc…

Esempio 1

typedef enum {gen, feb, mar, apr} tipo_mese;

typedef struct
{
	int giorno
	tipo_mese mese;
	int anno;
} tipo_data; //Oltre a int, double, char, ci sarà anche tipo_data

tipo_data oggi, domani, dopodomani; //sono tre variabili di tipo struct

oggi.giorno;
oggi.anno;
oggi.mese; //può essere gen, feb, mar, apr... 0 = gen, 1 = feb, 2, 3

Esempio 2

typedef struct
{
	int giorno
	tipo_mese mese;
	int anno;
} tipo_data; //Oltre a int, double, char, ci sarà anche tipo_data

typedef struct 
{
	char nome [20];
	char cognome [20];
	tipo_data nato_il;
	char nato_a[15];
	char codice_fiscale[16];
	int stipendio;
} dipendente;

dipendente persona1, persona2; //si possono dichiarare le variabili

//Aumento lo stipendio del 10%
persona1.stipendio += (persona1.stipendio*10)/100; //stipendio è l'attributo di persona 1

Esempio 3

typedef enum {disabled, enabled} Status; //disabled ha il valore 0, enabled ha il valore 1

typedef struct
{
	int numeroCanale;
	Status statoProgrammazione;
	float livelloLuinosita;
	float livelloColore;
	float LivelloVolume;
} CanaliTV;

Typedef con ARRAY

typedef char venticaratteri[20]; //un arrai di 20 char
typedef int iArray[20]; //un array di 20 int

venticaratteri nome, cognome;

Si introduce un nuovo tipo, venticaratteri, il tipo degli array di 20 elementi di tipo char. Indica che nome e cognome sono di tipo venticaratteri, cioè due array di 20 char. (da 0 a 19, l’ultimo elemento è il terminatore ‘\0’).

Matrici multidimensionali

typedef int Matrix2d [20][30];
Matrix2d A; //Variabile bidimensionale [20][30]

typedef float Matrix3d [20][30][40];
Matric3d B; //Variabile tridimensionale [20][30][40]

typedef int Vettore[20];
typedef Vettore MatriceIntera20per20[20]; //20 vettori che a sua volta ha 20 interi
typedef int Matrice20per20 [20][20]; //Equivale alla dichiarazione precedente

MatriceIntera20per20 matrice;
int matrice[20][20]; //dichiarazione abbreviata

Esercizio

Calcolo del perimetro di un poligono

#include <stdio.h>
#include <math.h> //Funzioni matematiche
#define N 5 //Pentagono

int main()
{
	int i = 0;
	float perimetro = 0;

	typedef struct
	{
		float x;
		float y;
	} punto;

	typedef punto N_agono[N];	
	N_agono pn = {{0,0}, {0.2,1}, {1,1}, {2,0.5}, {1, -3}}; //pn array di 5 elementi composto dalla struct punto (x, y)

	sizeof(N_agono);
	
	//Calcoliamo il perimetro come la distanza tra coppie di numeri consecutivi
	while ( i < N-1) 
	{
		perimetro += sqrt((pn[i].x - pol[i+1].x) * (pn[i].x - pol[i+1].x) + (pn[i].y - pol[i+1].y) * (pn[i].y - pol[i+1].y));
		i++;
	}
	perimetro += sqrt((pn[0].x - pn[N-1].x) * (pn[0].x - pn[N-1].x) + (pn[0].y - pn[N-1].y) * (pn[0].y - pn[N-1].y));
	
	return 0;
}
  • sizeof(type)

    E’ un operatore che restituisce l’occupazione di memoria di un tipo.

variabile += valoreequivale a variabile = variabile + valore;

Abbiamo costruito un modello del poligono:

  • Scelto quali informazioni memorizzate (le coordinate dei punti nell’ordine in cui definiscono i segmenti)
  • Scelto di quali astrazioni avvalerci (un vettore di record e non due vettori separati).
  • Formuliamo le operazioni definite sull’oggetto in termini della rappresentazione scelta.

Esercizio 2

Rappresentiamo insiemi di numeri interi da 0 a N-1. Gli insiemi non ammettono duplicati, consideriamo solo i primi N numeri interi.

int insieme [N];
//OPPURE
typedef int tipo_insieme[N];
tipo_insieme insieme;

Supponiamo di voler rappresentare un insieme di lettere → N = 26

Sfruttiamo l’ordinamento delle lettere per metterle in corrispondenza con gli interi nell’array: A → 0, B →1, Z → 25.

typedef int alfabeto [26];

alfabeto emptyset = {0,0,0,0,0,...,0}; //Inizializziamo gli elementi a 0
alfabeto soloa = {1,0,0,0,0,0,...,0}; //Inizializzo solo la A ad 1
alfabeto acf = {1,0,1,0,0,1,0,...,0}; //Inzializzo solo a, c ed f

Gli insiemi sono intrinsecamente ordinati vista l’associazione biunivoca tra indici ed elementi.

typedef int alfabeto[26];
alfabeto S,T,U,I; //4 variabili di tipo alfabeto, ogni variabile è un array di 26 elementi
//Tutti gli elementi saranno messi a 0, tranne il valore corrispondente alla posizione della lettera, che sarà messa a 1

//CALCOLIAMO L'UNIONE DI S e T
i=0;
while (i<N){
	U[i] = (S[i] == 1 || T[i] == 1); //l'elemento U[i] sarà 1 se o S[i] o T[i] saranno 1
	i = i+1;
}

//CALCOLIAMO in I L'INTERSEZIONE DI S e T
i=0;
while (i<N){
	I[i] = (S[i] == 1 && T[i] == 1); //L'elemento I[i] sarà uguale a 1 se S[i] e T[i] sono uguali a 1
	i = i+1;
}

Premi qui per scaricare il PDF