Correzione di un esercizio su prodotto scalare di due vettori

di il
43 risposte

Correzione di un esercizio su prodotto scalare di due vettori

Salve ragazzi, ho un problema con questo esercizio:
sviluppare una funzione che realizzi un prodotto scalare tra due vettori ed implementarla nel main.

Ora, io sviluppato un programma del genere:
/* Esercizio 1
Sviluppare una funzione che realizzi il prodotto scalare di due vettori.
Implementarla nel programma. */

/*Il prodotto scalare tra due vettori è dato dalla sommatoria dei prodotti degli elementi nelle stesse posizioni.
Quindi il prodotto scalatra due vettori dati:
a = (a', a'', a''')
b = (b', b'', b''')
è uno scalare pari a [(a'b')+(a''b'')+(a'''b''')]. */


#include <iostream>
using namespace std;

int VMax;

int a;
int b;
int c;
int d;
int i;

void ProdottoScalare (int a, int b, int c){
	for (i=1; i<=VMax; i++){
		c += a*b;
	}
};


int main (){
	
	cout << "Qual e' la lunghezza del vettore desiderata?" << endl;
	cin >> VMax;
	
int VettoreV[VMax];
int VettoreW[VMax];
	
	cout << "Inserisci gli elementi del Vettore V:" << endl;
	for (i=1; i<=VMax; i++){
		cin >> VettoreV[i];
		cout << endl;
	}
	
		cout << "Inserisci gli elementi del Vettore W:" << endl;
	for (i=1; i<=VMax; i++){
		cin >> VettoreW[i];
		cout << endl;
	}
	
a = VettoreV[i];
b = VettoreW[i];

	cout << "Il prodotto scalare tra i due vettori e':" << ProdottoScalare << endl;
	
	
return 0;
	
}
Non va e non capisco perché! Mi da sempre il valore 1, qualsiasi sia il valore che inserisco degli elementi dei vettori.

Sapreste aiutarmi? Grazie.

43 Risposte

  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Mi sembra che tu abbia un pò di confusione.
    Perchè nei tuoi ciclo non parti da 0, ma da 1? Se definisci un array int VettoreV[VMax]; gli indici vanno da 0 a VMax-1.
    Quindi prima di proseguire, ovvero di fare il calcolo, ti suggerisco di stampare a video il contenuto dei due vettori, così prendi confidenza.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Caspita è vero, non so perché ho scritto da 1 a VMax..

    Ho corretto:
    /* Esercizio 1
    Sviluppare una funzione che realizzi il prodotto scalare di due vettori.
    Implementarla nel programma. */
    
    /*Il prodotto scalare tra due vettori è dato dalla sommatoria dei prodotti degli elementi nelle stesse posizioni.
    Quindi il prodotto scalatra due vettori dati:
    a = (a', a'', a''')
    b = (b', b'', b''')
    è uno scalare pari a [(a'b')+(a''b'')+(a'''b''')]. */
    
    
    #include <iostream>
    using namespace std;
    
    int VMax;
    
    int a;
    int b;
    int c;
    int d;
    int i;
    
    void ProdottoScalare (int a, int b, int c){
    	for (i=0; i<VMax; i++){
    		c += a*b;
    	}
    };
    
    
    int main (){
    	
    	cout << "Qual e' la lunghezza del vettore desiderata?" << endl;
    	cin >> VMax;
    	
    int VettoreV[VMax];
    int VettoreW[VMax];
    	
    	cout << "Inserisci gli elementi del Vettore V:" << endl;
    	for (i=0; i<VMax; i++){
    		cin >> VettoreV[i];
    		cout << endl;
    	}
    	
    		cout << "Inserisci gli elementi del Vettore W:" << endl;
    	for (i=0; i<VMax; i++){
    		cin >> VettoreW[i];
    		cout << endl;
    	}
    	
    a = VettoreV[i];
    b = VettoreW[i];
    
    ProdottoScalare; 
    
    	cout << "Il prodotto scalare tra i due vettori e':" << c << endl;
    	
    	
    return 0;
    	
    }
    
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Prova a scrivere una funzione (che poi richiami per l'uno e per l'altro vettore) che ti stampa a video il contenuto di un array; i parametri sono l'array e la dimensione.
    Quando avrai scritto questa funzione e l'avrai richiamata per i due vettori e l'avrai vista funzionare capirai molte cose
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    candaluar ha scritto:


    Prova a scrivere una funzione (che poi richiami per l'uno e per l'altro vettore) che ti stampa a video il contenuto di un array; i parametri sono l'array e la dimensione.
    Quando avrai scritto questa funzione e l'avrai richiamata per i due vettori e l'avrai vista funzionare capirai molte cose
    Intendi dire una funzione void del tipo:

    void StampaContenutoVettoreV (int a, int VMax){
    for (i=0; i<VMax; i++){
    cout << a;
    }
    }


    Con l'uguaglianza a = VettoreV da dichiarare nel main prima di richiamare la suddetta funzione?
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Ti prego, usa i tag CODE.
    Intendi dire una funzione void del tipo:

    void StampaContenutoVettoreV (int a, int VMax){
    for (i=0; i<VMax; i++){
    cout << a;
    }
    }
    Quasi; in realtà in questa funzione c'è un errore!
    Con l'uguaglianza a = VettoreV da dichiarare nel main prima di richiamare la suddetta funzione?

    No, la funzione va richiamata così:
    StampaContenuto(VettoreV,VMax);
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Aspetta, lo so che una funzione si richiama in quel modo, io ho detto un'altra cosa.
    Ho detto solo se dovevo sviluppare quella ugualianza prima di richiamare la funzione!



    Ma voglio chiederti una cosa: non è che sbaglio nella scrittura dell'algoritmo? Ovvero, questa equazione:
     c += a*b;
    mi permette di ottenere la somma del prodotto a e b calcolato dopo ogni 'giro' di ciclo for?

    Perché ho un po' di problemi anche nella costruzione di una funzione che mi permetta di calcolare la media degli N elementi di un vettore. Scrivo questo ciclo for:
    cout << "La media del vettore e':";
    		for (i=0; i<N; i++){
    		x += (Vettore[i]);
    		y = x/N;
    		cout << y;}
    ma mi da un valore matematico finalmente totalmente sbagliato!
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Ho detto solo se dovevo sviluppare quella ugualianza prima di richiamare la funzione!
    Non è un'uguaglianza ma un'assegnazione; non capisco a cosa ti serva.

    Affronta il problema per gradi: hai scritto la funzione di stampa? E funziona, ovvero ti da i risultati che ti aspetti?
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Ok, andiamo per passi.
    Ho provato a fare un programma per la stampa di un vettore:
    /* Stampa di un vettore assegnato. */
    
    #include <iostream>
    using namespace std;
    
    int Vettore[2] = {1,2};
    int i;
    
    void stampaVettore()
    {
    	int Vettore[2];
    	
    	for (i=0; i<2; i++){
    		cout << Vettore[i];
    	}
    }
    
    int main (){
    
    stampaVettore();
    
    return 0;
    }
    Mi stampa i valore -1 e -1, ma perché ?!
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Mi sa che hai molta confusione.
    Sai come si passano i parametri ad una funzione? Alla stampaVettore() dovresti passare l'array e la dimensione.
    Conosci qualcosa della visibilità delle variabili? Perchè se definisci Vettore[] locale allora "oscuri" il Vettore[] globale (con i dati).
    Quindi: prova a passare i parametri come detto.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    candaluar ha scritto:


    Mi sa che hai molta confusione.
    Sai come si passano i parametri ad una funzione? Alla stampaVettore() dovresti passare l'array e la dimensione.
    Conosci qualcosa della visibilità delle variabili? Perchè se definisci Vettore[] locale allora "oscuri" il Vettore[] globale (con i dati).
    Quindi: prova a passare i parametri come detto.
    Ho studiato la teoria riguardo la visibilità e la lifetime delle variabili e anche riguardo i parametri formali ed effettivi delle funzioni.
    Comunque ho eliminato la dichiarazione di un vettore 'locale' all'interno del void ed ho così ottenuto in stampa i numeri 1 e 2, perfetto.

    Io andavo a dichiarare l'esistenza di vettori locali nel main perché dichiarandoli nella fase dichiarativa precedente al main in questo modo:
    int VMAX;
    int VettoreV[VMAX];
    int VettoreW[VMAX];
    mi dava errore proprio nella parentesi quadra del vettore, quindi ho supposto che l'errore era dovuto al fatto che il programma non conosce il valore di VMAX. Ma, al tempo stesso, io devo far inserire dall'utente il valore di VMAX, quindi non posso darglielo già in fase dichiarativa. Ma, al tempo stesso ancora, i due vettori mi servono nel void, quindi devo per forza dichiararli, in qualche modo, prima del main.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Ho studiato la teoria riguardo la visibilità e la lifetime delle variabili e anche riguardo i parametri formali ed effettivi delle funzioni.
    Evidentemente non l'avevi capita.
    mi dava errore proprio nella parentesi quadra del vettore, quindi ho supposto che l'errore era dovuto al fatto che il programma non conosce il valore di VMAX. Ma, al tempo stesso, io devo far inserire dall'utente il valore di VMAX, quindi non posso darglielo già in fase dichiarativa.
    Tu puoi definire VMAX come dimensione massima, es. 100:
    #define VMAX   100
    Poi nel main() dichiari i due array alla dimensione massima:
    int main()
    {
    	int VettoreV[VMAX];
    	int VettoreW[VMAX];
    Poi quando chiedi la dimensione all'utente (supponiamo nella variabile n) verifichi che sia maggiore di 0 (ovviamente) e minore o uguale a VMAX.
    Dopodichè quando richiami tutte le funzioni (per ora hai solo la stampa) passi VettoreV (o VettoreW o tutti e due) assieme al valore n.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Sì ma i vettori alla dimensione massima devo anche richiamarli prima del void (e quindi prima del main), sennò non posso inserirli nel void stesso.
    Il programma che ho fatto, è sviluppato in tre fasi. Ovvero..

    Fase dichiarativa iniziale:
    #include <iostream>
    using namespace std;
    
    #define VMAX 100
    
    int VMax;
    int VettoreV[VMAX];
    int VettoreW[VMAX];
    int x;
    int i;
    Funzione void per la stampa del prodotto scalare:
    void StampaProdottoScalare(int VettoreV[VMAX], int VettoreW[VMAX], int x){
    	for (i=0; i<VMAX; i++){
    		x += VettoreV[i]*VettoreW[i];
    		cout << x;
    	}
    }
    Funzione main con tutti i cout e cin necessari:
    
    int main (){
    	
    	cout << "Qual e' la lunghezza del vettore desiderata?" << endl;
    	cin >> VMax;
    	
    	cout << "Inserisci gli elementi del Vettore V:" << endl;
    	for (i=0; i<VMax; i++){
    		cin >> VettoreV[i];
    		cout << endl;
    	}
    	
    		cout << "Inserisci gli elementi del Vettore W:" << endl;
    	for (i=0; i<VMax; i++){
    		cin >> VettoreW[i];
    		cout << endl;
    	}
    
    cout << StampaProdottoScalare(VettoreV[VMAX], VettoreW[VMAX], x);
    
    return 0;	
    }
    Però mi da errore nel richiamo della funzione void, errore negli elementi nella parentesi tonda..
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Sì ma i vettori alla dimensione massima devo anche richiamarli prima del void (e quindi prima del main), sennò non posso inserirli nel void stesso.
    ma cosa stai dicendo? Suppongo, leggendo il resto, che per "void" indichi la funzione StampaProdottoScalare(): questa funzione non ha bisogno di VettoreV[] e di int VettoreW[]... sei davvero sicuro di aver capito le regole di visibilità?
    Comunque ripeto: predisponi la funzione di stampa e BASTA, al prodotto ci arrivi dopo.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Sì, per void intendo una funzione da sviluppare prima del main e poi richiamarla all'interno.
    Comunque ho predisposto la funzione di stampa prima del main ed è:
    
    void stampaVettore()
    {
       int Vettore[2];
       
       for (i=0; i<2; i++){
          cout << Vettore[i];
       }
    }
    
    Questa funzione mi permette di stampare a video i valori del vettore.
Devi accedere o registrarti per scrivere nel forum
43 risposte