4. Cos‟è un vettore
Un vettore, o meglio, un array è un insieme ordinato di elementi,
tutti di uno stesso tipo.
Può essere visualizzato idealmente come una lista di celle
numerate univocamente
cella
0 1 2 3 4 5
indice
Array di 6 elementi
5. Gli Arrays
Un esempio di definizione di un array in C e' :
nome array dimensione
tipo int elenco_numeri[50];
e si accede agli elementi dell'array nel seguente modo:
terzo_numero = elenco_numeri[2];
elenco_numeri[49] = 100;
7. Indicizzazione degli array
In C gli indici delle celle iniziano da 0 e finiscono alla dimensione
dell'array meno uno. Nell'esempio precedente il range è 0-49, cioè
elenco_numeri è un array di 50 elementi e si ha:
elenco_numeri[0], elenco_numeri[1], ..., elenco_numeri[49]
Questa è una caratteristica tipica dei moderni linguaggi di
programmazione e richiede un po' di pratica per raggiungere "la
giusta disposizione d'animo".
8. Esempio Array
Creare un array di 10 elementi di tipo integer (int)
Assegnare ad esso 10 valori a piacere
Stampare il contenuto dell‟array che si è creato
9. Soluzione Array
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arrayInteri[10];
arrayInteri[0] = 15;
int i;
for(i = 1; i < 10; i++)
{
arrayInteri[ i ] = (arrayInteri[ i – 1 ] + 10);
}
for(i = 0; i < 10; i++)
{
printf("cella %d = %dn", i, arrayInteri[ i ]);
}
system("PAUSE");
}
11. Esercizio Fibonacci
Scrivere un programma che generi i primi 12 interi
della successione di Fibonacci, li salvi in un array di interi e
stampi la successione a video
Qual è l‟espressione analitica della successione di Fibonacci?
Help:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
12. Successione di Fibonacci
La successione di Fibonacci è una sequenza di numeri interi
naturali definibile assegnando i valori dei due primi termini,
F0:= 0 ed F1:= 1, e chiedendo che per ogni successivo sia
Fn := Fn-1 + Fn-2.
Il termine F0 viene aggiunto nel caso si voglia fare iniziare la
successione con 0; storicamente il primo termine della
successione è F1:= 1.
13. Soluzione Fibonacci
#include <stdio.h>
#include <stdlib.h>
int main()
{
int successione_Fibonacci[12];
int f0 = 0, f1 = 1, i;
successione_Fibonacci[0] = 0; successione_Fibonacci[1] = 1;
for(i = 2; i < 12; i++){
successione_Fibonacci[i] =
successione_Fibonacci[ i – 1 ] + successione_Fibonacci[ i – 2 ];
}
for(i = 0; i < 12; i++){
printf("%dn", successione_Fibonacci[ i ]);
}
system("PAUSE");
}
15. Le matrici
Le matrici non sono altro che array
multidimensionali
0 [0][0] [0][1]
righe Notazione C:
matrice[righe][colonne]
1 [1][0] [1][1]
0 1
colonne
16. Gli Array multidimensionali
Gli array multidimensionali sono cosi definiti:
int tabella_numeri[50][50]
(per due dimensioni)
int big_D[20][30][10][40]
(per più di due dimensioni)
17. Indicizzazione degli Array multidimensionali
si accede agli elementi di un array multidimensionale nel
seguente modo:
numero = tabella_numeri[5][32];
tabella_numeri[1][23] = 100;
18. Esempio Matrici
#include <stdio.h>
#include <stdlib.h>
int main()
{
int matrice[2][2], i, j;
matrice[0][0] = 1;
matrice[0][1] = 2;
matrice[1][0] = 3;
matrice[1][1] = 4;
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
printf("matrice[%d][%d] = %dn", i, j, matrice[ i ][ j ]);
system("PAUSE");
}
20. Le stringhe
In C le stringhe sono definite come array di caratteri.
Ad esempio, la seguente istruzione definisce una stringa
di 50 caratteri:
char name[50];
21. Gestione delle stringhe
Il C non ha un sistema maneggevole per costruire le stringhe, così le
seguenti assegnazioni NON SONO VALIDE:
char firstname[50], lastname[50], fullname[50];
firstname = "Mario" /* illegale */
lastname = "Rossi" /* illegale */
fullname = "Sig."+firstname+lastname /* illegale */
Esiste pero' una libreria di routines per il trattamento delle stringhe ("<
string.h >").
22. Stampare una stringa
Per stampare una stringa si usa printf() con lo speciale
carattere di controllo %s:
printf("%s", nome);
Nota: è sufficiente avere il nome della stringa.
23. Esempio stampa di una stringa
#include <stdio.h>
#include <stdlib.h>
main()
{
char string_nome[80];
printf("inserisci il tuo nome:n");
scanf("%s", string_nome);
printf("NOME: %sn", string_nome);
//ulteriore modo di stampare il nome
printf("NOME IN ALTRO MODO: %sn", &string_nome[0]);
system("PAUSE");
}
24. Output stampa di una stringa
inserisci il tuo nome:
antonio
NOME: antonio
NOME IN ALTRO MODO: antonio
Premere un tasto per continuare . . .
25. il carattere „0‟
Al fine di permettere l'utilizzo di stringhe con lunghezza
variabile, il carattere 0 viene utilizzato per indicare la fine di
una stringa.
In questo modo, se abbiamo una stringa dichiarata di 50
caratteri (char name[50];), e la utilizziamo per memorizzare il
nome "Dave", il suo contenuto (a partire da sinistra) sarà la
parola Dave immediatamente seguita dal segno di fine stringa
0, e quindi tutti gli altri caratteri (fino ad arrivare alla
lunghezza di 50) risulteranno vuoti.
26. Esercizio Stringhe
Dichiarare un array di 6 elementi di tipo char.
Inserire in tale array la stringa “DINO”
Stampare a video il contenuto dell‟array di 6 elementi
dichiarato in precedenza.
29. Spiegazione esercizio Stringhe
char nome[6]; ? ? ? ? ? ?
nome[0] = 'D';
nome[1] = 'I';
nome[2] = 'N'; D I N O ? ?
nome[3] = 'O';
nome[4] = „0'; D I N O 0 ?
Senza „0‟ la printf non può conoscere la fine della
stringa che si vuole stampare, quindi vengono stampati anche
valori ignoti (tipo $³¨☻CÂÇ|¿ #)
30. Le Funzioni
il C considera "main()" come una funzione.
La forma generale di una funzione e':
returntype function_name (param1, param2, ...)
{
local variables
function code (C statements)
}
31. Tipo di ritorno
Se manca la definizione del tipo della funzione
("returntype", tipo della variabile di ritorno della
funzione), il C assume che il ritorno della funzione
sia di tipo integer (int);
ATTENZIONE: questo può essere una delle cause
di problemi nei programmi.
32. Esempio
Esempio di una funzione che calcola la media tra due
valori:
argomenti
valore di ritorno
float calcolamedia(float a, float b)
{
float media;
media = (a + b) / 2;
return(media);
}
33. Eseguire una funzione
Per richiamare tale funzione si procede nel seguente modo:
main()
{
float a = 10, b = 25, risultato;
risultato = calcolamedia(a, b);
printf("Valore medio = %fn",
risultato);
}
Nota: l'istruzione "return" porta il risultato della funzione al
programma principale.
34. Programma calcola media
#include <stdio.h>
#include <stdlib.h>
float calcolamedia(float a, float b)
{
float media;
media = (a + b) / 2;
return(media);
}
main()
{
float a = 10, b = 25, risultato;
risultato = calcolamedia(a, b);
printf("Valore medio = %fn",
risultato);
}
35. Domanda
Cosa succede se inverto l‟ordine delle funzioni?
#include <stdio.h>
#include <stdlib.h>
main(){
float a = 10, b = 25, risultato;
risultato = calcolamedia(a, b);
printf("Valore medio = %fn",
risultato);
}
float calcolamedia(float a, float b){
float media;
media = (a + b) / 2;
return(media);
}
36. Risposta
Il compilatore non può sapere cos‟è “calcolamedia”
#include <stdio.h>
#include <stdlib.h>
float calcolamedia(float a, float b);
la funzione main(){
float a = 10, b = 25, risultato;
prima risultato = calcolamedia(a, b);
printf("Valore medio = %fn",
va dichiarata risultato);
}
float calcolamedia(float a, float b){
poi float media;
va usata media = (a + b) / 2;
return(media);
}
37. Prototipi di funzioni
Prima di usare una funzione, il C deve
riconoscere il tipo di ritorno e il tipo dei
parametri che la funzione si aspetta.
Va fatta una dichiarazione
Lo standard ANSI del C ha introdotto un nuovo e migliore
metodo per fare questa dichiarazione rispetto alle vecchie
versioni di C (ricordiamo
che le moderne versioni del C aderiscono allo standard
ANSI).
38. Dichiarazione di funzione
L'importanza della dichiarazione e' doppia:
- viene fatta per avere un codice sorgente più
strutturato e perciò facile da leggere ed
interpretare;
- permette al compilatore C di controllare la
sintassi delle chiamate di funzioni.
39. Dichiarazione di funzione (2)
Fondamentalmente, se una funzione e' stata definita prima di
essere usata (call) allora è possibile semplicemente usare la
funzione.
Nel caso contrario, è obbligatorio dichiarare la funzione;
la dichiarazione stabilisce in modo semplice il ritorno della
funzione ed il tipo dei parametri utilizzati da questa.
E' buona norma (e solitamente viene fatto) dichiarare tutte le
funzioni all'inizio del programma, sebbene non sia
strettamente necessario.
40. Dichiarazione di funzione (3)
Per dichiarare un prototipo di funzione bisogna
semplicemente stabilire il ritorno della funzione, il nome della
funzione e tra le parentesi elencare
il tipo dei parametri nell'ordine in cui compaiono nella
definizione di funzione.
Ad esempio:
int strlen(char[]);
Questo dichiara che una funzione di nome "strlen" ritorna un
valore integer ed accetta una singola stringa come parametro.
41. Una scorciatoia
le funzioni e le variabili possono essere dichiarate sulla stessa linea
di codice sorgente. Questa procedura era molto piu' diffusa nei
giorni del pre-ANSI C; da allora le funzioni solitamente vengono
dichiarate separatamente all'inizio del programma. La prima
procedura
risulta ancora perfettamente valida, purchè venga rispettato l'ordine
in cui gli oggetti compaiono nella definizione della funzione.
int length, strlen(char[]);
dove "length" e' una variabile, e "strlen" e' la funzione (come
nell'esempio precedente).
42. Funzioni “void”
Se non si vuole ritornare alcun valore da una funzione è sufficiente dichiararla di tipo
void ed omettere il return.
void cento(){
int loop;
for (loop = 0; loop < 10; loop++);
printf("%dn", loop * loop);
}
main(){
cento();
}
Nota: è obbligatorio mettere le parentesi () dopo il nome della
funzione anche se non ci sono parametri.
43. Funzioni ed array
Possono essere passati alle funzioni come parametri anche array singoli o
multidimensionali.
Gli array monodimensionali possono essere passati nel seguente modo:
float trovamedia(int size,float list[]){
int i;
float sum = 0.0;
for (i = 0; i < size; i++)
sum += list[i];
return(sum/size);
}
44. Spiegazione
Nella precedente funzione “trovamedia” la
dichiarazione "float list[]" dichiara al C che
"list" è un array di float.
Non viene specificata la dimensione di un array
quando è un parametro di una funzione.
45. Esempio d‟uso per “trovamedia”
#include <stdio.h>
#include <stdlib.h>
//dichiarazione di funzione
float trovamedia(int size, float list[]);
//main
main(){ OUTPUT
float numeri[2]; la media e' 2.400000
numeri[0] = 1.2; numeri[1] = 3.6;
float media = trovamedia(2, numeri); Premere un tasto per continuare . . .
printf("la media e' %fn", media);
system("PAUSE");
}
//codice della funzione
float trovamedia(int size,float list[]){
int i;
float sum = 0.0;
for (i = 0; i < size; i++)
sum += list[i];
return(sum/size);
}
46. Funzioni ed array multidimensionali
Array multidimensionali possono essere passati alle
funzioni nel seguente modo:
void stampatabella(int xsize, int ysize,
float tabella[][5])
{
int x,y;
for (x = 0; x < xsize; x++) {
for (y = 0; y < ysize; y++)
printf(“t%f ”, tabella[x][y]);
printf("n");
}
}
47. Spiegazione
Nella precedente funzione “stampatabella”, la parte di
codice "float tabella[][5]" dichiara al C che tabella è un array
di float di dimensioni nx5.
E' importante notare che dobbiamo specificare la seconda
dimensione (e le successive) del vettore, ma non la prima
dimensione.
48. Riepilogo: array e funzioni
riepilogando,
nel caso di array singoli non e' necessario specificare
la dimensione dell'array nella definizione come
parametro della funzione,
mentre nel caso di array multidimensionali si può
non specificare solo la prima dimensione.
49. Esercizio: array e funzioni
Si scriva un programma che prenda in ingresso
da tastiera 10 interi, li memorizzi in un array,
ordini tale array e stampi la lista dei numeri
inseriti dall‟utente e la stessa lista ordinata.
Esempio:
Input: 1 3 2 23 43 521 98 43 9 10
Output: 1 2 3 9 10 23 43 43 98 521