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.

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

INFORMATICA Altre Istruzioni di I/O
LINGUAGGIO DI PROGRAMMAZIONE C
Uso avanzato di C.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità F2 Selezione.
Selezione - approfondimento
Procedure e funzioni In linguaggio C.
PHP.
MATLAB.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Algoritmi e Programmazione
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
Introduzione al linguaggio C
Programmazione Procedurale in Linguaggio C++
Programmazione Procedurale in Linguaggio C++
FUNZIONI DI BIBLIOTECA
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
PROGRAMMI DI RICERCA E ORDINAMENTO
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Laboratorio di Linguaggi lezione XI: I/O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab m-file m-file script script Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali.
MATLAB.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali Esercizi vari Esercizi.
1. 2 ALCUNE INFORMAZIONI PRELIMINARI Docente: E. Burattini Libri di testo: Deitel H.M., Deitel P.J. – C++ Fondamenti di programmazione,
Introduzione agli stream e alle classi
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
Esercizi FUNZIONI Passaggio di parametri per valore, variabili e tipi locali e globali, prototipo.
Esercizi C sui tipi definiti dall’utente
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
File di testo, file binari
I File.
Le funzioni.
GESTIONE DEI FILE Per poter mantenere disponibili i dati tra le diverse esecuzioni di un programma (persi-stenza dei dati) è necessario poterli archi-viare.
FUNZIONI... Una funzione permette di dare un nome a una espressione rendendola parametrica float f(){ return * sin(0.75); } float f1(int x) { return.
File I record.
File ad accesso casuale o random
1. 2 Struct Al fine di illustrare luso del tipo struct, utilizzando le struct descritte nella lezione precedente, mostriamo come si scrive un programma.
Cicli in Fortran I cicli consentono di eseguire una sequenza di istruzioni più di una volta due tipi: Cicli iterativi Cicli while.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
void binario(int n); …………………
Creazione progetto in C++/DEV
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
1 Gestione dei File. 2 Perché i file? Sono strutture dati persistenti Sono solitamente memorizzati sui dischi –Si usano dall'interno dei programmi Realizzano.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
CORSO DI PROGRAMMAZIONE II Lezione 22
Programmazione in linguaggio C
Programmazione Web PHP e MySQL 1. 2Programmazione Web - PHP e MySQL Esempio: un blog.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
File binari Accesso a file con record di lunghezza costante Struct Persona { Int id; Char nome[50];// nome e cognome Double stipendio; }; Persona dipendente;
Strutture di controllo Esercizi!. Utilizzare i metodi: I modi per poter richiamare un metodo, di una classe (ad esempio SavitchIn) sono due. 1) E’ sempre.
Lez. 9 (13/14)Elementi di Programmazione1 Lezione 9 Valutazione di espressioni File di testo sequenziali.
Informatica 4 Funzioni. FUNZIONE: definizione MATEMATICA Relazione (o applicazione) binaria tra due insiemi A e B che associa a ogni elemento di A un.
CORSO DI PROGRAMMAZIONE II
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Operatori di incremento e decremento
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
C++:Strutture di Controllo
Copyright © Istituto Italiano Edizioni Atlas
Stringhe In linguaggio C. Stringhe  Un insieme di caratteri in sequenza forma una stringa.  Alcuni linguaggi definiscono per le stringhe uno specifico.
Il C `e un linguaggio di programmazione di uso generale, originariamente sviluppato per la scrittura del sistema operativo Unix, ed oggi disponibile su.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Algoritmi e basi del C Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
Linguaggio C++ Un esempio: Registrazione e lettura di dati in un file File e Stream.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Esercizi sui dati strutturati 13 Tipi di dati strutturati.
Files in C++ Motivazioni Un programma in esecuzione legge (sequenzialmente) una sequenza di caratteri prodotti "al volo" dall'utente (tramite tastiera)
Linguaggio C: Funzioni e Puntatori Laboratorio di Programmazione Gruppo 1.
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

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 codice forniscono ulteriori delucidazioni. #include using namespace std; int main () { char Nomefile[80]; double lun; //il file è di sola lettura ifstream file; cout << "Nome File="; //se il file non è nella stessa directory fornire il path completo cin >> Nomefile; //file binario aperto in input file.open(Nomefile,ios::in|ios::binary); // se il file non esiste il programma termina if (!file) { cerr<<"Non si puo' aprire il file"<<endl; system("pause"); return -1; } //il puntatore di lettura va alla fine del file file.seekg(0,ios::end); // legge la posizione del puntatore di lettura lun=file.tellg(); // chiude il file file.close(); cout<<"Lunghezza "<<Nomefile<< " ="<<lun<<endl; system("pause"); return 0; }

3 Ci sono ancora due metodi che ci consentono di scrivere e leggere sui file binari. I loro prototipi sono write ( (char*) indirizzo-di-blocco-memoria, int grandezza-blocco) read ( (char*) indirizzo-di-blocco-memoria, int grandezza-blocco) Questi due metodi, abbastanza simili, gestiscono soltanto blocchi di memoria che, attraverso il casting, vengono trasformati in caratteri; il carattere * dopo il char, sta ad indicare che è necessario fornire soltanto l’indirizzo del primo carattere come primo parametro e la lunghezza di tutto il blocco come secondo parametro..

4 Ad esempio per costruire un file di date, bisogna operare in questo modo: definire un file di tipo fstream di nome fstream datafile; aprire il file datafile sia in input che in output ed in formato binario : datafile.open(NomeFileFisico,ios::in|ios::out|ios::binary); determinare la lunghezza del record Tpdata con l’istruzione sizeof: lunghezza=sizeof(Tpdata); definire almeno una variabile di tipo Tpdata: Tpdata data1; scrivere i dati posizionandosi nel punto voluto con l’istruzione seekp(……) e dare il comando: write( (char*) &data1, lunghezza); leggere i dati posizionandosi nel punto voluto con l’istruzione seekg(……) dare il comando: read( (char*) &data1, lunghezza); Se il file è di tipo ofstream si può utilizzare soltanto il metodo write(……………), se è di tipo ifstream si può solo leggere con il metodo read(…………).

5 Esempio Riprendiamo l’esempio della lezione 2. In questo caso il programma deve gestire un insieme di persone conservando i dati sul disco; esso, inoltre, 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 o a scelta ordinate per data di nascita. Le function int MenuScelta(); void Inserimento(Tpersona&, char&); void Stampa(const Tpersona&); restano inalterate. L’unica function a cui dovremo apportare delle modifiche è la function Ricerca..

6 Altre modifiche riguarderanno il main: dobbiamo introdurre la dichiarazione di un file binario ed una costante intera che rappresenti la lunghezza del record. La prima volta che viene richiamato il programma, non trovando alcun file fisico, il programma va in errore; nella gestione dell’errore esso crea il file e, dopo, termina. Tutte le esecuzioni successive non forniranno alcun errore di apertura del file. Riportiamo il programma principale senza le funzioni; successivamente discuteremo la nuova versione della funzione Ricerca..

7. // PROTOTIPI int MenuScelta(); void Inserimento(Tpersona&,char&); void Stampa(const Tpersona&); bool Ricerca(char[],fstream&, Tpersona&, int,const int); double dataNum(Tpdata x); void ordinaBuble(Tpersona [], int n); void scambia (double&, double&);

8 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.

9 Il main contiene un ciclo do… while (il ciclo deve essere eseguito almeno una volta) al cui interno appare l’istruzione switch. caso 1 corrisponde all’inserimento 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.

10 La funzione MenuScelta deve scrivere 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 rispetti 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 DATI ORDINATI x NASCITA"<<endl; cout <<"5 - FINE"<<endl; cout <<" Scelta="; cin >>sc; } while (sc 5); return sc; }

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

12 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<< " Nome:"<<pers1.nome<<endl; cout << "Luogo ="<<pers1.luogo << " Data di nascita :"; cout<<pers1.nascita.giorno<<'/'<<pers1.nascita.mese<<'/'<<pers1.nascita.anno; cout<<endl; }

13. #include using namespace std; struct Tpdata { int giorno; int mese; int anno; }; struct Tpersona { char cognome[30]; char nome[20]; Tpdata nascita; char luogo[20]; }; Tpersona Persone[30]; const char Nomefile[]="persone.dat"; // PROTOTIPI int MenuScelta(); void Inserimento(Tpersona&,char&); void Stampa(const Tpersona&); bool Ricerca(char[],fstream&, Tpersona&, int,const int);

14 int main () { Tpersona persona1; int corrente; int NumPers; int scelta; char ch, cognome2[30]; const int Lrec=sizeof(Tpersona); // lunghezza della struttura Tpersona fstream filepers; // definizione ed apertura alla fine del file filepers.open(Nomefile,ios::in|ios::out|ios::binary|ios::ate); // apre il file in lettura o scrittura, modalità binaria, // posizionandosi alla fine //se il file non esiste lo crea con l'istruzione seguente if (!filepers) { filepers.open(Nomefile,ios::out|ios::binary|ios::trunc); // apre il file in modalità binaria, // posizionandosi in testa e cancellando quanto già c'è return 1; } NumPers=filepers.tellg()/Lrec; //calcola il numero di persone contenute nel file tellg()/ ritorna un intero che rappresenta la posizione del puntatore di lettura

15 do { scelta=MenuScelta(); cout<<"Numero Persone = "<<NumPers<<endl; switch (scelta) { case 1: Inserimento (persona1,ch); if (ch=='s') { filepers.seekp(0,ios::end); //si posiziona per la scrittura alla fine del file filepers.write((char*) &persona1, Lrec); //scrive sul file NumPers++; //incrementa di uno il numero di persone inserite nel file } break; case 2: cout<<"\n Cognome da ricercare="; cin>>cognome2; if (Ricerca(cognome2, filepers, persona1, NumPers, Lrec)) Stampa(persona1); else cout<<"\n Dati non trovati"<<endl; break; posiziona il puntatore di scrittura nella posizione pos

16 La funzione, Ricerca, ricerca i dati di una persona. 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. bool Ricerca(char cognome2[], fstream &file, Tpersona &s1, int Num, const int Lr) { int i=0; file.seekg(0, ios::beg); //posiziona lettura testa file bool trovato=false; while (i<Num && !trovato) { file.read((char*) &s1, Lr);//legge da file un singolo record if (strcmp(s1.cognome,cognome2)==0) // confronta stringhe { trovato=true; } else i++; } return trovato; }

17 case 3: cout << "\n\n STAMPA DATI "<<endl; filepers.seekg(0,ios::beg);//si posizione in testa al file for (int i=0; i<NumPers; i++) { filepers.read((char*) &persona1, Lrec);//legge i dati di un record Stampa(persona1); } break; case 4: cout << "\n\n STAMPA DATI ORDINATI x NASCITA"<<endl; filepers.seekg(0,ios::beg); for (int i=0; i<NumPers; i++) { filepers.read((char*) &persona1, Lrec);//legge i dati di un record Persone[i]=persona1; } ordinaBubble(Persone, NumPers); for(corrente=0;corrente<NumPers;corrente++) Stampa(Persone[corrente]); break; } } while (scelta>0 && scelta<5); filepers.close(); return 0;

18 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]); } void scambia (Tpersona &x1, Tpersona &x2) { Tpersona s; s=x1; x1=x2; x2=s; } double dataNum(Tpdata x) { return x.anno*10000+x.mese*100+x.giorno; } La procedura ordinaBubble ordina i dati che preventivamente sono stati inseriti in un array vet. filebin2

19 case 4: cout << "\n STAMPA DATI ORDINATI x NASCITA"<<endl; filepers.seekg(0,ios::beg); int j=0; for (int i=0; i<NumPers; i++) { filepers.read((char*) &persona1, Lrec);//legge i dati di un record int k=0; if (j==0) {Persone[0]=persona1;j++;} else { k=j;Persone[k]=persona1; while ((k>=0)&& ((dataNum(Persone[k].nascita)<dataNum(Persone[k-1].nascita)))) { scambia(Persone[k],Persone[k-1]); k--; } j++; } for(corrente=0;corrente<NumPers;corrente++) Stampa(Persone[corrente]); break; Ordinamento con insertion-sort

20 Esercizi. 1) Sia dato un file non ordinato Azioni.dat di record del tipo: struct tipor { char azione[20]; float valore_minimo; float valore_massimo; float valori_ultima_settimana[7]; }; Costruire un array di record chiamato Affari contenente tutti i record riguardanti le azioni che hanno un valore medio, nell’ultima settimana, maggiore o uguale dei due terzi del valore_massimo. Ordinare i record dell’array Affari per valore_minimo e, a parità, per nome azione.

21 2) Sia dato un file di articoli di magazzino, articoli.dat, contenente record del tipo struct TpArticolo { int Codice; char Descrizione[30]; int Quantità; double Costo, Prezzo; }; Scrivere una procedura che costruisca un array di record chiamato Guadagni che conservi tutti gli articoli il cui guadagno complessivo su ogni singolo pezzo è di almeno il 20%. Tali articoli, ordinati per guadagno complessivo decrescente, devono essere scritti sul file guadagni.dat. N.B. Guadagno complessivo = (Prezzo - costo)* Quantità.

22 3) Consideriamo le strutture seguenti: struct TpArt { int Codice; char Descrizione[30]; int Qmag: integer; //quantità contenuta in magazzino float Prezzo; int Scorta; //quantità minima in magazzino, oltre la quale si ordina altra merce }; struct TpVend { int Codice; int Qvend; }; Un grande magazzino ha degli articoli di tipo TpArt conservati nel file Articoli.bin; il campo Qmag rappresenta la quantità di quell’articolo presente in magazzino, Scorta la quantità minima necessaria per poter ordinare altri articoli dello stesso tipo. Il file Vendite.bin contiene record del tipo TpVend che rappresentano la vendita giornaliera degli articoli; il campo Codice è lo stesso di TpArt, mentre Qvend rappresenta la quantità venduta. Entrambi i file sono ordinati per codice. Scrivere una procedura che aggiorni il file Articoli.bin e stampi tutti gli articoli la cui quantità è minore uguale al campo Scorta ordinati in maniera crescente per Scorta,.

23 struct Tpdata{ int giorno; int mese; int anno; } struct Tpfattura{ int CodFor; //Codice Fornitore Tpdata DataF; //data fattura int numero; //numero fattura double netto; double iva; double totale; //totale fattura } struct Tpfornitore{ int CodFor; //Codice Fornitore char RagSoc[30]; //nome fornitore char via[30]; char citta[30]; char provincia[2]; double TotAcq; //totale acquisti dal fornitore } 4) -Si considerino le definizioni: Una ditta acquista vari articoli dai fornitori contenuti nel file “fornitori.dat”. Il campo TotAcq rappresenta il totale in euro degli acquisti effettuati presso il fornitore nei primi tre trimestri dell’anno. Il file “fatture.dat” contiene, invece, le fatture di acquisto della ditta emesse durante tutto l’ultimo trimestre nei confronti degli stessi fornitori. Calcolare per ogni fornitore il totale degli acquisti effettuati dalla ditta. Se la cifra supera i euro, viene riconosciuto alla ditta un ulteriore sconto del 3% sul totale degli acquisti. Scrivere una procedura che scriva su un file “sconto.dat” Nome fornitore, città, provincia, rimborso da richiedere per tutti i fornitori della ditta, ordinati alfabeticamente per nome, a cui va richiesto lo sconto.