Correzione di un esercizio su prodotto scalare di due vettori

di il
43 risposte

43 Risposte - Pagina 2

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

    L'hai provata? Secondo me no, è errata. Ti consiglio di rivedere le basi delle funzioni (come si definiscono, come si passano gli argomenti, come si restituiscono valori) e le regole di visibilità. Così non si va da nessuna parte.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    candaluar ha scritto:


    L'hai provata? Secondo me no, è errata. Ti consiglio di rivedere le basi delle funzioni (come si definiscono, come si passano gli argomenti, come si restituiscono valori) e le regole di visibilità. Così non si va da nessuna parte.
    Aspetta, scusa, ho sbagliato a scrivere. Ora ti scrivo il programma che ho creato per stampare a video, all'interno puoi vedere la funzione per la stampa del vettore. Scusami, ho il cervello fuso:
    #include <iostream>
    using namespace std;
    
    int Vettore[2] = {1,2};
    int i;
    
    void stampaVettore()
    {	
    	for (i=0; i<2; i++){
    		cout << Vettore[i];
    	}
    }
    
    int main (){
    
    stampaVettore();
    
    return 0;
    }
    E mi da in output video i valori del vettore.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Definisci Vettore[] locale alla funzione main() e fai in modo che stampaVettore() riceva due parametri, un array e la sua dimensione.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    candaluar ha scritto:


    Definisci Vettore[] locale alla funzione main() e fai in modo che stampaVettore() riceva due parametri, un array e la sua dimensione.
    Ok, quindi :
    #include <iostream>
    using namespace std;
    
    int i;
    int N;
    
    void stampaVettore(int Vettore[], int N)
    {	
    	for (i=0; i<N; i++){
    		cout << Vettore[i];
    	}
    }
    
    int main (){
    
    int VettoreV[3] = {1, 2, 3};
    
    stampaVettore(VettoreV, 3);
    
    return 0;
    }
    Ho quindi 'spostato' la dichiarazione del vettore nel main (quindi era prima globale, ora è locale) e poi ho modificato la funzione della stampaVettore aggiungendo dei parametri formali che vengono sostituiti dai parametri effettivi nel main, al momento del 'richiamo' della funzione.

    Ho eseguito e mi da i valori 1, 2, 3.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Ok, perfetto. Ora aggiungi la funzione stampa2Vettori che riceve due array e la dimensione, comune ad entrambi: la stampa deve avvenire con questa sequenza i due valori all'indice [0] di entrambi i vettori, i due valori all'indice [1] ecc...
    Quando anche questa funzione è a posto passiamo al prodotto scalare che, comunque, se ci rifletti un pò, ti risulterà semplicissima!!!

    AGGIUNTA: scusa ho notato solo ora che hai impostato i ed N come globali... NON SERVE, i deve essere locale alla funzione di stampa ed N non serve.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    candaluar ha scritto:


    Ok, perfetto. Ora aggiungi la funzione stampa2Vettori che riceve due array e la dimensione, comune ad entrambi: la stampa deve avvenire con questa sequenza i due valori all'indice [0] di entrambi i vettori, i due valori all'indice [1] ecc...
    Quando anche questa funzione è a posto passiamo al prodotto scalare che, comunque, se ci rifletti un pò, ti risulterà semplicissima!!!

    AGGIUNTA: scusa ho notato solo ora che hai impostato i ed N come globali... NON SERVE, i deve essere locale alla funzione di stampa ed N non serve.
    Ho aggiunto un parametro formale (e quindi uno effettivo poi) ed ho aggiunto un ciclo for per stampare il secondo vettore. Inoltre ho inserito la variabile i all'interno della funzione di stampa, quindi portandola da globale a locale. Ho eliminato la dichiarazione globale di N. Quindi:
    
    #include <iostream>
    using namespace std;	
    
    void stampaDueVettori(int Vettore1[], int Vettore2[], int N)
    int i;
    {	
    	for (i=0; i<N; i++){
    	cout << Vettore1[i];
    }
        cout << endl;
        for (i=0; i<N; i++){
    		cout << Vettore2[i];
    	}
    }
    
    int main (){
    
    int VettoreV[3] = {1, 2, 3};
    int VettoreW[3] = {3, 4, 5};
    
    stampaDueVettori(VettoreV, VettoreW, 3);
    
    return 0;
    }
    In output ottengo effettivamente la stampa di entrambi i vettori. Forse si potrebbe costruire una funzione ancor più semplice per mandare in stampa più vettori, ma credo sia corretta anche questa.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    ho aggiunto un ciclo for per stampare il secondo vettore.
    No, fallo nello stesso ciclo: dato l'input che dai nel main() voglio vedere
    1 3 2 4 3 5
    Inoltre ho inserito la variabile i all'interno della funzione di stampa, quindi portandola da globale a locale.
    ma dove hai messo la i? Te lo compila correttamente? Mi aspetterei:
    void stampaDueVettori(int Vettore1[], int Vettore2[], int N)
    {   
       int i;
       for ...
    e non
    void stampaDueVettori(int Vettore1[], int Vettore2[], int N)
    int i;
    {   
       for ...
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Sì la i l'ho corretta poi, pensavo di aver corretto anche il post nel forum. Chiaramente va dopo la parentesi graffa.
    Quindi, per stampare il vettore nello stesso ciclo for:
    #include <iostream>
    using namespace std;
    
    void stampaDueVettori(int Vettore1[], int Vettore2[], int N)
    {	int i;
    
    	for (i=0; i<N; i++){
    	cout << Vettore1[i] << " " << Vettore2[i] << " ";
    }
    }
    
    int main (){
    
    int VettoreV[3] = {1, 2, 3};
    int VettoreW[3] = {3, 4, 5};
    
    stampaDueVettori(VettoreV, VettoreW, 3);
    
    return 0;
    }
    E stampa in output i valori dei vettori come da te richiesti.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Prova ora a riscrivere la funzione che calcola il prodotto scalare, partendo come base dalla stampaDueVettori().
    Considera che il valore di ritorno ora sarà int e non più void.
    Se non ti senti ancora pronto, fai un passo intermedio: per ciascuna coppia stampa anche il prodotto.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    candaluar ha scritto:


    Prova ora a riscrivere la funzione che calcola il prodotto scalare, partendo come base dalla stampaDueVettori().
    Considera che il valore di ritorno ora sarà int e non più void.
    Se non ti senti ancora pronto, fai un passo intermedio: per ciascuna coppia stampa anche il prodotto.
    Io ho provato un po' a pensare a quale algoritmo utilizzare per il prodotto scalare.

    Considerando che un prodotto scalare tra due vettori:
    a = (a', a'', a''')
    b = (b', b'', b''')
    è pari ad uno scalare c = a'b'+a''b''+a'''b''', ho pensato di poter utilizzare innanzitutto un ciclo for che calcola i prodotti degli elementi di ugual posto dei due vettori e poi di calcolare la sommatoria dei valori ottenuti. Cosa te ne pare? Qualcosa del tipo:
    int ProdottoScalare (int Vettore1[], int Vettore2[], int N){
    int i, x, y;
    for (i=0; i<N; i++){
    x = Vettore1[i]*Vettore2[i]; }
    y += x;
    cout << y;
    }
    Credo di aver commesso comunque qualche errore, perché provando ad implementarlo nel programma precedente, mi da 15 quando dovrebbe darmi 26 con i vettori precedenti.


    P.s.
    Ho comunque implementato la stampa del prodotto di ogni coppia:
    void stampaDueVettori(int Vettore1[], int Vettore2[], int N)
    {	int i;
    
    	for (i=0; i<N; i++){
    	cout << Vettore1[i] << " " << Vettore2[i] << " e il prodotto e':" << Vettore1[i]*Vettore2[i];
    	cout << endl; 
    }
    }
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Credo di aver commesso comunque qualche errore, perché provando ad implementarlo nel programma precedente, mi da 15 quando dovrebbe darmi 26 con i vettori precedenti.
    Sì però ora ci devi mettere del tuo.
    Hai provato e non funziona? Prova a ragionarci sopra, prima o poi lo devi fare.
    Ti ho anche suggerito di fare un passo intermedio, quello di stampare tutti i prodotti.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    candaluar ha scritto:


    Sì però ora ci devi mettere del tuo.
    Hai provato e non funziona? Prova a ragionarci sopra, prima o poi lo devi fare.
    Ti ho anche suggerito di fare un passo intermedio, quello di stampare tutti i prodotti.
    Si, ho editato il post inserendo la nuova funzione di stampa.
    Ora ci ragiono un po' su, riuscirò ad arrivare al risultato corretto.

    Grazie mille per l'enorme aiuto.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Ci sono riuscito!
    Ho dato un valore iniziale nullo ad una variabile x, poi lo sviluppata in sommatoria degli elementi dei vettori.
    In pratica, la funzione del prodotto scalare che ho fatto è:
    void ProdottoScalare (int Vettore1[], int Vettore2[], int N){
         int i;
         int x= 0;
         for (i=0; i<N; i++){
             x += (Vettore1[i]*Vettore2[i]);
    		 }
    		 cout << x;
    }
    E mi viene 26, utilizzando i vettori del programma dei post precedenti.
    Bene, quindi l'idea di dichiarare la presenza di una variabile nella funzione e di eguagliarla alla sommatoria dei prodotti degli elementi era corretta, mancava però l'inizializzazione della suddetta variabile.

    P.s.
    Solo una domanda però: io qui ho usato void e il programma ha funzionato correttamente. Tu però nel post precedente mi hai detto che non devo utilizzare void, ma int. Posso chiederti perché? E posso chiederti perché non è un errore che mi viene segnalato dal programma?
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Solo una domanda però: io qui ho usato void e il programma ha funzionato correttamente. Tu però nel post precedente mi hai detto che non devo utilizzare void, ma int. Posso chiederti perché? E posso chiederti perché non è un errore che mi viene segnalato dal programma?
    Studiati i valori di ritorno delle funzioni.
    Per capire la problematica: immagina che il prodotto scalare lo devi inserire in un campo a video e lo devi salvare su un file di testo... come fai? Aggiungi tutto alla funzione ProdottoScalare(), intendo la visualizzazione e il salvataggio su file? Riflettici.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    candaluar ha scritto:


    Solo una domanda però: io qui ho usato void e il programma ha funzionato correttamente. Tu però nel post precedente mi hai detto che non devo utilizzare void, ma int. Posso chiederti perché? E posso chiederti perché non è un errore che mi viene segnalato dal programma?
    Studiati i valori di ritorno delle funzioni.
    Per capire la problematica: immagina che il prodotto scalare lo devi inserire in un campo a video e lo devi salvare su un file di testo... come fai? Aggiungi tutto alla funzione ProdottoScalare(), intendo la visualizzazione e il salvataggio su file? Riflettici.
    Quindi il problema si pone nel momento in cui necessito di salvare su file il programma.
    E' per caso legato al fatto che void è una 'procedura' piuttosto che una 'funzione' ? E in quanto tale non 'produce risultati' ?
Devi accedere o registrarti per scrivere nel forum
43 risposte