[C++] norma di un vettore
stavo cercando di implementare una funzione che restituisse la norma di un vettore con componenti prese da un file. a me sembra sia corretta dal punto di vista dell'implementazione ma se provo a farla funzionare mi restituisce zero, che è sbagliato
una piccola precisazione sul file: nella prima riga si ha la dimensione del vettore.il codice che ho scritto è:
per quanto riguarda la vera e propria implementazione:
nel main invece ho fatto così:
grazie a chiunque mi risponderà

una piccola precisazione sul file: nella prima riga si ha la dimensione del vettore.il codice che ho scritto è:
per quanto riguarda la vera e propria implementazione:
double modulo(double *s, unsigned int dim){ double x=0; for(int i=0; i<dim; i++){ x=x+pow((s[i]),2); } return sqrt(x); }
nel main invece ho fatto così:
ifstream ingresso; ingresso.open("risultati.txt"); ingresso>>dim; double *v=new double[dim]; g=modulo(v,dim); cout<<"la norma è: "<<g<<endl; ingresso.close();
grazie a chiunque mi risponderà
Risposte
Nel tuo codice manca la lettura del vettore.
quindi dovrei fare così?
o basta semplicemente che metta [inline]ingresso>>v[dim][/inline]?
ad ogni modo grazie per la disponibilità!
int i=0; while(!ingresso.eof){ ingresso>>v[dim]; i++; }
o basta semplicemente che metta [inline]ingresso>>v[dim][/inline]?
ad ogni modo grazie per la disponibilità!
Nessuno dei due. SI fa esattamente come faresti per l'inserimento da tastiera. Sono inoltre necessari dei test per controllare che tu non stia uscendo dai limiti dell'array. Per esempio [inline]v[dim][/inline] non è un elemento dell'array.
ho corretto in questo modo:
inoltre il vettore v che prima avevo creato dinamicamente in modo errato dandogli una lunghezza prefissata l'ho dichiarato staticamente ([inline]double v[dim][/inline]). a questo punto, dandogli io una lunghezza nota (prima riga del fil che leggo), credo non servano più i controlli per il limite del vettore o sbaglio?
int i=0; while(!ingresso.eof()){ ingresso>>v[i]; i++; }
inoltre il vettore v che prima avevo creato dinamicamente in modo errato dandogli una lunghezza prefissata l'ho dichiarato staticamente ([inline]double v[dim][/inline]). a questo punto, dandogli io una lunghezza nota (prima riga del fil che leggo), credo non servano più i controlli per il limite del vettore o sbaglio?
L'allocazione era corretta prima, o meglio era più corretta prima. Nota che non stai allocando staticamente, ma allocando "dinamicamente" nello stack. Questa operazione non è ammessa dallo standard C++ ma solo come estensione di GCC. Detto questo, nulla che viene letto da file o tastiera può essere ritenuto noto o sicuro. In particolare non puoi fidarti sul fatto che il numero fornito sia effettivamente uguale al numero di elementi. Preoccuparti di minimizzare il numero di test in un ciclo che si occupa di IO è piuttosto inutile.
Detto questo, cosa ti fa pensare che un array statico non necessiti di controlli?
Detto questo, cosa ti fa pensare che un array statico non necessiti di controlli?
credevo che non ce ne fosse bisogno perchè sapendo per certo che la dimensione era quella, dato che il file è stato creato dai prof penso apposta, ero sicuro di non andare in zona di memoria non allocata.
Una piccola osservazione: non ha senso usare la funzione pow per calcolare il quadrato di un numero. pow((s[ i ]),2) è infatti più lungo da scrivere e più complicato di s[ i ]*s[ i ].. Esiste inoltre un operatore += in C++ che combina la somma e l'assegnamento. Avrei insomma riscritto la tua riga più interna al ciclo come segue:
Mi sembra decisamente più leggibile e chiaro come codice..
// Era x=x+pow((s[i]),2); x += s[i]*s[i];
Mi sembra decisamente più leggibile e chiaro come codice..
lo terrò present per il futuro allora! grazie dei consigli.
