Struct in C – In questa lezione faremo un esempio di utilizzo di strutture in C molto semplice, infatti nella scorsa lezione, strutture in C, avevamo solo dato qualche definizione.
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.
Procedimento esempio d’uso struct in C
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, lo memorizziamo nella variabile cerca e utilizzando la funzione strcmp controlliamo se qualche dato nella nostra struttura contiene quel cognome e se troviamo i dati 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 identificato di ciascun alunno, in modo da identificarlo univocamente. Nelle prossime lezioni vedremo come fare.
Ecco dunque il listato completo di questo semplicissimo esempio della struct 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];
int n,i,j,trovato;
char cerca[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", cerca);
trovato=0;
for(j=0;j<n;j++){
if(strcmp(a[j].cognome, cerca)==0) {
printf("\nAlunno trovato in posizione %d.\n%s\t%d\n",j+1,a[j].nome, a[j].voto);
trovato=1;
}
}
if (!trovato)
printf("\nAlunno non trovato.\n");
return 0;
}
Chiaramente questo è un semplicissimo esempio di strutture in C, nella prossima lezione vedremo altri esempi.
Quiz Scratch scuola primaria – Realizziamo in questo articolo un semplice quiz in Scratch che affronta i problemi di matematica della scuola primaria.
In realtà questo esercizio può anche essere ripreso alle medie magari con altri tipi di problemi.
Ipotizziamo dunque di avere tre quesiti:
Primo quesito:
Lorenzo entra a scuola alle 8 ed esce alle 16. Quanto dura la giornata scolastica di Lorenzo?
Secondo quesito:
Angelo ha trovato sulla spiaggia 20 conchiglie rosa e 13 conchiglie bianche. Quante conchiglie ha raccolto in tutto?
Terzo quesito:
Un grappolo d’uva era costituito da 22 acini. Maria ne ha mangiati 8. Quanti acini sono rimasti sul grappolo?
Chiaramente potete aumentare a piacimento il numero dei quesiti da proporre agli alunni.
Procedimento quiz Scratch scuola primaria
Procediamo creando le variabili necessarie.
Innanzitutto ci servirà una variabile che chiameremo risultato dove memorizzeremo la risposta data dall’utente.
Dopo ci servirà pure una variabile punti che si incrementerà di uno se la risposta è corretta.
Notiamo poi che tutti i quesiti sono composti da operazioni matematiche che sono effettuate su due numeri, ad esempio n1 ed n2.
Allora ecco le variabili necessarie:
Scegliamo uno sfondo e uno sprite qualunque:
Iniziamo a creare il codice a blocchi.
Innanzitutto inizializziamo la variabile punti a zero.
Dopo, di volta in volta, impostiamo le variabili create n1 ed n2 ai valori del problema dato.
Potevamo anche fare a meno di utilizzare le variabili, ma sono estremamente utili in quanto facilitano il cambio dei dati in tutto il problema.
Se la risposta data dall’utente coincide con il risultato calcolato dal programma allora si guadagnerà un punto.
Essendo tre i quesiti, il punteggio massimo totale è tre.
Al termine del quiz aggiungiamo l’invio del messaggio finito.
Quando dunque si riceve finito, in base al punteggio ottenuto verrà visualizzato un messaggio a video.
Questi sono i quiz inseriti nei blocchi unione. Fate riferimento ai quesiti scritti sopra.
Ecco il codice completo:
Il blocco invia a tutti finito per il calcolo del punteggio:
Chiaramente questo è solo un metodo per la risoluzione del semplice ‘quiz Scratch scuola primaria’, potete trovare tanti altri metodi, come ad esempio l’utilizzo dei blocchi.
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.
Affronteremo, in questa lezione, un altro esercizio sulle struct in C, prima di andare avanti con gli altri argomenti, al fine di consolidare quanto studiato finora.
Quindi proponiamo questo esercizio a scopo didattico:
Definire la struttura automobili che descrivere un’automobile in base alla marca, cilindrata, anno di immatricolazione e acquirente con nome e cognome. Scriviamo quindi un programma in C, che dichiara una tabella autosalonedi tipo automobili con 5 elementi. Il programma deve consentire di inserire i dati delle auto vendute e di visualizzare le marche delle auto, secondo una ricerca. Inoltre deve visualizzare il cognome dei proprietari con auto che hanno una cilindrata superiore a 1800 cc. Infine occorre visualizzare il numero di auto immatricolate in un determinato anno.
Innanzitutto definiamo la struttura automobili, specificando i vari campi.
Facciamo i controlli dell’input su n, la variabile che stabilisce il numero di auto da inserire,in modo da inserire da 1 a un massimo di 10 auto.
Predisponiamo l’inserimento dei dati e anche qui facciamo un controllo che la cilindrata sia compresa tra 800 cc e 2500 cc.
Controlliamo inoltre anche gli anni di immatricolazione, facendo in modo che l’anno inserito sia un valore compreso tra il 2000 e il 2019.
Effettuiamo le ricerche chiedendo dapprima la marca dell’auto da ricercare, e se la marca viene trovata nella tabella autosalone allora visualizziamo il nome e il cognome del proprietario.
Dopo effettuiamo una ricerca di tutte le auto che hanno una cilindrata maggiore di 1800 cc.
Infine l’ultima ricerca la facciamo sulle auto immatricolate in un determinato anno, visualizzando il totale.
Ecco il listato completo dell’esercizio sulle struct in C proposto oggi.
#include <stdio.h>
#include <string.h>
#define MAX 10
typedef struct {
char marca[20];
int cilindrata;
int anno;
char cognome[20];
char nome[20];
} automobili;
int main(){
int i,n,anno,tot=0;
automobili autosalone[MAX]; /*tabella autosalone di tipo automobili che al più contiene 10 elementi*/
char marca[20];
do{
printf("Quante auto vuoi inserire?:");
scanf("%d", &n);
} while (n<1 || n>MAX);
for(i=0; i<n; i++){
printf("\nAuto %d", i+1);
printf("\nMarca:");
scanf("%s", autosalone[i].marca);
do {
printf("Cilindrata:");
scanf("%d", &autosalone[i].cilindrata);
} while ((autosalone[i].cilindrata)<800 || (autosalone[i].cilindrata)>2500);
do {
printf("Anno immatricolazione:");
scanf("%d", &autosalone[i].anno);
} while ((autosalone[i].anno)<2000 || (autosalone[i].anno)>2019);
printf("Cognome:");
scanf("%s", autosalone[i].cognome);
printf("Nome:");
scanf("%s", autosalone[i].nome);
}
printf("\nQuale marca di auto cerchi?:");
scanf("%s", marca);
for (i=0; i<n; i++)
if(strcmp(autosalone[i].marca,marca)==0)
printf("%s %s\n ", autosalone[i].cognome, autosalone[i].nome);
printf("\n\nProprietari con auto di cilindrata maggiore di 1800 cc:");
for (i=0; i<n; i++)
if(autosalone[i].cilindrata>1800)
printf(" %s", autosalone[i].cognome);
printf("\n\nAnno:");
scanf("%d", &anno);
for (i=0; i<n; i++)
if(autosalone[i].anno==anno)
tot++;
printf("Auto immatricolate: %d", tot);
}
Chiaramente ci possono essere altri modi per risolvere questo semplice esercizio sulle struct in 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: typedeftipo 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:
Interox;
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.
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.