COMMENTI SULL'ESAME DI FONDAMENTI DI INFORMATICA DEL 15/6/2020 ============================================================== - I compiti sono stati valutati molto generosamente, essendo la prima volta con le nuove modalita' d'esame telematiche. Pertanto, invito a riflettere *molto seriamente* prima di rifiutare un voto valido, perche' a partire dal prossimo appello il livello degli esercizi tornera' ad essere quello di sempre (vedi compiti degli anni precedenti), e le valutazioni saranno piu' stringenti. - Come detto a lezione, una asserzione del tipo {p = 5*p} non ha senso, perche' le asserzioni vengono interpretate come se fossero espressioni matematiche. Quindi scrivere quanto sopra equivale a scrivere {1 = 5} (semplificando per p), che non ha senso. - Esercizio sulla mediana: la mediana non e' necessariamente l'elemento che occupa la posizione centrale di un array; lo e' se e solo se l'array e' ordinato, il che non e' garantito dalla specifica dell'esercizio. La soluzione proposta non ordina esplicitamente l'array passato come parametro, ma e' corretto anche ordinare l'array e poi restituire l'elemento in posizione centrale, come fatto in alcune delle soluzioni consegnate. - Come spiegato a lezione, non e' possibile restituire un puntatore ad un array temporaneo. In altre parole, questa funzione non e' corretta (e il compilatore segnala un warning: "function returns address of local variable"): int *f( void ) { int result[10]; return result; } La ragione e' che gli array definiti in questo modo (con la lunghezza tra parentesi quadre) sono visibili solo all'interno del blocco in cui sono dichiarati, esattamente come le variabili. Invece, la memoria riservata con la malloc() e' disponibile sempre, fino a quando non viene liberata con la free(). - Attenzione alle stringhe. Si consideri l'esempio seguente: int n = strlen(s); char *r = (char*)malloc(n+1); (si puo' omettere la moltiplicazione dell'argomento della malloc() per sizeof(char), perche' quest'ultimo e' garantito valere 1). La stringa r puo' contenere n caratteri + il terminatore, esattamente come s. Se si vuole riservare spazio per (n+1) caratteri + il terminatore, occorre scrivere: char *r = (char*)malloc(n+2); (e ricordarsi di scrivere esplicitamente il terminatore finale).