1. 2 Struct Al fine di illustrare luso del tipo struct, utilizzando le struct descritte nella lezione precedente, mostriamo come si scrive un programma.

Slides:



Advertisements
Presentazioni simili
Uso avanzato di C.
Advertisements

Informatica B Allievi Elettrici - AA Fondamenti della programmazione in linguaggio C (IV)
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità A2 Java: le basi del linguaggio.
Strutture dati In linguaggio C. Strutture Spesso gli algoritmi lavorano su insiemi di dati eterogenei Per esempio, per descrivere le caratteristiche di.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità G1 Dati strutturati.
Dati strutturati C++.
Interazione con lutente I menu. Menu La forma più semplice di interazione con lutente è il menu che fornisce una serie di opzioni tra le quali lutente.
Selezione - approfondimento
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture di controllo Ing.
Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Strutture di controllo Ing. Simona Colucci.
Differenze tra C e C++ Commenti: Adesso puoi inserire dei commenti tra // e la fine della linea. Usare le librerie C: In C++ puoi anche chiamare una funzione.
Introduzione al linguaggio C Dr. Francesco Fabozzi Corso di Informatica.
Un nuovo tipo di dati Gli array.
1 Directory Il formato delle directory varia nei vari FS utilizzati in ambito Unix Quando una directory viene aperta viene restituito un puntatore a un.
STRUTTURE DATI e LABORATORIO II ESERCITAZIONE N°13 Heap massimo.
Tail recursion: esempio
Alberi binari Definizione della struttura dati: struct tree { };
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione 1, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a.2009/2010 Prof.ssa Chiara Petrioli.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
Introduzione alla Object Oriented Programming, OOP E.Mumolo. DEEI
E.Mumolo. DEEI Introduzione alla programmazione ad oggetti in C++ Object Oriented Programming, OOP E.Mumolo. DEEI
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione XI: I/O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Laboratorio di Linguaggi lezione IX: tipi ricorsivi Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso.
1. 2 ALCUNE INFORMAZIONI PRELIMINARI Docente: E. Burattini Libri di testo: Deitel H.M., Deitel P.J. – C++ Fondamenti di programmazione,
Esempi di possibili domande per il compito di esame 1.Indicare un esempio di caso peggiore per lalgoritmo di Quicksort. 2.Scrivere un metodo per il calcolo.
Esercizi su pile Scrivere una funzione che restituisca una nuova pila che contiene i valori di una pila in ingresso in ordine inverso. La pila originale.
Esercizi su code Date due code in ingresso a valori interi in ordine crescente, scrivere una funzione che restituisca una terza coda che contenga i valori.
Struct, enum, Puntatori e Array dinamici
Strutture di controllo nel C
Politecnico di Milano Esercizi Stringhe Ricerca binaria.
Esercizi di riepilogo sul linguaggio C: file, puntatori, liste
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Lezione 17 maggio 2007 Parametri da linea di comando FILE Strutture (introduzione)
Lezione 24 maggio 2007 Strutture File Allocazione dinamica della memoria.
Piero Scotto - C141 C14 #09 Gestione stringhe: esercizio. Switch case. Variabili logiche.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Tipi di dati elementari
void binario(int n); …………………
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Lab 2 – Info B Marco D. Santambrogio – Riccardo Cattaneo –
Esercizi su File.
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Alberi binari Definizione della struttura dati: struct tree { };
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
CORSO DI PROGRAMMAZIONE II Lezione 22
Programmazione in linguaggio C
Esercitazioni su liste
Il linguaggio C Puntatori e dintorni.
Corso JAVA Lezione n° 03 Istituto Statale di Istruzione Superiore “F. Enriques”
File binari Accesso a file con record di lunghezza costante Struct Persona { Int id; Char nome[50];// nome e cognome Double stipendio; }; Persona dipendente;
1 Il linguaggio C Puntatori e dintorni. 2 Puntatori : idea di base In C è possibile conoscere e denotare l’indirizzo della cella di memoria in cui è memorizzata.
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 13 e 14 GESTIONE DEI FILE A) Nozioni sulla gestione dei.
CORSO DI PROGRAMMAZIONE II
Algoritmi e basi del C Struttura di un programma
1. 2 Esempi d’uso di file binari. Scriviamo un semplice programma che calcola la lunghezza di un file di qualsiasi natura. I commenti all’interno del.
Algoritmi e basi del C Struttura di un programma
Fondamenti di Informatica
Esercitazioni su alberi
Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( ) Laboratorio di programmazione Lezione 9 e 10 - Segmenti.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
Lezione 9 e 10 - Segmenti di memoria e puntatori - Aritmetica dei puntatori - Formattazione dei dati - Significato ed impiego del cast - Tipi di dato strutturato.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Esercitazione pre 1ma prova in itinere Marco D. Santambrogio – Ver. aggiornata.
Risoluzione esercizi Informatica - CDL in Ingegneria Industriale- A.A
Risoluzione esercizi. 3 PROGRAMMAZIONE STRUTTURATA Informatica - CDL in Ingegneria Industriale- A.A
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Esercizi sui dati strutturati 13 Tipi di dati strutturati.
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

1

2 Struct Al fine di illustrare luso 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 linserimento 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.

3 Struct 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 3- Stampa dati ordinati x data nascita 4- Fine struct TPersona { char cognome[20]; char nome[20]; Tpdata nascita; char luogo[20]; }; struct Tpdata { int giorno; int mese; int anno; };

4 Lo pseudo-codice consta di quattro possibili alternative, oltre ad una quinta di fine lavoro. do { scelta= opzione del menù switch (scelta) { case 1: // Inserimento Inserimento persona break case 2: // Ricerca Inserire Cognome da ricercare Ricerca la persona e la stampa break case 3: // Stampa dati Stampa tutti i dati break case 4: // Stampa dati ordinati x data nascita Stampa i dati ordinati x data di nascita } while (scelta>0 && scelta<5); Gestione Dati 1- Inserimento 2- Ricerca 3- Stampa dati 4- Stampa dati ordinati x data nascita 5- Fine

5 Dallo pseudo-codice risulta la necessità di definire 5 function che risolvano i seguenti problemi: un menù che restituisca il numero dellopzione prescelta: è una funzione che non ha input e deve restituire un intero; una procedura che consenta linserimento dei dati e li restituisca; una funzione che, assegnata una stringa rappresentante il cognome di una persona, restituisca tutti gli altri dati relativi alla stessa; una procedura che, data una struttura determinata, ne stampi tutti i dati. una procedura che, data una struttura determinata, ne stampi tutti i dati ordinati per un determinato campo.

6 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. // PROTOTIPI int MenuScelta(); void Inserimento(Tpersona&, char&); void Stampa(const Tpersona&); int Ricerca( char[], Tpersona[],const int); double dataNum(Tpdata x); void ordinaBubble(Tpersona [], int n); void scambia (double&, double&);

7 La procedura, ordinaBubble, ordina, per cognome, i record contenuti in un array. La funzione, Ricerca, restituisce un intero che rappresenta lindice dellelemento 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. // PROTOTIPI int MenuScelta(); void Inserimento(Tpersona&, char&); void Stampa(const Tpersona&); int Ricerca( char[], Tpersona[],const int); void ordinaBubble(Tpersona [], int n); double dataNum(Tpdata x); void scambia (double&, double&);

8 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 ordinaBubble per effettuare gli scambi tra gli elementi di un vettore sottoposto ad ordinamento. // PROTOTIPI int MenuScelta(); void Inserimento(Tpersona&, char&); void Stampa(const Tpersona&); int Ricerca( char[], Tpersona[],const int); void ordinaBubble(Tpersona [], int n); double dataNum(Tpdata x); void scambia (double&, double&);

9 La prima parte del programma include tutte le definizioni delle strutture e la dichiarazione dellarray Persone che può contenere al massimo 30 elementi. #include using namespace std; struct Tpdata { int giorno; int mese; int anno; }; struct Tpersona { char cognome[20]; char nome[20]; Tpdata nascita; char luogo[20]; }; Tpersona Persone[30]; ………………………………………

10 Il main inizia con le dichiarazioni delle variabili persona1 di tipo Tpersona, corrente, che rappresenta lindice corrente dellarray, NumPers, che rappresenta il numero attuale di persone memorizzate. scelta denota loperazione da eseguire volta per volta, ch e cognome2 sono le variabili di input delle function Inserimento e Ricerca. int main () { Tpersona persona1; int corrente,NumPers; int scelta; char ch; char cognome2[20]; NumPers=0; ……………….. }

11 Il main contiene un ciclo do… while (il ciclo deve essere eseguito almeno una volta) al cui interno appare listruzione switch che gestisce i seguenti casi: caso 1 si inseriscono i dati; se lutente preme s i dati della persona vengono aggiunti allarray 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 lutente 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. do { scelta= opzione del menù switch (scelta) { case 1: Inserimento persona break case 2: Ricerca la persona e la stampa break case 3: Stampa tutti i dati break case 4: Stampa i dati ordinati x data di nascita } while (scelta>0 && scelta<5);

12 do { scelta=MenuScelta(); cout<<"Numero Persone =" <<NumPers<<endl; 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"<<endl; break; int main () { Tpersona persona1; int corrente,NumPers; int scelta; char ch; char cognome2[20]; NumPers=0; ……………….. }

13 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; int main () { Tpersona persona1; int corrente,NumPers; int scelta; char ch; char cognome2[20]; NumPers=0; ……………….. }

14 La funzione MenuScelta deve mostrare sul monitor tutte le opzioni disponibili dando allutente 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.. int MenuScelta() { int sc; do { cout <<" GESTIONE PERSONE "<< endl; cout <<" \n"; cout <<"1 - INSERIMENTO"<<endl; cout <<"2 - RICERCA"<<endl; cout <<"3 - STAMPA TUTTI "<<endl; cout <<"4 - STAMPA ORDINATI PER NASCITA "<<endl; cout <<"5 - FINE"<<endl; cout <<" Scelta="; cin >>sc; } while (sc 5); return sc; }

15 Si noti che dal MenuScelta può essere restituito anche il valore 5 che passato al main provoca la terminazione del programma. int MenuScelta() { int sc; do { cout <<" GESTIONE PERSONE "<< endl; cout <<"1 - INSERIMENTO"<<endl; cout <<"2 - RICERCA"<<endl; cout <<"3 - STAMPA TUTTI "<<endl; cout <<"4 - STAMPA ORDINATI PER NASCITA "<<endl; cout <<"5 - FINE"<<endl; cout <<" Scelta="; cin >>sc; } while (sc 5); return sc; } do { scelta=MenuScelta(); cout<<"Numero Persone =" <<NumPers<<endl; 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"<<endl; break; 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;

16 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; }

17 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; }

18 La funzione, Ricerca, verifica se la persona richiesta dallutente è presente tra i dati 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.

19 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; }

20 int Ricerca(char cognome2[], Tpersona pers[],const int NumPers) { int i=0; while (i<NumPers && !(strcmp(pers[i].cognome,cognome2)==0)) i++; return i; } case 2: cout<<"\n\tCognome da ricercare="; cin>>cognome2; corrente=Ricerca(cognome2, Persone,NumPers); if (corrente<NumPers) Stampa(Persone[corrente]); else cout<<"\nDati non trovati"<<endl; break;

21 void ordinaBubble (Tpersona vet[], const int N) { int j, k; Tpdata nasc1,nasc2; for (k=0; k<N-1; k++) for (j=N-2; j>=k; j--) { nasc1=vet[j].nascita; nasc2=vet[j+1].nascita; if ( dataNum(nasc1) > dataNum(nasc2) ) scambia (vet[j],vet[j+1]); } La procedura ordinaBubble ordina i dati che preventivamente sono stati inseriti in un array denominato vet.

22 void scambia (Tpersona &x1, Tpersona &x2) { Tpersona s; s=x1; x1=x2; x2=s; } La procedura scambia viene utilizzata dalla procedura ordinaBubble per scambiare tra loro due record.

23 double dataNum(Tpdata x) { return x.anno*10000+x.mese*100+x.giorno; } La procedura dataNum serve per trasformare una data espressa come GG MM AA in un intero al fine di permettere confronti rapidi. Eser_rec_ordorario1Eser_rec_ord2

24 /* Esempio di lettura, confronto e scrittura in un array contenuto in un record a sua volta contenuto in un array di record*/ struct Tdati { int numeri[4]; char lettere[5]; }; Tdati dati[30]; ABGDK numeri[4]lettere[5] dati[30] 2316

25 /* Esempio di lettura, confronto e scrittura in un array contenuto in un record a sua volta contenuto in un array di record*/ struct Tdati { char lettere[20]; int numeri[4]; }; Tdati dati[30]; // PROTOTIPI void Inserimento(Tdati [], int); void Stampa(const Tdati [], int); void confronta(Tdati [], int); int elemArray=4; int main () { cout<<"\nCarica interi per riga "; Inserimento (dati, elemArray); Stampa(dati, elemArray); confronta(dati, elemArray); system("pause"); } void Inserimento (Tdati dat1[], int ndat) { for (int j=0;j<ndat;j++) { cout<<endl; for (int i=0;i<ndat;i++) {cout >dat1[j].numeri[i]; } cout > dat1[j].lettere; }

26 void Stampa(const Tdati dat1[], int ndat) { for (int j=0;j<ndat;j++) {cout<<"\n riga "<<j<<--"<<dat1[j].lettere<<" ** "; for (int i=0;i<ndat;i++) { cout<<dat1[j].numeri[i]<<" "; } } /* Esempio di lettura, confronto e scrittura in un array contenuto in un record a sua volta contenuto in un array di record*/ struct Tdati { char lettere[20]; int numeri[4]; }; Tdati dati[30]; // PROTOTIPI void Inserimento(Tdati [], int); void Stampa(const Tdati [], int); void confronta(Tdati [], int); int elemArray=4; int main () { cout<<"\nCarica interi per riga "; Inserimento (dati, elemArray); Stampa(dati, elemArray); confronta(dati, elemArray); system("pause"); }

27 void confronta(Tdati dat1[], int ndat) { char lettere2[20]; int ass[ndat]; bool flag; int cont=0; cout <<"\n\n Lista numeri da confrontare "<<endl; for (int y=0;y >ass[y]; cout >lettere2; for (int j=0;j<ndat;j++) { if (strcmp(dat1[j].lettere,lettere2)==0) cout<<"\n La lettere in posizione "<<j<<" coincide con quella assegnata"<<endl; else cont++; flag=true; int i=0; while ((i<ndat)&&(flag==true)) { if (dat1[j].numeri[i]!=ass[i])flag=false; i++; } if (flag==true) cout<<" riga "<<j<<" numeri uguali "<<endl; if (cont==ndat)cout<<" non ci sono stringhe uguali "<<endl; } if (flag==true) cout<<" non ci sono sequenze di numeri uguali "<<endl; } array rec1 int main () { cout<<"\nCarica interi per riga "; Inserimento (dati, elemArray); Stampa(dati, elemArray); confronta(dati, elemArray); system("pause"); }

28 Esercizi 1) Utilizzando la struttura Tpersona, definita nellesempio aggiungere al menù la voce cancellazione di un record: la function da scrivere deve prima ricercare lelemento da cancellare (con la funzione Ricerca) e, successivamente, cancellarlo dallarray 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 lanno precedente. Utilizzando il programma proposto nellesempio, apportare le necessarie modifiche per gestire i dati della struttura impiegato ( inserimento, ricerca, stampa ).

29 Esercizi 3) Utilizzando la struttura Tpdata già definita, scrivere una procedura, SommaData che, assegnata una data ed un numero di giorni, restituisca, in formato gg mm aa, la somma tra la data ed il numero di giorni (si supponga che i mesi siano tutti di 31gg). Ad esempio SommaData applicata alla data e 124 giorni deve restituire la data

30 Esercizi 4) Definire una struttura Orario che comprenda giorni, ore ( da 0 a 23 ), minuti e secondi rappresentato nel formato seguente: gg hh mm ss. Scrivere due procedure, SommaTempo e SottraiTempo, che, assegnati due tempi espressi in termini di numero di giorni, ore, minuti ed secondi, restituiscano, in formato coerente, rispettivamente la somma e la sottrazione tra i due tempi (sottraenso il tempo più lungo da quello più breve). Ad esempio SommaSecondi applicata allorario e 224 secondi deve restituire lorario SottraiSecondi applicata allorario e 204 secondi deve restituire lorario orario2