Correzione di un esercizio su prodotto scalare di due vettori

di il
43 risposte

43 Risposte - Pagina 3

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

    Quindi il problema si pone nel momento in cui necessito di salvare su file il programma.
    Questa frase non la capisco.
    E' per caso legato al fatto che void è una 'procedura' piuttosto che una 'funzione' ? E in quanto tale non 'produce risultati' ?
    Sì; la funzione di Stampa() deve stampare a video e lo fa con cout; la funzione di Prodotto() NON deve stampare a video ma solo "ritornare" il valore calcolato che verrà eventualmente stampato dal chiamante (in questo caso main()).
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Ovvero intendi dire che la funzione prodotto deve solo restituirmi un valore che poi manderò in stampa mediante il main (quindi non uso il void perché non produce risultati). Mentre la funzione di stampa deve solo stampare un valore che manda in video con cout, quindi può essere una 'procedura' piuttosto che una 'funzione'. Ho capito bene?

    Ho un quesito da porti, candaluar.
    Devo sviluppare un programma simile a questo sul prodotto scalare, ma questa volta la funzione deve sviluppare la media degli elementi di un vettore. Solo che ho qualche dubbio sia sulla dichiarazione di alcuni elementi..

    Allora, ho sviluppato la seguente funzione int per la media degli elementi del vettore:
    int MediaElementiVettore (int Vettore[], int N){
    	int x = 0;
    	int y;
    	for (i=0; i<N; i++){
    		x += Vettore[i];
    	}
    	y = (x/N);
    	return y;
    }
    E poi ho sviluppato questo main:
    int main (){
    	
    
    	cout << "Inserire la cardinalita' del vettore:" << endl;
    	cin >> N;
    	
    	int Vettore[N];
    	
    	cout <<"Inserire gli elementi del vettore." << endl;
    	for (i=0; i<N; i++){
    		cout << "Inserire l'elemento " << i+1 << endl;
    		cin >> Vettore[i];
    	}
    	
    	cout << "La media degli elementi del vettore e':" << endl;
    	cout << MediaElementiVettore(Vettore[],N);
    	
    return 0;
    }
    Volevo chiederti:
    - N ed i compaiono nel int come nel main, devo dichiararle come variabili globali (come ho già fatto), giusto ?
    - è corretto l'utilizzo della funzione int piuttosto che void e il richiamo della funzione int con un cout ? Nella funzione int ho inserito la funzione di ritorno del valore che mi interessa.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    - N ed i compaiono nel int come nel main, devo dichiararle come variabili globali (come ho già fatto), giusto ?
    NO, PERCHE' DOVREBBERO ESSERE GLOBALI?
    E poi scusa, perchè la funzione MediaElementiVettore() la chiami "int"? Si chiama MediaElementiVettore(), int è solo il suo valore di ritorno!
    è corretto l'utilizzo della funzione int piuttosto che void e il richiamo della funzione int con un cout ?
    int NON E' UNA FUNZIONE, E' UN VALORE DI RITORNO! Comunque MediaElementiVettore() la puoi chiamare salvando il risultato in una variabile, così
    val = MediaElementiVettore(...............);
    oppure non passare per una variabile e stampare direttamente il valore, come hai fatto tu.
    Studiati bene COSA SONO le funzioni e poi rileggi la frase
    Nella funzione int ho inserito la funzione di ritorno del valore che mi interessa.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Candaluar:
    - per quanto riguarda le variabili, la variabile i compare nella funzione che dovrò poi richiamare nel main ma compare anche nel main stesso (c'è un ciclo for nella quale la uso). Potrei dichiararla localmente nelle due funzioni, ma posso chiederti cosa mi cambia tra dichiararla localmente nelle due funzioni o solo una volta ma globalmente? Per quanto riguarda invece N, effettivamente potrei anche solo dichiararla localmente nel main, considerando che è quel valore che poi l'utente dovrà inserire da tastiera.
    - per quanto riguarda le funzioni e le procedure, int è il tipo del risultato di ritorno. Scrivevo 'funzione int' per sottolineare che avevo sviluppato una funzione con risultato di tipo int e non una procedura void, tutto qua. Ti chiedevo solo se è corretto l'utilizzo di una funziona piuttosto che di una procedura e se è corretto il modo in cui ho sviluppato la funzione e poi l'ho richiamata.




    P.s.
    In un esercizio in cui mi chiedeva di lavorare con stringhe di numeri, ho sviluppato questa funzione:
    char Concatenamento (char Vettore1[], char Vettore2[], int NMAX){
    	strcat (Vettore1, Vettore2);
    	cout << Vettore1;
    }
    Scrivendo così, il programma va bene. Però ho provato a scrivere in questo modo:
    char Concatenamento (char Vettore1[], char Vettore2[], int NMAX){
    	strcat (Vettore1, Vettore2);
    	return Vettore1;
    }
    e mi dava errore sul return Vettore1, dicendomi che non era valida la trasformazione char to char sul Vettore 1. Potresti dirmi perché? Vettore1 è un char proprio come il risultato Concatenamento!

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

    Vettore1 è un "array di char" e non un "singolo char".

    Conosci la differenza?
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    oregon ha scritto:


    Vettore1 è un "array di char" e non un "singolo char".

    Conosci la differenza?
    Si, certo.
    Infatti Concatenamento è un singolo char.

    Ma allora posso chiederti se è corretto sviluppare una funzione in quel modo ?
    L'obiettivo è sviluppare una funzione che mi dia il concatenamento di due vettori.
    L'esecuzione del programma 'mi darebbe ragione', ma a questo punto ho seri dubbi che io abbia fatto bene.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Che vuoi dire? Stai lavorando con "array di char" non con un singolo char quindi è ovvio che tu abbia un errore.

    No che non è corretto, non ti serve restituire nulla (ovvero la funzione deve essere void e la return non serve)
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    oregon ha scritto:


    Che vuoi dire? Stai lavorando con "array di char" non con un singolo char quindi è ovvio che tu abbia un errore.

    No che non è corretto, non ti serve restituire nulla (ovvero la funzione deve essere void e la return non serve)
    Ok, quindi l'errore è nell'aver dichiarato un singolo char per poi lavorare con array di char, quindi chiaramente non va bene.

    Sulla seconda frase, posso chiederti perché non mi serve restituire nulla? Non mi interessa che la funzione mi restituisca il risultato del concatenamento mediante strcat?
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Forse ho capito qual è il procedimento logico che devo seguire nella scelta tra usare una funzione o una procedura.

    Se la differenza tra di esse è che la procedura non sviluppa alcun risultato ma, piuttosto, determina una modifica ad elementi già esistenti, vien da se che in situazioni in cui devo sviluppare una modifica e non devo determinare un risultato finale (come ad esempio può capitare nella ricerca del minimo in un vettore o del calcolo della media degli elementi del vettore) devo utilizzare la procedura e quindi la keyword void.

    In tal caso, poiché devo sviluppare una modifica ai vettori mediante strcat, devo utilizzare la procedura void perché non mi interessa avere un risultato in uscita, bensì la modifica di un qualcosa che esiste già.

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

    Se ti ho capito, orientativamente sì ...

    Il problema è che le cose cambiano a seconda dei casi e delle necessità ... A volte è necessario anche restituire l'array ma è inutile nel tuo caso dato che modifichi l'array di destinazione.

    Nello specifico, per questo tuo codice, dato che non fai altro che usare la strcat nella funzione, la funzione stessa è praticamente inutile. Utilizza la strcat direttamente dove ti serve e basta.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    oregon ha scritto:


    Se ti ho capito, orientativamente sì ...

    Il problema è che le cose cambiano a seconda dei casi e delle necessità ... A volte è necessario anche restituire l'array ma è inutile nel tuo caso dato che modifichi l'array di destinazione.

    Nello specifico, per questo tuo codice, dato che non fai altro che usare la strcat nella funzione, la funzione stessa è praticamente inutile. Utilizza la strcat direttamente dove ti serve e basta.
    Non posso, la richiesta di sviluppare una funzione/procedura e poi implementarla nel main è nel testo dell'esercizio.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Ho qualche problema con la 'gestione' delle funzioni con tipi strutturati ed il richiamo delle stesse.

    L'esercizio mi dice di implementare la funzione:
    float calcolaModulo (const NumeroComplesso& n);
    con NumeroComplesso che è un tipo strutturato composto dai campi P_reale e P_immaginaria.

    So che in tal caso devo andare a sviluppare un nuovo tipo di dato complessi mediante la keyword typedef.
    Io ho provato a generare un programma di prova, eccolo:
    
    #include <iostream>
    #include <cmath> //Libreria delle funzioni matematiche.
    using namespace std;
    
    typedef struct{
         float P_reale;
         float P_immaginaria;
     }NumeroComplesso;
    
    float calcolaModulo (const NumeroComplesso& n){
        float Modulo;
        NumeroComplesso x;
        
        Modulo = sqrt(pow(x.P_reale,2)+pow(x.P_immaginaria,2));
    	return Modulo;
    };
    
    int main (){
    
    	NumeroComplesso x;
    	float Modulo;
    	
    	x.P_reale = 1;
    	x.P_immaginaria = 1;
    	
    	cout << "Il modulo del numero complesso e':" << endl;
    	cout << calcolaModulo(x);
    	
    return 0;
    }
    Ma mi da un valore totalmente sballato in uscita, quindi ho sbagliato qualcosa che il programma non riesce a segnalarmi.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    Hai ancora difficoltà con la visibilità delle variabili. All'interno della funzione devi lavorare con n e non creare un'altra variabile locale che non ha alcun nesso con quella passata dall'esterno.

    Comunque adesso sei OT, dovresti aprire un altro thread perché questo è un altro problema.
  • Re: Correzione di un esercizio su prodotto scalare di due vettori

    oregon ha scritto:


    Hai ancora difficoltà con la visibilità delle variabili. All'interno della funzione devi lavorare con n e non creare un'altra variabile locale che non ha alcun nesso con quella passata dall'esterno.
    Giusto, perché n è la variabile di tipo NumeroComplesso che dichiaro nella costruzione della funzione. Errore sciocco.

    oregon ha scritto:


    Comunque adesso sei OT, dovresti aprire un altro thread perché questo è un altro problema.
    Ah ok, my bad. Sorry.
Devi accedere o registrarti per scrivere nel forum
43 risposte