In questo articolo parleremo di typedef struct C.
L’istruzione typedef permette di definire degli alias a dei tipi di dato esistenti. Non si definisce un nuovo tipo ma si introduce un nome che corrisponde ad uno dei tipi definiti. La sintassi è questa: typedef tipo nome_tipo;
Dove tipo è il nome simbolico del tipo che si vuole ‘ribattezzare’ mentre nome_tipo è l’alias associato a tipo. Questa operazione viene fatta con lo scopo di rendere più leggibile un programma e anche per evitare operazioni aritmetiche complesse.
Cioè ad esempio un possibile uso: typedef int Intero;
Cosa cambia? Cambia che adesso potremmo riferirci al tipo di dato utilizzando ad esempio Intero al posto di int, in questo modo:
Intero x;
Cioè stiamo così utilizzando un alias definito dall’utente.
Facciamo un altro esempio: typedef char *Stringa;
in questo caso il puntatore a carattere viene ribattezzato Stringa e quindi posso definire le due variabili s1 ed s2 in questo modo:
Stringa s1, s2;
Uso di typedef struct in C
L’istruzione typedef può essere utilizzata anche con i dati di tipo struct in C, per definire nuovi tipi di dato.
La sintassi è questa:
typedef struct {
<definizione_campi>
} <nome_tipo>
Quindi facciamo un esempio:
typedef struct {
char cognome[20];
char nome[20];
int anno_nascita;
} Studente;
Studente s1,s2,s3;
In questo modo si elimina la necessità di ripetere la parola struct.
Esempio d’uso di typedef struct in C
Facciamo dunque un piccolo esempio d’uso delle strutture in C a scopo didattico.
Creare una semplice struct alunno che contiene il nome, il cognome e il voto. Dopo inserire da 1 a 20 alunni al massimo e permettere di effettuare una ricerca per cognome dell’alunno. Se ci sono più alunni con lo stesso cognome visualizzarli entrambi.
Quindi, definiamo una struttura alunno con all’interno il campo nome e cognome di tipo char e voto di tipo int.
Per il momento non utilizzeremo le funzioni ma svilupperemo il programma all’interno del main.
Facciamo un controllo sul numero degli alunni, con il ciclo do while, in modo da evitare di inserire un numero non valido.
Dopo con un ciclo for inseriamo i dati degli alunni. Poi chiediamo quale cognome dobbiamo cercare e memorizziamo la risposta nella variabile cognome_alunno. Dopo utilizzando la funzione strcmp controlliamo se qualche dato nella nostra struttura contiene quel cognome e se vero visualizziamo i risultati. Se a fine ciclo la variabile trovato è rimasta a zero, allora vuol dire che non abbiamo trovato nessun cognome.
N.B. Sarebbe opportuno inserire un identificativo di ciascun alunno, un codice univoco. Nelle prossime lezioni vedremo come fare.
Ecco dunque il listato completo di questo semplicissimo esempio sulle strutture in C.
#include <stdio.h>
#include <string.h>
#define MAX 20
typedef struct {
char cognome[30];
char nome[20];
int voto;
} alunno;
int main() {
alunno a[MAX]; /*tabella come array di struttura, si crea un vettore di elementi di tipo alunno*/
int n,i,j,trovato;
char cognome_alunno[20];
do{
printf("Inserisci il numero di alunni:");
scanf("%d", &n);
} while (n<1 || n>MAX);
for(i=0; i<n; i++){
printf("Inserisci il cognome dell'alunno:");
scanf("%s", a[i].cognome);
printf("Inserisci il nome dell'alunno:");
scanf("%s", a[i].nome);
printf("Inserisci il voto:");
scanf("%d", &a[i].voto);
}
printf("\nInserisci il cognome dell'alunno da cercare: ");
scanf("%s", cognome_alunno);
trovato=0;
for(j=0;j<n;j++){
if(strcmp(a[j].cognome, cognome_alunno)==0) {
printf("\nAlunno trovato in posizione %d\nnome:%s\nvoto:%d",j+1,a[j].nome, a[j].voto);
trovato=1;
}
}
if (!trovato)
printf("\nAlunno non trovato.\n");
return 0;
}
Abbiamo realizzato un semplice esempio utilizzando typedef struct C. Nelle prossime lezioni affronteremo altri esempi.
Alcuni link utili
Somma elementi diagonale principale di una matrice
Come sommare gli elementi della cornice esterna
Sommare dei numeri di una matrice
Ricerca elementi in una matrice