Affronteremo in questa lezione le strutture complesse in C, in quanto i singoli campi di una struct possono essere a loro volta di tipo complesso. Possono essere array o anche tipi definiti come struct.
Vediamo subito qualche esempio per capire le strutture complesse. Proponiamo dapprima la struttura semplice:
typedef struct {
char cognome[20];
char nome[20];
char telefono[20];
int anno;
int mese;
int giorno;
} rec_rubrica;
La struttura seguente può essere trasformata in modo da poter gestire la data anche come unico campo piuttosto che per singole componenti:
typedef struct {
char cognome[20];
char nome[20];
char telefono[20];
struct rec_data{
int anno;
int mese;
int giorno;
} dataNascita;
} rec_rubrica;
Dichiariamo quindi la variabile del tipo rubrica:
rec_rubrica contatto; //dichiarazione di variabile
In questo modo se devo accedere ai campi si possono utilizzare ad esempio queste notazioni.
contatto.nome=”Coding”;
contatto.dataNascita.anno=2019;
contatto.dataNascita.mese=02;
contatto.dataNascita.giorno=20;
Esempio pratico sull’uso delle strutture complesse in C
Definire la struttura di una Squadra che descrive una squadra di calcio con il proprio allenatore. Ogni squadra è identificata da un nome, dal colore della maglia, dal punteggio raggiunto e dal proprio allenatore. Per ciascun allenatore specifichiamo i campi nome, cognome e il numero dei titoli vinti.
Scrivere quindi un programma in C che, dichiarata una tabella Fantacalcio di tipo Squadra con al massimo 10 elementi, permetta di inserire i dati delle squadre e degli allenatori. Visualizzare poi il cognome e il nome degli allenatori che hanno più di 10 punti in classifica. Visualizzare inoltre il numero totale di allenatori che hanno vinto almeno un titolo.
Quindi definiamo la struttura rec_Squadra che contiene i campi specificati sopra e i campi inerenti i dati dell’allenatore definiti come struttura.
#include <stdio.h>
#include <string.h>
#define MAX 10
typedef struct{
char squadra[20];
char maglia[20];
int punteggio;
struct rec_Allenatore{
char cognome[20];
char nome[20];
int titoli_vinti;
}allenatore;
} rec_Squadra;
void main(void){
int i,n,tot=0;
rec_Squadra fantacalcio[MAX]; /*tabella Fantacalcio di tipo rec_Squadra che al più contiene 10 elementi*/
do{
printf("Quante squadre vuoi inserire?:");
scanf("%d", &n);
} while (n<1 || n>MAX);
for (i=0; i<n; i++){
printf("Squadra %d:",i+1);
scanf("%s", fantacalcio[i].squadra);
printf("Colore della maglia:");
scanf("%s", fantacalcio[i].maglia);
printf("punteggio corrente:");
scanf("%d", &fantacalcio[i].punteggio);
printf("cognome allenatore :");
scanf("%s", fantacalcio[i].allenatore.cognome);
printf("nome allenatore :");
scanf("%s", fantacalcio[i].allenatore.nome);
printf("titoli vinti :");
scanf("%d", &fantacalcio[i].allenatore.titoli_vinti);
}
printf("Allenatori la cui squadra ha piu' di 30 punti:");
for (i=0; i<n; i++){
if(fantacalcio[i].punteggio>10)
printf("\nSquadra: %s\n Allenatore: %s\t %s\n ",fantacalcio[i].squadra, fantacalcio[i].allenatore.cognome, fantacalcio[i].allenatore.nome );
if(fantacalcio[i].allenatore.titoli_vinti>=1)
tot++;
}
printf("\nAllenatori che hanno vinto almeno un titolo: %d", tot );
}
Chiaramente questi sono solo dei semplici esempi d’uso delle strutture complesse in C.
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