Correzione di un esercizio su prodotto scalare di due vettori

di Anonimizzato20404 il
43 risposte
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

  • 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.
  • 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;
    	
    }
    
  • 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
  • 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?
  • 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);
  • 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!
  • 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?
  • 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é ?!
  • 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.
  • 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.
  • 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.
  • 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..
  • 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.
  • 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