LINGUAGGI E STRUMENTI
DI PROGRAMMAZIONE CON
LABORATORIO
ARRAY
1 Docente: Maurizio Boscaini (Matricole pari)
Lezioni 8 – a.a. 2023/2024
Original work Copyright © Sara Migliorini
University of Verona
Modifications Copyright © Damiano Macedonio, Maurizio Boscaini, Vincenzo Bonnici,
Elisa Quintarelli, Roberto Di Marco
University of Verona 2
Gli Array: Cosa Sono
Un array è un tipo di dato che rappresenta una
sequenza di elementi dello stesso tipo.
Sequenza = successione ordinata di elementi che
posso anche ripetersi (non è un insieme ordinato)
Ciascun elemento della sequenza è identificato da
un indice univoco.
x[i]
Gli indici di un array iniziano da 0 e terminano
con il valore n pari alla lunghezza dell’array
meno 1. 3
0 <= i <= (lunghezza di x – 1)
Gli Array: Dichiarazione ed Utilizzo
La dichiarazione di una variabile di tipo array richiede di specificare:
Il tipo degli elementi contenuti nell’array (es. tutti i tipi primitivi).
Il nome dell’array.
Il numero massimo di elementi che saranno contenuti nell’array (tra
parentesi quadrate).
int voti[10]; // array di interi di dimensione massima 10
Ciascun elemento dell’array può essere recuperato indicando l’indice
corrispondente tra parentesi quadrate.
voti[3]; // Quarto elemento dell'array voti.
Ogni elemento di un array può essere utilizzato come una qualsiasi
variabile del corrispondente tipo primitivo.
Assegnare ad una variabile il valore di un elemento dell’array:
int v = voti[3];
Assegnamento di un valore ad un elemento dell’array. 4
voti[3] = 26;
Gli Array: Gli Indici
Gli indici usati per recuperare il valore di un
elemento dell’array possono essere:
Costanti intere: voti[3]
Espressioni con valori interi: voti[(i+5)/2]
dove i è una variabile di tipo int.
Il compilatore C non controlla se gli indici
specificati sono validi (cioè appartengono ai limiti
consentiti).
L’accesso ad un elemento con indice non valido
può non generare un errore, ma semplicemente
un comportamento inaspettato. 5
GLI ARRAY: ESEMPIO
int voti[10];
voti[0]
voti[1]
voti[2]
voti[3]
voti[4]
voti[5]
voti[6]
voti[7]
voti[8]
voti[9]
Gli elementi dell’array sono memorizzati in celle di memoria 6
adiacenti.
GLI ARRAY: ESEMPIO
voti[0] 26
voti[1]
voti[2]
int voti[10]; voti[3] 28
voti[0] = 26; voti[4]
voti[3] = 28; voti[5]
voti[7] = (voti[0] + voti[3]) / 2; voti[6]
voti[7] 27
voti[8]
voti[9]
7
Gli Array: Inizializzazione
I valori di un array non inizializzato sono non predicibili.
Un array può essere inizializzato direttamente durante la
dichiarazione:
int counters[5] = {1, 2, 3, 4, 5}
counters[0] == 1;
counters[1] == 2;
counters[2] == 3;
counters[3] == 4;
counters[4] == 5;
Non è necessario inizializzare tutti gli elementi: gli elementi non
specificati saranno posti a zero (questo vale solo se l’array è
inizializzato parzialmente):
int counters[5] = {1, 2}
counters[0] == 1;
counters[1] == 2; 8
counters[2], counters[3], counters[4] == 0;
Gli Array: Inizializzazione
#include <stdio.h>
int main(void){
int array_values1[5] = {0,1,4,9,16};
int array_values2[5];
int i;
for( i = 0; i< 5; i++ ){
array_values2[i] = i*i;
}
for( i = 0; i< 5; i++ ){
printf("array_values1[i]: %d\n", array_values1[i]);
printf("array_values2[i]: %d\n", array_values2[i]);
}
}
9
Gli Array: Inizializzazione
Se un array viene inizializzato nella
dichiarazione non è necessario specificare il
massimo numero di elementi che può contenere:
char word[] = {'H', 'e', 'l', 'l', 'o'};
La dimensione viene determinata direttamente
dal numero di elementi inizializzati.
L’array word avrà dimensione massima 5.
10
Gli Array Multidimensionali
Un array multidimensionale è un array i cui
elementi sono a loro volta di tipo array.
Gli array multidimensionali più utilizzati sono
quelli bidimensionali: matrici.
Dichiarazione di un array bidimensionale:
int matrix[10][5];
Accesso ad un elemento:
int value = matrix[5][3];
11
matrix[3][2] = 10;
Gli Array Multidimensionali
Anche gli array multidimensionali possono essere
inizializzati direttamente durante la dichiarazione.
Non è necessario specificare tutti gli elementi.
Gli elementi vengono specificati per riga:
int matrix[3][4] =
{{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}};
1 2 3 4
5 6 7 8
9 10 11 12 12
Esercizio 1
Scrivere un programma C che richiede all’utente 10
valori e li memorizza all’interno di un array, quindi
stampa tutti quelli maggiori o uguali dell'ultimo
valore inserito.
13
Esercizio 2
Scrivere un programma C che:
Richiede all’utente di inserire i vettori a e b di lunghezza 3:
scanf("%i,%i,%i", &a[0], &a[1], &a[2])
Richiede all’utente di scegliere un’operazione da eseguire su tali vettori:
+: somma tra due vettori
Il risultato è un vettore in cui ciascun elemento è la somma dei corrispondenti elementi nei
vettori di input.
-: differenza tra due vettori
Il risultato è un vettore in cui ciascun elemento è la differenza dei corrispondenti elementi nei
vettori di input.
*: prodotto elemento per elemento
Il risultato è un vettore in cui ciascun elemento è il prodotto dei corrispondenti elementi nei
vettori di input.
x: prodotto scalare
Il risultato è un numero ottenuto facendo la somma dei prodotti a[i] * b[i].
Esempi
(2, 3, 4) + (4, 5, 6) = (6, 8, 10)
(2, 3, 4) – (4, 5, 6) = (-2, -2, -2)
(2, 3, 4) * (4, 5, 6) = (8, 15, 24) 14
(2, 3, 4) x (4, 5, 6) = 2*4 + 3*5 + 4*6 = 47
Esercizio 3
Scrivere un programma C che richiede all’utente 10
voti (compresi tra 18 e 30). Per ogni voto da 18 a 30
stampa il numero delle sue occorrenze e individua i
voti che hanno più occorrenze.
Esempio: Se i voti immessi sono:
18 23 21 25 29 30 19 21 23 24
21 e 23 hanno 2 occorrenze e sono anche i voti col
maggior numero di occorrenze. Il programma li
deve individuare entrambi.
15
Esercizio 4
Scrivere un programma C che salvi in ogni
elemento di un array bidimensionale il valore (i + j)
dove i è il numero di riga e j il numero di colonna.
Scegliete a piacere il numero di righe e colonne.
Finché l’utente vuole continuare, il programma
richiede all’utente i valori i e j e stampa il
corrispondente elemento a video, oppure un
messaggio di errore se gli indici non sono validi.
Esempio di esecuzione
Vuoi iniziare? (s/n) s
Riga: 2
Colonna: 3
Valore in (2,3): 5 16
Vuoi continuare? (s/n)
Esercizio 5
Scrivere un programma C che:
Richiede all’utente di inserire due matrici
quadrate 3x3.
for( i = 0; i < 3; i++ ){
scanf( "%i,%i,%i",
&a[i][0], &a[i][1], &a[i][2] );
}
Esegue la moltiplicazione tra le due matrici.
Date due matrici quadrate a e b, l’elemento c[i][j]
della matrice c risultato è dato dal prodotto scalare
della riga i di a per la colonna j di b.
Per il prodotto scalare si veda l'esercizio 2.
17
Stampa a video il risultato.
Esercizio 5 [Esempio]
Matrice a: Matrice b: Matrice c:
3 2 5 1 0 3 36 19 28
1 0 4 4 7 2 21 4 15
4 1 3 5 1 3 23 10 23
c[ 1 ][ 1 ] = a[ 1 ][ 1 ]*b[ 1 ][ 1 ] + a[ 1 ][ 2 ]*b[ 2 ][ 1 ] + a[ 1 ][ 3 ]*b[ 3 ][ 1 ]
c[ 1 ][ 2 ] = a[ 1 ][ 1 ]*b[ 1 ][ 2 ] + a[ 1 ][ 2 ]*b[ 2 ][ 2 ] + a[ 1 ][ 3 ]*b[ 3 ][ 2 ]
c[ 1 ][ 3 ] = a[ 1 ][ 1 ]*b[ 1 ][ 3 ] + a[ 1 ][ 2 ]*b[ 2 ][ 3 ] + a[ 1 ][ 3 ]*b[ 3 ][ 3 ]
c[ 2 ][ 1 ] = a[ 2 ][ 1 ]*b[ 1 ][ 1 ] + a[ 2 ][ 2 ]*b[ 2 ][ 1 ] + a[ 2 ][ 3 ]*b[ 3 ][ 1 ]
c[ 2 ][ 2 ] = a[ 2 ][ 1 ]*b[ 1 ][ 2 ] + a[ 2 ][ 2 ]*b[ 2 ][ 2 ] + a[ 2 ][ 3 ]*b[ 3 ][ 2 ]
….
c[ i ] [ j ] = a[ i ][ 1 ]*b[ 1 ][ j ] + a[ i ][ 2 ]*b[ 2 ][ j ] + a[ i ][ 3 ]*b[ 3 ][ j ]
18
Esercizio 6
Scrivere un programma che dato un array di
caratteri lungo 8 (con i valori letti da standard
input) lo stampa, lo stampa invertito, sostituisce
ogni vocale minuscola con un '*'.
Per esempio se dopo la lettura l’array è
p i c c i o n e
Il programma lo trasforma in:
* n * * c c * p
19
Esercizio 7
(esercizio con array da tema di esame)
Scrivere un programma che dato un array di interi > 0
(sicuramente è così, non serve correggere errori)
inizializzato in fase di dichiarazione e che finisce con il
valore sentinella -1 (dichiarato come costante simbolica
STOP), verificare se l’array è in ordine:
1) Crescente
2) Decrescente
3) Nessun ordine
e stampare un opportuno messaggio. Ad esempio l’array
int values[] = {7, 4, 5, 4, 2, STOP}; non è in nessun ordine,
l’array int values[] = {7, 5, 3, 2, 1, STOP}; è in ordine
decrescente, mentre l’array int values[] = {1, 3, 4, 7, 9, 20
STOP}; è in ordine crescente.
Esercizio 8
(esercizio con array da tema di esame)
Scrivere un programma che dato un numero intero positivo
num inserito da tastiera (correggere eventuali errori in
inserimento) e un array di 5 interi di nome cifre
contenente tutti numeri maggiori o uguali a zero composti
da una sola cifra, verificare se tutte le cifre di num sono
presenti nell’array.
Ad esempio se num vale 353 e l’array è int cifre[]= {3, 3,0,
7, 4}, l’array non contiene tutte le cifre di num.
21
Esercizio 9
(esercizio con cicli da tema di esame)
Chiamiamo coppia di quadrati (CQ) una coppia <a,b> di
numeri interi che sono uno il quadrato dell’altro. Esempio
<9,3> oppure <-3,9> (infatti 9=3*3).
Si codifichi un programma C che legge da tastiera una
sequenza che termina con 99 (di lunghezza a priori
illimitata) di numeri interi e stampa a video quante coppie
di numeri consecutivi all’interno della sequenza
rappresentano una CQ.
Ad esempio: 2 4 16 0 3 9 99 contiene 3 CQ: <2,4> <4,16> e
<3,9>
22
Esercizio 10
Matermind
Scrivere un programma che realizzi il gioco Mastermind.
Il primo giocatore inserisce 4 caratteri che corrispondono
alle iniziali di 4 colori tra (r = rosso; g = giallo; v = verde, b
= blu, n = nero; si assuma che gli utenti inseriscano
sempre una lettera compresa in questo elenco).
Il secondo giocatore ha a disposizione 10 tentativi per
indovinare la combinazione, inserendo a sua volta quattro
caratteri ad ogni tentativo.
Dopo ogni tentativo il programma visualizza il numero di
colori corretti in posizione corretta (non vengono segnalati
i colori corretti in posizione sbagliata).
Terminati i tentativi, se il secondo giocatore non è riuscito
a indovinare la sequenza, vengono visualizzati i caratteri 23
corretti.
Esercizio 11
Massimo comun divisore e minimo
comune multiplo
Scrivere un programma che calcoli il massimo
comun divisore e il minimo comune multiplo di due
numeri inseriti dall’utente.
Entrambi i numeri inseriti devono essere maggiori
di zero.
24