Lezione 5: Vettori

Soluzione di Esercizi

Esercizio 4.1 Scrivere un programma che prende in input un intero n e stampa la somma delle cifre di n. Ad esempio, se n = 1205 allora il programma stampa 8.

#include <stdio.h>

//stampa la somma delle cifre di un intero
int main() {    
    int n;
    printf("Digitare un intero: ");
    scanf("%d", &n);
    int somma = 0;
    while (n > 0) {
        somma += n % 10;
        n /= 10;
    }
    printf("La somma dele cifre è %d\n", somma);
}

Esercizio 4.2 Scrivere un programma che legge una linea di testo e stampa la lunghezza della più lunga parola contenuta nella linea di testo. Ad esempio, se la linea di testo è "Qual e' la parola piu' lunga? allora il programma stampa 6 se invece la linea di testo è "Una parola lunghissima", stampa 11.

#include <stdio.h>

//stampa la lunghezza della parola più lunga in una linea di testo
int main() {    
    printf("Inserire una linea di testo: ");
    char c;
    int lung = 0, maxlung = 0;
    do {
        scanf("%c", &c);
        if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
            lung++;
            if (lung > maxlung) maxlung = lung;
        } else lung = 0;
    } while (c != '\n');
    printf("Lunghezza della parola più lunga: %d\n", maxlung);
}

Esercizio 4.3 Scrivere un programma che legge una linea di testo e stampa la somma dei numeri contenuti nella linea. Ad esempio se la linea è "L'appuntamento è alle 18:40 del 2/11/2010", allora il programma stampa 2081 (2081 = 18+40+2+11+2010).

#include <stdio.h>

//calcola la somma dei numeri contenuti in una linea di testo
int main() {    
    printf("Inserire una linea di testo: ");
    char c;
    long long somma = 0, numero = 0;
    do {
        scanf("%c", &c);
        if (c >= '0' && c <= '9')
            numero = 10*numero + (c - '0');
        else if (numero > 0) {
            somma += numero;
            numero = 0;
        }
    } while (c != '\n');
    somma += numero;
    printf("La somma è %lld\n", somma);
}

Dichiarazione di Array (Vettori)

La variabili incontrate finora memorizzano un solo valore del tipo dichiarato. E' spesso utile memorizzare piu' valori dello stesso tipo, specialmente quando si usano istruzioni iterative. Per questo utilizziamo il tipo array, dichiarato come segue:

<tipo> <nome>[<dimensione>];

In questo caso la variabile <nome> puo' memorizzare fino a <dimensione> elementi ti tipo <tipo>. Ad esempio int v[10]; dichiara un array v di 10 valori di tipoint.

Accesso agli Elementi

Si accede ai singoli elementi usando la notazione:

<nome>[<indice>]

dove <indice> e' un numero, o il risultato di una espressione, tra 0 e <dimensione>-1. Nota che questo significa che in C si "conta da zero". Ad esempio v[5] si riferisce al sesto valore dell'array, mentre v[x] si riferisce al valore x+1-esimo dell'array v.

Inizializzazione

Come per la variabili standard, i valori di un array non sono definiti durante la dichiarazione. Esiste quindi una istruzione di inizializzazione che per permette di settare tutti i valori di un array con la sintassi:

<tipo> <nome>[<dimensione>] = { <valore_0>, <valore_1>, ... };

Ad esempio, int v[3] = { 1, 2, 3 }; dichiara un array v di tipo int di dimensione 3 e ne setta i valori a 1, 2, 3 rispettivamente.

Si noti che quando si usa l'inizializzazione, la dichiarazione della dimensione di un array e' opzionale, nel qual caso il C la deduce dal numero di valori definiti. Si puo direttamente

<tipo> <nome>[] = { <valore_0>, <valore_1>, ... };

Rappresentazione in memoria

In memoria, un array e' rappresentato con un numero di celle consecutive pari alla dimensione dell'array, ognuna in grado di contenere un valore del tipo indicato. Ad esempio un array v[10] e' rappresentato in memoria come

      v
. . . ----------------------------------------- . . .
      |   |   |   |   |   |   |   |   |   |   |
. . . ----------------------------------------- . . .
        0   1   2   3   4   5   6   7   8   9 

Esempi

Programma che legge n interi e li stampa in ordine inverso.

#include <stdio.h>

int main() {    
    int valori[100], n = 0;
    printf("Inserire valori interi (-1 per terminare):\n");
    do {    // legge la sequenza di interi
        printf("%3d: ", n + 1);
        scanf("%d", &val);
        if (val != -1) {
            valori[n] = val;
            n++;
        }
    } while (val != -1);
    for(int i = n-1; i >= 0; i --) {
        printf("%d\n", valori[i]);
    }
}

Programma che legge n interi e stampa la mediana.

#include <stdio.h>

// Stampa la mediana di una sequenza di interi
/* La mediana di una sequenza di valori è il valore al "centro" della
 * sequenza dopo che è stata ordinata. Se il numero di valori è pari
 * possono esserci due valori possibili per la mediana, se è dispari
 * c'è un solo valore possibile. */
int main() {    
    int valori[100], n = 0, val;
    printf("Inserire valori interi (-1 per terminare):\n");
    do {    //legge la sequenza di interi
        printf("%3d: ", n + 1);
        scanf("%d", &val);
        if (val != -1) {
            valori[n] = val;
            n++;
        }
    } while (val != -1);
    int i = 0, mediana = -1;
    while (i < n && mediana == -1) {
        int minori = 0, maggiori = 0;
        val = valori[i];
        for (int j = 0 ; j < n ; j++) {
            if (valori[j] <= val) minori++;
            if (valori[j] >= val) maggiori++;
        }
        if (minori >= (n+1)/2 && maggiori >= (n+1)/2) 
            mediana = val;
        i++;
    }
    printf("La mediana è %d\n", mediana);
}

Programma che legge una linea di testo e stampa le frequenze dei caratteri alfabetici minuscoli.

#include <stdio.h>

/* stampa le frequenze dei caratteri alfabetici minuscoli in 
 * una linea di testo. */
int main() {    
    printf("Inserire una linea di testo: ");
    int freq[26] = {0};
    char c;
    do {
        scanf("%c", &c);
        if (c >= 'a' && c <= 'z') freq[c - 'a']++;
    } while (c != '\n');
    for (int i = 0 ; i < 26 ; i++)
        if (freq[i] > 0) printf("%c %d\n", 'a' + i, freq[i]);
}

La funzione getchar() per leggere caratteri dallo standard input (invece di scanf("%c", ·)).

Esercizi

Esercizio 5.1 Scrivere un programma che legge una linea di testo e per ogni carattere alfabetico che è l'iniziale di una parola stampa il numero di parole che iniziano con quel carattere. Ad esempio, se la linea di testo è "Una mela, un melone, una pera", il programma stampa:

m 2
p 1
u 3

Esercizio 5.2 Scrivere un programma che legge un intero n e poi legge n numeri in virgola mobile e se ci sono due numeri la cui differenza (in valore assoluto) è minore di 0.001 stampa "Ci sono numeri vicini", altrimenti stampa "NON ci sono numeri vicini". Ad esempio, se i numeri letti sono 1.03, 0.056, 1.0305, allora il programma stampa "Ci sono numeri vicini".