Prova scritta di Elementi di Programmazione 23 giugno 2009 1

Transcript

Prova scritta di Elementi di Programmazione 23 giugno 2009 1
Prova scritta di Elementi di Programmazione 23 giugno 2009
1) Dato il seguente programma
# include <iostream.h>
# include <stdlib.h>
/*01*/struct nano di Biancaneve
/*02*/ {static enum nano
/*03*/ {brontolo, cucciolo, dotto, eolo,
/*04*/ gongolo, mammolo, pisolo, illegolo} nano;
/*05*/ char * const nome;
/*06*/ nano di Biancaneve(int);};
/*07*/ nano di Biancaneve :: nano nano di Biancaneve :: nano;
/*08*/ nano di Biancaneve :: nano di Biancaneve(int n)
/*09*/ {nano = static cast< nano>(n % static cast<int>(illegolo));
/*10*/ switch(nano)
/*11*/ {case brontolo:
/*12*/ nome = "brontolo";
/*13*/ break;
/*14*/ case cucciolo:
/*15*/ nome = "cucciolo";
/*16*/ break;
/*17*/ case dotto:
/*18*/ nome = "dotto";
/*19*/ break;
/*20*/ case eolo:
/*21*/ nome = "eolo";
/*22*/ break;
/*23*/ case gongolo:
/*24*/ nome = "gongolo";
/*25*/ break;
/*26*/ case mammolo:
/*27*/ nome = "mammolo";
/*28*/ break;
/*29*/ case pisolo:
/*30*/ nome = "pisolo";
/*31*/ break;
/*32*/ case illegolo: default: nome = "un nome illegittimo";}}
/*33*/int main(int narg, char * * args, char * * env)
/*34*/ {if(narg == 1) {cout << "mancano argomenti validi\n"; return 255;}
/*35*/ int i = atoi(args[1]);
/*36*/ nano di Biancaneve nano(i-1);
/*37*/ cout << "si tratta di " << nano . nome << endl;
/*38*/ return 0;}
dire quali tra le affermazioni qui appresso riportate corrispondono a verità, argomentando
la risposta:
• il programma si compila senza errori;
• il programma non si compila perché ci sono degli errori (dire quali o motivare dettagliatamente le affermazioni successive);
• la dichiarazione di una enum (riga 02) non può essere qualificata come static;
• la dichiarazione di nome (riga 05) è sbagliata perché il qualificatore const non può stare
in quella posizione;
• una struct non può avere una funzione costruttore (riga 06): andrebbe eventualmente
sostituito con un metodo static, oppure la struct dovrebbe diventare una class;
• la riga 07 non ha alcun senso: il compilatore non riesce assolutamente a comprenderne il
significato e segnala errore dichiarando di riprendere l’analisi del testo dalla riga 08;
• la riga 08, peraltro, produce ancora errore, secondo quanto già affermato due voci fa;
• nell’ambito della funzione che inizia alla riga 08, anche la riga 09 produce errore, per
erroneo impiego dell’operatore static cast che non può comparire due volte nella stessa
espressione;
• tutte le assegnazioni di valore a nome, nei diversi case dello switch, sono sbagliate,
perché eseguite con stringhe di lunghezza diversa;
• la riga 36 dà errore perché nano è già stato dichiarato alla riga 07;
• tutte le assegnazioni di valore a nome, nei diversi case dello switch, sono sbagliate,
perché confliggono con la dichiarazione stessa di nome;
• c’è un errore nella enum perché non esiste un ottavo nano di Biancaneve, e, se anche ci
fosse, non si chiamerebbe illegolo.
2) Supposto corretto o emendato da ogni errore, secondo quanti (e quali) ne siano stati
debitamente segnalati, dire che cosa apparirà su stdout dopo le seguenti esecuzioni:
• a.out
• a.out 2
• a.out -2
• a.out -6
3) Una “pallina pazza” è rappresentata da una sfera con una distribuzione di massa riconducibile, in un certo sistema cartesiano con l’origine nel centro geometrico della pallina,
alla funzione non negativa η(x, y, z) gm/cm3 , sprovvista di qualsiasi proprietà di simmetria.
Scrivere una funzione C++ che, ricevuta la funzione η come argomento (trasferito come
puntatore a funzione), valuti e restituisca in un opportuno puntatore a struttura le coordinate del centro di massa nel sistema cartesiano assegnato e il momento d’inerzia
rispetto all’asse diametrale coincidente con l’asse z dello stesso sistema.
Facoltativamente fare restituire alla citata funzione, nel citato puntatore e per il citato
sistema di riferimento, l’intero tensore d’inerzia.