lucidi a colori - diegm - Università degli Studi di Udine

Transcript

lucidi a colori - diegm - Università degli Studi di Udine
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
FONDAMENTI DI INFORMATICA
Prof. PIER LUCA MONTESSORO
Ing. DAVIDE PIERATTONI
Facoltà di Ingegneria
Università degli Studi di Udine
Linguaggio C
Scegliere un algoritmo
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
1
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Nota di Copyright
Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright
e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi
inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio,
musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide
Pierattoni, Università degli Studi di Udine.
Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca,
scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero
dell’Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di
lucro. In tal caso non è richiesta alcuna autorizzazione.
Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su
supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non
esplicitamente autorizzata per iscritto, a priori, da parte degli autori.
L’informazione contenuta in queste slide è ritenuta essere accurata alla data della
pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in
progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza
preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di queste slide
(ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità,
aggiornamento dell’informazione).
In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste
slide.
In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono
mai essere rimossi e devono essere riportati anche in utilizzi parziali.
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
2
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Scegliere un algoritmo
• Gli algoritmi classici sono descritti in
letteratura e vanno scelti in base alla
complessità del problema, al tipo di dati, ecc.
• Ogni problema ha poi bisogno di elaborazioni
specifiche dei dati in ingresso e in uscita
• Due grandi famiglie di problemi:
– mantengo tutti i dati in memoria e li elaboro
– elaboro e/o trasformo i dati man mano che li leggo
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
3
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Mantengo tutti i dati in memoria e li elaboro
definisco una struttura dati adeguata
(es. vettore di struct)
while (ci sono ancora dati)
leggo i dati e li memorizzo
elaboro i dati
genero il risultato (es. scrivo in un file)
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
4
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Mantengo tutti i dati in memoria e li elaboro
• NOTE:
– devo sapere la dimensione MASSIMA dei
dati da memorizzare
– la lettura dei dati tipicamente richiede una
funzione che interpreta il formato di
ingresso
– l’elaborazione dei dati richiede una o più
funzioni che NON ESEGUONO input né
output
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
5
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Elaboro e/o trasformo i dati
man mano che li leggo
definisco una struttura dati adeguata per
rappresentare un singolo dato
(es. una stuct, una stringa, un numero)
while (ci sono ancora dati)
{
leggo il dato e lo memorizzo in una variabile
elaboro il dato
genero il risultato
(es. scrivo il dato trasformato in un file)
}
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
6
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Elaboro e/o trasformo i dati
man mano che li leggo
• NOTE:
– utile quando NON CONOSCO LA
DIMENSIONE MASSIMA dei dati in
ingresso
– la lettura del singolo dato tipicamente
richiede una funzione che interpreta il
formato di ingresso
– l’elaborazione dei dati richiede una o più
funzioni che NON ESEGUONO input né
output
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
7
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Lettura del dato
• Caso 1: devo elaborare un testo
→ lettura carattere per carattere (es. fgetc)
• Caso 2: devo leggere dei dati testuali e
numerici in formato fisso (es. numero
predefinito di parole in ogni riga)
→ lettura formattata (fscanf con opportuni codici di
formato)
• Caso 3: i dati sono organizzati per righe, di
formato variabile
→ lettura riga per riga (fgets) e poi interpretazione
del formato lavorando sulla stringa
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
8
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Caso 1: esempio
...
while ((ch = fgetc (fp)) != EOF)
{
if (ch == '/')
trovato_slash = 1;
else if ((ch == '*') && trovato_slash)
{
in_commento = 1;
trovato_slash = 0;
}
else
trovato_slash = 0;
...
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
9
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Caso 2: esempio
...
while (fscanf (fpin, "%s %d %d",
s, &n1, &n2) != EOF)
{
totale += elabora (s, n1, n2, s_mod);
fprintf (fpout (fp, "%s %d", s_mod, n1);
}
return totale;
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
10
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Caso 3: esempio
...
while (fgets (s, NMAX, fp) != NULL)
{
dato_corrente = estrai_dato (s);
if (cerca_nome (dato_corrente.codice,
codice_cercato))
{
fprintf (fpout (fp, "%s %d",
dato_corrente.codice,
dato_corrente.prezzo);
}
}
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
11
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Ricerche
• Ricordarsi sempre che gli algoritmi di
ricerca sono asimmetrici:
...
while (ci sono ancora dati)
{
if (dato corrente == dato cercato)
return informazioni cercate
procedi al prossimo dato
}
return informazione di dato non trovato
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
12
Fondamenti di Informatica - Linguaggio C - Scegliere un algoritmo
Avanzare in una stringa
• Ricordarsi sempre
che ad un certo punto
la stringa finisce...
while (s[i] != '\0')
{
...
• Se siamo sicuri che il
formato sia corretto:
while (s[i] == ' ')
{
...
i++;
}
while (s[i] != ',')
{
...
i++;
}
while (s[i] != '\0')
{
...
i++;
}
© 2007 Pier Luca Montessoro - Davide Pierattoni (vedere nota di copyright a pag. 2)
13