Le struct con il C
Cosa sono ? Variabili strutturate come i vettori … … ma che superano una limitazione dei vettori
Vettori fabiolucaalexvikateamaia Dati omogenei
Struct Singola variabile formata da molti Dati NON omogenei 167 Rossi Mario 12.8 True field (campo)
Struct E’ poi semplice definire array di struct 167 Rossi Mario 12.8 True 168 Verdi Sandro 8.8 False 169 Bianchi Achille 0 False 170 Neri Mario 9 True 167 Rossi Ugo 13 True
struct dipendenti { int matricola; string cognome; string nome; double assenzeMedie; bool stagionale; } 167 Rossi Mario 12.8 True
struct dipendenti { int matricola = 0; string cognome = “”; string nome; double assenzeMedie; bool stagionale; } ISO C++ proibisce l’inizializzazione
struct dipendenti { int matricola; string cognome; string nome; double assenzeMedie; bool stagionale; } L’identificatore della struct viene poi usato per dichiarare variabili che rispettano quel modello: dipendenti dip1, dip2; 0 “” 0 false
Ma è possibile assegnare valori in fase di dichiarazione come per gli array: dipendenti dip1 = {167, “Rossi”, “Mario”, 12.8, false};
Per accedere ai campi (field) di una struct si utilizza la cosiddetta notazione ‘punto’: dipendenti dip; dip.matricola = 167; dip.cognome = “Rossi”; dip.nome = “Mario”; dip.assenzeMedie = 12.8; dip.stagionale = false; 167 Rossi Mario 12.8 false
I valori possono essere assegnati / usati in tutti i modi che conoscete essere validi per le variabili semplici: cin >> dip.matricola; dip1.cognome = dip2.cognome; dip.nome = variabileStringa; dip.assenzeMedie = media(); cout << dip.nome; if (dip1.nome == dip2.nome)...
E’ possibile copiare tutti i campi da una struct ad un’altra con un solo assegnamento: dip1 = dip2
Possiamo dichiarare quante variabili ‘dipendente’ vogliamo: dipendenti dip1; dipendenti dip2; dipendenti tarzan; dipendenti fantozzi;
ATTENZIONE!! dipendenti.nome = …
Si possono molto efficacemente combinare array e struct dipendenti personale[100]; Array di struct personale[i].cognome = “…”
Oppure … una struct contenente vettori struct Classe { string sigla; //4aITIS int numeroAlunni; string NomiAlunni[35]; } Classe c; … c.NomiAlunni[i] = “…”;
Ed ora un esercizio che mette tutto insieme Si vuole gestire un catalogo dei propri MP3. Il catalogo può essere salvato e riletto da disco. Si possono ritrovare i dati sugli MP3 cercando per titolo (anche solo una sua parte)
Dati Richiesti titolo autore durata (secondi) url (download)
Esempio di file contenente i dati del catalogo MP3 Nome File: mp3.txt Roc Boys Jay-Z D.A.N.C.E. Justice 190
Interfaccia del programma Menu principale 1 – Carica catalogo da disco 2 – Salva catalogo su disco 3 – Aggiungi MP3 4 – Ricerche 9 – Fine programma
Funzioni scritte dal prof. - 1 FILES string leggiRiga(string pathFile); restituisce #FINITO# a fine file registraRiga(string pathFile, string riga); elimina(string pathFile); Ogni riga del file corrisponde ad un dato; è possibile preparare qualche dato in partenza con il blocco note.
Funzioni scritte dal prof. – 2 STRINGHE string maiuscolo(string s); string minuscolo(string s); string intToString(int n); bool cercaStringa(string cercata, string cercaQui) Funzioni libreria standard STRINGHE int atoi(string s);
Questioni da affrontare - 1 Dimensionare il vettore: a priori non si sa quanti mp3 ci sono nel file … come fare ? Sarebbe interessante dimensionare il vettore in modo da poter sempre aggiungere almeno altri 500 mp3 prima di essere costretti a far ripartire il programma
Questioni da affrontare - 2 Il file contiene stringhe di testo ma la durata nella struct è un int; come comportarsi?