Home Insegnanti Contattami Portfolio

Struct

Link utili

C Structures (structs)
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
https://www.w3schools.com/c/c_structs.php#

Struct

Le strutture (chiamate anche struct) sono un modo per raggruppare diverse variabili correlate in un unico posto. Ogni variabile nella struttura è nota come membro della struttura.

A differenza di un array , una struttura può contenere molti tipi di dati diversi (int, float, char, ecc.).

Nota: possibile anche creare array (vettori) di strutture, come vedremo più avanti.

struct libro { // dichiarazione della struct
  char titolo[100]; // membro (tipo stringa)
  char autore[50];  // membro (tipo stringa)
  int anno_pubblicazione;  // membro (tipo int)
  float prezzo;  // membro (tipo float)
};  // fine della struct

Per accedere alla struttura è necessario crearne una variabile.

Utilizzare la structparola chiave all'interno del main()metodo, seguita dal nome della struttura e quindi dal nome della variabile di struttura:

struct nome_struct nome_variabile;

dove:

struct libro {
  char titolo[100];
  char autore[50];
  int anno_pubblicazione;
  float prezzo;
};

int main() {
	struct libro l;
}

Accedere ai campi

per accedere ai campi (variabili) interne si usa il simbolo .

// dichiarazione della struct
struct libro {
  char titolo[100];
  char autore[50];
  int anno_pubblicazione;
  float prezzo;
};

int main() {
	// dichiarazione dell'oggetto della struct
	struct libro s;

	// accesso ad un campo della struct
	s.titolo = "Diario di Jorge";

	// stampa il titolo del libro
	printf ("%s \n", s.titolo); //output: Diario di Jorge
	
	return 0;
}

Passare una struct ad una funzione

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

struct student {
	int id;
	char name[20];
	float percentage;
};

void func(struct student *record) {
	printf(" Id is: %d \n", record->id);
	printf(" Name is: %s \n", record->name);
	printf(" Percentage is: %f \n", record->percentage);
}

int main() {
	struct student record;
	
	record.id=1;
	strcpy(record.name, "Raju");
	record.percentage = 86.5;
	
	func(&record);
	return 0;
}

Esempi

Esempio 1

realizzare una struct “classe” con 2 metodi:

che chiede all'utente l'inserimento dei campi della struct e ne stampi il contenuto.

SOLUZIONE:

#include <stdio.h>

struct classe {
	char nome[2];
	int alunni;
};

int main() {

	struct classe s;
	
	// inserimento
	printf("Inserisci il nome della classe (1A, 2B..): ");
	scanf("%s", s[i].nome);
	printf("Inserisci il numero di alunni: ");
	scanf("%d", &s[i].alunni);
	printf("\n");


	// stampa
	printf("Nome della classe: %s\n", s[i].nome);
	printf("Numero alunni: %d\n", s[i].alunni);
	printf("\n");

	return 0;
}

Esempio 2

realizzare una struct “classe” con 2 metodi:

che chiede all'utente l'inserimento dei campi della struct e ne stampi il contenuto. Nota: utilizzare un array di struct (es. struct classe s[size]; con size grandezza arbitraria).

SOLUZIONE:

#include <stdio.h>

struct classe {
	char nome[2];
	int alunni;
};

int main() {
	int size = 3;

	struct classe s[size];
	
	// inserimento
	for (int i=0; i<size; i++) {
		printf("Inserisci il nome della classe (1A, 2B..): ");
		scanf("%s", s[i].nome);
		printf("Inserisci il numero di alunni: ");
		scanf("%d", &s[i].alunni);

		printf("\n");
	}

	// stampa
	for (int i=0; i<size; i++) {
		printf("Nome della classe: %s\n", s[i].nome);
		printf("Numero alunni: %d\n", s[i].alunni);

		printf("\n");
	}

	return 0;
}

Esempio 3

come l'esercizio presedente, ma in più aggiungere la funzione “ordinamento” che ordina gli elementi della struct in base al campo “alunni”, l'obbiettivo è quello di ottenere la stampa ordinata in ordine crescente

SOLUZIONE:

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

struct classe {
	char nome[2];
	int alunni;
};

void inserimento(struct classe *s, int size) {
	for (int i=0; i<size; i++) {
		printf("Inserisci il nome della classe (1A, 2B..): ");
		scanf("%s", s[i].nome);
		printf("Inserisci il numero di alunni: ");
		scanf("%d", &s[i].alunni);

		printf("\n");
	}
}

void stampa(struct classe *s, int size) {
	for (int i=0; i<size; i++) {
		printf("Nome della classe: %s\n", s[i].nome);
		printf("Numero alunni: %d\n", s[i].alunni);

		printf("\n");
	}
}

void ordinamento(struct classe *s, int size) {
	int temp;
	char temp_nome[2];
	for (int i=0; i<size; i++) {
		for (int j=i+1; j<size; j++) {
			if (s[i].alunni > s[j].alunni) {
				temp = s[i].alunni;
				s[i].alunni = s[j].alunni;
				s[j].alunni = temp;

				strcpy(temp_nome, s[i].nome);
				strcpy(s[i].nome, s[j].nome);
				strcpy(s[j].nome, temp_nome);
			}
		}
	}
}

int main() {
	int size = 3;

	struct classe s[size];
	
	// inserimento
	inserimento(&s, size);

	// ordinamento
	ordinamento(&s, size);

	// stampa
	stampa(&s, size);

	return 0;
}