Camuso Dot It
accelera il tuo apprendimento
HOME Esercizi Videolezioni
Videoesercizi Links

Esercizi
C# - Files binari

Ti interessano anche i file di testo? Clic qui
Oppure file di testo usati insieme a file binari? Clic qui

 

Rubrica

24-02-09

 

 

Soluzione

Progetto

 

LIVELLO DIFFICOLTA': avanzato - ambiente Windows.

Si vuole realizzare una applicazione windows per gestire una rubrica di contatti telefonici:

  1. Implementare la classe Contatti che rappresenta la scheda di base da gestire (Cognome, Nome, Indirizzo, cellulare, eta, posizione, attivo).

    Il campo posizione serve a memorizzare da quale posizione nel file viene letto un certo contatto: in questo modo quando attraverso l’interfaccia si comanda una qualsiasi operazione si sa dove operare sul disco (ad esempio per cancellare un contatto selezionato con il mouse sul video tramite il listbox).

    Il campo attivo è un bool: se false significa che il contatto pur presente nel file deve essere considerato cancellato; in questo modo viene ignorato nelle ricerche. Periodicamente il file può essere compattato eliminando fisicamente i contatti indicati come non più attivi (poiché non è possibile eliminare fisicamente una parte di un file è necessario copiare tutti i contatti attivi in un nuovo file temporaneo, eliminare il vecchio file della rubrica e rinominare il file temporaneo con il nome della rubrica).

  2. Implementare la classe Rubriche che mantiene un elenco di contatti esclusivamente su un file binario: nello stato interno mettere infatti solo un oggetto di tipo contatti con i dati del proprietario della rubrica ed il percorso+nome del file su cui mantenere i contatti del proprietario. Dovranno essere resi disponibili i seguenti metodi:
    1. Aggiungi(contatto): per aggiungere un nuovo contatto sul file; se si tratta di un duplicato chiede conferma.
    2. Cerca(cognome): restituisce una lista di contatti (quelli con il cognome passato come parametro); se il cognome è uguale alla stringa nulla allora restituisce una lista con TUTTI i contatti.
    3. ModificaConRicerca(vecchioContatto, nuovoContatto): sostituisce i dati di vecchioContatto con quelli nuovi; nota: i parametri sono oggetti di tipo Contatti. Cerca un contatto sul file con TUTTI i dati identici al primo parametro; se lo trova lo sovrascrive con i dati presenti nel secondo parametro.
    4. ModificaConPosizione(posizione, nuovoContatto): sostituisce i dati del contatto alla posizione indicata sul file della rubrica con i nuovi dati forniti.
    5. Elimina(posizione): il contatto alla posizione indicata viene marcato come non attivo.
    6. Compatta: vengono eliminati i contatti marcati come non attivi (vedi anche nota per il campo attivo della classe Contatti)

  3. Implementare una form di gestione delle rubriche che consenta tutte le operazioni implementate nella classe rubrica.

Interfaccia

La seguente è solo una proposta di realizzazione dell’interfaccia che rappresenta un discreto compromesso tra un programma ‘vero’ ed un livello di difficoltà adeguato all’uso didattico.

 

L’applicazione fa scegliere all’apertura file della rubrica da usare. L’utente può annullare se ha intenzione di creare una nuova rubrica (verranno chiesti su una scheda separata i dati del proprietario).

 

Nel pannello di sinistra si inseriscono i dati di un nuovo  contatto che viene aggiunto con il bottone ‘Aggiungi’.

 

Per modificare i dati di un contatto già inserito o per eliminare un contatto bisogna prima cercarlo: si scrive un cognome (per intero e rispettando le maiscule/minuscole) nel pannello di sinistra e si fa clic sul bottone ‘Cerca’; nel listBox sulla destra  verranno visualizzati i dati di tutti i contatti con quel cognome. Se per la ricerca si lascia vuoto il campo cognome il sistema fornirà l’elenco completo dei contatti. Poi:

  • per modificare un contatto: doppio click su  una delle righe della sua scheda nel listBox; i suoi dati verranno copiati nel pannello di sinistra ove potranno essere modificati; le modifiche possono essere registrate facendo click su uno dei bottoni ‘Registra’ (cambia solo il modo in cui la rubrica localizza il record da modificare);
  • per eliminare un contatto: fare clic su una delle sue righe nel listBox  e poi clic sul bottone ‘Elimina’

 

Periodicamente l’utente potrà compattare la rubrica eliminando i contatti marcati come non attivi usando il bottone ‘Elimina’.

 

Proposte di miglioramento

 

  • salvataggio in automatico dei dati del proprietario (il contatto che corrisponde al proprietario dovrebbe essere protetto dalle operazioni di cancellazione e soggetto a verifica, password?, per le modifiche);
  • poter comandare operazione con click destro sul listBox dei risultati; poter annullare l’ultima operazione (o, difficile, fino ad un max di operazioni) di modifica / cancellazione;
  • poter comandare ricerche senza inserire il cognome completo;
  • poter cercare con altri criteri (per indirizzo, età, cellulare) eventualmente (difficile) usando criteri AND / OR / NOT

 

 

Training01

10-02-09

 

 

Soluzione

Progetto

 

LIVELLO DIFFICOLTA': principiante.

1. Creare un file binario ‘tombola.dat’ contenente 90 numeri estratti a caso (sono ammessi doppioni).

2. Riaprirlo nella modalità che consente di leggere/scrivere e calcolare la media (double) dei numeri prima registrati.

3. Aggiungere in fondo al file il valore della media (sfruttare la modalità attiva!).

4. Con il comando seek tornare indietro nel file di un numero di bytes pari alla dimensione del double (8 bytes) e rileggere la media visualizzandola sullo schermo come verifica delle operazioni eseguite.

5. Posizionarsi quindi prima del quinto numero presente nel file (gli int occupano 4 bytes).

6. Sovrascrivere con degli 0 tre numeri consecutivi a partire dalla posizione raggiunta.

7. Rileggere l’intero contenuto del file con ReadInt32: perché gli ultimi due numeri visualizzai hanno valori così ‘strani’ ?

 

Training02

10-02-09

 

 

Soluzione

Progetto

 

LIVELLO DIFFICOLTA': principiante.

1. Leggere da tastiera una serie di frasi e registrarle su un file binario usando il metodo PadRight(lunghezzaTotale, carattereRiempimento) delle stringhe per formattare tutte le stringhe alla lunghezza di 50 caratteri usando lo spazio come carattere riempitivo; se invece la stringa è più lunga di 50 i caratteri la stringa deve esser e troncata usando il metodo Substring(inizio, n. caratteri) della classe string. Il fatto di avere blocchi di dati di lunghezza uguale ci permetterà di usare il metodo seek per accedere in modo diretto ad una stringa qualsiasi; l’inserimento termina quando viene digitato ‘FINE’. NOTA: per la creazione attivare la modalità di accesso ReadWrite così da poter rileggere il file senza bisogno di chiuderlo.

2. Senza chiudere il file rileggerlo dall’inizio e visualizzare su righe separate tutte le stringhe.

3. Rileggere la terza frase e stamparla a video (usare il metodo seek per spostarsi).

4. Tornando ora indietro sovrascrivere la seconda stringa con degli asterischi.

5. Aggiungere in fondo al file 5 righe di 50 asterischi.

6. Rileggere il contenuto di tutto il file e visualizzarlo

 

Training03

22-02-09

 

 

Soluzione

Progetto

 

LIVELLO DIFFICOLTA': medio.

PREMESSA. Per poter sfruttare al meglio il comando seek è necessario che le schede (tecnicamente si parla di record, cioè registrazioni) abbiano tutte una stessa lunghezza prefissata;  quest’ultima è la somma di quelle dei campi informativi (field) che compongono ciascuna scheda (ad esempio cognome, nome, indirizzo ecc.).

 

Mentre per i tipi numerici standard l’occupazione in byte è nota e fissa (un int32 occuperà sempre 4 byte, un double o un DateTime sempre 8 byte) per le stringhe è necessaria qualche considerazione in più:

a) il formato di memorizzazione dipende dal linguaggio usato; alcuni linguaggi (vedi il C) non memorizzano la lunghezza della stringa sul file ma marcano la fine con un terminatore (il famoso NULL, ‘\0’); il C# mette DAVANTI ai caratteri uno o più byte che specificano la lunghezza (secondo la non immediata codifica a 7 bit)


b) scrivendo un campo stringa è necessario assicurarsi che la stringa sia sempre lunga il massimo consentito per quel campo; lo si può fare aggiungendo in registrazione degli spazi sulla destra usando il metodo PadRight delle stringhe

 

1. Definire la classe schedaRicambio che descrive un ricambio per moto; ogni ricambio è descritto da un codice intero, una descrizione ed un costo (double). Definite solo il costruttore che riceve tutti questi dati ed i tre metodi get… per ottenere il valore di tutte le variabili dello stato intero.

 

2. Creare il file ricambi.dat. Creare un oggetto schedaRicambio e salvarlo sul file. Chiudere il file.

 

3. Riaprire il file in append e salvare un  secondo oggetto. Chiudere il file.

 

4. Aprire il file in lettura/scrittura e con il metodo seek posizionarsi all’inizio della seconda scheda, leggerla e stamparla a video; tornare sempre con il seek all’inizio, leggere la prima scheda e stamparla a video.

 

5. Usare la seek per posizionarsi prima del costo della prima scheda e sovrascriverlo con il valore 9999.0

 

6. Rileggere e ristampare a video la prima scheda verificando l’avvenuta modifica.

 


Pass e ritardi

 

 

 

Soluzione

Progetto

 

LIVELLO DIFFICOLTA': avanzato.

NB: per questo esercizio esiste anche la versione video in cui sviluppo passo passo la soluzione! Clic qui per il vdeoEsercizio

Implementare una classe che descrive un ‘Pass’, il foglietto che in alcune scuole consente agli alunni in ritardo di entrare comunque in aula registrando l’evento. Nello stato interno mettere: cognome (string, 29 caratteri), ritardo in minuti (int32), la data (string, 10 caratteri); realizzate l’accesso tramite properties.

Definire poi la classe ‘Ritardi’ per gestire un file di oggetti Pass: nello stato interno mettete il nome per un file di testo (ftesto) ed uno per un file binario (fbinario); mettete inoltre un vettore di 100 pass. Implementare poi i seguenti metodi:

- Travasa: legge i dati di nuovi pass eventualmente presenti nel file di testo e li aggiunge al vettore; se il vettore diventa pieno i pass in più vengono ignorati.
- Salva: trasferisce i pass dal vettore al file binario (che deve essere creato nuovo)
- Annulla: riceve la posizione nel file binario (1=primo, 2=secondo ecc.) di un pass che deve essere sovrascritto con spazi nei campi cognome e data e con il valore 0 nel campo ritardo.
- Cerca: riceve una data per localizzare sul file binario tutti i pass con quella data per azzerare i minuti di ritardo corrispondenti.
- Add per aggiungere un pass al vettore: se il vettore è diventato pieno lo stesso metodo prima lo ‘svuota’ salvando i pass in coda a quelli esistenti sul file binario.
- Export: salva sul file di testo i pass del vettore con ritardo superiore ad un certo numero di minuti.
- Aggiorna: riceve i nuovi dati e la posizione di un pass da aggiornare sul file binario.
- Azzera: riceve i dati vecchi di un pass che deve essere prima localizzato sul file binario per poi sovrascrivere tutti i sui campi (con spazi nei campi cognome e data e 0 come ritardo).

 

 

N o v i t à


Tutte le videolezioni sono ora su youtube (per ricevere notifiche di nuove videolezioni ISCRIVITI al mio canale) VAI su youtube


Mappa di tutte le playlist clic qui