Fondamenti di Programmazione    a.a. 2011-2012
Esercizi di preparazione alla prova intermedia 2011
Si possono consultare libri e appunti ma non è permesso usare computer. Avvertenze: non usare variabili globali; definire tutte le funzione ausiliarie usate; è consentito usare le funzioni della libreria standard; se una soluzione non è scritta in modo chiaro ed ordinato non sarà presa in considerazione.
Esercizio 1 (max 8 punti)
Scrivere un programma che presi in input un carattere c e un intero dispari n, stampa una forma, simile a una clessidra, come si deduce dai seguenti esempi (c = '*'):
 n = 1    n = 3    n = 5     n = 7
   *       ***     *****    *******
            *       ***      *****
           ***       *        ***
                    ***        *
                   *****      ***
                             *****
                            *******
Esercizio 2 (max 11 punti)
Dato un array A, diciamo che A ha un gap di misura g se esistono due valori x < y in A tali che y - x = g e non esistono in A valori z tali che x < z < y. Scrivere una funzione int maxgap(int A[], int n) che preso in input un array A di n interi, ritorna la misura massima di un gap in A. La funzione non deve modificare l'array preso in input. Ad esempio, se A = {1, 3, 1, 7} la funzione ritorna 4 (7 - 3 = 4), se A = {7, 5, 2, 13} ritorna 6 (13 - 7 = 6), se A = {2, -3, 5, 2, 6} ritorna 5 (2 - (-3) = 5).
Esercizio 3 (max 10 punti)
Scrivere una funzione int longest_run(char *s, char c) che ritorna la posizione della più lunga sottostringa della stringa s composta solamente dal carattere c. Se il carattere c non appare in s, ritorna -1. Ad esempio, se s = "not running" e c = 'n' ritorna 6, se s = "10*(100+1000) = 11000" e c = '0' ritorna 9.
Esercizio 4 (max 9 punti)
Scrivere una funzione int charcount(char *sA[], int n, char c) che ritorna il numero totale di occorrenze del carattere c in tutte le stringhe dell'array sA. Ad esempio, se sA = {"rosso", "verde", "giallo", "grigio"} e c = 'o', la funzione ritorna 4.
Esercizio 5 (max 11 punti)
Data una matrice M e un suo valore v, diciamo che v è un massimo locale se v è maggiore od uguale a tutti i valori che si trovano sulla riga e sulla colonna di v. Scrivere una funzione double *localmaxval(int n, double M[n][n], int *cnt) che ritorna in un array, allocato dinamicamente, i valori della matrice M che sono massimi locali e restituisce in *cnt il numero di tali valori. Ad esempio, se n = 4 e la matrice M è
  0.2     5.0     5.0     5.0
  2.8     3.0     1.6     4.3
 11.2    22.4     2.7     3.5
  4.5    10.2     3.4     0.7
allora la funzione ritorna un array che contiene {5.0, 5.0, 22.4} (l'ordine dei valori non conta) e in *cnt restituisce il valore 3.