Array Monodimensionali

Un array è una sequenza di elementi dello stesso tipo, memorizzati in modo contiguo in memoria.

CDichiarazione, inizializzazione, accesso
#include <stdio.h>

int main() {
    // Dichiarazione e inizializzazione
    int numeri[5] = {10, 20, 30, 40, 50};

    // Inizializzazione parziale (i restanti sono 0)
    int parziale[5] = {1, 2};    // {1, 2, 0, 0, 0}

    // Dimensione dedotta automaticamente
    double prezzi[] = {1.99, 3.50, 2.25, 4.80};
    int n = sizeof(prezzi) / sizeof(prezzi[0]);  // Dimensione array

    // Accesso con indice (0-based)
    printf("Primo elemento:  %d\n", numeri[0]);  // 10
    printf("Ultimo elemento: %d\n", numeri[4]);  // 50

    // Modifica
    numeri[2] = 99;

    // Iterazione con for
    printf("\nArray numeri: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", numeri[i]);
    }

    // Calcola media dei prezzi
    double somma = 0;
    for (int i = 0; i < n; i++) somma += prezzi[i];
    printf("\nMedia prezzi: %.2f\n", somma / n);

    return 0;
}
Accesso fuori dai limiti Il C non controlla i limiti dell'array. Accedere a arr[10] su un array di 5 elementi è undefined behavior e può causare crash o corruzione silente dei dati. Controlla sempre gli indici!

Array Bidimensionali (Matrici)

CMatrici 2D
#include <stdio.h>

#define RIGHE 3
#define COLONNE 3

void stampa_matrice(int m[RIGHE][COLONNE]) {
    for (int i = 0; i < RIGHE; i++) {
        for (int j = 0; j < COLONNE; j++) {
            printf("%4d", m[i][j]);
        }
        printf("\n");
    }
}

int main() {
    // Inizializzazione
    int matrice[RIGHE][COLONNE] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    printf("Matrice originale:\n");
    stampa_matrice(matrice);

    // Trasposta
    int trasposta[RIGHE][COLONNE];
    for (int i = 0; i < RIGHE; i++)
        for (int j = 0; j < COLONNE; j++)
            trasposta[j][i] = matrice[i][j];

    printf("\nTrasposta:\n");
    stampa_matrice(trasposta);

    // Somma della diagonale principale
    int diag = 0;
    for (int i = 0; i < RIGHE; i++) diag += matrice[i][i];
    printf("\nTraccia (somma diagonale): %d\n", diag);

    return 0;
}

Stringhe in C

In C una stringa è un array di char terminato dal carattere nullo '\0'. Non esiste un tipo "string" nativo (a differenza del C++).

CStringhe C — basi
#include <stdio.h>
#include <string.h>

int main() {
    // Dichiarazione
    char s1[] = "Hello";       // Automaticamente: {'H','e','l','l','o','\0'}
    char s2[20] = "World";     // Buffer di 20 char, occupa 6 (5+\0)
    char s3[20];               // Non inizializzata

    printf("s1 = %s, lunghezza = %zu\n", s1, strlen(s1));  // 5

    // Input di una stringa (con spazi: usa fgets)
    printf("Inserisci una frase: ");
    fgets(s3, sizeof(s3), stdin);
    // fgets include il \n finale, rimuoviamolo:
    s3[strcspn(s3, "\n")] = '\0';
    printf("Hai scritto: %s\n", s3);

    // Accesso carattere per carattere
    for (int i = 0; s1[i] != '\0'; i++) {
        printf("s1[%d] = '%c' (ASCII %d)\n", i, s1[i], s1[i]);
    }

    return 0;
}

Libreria string.h

FunzioneDescrizioneEsempio
strlen(s)Lunghezza della stringa (senza \0)strlen("hello") → 5
strcpy(dst, src)Copia src in dststrcpy(buf, "ciao")
strncpy(dst, src, n)Copia al massimo n caratteri (più sicuro)strncpy(buf, s, 19)
strcat(dst, src)Concatena src alla fine di dststrcat(buf, " mondo")
strcmp(a, b)Confronta: 0 se uguali, <0 o >0 altrimentistrcmp("ab","ab") → 0
strchr(s, c)Puntatore alla prima occorrenza di c in sstrchr("hello", 'l')
strstr(s, sub)Puntatore alla prima occorrenza di sub in sstrstr("hello world", "world")
sprintf(buf, fmt, ...)Come printf ma scrive in una stringasprintf(buf, "%d", n)
Cstring.h in azione
#include <stdio.h>
#include <string.h>
#include <ctype.h>    // toupper, tolower, isalpha, isdigit

int main() {
    char a[100] = "Hello";
    char b[] = " World!";

    // Concatenazione
    strcat(a, b);
    printf("strcat: %s\n", a);           // Hello World!

    // Lunghezza
    printf("strlen: %zu\n", strlen(a));  // 12

    // Confronto
    printf("strcmp: %d\n", strcmp("abc", "abc"));  // 0
    printf("strcmp: %d\n", strcmp("abc", "abd"));  // negativo

    // Cerca sottostringa
    char *pos = strstr(a, "World");
    if (pos) printf("'World' trovato a posizione %ld\n", pos - a);

    // Converti in uppercase con ctype.h
    char copia[100];
    strcpy(copia, "hello world");
    for (int i = 0; copia[i]; i++) copia[i] = toupper(copia[i]);
    printf("Uppercase: %s\n", copia);

    // Controlla se una stringa contiene solo cifre
    char test[] = "12345";
    int solo_cifre = 1;
    for (int i = 0; test[i]; i++) {
        if (!isdigit(test[i])) { solo_cifre = 0; break; }
    }
    printf("'%s' solo cifre? %s\n", test, solo_cifre ? "Sì" : "No");

    return 0;
}
🏋️ Esercizi
Padroneggia array e stringhe con questi esercizi.
1
Statistiche su array
FacileArray

Leggi N interi (max 100). Calcola e stampa: minimo, massimo, media, somma. Poi stampa l'array ordinato in modo crescente (usa bubble sort o selection sort).

C
#include <stdio.h>

int main() {
    int arr[100], n;
    printf("Quanti numeri? ");
    scanf("%d", &n);
    for (int i = 0; i < n; i++) { printf("arr[%d]: ", i); scanf("%d", &arr[i]); }

    int min = arr[0], max = arr[0];
    long long somma = 0;
    for (int i = 0; i < n; i++) {
        if (arr[i] < min) min = arr[i];
        if (arr[i] > max) max = arr[i];
        somma += arr[i];
    }
    printf("Min: %d, Max: %d, Media: %.2f, Somma: %lld\n",
           min, max, (double)somma/n, somma);

    // Bubble sort
    for (int i = 0; i < n-1; i++)
        for (int j = 0; j < n-i-1; j++)
            if (arr[j] > arr[j+1]) { int t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=t; }

    printf("Ordinato: ");
    for (int i = 0; i < n; i++) printf("%d ", arr[i]);
    printf("\n");
    return 0;
}
2
Conta vocali e consonanti
FacileStringhe / ctype

Leggi una frase (con spazi). Conta: vocali, consonanti, spazi, cifre e altri caratteri. Stampa anche la frase capovolta.

C
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
    char frase[200];
    printf("Inserisci una frase: ");
    fgets(frase, sizeof(frase), stdin);
    frase[strcspn(frase, "\n")] = '\0';

    int vocali=0, consonanti=0, spazi=0, cifre=0, altri=0;
    char vocali_str[] = "aeiouAEIOU";

    for (int i = 0; frase[i]; i++) {
        char c = frase[i];
        if (strchr(vocali_str, c)) vocali++;
        else if (isalpha(c)) consonanti++;
        else if (c == ' ') spazi++;
        else if (isdigit(c)) cifre++;
        else altri++;
    }

    printf("Vocali: %d, Consonanti: %d, Spazi: %d, Cifre: %d, Altri: %d\n",
           vocali, consonanti, spazi, cifre, altri);

    // Capovolgi
    int len = strlen(frase);
    printf("Capovolta: ");
    for (int i = len-1; i >= 0; i--) printf("%c", frase[i]);
    printf("\n");
    return 0;
}
3
Moltiplicazione di matrici
MedioArray 2D

Leggi due matrici A (MxK) e B (KxN). Calcola e stampa il prodotto C = A×B (matrice MxN). Per calcolare C[i][j], somma A[i][k]*B[k][j] per k da 0 a K-1.

C
#include <stdio.h>
#define MAX 10

void stampa(int m[][MAX], int r, int c) {
    for (int i=0; i<r; i++) {
        for (int j=0; j<c; j++) printf("%6d", m[i][j]);
        printf("\n");
    }
}

int main() {
    int A[MAX][MAX], B[MAX][MAX], C[MAX][MAX] = {0};
    int M, K, N;
    printf("A righe, colonne/righe B, B colonne (M K N): ");
    scanf("%d %d %d", &M, &K, &N);

    printf("Inserisci A (%dx%d):\n", M, K);
    for (int i=0; i<M; i++) for (int j=0; j<K; j++) scanf("%d", &A[i][j]);

    printf("Inserisci B (%dx%d):\n", K, N);
    for (int i=0; i<K; i++) for (int j=0; j<N; j++) scanf("%d", &B[i][j]);

    for (int i=0; i<M; i++)
        for (int j=0; j<N; j++)
            for (int k=0; k<K; k++)
                C[i][j] += A[i][k] * B[k][j];

    printf("\nA:\n"); stampa(A,M,K);
    printf("B:\n"); stampa(B,K,N);
    printf("C = A x B:\n"); stampa(C,M,N);
    return 0;
}
4
Tokenizer — split di una stringa
Mediostrtok / stringhe

Leggi una frase. Separala in parole usando strtok(). Stampa ogni parola su una riga con la sua lunghezza. Poi stampa la parola più lunga e quella più corta.

C
#include <stdio.h>
#include <string.h>

int main() {
    char frase[200];
    printf("Inserisci una frase: ");
    fgets(frase, sizeof(frase), stdin);
    frase[strcspn(frase, "\n")] = '\0';

    char lunga[50] = "", corta[50] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    int conta = 0;

    char *token = strtok(frase, " \t");
    while (token != NULL) {
        int len = strlen(token);
        printf("  %-20s (lunghezza: %d)\n", token, len);
        conta++;

        if (len > (int)strlen(lunga)) strcpy(lunga, token);
        if (len < (int)strlen(corta))  strcpy(corta, token);

        token = strtok(NULL, " \t");
    }

    printf("\nTotale parole: %d\n", conta);
    printf("Più lunga:  %s\n", lunga);
    printf("Più corta:  %s\n", corta);
    return 0;
}
5
Anagramma e cifrario di Cesare
DifficileStringhe avanzato

Parte A: verifica se due parole sono anagrammi (stesse lettere in ordine diverso). Parte B: implementa il cifrario di Cesare — cifra e decifra una stringa con uno spostamento K (solo lettere, mantieni maiuscole/minuscole, ignora altri caratteri).

C
#include <stdio.h>
#include <string.h>
#include <ctype.h>

// PARTE A: Anagramma
int sono_anagrammi(char *a, char *b) {
    if (strlen(a) != strlen(b)) return 0;
    int freq[256] = {0};
    for (int i=0; a[i]; i++) freq[(unsigned char)tolower(a[i])]++;
    for (int i=0; b[i]; i++) freq[(unsigned char)tolower(b[i])]--;
    for (int i=0; i<256; i++) if (freq[i] != 0) return 0;
    return 1;
}

// PARTE B: Cifrario di Cesare
void cesare(char *str, int k, int cifra) {
    for (int i=0; str[i]; i++) {
        if (isalpha(str[i])) {
            char base = isupper(str[i]) ? 'A' : 'a';
            if (cifra)
                str[i] = base + (str[i] - base + k) % 26;
            else
                str[i] = base + (str[i] - base - k + 26) % 26;
        }
    }
}

int main() {
    // Anagramma
    char p1[50], p2[50];
    printf("Prima parola: ");  scanf("%s", p1);
    printf("Seconda parola: "); scanf("%s", p2);
    printf("Anagrammi? %s\n\n", sono_anagrammi(p1, p2) ? "Sì" : "No");

    // Cifrario di Cesare
    char frase[200];
    int k;
    printf("Frase da cifrare: ");
    // Consuma il newline residuo
    while (getchar() != '\n');
    fgets(frase, sizeof(frase), stdin);
    frase[strcspn(frase, "\n")] = '\0';

    printf("Spostamento K: ");
    scanf("%d", &k);

    char copia[200];
    strcpy(copia, frase);

    cesare(copia, k, 1);
    printf("Cifrata:   %s\n", copia);

    cesare(copia, k, 0);
    printf("Decifrata: %s\n", copia);

    return 0;
}