Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D La Corte in Rete
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Ernesto Burattini » 2.Struct


Struct

Al fine di illustrare l’uso del tipo struct, utilizzando le struct descritte nella lezione precedente, mostriamo come si scrive un programma che permette di gestire in memoria un numero massimo di 30 persone.

Il programma deve consentire l’inserimento dei dati, la ricerca di un dato conoscendo il cognome di una persona e la stampa su video di tutte le persone inserite ed eventualmente ordinate per data di nascita.

Struct (segue)

Il programma, oltre a contenere le definizioni delle strutture Tpersona e Tpdata, deve proporre un semplice menù:

Gestione Dati

  1. Inserimento
  2. Ricerca
  3. Stampa dati
  4. Stampa dati ordinati x data nascita
  5. Fine

Struct (segue)

Il programma, oltre a contenere le definizioni delle strutture Tpersona e Tpdata, deve proporre un semplice menù.

Il programma, oltre a contenere le definizioni delle strutture Tpersona e Tpdata, deve proporre un semplice menù.


Struct (segue)

Dallo pseudo-codice risulta la necessità di definire 5 function che risolvano i seguenti problemi:

  1. un menù che restituisca il numero dell’opzione prescelta: è una funzione che non ha input e deve restituire un intero;
  2. una procedura che consenta l’inserimento dei dati e li restituisca;
  3. una funzione che, assegnata una stringa rappresentante il cognome di una persona, restituisca tutti gli altri dati relativi alla stessa;
  4. una procedura che, data una struttura determinata, ne stampi tutti i dati;
  5. una procedura che, data una struttura determinata, ne stampi tutti i dati ordinati per un determinato campo.

Struct (segue)

Introduciamo i prototipi delle function:

  • MenuScelta, non ha input e restituisce un int.

La procedura Inserimento, restituisce il record di tipo Tpersona ed un carattere che potrà essere ’s’ ( il dato può essere conservato perché esente da errori ) o ‘n’ ( il dato non può essere conservato).
La procedura, Stampa, stampa a video i dati di una persona; poiché tali dati non possono essere cambiati dalla procedura, il tipo è preceduto dalla parola chiave const.


Struct (segue)

La procedura, ordinaBubble, ordina, per cognome, i record contenuti in un array.

La funzione, Ricerca, restituisce un intero che rappresenta l’indice dell’elemento trovato. Essa ha in input il cognome da ricercare, che è un array di caratteri, un array di strutture di tipo Tpersona ed un intero costante che rappresenta la sua lunghezza.


Struct (segue)

Vi sono poi due function ausiliarie:

La funzione, dataNum, che trasforma una data espressa in GG MM AAAA in un intero per effettuare confronti semplicemente.

La procedura, scambia, richiamata dalla procedura ordinaBuble per effettuare gli scambi tra gli elementi di un vettore sottoposto ad ordinamento.


Struct (segue)

La prima parte del programma include tutte le definizioni delle strutture e la dichiarazione dell’array  Persone che può contenere al massimo 30 elementi.

La prima parte del programma include tutte le definizioni delle strutture e la dichiarazione dell'array Persone che può contenere al massimo 30 elementi.


Struct (segue)

Il main inizia con le dichiarazioni delle variabili.

persona1 di tipo Tpersona,
corrente, che rappresenta l’indice corrente dell’array,
NumPers, che rappresenta il numero attuale di persone memorizzate,
scelta denota l’operazione da eseguire volta per volta,
ch e cognome2 sono le variabili di input delle function Inserimento e Ricerca.


Struct (segue)

Il main contiene un ciclo do… while (il ciclo deve essere eseguito almeno una volta) al cui interno appare l’istruzione switch che gestisce i seguenti casi:

caso 1 si inseriscono i dati; se l’utente preme ’s’ i dati della persona vengono aggiunti all’array Persone e la variabile NumPers è incrementata di uno;

caso 2 si assegna il cognome da ricercare e si richiama la funzione Ricerca: se il valore restituito di corrente è maggiore di -1, si stampano tutti i dati, altrimenti si avverte l’utente che il dato non è stato trovato;

caso 3 si esegue un ciclo for per stampare tutte le persone memorizzate;

caso 4 si esegue un ciclo for per stampare tutte le persone ordinate per data di nascita.

Struct (segue)

do {
scelta=MenuScelta();
cout<<"Numero Persone =" <<
switch (scelta)

{
case 1:
Inserimento (persona1,ch);
if (ch=='s')
Persone[NumPers++]=persona1;
break;

case 2:
cout<<"Cognome da ricercare="; cin>>cognome2;
corrente=Ricerca(cognome2, Persone,NumPers);
if (corrente>-1)
Stampa(Persone[corrente]);
else
cout<<"Dati non trovati"<
break;


Struct (segue)

case 3:
cout << " STAMPA DATI "<<endl;
for(corrente=0;corrente<NumPers;corrente++)
Stampa(Persone[corrente]);
break;

case 4:
cout << " STAMPA DATI ORDINATI PER DATA"<<endl;
ordinaBubble(Persone, NumPers);
for(corrente=0;corrente<NumPers;corrente++)
Stampa(Persone[corrente]);
break;
}
}  while (scelta>0 && scelta<5);
}  return 0;


Struct (segue)

La funzione MenuScelta deve mostrare sul monitor tutte le opzioni disponibili dando all’utente la possibilità di inserire soltanto un intero compreso tra 1 e 5.

La funzione, dopo aver controllato che il valore rispetta tali limiti, deve restituirlo al programma chiamante.


Struct (segue)

Si noti che dal MenuScelta può essere restituito anche il  valore 5 che passato al main provoca la terminazione del programma.

Si noti che dal MenuScelta può essere restituito anche il valore 5 che passato al main provoca la terminazione del programma.


Struct (segue)

La procedura Inserimento restituisce la struttura persona in pers1 e la variabile carattere ch che può contenere il carattere ’s’ o ‘n’. Le istruzioni della procedura si limitano ad acquisire i dati da tastiera.

void Inserimento (Tpersona& pers1, char& ch)
{
cout << " INSERIMENTO PERSONE "<<endl;
cout << "Cognome =";
cin >> pers1.cognome;
cout << "Nome =";

cin >>pers1.nome;
cout << "Data di nascita GG MM AAAA =";

cin >> pers1.nascita.giorno>>pers1.nascita.mese >>pers1.nascita.anno;
cout <<"Luogo di nascita:";

cin >>pers1.luogo;
cout<<"Salva (s/n)=";

cin>>ch;
}

Struct (segue)

La procedura Stampa visualizza sul monitor la struttura persona contenuta in pers1 con la clausola const; essa ha lo scopo di non consentire la variazione dei dati membri della struttura.

void Stampa(const Tpersona& pers1)
{
cout << "Cognome :"<< pers1.cognome<< "\n Nome:"<<pers1.nome<<endl;
cout << "Luogo ="<<pers1.luogo << "\n Data di nascita :";
cout<<pers1.nascita.giorno<<'/'<<pers1.nascita.mese<<'/'<<pers1.nascita.anno;
cout<<endl;
}

Struct (segue)

La funzione, Ricerca, verifica se la persona richiesta dall’utente è presente tra i dati della inseriti. Il cognome inserito da tastiera viene inviato alla funzione che, attraverso una ricerca lineare, restituisce:

vero se la persona è stata trovata;
falso nel caso in cui quel cognome non esiste nel file.

Struct (segue)

int Ricerca(char cognome2[], Tpersona pers[],const int NumPers) {
int i=0;
bool trovato=false;
while (i<NumPers && !trovato) {
if (strcmp(pers[i].cognome,cognome2)==0) {
trovato=true;
return i;
}
else  i++;
}
if (!trovato)
return -1;
}

Struct (segue)

La procedura ordinaBubble ordina i dati che preventivamente sono stati inseriti in un array denominato vet.

void ordinaBubble (Tpersona vet[], const int N)
{
int j, k;
Tpdata nasc1,nasc2;
for (k=0; k=k; j--)
{ nasc1=vet[j].nascita;
nasc2=vet[j+1].nascita;
if ( dataNum(nasc1) > dataNum(nasc2) )
scambia (vet[j],vet[j+1]);
}
}

Struct (segue)

La procedura scambia viene utilizzata dalla procedura ordinaBubble per scambiare tra loro due record.

void scambia (Tpersona &x1, Tpersona &x2)
{
Tpersona s;
s=x1;
x1=x2;
x2=s;
}

Struct (segue)

La procedura dataNum serve per trasformare una data espressa come GG MM AA in un intero al fine di permettere confronti rapidi.

double dataNum(Tpdata x)
{
return x.anno*10000+x.mese*100+x.giorno;
}

Eser_record.cpp

Esercizi

1) Utilizzando la struttura Tpersona, definita nell’esempio aggiungere al menù la voce cancellazione di un record: la function da scrivere deve prima ricercare l’elemento da cancellare (con la funzione Ricerca) e, successivamente, cancellarlo dall’array di record .

2) Definire la struttura impiegato che, oltre a tutti i dati già contenuti in Tpersona, ha:

data di assunzione;
livello ( operaio, impiegato, dirigente, ….);
stipendio annuo percepito l’anno precedente.

Utilizzando il programma proposto nell’esempio, apportare le necessarie modifiche per gestire i dati della struttura impiegato ( inserimento, ricerca, stampa ).

Esercizi (segue)

3) Utilizzando la struttura Tpdata già definita, scrivere due procedure, SommaData e SottraiData, che, assegnata una data ed un numero di giorni, restituiscano, in formato gg mm aa, rispettivamente la somma e la differenza tra la data ed il numero di giorni.

Ad esempio:
SommaData applicata alla data 13 5 03 e 124 giorni deve restituire la data 14 9 03;
SottraiData applicata alla data 13 5 03 e 104 giorni restituisce la data 28 1 03.

Esercizi (segue)

4) Definire una struttura Orario che comprenda ore ( da 0 a 23 ), minuti e secondi rappresentato nel formato seguente: hh mm ss.
Scrivere due procedure, SommaSecondi e SottraiSecondi, che, assegnati un orario ed un numero di secondi, restituiscano, in formato coerente, rispettivamente la somma e la sottrazione tra l’orario ed il numero di secondi.

Ad esempio:
SommaSecondi applicata all’orario 13 45 23 e 224 secondi deve restituire l’orario
13 49 7;
SottraiSecondi applicata all’orario 13 45 23 e 204 secondi deve restituire l’orario
13 41 59.

I materiali di supporto della lezione

Eser_record.cpp

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion

Fatal error: Call to undefined function federicaDebug() in /usr/local/apache/htdocs/html/footer.php on line 93