Piero Scotto - C141 C14 #14 Puntatori e file. Il problema dellordinamento. Debug.

Slides:



Advertisements
Presentazioni simili
Puntatori Linguaggio C.
Advertisements

INFORMATICA Algoritmi fondamentali
Uso avanzato di C.
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
Interfacce Java.
WSDL (Web Services Description Language) Laurea Magistrale in Informatica Reti 2 (2006/07) dott. Federico Paoloni
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Sezione: Costruttori Costruttori. Definizione dei costruttori Se per una classe A non scrivo nessun costruttore, il sistema automaticamente crea il costruttore.
1 struct Pila { private: int size; int defaultGrowthSize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialSize) ; Pila();
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
JAVA C import java.util.*; #include <stdio.h>
1 Esercitazione sui segnali Problema: creare un programma analizzatore di file testuali che prenda come argomenti il nome di un file e una sequenza di.
6.6Ordinamento di Vettori Ordinamento di dati –Applicazione computazionale importante –Virtualmente ogni organizzazione deve ordinare dei dati Enormi quantità
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
1 Implementazione di Linguaggi 2 PARTE 6 Implementazione di Linguaggi 2 PARTE 6 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
2000 Prentice Hall, Inc. All rights reserved. 1 Capitolo 6: Classi e astrazione dati 1.Introduzione 2.Definizione delle strutture 3.Accedere ai membri.
Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
Array Ricerca Ordinamento Fusione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
I File.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Ricerca di una chiave: Search(x, k) if x == nil or k == x.key return x
C14 #12 Verso le olimpiadi Piero Scotto - C14.
Piero Scotto - C141 C14 #6 I VETTORI (#define e const)
Un esempio: Registrazione e lettura di dati in un file
1 Università degli Studi di Messina Facoltà di Ingegneria Visilab – Computer Vision and Image Processing Lab Nanodesktop Software development kit per sistemi.
Fondamenti di Informatica Corsi di Laurea in Ingegneria Gestionale Canale AL ESERCITAZIONE 4 ARGOMENTI: STRINGHE DI CARATTERI.
JavaScript Lezione 5 Tipizzazione ed operazioni tra tipi diversi Istruzioni di input.
PRIMI DISEGNI CON CABRI Realizzato da Daniel Bulgarini e Matteo Co CLASSE 2°C LICEO PASCAL MANERBIO.
C OME CREARE I FRAME. Dal pannello File fai doppio clic sul file default.html per aprire la pagina (figura 1.1). Figura 1.1 Il file default.html.
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
OUTPUT FORMATTATO La funzione printf consente di effettuare la stampa a video formattata. Sintassi: printf ( stringa_formato, arg0, arg1, … ); La stringa.
Moduli o Form I Moduli permettono all'utente di immettere informazioni...
Equazione di secondo grado.
Piero Scotto - C141 C14 #09 Gestione stringhe: esercizio. Switch case. Variabili logiche.
void binario(int n); …………………
24 aprile 2002 Avvisi: Risultati 1 o Esonero: (entro) lunedi 27 disponibili nella pag. WEB, ma anche esposti nella bacheca fuori dal corridoio 2 o dente,
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
Test con JUnit. zJUnit è un ambiente di test per programmi Java ySviluppato da Kent Beck É possibile usare JUnit allinterno di Eclipse per eseguire i.
Esercizi su File.
Esercizi Liste.
SUBQUERY Chi ha un salario maggiore di quello di Abel? Occorre scomporre la query in due sotto problemi: MAIN : quali impiegati hanno un salario maggiore.
Piero Scotto - C141 C14 SINTASSI DEL C VARIABILI e COSTANTI.
Gestione dei file di testo, matrici e struct
Piero Scotto - C141 C14 #7 Do While – Break Funzioni ricorsive.
Piero Scotto - C141 C14 #8 Stringhe e relative funzioni.
Piero Scotto - C141 C14 #10 Il programma Dev-c++ Gestione dei file.
Soluzioni e commenti esercizi 1 e 2
2000 Prentice Hall, Inc. All rights reserved. I file Apertura e chiusura I file ad accesso sequenziale I file ad accesso casuale Apre un file già esistente.
Introduzione al linguaggio C. Cos’e’ il C? Il C e’ un linguaggio ad alto livello Un compilatore C prende in input un file contenente codice sorgente C.
Scrivere un algoritmo non deterministico di complessita` polinomiale che risolva il problema del commesso viaggiatore. Vengono proposte due soluzioni,
Collection & Generics in Java
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.
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.
1 ELEMENTI DI INFORMATICA Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Linguaggio C A.A. 2011/2012
.  I tipi di dati non primitivi sono gli array, le struct e le union.  Gli array sono degli aggregati di variabili dello stesso tipo.  La dichiarazione.
Introduzione al linguaggio C
Struct, enum, Puntatori e Array dinamici
Strutture classi e oggetti
Copia di oggetti il costruttore di copia ha le stesse particolarità della signature di un costruttore ordinario; il primo parametro è una reference ad.
APPUNTI SUL LINGUAGGIO C
Gestione di un banco di magliette
Process synchronization
Gestione di un ristorante
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Esercizi su File e Alberi Binari
Lucidi della Pof.ssa Pazienza
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C
APPUNTI SUL LINGUAGGIO C Allocazione dinamica della memoria
APPUNTI SUL LINGUAGGIO C
Transcript della presentazione:

Piero Scotto - C141 C14 #14 Puntatori e file. Il problema dellordinamento. Debug.

Finalità del corso Piero Scotto - C142

3

4

5

6

7

8 Algoritmi di ordinamento - Per inserimento (cerco ogni volta il più piccolo e lo inserisco) - Per selezione (cerco lelemento di valore minore e lo sposto allinizio) - Bubble sort (scorro il vettore e confronto a due a due gli elementi) - ricorsivi (quick sort)

Piero Scotto - C149 Lordinamento. La funzione qsort

Piero Scotto - C1410 La funzione qsort (algoritmo di Quick sort) Nel linguaggio C è presente la funzione qsort di libreria (stdlib.h) che permette di ordinare un vettore di elementi a un costo O(N log N), buono in termini di prestazioni. La funzione ha il seguente prototipo: int qsort(void *v, size_t dimV, size_t dimE, int (*cmp)(const void *a,const void *b)) dove v è lindirizzo del vettore da ordinare, dimV è la dimensione del vettore, dimE è la dimensione di un singolo elemento del vettore e cmp è la funzione che contiene il criterio con cui si può dire che un elemento è minore, maggiore o uguale di un altro. La funzione è progettata per poter agire su vettori contenenti qualsiasi tipo di dato, anche quelli definiti dal programmatore.

Piero Scotto - C1411 Come primo esempio supponiamo di voler ordinare un vettore di 10 interi: in questo caso la chiamata alla funzione qsort, supponendo che il vettore si chiami appunto vettore, sarà la seguente: qsort(vettore,10,sizeof(int),cmp); Ovviamente per realizzare lordinamento dovrà essere definita la funzione cmp, che risulta essere la parte più complicata. La funzione cmp deve comportarsi come la funzione strcmp di confronto tra stringhe nel C, cioè dovrà restituire un valore positivo se il primo elemento da confrontare è maggiore del secondo, minore di zero se il primo elemento è minore del secondo e uguale a zero se i due elementi sono uguali. In questo caso la funzione cmp dovrà essere così definita:

Piero Scotto - C1412 int cmp(const void *a, const void *b) { int primo = *(int *)a; int secondo = *(int *)b; if (primo > secondo) return 1; if (primo < secondo) return -1; return 0; } Come si può facilmente notare la funzione fa esattamen- te quanto detto in precedenza; qualche difficoltà di inter- pretazione la potrebbero dare le prime due righe, che in effetti non fanno altro che assegnare i valori degli interi da confrontare alle variabili primo e secondo, attraverso loperatore di casting e la dereferenziazione dei puntatori.

Piero Scotto - C1413 Loperatore di dereferenziazione (il simbolo e un asterisco) applicato a un puntatore restituisce il valore memorizzato nella variabile a cui punta. E linverso delloperatore &, che fornisce lindirizzo. Se il vettore fosse un vettore di double basterebbe sostituire alla parola int la parola double e tutto funzionerebbe senza altre modifiche. Se poi si volesse ordinare in ordine discendente anziché ascendente basterebbe invertire la definizione della funzione cmp. Cosa succede se invece di voler ordinare un vettore formato da tipi predefiniti (int, float, double, ecc.) ci fosse lesigenza di ordinare un vettore di strutture dati costruite ad hoc per il programma? In realtà le modifiche da fare sono minime, una volta capito come funziona qsort e la funzione di comparazione. Se ad esempio fosse stata definita una struttura per contenere i dati di peso e altezza di una persona in questo modo:

Piero Scotto - C1414 struct persona{ int peso; int altezza; }; allora la chiamata di qsort risulterebbe fatta in questo modo qsort(vettore,10,sizeof(persona),cmp); e la funzione di comparazione avrebbe questa dichiarazione int cmp(const void *a, const void *b) { persona primo = *(persona *)a; persona secondo = *(persona *)b; if (primo.peso > secondo.peso) return 1; if (primo.peso < secondo.peso) return -1; if (primo.altezza > secondo.altezza) return 1; if (primo.altezza < secondo.altezza) return -1; return 0; }

Piero Scotto - C1415

Piero Scotto - C1416 Per analizzare il funzionamento di un programma o per trovare errori un ottimo strumento è lanalisi dettagliata attraverso il DEBUG (F8) - Si seleziona una riga (del codice) di interesse - Si esegue fino al cursore - Step successivo - Nuova osservazione (new watch) nome variabile Si può analizzare step by step il programma e indagare il contenuto delle varibili

Piero Scotto - C1417 #include #define MAXPERSONE 100 #define LUNGNOME 32 /* definizione esterna perche' sia visibile anche nel prototipo */ struct persona { char nome[LUNGNOME]; char cognome[LUNGNOME]; int eta; int salario; }; void ordina(struct persona pe[], int n); int main() { struct persona pers, persone[MAXPERSONE] = {"","",0,0}; FILE *fp; char file[FILENAME_MAX]; int i; int numPersone; /* numero di persone lette */

Piero Scotto - C1418 printf("Nome del file da leggere: "); gets(file); if ((fp=fopen(file,"r")) == NULL) { fprintf(stderr, "Non posso aprire il file: %s\n", file); return EXIT_FAILURE; } i=0; while (i<MAXPERSONE && fscanf(fp, "%s%s%d%d", pers.nome, pers.cognome, &pers.eta, &pers.salario) == 4) persone[i++] = pers; if (!feof(fp)) fprintf(stderr, "Ci sono piu' di %d righe (ignorate)\n", MAXPERSONE); fclose(fp); numPersone = i; /* numero persone lette dal file */ ordina(persone, numPersone);

Piero Scotto - C1419 printf("Nome del file da scrivere: "); gets(file); if ((fp=fopen(file,"w")) == NULL) { fprintf(stderr, "Non posso aprire il file: %s\n", file); return EXIT_FAILURE; } for (i=0; i<numPersone; i++) { pers = persone[i]; fprintf(fp, "%s %s %d %d\n", pers.nome, pers.cognome, pers.eta, pers.salario); } fclose(fp); return EXIT_SUCCESS; }

Piero Scotto - C1420 void ordina(struct persona pe[], int n) { struct persona temp; int i, j, jmin; /* ordinamento selection sort con chiave il campo cognome */ for (i=0; i<n-1; i++) { jmin = i; for (j=i+1; j<n; j++) if (strcmp(pe[j].cognome,pe[jmin].cognome) < 0) jmin = j; temp = pe[jmin]; pe[jmin] = pe[i]; pe[i] = temp; } /* Note. Si preferisce verificare se la fscanf() restituisce 4 e non EOF perche' EOF viene restituito solo se NESSUN elemento viene letto arrivando alla fine del file; se invece per qualche motivo (es. sono rimasti da 1 a 3 valori) vengono letti meno di 4 valori, la fscanf() restituisce il numero di valori letti. La scanf() avrebbe potuto leggere i valori e collocarli subito nei membri: scanf(... persone[i].nome, persone[i].cognome, &persone[i].eta, &persone[i].salario) ma usare una variabile intermedia e' piu' chiaro e veloce (non deve calcolare ogni volta la posizione dell'elemento i del vettore) */

Piero Scotto - C1421 File salari.txt PAOLO ZANCHI ANTONIO LOMONACO LUCIANO AIELLO MARIO SALVETTI Salari_ord.txt LUCIANO AIELLO ANTONIO LOMONACO MARIO SALVETTI PAOLO ZANCHI