12 novembre 2007

Esercizio

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 LA FUNZIONE Sum())

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.


Soluzione

2 commenti:

Anonimo ha detto...

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...)

Emanuele Panizzi ha detto...

Veramente mi sembra corretta, perché nel punto c è richiesto di sostituire ad ogni elemento la somma degli elementi successivi, non precedenti.