Soluzioni della Prova Intermedia

Si ricorda che ci sono molte possibili soluzioni per la prova intermedia. Ne presentiamo una su questa pagina ed un'altra qui.

Esercizio 1 (max 9 punti). Scrivere un programma che presi in input due caratteri c1, c2 e un intero positivo n, stampa una forma come si deduce dai seguenti esempi (c1 = '#' e c2 = '-'):

n = 1    n = 2      n = 3          n = 4
#-#      ###-#      #####-#        #######-#
          #-###      ###-###        #####-###
                      #-#####        ###-#####
                                      #-#######

Soluzione

#include <stdio.h>

int main() {
    char c1, c2; int n;
    int i, j;
    scanf("%c%c%d", &c1, &c2, &n);
    for(i = 0; i < n; i ++) {
        for(j = 0; j < i; j ++) printf(" ");
        for(j = 0; j < n-i-1; j ++) printf("%c%c", c1, c1);
        printf("%c%c%c", c1, c2, c1);
        for(j = 0; j < i; j ++) printf("%c%c", c1, c1);
        printf("\n");
    }
}

Esercizio 2 (max 8 punti). Scrivere una funzione int valcom(int A[], int B[], int n) che presi in input due array di dimensione n, ritorna il numero di valori distinti in comune tra i due array. Ad esempio, se A = {-1,0,-1,2,1} e B = {5,-1,-1,7,0}, la funzione ritorna 2, se invece A = {1,2,3,4} e B = {0,0,6,7}, ritorna 0.

Soluzione

int valcom(int A[], int B[], int n) {
    int c = 0; int i, j;
    for(i = 0; i < n; i ++) {
        int already = 0;
        for(j = 0; j < i; j ++) if(A[i] == A[j]) already = 1;
        if (already) continue;
        for(j = 0; j < n; j ++) if(A[i] == B[j]) { c ++; break; }
    }
    return c;
}

Esercizio 3 (max 10 punti). Scrivere una funzione int wcount(char *text) che presa in input una stringa text ritorna il numero di parole nella stringa che iniziano e finiscono con la stessa lettera (senza differenziare tra maiuscole e minuscole). Con parola si intende una sequenza di caratteri alfabetici maiuscoli o minuscoli di lunghezza massimale. Ecco alcuni esempi:

"L'aiuola e' piena di istrici"   ->  4   "That's great! Wow!"  ->  3
"Invio' l'SOS (risposero Aloha)" ->  3   "cotto (tonto)"       ->  0

Soluzione

int wcount(char* text) {
    int parola = 0;
    char start = 0;
    int i; int np = 0;
    for(i = 0; i < strlen(text); i ++) {
        char c = tolower(text[i]);
        if(!parola) {
            if(isalpha(c)) {
                parola = 1;
                start = c;
            }
        } else {
            if(!isalpha(c)) {
                parola = 0;
                if(tolower(text[i-1]) == start) np ++;
            }
        }
    }
    if(parola && tolower(text[i-1]) == start) np ++;
    return np;
}

Esercizio 4 (max 9 punti). Scrivere una funzione int *chareplace(char **strA, int n, char c1, char c2) che preso in input un array di n stringhe strA sostituisce, in tutte le stringhe, il carattere c1 con il carattere c2 e ritorna un array di n interi, allocato dinamicamente, che nell'i-esimo elemento contiene il numero di sostituzioni effetuate nella i-esima stringa. Ecco un esempio, con c1 = 'o' e c2 = 'X':

Array di stringhe    Array dopo la sostituzione     Array ritornato
0 --> "Rosso"        0 --> "RXssX"                  {2,0,1,1}
1 --> "Verde"        1 --> "Verde"
2 --> "Giallo"       2 --> "GiallX"
3 --> "Oro"          3 --> "OrX"

Soluzione

int* chareplace(char** strA, int n, char c1, char c2) {
    int* ret = malloc(n*sizeof(int));
    int i, j;
    for(i = 0; i < n; i ++) {
        ret[i] = 0;
        char* str = strA[i];
        for(j = 0; j < strlen(str); j ++) {
            if(str[j] == c1) {
                str[j] = c2;
                ret[i] ++;
            }
        }
    }
    return ret;
}

Esercizio 5 (max 11 punti). Scrivere una funzione int submatrix(int n, char M[n][n], char x, int k, int *pr, int *pc) che presa in input una matrice M di n×n caratteri, se M contiene una sottomatrice di k×k caratteri tutti uguali a x, ritorna 1 e restituisce in *pr, *pc gli indici di riga e colonna dove inizia la sottomatrice, altrimenti ritorna 0. Se c'è più di una sottomatrice restituisce gli indici di una qualsiasi di queste. Ad esempio, se la matrice M è

ABBCX
Zaaaa
ZBaaa
Baaaa
aNMJK

la chiamata submatrix(5, M, 'a', 3, &r, &c) ritorna 1 e restituisce 1 in r e 2 in c.

Soluzione

int submatrix(int n, char M[n][n], char x, int k, int *pr, int *pc) {
    int i, j, ii, jj;
    for(i = 0; i < n-(k-1); i ++) {
        for(j = 0; j < n-(k-1); j ++) {
            char c = M[i][j];
            int all = 1;
            for(ii = i; ii < i+k; ii ++) {
                for(jj = j; jj < j+k; jj ++) {
                    if (M[ii][jj] != c) all = 0;
                }
            }
            if(all) {
                *pr = i;
                *pc = j;
                return 1;
            }
        }
    }
    return 0;
}