Ecco il testo dell'esercizio della seconda parte dell'esonero dell'anno scorso (parte bonus).
N.B: l'anno scorso non avevo concluso il capitolo delle classi al momento dell'esonero, quindi l'esercizio non riguardava le classi. Quest'anno invece l'esercizio che proporrò richiederà anche la dichiarazione e definizione di una classe.
Si scriva un programma C++ che:
a) legga dieci valori int da tastiera e li memorizzi in un array v. I valori saranno forniti in ordine crescente.
b) Allochi un array w di dimensione n pari al numero di elementi differenti di v, e vi copi tali elementi.
c) Sostituisca ad ogni elemento w[i] la somma degli elementi w[i]+...+w[n-1] (MEDIANTE FUNZIONE RICORSIVA)
d) Chiami, per ogni w[i], la funzione int Sum(int* p) che sommi il valore w[i] ad un accumulatore interno e restituisca il totale t accumulato (DEFINIRE
e) Stampi v, w e t.
Ogni punto deve essere svolto realizzando almeno una funzione separata, chiamata dal main.
v, w e t devono essere dichiarate nel main.
2 commenti:
Salve prof. Panizzi scusi il disturbo ma non mi è chiara una cosa... Nella soluzione la funzione
int Sostituisci(int* w, int n)
{ if (n == 0)
return 0;
w[0] = w[0] + Sostituisci(w+1, n-1);
return w[0];
}
è sbagliata o non ho capito il testo dell'esercizio?
Perché questa funzione, ipotizzando un vettore
w = 1 2 3 5 6 7 8
restituisce un vettore
w = 32 31 29 26 21 15 8
mentre dal testo sembra che il risultato debba essere
w = 1 3 6 11 17 24 32
insomma, frutto di una cosa simile
int Sostituisci(int* w,int n){
if(n==0)
return 0;
w[n-1]+=Sostituisci(w,n-1);
return w[n-1];
}
(Senza considerare l'ipotesi che potesse volere addirittura la somma dei valori PRECEDENTI alla modifica ricorsiva, insomma tipo w = 1 3 5 8 11 13 15 ma non credo...)
Veramente mi sembra corretta, perché nel punto c è richiesto di sostituire ad ogni elemento la somma degli elementi successivi, non precedenti.
Posta un commento