Un esercizio complesso dove non creiamo una struttura dati statica con relativo vettore. Creiamo invece un vettore di puntatori a struct e a runtime ci riserviamo lo spazio di memoria per la struttura dati. Punto cardine di questo passaggio è la funzione malloc, versatile quanto pericolosa chiamata a sistema.
/*
* Un esercizio complesso dove non creiamo una struttura dati statica con relativo vettore.
* Creiamo invece un vettore di puntatori e a runtime ci creiamo lo spazio di memoria per la struttura dati
* punto cardine di questo passagio è la funzione malloc
*/
#include <iostream>
using namespace std;
struct data
{
int gg;
int mm;
int aaaa;
};
typedef struct data Data;
struct posto
{
int id;
int classe;
char nome[20];
char cognome[20];
Data dataPrenotazione;
};
typedef struct posto Posto;
#define N 100
Posto * leggi();
void stampa(Posto * []);
int main()
{
//prima anomalia: vettore di posti non è statico, ma un vettore di puntatori a posto
Posto * vettorePosti[N];
int n=0;
//inizializzo il vettore con tutti i punatori a NULL
for (int i=0; i < N; i++)
{
vettorePosti[i] = NULL;
}
//inzio del corpo principale
while(n == 0 || n > N)
{
cout << "Quanti posti vuoi prenotare? ";
cin >> n;
}
for (int i=0; i < n; i++)
{
vettorePosti[i]= leggi();
}
stampa(vettorePosti);
return 0;
}
Posto * leggi()
{
Posto * buffer;
//mi creo un buffer su cui leggere i dati per poi inserirli
//o meglio puntarli al vettore nella prima posizione disponivbile
buffer=(struct posto *)malloc(sizeof(struct posto));
cout << endl <<"#Posto: ";
cin >> buffer->id;
cout << "Classe: ";
cin >> buffer->classe;
cout << "Nome: ";
cin >> buffer->nome;
cout <<"Cognome: ";
cin >> buffer->cognome;
cout << "Giorno prenotazione: ";
cin >> buffer->dataPrenotazione.gg;
cout <<"Mese prenotazione: ";
cin >> buffer->dataPrenotazione.mm;
cout <<"Anno prenotazione: ";
cin >> buffer->dataPrenotazione.aaaa;
return buffer;
}
void stampa(Posto * _vettorePosti[])
{
for (int i=0; i < N; i++)
{
//provo a stampare tutto il vettore ma controll osolo i puntatori valorizzati
//se no navessi dichiarato all'inio tutto a NULL cosa accadeva?
if (_vettorePosti[i] != NULL)
{
cout << "|-----------------------|" << endl;
cout << "|-------Posto "<< _vettorePosti[i]->id <<"--------|"<< endl;
cout << "|-----------------------|"<< endl;
cout << "Classe: " << _vettorePosti[i]->classe << endl;
cout << "Nome: " << _vettorePosti[i]->nome << endl;
cout << "Cognome: " << _vettorePosti[i]->cognome << endl;
cout << "Data prenotazione: " << _vettorePosti[i]->dataPrenotazione.gg << "/" <<_vettorePosti[i]->dataPrenotazione.mm << "/" << _vettorePosti[i]->dataPrenotazione.aaaa<< endl;
}
}
}
Ultima modifica 5 Giugno 2022