Fondamenti di Programmazione     a.a. 2011-2012
Soluzioni esercizi di preparazione alla prova intermedia 2011


Soluzione esercizio 1
#include <stdio.h>

int main() {
    int n;
    printf("inserire un intero: ");
    scanf("%d", &n);
    int plus = 2 - (n % 2);     //numero di '+' nella prima riga
    for (int r = 0 ; r < n ; r++) {
        int minus = (n - plus)/2;   //numero di '-' prima e dopo i '+'
        for (int c = 0 ; c < minus ; c++) printf("-");
        for (int c = 0 ; c < plus ; c++) printf("+");
        for (int c = 0 ; c < minus ; c++) printf("-");
        printf("\n");
        if (r < n/2) plus += 2;     //numero di '+' della prossima riga
        else plus -= 2;
        if (plus > n) plus = n;
    }
    return 0;
}
Soluzione esercizio 2
void minmax(float A[], int n) {
    int i, imin = 0, imax = 0;   /* imin e imax conterranno le posizioni
                                    del valori minimo e massimo. */
    for (i = 1 ; i < n ; i++) {
        if (A[i] < A[imin])
            imin = i;
        if (A[i] > A[imax])
            imax = i;
    }
    float x = A[imin];     //scambia il minimo con il massimo
    A[imin] = A[imax];
    A[imax] = x;
}
Soluzione esercizio 3
/* funzione ausiliaria che ritorna true se il carattere c appare nella
 * stringa s, altrimenti ritorna false. */
int charinstr(char c, char *s) {
    int i = 0;
    while (s[i] != '\0' && s[i] != c) i++;
    return (s[i] == c);
}

int maxsubstr(char *s, char *sc) {
    int i, len = 0, max = 0;
    for (i = 0 ; s[i] != '\0' ; i++) {
        if (charinstr(s[i], sc)) {
            len++;
            if (len > max) max = len;
        } else
            len = 0;
    }
    return max;
}
Soluzione esercizio 4
/* funzione ausiliara che ritorna il massimo della riga r della matrice M */
float maxR(int n, float M[n][n], int r) {
    float max = M[r][0];
    for (int i = 1 ; i < n ; i++)
        if (M[r][i] > max) max = M[r][i];
    return max;
}

/* funzione ausiliaria che ritorna il minimo della colonna c della matrice M */
float minC(int n, float M[n][n], int c) {
    float min = M[0][c];
    for (int i = 1 ; i < n ; i++)
        if (M[i][c] < min) min = M[i][c];
    return min;
}

int saddle(int n, float M[n][n]) {
    int j = 0;
    while (j < n && maxR(n, M, j) != minC(n, M, j))
        j++;
    if (j < n) return j;
    else return -1;
}
Soluzione esercizio 5
#include <stdlib.h>

int *maxind(int V[], int n, int *nMax) {
    int *ind = NULL;    //Inizializza i valori di ind e *nMax cosicche'
    *nMax = 0;          //se n <= 0 ritorna NULL e in *nMax restituisce 0.
    if (n > 0) {
        int i, k, max = V[0];
        for (i = 1 ; i < n ; i++)           //Calcola il valore massimo di V
            if (V[i] > max) max = V[i];
        for (i = 0 ; i < n ; i++)           //Calcola il numero di elementi di V
            if (V[i] == max) (*nMax)++;     //con valore massimo.
        ind = malloc((*nMax)*sizeof(int));  //Alloca il nuovo array
        for (k = 0, i = 0 ; i < n ; i++)    //Scrivi nel nuovo array gli indici
            if (V[i] == max) ind[k++] = i;  //degli elementi con valore massimo.
    }
    return ind;
}