Pagina 1 di 2
Problema con funzione prefixSum in C++

Inviato:
2 gen 2015, 19:40
da xeletro91
Salve a tutti, ho un problema con un programma creato da me in linguaggio c++. dovrei stampare, dato un vettore di N componenti (ad esempio 5) cioè V=(v1,v2,v3,v4,v5), un vettore U=(u1,u2,u3,u4,u5) le cui componenti sono:
u1=v1
u2=v1+v2
u3=v1+v2+v3
u4=v1+v2+v3+v4
u5=v1+v2+v3+v4+v5
io ho scritto il seguente programma, ma credo che ci sia qualcosa che non va, dato che continua a stamparmi valori a caso quando vado a compilare:
- Codice: Seleziona tutto
#include <iostream>
using namespace std;
const int N = 5;
void prefixSum(float x[N], float u[N])
{
int i, j;
int s = 0;
for (i = 0; i < N; i++)
{
for (j = 0; j < N ; j++)
{
s =+ x[j];
u[i] = s;
if(j == i)
{
cout << "u[" << i << "]= " << u[N] << endl;
}
}
}
}
int main()
{
float v[N] = {1.0, 2.0, 3.0, 4.0, 5.0};
float y[N];
prefixSum(v, y);
return 0;
}
Re: Problema con funzione prefixSum in C++

Inviato:
2 gen 2015, 20:00
da fairyvilje
Sicuro di quel "s =+ x[j];" ?
Non è l'unico problema che si vede in realtà.
Re: Problema con funzione prefixSum in C++

Inviato:
2 gen 2015, 20:09
da xeletro91
Ciao scusa, mi sono accorto di aver commesso un grave errore, cioè sulla riga:
cout << "u[" << i << "]= " << u[N] << endl;
..ho inserito u[N] invece di u[i], ora non mi stampa più valori a caso perché l'ho inizializzata, però stampa somme che sono non corrette, se ci fai caso ho inserito per esempio le componenti di v che sono 1,2,3,4,5;
le componenti di u che stampa sono ora: 1, 18, 36,55,75, anziché le tanto sperate 1, 3, 6, 10 ,15. C'è ancora qualcosa che non va, poi per quanto riguarda la riga che hai detto tu, si è il contrario per la fretta mi sono sbagliato, sarebbe s += x[j].
Re: Problema con funzione prefixSum in C++

Inviato:
2 gen 2015, 20:10
da fairyvilje
Visto che non mi costa niente ti posto una soluzione più adeguata. L'idea sarebbe che dovresti analizzare il codice e capirlo :). NON L'HO TESTATO!
- Codice: Seleziona tutto
void prefix_sum(const float* src, float *dest, unsigned int len){
//Assumo che dest sia già pulito a zero... altrimenti
//for(unsigned int c=0;c<len;c++)dest[c]=0;
for(unsigned int i=0;i<len;i++){
for(unsigned int j=0;j<=i;j++)dest[i]+=src[j];
}
}
Re: Problema con funzione prefixSum in C++

Inviato:
2 gen 2015, 20:11
da xeletro91
tra l'altro se tolgo l'If mi stampa 1,3,6,10,15 ma poi continua a stampare somme fino a 75.
Re: Problema con funzione prefixSum in C++

Inviato:
2 gen 2015, 20:13
da fairyvilje
Questo perché il tuo codice è sbagliato :).
Re: Problema con funzione prefixSum in C++

Inviato:
2 gen 2015, 20:14
da xeletro91
Guarda ti ringrazio per la risposta, sono sicuro che sia giusta però quello che studio io è molto meno complicato, sono di ingegneria meccanica e questo è il mio terz'ultimo esame (tra l'altro è del primo). Noi ci limitiamo ad usare i for qualche array multidimensionale, funzioni come void ecc... niente di più di quanto abbia scritto sul programma. comunque ti ringrazio ancora per il suggerimento ;)
Re: Problema con funzione prefixSum in C++

Inviato:
2 gen 2015, 20:17
da fairyvilje
Perdonami ed io cosa avrei usato di diverso di grazia D:?
Ad ogni modo questa versione è migliore di quella postata in precedenza da me per vari motivi.
- Codice: Seleziona tutto
void prefix_sum(const float* src, float *dest, unsigned int len){
float s=0;
for(unsigned int i=0;i<len;i++){
s+=src[i];
dest[i]=s;
}
}
Re: Problema con funzione prefixSum in C++

Inviato:
2 gen 2015, 20:29
da xeletro91
si ora notando con più precisione, mi accorgo che non hai aggiunto nessuna strana "diavoleria", però avrei un paio di domande da farti:
len sarebbe la dimensione dei vettori giusto? se fosse così perché lo hai inserito nell'argomento della funzione void?? non sarebbe uguale immetterla come costante globale al di fuori sia di void che del main???
Per quale motivo hai inizializzato a zero l'array u (tu l'hai chiamato dest senon vado errato) ???
scusami ancora e grazie per la pazienza.
Re: Problema con funzione prefixSum in C++

Inviato:
2 gen 2015, 20:31
da xeletro91
Ho risolto, ho visto la tua seconda versione e funziona alla grande Grazie mille!!!!!