Correzione di un esercizio su prodotto scalare di due vettori

di Anonimizzato20404 il
43 risposte

43 Risposte - Pagina 2

  • 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.
  • 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.
  • Definisci Vettore[] locale alla funzione main() e fai in modo che stampaVettore() riceva due parametri, un array e la sua dimensione.
  • 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.
  • 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.
  • 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.
  • 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 ...
  • 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.
  • 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.
  • 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; 
    }
    }
  • 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.
  • 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.
  • 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?
  • 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.
  • 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