Tutto in C
Tutto in C
Primo programma in C
Introduzione al linguaggio C
Struttura minima di un file C
Sottoinsieme minimale di istruzioni
Compilare il primo programma
Esercizi proposti
Sommario
2
Riferimenti al materiale
Testi
Kernighan & Ritchie: capitolo 1
Cabodi, Quer, Sonza Reorda: capitoli 1, 3
Dietel & Dietel: capitolo 1
Dispense
Scheda: “Primo programma in C”
3
Primo programma in C
Genesi del linguaggio C
5
Obiettivi del linguaggio
1978, K&R C
1989, ANSI C (o C89)
Frutto del lavoro di
standardizzazione del comitato
X3J11 dell’American National
Standards Institute
Standard X3.159-1989
“Programming Language C”
Seconda edizione del K&R
7
Evoluzione del linguaggio (2/2)
8
Diffusione attuale
9
Principali vantaggi del C
11
Un esempio
#include <stdio.h>
int main(void
void)
void
{
printf("hello, world\n");
return 0;
}
12
Primo programma in C
Struttura minima di un file C
2
Struttura minima di un file C
Tipi di applicazioni (1/4)
Applicazioni grafiche
Interazione mediante
mouse e finestre
Visualizzazione di testi
e grafica
Elaborazione
concorrente 4
Tipi di applicazioni (2/4)
Applicazioni batch
Nessuna interazione
utente
Compiti lunghi e
ripetitivi
Elaborazione numerica,
trasferimenti in rete 6
Tipi di applicazioni (4/4)
8
Modello di applicazioni “console”
Programma
eseguibile
Visualizzazione
Immissione dati 9
risultati
Modello di applicazioni “console”
Scrittura
programma Programma
sorgente in C
Compilatore C
Programma
eseguibile
Visualizzazione
Immissione dati 10
risultati
Modello di applicazioni “console”
Scrittura somma.c
programma Programma
sorgente in C
Compilatore C
[Link]
Programma
eseguibile
Visualizzazione
Immissione dati 11
risultati
Compilatore C
Compilatore C
12
Scrittura
programma
Scrittura del programma
13
Editor per programmatori
14
Scrittura
Compilatore C
programma
Ambienti integrati
15
Struttura minima di un file C
Struttura di un sorgente in C
#include <stdio.h>
int main(void
void)
void
{
int a ;
a = 3 ;
printf("hello, world\n");
printf("the magic number is %d\n", a) ;
return 0;
}
17
Struttura di un sorgente in C
Programma principale
#include <stdio.h> (funzione main)
int main(void
void)
void
{
int a ;
a = 3 ;
printf("hello, world\n");
printf("the magic number is %d\n", a) ;
return 0;
}
18
Struttura di un sorgente in C
#include <stdio.h>
int main(void
void)
void
{
int a ;
a = 3 ;
printf("hello, world\n");
printf("the magic number is %d\n", a) ;
return 0;
}
Parentesi graffe che
delimitano il main
19
Struttura di un sorgente in C
#include <stdio.h>
int main(void
void)
void Variabili utilizzate
dal programma
{
int a ;
a = 3 ;
printf("hello, world\n");
printf("the magic number is %d\n", a) ;
return 0;
}
20
Struttura di un sorgente in C
#include <stdio.h>
int main(void
void)
void
{
int a ; Istruzioni eseguibili
a = 3 ;
printf("hello, world\n");
printf("the magic number is %d\n", a) ;
return 0;
}
21
Struttura di un sorgente in C
Richiamo delle
#include <stdio.h> librerie utilizzate
int main(void
void)
void
{
int a ;
a = 3 ;
printf("hello, world\n");
printf("the magic number is %d\n", a) ;
return 0;
}
22
In generale
int main(void
void)
void
{
definizione variabili
istruzioni eseguibili
23
Struttura minima di un file C
Commenti
/* io sono un commento */
25
Sintassi
26
Esempio
/* programma: hello.c
autore: fulvio corno
*/
int main(void
void)
void
{
int a ; /* numero magico */
a = 3 ; /* assegno un valore */
/* salutiamo l'utente */
printf("hello, world\n") ;
printf("the magic number is %d\n", a) ;
return 0;
} 27
Spazi bianchi
28
Esempio
29
Esempio
#include <stdio.h>
int main(void
void)
void
{ int a ; a = 3 ; printf("hello, world\n") ;
printf("the magic number is %d\n", a) ; return 0; }
30
Struttura minima di un file C
Librerie di funzioni
32
Sintassi
Librerie principali:
#include <stdio.h>
Funzioni di lettura/scrittura su terminale e su file
#include <stdlib.h>
Funzioni base per interazione con sistema operativo
#include <math.h>
Funzioni matematiche
#include <string.h>
Elaborazione di testi 33
Avvertenze
34
Suggerimenti
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void
void)
void
{
. . . .
} 35
Struttura minima di un file C
Variabili
a 35 x -17
37
Variabili
a 35 x -17
41
Nomi ammissibili
42
Esempi di nomi
a b a1 a2
43
Esempi di nomi
a b a1 a2
44
Esempi di nomi
a b a1 a2
45
Esempi di nomi
a b a1 a2
46
Esempi di nomi
a b a1 a2
int main(void
void)
void
{
int a ;
int b ;
float x ;
. . . . .
48
}
Definizione di variabili
a ?
t
definizione
50
Valore contenuto
? a 37
t
definizione inizializzazione
51
Valore contenuto
? 37 a -4
t
definizione inizializzazione altra
assegnazione 52
Valore contenuto
? 37 -4 a -3
t
definizione inizializzazione altra incremento
assegnazione 53
Struttura minima di un file C
Istruzioni eseguibili
55
Esempio
/* programma: hello.c
autore: fulvio corno
*/
int main(void
void)
void
{
int a ; /* numero magico */
a = 3 ; /* assegno un valore */
/* salutiamo l'utente */
printf("hello, world\n") ;
printf("the magic number is %d\n", a) ;
return 0;
} 56
Tipologie di istruzioni
Istruzioni operative
Lettura dati
scanf("%d", &a) ;
Stampa risultati
printf("%d", a) ;
Elaborazione numerica
a = b + c ;
b = b + 1 ;
c = 42 ;
c = sqrt(a) ;
57
Tipologie di istruzioni
2
Sottoinsieme minimale di istruzioni
Tipi di dato
4
Il sistema dei tipi C
Tipo di dato
signed/unsigned Funzioni
5
Caratteristiche generali
6
Il tipo int
7
Esempi
i 0
int i, j ;
int N ;
int x ; j 2
i = 0 ;
j = 2 ; N
N = 100 ; 100
x = -3124 ;
x -3124
8
Il tipo float
9
Esempi
a 3.1
float a, b ;
float pigr ; b
float Nav, Qe ; 2.0
a = 3.1 ;
b = 2.0 ; pigr 3.1415
pigr = 3.1415926 ;
Nav = 6.022e23 ;
Qe = 1.6e-19 ; Nav 6.02×1023
Qe 1.6×10–19 10
Sottoinsieme minimale di istruzioni
Istruzioni di stampa
Programma
eseguibile
Visualizzazione
risultati
12
Stampa di messaggi
printf("Benvenuto\n") ;
printf("\n");
Benvenuto
Immetti un numero: _
13
Stampa di variabili
printf("%d ", j) ;
printf("%d\n", N) ;
printf("%f\n", pigr) ;
printf("%f\n", Nav) ;
2 100
3.141593
602200013124147500000000.000000
14
Stampa di espressioni
printf("%d\n", i-j) ;
printf("%d\n", N*2) ;
-2
200
96352.000000
15
Stampa di messaggi e valori
printf("Risultato=%d\n", N*2) ;
Risultato=200
16
Sintassi istruzione printf
#include <stdio.h>
printf("formato ", valore/i ) ;
Formato:
Testo libero (compresi spazi) → viene stampato
letteralmente
Simboli \n → va a capo
Simboli %d → stampa un int
Simboli %f → stampa un float
Valore/i:
Variabile o espressione
Di tipo int o float, corrispondente al simbolo %
17
Casi particolari (1/2)
18
Casi particolari (2/2)
19
Sottoinsieme minimale di istruzioni
Istruzioni di lettura
Programma
eseguibile
Immissione dati
21
Lettura di un intero
213
22
Lettura di un reale
12.5
23
Sintassi istruzione scanf
#include <stdio.h>
scanf("formato ", &variabile ) ;
Formato:
Simboli %d → legge un int
Simboli %f → legge un float
Variabile:
Di tipo int o float, corrispondente al simbolo %
Sempre preceduta dal simbolo &
24
Suggerimento
25
Errore frequente
forma corretta
26
Errore frequente
forma corretta
27
Sottoinsieme minimale di istruzioni
Assegnazione delle variabili
a ? 37 -4 -3
t
definizione inizializzazione altra incremento
assegnazione
29
Assegnazione di variabili
30
Sintassi dell’assegnazione
variabile = espressione ;
valore valore
a precedente a espressione
N = 3 ;
32
Esempi
N = 3 ;
a = b ;
Non confondere con b = a ;
33
Esempi
N = 3 ;
a = b ;
Non confondere con b = a ;
a = a + 1 ;
Incrementa a di un’unità
34
Esempi
N = 3 ;
a = b ;
Non confondere con b = a ;
a = a + 1 ;
Incrementa a di un’unità
a + 1 = a ;
Errore
35
Quesito
a = b ;
b = a ;
36
Risposta
a = b ;
b = a ;
a 7 b –12
38
Quesito
a 7 b –12
valore valore
a –12
precedente b 7
precedente
39
Risposta
t = a ;
a = b ;
b = t ;
a 7 b –12
t ?
40
Risposta
t = a ;
a = b ;
b = t ;
a 7 b –12
t 7
41
Risposta
t = a ;
a = b ;
b = t ;
a –12 b –12
t 7
42
Risposta
t = a ;
a = b ;
b = t ;
a –12 b 7
t 7
43
Sottoinsieme minimale di istruzioni
Espressioni aritmetiche
45
Operatori principali
Somma: a+b
Sottrazione: a-b
Moltiplicazione: a*b
Divisione: a/b
Divisione intera (risultato troncato) se entrambi gli
operandi sono int
Resto della divisione: a%b
Solo tra operandi int
Cambio di segno: -a
46
Alcuni operatori avanzati
Incremento: i++
Decremento: N--
Conversione ad intero: (int)a
Conversione a reale: (float)N
47
Funzioni di libreria
#include <math.h>
Funzioni algebriche
fabs, sqrt, cbrt, pow, hypot, ceil, floor,
round, trunc, fmod
Funzioni esponenziali e logaritmiche
exp, exp2, log, log10, log2
Funzioni trigonometriche e iperboliche
cos, sin, tan, cosh, sinh, tanh
Funzioni trigonometriche e iperboliche inverse
acos, asin, atan, atan2, acosh, asinh,
atanh
48
Parentesi
Un semplice programma
L’ambiente di sviluppo Dev-C++
Codifica del programma
Compilazione e correzione errori
Esecuzione e verifica
2
Compilare il primo programma
Esercizio “Somma due numeri”
Scrittura
programma Programma
sorgente in C
4
Analisi
5
Analisi
6
Analisi
La somma di 18 + 3 vale: 21
7
Diagramma di flusso
Leggi A
Leggi B
Calcola
C = A+B
Stampa C
8
Traduzione in C (1/4)
int a ;
Leggi A
scanf("%d", &a) ;
Leggi B
Calcola
C = A+B
Stampa C
9
Traduzione in C (2/4)
Leggi A
int b ;
Leggi B
scanf("%d", &b) ;
Calcola
C = A+B
Stampa C
10
Traduzione in C (3/4)
Leggi A
Leggi B
int c ;
Calcola
C = A+B c = a + b ;
Stampa C
11
Traduzione in C (4/4)
Leggi A
Leggi B
Calcola
C = A+B
printf("La somma %d + %d ",
a, b) ;
Stampa C
printf("vale: %d\n", c) ;
12
Compilare il primo programma
Compilatori e IDE
14
IDE per C in ambiente Windows
Dev-C++
[Link]
15
IDE per C in ambiente Windows
V IDE
[Link]
16
IDE per C in ambiente Windows
Code::Blocks
[Link]
17
IDE per C in ambiente Windows
lcc-win32
[Link]
18
Interfaccia di Dev-C++
19
Interfaccia di Dev-C++
Menù e toolbar
Editor
programma
sorgente
Messaggi errore 20
Menu principali
21
Compilare il primo programma
Codifica del programma
Scrittura somma.c
programma Programma
sorgente in C
23
Codifica “Somma due numeri”
24
Soluzione proposta (1/2)
#include <stdio.h>
#include <stdlib.h>
somma.c
int main(void
void)
void
{
int a, b ; /* addendi */
int c ; /* somma */
25
Soluzione proposta (2/2)
somma.c
/* CALCOLA LA SOMMA */
c = a + b ;
/* STAMPA IL RISULTATO C */
printf("La somma di %d + %d vale: %d\n",
a, b, c) ;
}
26
Compilare il primo programma
Compilazione del programma
Attivare il compilatore
sul programma somma.c
sorgente somma.c Programma
sorgente in C
Il compilatore verifica
che non ci siano
errori di sintassi Compilatore C
In assenza di errori,
viene generato il [Link]
Programma
programma eseguibile eseguibile
[Link]
28
Correzione errori di sintassi
Il compilatore genera
una lista di messaggi di somma.c
Programma
errore sorgente in C
Capire il messaggio
Identificare il punto
Compilatore C
errato nel programma
Trovare la soluzione
Correggere il Lista degli errori
programma
Generare una nuova
versione del file
29
sorgente
Compilazione “Somma due numeri”
Compiliamo il programma
somma.c
30
Compilare il primo programma
Verifica del programma
[Link]
Programma
eseguibile
Visualizzazione
Immissione dati 32
risultati
Errori in esecuzione
33
Correzione errori di esecuzione
Lavoro da “detective”
Risalire dai sintomi alle cause del
malfunzionamento
Formulare delle ipotesi sulla causa dell’errore e
verificarle
Una volta trovato l’errore, cercare una soluzione
A seconda della gravità, occorrerà modificare
Il sorgente C
L’algoritmo risolutivo
L’approccio generale
34
Correzione errori di esecuzione
somma.c
Programma
sorgente in C
Compilatore C
[Link]
Programma
eseguibile
Visualizzazione
Immissione dati
risultati
35
Verifica “Somma due numeri”
36
Primo programma in C
Esercizi proposti
2
Esercizi proposti
Esercizio “Equazione di primo grado”
Data l’equazione
ax+b=0
con a e b inseriti da tastiera, determinare il
valore di x che risolve l’equazione
4
Analisi
5
Soluzione
primogrado.c
leggi a calcola
x = –b/a
leggi b
stampa x
6
Esercizi proposti
Esercizio “Calcolo di aree”
8
Analisi
CALCOLO DI AREE
Immetti il valore di D: 2
9
Aree
D
D
A= D 2
aree.c
D D
H
10
D
Aree
D
D
A= D 2
aree.c
R A = π ⋅ R2
R=D
D 2
D D
H
11
D
Aree
D
D
A= D 2
aree.c
R A = π ⋅ R2
R=D
D 2
D⋅H
A=
D D 2
H H = D ⋅ sin (60°) =
D = D ⋅ sin π( 3)= D ⋅ 3
2
12
Avvertenze
13
Esercizi proposti
Esercizio “Somma minuti” (1/2)
15
Esercizio “Somma minuti” (2/2)
16
Analisi
SOMMA MINUTI
Sessione di lavoro 1:
Numero di ore: 2
Numero di minuti: 45
Sessione di lavoro 2:
Numero di ore: 1
Numero di minuti: 30
17
Aritmetica dell’orologio
Diciamo:
ore1, min1 le ore/minuti della prima sessione
ore2, min2 le ore/minuti della seconda sessione
oretot, mintot le ore/minuti totali
Non è possibile semplicemente sommare ore e
minuti separatamente, in quanto min1+min2
potrebbe essere maggiore di 59
Bisogna tener conto del “riporto” nella somma dei
minuti
18
Soluzione
19
Soluzione
...
2
Suggerimenti
3
Materiale aggiuntivo
Sul CD-ROM
Testi e soluzioni degli esercizi trattati nei lucidi
Scheda sintetica
Esercizi risolti
Esercizi proposti
Esercizi proposti da altri libri di testo
4
Programmazione in C
Scelte ed alternative
Il controllo di flusso
Istruzione if-else
Condizioni complesse
Istruzioni if-else annidate
Istruzione switch
Esercizi proposti
Sommario
2
Riferimenti al materiale
Testi
Kernighan & Ritchie: capitolo 3
Cabodi, Quer, Sonza Reorda: capitoli 2, 4
Dietel & Dietel: capitoli 2, 3
Dispense
Scheda: “Istruzioni di scelta in C”
3
Scelte ed alternative
Il controllo di flusso
5
Il controllo di flusso
Flusso di esecuzione lineare
Il programma C viene
eseguito, di norma dalla A
prima istruzione
all’ultima
Il flusso di esecuzione è B
quindi normalmente di
tipo lineare
C
istruzione_A ;
istruzione_B ;
istruzione_C ; D
istruzione_D ;
7
Eccezioni
9
Anatomia di una scelta
10
Il controllo di flusso
Notazione grafica
V F
C
A B
12
Notazione grafica
V F Ramo “falso”
C
A B
Termine della
alternativa
(ricongiunzione)
13
Flussi di esecuzione
V F V F
C C
A B A B
14
Flussi di esecuzione
Condizione vera
V F Istruzioni V F
C eseguite C
Istruzioni
A B A B
non eseguite
15
Flussi di esecuzione
Condizione falsa
V F Istruzioni V F
C eseguite C
A Istruzioni
B A B
non eseguite
16
Il controllo di flusso
Il concetto di condizione
18
Condizioni di confronto semplici
19
Il controllo di flusso
Equazioni di primo grado
21
Equazione risolutiva
22
Soluzione
leggi a V F
a≠0?
leggi b
calcola
x = –b/a stampa
“errore”
stampa x
23
Scelte ed alternative
Istruzione if-
if-else
Sintassi dell’istruzione
Operatori di confronto
Esercizio proposto di esempio
Risoluzione esercizio (parte I)
Esecuzione del programma
Completamento esercizio
Risoluzione esercizio (parte II)
2
Istruzione if-
if-else
Istruzioni di scelta in C
4
Istruzione if-
if-else
if ( C )
{
V F
A ; C
}
else
{ A B
B ;
}
5
Istruzione if-
if-else
Condizione
if ( C )
{ Ramo “vero”
V F
A ; C
}
else Ramo “falso”
{ A B
B ;
}
6
Condizione vera
Condizione vera
if ( C )
{ Istruzioni
eseguite V F
A ; C
}
else
{ Istruzioni
non eseguite A B
B ;
}
7
Condizione falsa
Condizione falsa
if ( C )
{ Istruzioni
non eseguite V F
A ; C
}
else
{ Istruzioni
eseguite A B
B ;
}
8
Esempio
int a, b ;
es-posneg.c
printf("Immetti
printf un numero: ");
scanf("%d",
scanf &a) ;
if ( a > 0 )
{
printf("positivo\n")
printf ;
b = a ;
}
else
{
printf("negativo\n")
printf ;
b = -a ;
}
printf("Il
printf valore assoluto di %d e' %d", a, b) ;
9
Suggerimento
10
Note
La condizione C può
essere semplice o
if ( C ) complessa
{ Il blocco A può essere
A ; composto da una sola
} istruzione, o da più
else istruzioni
{ Il blocco B può essere
B ; composto da una sola
} istruzione, o da più
istruzioni
11
Caso particolare: istruzione if
V F
if ( C ) C
{
A ;
} A
Manca la
condizione
else
12
Esempio
es-valabs.c
int a ;
printf("Immetti
printf un numero: ");
scanf("%d",
scanf &a) ;
if ( a < 0 )
{
/* è negativo, gli cambio segno */
a = -a ;
}
printf("Il
printf valore assoluto e' %d", a) ;
13
Caso particolare: parentesi graffe
if ( C ) Se il blocco A è
A ; composto da una sola
else istruzione, allora le
{ parentesi graffe relative
B ; si possono omettere.
} Lo stesso vale per il
blocco B.
if ( C )
{
A ; if ( C )
} A ;
else else
B ; B ;
14
Esempio
es-valabs2.c
int a ;
printf("Immetti
printf un numero: ");
scanf("%d",
scanf &a) ;
printf("Il
printf valore assoluto e' %d", a) ;
15
Errore frequente
È errato mettere il
simbolo di punto-e- if ( a > 0 ) ;
virgola ; dopo a = -a ;
l’istruzione if
if ( a > 0 )
if ( a > 0 )
/*nulla*/ ;
a = -a ;
a = -a ;
16
Errore frequente
if ( a > 0 )
if ( a > 0 )
{
printf("neg");
printf
printf("neg");
printf
a = -a ;
a = -a ;
}
17
Suggerimento
18
Istruzione if-
if-else
Le condizioni
20
Operatori di confronto in C
Uguaglianza
Uguale: a == b
Diverso: a != b
Ordine
Maggiore: a > b
Minore: a < b
Maggiore o uguale: a >= b
Minore o uguale: a <= b
21
Esempi
if( a == 0 ) ...
if( a == b ) ...
if( a < 0 ) ...
if( a+b > 3 ) ...
if( x*y != y*x ) ...
if( a/2 == (a+1)/2 ) ...
22
Esempi
if( a == 0 ) ...
if( a == b ) ...
if( a < 0 ) ...
if( a+b > 3 ) ...
if( x*y != y*x ) ...
if( a/2 == (a+1)/2 ) ...
23
Esempi
if( a == 0 ) ...
if( a == b ) ...
if( a < 0 ) ...
if( a+b > 3 ) ...
if( x*y != y*x ) ...
if( a/2 == (a+1)/2 ) ...
24
Esempi
if( a == 0 ) ...
if( a == b ) ...
if( a < 0 ) ...
if( a+b > 3 ) ...
if( x*y != y*x ) ...
if( a/2 == (a+1)/2 ) ...
25
Esempi
if( a == 0 ) ...
if( a == b ) ...
if( a < 0 ) ...
if( a+b > 3 ) ...
if( x*y != y*x ) ...
if( a/2 == (a+1)/2 ) ...
26
Esempi
if( a == 0 ) ...
if( a == b ) ...
if( a < 0 ) ...
if( a+b > 3 ) ...
if( x*y != y*x ) ...
if( a/2 == (a+1)/2 ) ...
27
Errore frequente
/* confronto */
if ( a = b+c )...
28
Istruzione if-
if-else
Esercizio “Controlla A e B”
30
Struttura generale
Leggi A e B
Controlla il segno di B
Stampa il messaggio opportuno
Controlla la parità di A
Stampa il messaggio opportuno
Calcola A+B
Stampa il risultato
...l’ultimo punto è più difficile
...ci pensiamo dopo!
31
Lettura dei dati
Leggi A e B
int a, b ;
printf("Immetti
printf A");
scanf("%d",
scanf &a) ;
printf("Immetti
printf B");
scanf("%d",
scanf &b) ;
32
Controllo del segno
Controlla il segno di B
Stampa il messaggio opportuno
if(
if b > 0 )
{
printf("B
printf e' positivo\n");
}
else
{
printf("B
printf e' negativo o nullo\n");
}
33
Controllo della parità
Controlla la parità di A
Stampa il messaggio opportuno
if(
if “a è pari” )
{
printf("A
printf e' pari\n");
}
else
{
printf("A
printf e' dispari\n");
}
34
Numero pari
if(
if “a è pari” ) if(
if (a % 2) == 0 )
35
Istruzione if-
if-else
Risoluzione esercizio “Controlla A e B”
37
Istruzione if-
if-else
Verifica esercizio “Controlla A e B”
Compiliamo il programma
Eseguiamolo con alcuni dati di prova,
verificandone il comportamento corretto
39
Istruzione if-
if-else
Completamento esercizio “Controlla A e B”
41
Strategia 1
42
Strategia 2
43
Valore assoluto
44
Valore assoluto
48
Scelte ed alternative
Condizioni complesse
Operatori booleani
Operatori booleani in C
Esercizio proposto
Verifica della soluzione
2
Condizioni complesse
Logica Booleana
4
Operatori booleani
5
Esempi
x è compreso tra a e b?
(x ≥ a) AND (x ≤ b)
se so già che b ≥ a
( (b ≥ a) AND (x ≥ a) AND (x ≤ b) ) OR
( (b < a) AND (x ≤ a) AND (x ≥ b) )
nel caso generale
ci sono promossi?
(voto1 ≥ 18) OR (voto2 ≥ 18)
6
Condizioni complesse
Operatori booleani in C
Operatore Sintassi
Esempio
booleano in C
OR || (v1>=18)||(v2>=18)
NOT ! !(a>b)
8
Contesto di utilizzo
11
Esempi
12
Esempi
13
Esempi
14
Esempi
15
Esempi
16
Esempi
17
Esempi
18
Esempi
if ( (a > b) &&
forma
if ( a > b > 0 ) (b > 0)
corretta
)
if ( (a == b) &&
forma
if ( a==b==c ) (b == c)
corretta
)
21
Errore frequente
forma
if ( a || b != 1 )
corretta
if ( (a!=1) ||
(b!=1) )
forma
if ( (a||b) != 1 )
corretta
22
Condizioni complesse
Esercizio “Classificazione triangolo 1”
24
Analisi del problema
25
Espressioni matematiche (I)
Equilatero
A=B=C
(A = B) AND (B = C) AND (A = C)
(A = B) AND (B = C)
Isoscele
(A = B) OR (B = C) OR (A = C)
Scaleno
(A ≠ B) AND (A ≠ C) AND (B ≠ C)
26
Espressioni matematiche (II)
Rettangolo
Teorema di Pitagora
Ipotenusa2 = Cateto2 + Cateto2
L’ipotenusa può essere uno qualunque dei lati A, B
oppure C
(A2 = B2+C2) OR (B2 = A2+C2) OR (C2 = A2+B2)
27
Condizioni in C
Equilatero
a==b && b==c
Isoscele
a==b || b==c || a==c
Scaleno
a!=b && b!=c && a!=c
Rettangolo
(a*a == b*b + c*c) ||
(b*b == a*a + c*c) ||
(c*c == a*a + b*b)
28
Condizioni complesse
Verifica “Classificazione triangolo 1”
30
Scelte ed alternative
Istruzioni if-
if-else annidate
2
Istruzioni if-
if-else annidate
Scelte annidate
A4
4
Caso 1
C1 vero, C2 vero V F
Istruzioni eseguite: C1
A1, A2, A4
A1
V F B
C2
A2 A3
A4
5
Caso 2
C1 vero, C2 vero V F
Istruzioni eseguite: C1
A1, A2, A4
A1
C1 vero, C2 falso
V F B
Istruzioni eseguite: C2
A1, A3, A4
A2 A3
A4
6
Caso 3
C1 vero, C2 vero V F
Istruzioni eseguite: C1
A1, A2, A4
A1
C1 vero, C2 falso
V F B
Istruzioni eseguite: C2
A1, A3, A4
C1 falso, C2 A2 A3
indifferente
Istruzioni eseguite:
B A4
7
Corretto annidamento
L’intero blocco di V F
scelta più interno C1
(dalla condizione fino
A1
al ricongiungimento)
deve essere V F B
C2
completamente
contenuto all’interno A2 A3
di uno dei rami del
blocco più esterno
A4
8
Sintassi C
if ( C1 )
{
A1 ; V F
C1
if ( C2 )
{ A1
A2 ;
} V F B
else
C2
{
A3 ; A2 A3
}
A4 ;
} A4
else
{
B ; 9
}
Sintassi C
if ( C1 )
{
A ; V F
C1
}
else B1
{
B1 ; A V F
C2
if ( C2 )
{
B2 ; B2 B3
}
else
{ B4
B3 ;
}
B4 ; 10
}
Caso generale
V F
C1
A1 B1
V F V F
C2 C3
A2 A3 B2 B3
A4 B4
11
Sintassi C
if ( C1 ) else
{ { V F
C1
A1 ; B1 ;
if ( C2 ) if ( C3 ) A1 B1
{ {
V F V F
A2 ; B2 ; C2 C3
} }
else else A2 A3 B2 B3
{ {
A3 ; B3 ;
} } A4 B4
A4 ; B4 ;
} }
12
Sintassi C
13
Esempio
14
Soluzione (parziale)
leggi a V F
a≠0?
leggi b
calcola
x = –b/a stampa
“errore”
stampa x
15
Esempio
16
Soluzione (completa)
leggi a V F
a≠0?
leggi b b=0?
V F
calcola
x = –b/a stampa stampa
“indeterminata” “impossibile”
stampa x
17
Soluzione in C (1/2)
#include <stdio.h>
#include <stdlib.h>
primogrado.c
int main(void
void)
void
{
float a, b ;
float x ;
/* Leggi A e B */
printf("Immetti coefficiente a: ");
scanf("%f", &a) ;
Ricordiamo che:
Se il ramo “vero” oppure il ramo “falso” è
composto da una sola istruzione, allora le
parentesi graffe {...} sono opzionali
Se il ramo “falso” non contiene istruzioni, allora la
clausola else si può omettere
Nel contesto di if annidati, queste regole
possono creare una potenziale ambiguità
21
Esempio
if(
if a>0 )
{
c = a ;
}
else if(
if a>0 )
{ c = a ;
if(
if b>0 )
{ = else
if(
if b>0 )
c = b ; c = b ;
} else
else c = 0 ;
{
c = 0 ;
}
}
22
Esempio problematico
if(
if a>0 )
if(
if b>0 )
c = a + b ;
else
c = 0 ;
if(
if a>0 )
if(
if b>0 )
c = a + b ;
else
?
c = 0 ;
if(
if a>0 )
if(
if b>0 )
c = a + b ;
else
c = 0 ;
23
Regola
if(
if a>0 )
if(
if a>0 ) {
if(
if b>0 ) if(
if b>0 )
c = a + b ; c = a + b ;
else else
c = 0 ; c = 0 ;
}
24
Suggerimento
if(
if a>0 )
if(
if b>0 )
c = a + b ;
else
c = 0 ;
if(
if a>0 ) if(
if a>0 )
{ {
if(
if b>0 ) if(
if b>0 )
c = a + b ; c = a + b ;
} else
else c = 0 ;
c = 0 ; } 25
Istruzioni if-
if-else annidate
Catene di istruzioni condizionali
27
Soluzione
if(
if mese == 1 )
printf("Gennaio\n") ;
else
{ mesi.c
if(
if mese == 2 )
printf("Febbraio\n") ;
else
{
if(
if mese == 3 )
printf("Marzo\n") ;
else
{
if(
if mese == 4 )
printf("Aprile\n") ;
else
{
....... /* continua fino a 12 */
}
}
} 28
}
Analisi della soluzione
if(
if( mese == 1 )
printf("
printf("Gennaio
("Gennaio\
Gennaio\n") ;
else
{
if(
if( mese == 2 )
else
printf("
printf("Febbraio
("Febbraio\
Febbraio\n") ;
Annidamento
{
if(
if( mese == 3 )
else
{
printf("
printf("Marzo
("Marzo\
Marzo\n") ; eccessivo
if(
if( mese == 4 )
Scarsa leggibilità
printf("
printf("Aprile
("Aprile\
Aprile\n") ;
else
{
if(
if( mese == 5 )
printf("
printf("Maggio
("Maggio\
Maggio\n") ;
else
Difficile identificazione
{
if(
if( mese == 6 )
printf("
printf("Giugno
("Giugno\
Giugno\n") ;
else
{
delle {...}
if(
if( mese == 7 )
printf("
printf("Luglio
("Luglio\
Luglio\n") ;
else
{
if(
if( mese == 8 )
else
{
printf("
printf("Agosto
if(
("Agosto\
Agosto\n") ;
if( mese == 9 )
printf("
printf("Settembre
("Settembre\
Settembre\n") ;
corrispondenti
else
{
if(
if( mese == 10 )
printf("
printf("Ottobre
("Ottobre\
Ottobre\n") ;
else
{
if(
if( mese == 11 )
else
{
printf("
printf("Novembre
if(
("Novembre\
Novembre\n") ;
if( mese == 12 )
Esistono formattazioni
printf("
printf("Dicembre
("Dicembre\
Dicembre\n") ;
}
}
else
printf("MESE
printf("MESE ERRATO!\
ERRATO!\n") ;
migliori?
}
}
}
}
}
}
}
}
}
29
Soluzione più leggibile
if(
if mese == 1 )
printf("Gennaio\n") ;
else if(
if mese == 2 )
printf("Febbraio\n") ; mesi2.c
else if(
if mese == 3 )
printf("Marzo\n") ;
else if(
if mese == 4 )
printf("Aprile\n") ;
else if(
if mese == 5 )
printf("Maggio\n") ;
............................
else if(
if mese == 9 )
printf("Settembre\n") ;
else if(
if mese == 10 )
printf("Ottobre\n") ;
else if(
if mese == 11 )
printf("Novembre\n") ;
else if(
if mese == 12 )
printf("Dicembre\n") ;
else 30
printf("MESE ERRATO!\n") ;
In generale...
33
Analisi
A B C B ? A
C 34
Struttura proposta
36
Condizioni booleane (2)
37
Istruzioni if-
if-else annidate
Verifica “Classificazione triangolo 2”
39
Scelte ed alternative
Istruzione switch
Sintassi dell’istruzione
Particolarità dell’istruzione
Esercizio proposto
Verifica della soluzione
2
Istruzione switch
Scelte multiple
if(
if mese == 1 )
Quando occorre printf("Gennaio\n") ;
compiere una else if(
if mese == 2 )
printf("Febbraio\n") ;
sequenza di scelte, in else if(
if mese == 3 )
printf("Marzo\n") ;
funzione del valore di else if(
if mese == 4 )
printf("Aprile\n") ;
una variabile, occorre else if(
if mese == 5 )
una catena di if- printf("Maggio\n") ;
............................
else else if(
if mese == 9 )
printf("Settembre\n") ;
Lo stesso risultato si else if(
if mese == 10 )
printf("Ottobre\n") ;
può ottenere in forma else if(
if mese == 11 )
printf("Novembre\n") ;
più compatta else if(
if mese == 12 )
mediante l’istruzione else
printf("Dicembre\n") ;
altrimenti
break ;
e=v3
A1
case v2:
A2 ; A2
break ; A3
...
case v3:
A3 ; An
break ;
...........
default:
default
An ; 5
}
Precisazioni (1/2)
6
Precisazioni (2/2)
7
L’istruzione break
8
Casi multipli
12
Errore frequente
switch(
switch ora )
{
È errato dimenticare case 12:
l’istruzione break al pranzo = 1 ;
case 20:
termine di ogni caso cena = 1 ;
break;
break
}
viene interpretato come
forma corretta
switch(
switch ora )
switch(
switch ora )
{
{
case 12:
case 12:
pranzo = 1 ;
pranzo = 1 ;
cena = 1 ;
break;
break
break;
break
case 20:
case 20:
cena = 1 ;
cena = 1 ;
break;
break
break;
break
} 13
}
Errore frequente
forma corretta
switch(
switch ora )
if(
if ora==orapranzo )
{
{
case orapranzo:
pranzo = 1 ;
pranzo = 1 ;
}
break;
break
else if(
if ora==oracena )
case oracena:
{
cena = 1 ;
cena = 1 ;
break;
break
}
} 14
Errore frequente
switch(
switch ora )
{
......
default:
default
printf("Errore: valore inatteso
%d per la variabile ora\n", ora) ;
}
16
Suggerimento
17
Istruzione switch
Esercizio “Semplice calcolatrice”
19
Soluzione (1/4)
#include <stdio.h>
#include <stdlib.h>
calcola.c
int main(void)
{
int op ;
int a, b, c ;
int err ;
printf("Semplice calcolatrice\n\n") ;
21
Soluzione (3/4)
err = 0 ;
switch(
switch op )
{
case 1:
c = a + b ;
break ;
case 2:
c = a - b ;
break ;
case 3:
c = a * b ;
break ;
case 4:
c = a / b ;
break ;
default:
default
printf("Operazione errata\n") ;
err = 1 ;
} 22
Soluzione (3/4)
err = 0 ; case 4:
switch(
switch op ) if(
if b == 0 )
{ {
case 1: printf("Divisione per zero!\n");
c = a + b ;err = 1 ;
break ;}
case 2: else
c = a -{b ;
break ; c = a / b ;
case 3: }
c = a *break
b ; ;
break ;
case 4:
c = a / b ;
break ;
default:
default
printf("Operazione errata\n") ;
err = 1 ;
} 23
Soluzione (4/4)
if(
if err == 0 )
{
printf("Il risultato vale: %d\n", c) ;
}
24
Istruzione switch
Verifica “Semplice calcolatrice”
26
Scelte ed alternative
Esercizi proposti
2
Esercizi proposti
Esercizio “Calcolo del massimo”
4
Esempio
5
Analisi
6
Diagramma di flusso
Leggi A,B V F
max.c
A>B
Stampa Stampa
“primo” “secondo”
MAX=A MAX=B
Stampa
MAX
7
Esercizio “Calcolo del massimo a 3”
8
Esempio
9
Analisi
max3-if.c
10
Analisi
max3-if.c
11
max3-and.c
Esercizi proposti
Esercizio “Equazione di secondo grado”
Data l’equazione
a x2 + b x + c = 0
con a, b e c inseriti da tastiera, determinare il
valore (o i valori) di x che risolvono l’equazione
13
Analisi
Ricordiamo la formula
risolutiva per le − b ± b 2 − 4ac
x1, 2 =
equazioni di secondo 2a
grado
La quantità sotto
radice è il ∆ = b 2 − 4ac
discriminante ∆
Vi sono vari casi
possibili
se a≠0 o a=0
se ∆>0, ∆=0 o ∆<0
14
Casi possibili
Acquisire a, b, c
Se a=0, risolvere l’equazione di secondogrado.c
primo grado
Ri-usiare il codice già scritto, facendo
attenzione al nome delle variabili
Calcolare il discriminante ∆
Il nome della variabile sarà delta
In funzione del segno di delta, usare la formula
opportuna
16
Esercizi proposti
Esercizio “Re e Regina”
18
Analisi
1 2 3 4 5 6 7 8
8 19
Analisi
1 2 3 4 5 6 7 8
1 Re bianco:
riga 3
2 colonna 2
3 Regina nera:
riga 6
4 colonna 6
8 20
Analisi
1 2 3 4 5 6 7 8
1 Re bianco:
riga 3
2 colonna 2
3 Regina nera:
riga 6
4 colonna 6
6
Il Re è salvo
7
8 21
Analisi
1 2 3 4 5 6 7 8
1 Re bianco:
riga 3
2 colonna 2
3 Regina nera:
riga 6
4 colonna 5
6
Il Re è
sotto scacco
7
8 22
Soluzione (1/2)
ck cq
Acquisire le coordinate dei pezzi
Re: rk, ck rk K
Regina: rq, cq rq Q
Controllare se la Regina
è sulla stessa riga del Re
rq==rk
è sulla stessa colonna del Re
cq==ck
è sulla stessa diagonale discendente del Re
è sulla stessa diagonale ascendente del Re
23
Soluzione (1/2) - Diagonali
Diagonale discendente
K
r–c costante
rq-cq == rk-ck Q
Diagonale ascendente K
r+c costante
rq+cq == rk+ck Q
24
Soluzione (2/2)
inizializzare scacco=0
fare i vari tipi di controlli
se si verifica una condizione di scacco, porre
scacco=1
Al termine dei controlli, in funzione del valore di
scacco, stampare il messaggio opportuno
se scacco==0, il Re è salvo
se scacco==1, il Re è sotto scacco
25
Scelte ed alternative
Argomenti trattati
2
Tecniche di programmazione
3
Suggerimenti
4
Materiale aggiuntivo
Sul CD-ROM
Testi e soluzioni degli esercizi trattati nei lucidi
Scheda sintetica
Esercizi risolti
Esercizi proposti
Esercizi proposti da altri libri di testo
5
Programmazione in C
Cicli ed iterazioni
La ripetizione
Istruzione while
Schemi ricorrenti nei cicli
Istruzione for
Approfondimenti
Esercizi proposti
Sommario
2
Riferimenti al materiale
Testi
Kernighan & Ritchie: capitolo 3
Cabodi, Quer, Sonza Reorda: capitolo 4
Dietel & Dietel: capitolo 4
Dispense
Scheda: “Cicli ed iterazioni in C”
3
Cicli ed iterazioni
La ripetizione
Concetto di ciclo
Struttura di un ciclo
Numero di iterazioni note
Numero di iterazioni ignote
5
La ripetizione
Flusso di esecuzione ciclico
Prima del A
ciclo
Istruzioni B
che vengono
ripetute C
Condizione V
D?
di ripetizione
F
Dopo il ciclo E
8
Errore frequente
9
Istruzioni eseguibili ed eseguite
Istruzioni eseguibili
Le istruzioni che fanno parte del programma
Corrispondono alle istruzioni del sorgente C
Istruzioni eseguite
Le istruzioni effettivamente eseguite durante una
specifica esecuzione del programma
Dipendono dai dati inseriti
Nel caso di scelte, alcune istruzioni eseguibili non
verranno eseguite
Nel caso di cicli, alcune istruzioni eseguibili
verranno eseguite varie volte
10
Notazione grafica (while)
V F
C
D
11
Notazione grafica (while)
A
Ingresso
Condizione
V F
C Corpo
Ritorno Uscita
D
12
Flussi di esecuzione
A Zero iterazioni
A
V F C → Falso
C D
D
13
Flussi di esecuzione
A Una iterazione
A
V F C → Vero
C B
C → Falso
D
B
D
14
Flussi di esecuzione
A Due iterazioni
A
V F C → Vero
C B
C → Vero
B
B C → Falso
D
D
15
Notazione grafica (do-while)
V F
C
D
16
Notazione grafica (do-while)
A
Ingresso
Corpo
B
Condizione
V F
C
Ritorno
Uscita
D
17
Flussi di esecuzione
A Una iterazione
A
B
C → Falso
B
D
V F
C
D
18
Flussi di esecuzione
A Due iterazioni
A
B
C → Vero
B
B
C → Falso
V F D
C
D
19
Flussi di esecuzione
A Tre iterazioni
A
B
C → Vero
B
B
C → Vero
V F B
C C → Falso
D
D
20
La ripetizione
Problemi
23
Anatomia di un ciclo (2/5)
24
Anatomia di un ciclo (3/5)
25
Anatomia di un ciclo (4/5)
26
Anatomia di un ciclo (5/5)
27
La ripetizione
Tipologie di cicli
c=0
Inizializzazione
V F Condizione
c<N
Corpo
corpo
Aggiornamento
c=c+1
30
Cicli con iterazioni note
35
Soluzione
leggi N
V F
c<N
tot = 0
leggi dato
stampa tot
c=0
tot = tot + dato
c=c+1
36
La ripetizione
Cicli con iterazioni ignote
38
Soluzione parziale
V F
?????
tot = 0
leggi dato
stampa tot
tot = tot + dato
39
Soluzione 1
dato = 7 V F
dato ≠ 0
tot = 0
leggi dato
stampa tot
tot = tot + dato
40
Soluzione 2
leggi dato V F
dato ≠ 0
tot = dato
leggi dato
stampa tot
tot = tot + dato
41
Soluzione 3
leggi dato
tot = 0
tot = tot + dato
stampa tot
dato ≠ 0
V F
42
Errore frequente
dato = 7 V F
dato ≠ 0
tot = 0
leggi dato
stampa tot
tot = tot + dato
43
Errore frequente
leggi N
V F
c<N
tot = 0
leggi dato
stampa tot
c=0
tot = tot + dato
c=c+1 44
Errore frequente
leggi N
V F
c<N
tot = 0
leggi dato
stampa tot
c=0
tot = tot + dato
c=c+1 45
Cicli ed iterazioni
Istruzione while
Sintassi dell’istruzione
Esercizio “Media aritmetica”
Esecuzione del programma
Cicli while annidati
Esercizio “Quadrato”
2
Istruzione while
Istruzioni di ripetizione in C
while ( C ) V F
C
{
B ;
} B
5
Comportamento del while
1. Valuta la condizione C
2. Se C è falsa, salta
completamente l’iterazione
while ( C ) e vai all’istruzione che
{ segue la }
B ; 3. Se C è vera, esegui una
} volta il blocco di
istruzioni B
4. Al termine del blocco B,
ritorna al punto 1. per
rivalutare la condizione C
6
Numero di iterazioni note
int i, N ;
i = 0 ;
while ( i < N )
{
/* Corpo dell’iterazione */
...
i = i + 1 ;
}
7
Esempio
int i ; num1-10.c
i = 1 ;
while ( i <= 10 )
{
printf("Numero = %d\n", i) ;
i = i + 1 ;
}
8
Esempio
int i, n ;
fatt.c
float f ;
.... /* leggi n */ ....
i = 2 ;
f = 1.0 ;
while ( i <= n )
{
f = f * i ;
i = i + 1 ;
}
printf("Fattoriale di %d = %f\n",
n, f);
9
Particolarità
while ( C )
{ while ( C )
B ; B ;
}
10
Istruzione while
Esercizio “Media aritmetica”
12
Analisi
MEDIA ARITMETICA
Introduci n: 3
Ora introduci 3 valori
Valore 1: 6.5
Valore 2: 2.5
Valore 3: 3.0
Risultato: 4.000000
13
Algoritmo
Acquisisci n
Inizializza totale = 0
Ripeti n volte
Acquisisci un dato
Somma il dato al totale dei dati acquisiti
Calcola e stampa la media = totale / n
14
Algoritmo
Acquisisci n
Se n>0
Inizializza totale = 0
Ripeti n volte
Acquisisci un dato
Somma il dato al totale dei dati acquisiti
Calcola e stampa la media = totale / n
Altrimenti stampa messaggio di errore
15
Traduzione in C (1/3)
#include <stdio.h>
#include <stdlib.h> media.c
int main
main(
(void)
void
{
int i, n ;
float dato ;
float somma ;
printf("MEDIA ARITMETICA\n");
/* Leggi n */
printf("Introduci n: ");
scanf("%d", &n) ;
16
Traduzione in C (2/3)
} /* main */
17
Traduzione in C (3/3)
i = i + 1 ;
}
media.c
20
Istruzione while
Annidamento di cicli
22
Cicli while annidati
V F
C
23
Cicli while annidati
V F V F
C C
V F
C2
B
B2
24
Cicli while annidati
V F
C
while(
while C )
{ V F
while(
while C2 ) C2
{
B2 ;
} B2
}
25
Esempio
i = 0 ;
while(
while i<N )
conta99.c
{
j = 0 ;
while(
while j<N )
{
printf("i=%d - j=%d\n", i, j);
j = j + 1 ;
}
i = i + 1 ;
}
26
Esempio
i = 0 ;
while(
while i<N )
{ conta99.c
j = 0 ;
while(
while j<N )
{
printf("i=%d - j=%d\n", i, j);
j = j + 1 ;
} i=0 - j=0
i = i + 1 ; i=0 - j=1
} i=0 - j=2
i=1 - j=0
i=1 - j=1
i=1 - j=2
i=2 - j=0
i=2 - j=1
i=2 - j=2 27
Istruzione while
Esercizio “Quadrato”
29
Analisi
QUADRATO
Introduci n: 5
*****
*****
*****
*****
*****
30
Algoritmo
Acquisisci n
Ripeti n volte
Stampa una riga di n asterischi
31
Algoritmo
Acquisisci n
Ripeti n volte
Stampa una riga di n asterischi
Ripeti n volte
Stampa un singolo
asterisco
Vai a capo
32
Traduzione in C
i = 0 ;
while(
while i<n ) quadrato.c
{
j = 0 ;
while(
while j<n )
{
printf("*") ;
j = j + 1 ;
}
printf("\n");
i = i + 1 ;
}
33
Traduzione in C
i = 0 ;
while(
while i<n ) quadrato.c
{
j = 0 ;
while(
while j<n )
{ Ripeti n volte
printf("*") ;
j = j + 1 ;
}
Stampa una riga
di n asterischi
printf("\n");
i = i + 1 ;
}
34
Traduzione in C
i = 0 ;
while(
while i<n ) quadrato.c
{
j = 0 ;
while(
while j<n )
{ Stampa n
printf("*") ;
j = j + 1 ;
asterischi
}
Vai a capo
printf("\n");
i = i + 1 ;
}
35
Traduzione in C
i = 0 ;
while(
while i<n ) quadrato.c
{
j = 0 ;
while(
while j<n )
{ Ripeti n volte
printf("*") ;
j = j + 1 ;
} Stampa un
printf("\n"); asterisco
i = i + 1 ;
}
36
Cicli ed iterazioni
Schemi ricorrenti nei cicli
Contatori
Accumulatori
Flag
Esistenza e universalità
2
Schemi ricorrenti nei cicli
Contatori
4
Contatori
int i, N ;
...
i = 0 ;
while ( i < N )
{
printf("Iterazione %d\n", i+1) ;
i = i + 1 ;
}
5
Esempio
6
Soluzione (1/3)
contaposneg.c
....
npos = 0 ;
nneg = 0 ;
nzero = 0 ;
7
Soluzione (2/3)
i = 0 ;
while(
while i<n )
{ contaposneg.c
if(
if dato>0 )
npos = npos + 1 ;
else if(
if dato<0 )
nneg = nneg + 1 ;
else
nzero = nzero + 1 ;
i = i + 1 ;
}
8
Soluzione (3/3)
contaposneg.c
9
Schemi ricorrenti nei cicli
Accumulatori (1/2)
12
Esempio: somma primi 10 interi
13
Analisi
Inizializzazione di TOT
Qual è la somma dei primi 0 numeri interi?
TOT = 0
Aggiornamento di TOT
Sapendo che TOT è la somma dei primi (i-1)
numeri interi, e sapendo che il prossimo numero
intero da sommare vale i, quanto dovrà valere
TOT?
TOT = TOT + i
14
Soluzione: somma primi 10 interi
int tot ;
i = 1 ;
tot = 0 ;
while(
while i<=10 )
{
tot = tot + i ;
i = i + 1 ;
}
i=K
TOT = K != ∏ i
i =1
16
Analisi
Inizializzazione di TOT
Qual è il valore del fattoriale per K=0?
TOT = 1.0
Aggiornamento di TOT
Sapendo che TOT è pari al fattoriale di i-1, e
sapendo che il prossimo numero da considerare è
i, quanto dovrà valere TOT?
TOT = TOT * i
17
Soluzione: fattoriale di K
float tot ;
i = 1 ;
tot = 1.0 ;
while(
while i<=K )
{
tot = tot * i ;
i = i + 1 ;
}
19
Analisi
Inizializzazione di TOT
Qual è il valore del massimo in un insieme di 0
numeri?
Non esiste, non è definito!
TOT = numero molto piccolo, che non possa
certamente essere scambiato con il massimo
Aggiornamento di TOT
Sapendo che TOT è pari al massimo dei primi i-1
dati, e sapendo che il prossimo dato da
considerare è d, quanto dovrà valere TOT?
Se d<=TOT, allora TOT rimane il massimo
Se d>TOT, allora il nuovo massimo sarà TOT=d
20
Esempio: massimo
int max ;
i = 0 ;
max = INT_MIN ;
while(
while i<N )
{
scanf("%d", &dato) ;
if(dato>max)
if
max = dato ;
i = i + 1 ;
}
1
2.1e7
184
SI
99
-7
3.5
-9
NO
23
Problemi
24
Una possibile soluzione
Per sapere
Se una certa condizione si verifica
è possibile contare
Quante volte quella condizione si verifica
ed in seguito verificare
Verificare se il conteggio è diverso da zero
Ci riconduciamo ad un problema risolubile per
mezzo di una variabile contatore
25
Esempio 1
Il conteggio è > 0 ?
26
Soluzione (1/3)
int i, n ; trova100v1.c
int dato ;
int conta ;
/* conta il numero di "100" letti */
printf("TROVA 100\n");
n = 10 ;
27
Soluzione (2/3)
conta = 0 ;
trova100v1.c
i = 0 ;
while(
while i<n )
{
printf("Inserisci dato %d: ", i+1);
scanf("%d", &dato);
if(
if dato == 100 )
conta = conta + 1 ;
i = i + 1 ;
}
28
Soluzione (3/3)
trova100v1.c
if(
if conta != 0 )
printf("Ho trovato il 100\n");
else
printf("NON ho trovato il 100\n");
29
Esempio 2
Il conteggio è > 0 ?
30
Soluzione (1/3)
int i, n ;
ugualiv1.c
int dato ;
int precedente ;
int conta ;
/* conta il numero di "doppioni" trovati */
printf("TROVA UGUALI\n");
n = 10 ;
31
Soluzione (2/3)
conta = 0 ;
i = 0 ;
while(
while i<n )
{
printf("Inserisci dato %d: ", i+1);
scanf("%d", &dato);
if(
if dato == precedente )
conta = conta + 1 ;
precedente = dato ;
i = i + 1 ; 32
}
Soluzione (3/3)
ugualiv1.c
if(
if conta != 0 )
printf("Ho trovato dei numeri
consecutivi uguali\n");
else
printf("NON ho trovato dei numeri
consecutivi uguali\n");
33
Svantaggi
34
Variabili “flag”
i=0
V F
i<N
Controlla se esiste
un dato con certe
caratteristiche
i=i+1
36
Analisi
flag = 0 i=0
V F
i<N
V dato? F
flag = 1
i=i+1
37
Analisi
flag = 0 i=0 V F
flag = 1?
V F
i<N
flag = 1
i=i+1
38
Analisi
flag = 0 i=0 V F
flag = 1?
V F
i<N
flag = 1
i=i+1
39
Analisi
flag = 0 i=0 V F
flag = 1?
V F
i<N
flag = 1
i=i+1
40
Soluzione con flag – esempio 1
int trovato ; /* ho visto il numero "100"? */
....
trovato = 0 ;
trova100v2.c
i = 0 ;
while(
while i<n )
{
scanf("%d", &dato);
if(
if dato == 100 )
trovato = 1 ;
i = i + 1 ;
}
if(
if trovato != 0 )
printf("Trovato il numero 100\n");
else 41
printf("NON trovato il numero 100\n");
Soluzione con flag – esempio 2
int doppi ; /* trovati "doppioni" ? */
...
doppi = 0 ;
ugualiv2.c
precedente = INT_MAX ;
i = 0 ;
while(
while i<n )
{
scanf("%d", &dato);
if(
if dato == precedente )
doppi = 1 ;
precedente = dato ;
i = i + 1 ;
}
if(
if doppi != 0 ) 42
printf("Trovati consecutivi uguali\n");
Schemi ricorrenti nei cicli
Ricerca di esistenza o universalità
44
Esempi
46
Realizzazione (1/2)
Esistenza: ∃x : P(x)
Inizializzo flag F = 0
Ciclo su tutte le x
Se P(x) è vera
Pongo F = 1
Se F = 1, l’esistenza
è dimostrata
Se F = 0, l’esistenza
è negata
47
Realizzazione (1/2)
Se F = 1, l’esistenza Se F = 1, l’universalità
è dimostrata è dimostrata
Se F = 0, l’esistenza Se F = 0, l’universalità
è negata è negata
48
Realizzazione (2/2)
Se F = 1, l’esistenza è Se F = 1, l’universalità è
dimostrata dimostrata
Se F = 0, l’esistenza è Se F = 0, l’universalità è
negata negata
49
Esempio 1
trovato = 0 ; trovato = 0 ;
i = 0 ; i = 0 ;
while(
while i<n ) while(
while i<n )
{ {
... ...
if(
if dato == 100 ) if(
if dato == 100 )
trovato = 1 ; trovato = 1 ;
else
trovato = 0 ;
... ...
i = i + 1 ; i = i + 1 ;
} } 54
Errore frequente
trovato = 0 ;
trovato = 0 ;
i = 0 ;
i = 0 ;
while(
while i<n )
while(
while i<n )
{
{
...
...
if(
if dato == 100 )
if(
if dato == 100 )
{
trovato = 1 ;
trovato = 1 ;
....
printf("W!\n");
i = i + 1 ;
}
}
...
if(trovato==1)
i = i + 1 ; 55
printf("W!\n");
}
Errore frequente
trovato = 0 ; trovato = 0 ;
i = 0 ; i = 0 ;
while(
while i<n ) while(
while i<n )
{ {
... ...
if(
if dato == 100 ) if(
if dato == 100 )
trovato = 1 ; trovato = 1 ;
else ....
printf("NO!\n"); i = i + 1 ;
... }
i = i + 1 ; if(trovato==0)
} printf("NO!\n"); 56
Cicli ed iterazioni
Istruzione for
Sintassi dell’istruzione
Operatori di autoincremento
Cicli for annidati
2
Istruzione for
Istruzione for
4
Istruzione for
V F
for ( I; C; A ) C
{
B ;
} B
5
Istruzione for
Istruzione di
inizializzazione I
V F
for ( I; C; A ) C
{
B ; Istruzione di
} aggiornamento B
Corpo Condizione
6
Esempio
num1-10v2.c
int i ;
7
Equivalenza for
while
forwhile
I ;
for ( I; C; A ) while ( C )
{ {
B ; B ;
} A ;
}
8
Esempio
int i ;
int i ;
i = 1 ;
for ( i=1; i<=10; i=i+1 ) while ( i <= 10 )
{ {
printf("%d\n", i) ; printf("%d\n", i) ;
} i = i + 1 ;
}
9
Utilizzo prevalente (1/2)
Le istruzioni di inizializzazione I e di
aggiornamento A possono essere qualsiasi
Solitamente I viene utilizzata per inizializzare il
contatore di controllo del ciclo, e quindi è del tipo
i = 0
Solitamente A viene utilizzata per incrementare
(o decrementare) il contatore, e quindi è del tipo
i = i + 1
for ( I; C; A )
{
B ;
} 10
Utilizzo prevalente (2/2)
11
Cicli for con iterazioni note
int i ; int i ;
int i ; int i ;
for ( I; C; A )
{
B ;
} 13
Casi particolari (2/6)
for ( I; C; A )
{
B ;
} 14
Casi particolari (3/6)
for ( I; C; A )
{
B ;
} 15
Casi particolari (4/6)
for ( I; C; A )
{
B ;
} 16
Casi particolari (5/6)
for ( I; C; A )
{
B ;
} 17
Casi particolari (6/6)
for ( I; C; A )
{
B ;
} 18
Istruzione for
Istruzione di aggiornamento
a++ ;
a = a + 1 ;
++a ;
a-- ;
a = a - 1 ;
--a ;
21
Cicli for con iterazioni note
int i ; int i ;
int i ; int i ;
24
Esempio
conta99v2.c
for(
for i=0; i<N; i++ )
{
for(
for j=0; j<N; j++ )
{
printf("i=%d - j=%d\n", i, j);
}
}
25
Esercizio
26
Analisi (1/2)
TROVA PRIMI
Inserisci 4 numeri interi
Inserisci dato 1: 6
Inserisci dato 2: 3
E' un numero primo
Inserisci dato 3: 4
Inserisci dato 4: 5
E' un numero primo
27
Analisi (2/2)
TROVA PRIMI
Inserisci 4 numeri interi
Inserisci dato 1: 4
Inserisci dato 2: 6
Inserisci dato 3: 8
Inserisci dato 4: 9
28
Numero primo
10primi.c
primo = 1 ;
for(
for j=2; j<dato; j++)
{
if(
if dato%j == 0 )
primo = 0 ;
}
29
Stampa se non ci sono primi
if( primo == 1 )
{
printf("E' un numero primo\n");
}
}
30
Stampa se è un primo
trovato = 0 ;
10primi.c
for(
for i=0; i<n; i++ )
{
....acquisisci dato e determina se è un numero primo....
if(
if primo == 1 )
{
printf("E' un numero primo\n");
trovato = 1 ;
}
}
if(
if trovato == 0 )
printf("Non ci sono primi\n") ;
31
Vista d’insieme
trovato = 0 ;
for(
for i=0; i<n; i++ )
{
10primi.c
scanf("%d", &dato);
primo = 1 ;
for(
for j=2; j<dato; j++ )
{
if(
if dato%j == 0 )
primo = 0 ;
}
if(
if primo == 1 )
{
printf("E' un numero primo\n");
trovato = 1 ;
}
}
if(
if trovato == 0 )
printf("Non c'erano numeri primi\n");
32
Vista d’insieme
trovato = 0 ;
for(
for i=0; i<n; i++ )
{
scanf("%d", &dato);
Ciclo esterno
primo = 1 ;
for(
for j=2; j<dato; j++ )
{
if(
if dato%j == 0 )
primo = 0 ;
} Ciclo interno
if(
if primo == 1 )
{
printf("E' un numero primo\n");
trovato = 1 ;
}
}
if(
if trovato == 0 )
printf("Non c'erano numeri primi\n");
33
Vista d’insieme
primo = 1 ;
for(
for j=2; j<dato; j++ )
{
if(
if dato%j == 0 ) Inizializzazione
primo = 0 ;
}
if(
if primo == 1 ) Aggiornamento
{
printf("E' un numero primo\n");
trovato = 1 ;
} Verifica
}
if(
if trovato == 0 )
printf("Non c'erano numeri primi\n");
34
Vista d’insieme
primo = 1 ;
for(
for j=2; j<dato; j++ )
{
if(
if dato%j == 0 ) Inizializzazione
primo = 0 ;
}
if(
if primo == 1 ) Aggiornamento
{
printf("E' un numero primo\n");
trovato = 1 ;
} Verifica
}
if(
if trovato == 0 )
printf("Non c'erano numeri primi\n");
35
Cicli ed iterazioni
Approfondimenti
Istruzione do-while
Istruzione break
Istruzione continue
2
Approfondimenti
Istruzione do-while
do while
do { B
B ;
} while ( C ) ;
V F
C
4
Confronto
5
Esempio
6
Soluzione
scanf("%d", &n) ;
7
Soluzione migliore
scanf("%d", &n) ;
if(
if n<1 || n>10 )
printf("Errore: ripeti\n");
8
Esempio
9
Soluzione
somma = 0 ;
do {
scanf("%d", &dato) ;
if(
if n != 9999 )
somma = somma + dato ;
10
Approfondimenti
Interruzione dei cicli
12
Istruzione break
V F
C
while ( C )
{
B1
B1 ;
if ( U ) F V
break ; U
B2 ;
}
B2
13
Funzionamento
14
Esempio
15
Soluzione
somma = 0 ;
do {
scanf("%d", &dato) ;
if(
if dato == 9999 )
break;
break
} while ( 1 ) ;
16
Esempio
17
Soluzione
scanf("%d", &dato) ;
primo = 1 ;
for ( i=2; i<dato; i++ )
{
if(
if dato%i == 0 )
{
primo = 0 ;
break ; /* inutile continuare */
}
}
18
Note
19
Approfondimenti
Istruzione continue
V F
C
while ( C )
{
B1
B1 ;
if ( U ) F V
continue ; U
B2 ;
}
B2
21
Funzionamento
22
Esempio
somma = 0 ;
do {
scanf("%d", &dato) ;
if(
if dato == 9999 )
continue ; /* non considerarlo */
24
Cicli ed iterazioni
Esercizi proposti
Esercizio “Decimale-binario”
Esercizio “Massimo Comun Divisore”
Esercizio “Triangolo di Floyd”
2
Esercizi proposti
Esercizio “Decimale-binario”
4
Analisi
DECIMALE – BINARIO
Numero binario: 0 0 1 1
5
Divisioni successive
n = 12 N N%2
n%2 = 0 cifra 0
12 0
n=n/2=6
n%2 = 0 cifra 0 6 0
n=n/2=3 3 1
n%2 = 1 cifra 1
1 1
n=n/2=1
n%2 = 1 cifra 1 0
n = n / 2 = 0 STOP
6
Soluzione
while(
while n!=0 ) bin-dec.c
{
if(
if n%2 == 1 )
printf("1 ") ;
else
printf("0 ") ;
n = n / 2 ;
}
7
Esercizi proposti
Esercizio “Massimo Comun Divisore”
9
Analisi
10
Algoritmo
k_max = 0
for k = da 1 a N1 bin-dec.c
se k è un divisore di N1
se k è un divisore di N2
aggiorna k_max = k
MCD = k_max
11
Esercizi proposti
Esercizio “Triangolo di Floyd”
1
2 3
4 5 6 N=5
7 8 9 10
11 12 13 14 15 13
Analisi
1
2 3
4 5 6 N=5
7 8 9 10
11 12 13 14 15 14
Algoritmo
cont = 1
for riga = da 1 a N floyd.c
1
2 3
4 5 6 N=5
7 8 9 10
11 12 13 14 15 15
Cicli ed iterazioni
Argomenti trattati
2
Tecniche di programmazione
3
Schemi ricorrenti
4
Suggerimenti
5
Materiale aggiuntivo
Sul CD-ROM
Testi e soluzioni degli esercizi trattati nei lucidi
Scheda sintetica
Esercizi risolti
Esercizi proposti
Esercizi proposti da altri libri di testo
6
Programmazione in C
Vettori
2
Riferimenti al materiale
Testi
Kernighan & Ritchie: capitoli 1 e 5
Cabodi, Quer, Sonza Reorda: capitolo 5
Dietel & Dietel: capitolo 6
Dispense
Scheda: “Vettori in C”
3
Vettori
Strutture dati complesse
2
Strutture dati complesse
Tipi di dato strutturati
a 35 x -17
Leggere da tastiera 10
numeri, e stamparli in
ordine inverso
Calcolare e stampare la
tavola pitagorica
Calcolare l’area del
triangolo date le
coordinate dei vertici
Per ogni auto calcolare il
tempo medio e minimo
sul giro
5
Esigenze
Leggere da tastiera 10 35
numeri, e stamparli in 7 dato
ordine inverso 14
Calcolare e stampare la 32
tavola pitagorica -9
Calcolare l’area del 2
triangolo date le 631
coordinate dei vertici -18
Per ogni auto calcolare il 4
tempo medio e minimo 7
sul giro
6
Esigenze
Leggere da tastiera 10
3.1 x
numeri, e stamparli in A
ordine inverso 0.2 y
Calcolare e stampare la
tavola pitagorica 4.0 x
B
Calcolare l’area del -2.1 y
triangolo date le
coordinate dei vertici 7.5 x
Per ogni auto calcolare il C
3.3 y
tempo medio e minimo
sul giro
8
Esigenze
Leggere da tastiera 10
numeri, e stamparli in 12 n
ordine inverso a1 3.1 min
Calcolare e stampare la 4.2 med
tavola pitagorica
Calcolare l’area del
triangolo date le
9 n
coordinate dei vertici
a2 3.0 min
Per ogni auto calcolare il
tempo medio e minimo 3.9 med
sul giro
9
Dati strutturati (1/2)
10
Dati strutturati (2/2)
11
Strutture dati complesse
Variabili e vettori
dato1
35
35 dato2
7 dato
dato3 7
14
14 dato4 32
dato5 32 -9
-9 dato6 2
dato7 2 dato8 631
dato9 -18
631 -18
4 dato10
4
7
7
13
Da evitare...
int main(void
void)
void
{
int dato1, dato2, dato3, dato4, dato5 ;
int dato6, dato7, dato8, dato9, dato10 ;
. . . . .
scanf("%d", &dato1) ;
scanf("%d", &dato2) ;
scanf("%d", &dato3) ;
. . .
scanf("%d", &dato10) ;
printf("%d\n", dato10) ;
printf("%d\n", dato9) ;
printf("%d\n", dato8) ;
. . .
printf("%d\n", dato1) ;
} 14
Vettori
15
Vettori
Sequenza lineare di 0 35
dati elementari 1 7 dato
Elementi tutti dello 2 14
stesso tipo 3 32
Numero di elementi 4 -9
fisso (N) 5 2
Elementi identificati 6 631
dal proprio indice 7 -18
da 0 a N-1 8 4
9 7
N=10 16
...così è meglio!
int main(void
void)
void
{
int dato[10] ;
. . . . .
for(
for i=0; i<10; i++)
scanf("%d", &dato[i]) ;
for(
for i=9; i>=0; i--)
printf("%d\n", dato[i]) ;
}
17
Insieme o separati?
18
Strutture dati complesse
Caratteristiche dei vettori
Caratteristiche statiche 0 35
Nome 1 7 dato
dato 2 14
Tipo di dato base 3 32
int 4 -9
Dimensione totale 5 2
10 6 631
Caratteristiche dinamiche 7 -18
Valori assunti dalle 8 4
singole celle 9 7
35, 7, 14, 32, ...
N=10 20
Esempio
21
Vincoli
22
Accesso alle celle
23
Errore frequente
Non si può 0 35
effettuare alcuna 1 7 dato
operazione sul 2 14
vettore 3 32
dato = 0 4 -9
printf(“%d”, 5 2
dato) 6 631
Occorre operare sui 7 -18
singoli elementi 8 4
Solitamente 9 7
all’interno di un ciclo
for N=10 25
Vettori
I vettori in C
2
I vettori in C
Definizione di vettori in C
int dato[10] ;
4
Definizione di vettori in C
int dato[10] ;
•• Stesse
Stesse regole
regole che
che valgono
valgono per
per ii
nomi
nomi delle
delle variabili.
variabili.
•• II nomi
nomi dei
dei vettori
vettori devono
devono essere
essere
diversi
diversi dai
dai nomi
nomi delle
delle variabili.
variabili.
5
Definizione di vettori in C
int dato[10] ;
•• int
int
•• float
float
•• In
In futuro vedremo: char,
futuro vedremo: char, struct
struct
6
Definizione di vettori in C
int dato[10] ;
•• Intero
Intero positivo
positivo
•• Costante
Costante nota
nota aa tempo
tempo di
di
compilazione
compilazione
•• Impossibile
Impossibile cambiarla
cambiarla in
in seguito
seguito
7
Esempi
int dato[10] ;
float lati[8] ;
int numeriprimi[100] ;
int is_primo[1000] ;
8
Esempi
0 1
int dato[10] ; 1 2
float lati[8] ; 2 3
int numeriprimi[100] ; 3 5
4 7
int is_primo[1000] ; 5 11
6 13
7 17
8 19
9 23
10 29
11 31
12 37
... ...
9
Esempi
0 0
int dato[10] ; 1 1
float lati[8] ; 2 1
int numeriprimi[100] ; 3 1
4 0
int is_primo[1000] ; 5 0
6 0
7 1
8 0
9 0
10 0
11 1
12 0
... ...
10
Errore frequente
int N = 10 ;
int dato[10] ;
int dato[N] ;
11
Errore frequente
int N ;
int dato[N] ;
int dato[10] ;
. . .
scanf("%d",&N) ;
12
Errore frequente
int i ;
int dato[i] ;
int dato[10] ;
. . .
for(i=0; i<10; i++)
scanf("%d",&dato[i]) ;
13
I vettori in C
Costanti
int dato[10] ;
15
Problemi
int i ;
int dato[10] ;
Devono essere
tutte uguali.
. . . Chi lo
for(i=0; i<10; i++)
garantisce?
scanf("%d", &dato[i]) ;
16
Problemi
int i ; Se volessi
int dato[10] ;
Devono essere
lavorare con
tutte uguali.
. . . 20 dati dovrei
Chi lo
modificare in
for(i=0; i<10; i++)
garantisce?
tutti questi
scanf("%d", &dato[i]) ;
punti.
for(i=0; i<10; i++)
printf("%d\n", dato[i]) ;
17
Soluzione
18
Costanti simboliche
Costrutto #define
Metodo originario, in tutte le versioni del C
Usa una sintassi particolare, diversa da quella del
C
Definisce costanti valide su tutto il file
Non specifica il tipo della costante
Modificatore const
Metodo più moderno, nelle versioni recenti del C
Usa la stessa sintassi di definizione delle variabili
Specifica il tipo della costante
19
Costrutto #define
Definizione
#define N 10 della
costante
int main(void
void)
void
{ Uso della
int dato[N] ; costante
. . .
}
20
Particolarità (1/2)
#define N 10
21
Particolarità (2/2)
#define N 10
22
Esempio
#define MAX 10
int main(void
void)
void
{
int i ;
int dato[MAX] ;
. . .
int main(void
void)
void Definizione
{ della
const int N = 10 ; costante
24
Sintassi
const int N = 10 ;
25
Esempio
int main(void
void)
void
{
const int MAX = 10 ;
int i ;
int dato[MAX] ;
. . .
27
I vettori in C
Accesso ai valori di un vettore
nomevettore[
[ valoreindice ]
30
Vincoli
31
Uso di una cella di un vettore
32
Esempi
if (dato[i]==0)
se l’elemento contiene zero
if (dato[i]==dato[i+1])
due elementi consecutivi uguali
dato[i] = dato[i] + 1 ;
incrementa l’elemento i-esimo
dato[i] = dato[i+1] ;
copia un dato dalla cella successiva
33
Vettori
Operazioni elementari sui vettori
Definizioni
Stampa di un vettore
Lettura di un vettore
Copia di un vettore
Ricerca di un elemento
Ricerca del massimo o minimo
Vettori ad occupazione variabile
2
Operazioni elementari sui vettori
Definizioni (1/2)
vettori.c
const int N = 10 ;
/* dimensioni dei vettori */
float r[N] ;
/* vettore di N reali */
int i, j ;
/* indici dei cicli */
4
Definizioni (2/2)
vettori.c
int dato ;
/* elemento da ricercare */
5
Operazioni elementari sui vettori
Stampa di un vettore
7
Stampa vettore di interi
vettori.c
printf("Vettore di %d interi\n", N) ;
for(
for i=0; i<N; i++ )
{
printf("Elemento %d: ", i+1) ;
printf("%d\n", v[i]) ;
}
8
Stampa vettore di interi
printf("Vettore di %d interi\n", N) ;
for(
for i=0; i<N; i++ )
{
printf("Elemento %d: ", i+1) ;
printf("%d\n", v[i]) ;
}
vettori.c
printf("Vettore di %d interi\n", N) ;
for(
for i=0; i<N; i++ )
{
printf("%d ", v[i]) ;
}
printf("\n") ;
10
Stampa in linea
printf("Vettore di %d interi\n", N) ;
for(
for i=0; i<N; i++ )
{
printf("%d ", v[i]) ;
}
printf("\n") ;
11
Stampa vettore di reali
vettori.c
printf("Vettore di %d reali\n", N) ;
for(
for i=0; i<N; i++ )
{
printf("Elemento %d: ", i+1) ;
printf("%f\n", r[i]) ;
}
12
Avvertenze
13
Operazioni elementari sui vettori
Lettura di un vettore
15
Lettura vettore di interi
vettori.c
printf("Lettura di %d interi\n", N) ;
for(
for i=0; i<N; i++ )
{
printf("Elemento %d: ", i+1) ;
scanf("%d", &v[i]) ;
}
16
Lettura vettore di interi
printf("Lettura di %d interi\n", N) ;
for(
for i=0; i<N; i++ )
{
printf("Elemento %d: ", i+1) ;
scanf("%d", &v[i]) ;
}
Lettura di un vettore di 10 interi
Elemento 1: 3
Elemento 2: 4
Elemento 3: 7
Elemento 4: 5
Elemento 5: 3
Elemento 6: -1
Elemento 7: -3
Elemento 8: 2
Elemento 9: 7
Elemento 10: 3
17
Lettura vettore di reali
vettori.c
printf("Lettura di %d reali\n", N) ;
for(
for i=0; i<N; i++ )
{
printf("Elemento %d: ", i+1) ;
scanf("%f", &r[i]) ;
}
18
Avvertenze
19
Operazioni elementari sui vettori
Copia di un vettore
21
Copia di un vettore
35 12 35 35
7 2 7 7
14 73 14 14
32 -12 32 32
-9 0 -9 -9
2 0 Copia v in w 2 2
631 -17 631 631
-18 44 -18 -18
4 1 4 4
7 17 7 7
v w v w 22
Copia di un vettore
vettori.c
for(
for i=0; i<N; i++ )
{
w[i] = v[i] ;
}
23
Avvertenze
24
Operazioni elementari sui vettori
Ricerca di un elemento
26
Ricerca di un elemento (1/3)
vettori.c
...
27
Ricerca di un elemento (2/3)
trovato = 0 ; vettori.c
pos = -1 ;
for(
for i=0 ; i<N ; i++ )
{
if(
if v[i] == dato )
{
trovato = 1 ;
pos = i ;
}
}
28
Ricerca di un elemento (3/3)
vettori.c
if(
if trovato==1 )
{
printf("Elemento trovato "
"alla posizione %d\n", pos+1) ;
}
else
{
printf("Elemento non trovato\n");
}
29
Varianti
30
Operazioni elementari sui vettori
Ricerca del massimo
32
Ricerca del massimo (1/2)
...
max = r[0] ;
posmax = 0 ;
for(
for i=1 ; i<N ; i++ )
{
if(
if r[i]>max )
{
max = r[i] ;
posmax = i ;
}
}
33
Ricerca del massimo (2/2)
vettori.c
34
Operazioni elementari sui vettori
Occupazione variabile
36
Tecnica adottata
37
Tecnica adottata
3 1 7 12 -3 1 21 43 -8 0 12 3 2 11 3 4 8 76 56 23 4 5 90 15 72 -4 -2 22 73
Elementi Elementi
effettivamente inutilizzati
utilizzati
38
Esempio
/* dimensione massima */
const int MAXN = 100 ;
...
N = 0 ; /* inizialmente “vuoto” */
39
Regole di utilizzo
40
Crescita del vettore
v[N] = nuovo_elemento ;
N++ ;
41
Esempio
42
Soluzione (1/3)
float v[MAXN] ;
float dato ;
int N ;
int i ;
43
Soluzione (2/3)
/* aggiungi al vettore */
if(
if dato != 0.0 )
{
v[N] = dato ;
N++ ;
}
44
Soluzione (3/3)
while(dato!=
while 0.0)
{
leggi0.c
/* leggi il dato successivo */
printf("Elemento %d: ", i+1) ;
scanf("%f", &dato) ;
i++ ;
/* aggiungi al vettore */
if(
if dato != 0.0 )
{
v[N] = dato ;
N++ ;
}
}
45
Esercizio “Positivi e Negativi”
46
Analisi
Numeri positivi:
3 1 2
Numeri negativi:
-4 -3
47
Approccio risolutivo
48
Soluzione (1/4)
int pos[MAXN] ;
int neg[MAXN] ;
int N, Np, Nn ;
int i ;
int dato ;
posneg.c
50
Soluzione (3/4)
for(
for i=0 ; i<N ; i++ )
{
if(seq[i]
if > 0) posneg.c
{
/* positivo => in pos[] */
pos[Np] = seq[i] ;
Np++ ;
}
else
{
/* negativo => in neg[] */
neg[Nn] = seq[i] ;
Nn++ ;
}
}
51
Soluzione (4/4)
posneg.c
printf("Numeri positivi:\n") ;
for(i=0;
for i<Np; i++)
printf("%d ", pos[i]) ;
printf("\n");
printf("Numeri negativi:\n") ;
for(i=0;
for i<Nn; i++)
printf("%d ", neg[i]) ;
printf("\n");
52
Vettori
Esercizi guidati sui vettori
2
Esercizi guidati sui vettori
Esercizio “Elementi comuni” (1/2)
4
Esercizio “Elementi comuni” (2/2)
5
Analisi (1/3)
COLLEGA NUMERO 1
Inserisci giorno (1-31, 0 per terminare): 2
Inserisci giorno (1-31, 0 per terminare): 4
Inserisci giorno (1-31, 0 per terminare): 6
Inserisci giorno (1-31, 0 per terminare): 10
Inserisci giorno (1-31, 0 per terminare): 0
COLLEGA NUMERO 2
Inserisci giorno (1-31, 0 per terminare): 3
Inserisci giorno (1-31, 0 per terminare): 4
Inserisci giorno (1-31, 0 per terminare): 5
Inserisci giorno (1-31, 0 per terminare): 0
Giorno disponibile: 4
6
Analisi (2/3)
COLLEGA NUMERO 1
Inserisci giorno (1-31, 0 per terminare): 2
Inserisci giorno (1-31, 0 per terminare): 4
Inserisci giorno (1-31, 0 per terminare): 6
Inserisci giorno (1-31, 0 per terminare): 10
Inserisci giorno (1-31, 0 per terminare): 0
COLLEGA NUMERO 2
Inserisci giorno (1-31, 0 per terminare): 3
Inserisci giorno (1-31, 0 per terminare): 5
Inserisci giorno (1-31, 0 per terminare): 7
Inserisci giorno (1-31, 0 per terminare): 0
7
Analisi (3/3)
COLLEGA NUMERO 1
Inserisci giorno (1-31, 0 per terminare): 2
Inserisci giorno (1-31, 0 per terminare): 4
Inserisci giorno (1-31, 0 per terminare): 6
Inserisci giorno (1-31, 0 per terminare): 0
COLLEGA NUMERO 2
Inserisci giorno (1-31, 0 per terminare): 2
Inserisci giorno (1-31, 0 per terminare): 3
Inserisci giorno (1-31, 0 per terminare): 4
Inserisci giorno (1-31, 0 per terminare): 0
Giorno disponibile: 2
Giorno disponibile: 4
8
Algoritmo
9
Ricerca elementi comuni
giorni1
2 8 4 12 7 21 18 22 9 10 25 30 3 17 29
N1
giorni2
6 11 23 21 26 15 16 17 13 26
N2
10
Ricerca elementi comuni
giorni1
2 8 4 12 7 17 18 22 9 10 25 30 3 21 29
N1
giorni2
6 11 23 21 26 15 16 17 13 26
N2
11
Ricerca elementi comuni
giorni1 i
2 8 4 12 7 17 18 22 9 10 25 30 3 21 29
N1
giorni1[i] == giorni2[j]
giorni2
6 11 23 21 26 15 16 17 13 26
j N2
12
Soluzione (1/5)
int N1, N2 ;
int giorni1[MAXN] ; /* giorni collega 1 */
int giorni2[MAXN] ; /* giorni collega 2 */
int giorno ;
int i, j ;
int trovato ;
/* flag: giorni1[i] in giorni2[]? */
int fallito ;
/* flag: trovato almeno un giorno? */
13
Soluzione (2/5)
/* DISPONIBILITA' COLLEGA 1 */
printf("COLLEGA NUMERO 1\n");
N1 = 0 ; riunione.c
printf("Inserisci giorno (1-31): ");
scanf("%d", &giorno) ;
while(
while giorno != 0 )
{
giorni1[N1] = giorno ;
N1++ ;
/* DISPONIBILITA' COLLEGA 2 */
printf("COLLEGA NUMERO 2\n");
N2 = 0 ; riunione.c
printf("Inserisci giorno (1-31): ");
scanf("%d", &giorno) ;
while(
while giorno != 0 )
{
giorni2[N2] = giorno ;
N2++ ;
riunione.c
18
Esercizi guidati sui vettori
Esercizio “Ricerca duplicati” (1/2)
20
Esercizio “Ricerca duplicati” (2/2)
21
Analisi (1/2)
22
Analisi (2/2)
23
Algoritmo
24
Ricerca dei duplicati
25
Soluzione (1/5)
int elem ;
int i, j ;
printf("RICERCA DUPLICATI\n") ;
biglietti.c
printf("\n");
/* ACQUISIZIONE VALORE DI N */
do{
do
} while(N<2
while || N>MAXN) ;
27
Soluzione (3/5)
biglietti.c
28
Soluzione (4/5)
/* RICERCA DEI DUPLICATI */
dupl = 0 ;
for(
for i=0 ; i<N ; i++ )
biglietti.c
{
/* verifica se serie[i] e' duplicato */
elem = serie[i] ;
if(trovato
if == 1)
{
printf("ATTENZIONE: %d duplicato\n",
elem) ;
dupl = 1 ;
}
}
29
Soluzione (4/5)
/* RICERCA DEI DUPLICATI */
dupl = 0 ;
for(
for i=0 ; i<N ; i++ )
biglietti.c
{
/* verifica se serie[i] e' duplicato */
elem = serie[i] ;
if(trovato
if == 1)
trovato = 0 ;
{ for(
for j=0 ; j<N ; j++ )
printf("ATTENZIONE:
{ %d duplicato\n",
elem)if(
; (i!=j) &&
if
dupl = 1 ; (elem == serie[j]) )
} trovato = 1 ;
} } 30
Soluzione (5/5)
biglietti.c
31
Esercizi guidati sui vettori
Esercizio “Sottosequenza” (1/2)
34
Analisi
35
Algoritmo (1/2)
Chiamiamo
seq[] la sequenza di N elementi
tele[] la sottosequenza di K elementi (K<N)
36
Algoritmo (2/2)
Verifichiamo se
i primi K elementi di seq[] sono uguali ai K
elementi di tele[]
i K elementi di seq[] con indice da 1 a K sono
uguali ai K elementi di tele[]
i K elementi di seq[] con indice da 2 a K+1 sono
uguali ai K elementi di tele[]
i K elementi di seq[] con indice da 3 a K+2 sono
uguali ai K elementi di tele[]
...
37
Sottosequenze
seq
2 8 4 12 7 21 18 22 9 10 25 30 3 17 29
tele
7 21 18
38
Sottosequenze
i i+K-1
seq
2 8 4 12 7 21 18 22 9 10 25 30 3 17 29
N
7 21 18
0 K-1
tele
7 21 18
39
Sottosequenze
i i+K-1
seq
2 8 4 12 7 21 18 22 9 10 25 30 3 17 29
N
7 21 18
0 K-1
tele
7 21 18 j == 0...K-1
seq[i+j] = tele[j]
K
40
Soluzione (1/4)
int i, j ;
int trovato ; /* flag: ricorda se ha
trovato una sottosequenza uguale */
int errore ; /* flag: verifica che
TUTTI gli elementi della
sottosequenza siano uguali */
41
Soluzione (2/4)
sensitivo.c
printf("ESPERIMENTO DI TELEPATIA\n") ;
printf("\n");
trovato = 0 ;
/* considera tutti i possibili
punti di partenza (i) */ sensitivo.c
for(
for i=0; i<N-K; i++ )
{
/* verifica se seq[] nelle
posizioni da (i) a (i+K-1) e'
uguale a tele[] nelle posizioni
da (0) a (K-1) */
trovato = 0 ;
/* considera tutti i possibili
punti di partenza (i) */ sensitivo.c
for(
for i=0; i<N-K; i++ )
{
/* verifica se seq[] nelle
posizioni da (i) a (i+K-1) e'
uguale a tele[] nelle posizioni
da (0) a (K-1) */
sensitivo.c
45
Esercizi guidati sui vettori
Esercizio “Poligono” (1/2)
Uno studente di
geometria deve
misurare il perimetro
di una serie di
poligoni irregolari, di
cui conosce le
coordinate cartesiane
(x,y) dei vertici. Per
far ciò realizza un
programma in C
47
Esercizio “Poligono” (2/2)
48
Analisi (1/2)
AB = √(2-(-3))²+(5-0)²
BC = √(-3-0)²+(0-(-2))²
A(2,5)
CD = √(0-4)²+(-2-(-2))²
DA = √(4-2)²+(-2-5)²
B(-3,0)
Perimetro =
C(0,-2) D(4,-2) = AB + BC + CD + DA
49
Analisi (2/2)
Numero di vertici: 4
Inserire le coordinate dei vertici
Vertice 1: x = 2
y = 5
Vertice 2: x = -3
y = 0
Vertice 3: x = 0
y = -2
Vertice 4: x = 4
y = -2
50
Struttura dati
51
Soluzione (1/3)
/* vettori "paralleli" */
float x[MAXN] ;
float y[MAXN] ;
int i ;
float lato ;
float perimetro ;
52
Soluzione (2/3)
53
Soluzione (3/3)
perimetro = 0 ;
for(
for i=0; i<N-1; i++ ) poligoni.c
{
/* (x[i],y[i])-(x[i+1],y[i+1]) */
lato = sqrt( (x[i]-x[i+1])*(x[i]-x[i+1])
+ (y[i]-y[i+1])*(y[i]-y[i+1]) ) ;
perimetro = perimetro + lato ;
}
/* ultimo lato:
(x[N-1],y[N-1])-(x[0],y[0]) */
lato = sqrt( (x[N-1]-x[0])*(x[N-1]-x[0])
+ (y[N-1]-y[0])*(y[N-1]-y[0]) ) ;
perimetro = perimetro + lato ;
54
Vettori
Argomenti trattati
2
Tecniche di programmazione
3
Vettori e cicli
4
Errore frequente
5
Errore frequente
6
Suggerimenti
7
Avvertenze
8
Materiale aggiuntivo
Sul CD-ROM
Testi e soluzioni degli esercizi trattati nei lucidi
Scheda sintetica
Esercizi risolti
Esercizi proposti
Esercizi proposti da altri libri di testo
9
Programmazione in C
Caratteri e stringhe
Dati testuali
Il tipo char
Vettori di caratteri
Operazioni elementari sulle stringhe
Funzioni di libreria
Esercizi proposti
Sommario
2
Riferimenti al materiale
Testi
Kernighan & Ritchie: capitoli 1 e 5
Cabodi, Quer, Sonza Reorda: capitolo 5
Dietel & Dietel: capitolo 8
Dispense
Scheda: “Caratteri e stringhe in C”
3
Caratteri e stringhe
Dati testuali
5
Dati testuali
Tipi di dato testuali
7
Il sistema dei tipi C
Tipo di dato
signed/unsigned Funzioni
8
Rappresentazione dei testi
9
Codice ASCII
10
Source: [Link]
Caratteri e stringhe
y 7 W ! %
F u l v i o 0 6 A Z N
0 1 1 - 5 6 4 6 3 3 2
11
Dualità caratteri - numeri
y 7 W ! %
121 55 87 33 37
F u l v i o 0 6 A Z N
70 117 108 118 105 111 48 54 65 90 78
0 1 1 - 5 6 4 6 3 3 2
12
48 49 49 45 53 54 52 54 51 51 50
Dati testuali
Caratteri in C
14
Codice ASCII
15
Source: [Link]
Codice ASCII
Simbolo
corrispondente
Valore decimale
(tra 0 e 127)
16
Source: [Link]
Codice ASCII
Lettere
minuscole
Lettere
maiuscole
17
Source: [Link] Source: [Link]
Codice ASCII
Cifre
numeriche
Simboli di
punteggiatura
Source: [Link] 18
Source: [Link]
Codice ASCII
Spazio
bianco
Caratteri di
controllo
19
Source: [Link]
Caratteristiche del codice ASCII
20
Caratteri di controllo
23
Dati testuali
Stringhe
25
Caratteristiche delle stringhe
F u l v i o 0 6 A Z N
70 117 108 118 105 111 48 54 65 90 78
0 1 1 - 5 6 4 6 3 3 2
48 49 49 45 53 54 52 54 51 51 50
26
Manipolazione delle stringhe
27
Errore frequente
int char
137 1 3
7 7
49 51 55
28
Caratteri e stringhe
Il tipo char
Variabili char
Input/output di char
Operazioni sui char
Esercizio “Quadrati di lettere”
2
Il tipo char
Variabili char
char lettera ;
lettera = 'Q' ;
4
Apici
5
Dualità dei char
6
Esempi
int i ;
char c ;
c = 'A' ;
7
Esempi
int i ;
char c ;
c = 'A' ;
c = 65 ; /* equivalente! */
8
Esempi
int i ;
char c ;
c = 'A' ;
c = 65 ; /* equivalente! */
i = c ; /* i sarà 65 */
9
Esempi
int i ;
char c ;
c = 'A' ;
c = 65 ; /* equivalente! */
i = c ; /* i sarà 65 */
c = c + 1 ; /* c sarà 66 = 'B' */
10
Esempi
int i ;
char c ;
c = 'A' ;
c = 65 ; /* equivalente! */
i = c ; /* i sarà 65 */
c = c + 1 ; /* c sarà 66 = 'B' */
c = c * 2 ; /* non ha senso... */
11
Esempi
int i ;
char c ;
c = 'A' ;
c = 65 ; /* equivalente! */
i = c ; /* i sarà 65 */
c = c + 1 ; /* c sarà 66 = 'B' */
c = c * 2 ; /* non ha senso... */
if (c == 'Z') ...
12
Esempi
int i ;
char c ;
c = 'A' ;
c = 65 ; /* equivalente! */
i = c ; /* i sarà 65 */
c = c + 1 ; /* c sarà 66 = 'B' */
c = c * 2 ; /* non ha senso... */
if (c == 'Z') ...
for(
for c='A'; c<='Z'; c++) ...
13
Caratteri speciali
C ASCII Significato
'\n' LF – 10 A capo
'\t' TAB – 9 Tabulazione
'\b' BS – 8 Backspace – cancella ultimo car.
'\a' BEL – 7 Emette un “bip”
'\r' CR – 13 Torna alla prima colonna
14
Punteggiatura speciale in C
C ASCII Significato
'\\' \ Immette un backslash
'\'' ' Immette un apice singolo
'\"' " Immette un apice doppio
'\ooo' ooo Immette in carattere ASCII con
codice (ottale) ooo
'\xhh' hh Immette in carattere ASCII con
codice (esadecimale) hh 15
Il tipo char
Input/output di char
17
Stampa di caratteri
char ch ;
printf("%c", ch) ;
char ch ;
putchar(ch) ;
18
Lettura di caratteri
char ch ;
scanf("%c", &ch) ;
char ch ;
ch = getchar() ;
19
Suggerimenti (1/2)
20
Suggerimenti (2/2)
21
Bufferizzazione dell’input-output
22
Conseguenza pratica
char ch,ch2 ;
ch = getchar() ;
ch2 = getchar() ;
char ch,ch2 ;
ch = getchar() ;
ch2 = getchar() ;
char ch,ch2 ;
ch = getchar() ;
ch2 = getchar() ;
char ch,ch2 ;
ch2 = getchar() ;
char ch,ch2 ;
ch2 = getchar() ;
char ch,ch2 ;
ch2 = getchar() ;
char ch,ch2 ;
ch2 = getchar() ;
30
Soluzione proposta
printf("Dato: ");
31
Soluzione proposta
printf("Dato: ");
32
Il tipo char
Operazioni sui char
34
Conversione ASCII-Carattere
35
Esempio (1/3)
int i ;
char ch ; char-int.c
scanf("%d", &i) ;
ch = i ;
36
Esempio (2/3)
while(
while getchar() != '\n' )
/**/ ;
i = ch ;
37
Esempio (3/3)
char-int.c
Immetti un carattere: $
Il carattere $ ha codice ASCII 36
38
Scansione dell’alfabeto
char ch ;
for(
for ch = 'A' ; ch <= 'Z' ; ch++ )
putchar(ch) ;
putchar('\n') ;
39
Verifica se è una lettera
if(
if ch>='A' && ch<='Z' )
printf("%c lettera maiuscola\n", ch) ;
if(
if ch>='a' && ch<='z' )
printf("%c lettera minuscola\n", ch) ;
if(
if (ch>='A' && ch<='Z') ||
(ch>='a' && ch<='z') )
printf("%c lettera\n", ch) ; 40
Verifica se è una cifra
if(
if ch>='0' && ch<='9' )
printf("%c cifra numerica\n", ch) ;
41
Valore di una cifra
if(
if ch>='0' && ch<='9' )
{
printf("%c cifra numerica\n", ch) ;
val = ch - '0' ;
printf("Il suo valore e': %d", val ) ;
}
42
Da minuscolo a maiuscolo (1/2)
43
Da minuscolo a maiuscolo (2/2)
if(
if ch>='a' && ch<='z' )
{
printf("%c lettera minuscola\n", ch) ;
ch2 = ch + ('A'-'a') ;
printf(La maiuscola e': %c\n", ch2) ;
}
44
Confronto alfabetico
if(
if ch < ch2 )
printf("%c viene prima di %c", ch, ch2) ;
else
printf("%c viene prima di %c", ch2, ch) ;
45
Il tipo char
Esercizio “Quadrati di lettere”
47
Analisi
BB
BB
CCC
CCC
CCC
DDDD
DDDD
DDDD
DDDD
48
Soluzione (1/2)
int i, N ;
int riga, col ; quadrati.c
char ch ;
while(N<1
while || N>26)
{
printf("Deve essere tra 1 e 26\n");
printf("Quanti quadrati? ") ;
scanf("%d", &N) ;
}
49
Soluzione (2/2)
for(
for i=0; i<N; i++ )
{
/* stampa un quadrato quadrati.c
di dimensione (i+1) */
ch = i + 'A' ;
for(riga=0;
for riga<i+1; riga++)
{
for(col=0;
for col<i+1; col++)
putchar(ch);
putchar('\n') ;
}
putchar('\n') ;
}
50
Caratteri e stringhe
Vettori di caratteri
Il tipo stringa
Terminatore nullo
Input/output di stringhe
2
Vettori di caratteri
Stringhe in C
char saluto[10] ;
B u o n g i o r n o
4
Esempio
Buongiorno, Fulvio!
5
Soluzione (1/3)
saluti.c
N = 0 ;
6
Soluzione (2/3)
saluti.c
ch = getchar() ;
while(
while ch != '\n' && N<MAX )
{
nome[N] = ch ;
N++ ;
ch = getchar() ;
}
7
Soluzione (3/3)
saluti.c
printf("Buongiorno, ") ;
for(i=0;
for i<N; i++)
putchar( nome[i] ) ;
printf("!\n") ;
8
Commenti (1/2)
9
Commenti (2/2)
10
Vettori di caratteri
Lunghezza di una stringa
char nome[10] ; F u l v i o Z ! $ .
int lungh_nome ;
6
12
Lunghezza di una stringa
char nome[10] ; F u l v i o Z ! $ .
int lungh_nome ;
6
2. utilizzare un carattere “speciale”, con funzione di
terminatore, dopo l’ultimo carattere valido
char nome[10] ; F u l v i o Ø ! $ .
13
Carattere terminatore
14
Terminatore standard in C
F u l v i o Ø ! $ .
15
Vantaggi
16
Svantaggi
17
Esempio
Buongiorno, Fulvio!
18
Soluzione (1/3)
saluti0.c
i = 0 ;
19
Soluzione (2/3)
i = 0 ;
saluti0.c
ch = getchar() ;
while(
while ch != '\n' && i<MAX )
{
nome[i] = ch ;
i++ ;
ch = getchar() ;
}
/* aggiunge terminatore nullo */
nome[i] = '\0' ;
20
Soluzione (3/3)
saluti0.c
printf("Buongiorno, ") ;
for(i=0;
for nome[i]!='\0'; i++)
putchar( nome[i] ) ;
printf("!\n") ;
21
Vettori di caratteri
I/O di stringhe
23
Lettura di stringhe con scanf
24
Esempio
scanf("%s", nome) ;
25
Lettura di stringhe con gets
26
Esempio
gets(nome) ;
27
Scrittura di stringhe con printf
28
Esempio
printf("Buongiorno, ") ;
printf("%s", nome) ;
printf("!\n") ;
29
Scrittura di stringhe con puts
30
Esempio
printf("Buongiorno, ") ;
puts(nome) ;
/* No!! printf("!\n") ; */
31
Conclusione
32
Caratteri e stringhe
Operazioni elementari sulle stringhe
Lunghezza
Copia di stringhe
Concatenazione di stringhe
Confronto di stringhe
Ricerca di sotto-stringhe
Ricerca di parole
2
Operazioni elementari sulle stringhe
Lunghezza di una stringa
char s[MAX+1] ;
int lun ;
s S a l v e Ø 3 r W t
0 1 2 3 4 5
4
Calcolo della lunghezza
for(
for i=0 ; s[i] != 0 ; i++ )
/* Niente */ ;
lun = i ;
5
La funzione strlen
lun = strlen(s) ;
6
Operazioni elementari sulle stringhe
Copia di stringhe
char src[MAXS+1] ;
char dst[MAXD+1] ;
src S a l v e Ø 3 r W t
dst Ø 2 % q " t o $ n o
8
Risultato della copia
src S a l v e Ø 3 r W t
dst Ø 2 % q " t o $ n o
Copia src in dst
dst S a l v e Ø o $ n o
9
Copia
for(
for i=0 ; src[i] != 0 ; i++ )
dst[i] = src[i] ; /* copia */
10
La funzione strcpy
strcpy(dst, src) ; 11
Avvertenze
12
Errore frequente
dst[] = src[] ;
dst[MAXD] = src[MAXC] ;
13
Operazioni elementari sulle stringhe
Concatenazione di stringhe
sa S a l v e Ø 3 r W t
sb m o n d o Ø o $ n o
Concatenazione di sa con sb
S a l v e m o n d o Ø w 1 Q r
15
Semplificazione
16
Esempio
sa S a l v e Ø w z 3 w 7 w 1 Q r
sb m o n d o Ø h ! L . 2 x y E P
Concatenazione di sa con sb
sa S a l v e m o n d o Ø w 1 Q r
sb m o n d o Ø h ! L . 2 x y E P
17
Algoritmo di concatenazione
sa S a l v e Ø w z 3 w 7 w 1 Q r
18
Algoritmo di concatenazione
sa S a l v e Ø w z 3 w 7 w 1 Q r
sb m o n d o Ø h ! L . 2 x y E P
19
Algoritmo di concatenazione
sa S a l v e m o n d o Ø w 1 Q r
sb m o n d o Ø h ! L . 2 x y E P
20
Concatenazione
la = strlen(sa) ;
for(
for i=0 ; sb[i] != 0 ; i++ )
sa[la+i] = sb[i] ; /* copia */
sa[la+i] = 0 ; /* terminatore */
21
La funzione strcat
strcat(sa, sb) ; 22
Avvertenze (1/2)
23
Avvertenze (2/2)
24
Operazioni elementari sulle stringhe
Confronto di stringhe
26
Confronto di uguaglianza
sa S a l v e Ø o 4 d 1 Ø w 1 Q r
sb S a l v e Ø h ! L . 2 x y E P
27
Confronto di uguaglianza
uguali = 1 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0 ; i++ )
{
if(sa[i]!=sb[i])
if
uguali = 0 ;
}
if(sa[i]!=0
if || sb[i]!=0)
uguali = 0 ;
28
Confronto di uguaglianza
uguali = 1 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0 ; i++ )
{
if(sa[i]!=sb[i])
if
uguali = 0 ;
}
if(sa[i]!=0
if || sb[i]!=0)
uguali = 0 ;
29
Confronto di uguaglianza
uguali = 1 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0 ; i++ )
{
if(sa[i]!=sb[i])
if
uguali = 0 ;
}
if(sa[i]!=0
if || sb[i]!=0)
uguali = 0 ;
30
Confronto di uguaglianza
sb S a l u t e Ø ! L . 2 x y E P
33
Confronto di ordine (1/2)
if(minore==0
if && sa[i]==0 && sb[i]!=0)
minore=1 ;
if(minore==1)
if
printf("%s e' minore di %s\n",
sa, sb ) ;
35
Commenti
minore = 0 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0
Ricerca
&& minore==0; i++di esistenza
) della
{ condizione sa[i]<sb[i].
if(sa[i]<sb[i])
if
minore = 1 ;
if(sa[i]>sb[i])
if
minore = -1 ;
}
if(minore==0
if && sa[i]==0 && sb[i]!=0)
minore=1 ;
if(minore==1)
if
...
36
Commenti
minore = 0 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0
&& minore==0; i++ )
{
if(sa[i]<sb[i])
if
minore = 1 ; fino al primo terminatore
Cicla
if(sa[i]>sb[i])
if nullo, oppure fino a che non si
minore = -1 “scopre”
; chi è minore.
} In altre parole, continua a
ciclare solo finché le stringhe
if(minore==0
if && sa[i]==0 && sb[i]!=0)
“sembrano” uguali.
minore=1 ;
if(minore==1)
if
...
37
Commenti
minore = 0 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0
Sicuramente sa è minore di sb
&& minore==0;Flag:i++ )
minore = 1
{
if(sa[i]<sb[i])
if
minore = 1 ;
if(sa[i]>sb[i])
if
minore = -1 ;
}
Sicuramente sa non è minore
Se flag
if(minore==0
if di sb
&& sa[i]==0 && sb[i]!=0)
minore==0
minore=1 ; Flag: minore = -1
continua a ciclare
if(minore==1)
if
...
38
Commenti
minore = 0 ;
for(
for i=0 ; sa[i]!=0 && sb[i]!=0
&& minore==0; i++ )
{
if(sa[i]<sb[i])
if
minore = 1 ; Se finora erano uguali, ma sa è
if(sa[i]>sb[i])
if più corta di sb, allora sa è
minore = -1 ; minore
}
if(minore==0
if && sa[i]==0 && sb[i]!=0)
minore=1 ;
if(minore==1)
if
...
39
La funzione strcmp
40
Confronti vari
...
if(ris<0)
if
printf("%s minore di %s\n", sa, sb);
if(ris==0)
if
printf("%s uguale a %s\n", sa, sb);
if(ris>0)
if
printf("%s maggiore di %s\n", sa, sb);
41
Suggerimento
Ø 0 … 9 A … Z a … z
43
Conseguenze
46
Ricerca di un carattere (1/2)
Detti:
s una stringa arbitraria
ch un carattere qualsiasi
Determinare se la stringa s contiene (una o più
volte) il carattere ch al suo interno, in qualsiasi
posizione
s S a l v e Ø o 4 d 1 a w 1 Q r
ch a
47
Ricerca di un carattere (2/2)
...
trovato = 0 ;
for(
for i=0 ; s[i]!=0 && trovato==0; i++ )
{
if(
if s[i]==ch )
trovato = 1 ;
}
48
La funzione strchr (1/2)
49
La funzione strchr (2/2)
...
if(strchr(s,
if ch)!=NULL)
printf("%s contiene %c\n", s, ch) ;
50
Ricerca di una sotto-stringa
Detti:
s una stringa arbitraria
r una stringa da ricercare
Determinare se la stringa s contiene (una o più
volte) la stringa r al suo interno, in qualsiasi
posizione
s S a l v e a t u t t i Ø r
r t u t Ø z 3
51
Esempio
s S a l v e a t u t t i Ø r
t u t
r t u t Ø z 3 52
Esempio
s S a l v e a t u t t i Ø r
t u t
t u t
r t u t Ø z 3 53
Esempio
s S a l v e a t u t t i Ø r
t u t t u t t u t
t u t t u t
t u t t u t
t u t t u t
r t u t Ø z 3 54
Esempio
s S a l v e a t u t t i Ø r
t u t t u t t u t
t u t t u t t u t
t u t t u t t u t
t u t t u t
r t u t Ø z 3 55
Algoritmo di ricerca
lr = strlen(r) ; ls = strlen(s)
trovato = 0
Per ogni posizione possibile di r all’interno di s:
pos = 0...ls-lr (compresi)
s S a l v e a t u t t i Ø r
pos r t u t Ø lr ls 56
Algoritmo di ricerca
lr = strlen(r) ; ls = strlen(s)
trovato = 0
Per ogni posizione possibile di r all’interno di s:
pos = 0...ls-lr (compresi)
Controlla se i caratteri di r, tra 0 e lr-1,
coincidono con i caratteri di s, tra pos e
pos+lr-1
Se sì, trovato = 1
s S a l v e a t u t t i Ø r
pos r t u t Ø lr ls 57
Algoritmo di ricerca
lr = strlen(r) ; ls diversi = 0 ;
= strlen(s)
for(i=0;
for i<lr; i++)
trovato = 0 if(r[i]!=s[pos+i])
if
diversi = 1 ;
Per ogni posizione possibile di r all’interno di s:
pos = 0...ls-lr (compresi)
Controlla se i caratteri di r, tra 0 e lr-1,
coincidono con i caratteri di s,tra pos e
pos+lr-1
Se sì, trovato = 1
s S a l v e a t u t t i Ø r
pos r t u t Ø lr ls 58
Algoritmo di ricerca
lr = strlen(r) ; ls = strlen(s)
trovato = 0
Per ogni posizione possibile di r all’interno di s:
pos = 0...ls-lr if(diversi==0)
if
Controlla se i caratteri di trovato=1 ;
r, tra 0 e lr-1,
coincidono con i caratteri di s,tra pos e
pos+lr-1
Se sì, trovato = 1
s S a l v e a t u t t i Ø r
pos r t u t Ø lr ls 59
Ricerca di una sotto-stringa (1/2)
char s[MAX] ;
char r[MAX] ;
int lr, ls, pos ;
int i ;
int trovato, diversi ;
...
ls = strlen(s);
lr = strlen(r);
60
Ricerca di una sotto-stringa (2/2)
trovato = 0 ;
for(pos=0;
for pos<=ls-lr; pos++)
{ substr.c
if(diversi==0)
if
trovato=1 ;
}
if(trovato==1)
if
printf("Trovato!\n");
61
La funzione strstr (1/2)
62
La funzione strstr (2/2)
...
if(strstr(s,
if r)!=NULL)
printf("Trovato!\n");
63
Operazioni elementari sulle stringhe
Ricerca di parole
s1 C i a o n o n n o Ø t 2 " r
s2 O g g i n o n c ' e ' Ø 4
r n o n Ø z 3
65
Definizioni (1/2)
66
Definizioni (2/2)
67
Algoritmo di ricerca
68
Algoritmo di ricerca
69
Algoritmo di ricerca
if(
if pos == 0 ||
!( (s[pos-1]>='a' && s[pos-1]<='z') ||
(s[pos-1]>='A' && s[pos-1]<='Z') )
)
70
Algoritmo di ricerca
71
Algoritmo di ricerca
72
Ricerca di una parola (1/2)
trovato = 0 ;
for(pos=0;
for pos<=ls-lr; pos++) parola.c
{
if(
if pos==0 ||
!( (s[pos-1]>='a' &&
s[pos-1]<='z') ||
(s[pos-1]>='A' &&
s[pos-1]<='Z') ) )
{
diversi = 0 ;
for(i=0;
for i<lr; i++)
if(r[i]!=s[pos+i])
if
diversi = 1 ;
73
Ricerca di una parola (2/2)
if(
if diversi==0 &&
parola.c
( pos == ls-lr ||
!( (s[pos+lr]>='a' &&
s[pos+lr]<='z') ||
(s[pos+lr]>='A' &&
s[pos+lr]<='Z') )
) )
{
trovato=1 ;
}
}
}
74
La funzione strparola
75
Caratteri e stringhe
Funzioni di libreria
Introduzione
Lunghezza di stringhe
Classificazione di caratteri
Trasformazione di caratteri
Copia e concatenazione
Confronto di stringhe
Ricerca in stringhe
Conversione numero-stringa
2
Funzioni di libreria
Librerie sulle stringhe
4
Suggerimenti
5
Rappresentazione
6
Convenzioni
Definite in strlen
<string.h>
Determina la lunghezza
di una stringa data
9
strlen
10
Funzioni di libreria
Classificazione di caratteri
12
isalpha
Esempio if(isalpha(ch))
if
{ ... }
13
isupper
Esempio if(isupper(ch))
if
{ ... }
14
islower
Esempio if(islower(ch))
if
{ ... }
15
isdigit
Esempio if(isdigit(ch))
if
{ ... }
16
isalnum
Esempio if(isprint(ch))
if
{ ... }
21
isspace
Esempio if(isspace(ch))
if
{ ... }
22
iscntrl
Esempio if(iscntrl(ch))
if
{ ... }
23
Vista d’insieme
A...F G...Z
isupper !"#$%&'(
)*+,-./:
a...f g...z ;<=>?@[\
islower
]^_`{|}~
isalpha ispunct
0...9
isdigit
isxdigit
isalnum isgraph
Spazio isprint
Caratteri di Tab
controllo Newline isspace
24
iscntrl
Funzioni di libreria
Trasformazione di caratteri
26
toupper
Esempio for(i=0;
for s[i]!=0; i++)
s[i] = toupper(s[i]) ;
27
tolower
Esempio for(i=0;
for s[i]!=0; i++)
s[i] = tolower(s[i]) ;
28
Funzioni di libreria
Copia e concatenazione
Definite in strcpy
<string.h> strncpy
Trasferiscono il strcat
contenuto di una strncat
stringa in un’altra
Sostituendolo
Accodandolo
30
strcpy
Definite in strcmp
<string.h> strncmp
Confrontano due
stringhe sulla base
dell’ordine
lessicografico imposto
dalla tabella dei codici
ASCII
36
strcmp
Esempio if(strncmp(r,
if "buon", 4)==0)
(buongiorno, buonasera, buonanotte)38
Funzioni di libreria
Ricerca
Definite in strchr
<string.h> strstr
Ricercano all’interno strspn
di una stringa data strcspn
Se compare un
carattere
Se compare una
sotto-stringa
Se compare una
sequenza qualsiasi
composta di
caratteri dati
40
strchr
Esempio if(strchr(s,
if '.')!=NULL)...
if(strchr(s,
if ch)==NULL)...
41
strstr
Esempio if(strstr(s,
if "xy")!=NULL)...
if(strstr(s,
if s1)==NULL)...
42
strspn
Definite in atoi
<stdlib.h> atof
Mettono in relazione
un valore numerico
(intero o reale) con la
sua rappresentazione
come caratteri
all’interno di una In futuro:
stringa sscanf
"372" ↔ 372 (int) sprintf
"3.0" ↔ 3.0 (float)
46
atoi
Esempio n = atoi(s) ;
n = atoi("232abc") ;
47
atof
Esempio x = atof(s) ;
x = atof("2.32abc") ;
48
Caratteri e stringhe
Esercizi proposti
2
Esercizi proposti
Esercizio “Parola palindroma”
4
Palindromia
o t t o
m a d a m
5
Analisi
Acquisisci parola
Stampa parola
Converti in minuscolo
Stampa minuscolo
Verifica se è palindroma
Stampa se è palindroma
6
Analisi
Acquisisci parola
Stampa parola
Converti in minuscolo
const int MAX = 30 ;
Stampa minuscolo
char parola[MAX+1] ;
Verifica se è printf("Inserisci
palindroma parola: ") ;
Stampa se èscanf("%s",
palindroma parola) ;
7
Analisi
Acquisisci parola
Stampa parola
Converti in minuscolo
Stampa minuscolo
printf("Parola inserita: %s\n",
Verifica se è palindroma
parola) ;
Stampa se è palindroma
8
Analisi
Acquisisci parola
Stampa parola
Converti in minuscolo
Stampa minuscolo
char minusc[MAX+1] ;
Verifica se è palindroma
int i ;
Stampa se è palindroma
strcpy(minusc, parola) ;
for(i=0;
for minusc[i]!=0; i++)
{
minusc[i] = tolower( minusc[i] ) ;
} 9
Analisi
Acquisisci parola
printf("Parola minuscola: %s\n",
Stampa parola minusc) ;
Converti in minuscolo
Stampa minuscolo
Verifica se è palindroma
Stampa se è palindroma
10
Analisi
Acquisisci parola
Stampa if(palin==1)
if
parola
printf("E' palindroma\n") ;
Converti in minuscolo
else
Stampa minuscolo
printf("Non e' palindroma\n") ;
Verifica se è palindroma
Stampa se è palindroma
12
Soluzione
palindroma.c
13
Esercizi proposti
Esercizio “Iniziali maiuscole” (1/2)
15
Esercizio “Iniziali maiuscole” (2/2)
16
Esempio
17
Analisi
18
Conversione delle lettere
for(i=0;
for frase[i]!=0; i++)
{ iniziali.c
if(
if isalpha(frase[i]) &&
( i==0 || !isalpha(frase[i-1]) ) )
{
frase[i] = toupper( frase[i] ) ;
}
else
{
frase[i] = tolower( frase[i] ) ;
}
}
19
Esercizi proposti
Esercizio “Alfabeto farfallino” (1/2)
21
Esercizio “Alfabeto farfallino” (2/2)
22
L’alfabeto farfallino
Vacanze di NATALE
24
Approccio risolutivo
25
Conversione alfabeto (1/2)
lun = 0 ;
for(i=0;
for frase[i]!=0; i++)
{ if(
if isalpha(frase[i]) ) farfallino.c
{ /* lettera alfabetica */
ch = tolower(frase[i]) ;
if(
if ch=='a' || ch=='e' || ch=='i'
|| ch=='o' || ch=='u' )
{ /* vocale: trasforma */
1 farfa[lun] = frase[i] ;
if(isupper(frase[i]))
if
2 farfa[lun+1] = 'F' ;
else farfa[lun+1] = 'f' ;
3 farfa[lun+2] = frase[i] ;
lun = lun + 3 ;
} 26
Conversione alfabeto (2/2)
else
{
/* consonante: copia */ farfallino.c
farfa[lun] = frase[i] ;
lun++ ;
}
}
else
{
/* altro carattere: copia */
farfa[lun] = frase[i] ;
lun++ ;
}
}
farfa[lun] = 0 ; /* terminatore */
27
Caratteri e stringhe
Argomenti trattati
Caratteri e stringhe
Il tipo char
Vettori di char
Stringhe: parole, frasi
Operazioni fondamentali sulle stringhe
Classificazione
Ricerca
Copia e concatenazione
Conversione
2
Tecniche di programmazione
Terminatore nullo
Librerie <string.h> e <ctype.h>
Manipolazione di stringhe come vettori di
caratteri
Manipolazione di stringhe attraverso le funzioni di
libreria
Identificazione di parole all’interno di frasi
3
Stringhe e vettori
4
Errore frequente
5
Errore frequente
Sul CD-ROM
Testi e soluzioni degli esercizi trattati nei lucidi
Scheda sintetica
Esercizi risolti
Esercizi proposti
Esercizi proposti da altri libri di testo
7
Programmazione in C
Matrici – Vettori di stringhe
Matrici
Definizione di matrici in C
Operazioni elementari sulle matrici
Vettori di stringhe
Esercizi proposti
Sommario
2
Riferimenti al materiale
Testi
Kernighan & Ritchie: capitoli 1 e 5
Cabodi, Quer, Sonza Reorda: capitolo 5
Dietel & Dietel: capitolo 6
Dispense
Scheda: “Matrici e Vettori di stringhe in C”
3
Matrici – Vettori di stringhe
Matrici
Matrici bidimensionali
Matrici come vettori di vettori
Matrici pluridimensionali
5
Matrici
Il concetto di matrice
7
Matrice bidimensionale
colonne
0 1 2 ... M
0 1 2 3 4 5
1 2 4 6 8 10
2 3 6 9 12 15
righe
4 8 12 16 20
...
5 10 15 20 25
N 6 12 18 24 30
pitagora 8
Caratteristiche
9
Identificazione degli elementi
Elemento (1,2):
colonne riga 1, colonna 2
0 1 2 ... M
0 1 2 3 4 5
1 2 4 6 8 10
2 3 6 9 12 15
righe
4 8 12 16 20
...
5 10 15 20 25
N 6 12 18 24 30
Elemento (5,0): Elemento (4,4):
riga 5, colonna 0 riga 4, colonna 4
pitagora 10
Lavorare con le matrici
for(i=0;
for i<N; i++) /* righe */
{
for(j=0;
for j<M; j++) /* colonne */
{
somma = somma + matrice[i][j] ;
}
} 11
Matrici
Vettori di vettori
13
Esempio
0 1 2 3 4 5
1 2 4 6 8 10
2 3 6 9 12 15
4 8 12 16 20
...
5 10 15 20 25
N-1 6 12 18 24 30
pitagora
0 1 2 ... M-1
4 8 12 16 20 14
Codifica
11 22 33 44 55 N×M×L elementi:
1122224433664488551010
N 2233446666998812121015
1015 elemento(i, j, k)
righe 3 4 6 8 9 12121615
3 4 6 8 9 121216152020
44558810
10
121215
15
1620
1620
2025
2025 0 ≤ i ≤ N-1
5 6 1012 1518202425
5 6 101215182024253030 0 ≤ j ≤ M-1
66 1212 1818 24
24 30
30
0 ≤ k ≤ L-1
L
M livelli
colonne 17
Caratteristiche
18
Matrici – Vettori di stringhe
Definizione di matrici in C
2
Definizione di matrici in C
Definizione di matrici in C
int mat[10][5] ;
4
Definizione di matrici in C
int mat[10][5] ;
•• int
int
•• float
float
•• char
char
•• In
In futuro vedremo: struct
futuro vedremo: struct
5
Definizione di matrici in C
int mat[10][5] ;
•• Stesse
Stesse regole
regole che
che valgono
valgono per
per ii
nomi
nomi di
di variabili
variabili ee vettori
vettori
•• II nomi
nomi delle
delle matrici
matrici devono
devono essere
essere
diversi
diversi dai
dai nomi
nomi di di altre
altre variabili
variabili oo
vettori
vettori 6
Definizione di matrici in C
int mat[10][5] ;
•• Interi
Interi positivi
positivi
•• Costanti
Costanti note
note aa tempo
tempo di
di
compilazione
compilazione
•const oppure #define
•const oppure #define
•• Uguali
Uguali oo diverse
diverse 7
Esempi
int pitagora[10][10] ;
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 10
1 2 4 6 8 10 12 14 16 18 20
2 3 6 9 12 15 18 21 24 27 30
3 4 8 12 16 20 24 28 32 36 40
4 5 10 15 20 25 30 35 40 45 50
5 6 12 18 24 30 36 42 48 54 60
6 7 14 21 28 35 42 49 56 63 70
7 8 16 24 32 40 48 56 64 72 80
8 9 18 27 36 45 54 63 72 81 90
9 10 20 30 40 50 60 70 80 90 100
8
Esempi
int pitagora[10][10] ;
char tris[3][3] ;
0 1 2
0 . . .
0 1 2
1 . . .
2 . . . 0 . . .
1 . X . 0 1 2
2 . . . 0 O . .
1 . X . 0 1 2
2 . . . 0 O X .
1 . X .
2 . . .
9
Esempi
int pitagora[10][10] ;
char tris[3][3] ;
float rot[2][2] ; 0 1
0 cos β sin β
0 1 1 -sin β cos β
0 0.707 0.707
1 -0.707 0.707 0 1
0 0.500 0.866
1 -0.866 0.500
0 1
0 0.000 1.000
1 -1.000 0.000
10
Matrici a più dimensioni
int mat[10][5] ;
float dati[10][5][6] ;
11
Errore frequente
int mat[10][10] ;
int N = 10 ;
int mat[N][N] ;
const int N = 10 ;
int mat[N][N] ;
12
Errore frequente
int i, j ;
int mat[i][j] ;
. . .
for(i=0; i<10; i++)
for(j=0; j<10; j++)
scanf("%d",&mat[i][j]) ;
const int N = 10 ;
int mat[N][N] ; 13
Errore frequente
const int N = 10 ;
const int M = 20 ;
int mat[N,M] ;
int mat[N][M] ;
14
Definizione di matrici in C
Accesso ai valori di una matrice
16
Sintassi
nomematrice[
[ valoreindice1 ][ valoreindice2 ]
Costante, variabile o
espressione aritmetica
con valore intero
17
Sintassi
nomematrice[
[ valoreindice1 ][ valoreindice2 ]
Costante, variabile o
espressione aritmetica Valore intero compreso
con valore intero tra 0 e numero di
colonne -1
18
Esempi
pitagora[1][2]
0 1 2 3 4
0 1 2 3 4 5
1 2 4 6 8 10
2 3 6 9 12 15
3 4 8 12 16 20
4 5 10 15 20 25
5 6 12 18 24 30
pitagora[5][0] pitagora[4][4]
int pitagora[6][5] ; 19
Vincoli (1/2)
pitagora[i][j] = (i+1)*(j+1) ;
x = pitagora[1][2] ;
20
Vincoli (2/2)
pitagora[i][j] = (i+1)*(j+1) ;
x = pitagora[1][2] ;
21
Uso di una cella di un vettore
22
Matrici – Vettori di stringhe
Operazioni elementari sulle matrici
Definizioni
Stampa di una matrice
Lettura di una matrice
Copia di una matrice
Somme di riga o di colonna
Ricerca di un elemento
Ricerca del massimo o del minimo
2
Operazioni elementari sulle matrici
Definizioni (1/2)
matrici.c
const int N = 10 ;
const int M = 5 ; /* dimensioni massime */
4
Definizioni (2/2)
matrici.c
5
Operazioni elementari sulle matrici
Stampa di matrici
7
Stampa per righe matrice di reali
matrici.c
printf("Matrice: %d x %d\n", N, M);
for(i=0;
for i<N; i++)
{
for(j=0;
for j<M; j++)
{
printf("%f ", i-esima
Stampa la riga mat[i][j]) ;
}
printf("\n");
}
8
Stampa per righe matrice di reali
matrici.c
printf("Matrice: %d x %d\n", N, M);
for(i=0;
for i<N; i++) /* Stampa la riga i-esima */
{
for(j=0;
for j<M; j++)
{
printf("%f ", mat[i][j]) ;
}
printf("\n");
}
9
Esempio
10
Stampa per colonne matrice di reali
matrici.c
printf("Matrice: %d x %d\n", N, M);
for(j=0;
for j<M; j++)
{
for(i=0;
for i<N; i++)
{
printf("%f ", mat[i][j]) ;
}
printf("\n");
}
11
Esempio
12
Operazioni elementari sulle matrici
Lettura di matrici
14
Lettura per righe matrice di reali
for(i=0;
for i<N; i++)
{
printf("Riga %d:\n", i+1) ;
for(j=0;
for j<M; j++)
{
printf("Elemento (%d,%d): ",
i+1, j+1) ;
scanf("%f", &mat[i][j]) ;
}
}
15
Esempio
16
Operazioni elementari sulle matrici
Copia di matrici (1/2)
18
Copia di matrici (2/2)
matrici.c
for(i=0;
for i<N; i++)
for(j=0;
for j<M; j++)
mat2[i][j] = mat[i][j] ;
19
Operazioni elementari sulle matrici
Sommatorie in matrici
21
Esempio
float mat[N][M] ;
1.00 0.50 0.33 0.25 0.20
2.00 1.00 0.67 0.50 0.40
3.00 1.50 1.00 0.75 0.60
4.00 2.00 1.33 1.00 0.80
5.00 2.50 1.67 1.25 1.00
6.00 3.00 2.00 1.50 1.20
7.00 3.50 2.33 1.75 1.40
8.00 4.00 2.67 2.00 1.60
9.00 4.50 3.00 2.25 1.80
10.00 5.00 3.33 2.50 2.00
22
Esempio
float mat[N][M] ; float sr[N] ;
1.00 0.50 0.33 0.25 0.20 2.28
2.00 1.00 0.67 0.50 0.40 4.56
3.00 1.50 1.00 0.75 0.60 6.85
4.00 2.00 1.33 1.00 0.80 9.13
5.00 2.50 1.67 1.25 1.00 11.41
6.00 3.00 2.00 1.50 1.20 13.70
7.00 3.50 2.33 1.75 1.40 15.98
8.00 4.00 2.67 2.00 1.60 18.26
9.00 4.50 3.00 2.25 1.80 20.55
10.00 5.00 3.33 2.50 2.00 22.83
for(i=0
for ; i<N ; i++) matrici.c
{
somma = 0.0 ;
for(j=0;
for j<M; j++)
somma = somma + mat[i][j] ;
sr[i] = somma ;
}
for(i=0;
for i<N; i++)
printf("Somma riga %d = %f\n",
i+1, sr[i]) ;
24
Somma per colonne
for(j=0
for ; j<M ; j++) matrici.c
{
somma = 0.0 ;
for(i=0;
for i<N; i++)
somma = somma + mat[i][j] ;
sc[j] = somma ;
}
for(j=0;
for j<M; j++)
printf("Somma colonna %d = %f\n",
j+1, sc[j]) ;
25
Somma complessiva
matrici.c
somma = 0.0 ;
for(i=0
for ; i<N ; i++)
{
for(j=0;
for j<M; j++)
somma = somma + mat[i][j] ;
}
26
Operazioni elementari sulle matrici
Ricerca di elementi
28
Ricerca elemento (1/2)
trovato = 0 ;
riga = -1 ;
col = -1 ;
for(i=0;
for i<N && trovato==0; i++)
for(j=0;
for j<M && trovato==0; j++)
if(
if mat[i][j]==dato )
{
trovato=1 ;
riga = i ;
col = j ;
}
29
Ricerca elemento (2/2)
matrici.c
if(trovato==1)
if
printf("Dato %f presente: (%d,%d)\n",
dato, riga, col) ;
else
printf("Dato %f non presente\n",
dato) ;
30
Operazioni elementari sulle matrici
Massimi e minimi
32
Massimo per righe
for(i=0;
for i<N; i++)
{
col = 0 ; matrici.c
maxr = mat[i][0] ;
for(j=1;
for j<M; j++)
if(
if mat[i][j] > maxr )
{
maxr = mat[i][j] ;
col = j ;
}
for(j=0;
for j<M; j++)
{
riga = 0 ; matrici.c
maxc = mat[0][j] ;
for(i=1;
for i<N; i++)
if(
if mat[i][j] > maxc )
{
maxc = mat[i][j] ;
riga = i ;
}
35
Esercizio “Max Sum Abs”
r = maxi ( ∑ j M ij )
36
Soluzione 1
Inizializza max
Per ogni riga i:
Calcola la somma sommar dei valori assoluti di tale
riga
Confronta sommar con il max corrente, ed
eventualmente aggiorna il max
Stampa max
37
Soluzione 1
max = -1.0 ;
for(i=0;
for i<N; i++) maxsumabs1.c
{
sommar = 0.0 ;
for(j=0;
for j<M; j++)
{
sommar = sommar +
fabs(mat[i][j]) ;
}
if(sommar>max)
max = sommar ;
}
printf("R = %f\n", max) ;
38
Soluzione 2
39
Soluzione 2 (1/2)
maxsumabs2.c
for(i=0;
for i<N; i++)
{
sommar = 0.0 ;
for(j=0;
for j<M; j++)
{
sommar = sommar +
fabs(mat[i][j]) ;
}
sr[i] = sommar ;
}
40
Soluzione 2 (2/2)
maxsumabs2.c
max = -1.0 ;
for(i=0;
for i<N; i++)
if(sr[i]>max)
if
max = sr[i] ;
41
Matrici – Vettori di stringhe
Vettori di stringhe
Matrici di caratteri
Vettori di stringhe
I/O di vettori di stringhe
2
Vettori di stringhe
Matrici di caratteri
5
Esempio
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9
6
Analisi
7
Soluzione (1/10)
char sudoku[N][N] ;
printf("Verifica Sudoku\n") ;
8
Soluzione (2/10)
for(i=0;
for i<N; i++)
sudoku.c
{
printf("Riga %d:\n", i+1) ;
for(j=0;
for j<N; j++)
{
Acquisisci un carattere
ch tra ‘1’ e ‘9’
sudoku[i][j] = ch ;
}
}
9
Soluzione (2/10)
for(i=0;
for i<N; i++)
do {{ sudoku.c
printf(" Colonna%d:\n",
printf("Riga %d: ", i+1)j+1) ;;
ch =for(j=0;
getchar()
for ; j++)
j<N;
if(
if {ch<'1' || ch>'9' )
printf("Errata - ripeti\n") ;
Acquisisci un carattere
/* elimina fino ch tra ‘1’linea
fine e ‘9’ */
while(
while getchar()!='\n')
sudoku[i][j] = ch ;
/*nop*/ ;
}
}
} while(
while ch<'1' || ch>'9') ;
10
Soluzione (3/10)
/* Stampa il tabellone */
for(i=0;
for i<9; i++)
{ sudoku.c
for(j=0;
for j<9; j++)
{
printf("%c ", sudoku[i][j]) ;
if(j==2
if || j==5)
printf(" ") ;
}
printf("\n");
if(i==2
if || i==5)
printf("\n") ;
}
11
Soluzione (4/10)
sudoku.c
if(err==0)
if
printf("OK\n");
else
{
printf("Errore!\n");
good = 0 ;
}
}
13
Soluzione (6/10)
for(i=0;
for i<N; i++) /* Colonne */
{ printf("Colonna %d: ", i+1) ;
err = 0 ; sudoku.c
if(err==0)
if printf("OK\n");
else
{ printf("Errore!\n");
good = 0 ;
}
}
14
Ricerca per blocchi
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9
15
Ricerca per blocchi
j j+2
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 2 5 6 7
i 8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
i+2 7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9
16
Ricerca per blocchi
j j+2
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
r1,c1
1 9 8 3 4 2 5 6 7
i 8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
i+2 7 1 3 9 2 4 8 5 6
9 6 1 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5 r2,c2
3 4 5 2 8 6 1 7 9
17
Soluzione (7/10)
for(i=0;
for i<N; i=i+3)
sudoku.c
{
for(j=0;
for j<N; j=j+3)
{
printf("Blocco (%d,%d)-(%d,%d): ",
i+1, j+1, i+3, j+3) ;
err = 0 ;
18
Soluzione (8/10)
for(r1=i;
for r1<i+3; r1++)
for(c1=j;
for c1<j+3; c1++)
{ /* elemento [r1][c1]... */ sudoku.c
for(r2=i;
for r2<i+3; r2++)
for(c2=j;
for c2<j+3; c2++)
{
/* ..rispetto a [r2][c2] */
if(
if ((r1!=r2)||(c1!=c2)) &&
sudoku[r1][c1]==
sudoku[r2][c2] )
{
err = 1 ;
}
} /*r2,c2*/
} /*r1,c1*/
19
Soluzione (9/10)
sudoku.c
if(err==0)
if
printf("OK\n");
else
{
printf("Errore!\n");
good = 0 ;
}
} /*j*/
} /*i*/
20
Soluzione (10/10)
sudoku.c
if(good==1)
if
printf("Sudoku valido!\n");
else
printf("Sudoku errato...\n");
21
Vettori di stringhe
Vettori di stringhe
23
Esempio
0 1 2
0 O X .
char tris[3][3] ; 1 . X .
2 . . .
char nomi[5][10] ;
0 1 2 3 4 5 6 7 8 9
0 F u l v i o \0 x ! w
1 A n t o n i o \0 . Z
2 C r i s t i n a \0 u
3 E l e n a \0 5 g r d
4 D a v i d e \0 $ 2 e 24
Caratteristiche
5 stringhe di Lunghezza
lunghezza max 9
variabile caratteri Terminatore
nullo in ogni
stringa (riga)
char nomi[5][10] ;
0 1 2 3 4 5 6 7 8 9
0 F u l v i o \0 x ! w
1 A n t o n i o \0 . Z
2 C r i s t i n a \0 u
3 E l e n a \0 5 g r d
4 D a v i d e \0 $ 2 e 25
Sintassi
Definizione
char vett[MAX][LUN] ;
Definizione
char vett[MAX][LUN] ;
Accesso al singolo carattere
vett[i][j]
Definizione
char vett[MAX][LUN] ;
Accesso alStringa
singolo carattere
(i+1)-esima, da usarsi con le
funzioni di libreria
vett[i][j]
vett[i]
28
Esempio 1
cont = 0 ;
for(i=0;
for i<MAX; i++)
{
for(j=0;
for vett[i][j]!=0; j++)
{
if(toupper(vett[i][j])=='A')
if
cont++ ;
}
}
29
Esempio 2
uguali = 0 ;
for(i=0;
for i<MAX; i++)
{
for(k=i+1;
for k<MAX; k++)
{
if(strcmp(vett[i],
if vett[k])==0)
uguali=1 ;
}
}
30
Occupazione variabile
31
Esempio
char nomi[MAX][LUN+1] ;
int N ;
0 1 2 3 4 5 6 7 8 9
0 F u l v i o \0 x ! w
1 A n t o n i o \0 . Z
2 C r i s t i n a \0 u
N=3 3 e 4 1 ) a \0 5 g r d
4 1 % < d d e g $ 2 e
32
Errore frequente
• v[i][j] è il singolo
• s[i] è un singolo
carattere
carattere
• v[i] è un’intera stringa
• s è l’intera stringa
• v è l’intera matrice
33
Vettori di stringhe
Stampa (1/2)
35
Stampa (2/2)
vettstr.c
for(i=0;
for i<N; i++)
{
puts(vett[i]) ;
}
36
Lettura
37
Dimensione nota a priori (1/2)
char vett[MAX][LUN+1] ;
vettstr.c
char s[250] ;
. . .
do {
printf("Quante stringhe? ") ;
gets(s) ;
N = atoi(s) ;
if(N<1
if || N>MAX)
printf("Valore errato: deve
essere tra 1 e %d\n", MAX) ;
} while(N<1
while || N>MAX) ;
38
Dimensione nota a priori (2/2)
for(i=0;
for i<N; i++)
{ printf("Stringa %d: ", i+1) ;
gets(s) ; vettstr.c
if (strlen(s)==0)
{ printf("Vuota - ripeti\n");
i-- ;
}
else if(strlen(s)>LUN)
if
{ printf("Troppo lunga –
max %d chr\n", LUN) ;
i-- ;
}
else
strcpy(vett[i], s) ;
}
39
Lettura terminata da “FINE”
N = 0 ;
end = 0 ;
do { vettstr.c
printf("Stringa %d: ", N+1) ;
gets(s) ;
if (strlen(s)==0)
printf("Vuota - ripeti\n");
else if(strlen(s)>LUN)
if
printf("Troppo lunga\n") ;
else if(strcmp(s,
if "FINE")==0)
end = 1 ;
else
{ strcpy(vett[N], s) ;
N++ ;
}
} while(end==0)
while ; 40
Matrici – Vettori di stringhe
Esercizi proposti
2
Esercizi proposti
Esercizio “Statistiche testo”
4
Analisi
5
Soluzione (1/5)
statistichetesto.c
char testo[MAXRIGHE][LUN] ;
int Nrighe ; /* righe inserite */
char riga[LUN*10] ;
int i, j ;
int caratteri, caralfa, parole ;
6
Soluzione (2/5)
Nrighe = 0 ;
do { statistichetesto.c
printf("Testo: ");
gets(riga) ;
if(
if strcmp(riga, "FINE")!=0 )
{
/*copia riga in testo[Nrighe] ;*/
strcpy( testo[Nrighe] , riga ) ;
Nrighe++ ;
}
} while(
while strcmp(riga, "FINE")!=0 ) ;
7
Soluzione (3/5)
statistichetesto.c
printf("L'utente ha inserito"
" %d righe\n", Nrighe);
caratteri = 0 ;
for(i=0;
for i<Nrighe; i++)
caratteri = caratteri +
strlen(testo[i]) ;
printf("L'utente ha inserito"
" %d caratteri\n", caratteri) ;
8
Soluzione (4/5)
caralfa = 0 ;
for(i=0;
for i<Nrighe; i++) statistichetesto.c
{
for(j=0;
for testo[i][j]!=0; j++)
{
if(
if isalnum(testo[i][j] ) )
caralfa++ ;
}
}
parole = 0 ;
for(j=0;
for j<Nrighe; j++)
{ statistichetesto.c
for(i=0;
for testo[j][i]!=0; i++)
{
if(
if isalpha(testo[j][i]) &&
(i==0 || !isalpha(testo[j][i-1])))
{
parole ++ ;
}
}
}
12
Esercizio “Magazzino” (2/2)
13
Analisi
Comando: viti E 10
Comando: dadi E 50
Comando: viti U 5
Comando: viti E 3
Comando: FINE
viti 8
dadi 50
14
Problemi
15
Stringa di comando
comando viti E 10
Spazio Spazio
16
Analisi del comando (1/2)
i = 0 ;
magazzino.c
while(comando[i]!='
while ')
{
prod[i] = comando[i] ;
i++ ;
}
prod[i] = 0 ;
/* salta lo spazio */
i++ ;
17
Analisi del comando (2/2)
/* salta lo spazio */
i++ ; magazzino.c
19
Rappresentazione del magazzino
char prodotti[MAX][LUN+1] ;
int quantita[MAX] ;
20
Inserimento di un prodotto
21
Inserimento di un prodotto
if(strcmp(prodotti[i],
if prod)==0)
trovato = i ;
if(
if trovato != -1 ) /* esiste già */
quantita[trovato] =
quantita[trovato] + qta ;
23
Eliminazione di un prodotto
if(
if trovato == -1 )
printf("Prodotto %s non "
"trovato in magazzino\n", prod);
else
quantita[trovato] =
quantita[trovato] - qta ;
24
Matrici – Vettori di stringhe
Argomenti trattati
2
Tecniche di programmazione
3
Materiale aggiuntivo
Sul CD-ROM
Testi e soluzioni degli esercizi trattati nei lucidi
Scheda sintetica
Esercizi risolti
Esercizi proposti
Esercizi proposti da altri libri di testo
4
Programmazione in C
Funzioni
Tipi di dato
Funzioni in C
Modifica dei parametri
Parametri “by reference”
La funzione main()
Esercizi proposti
Sommario
2
Riferimenti al materiale
Testi
Kernighan & Ritchie: capitoli 2 e 4
Cabodi, Quer, Sonza Reorda: capitoli 3 e 7
Dietel & Dietel: capitolo 5
Dispense
Scheda: “Tipi di dato in C”
Scheda: “Funzioni in C”
3
Funzioni
Tipi di dato
I tipi scalari in C
Input/output dei tipi scalari
Conversioni di tipo
5
Tipi di dato
Il sistema dei tipi C
Tipo di dato
signed/unsigned Funzioni
7
I tipi interi in C
sizeof(char
char)
char sizeof(int
int)
int
9
Specifiche del C
=
sizeof(char
char)
char 1
≤ < ≤
sizeof(short
short int)
int sizeof(int
int)
int sizeof(long
long int)
int
= = =
sizeof(unsigned
unsigned sizeof( sizeof(unsigned
unsigned
short int)
int unsigned int)
int long int)
int
≤ ≤
10
Intervallo di rappresentazione
#include <limits.h>
11
Compilatori a 32 bit
Tipo Descrizione
float Numeri reali in singola precisione
double Numeri reali in doppia precisione
long double Numeri reali in massima
precisione
segno
} 6
esponente
474 8
± eeeeee
A = ± 114243 × 2
.mmmmm
mantissa
13
Numero di bit
segno
} 6
esponente
474 8
± eeeeee
A = ± 114243 × 2
.mmmmm
mantissa
14
Intervallo di rappresentazione
float
0
±1.17549435E-38
±3.40282347E+38
double
0
±2.2250738585072014E-308
±1.7976931348623157E+308
15
Tipi di dato
Input/output
17
Specificatori di formato
gets(line) ; gets(line) ;
x = atoi(line) ; x = atof(line) ;
gets(line) ; gets(line) ;
x = atol(line) ; x = atof(line) ;
19
Tipi di dato
Conversioni di tipo (1/2)
21
Conversioni di tipo (2/2)
22
Tipologie di conversioni
23
Promozione del tipo
float double
24
Promozione del tipo
float double
25
Troncamento del risultato
26
Conversioni esplicite
(nuovotipo)expr
double media ;
int somma, N ;
media = somma / N ; /* no */
media = (double
double)somma
double / N ;
28
Esempio 2
int voto ;
float parte1, parte2, parte3 ;
voto = (int
int)
int ((parte1 +
parte2 + parte3)/3) ;
29
Esempio 3
int voto ;
float parte1, parte2, parte3 ;
float media ;
/* arrotondamento all’intero
più vicino */
media = (parte1 +
parte2 + parte3)/3 ;
voto = (int
int)
int (media + 0.5) ;
30
Funzioni
Funzioni in C
Il concetto di funzione
Parametri formali e attuali
Il valore di ritorno
Definizione e chiamata di funzioni
Passaggio dei parametri
Corpo della funzione
2
Funzioni in C
Strategie di programmazione
4
Come riusare il codice? (1/3)
Copia-e-incolla
Semplice, ma poco efficace
Occorre adattare il codice incollato, ritoccando i
nomi delle variabili e costanti utilizzati
Se si scopre un errore, occorre correggerlo in tutti
i punti in cui è stato incollato
Nel listato finale non è evidente che si sta
riutilizzando la stessa funzionalità
Occorre disporre del codice originario
Occorre capire il codice originario
5
Come riusare il codice? (2/3)
Definizione di funzioni
Dichiarazione esplicita che una certa funzionalità
viene utilizzata in più punti
Si separa la definizione della funzionalità rispetto al
punto in cui questa viene utilizzata
La stessa funzione può essere usata più volte con
parametri diversi
6
Come riusare il codice? (3/3)
7
Principio di funzionamento (1/3)
int main(void
void)
void
{
int x, y ;
/* leggi un numero
tra 50 e 100 e
memorizzalo
in x */
/* leggi un numero
tra 1 e 10 e
memorizzalo
in y */
printf("%d %d\n",
x, y ) ;
}
8
Principio di funzionamento (2/3)
int main(void
void)
void
{
int x, y ;
x = leggi(50, 100) ;
y = leggi(1, 10) ;
printf("%d %d\n",
x, y ) ;
}
9
Principio di funzionamento (3/3)
int leggi(int
int min,
int main(void
void)
void int max)
{ {
int x, y ; int v ;
x = leggi(50, 100) ; do {
y = leggi(1, 10) ; scanf("%d", &v) ;
} while(
while v<min ||
printf("%d %d\n", v>max) ;
x, y ) ;
} return v ;
}
10
Principio di funzionamento (3/3)
min=50 max=100
int leggi(int
int min,
int main(void
void)
void int max)
{ {
int x, y ; int v ;
x = leggi(50, 100) ; do {
y = leggi(1, 10) ; scanf("%d", &v) ;
} while(
while v<min ||
printf("%d %d\n", v>max) ;
x, y ) ;
} return v ;
}
11
Principio di funzionamento (3/3)
min=50 max=100
int leggi(int
int min,
int main(void
void)
void int max)
{ {
int x, y ; int v ;
x = leggi(50, 100) ; do {
y = leggi(1, 10) ; scanf("%d", &v) ;
} while(
while v<min ||
printf("%d %d\n", v>max) ;
x, y ) ;
} return v ;
}
Chiamante Chiamato
12
Principio di funzionamento (3/3)
min=1 max=10
int leggi(int
int min,
int main(void
void)
void int max)
{ {
int x, y ; int v ;
x = leggi(50, 100) ; do {
y = leggi(1, 10) ; scanf("%d", &v) ;
} while(
while v<min ||
printf("%d %d\n", v>max) ;
x, y ) ;
} return v ;
}
13
Sommario
14
Miglioramento della funzione
int leggi(int
int min, int max)
{
char riga[80] ;
int v ;
do {
gets(riga) ;
v = atoi(riga) ;
if(v<min)
if printf("Piccolo: min %d\n", min) ;
if(v>max)
if printf("Grande: max %d\n", max) ;
} while(
while v<min || v>max) ;
return v ;
}
15
Funzioni in C
Parametri di una funzione
Le funzioni possono
int leggi(int
int min,
ricevere dei parametri int max)
dal proprio chiamante {
...
Nella funzione: }
Parametri formali
Nomi “interni” dei
parametri
17
Parametri di una funzione
Le funzioni possono
int leggi(int
int min,
ricevere dei parametri int max)
dal proprio chiamante {
...
Nella funzione: }
Parametri formali
Nomi “interni” dei
parametri int main(void
void)
void
{
Nel chiamante: ...
Parametri attuali y = leggi(1, 10) ;
...
Valori effettivi }
(costanti, variabili,
espressioni) 18
Parametri formali (1/2)
20
Avvertenza (1/2)
21
Avvertenza (2/2)
22
Parametri attuali (1/2)
int main(void
void)
void
{
Le parentesi sono ...
sempre necessarie, y = stampa_menu() ;
...
anche se non vi sono }
parametri
24
Funzioni in C
Valore di ritorno
Valore scalare
char, int (o varianti), float, double
Tipi avanzati
Puntatori, struct
Nessun valore ritornato
void double sqrt(double
double a)
{
...
}
void stampa_err(int
int x)
{
...
27
}
L’istruzione return (1/2)
Restituisce il valore
Costante
Variabile
Espressione
Il tipo deve essere compatibile con il tipo
dichiarato per il valore di ritorno
Sintassi
return x ;
return(x) ;
L’esecuzione della funzione viene interrotta
28
L’istruzione return (2/2)
29
Nel chiamante...
Il chiamante può:
Ignorare il valore ritornato
scanf("%d", &x) ;
Memorizzarlo in una variabile
y = sin(x) ;
Utilizzarlo in un’espressione
if ( sqrt(x*x+y*y)>z ) ...
30
Convenzioni utili
31
Funzioni in C
Sintassi C per le funzioni
33
Dichiarazione o prototipo
int leggi(int
int min, int max) ;
34
Scopo del prototipo
35
Definizione o implementazione
37
Chiamata o invocazione
int leggi(int
int min, int max) ;
int main(void
void)
void
{
int x, a, b ;
...
x = leggi(a, b) ;
...
}
int leggi(int int min, int max)
{
. . . codice della funzione . . .
} 40
Funzioni in C
Passaggio dei parametri
Valuta
Valore iniziale
espressione/i
Copia
valore
Uso nella
funzione
42
Conseguenza
void azzera(int
int x)
{
x = 0 ;
}
44
Parametri di tipo vettoriale
45
Conseguenza
46
Funzioni in C
Variabili locali
return v ;
}
48
Caratteristiche
49
Istruzioni eseguibili
50
Funzioni
Parametri “by reference”
Introduzione
Operatori & e *
Passaggio “by reference”
Passaggio di vettori
Esercizio “strcpy”
2
Parametri “by reference”
Passaggio dei parametri
4
Problemi
8
Operatore &
9
Osservazioni
10
Variabili “puntatore”
11
Esempio
int main(void
void)
void 1000
{ 1004
int a, b ; 1008
int *p, *q ; int a 1012 37
1016
a = 37 ; int b 1020 -4
b = -4 ;
1024
p = &a ; 1028
/* p "punta a" a */ 1032
1036
q = &b ; int *p 1040 1012
/* q "punta a" b */ 1044
int *q 1048 1020
} 1052
12
Operatore *
Costrutto Significato
p = &x ; p punta ad x
16
Esempio: “Azzera”
17
Soluzione
19
Soluzione
21
Parametri “by reference”
Passaggio di vettori e matrici
int main(void
void)
void
{
int v[10] ; p e v sono
int *p ;
del tutto
p = & v[0] ; equivalenti
23
Conseguenze
25
Soluzione (1/3)
int duplicati(double
double v[], int N) ;
/*
Riceve in ingresso il vettore v[] di double
che contiente N elementi (da v[0] a v[N-1])
26
Soluzione (2/3)
int duplicati(double
double v[], int N)
{
int i, j ;
for(i=0;
for i<N; i++)
{
for(j=i+1;
for j<N; j++)
{
if(v[i]==v[j])
if
return 1 ;
}
}
return 0 ;
}
27
Soluzione (3/3)
int main(void
void)
void
{
const int MAX = 100 ;
double dati[MAX] ;
int Ndati ;
int dupl ;
...
dupl = duplicati(dati, Ndati) ;
...
}
28
Errore frequente
30
Parametri “by reference”
strcpy”
strcpy
Esercizio “strcpy
32
Soluzione (1/2)
void strcpy(char
char *dst, char *src) ;
/*
Copia il contenuto della stringa src
nella stringa dst
33
Soluzione (2/2)
void strcpy(char
char *dst, char *src)
{
int i ;
for(i=0;
for src[i]!=0; i++)
{
dst[i] = src[i] ;
}
dst[i] = 0 ;
}
34
Osservazione
35
Funzioni
La funzione main()
main()
2
La funzione main()
main()
La funzione main()
main()
4
Interfaccia in modalità “console”
5
Il modello “console”
Sistema Operativo
Finestra di comando
Programma utente
int main()
6
Interfaccia del programma
7
La funzione main()
main()
La linea di comando (1/2)
C:\progr>quadrato 5 C:\progr>quadrato 5 K
***** KKKKK
***** KKKKK
***** KKKKK
***** KKKKK
***** KKKKK
C:\progr>_ C:\progr>_
10
Nomenclatura
11
Caratteristiche
12
Standardizzazione dei parametri
13
Esempi
Numero argomenti = 1
C:\progr>quadrato 5
Argomento 1 = “5”
Numero argomenti = 2
C:\progr>quadrato 5 K Argomento 1 = “5”
Argomento 2 = “K”
14
La funzione main()
main()
Parametri formali del main
int main(int
int argc, char *argv[]) ;
16
Il parametro argc
int argc
Numero di parametri sulla linea di comando
Incrementato di uno, in quanto il nome del
programma viene considerato come un parametro
Se non vi sono argomenti effettivi, vale 1
Se vi sono k argomenti effettivi, vale k+1
17
Il parametro argv
char *argv[]
È un vettore di stringhe
Ogni stringa è un parametro del programma
Vi sono argc diverse stringhe
La prima stringa, argv[0], è il nome del
programma
La seconda stringa, argv[1], è il primo
argomento (se esiste)
…
L’ultimo argomento è in argv[argc-1]
18
Esempi
argc==1
C:\progr>quadrato
argv[0]=="quadrato"
argc==2
C:\progr>quadrato 5 argv[0]=="quadrato"
argv[1]=="5"
argc==3
argv[0]=="quadrato"
C:\progr>quadrato 5 K
argv[1]=="5"
argv[2]=="K" 19
Per capire meglio...
#include <stdio.h>
arg.c
int main(int
int argc, char *argv[])
{
int i ;
20
Osservazione
21
La funzione main()
main()
Valore di ritorno
23
Convenzioni
24
Esempio
25
La funzione main()
main()
Restituzione del valore di ritorno
27
Esempio
#include <stdio.h>
int main(int
int argc, char *argv[])
{
. . .
. . .
. . .
return 0 ;
}
28
La funzione exit
void exit(int
int value) ;
29
Esempio
#include <stdio.h>
#include <stdlib.h>
int main(int
int argc, char *argv[])
{
. . .
. . .
. . .
exit(0) ;
}
30
Suggerimento
31
La funzione main()
main()
Esercizio “Calcolatrice”
33
Analisi
c:\progr>calcola 3 + 2
Risultato: 5.0000
c:\progr>calcola 3 * 2
Risultato: 6.0000
c:\progr>calcola 3 $ 2
Errore: operatore non riconosciuto
c:\progr>calcola 3 +
Errore: operando mancante
34
Soluzione (1/5)
calcola.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int
int argc, char *argv[])
{
double v1, v2 ;
char op[20] ;
35
Soluzione (2/5)
if(argc!=4)
if calcola.c
{
printf("Errore: numero parametri
insufficiente\n");
exit(1) ;
}
v1 = atof(argv[1]) ;
strcpy(op, argv[2]) ;
v2 = atof(argv[3]) ;
36
Soluzione (3/5)
calcola.c
if(strcmp(op,
if "+")==0)
printf("Risultato: %f\n", v1 + v2 ) ;
else if(strcmp(op,
if "-")==0)
printf("Risultato: %f\n", v1 - v2 ) ;
else if(strcmp(op,
if "*")==0)
printf("Risultato: %f\n", v1 * v2 ) ;
37
Soluzione (4/5)
calcola.c
else if(strcmp(op,
if "/")==0)
{
if(v2==0)
if
{
printf("Errore: divisione per zero\n");
exit(2) ;
}
else
printf("Risultato: %f\n", v1 / v2 ) ;
}
38
Soluzione (5/5)
calcola.c
else
{
printf("Errore: operatore
non riconosciuto\n") ;
exit(3) ;
}
exit(0) ;
}
39
Funzioni
Esercizi proposti
2
Esercizi proposti
Esercizio “Confronto tra date”
4
Analisi
5
Controlli
1 ≤ giorno ≤ 31
1 ≤ mese ≤ 12
1900 < anno < 2100
Se mese = 4, 6, 9, 11, allora giorno ≤ 30
Se mese = 2, allora giorno ≤ 29
Se mese = 2 e l’anno non è bisestile, allora
giorno ≤ 28
L’anno è bisestile se è multiplo di 4
6
Soluzione
/*
/* Confronto
Confronto delle
delle date
date */
*/
} /* main */ 8
Confronto delle date
if(
if g1 == g2 && m1 == m2 && a1 == a2 )
printf("Le date sono uguali\n") ;
else if(
if a1<a2 || date.c
(a1==a2 && m1<m2) ||
(a1==a2 && m1==m2 && g1<g2) )
{
printf("La prima data %d/%d/%d "
"PRECEDE la seconda %d/%d/%d\n",
g1, m1, a1, g2, m2, a2) ;
}
else
{
printf("La prima data %d/%d/%d "
"SEGUE la seconda %d/%d/%d\n",
g1, m1, a1, g2, m2, a2) ;
} 9
Funzione leggidata (1/5)
do {
do {
printf("Giorno: ") ;
scanf("%d", &g) ;
if(g<1
if || g>31)
printf("Giorno non valido\n");
} while(
while g<1 || g>31 ) ;
10
Funzione leggidata (2/5)
do {
printf("Mese: ") ;
scanf("%d", &m) ; date.c
if(m<1
if || m>12)
printf("Mese non valido\n");
} while(
while m<1 || m>12 ) ;
do {
printf("Anno: ") ;
scanf("%d", &a) ;
if ( a<=1900 || a>=2100 )
printf("Anno non valido\n") ;
} while(
while a<=1900 || a>=2100 ) ; 11
Funzione leggidata (3/5)
ok = 1 ;
if(
if g>30 && (m==4 || m==6 || date.c
m==9 || m==11) )
{
ok = 0 ;
printf("Il mese %d non "
"ha %d giorni\n", m, g);
}
else if ( g>29 && m==2 )
{
ok = 0 ;
printf("Il mese %d non "
"ha %d giorni\n", m, g);
}
12
Funzione leggidata (4/5)
date.c
13
Funzione leggidata (5/5)
date.c
} while(
while ok==0 ) ;
*giorno = g ;
*mese = m ;
*anno = a ;
return ;
} /* leggidata */
14
Esercizi proposti
Esercizio “Quadrato” (1/2)
16
Esercizio “Quadrato” (2/2)
17
Analisi
argc==1
C:\progr>quadrato
argv[0]=="quadrato"
argc==2
C:\progr>quadrato 5 argv[0]=="quadrato"
argv[1]=="5"
argc==3
argv[0]=="quadrato"
C:\progr>quadrato 5 K
argv[1]=="5"
19
argv[2]=="K"
Soluzione (1/4)
int main(int
int argc, char *argv[]) quadrato.c
{
int dim ;
char ch ;
int i, j ;
if (argc==1)
{
dim = 3 ;
ch = '*' ;
}
20
Soluzione (2/4)
quadrato.c
else if (argc==2)
{
dim = atoi(argv[1]) ;
if(
if dim<1 || dim>20 )
{
printf("Dimens. non valida\n") ;
exit(1) ;
}
ch = '*' ;
}
21
Soluzione (3/4)
else if (argc==3)
{
dim = atoi(argv[1]) ; quadrato.c
if(
if dim<1 || dim>20 )
{
printf("Dimens. non valida\n");
exit(1) ;
}
ch = argv[2][0] ;
if(strlen(argv[2])!=1)
if
{
printf("Carattere non valido\n");
exit(1) ;
}
} 22
Soluzione (4/4)
else
{
printf("Numero argomenti " quadrato.c
"non valido\n") ;
exit(1) ;
}
for(i=0;
for i<dim; i++)
{
for(j=0;
for j<dim; j++)
putchar(ch) ;
putchar('\n') ;
}
exit(0) ;
} 23
Esercizi proposti
Esercizio “Indovina numero”
int main(int
int argc, char *argv[])
{ segreto.c
int segreto ;
int cont, tent ;
if(
if segreto<1 || segreto>100 )
{
printf("Numero segreto "
"errato\n") ;
exit(1) ;
}
printf("INDOVINA IL NUMERO\n\n");
27
Soluzione (3/3)
cont = 1 ;
do {
printf("Tentativo %d: ", cont );
scanf("%d", &tent) ; segreto.c
if(
if tent < segreto )
printf("Basso...\n") ;
else if (tent > segreto )
printf("Alto...\n") ;
cont++ ;
} while (tent != segreto) ;
cont-- ;
printf("Indovinato: %d tentativi\n",
cont) ; 28
Funzioni
Argomenti trattati
Definizione di funzioni in C
Prototipo
Implementazione
Passaggio di parametri alle funzioni
By value
By reference
Vettori
Interfaccia del main
Parametri sulla linea di comando
Valore di ritorno
2
Tecniche di programmazione
3
Materiale aggiuntivo
Sul CD-ROM
Testi e soluzioni degli esercizi trattati nei lucidi
Scheda sintetica
Esercizi risolti
Esercizi proposti
Esercizi proposti da altri libri di testo
4
Programmazione in C
I/O Avanzato e File
Definizione di file
File di testo in C
Input robusto
Formattazione avanzata
Esercizi proposti
Sommario
2
Riferimenti al materiale
Testi
Kernighan & Ritchie: capitolo 7, appendice B
Cabodi, Quer, Sonza Reorda: capitoli 3, 8
Dietel & Dietel: capitoli 9, 11
Dispense
Scheda: “I/O Avanzato in C”
Scheda: “Gestione dei file in C”
3
I/O Avanzato e File
Definizione di file
Directory e file
File binari e file di testo
5
Definizione di file
Directory e file
Cartelle File
7
Definizioni
File:
Una sequenza di byte
Memorizzata su un disco
Caratterizzata da uno specifico nome
Contenuta all’interno di una specifica directory
Directory:
Un contenitore di file e di altre directory
Caratterizzata da uno specifico nome
Contenuta all’interno di un’altra directory
8
Identificazione di un file
01001001010010010101
10100100010100010101
10100101001100101010
00101101001010001010
[Link]
C:\prog 9
Operazioni permesse sui file
Operazioni generiche
Cancellazione di un file esistente
Rinominazione di un file esistente
Copia di un file, creando un nuovo file con lo
stesso nome in una diversa directory
Spostamento di un file, equivalente alla copia con
cancellazione dell’originale
Operazioni specifiche
Creazione di un nuovo file
Modifica del contenuto del file
10
Operazioni generiche o specifiche
11
File = Sequenza di byte
12
Tipi di file
13
Conseguenza
File
16
Differenze operative
17
Scelta operativa
18
File di “testo puro”
19
File di “testo puro”
21
File di “testo formattato” (es: XML)
• Linguaggio di
programmazione basato su
“tag”
• Possibile “annidamento” dei
tag
• Complesso da analizzare,
richiede strutture dati
avanzate
22
File di “testo formattato” (es: CSV)
23
File di “testo formattato” (es: CSV)
25
File di “testo formattato” (custom)
26
I/O Avanzato e File
File di testo in C
Accesso ai file
Funzioni fopen/fclose
Funzioni fget*/fput*
Funzioni fprintf/fscanf
Condizione feof
2
File di testo in C
Accesso ai file (1/4)
4
Accesso ai file (2/4)
6
Accesso ai file (4/4)
7
Stream associato ad un file
8
Significato di stream
9
Stati di un file
Directory
Nome file
File chiuso
Risiede su disco,
il programma
non ha accesso
al suo contenuto
10
Stati di un file
Directory Apertura del file Stream
Nome file Posizione attuale
Lettura / Scrittura
Testo / Binario
File aperto
File chiuso
Risiede su disco,
Risiede su disco, il programma ha
il programma accesso al suo
non ha accesso contenuto
al suo contenuto attraverso lo
stream associato
11
Stati di un file
Directory Apertura del file Stream
Nome file Posizione attuale
Lettura / Scrittura
Testo / Binario
File aperto
File chiuso
Risiede su disco,
Risiede su disco, il programma ha
il programma accesso al suo
non ha accesso contenuto
al suo contenuto attraverso lo
stream associato
Chiusura del file
12
Lettura di un file
Apertura del file
File aperto in
lettura
Posizione iniziale
(primo carattere)
13
Lettura di un file
Apertura del file Leggi riga /
Leggi carattere
14
Lettura di un file
Apertura del file Leggi riga /
Leggi carattere
15
Lettura di un file
Apertura del file Leggi riga /
Leggi carattere
Condizione
File aperto in
end-of-file lettura
Leggi riga /
Posizione finale Leggi carattere
Chiusura del file (ultimo carattere) 16
Scrittura di un file
Apertura del file
File aperto in
scrittura
Posizione iniziale
(primo carattere)
17
Scrittura di un file
Apertura del file Scrivi riga /
Scrivi carattere
File aperto in
scrittura
Posizione iniziale
(primo carattere) File aperto in
scrittura
Posizione intermedia
(n-esimo carattere)
18
Scrittura di un file
Apertura del file Scrivi riga /
Scrivi carattere
Posizione iniziale
(primo carattere) File aperto in
scrittura
Posizione intermedia
(n-esimo carattere)
19
Scrittura di un file
Apertura del file Scrivi riga /
Scrivi carattere
Posizione iniziale
(primo carattere) File aperto in
scrittura
Posizione finale
File aperto in
(ultimo carattere)
aggiunta
Posizione intermedia
La posizione intermedia (n-esimo carattere
diviene posizione finale dopo l’ultimo)
22
File di testo in C
Funzioni fopen e fclose
24
fopen:
fopen sintassi
Variabile stream
di tipo FILE *
FILE * f ;
...
Stringa Modalità di
contenente il apertura
nome del file (stringa) 25
Nome del file
26
Nome del file
f = fopen( "c:\\prog\\[Link]",
"modo" ) ;
27
Nome del file
f = fopen( "c:\\prog\\[Link]",
"modo" ) ;
char nome[20] ;
gets(nome) ;
f = fopen( nome, "modo" ) ;
28
Nome del file
f = fopen( "c:\\prog\\[Link]",
"modo" ) ;
char nome[20] ;
gets(nome) ;
f = fopen( nome, "modo" ) ;
30
Effetto della fopen (1/3)
Modalità "r"
Se il file esiste, viene aperto ed f punta allo
stream relativo, posizionato in lettura al primo
carattere
Se il file non esiste, non viene creato nessuno
stream e f==NULL
31
Effetto della fopen (2/3)
Modalità "w"
Se il file non esiste, viene creato da zero ed f
punta allo stream relativo, posizionato in scrittura
al primo carattere
Se il file esiste già, viene innanzitutto cancellato e
poi ricreato da zero, f punta allo stream relativo,
posizionato in scrittura al primo carattere
Se non è possibile creare il file (perché la directory
non esiste, o il disco è protetto in scrittura, ...),
non viene creato nessuno stream e f==NULL
32
Effetto della fopen (3/3)
Modalità "a"
Se il file non esiste, viene creato da zero ed f
punta allo stream relativo, posizionato in scrittura
al primo carattere
Se il file esiste già, non viene modificato, f punta
allo stream relativo, posizionato in scrittura dopo
l’ultimo carattere
Se non è possibile creare o modificare il file
(perché la directory non esiste, o il disco è protetto
in scrittura, ...), non viene creato nessuno stream
e f==NULL
33
Controllo dell’errore
FILE * f ;
...
34
Suggerimento
35
fclose:
fclose sintassi
FILE * f ;
...
f = fopen( "nomefile", "modo" ) ;
fclose(f) ;
Variabile
stream
36
Avvertenze
37
Controllo dell’errore
38
Suggerimento
39
Funzione myfopen
FILE * myfopen(char
char *name, char *mode)
{
FILE * f ;
if (f==NULL)
{ printf("Impossibile aprire %s\n",
name) ;
exit(1) ;
}
return f ;
}
40
Funzione myfclose
if (f==NULL)
{ printf("ERRORE INTERNO\n") ;
exit(1) ;
}
ris = fclose(f) ;
if(
if ris!=0 )
{ printf("Impossibile chiudere\n") ;
exit(1) ;
}
return ris ;
} 41
File di testo in C
Lettura e scrittura su file
Lettura Scrittura
Carattere singolo fgetc fputc
Riga intera fgets fputs
43
Lettura e scrittura su file
Lettura Scrittura
Carattere singolo fgetc fputc
Riga intera fgets fputs
Legge prossimo
elemento, fino
alla fine del file
Scrive o
aggiunge 44
Lettura e scrittura su file
Lettura Scrittura
Carattere singolo fgetc fputc
Riga intera fgets fputs
Parametro:
char
Parametro: Legge prossimo
stringa elemento, fino
alla fine del file
Scrive o
aggiunge 45
fgetc:
fgetc sintassi
int ch ;
ch = fgetc(f) ;
Stream aperto
in lettura
int ch ;
fputc(ch, f) ;
Stream aperto in
scrittura o in aggiunta
Carattere da
aggiungere al file
47
fgets:
fgets sintassi
char str[80] ;
fgets(str, 79, f) ;
Max numero di
caratteri letti
char str[80] ;
While(
While fgets(str, 79, f) != NULL )
{
/* elabora str */
}
49
fputs:
fputs sintassi
char str[80] ;
fputs(str, f) ;
Stream aperto in
scrittura o in aggiunta
51
Analisi (1/2)
[Link]
52
Analisi (2/2)
[Link]
Quel ramo del lago di Como,
che volge a mezzogiorno,
tra due catene non interrotte di monti,
tutto a seni e a golfi,
a seconda dello sporgere e del
C:\prog>frequenza [Link] rientrare di quelli, vien, quasi
a un tratto, a ristringersi, e a
A : 26 prender corso e figura di fiume,
tra un promontorio a destra,
C : 6
D : 12
E : 32
F : 3
G : 7
H : 1
I : 21
J : 0
K : 0
L : 13 53
Soluzioni possibili
54
Soluzione 1: per caratteri (1/3)
FILE * f ;
int ch, i ;
if (argc!=2)
{
printf("Numero argomenti errato\n") ;
exit(1) ;
}
for(i=0;
for i<LETT; i++)
freq[i] = 0 ; 55
frequenza.c
Soluzione 1: per caratteri (2/3)
ch = fgetc( f ) ;
while(
while ch!=EOF )
{
if(isalpha(ch))
if
{
i = toupper(ch)-'A' ;
/* posizione 0..25 della lettera */
freq[i]++ ;
}
ch = fgetc( f ) ;
}
myfclose( f ) ; 56
frequenza.c
Soluzione 1: per caratteri (3/3)
for(i=0;
for i<LETT; i++)
{
printf("%c : %d\n", i+'A', freq[i]) ;
}
exit(0) ;
57
frequenza.c
Soluzione 2: per righe
while(
while fgets( riga, LUN, f ) != NULL )
{
for(i=0;
for riga[i]!=0; i++)
{
if(isalpha(riga[i]))
if
{
freq[toupper(riga[i])-'A']++ ;
}
}
} 58
frequenza.c
Esercizio: “Triangolo alfabetico”
59
Analisi
c:\prog>triangolo [Link]
60
Soluzione (1/2)
FILE * f ;
triangolo.c
int i, j ;
char ch ;
if (argc!=2)
{
printf("Numero argomenti errato\n") ;
exit(1) ;
}
61
Soluzione (2/2)
for(i=0;
for i<26; i++)
{
triangolo.c
ch = i+'A' ;
for(j=0;
for j<=i; j++)
fputc( ch, f ) ;
fputc( '\n', f ) ;
}
myfclose( f ) ;
exit(0) ;
62
File di testo in C
Output formattato
64
fprintf:
fprintf sintassi
FILE * f ;
Stream aperto in
scrittura o in aggiunta Elenco delle
variabili da scrivere
66
fscanf:
fscanf sintassi
FILE * f ;
Stream aperto
in lettura Puntatori alle
variabili da leggere
68
File di testo in C
End-of-File
70
Tentativi di lettura
71
Funzione feof
72
Esempio
ch = fgetc( f ) ;
while(
while !feof(f) )
while(
while ch!=EOF ) {
{ ch = fgetc( f ) ;
.../* elabora ch */
.../* elabora ch */
ch = fgetc( f ) ; }
}
73
I/O Avanzato e File
Input robusto
2
Input robusto
Lettura da file
4
Errori di formato
5
Esempio
6
Esempio di file corretto
[Link]
3
Aldo 123456789 12762
Giovanni 334422445 97864
Giacomo 887868083 32552
7
Definizioni
int N ;
char nome[MAX][LUN+1] ;
int numero[MAX] ;
int pin[MAX] ;
FILE * f ;
int i ;
banco-bad.c
8
Lettura del file (solo se corretto)
f = myfopen(nomefile, "r") ;
for(i=0;
for i<N; i++)
{
fscanf(f, "%s %d %d",
nome[i], &numero[i], &pin[i]) ;
}
myfclose(f) ;
banco-bad.c
9
Possibili errori nel file (1/3)
3 Campo mancante
Aldo 123456789 12762
334422445 97864
Giacomo 887868083 32552
10
Possibili errori nel file (1/3)
3 Campo mancante
Aldo 123456789 12762
334422445 97864
Giacomo 887868083 32552
11
Possibili errori nel file (2/3)
3 Campo extra a
Aldo 123456789 12762 3212 fine riga
Giovanni 334422445 97864
Giacomo 887868083 32552
12
Possibili errori nel file (2/3)
3 Campo extra a
Aldo 123456789 12762 3212 fine riga
Giovanni 334422445 97864
Giacomo 887868083 32552
13
Possibili errori nel file (3/3)
3 Spazi
Pier Aldo 123456789 12762
Giovanni 334422445 97864
Giacomo 887868083 32552
14
Possibili errori nel file (3/3)
3 Spazi
Pier Aldo 123456789 12762
Giovanni 334422445 97864
Giacomo 887868083 32552
3 Incoerenza
Aldo 123456789 12762 interna
Giacomo 887868083 32552
15
Osservazioni
16
Input robusto
Lettura basata su fgetc
18
Soluzioni basate su fgetc (1/4)
char s[MAX] ;
i = 0 ;
ch = fgetc(f) ;
while(
while ch != EOF && ch != '\n'
&& ch != ' ' && i < MAX-1 )
{
s[i] = ch ;
i++ ;
ch = fgetc(f) ;
}
ch = fgetc(f) ;
while(
while ch != EOF && ch != '\n' &&
ch == ' ' )
{
ch = fgetc(f) ;
}
20
Soluzioni basate su fgetc (3/4)
i = 0 ;
ch = fgetc(f) ;
while(
while ch != EOF && isdigit(ch)
&& i < MAX-1 )
{
s[i] = ch ;
i++ ;
ch = fgetc(f) ;
}
s[i] = 0 ; /* terminatore nullo */
21
x = atoi(s) ; /* converti in int */
Soluzioni basate su fgetc (4/4)
22
Suggerimento
23
Input robusto
Funzione sscanf
25
sscanf:
sscanf sintassi
char str[80] ;
Stringa di
caratteri Puntatori alle
variabili da leggere
char str[80] ;
char nome[80] ;
int numero, pin ;
27
Gestione degli errori
28
Valore di ritorno
29
Esempio
char str[80] ;
char nome[80] ;
int numero, pin ;
int r ;
if(
if r != 3 )
{ ... errore ... }
30
Suggerimenti
33
Schema consigliato
f = myfopen(nomefile, "r") ;
/* Ciclo di lettura */
myfclose(f) ;
34
Ciclo di lettura
nr = 0 ;
while(
while fgets(riga, LUNRIGA, f)!=NULL )
{
r = sscanf(riga, "%s %d %d",
nome, &numero, &pin) ;
if( r == 3 )
{
...elabora la la
/* ...elabora riga...
riga... */
}
else
printf("Riga %d ignorata\n", nr+1);
nr++ ;
}
35
Soluzione corretta (1/6)
int N ;
char nome[MAX][LUN+1] ;
int numero[MAX] ;
int pin[MAX] ;
FILE * f ;
int i, r, nr ;
char riga[LUNRIGA+1] ; banco-ok.c
36
Soluzione corretta (2/6)
f = myfopen(nomefile, "r") ;
if(fgets(riga,
if LUNRIGA, f)==NULL)
{
printf("Errore: file vuoto\n") ;
exit(1) ;
}
r = sscanf(riga, "%d", &N) ;
if(r!=1)
if
{
printf("Errore: La prima riga "
"non contiene il numero\n");
exit(1) ;
} banco-ok.c
37
Soluzione corretta (3/6)
if(
if N<1 || N>MAX )
{
printf("Errore: Num. bancomat "
"%d non valido\n", N) ;
printf("Valori ammessi: "
"da 1 a %d\n", MAX) ;
exit(1) ;
}
banco-ok.c
38
Soluzione corretta (4/6)
i = 0 ;
nr = 0 ;
while(
while fgets( riga, LUNRIGA, f )
!= NULL )
{
if(i==N)
if
{
printf("Errore: troppe "
"righe nel file\n" ) ;
exit(1) ;
}
banco-ok.c
39
Soluzione corretta (5/6)
if(
if r == 3 )
i++ ;
else
{
printf("Riga %d ignorata\n",
nr) ;
}
nr++ ;
}
banco-ok.c
40
Soluzione corretta (6/6)
if(
if i != N )
{
printf("Errore: poche righe "
" nel file\n" ) ;
exit(1) ;
}
myfclose(f) ;
banco-ok.c
41
Conclusioni
42
I/O Avanzato e File
Formattazione avanzata
2
Formattazione avanzata
Formattazione dell’output
Tipo printf
char %c %d
int %d
short int %hd %d
long int %ld
unsigned int %u %o %x
unsigned short int %hu
unsigned long int %lu
float %f %e %g
double %f %e %g
char [] %s 5
Forma completa degli specificatori
-
precision
+
.
width *
% format
# *
6
Forma completa degli specificatori
-
precision
+
.
width *
% format
# *
Specificatore di
% obbligatorio formato
Modificatori obbligatorio
opzionali 7
Forma completa degli specificatori
-
precision
+
.
width *
% format
# *
Specificatori
già noti
8
Forma completa degli specificatori
-
precision
+
.
width *
% format
# *
0 Lunghezza totale:
numero minimo di
caratteri stampati
9
Esempi
Istruzione Risultato
printf("%d", 13) ; 13
printf("%1d", 13) ; 13
printf("%3d", 13) ; ּ13
printf("%f", 13.14) ; 13.140000
printf("%6f", 13.14) ; 13.140000
printf("%12f", 13.14) ; ּּּ13.140000
printf("%6s", "ciao") ; ּּciao
10
Forma completa degli specificatori
-
precision
+
.
width *
% format
Istruzione Risultato
printf("%.1d", 13) ; 13
printf("%.4d", 13) ; 0013
printf("%6.4d", 13) ; ּּ0013
printf("%4.6d", 13) ; 000013
printf("%.2s", "ciao") ; ci
printf("%.6s", "ciao") ; ciao
printf("%6.3s", "ciao") ; ּּּcia
12
Esempi (2/2)
Istruzione Risultato
printf("%.2f", 13.14) ; 13.14
printf("%.4f", 13.14) ; 13.1400
printf("%6.4f", 13.14) ; 13.1400
printf("%9.4f", 13.14) ; ּּ13.1400
13
Forma completa degli specificatori
-
precision
+
.
width *
% format
Istruzione Risultato
printf("%6d", 13) ; ּּּּ13
printf("%-6d", 13) ; 13ּּּּ
printf("%06d", 13) ; 000013
15
Esempi (2/2)
Istruzione Risultato
printf("%d", 13) ; 13
printf("%d", -13) ; -13
printf("%+d", 13) ; +13
printf("%+d", -13) ; -13
printf("% d", 13) ; ּ13
printf("% d", -13) ; -13
16
Formattazione avanzata
Approfondimenti su scanf
18
Stringa di formato (1/2)
Caratteri stampabili:
scanf si aspetta che tali caratteri compaiano
esattamente nell’input
Se no, interrompe la lettura
Spaziatura (“whitespace”):
Spazio, tab, a capo
scanf “salta” ogni (eventuale) sequenza di
caratteri di spaziatura
Si ferma al primo carattere non di spaziatura (o
End-of-File)
19
Stringa di formato (2/2)
20
Specificatori di formato
Tipo scanf
char %c %[...]
int %d
short int %hd
long int %ld
unsigned int %u %o %x
unsigned short int %hu
unsigned long int %lu
float %f
double %lf
char [] %s %[...] 21
Forma completa degli specificatori
* width
% format
Specificatore di
Modificatori formato
% obbligatorio
opzionali obbligatorio
22
Forma completa degli specificatori
* width
% format
Specificatori
già noti
% obbligatorio
23
Forma completa degli specificatori
* width
% format
Numero massimo di
caratteri letti per questa
conversione
24
Esempi
25
Forma completa degli specificatori
* width
% format
26
Esempi
27
Valore di ritorno
28
Lettura di stringhe
29
Struttura di un pattern
^ - carattere
% [ carattere ]
30
Struttura di un pattern
^ - carattere
% [ carattere ]
Definizione di pattern
nella stringa di formato
31
Struttura di un pattern
^ - carattere
% [ carattere ]
Pattern Effetto
%[r] Legge solo sequenze di 'r'
33
Struttura di un pattern
^ - carattere
% [ carattere ]
Caratteri o intervalli
possono essere
ripetuti più volte
34
Esempi
Pattern Effetto
%[r] Legge solo sequenze di 'r'
%[abcABC] Legge sequenze composte da a, b, c, A, B,
C, in qualsiasi ordine e di qualsiasi
lunghezza
35
Struttura di un pattern
^ - carattere
% [ carattere ]
Intervallo di caratteri di
cui può essere composta
la stringa da leggere 36
Esempi
Pattern Effetto
%[r] Legge solo sequenze di 'r'
%[abcABC] Legge sequenze composte da a, b, c, A, B,
C, in qualsiasi ordine e di qualsiasi
lunghezza
%[a-cA-C] Idem come sopra
%[a-zA-Z] Sequenze di lettere alfabetiche
%[0-9] Sequenze di cifre numeriche
%[a-zA-Z0-9] Sequenze alfanumeriche
37
Struttura di un pattern
^ - carattere
% [ carattere ]
38
Esempi
Pattern Effetto
%[r] Legge solo sequenze di 'r'
%[abcABC] Legge sequenze composte da a, b, c, A, B,
C, in qualsiasi ordine e di qualsiasi lunghezza
%[a-cA-C] Idem come sopra
%[a-zA-Z] Sequenze di lettere alfabetiche
%[0-9] Sequenze di cifre numeriche
%[a-zA-Z0-9] Sequenze alfanumeriche
%[^x] Qualunque sequenza che non contiene 'x'
%[^\n] Legge fino a file riga
%[^,;.!? ] Si ferma alla punteggiatura o spazio
39
Osservazioni
40
Esempio
41
Soluzione
f = myfopen("/etc/passwd", "r") ;
while(fgets(riga,
while MAX, f)!=NULL)
{
sscanf(riga,
"%[^:]:[%^:]:%d:%d:"
"%[^:]:%[^:]:%[^:]",
login, pass, &uid, &gid,
realname, home, shell ) ;
/* elabora i dati ... */
}
myfclose(f) ;
42
Formattazione avanzata
Stream predefiniti
44
stdin
45
stdout
46
stderr
48
Equivalenze
La funzione… è equivalente a…
49
Stampa dei messaggi di errore
if(...condizione
if errore fatale...)
{
fprintf(stderr,
"Messaggio di errore\n") ;
exit(1) ;
}
50
Suggerimento
void myerror(char
char *message) ;
51
Funzione myerror
my.c
int myerror(char
char *message)
{
fputs( message, stderr ) ;
exit(1) ;
}
52
I/O Avanzato e File
Esercizi proposti
2
Esercizi proposti
Esercizio “Somma numeri”
4
Analisi
[Link]
30
22 [Link]
-3
18
-12
C:\prog>somma [Link]
La somma vale: 55
5
Soluzione (1/4)
sommafile.c
int main(int
int argc, char *argv[])
{
const int MAX = 80 ;
FILE * f ;
char nomefile[MAX] ;
char riga[MAX] ;
int r, num ;
int somma ;
6
Soluzione (2/4)
sommafile.c
if(argc
if != 2)
myerror("Num. argomenti errato\n") ;
strcpy(nomefile, argv[1]) ;
somma = 0 ;
7
Soluzione (3/4)
sommafile.c
while(
while fgets( riga, MAX, f ) != NULL)
{
r = sscanf( riga, "%d", &num ) ;
if(r==1)
if
somma = somma + num ;
else
printf("Riga ignorata\n") ;
}
8
Soluzione (4/4)
sommafile.c
myfclose(f) ;
exit(0) ;
}
9
Esercizi proposti
Esercizio “Bersagli” (1/2)
0 0
49 49
0 99
50 50
50 50 [Link] 51 51
99 0
52 52
99 99
C:\prog>giudice [Link]
Colpi sparati: 4
Colpi andati a segno: 1 (25.0 %)
13
Algoritmo
14
Soluzione (1/4)
int main(int
int argc, char *argv[])
{ bersagli.c
const int MAXB = 100 ;
/* massimo numero di bersagli */
const int MAX = 80 ;
/* lunghezza riga del file */
const char FILEB[] = "[Link]";
Nc = 0 ;
Ncc = 0 ;
while(
while fgets(riga, MAX, f) != NULL )
{
r = sscanf( riga, "%d %d", &Cx, &Cy );
if(r!=2)
if myerror("Formato errato\n") ;
Nc ++ ;
/* Ricerca del bersaglio */
}
myfclose(f); 17
Soluzione (3/4)
/* 2: analisi coordinate dei colpi */
if(
if argc != 2 )
myerror("ERRORE:
trovato = 0 ; manca nome file\n");
bersagli.c
f = for(i=0;
myfopen( i<Nb
for argv[1], "rt") ;
&& trovato==0; i++)
if(
if Cx==Bx[i] && Cy==By[i] )
Nc = 0 ;trovato = 1 ;
Ncc = 0 ;
while(
if fgets(riga, MAX, f) != NULL )
while
if(trovato==1)
{ Ncc ++ ;
r = sscanf( riga, "%d %d", &Cx, &Cy );
if(r!=2)
if myerror("Formato errato\n") ;
Nc ++ ;
/* Ricerca del bersaglio */
}
myfclose(f); 18
Soluzione (4/4)
bersagli.c
/* 3: stampa risultati */
printf("Colpi sparati: %d\n", Nc) ;
printf("Colpi andati a segno: %d ", Ncc);
if(Nc!=0)
if
printf("(%.2f%%)", Ncc*100.0/Nc) ;
printf("\n");
exit(0) ;
}
19
Esercizi proposti
Esercizio “Consumi toner” (1/3)
21
Esercizio “Consumi toner” (2/3)
22
Esercizio “Consumi toner” (3/3)
23
Analisi
[Link]
CONT 10
MAGAZ 20 [Link]
CONT 15
24
Argomenti del programma
argv[1]
Nome del file argv[3]
contenente i argv[2] Operazione
consumi Dipartimento statistica:
da analizzare -min
-med
-max
25
Soluzione (1/4)
int main(int
int argc, char *argv[])
{ toner.c
if(argc!=4)
if
myerror("Numero parametri errato\n"); toner.c
/* Acquisisci il nome del dipartimento */
strcpy(dip, argv[2]) ;
/* Acquisisci tipo statistica */
if(
if strcmp( argv[3], "-min") == 0 )
stat = 1 ;
else if ( strcmp( argv[3], "-max") == 0 )
stat = 2 ;
else if ( strcmp( argv[3], "-med") == 0 )
stat = 3 ;
else
myerror("Statistica sconosciuta\n");
27
Soluzione (3/4)
f = myfopen(argv[1], "rt") ;
tot = 0 ;
cont = 0 ; toner.c
min = 100 ;
max = 0 ;
while(
while fgets(riga, MAX, f) != NULL )
{
r = sscanf(riga, "%s %d", dipf, &qtaf);
if(r!=2)
if
printf("Riga ignorata\n");
else
{
/* Aggiorna statistiche */
}
}
myfclose(f) ; 28
Soluzione (3/4)
f = myfopen(argv[1], "rt") ;
tot =if(strcmp(dip,
if0 ; dipf)==0)
cont {= 0 ;
if(
if
min = 100 ; qtaf < min ) toner.c
exit(0) ;
}
30
I/O Avanzato e File
Argomenti trattati (1/2)
File
File binari
File di testo
Gestione dei file in C
Apertura/chiusura
Lettura/scrittura
Gestione degli errori
Il problema degli errori di formattazione
2
Argomenti trattati (2/2)
Formattazione avanzata
Funzione sscanf
Opzioni degli specificatori di formato
In output
In input
Pattern di input
Stream predefiniti
Input robusto
Utilizzo combinato di fgets e sscanf
3
Tecniche di programmazione
4
Materiale aggiuntivo
Sul CD-ROM
Testi e soluzioni degli esercizi trattati nei lucidi
Scheda sintetica
Esercizi risolti
Esercizi proposti
Esercizi proposti da altri libri di testo