Chiarimenti su passaggio di valori a parametri di funzione

di il
10 risposte

Chiarimenti su passaggio di valori a parametri di funzione

Ciao ragazzi sono Roberto,
premetto che sono nuovo nella programmazione in C++, nasco come programmatore di macchine a controllo numerico CNC e sto implementando la conoscenza di questo linguaggio per aiutarmi a creare delle macro che mi serviranno per le lavorazioni, visto che trovo molto comodo crearmi degli algoritmi su cui posso fare il debug su PC senza perdere tempo a fare varie prove e avanti/indietro tra PC/macchina. Detto ciò vi chiedo un chiarimento su una cosa che mi succede che non riesco a capire, mi sto creando una libreria di geometria analitica e sto lavorando ora sull'equazione dell'asse radicale tra due circonferenze sfruttando la differenza tra equazioni di secondo grado messe a sistema, quindi l'equazione risultante sarà quella di una retta. Ho evitato di mettere come parametri nella funzione dell'asse radicale i coefficienti delle due incognite quadre dell'equazione di secondo grado della circonferenza, visto che il loro valore sarà sempre +1 quindi la loro differenza sarà sempre 0. La funzione dell'asse radicale (che ancora non ho completato, devo ancora inserire le condizioni quando la retta risultante avrà 0° o 90° quindi x o y avranno valori fissi e non y=mx+q) che ho creato mi restituisce un vettore di tipo double di tre elementi: l'elemento[0] = coefficiente angolare m della retta, l'elemento[1] = y, l'elemento[2] = intercetta q della retta; quando invoco tale funzione nella main in un ciclo for singolo per ciascuna circonferenza la funzione non ha nessun problema e mi restituisce i valori che mi aspetto, mentre se creo un unico ciclo for invocando la stessa funzione con i parametri di entrambe le circonferenze, il valore del parametro corrispondente al raggio2 della seconda circonferenza diventa 0, perchè???
Grazie in anticipo a chiunque può aiutarmi a capire questa cosa...
Vi condivido l'intero PGM su cui sto lavorando cosicchè possiate fare le vostre verifiche e potermi dare una risposta chiara ed eventualmente consigli anche su come impostare le funzioni in modo anche più elegante e funzionale.
L'IDE che sto utilizzando è il DEV-C++ 5.5.3.

I parametri delle circonferenze che sto simulando sono:
C1(1;3) Raggio1=10 C2(7.5; -3.25) Raggio2=3
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <math.h>

using namespace std;

//Dichiarazione della costante globale PI_GRECO
const double PI_GRECO = 3.141592653589793238462643383279502884197169399;

//Prototipi delle funzioni
double radianti(double gradi);

double circonferenza(double x, double y, double raggio, double *equazioneCirconferenza);

void asseRadicale(double xC1, double yC1, double notoC1,double xC2, double yC2, double notoC2, double *retta);

int main() {

	double x1=0, y1=0, raggio1=0;
	double x2=0, y2=0, raggio2=0;
	double circonferenza1[3]={}, circonferenza2[3]={};
	double retta1[3]={};

	cout<<"*******Funzione che ritorna i coefficienti dell'equazione dell'asse radicale*******\n\n";

	cout<<"X prima circonferenza: ";
	cin>>x1;
	cout<<"Y prima circonferenza: ";
	cin>>y1;
	cout<<"Raggio prima circonferenza: ";
	cin>>raggio1;
	
	cout<<"\nX seconda circonferenza: ";
	cin>>x2;
	cout<<"Y seconda circonferenza: ";
	cin>>y2;
	cout<<"Raggio seconda circonferenza: ";
	cin>>raggio2;

	cout<<endl;

			//Così non funziona il valore del raggio2 diventa zero, perchè????
	/*			
	for(int i=0; i<3; i++){
		circonferenza(x1,y1,raggio1,circonferenza1);//equazione prima circonferenza
		circonferenza(x2,y2,raggio2,circonferenza2);//equazione seconda circonferenza
	}
	*/
	
			//Così funziona
	for(int i=0; i<3; i++)
		circonferenza(x1,y1,raggio1,circonferenza1);//equazione prima circonferenza

	for(int i=0; i<3; i++)
		circonferenza(x2,y2,raggio2,circonferenza2);//equazione seconda circonferenza

	
	for(int i=0; i<3; i++)
		asseRadicale(circonferenza1[0],circonferenza1[1],circonferenza1[2],circonferenza2[0],circonferenza2[1],circonferenza2[2],retta1);	


	cout<<endl<<endl<<retta1[1]<<"y "<<retta1[0]<<"x "<<retta1[2];
	
	fflush(stdin);
	getchar();
	return 0;
}

/*Funzione--> che trasforma i gradi in radianti*/
double radianti(double gradi){
	return (gradi * PI_GRECO * 2) / 360;
}

/*Funzione--> che restituisce in un vettore i coefficienti dell'equazione di una circonferenza; per motivi di semplificazione, tale funzione restituisce
solo i coefficienti delle incognite x e y con esponente 1 ed il termine noto dell'equazione di secondo grado della circonferenza, visto che nelle equazioni delle
circonferenze i coefficienti di x^2 ed y^2 sono sempre 1.
Parametri della funzione:
- x= coordinata dell'ascissa del centro circonferenza;
- y= coordinata dell'ordinata del centro circonferenza;
- raggio= raggio della circonferenza;
- *equazioneCirconferenza= vettore di 3 elementi che conterrà solo i coefficienti dell'equazione di secondo grado della circonferenza con esponente 1 ed il termine noto.*/
double circonferenza(double x, double y, double raggio, double *equazioneCirconferenza){
	equazioneCirconferenza[3] = {};//Inizializzazione del vettore contenente i coefficienti dell'equazione della circonferenza
	equazioneCirconferenza[0] = (-2) * x;//Coefficiente di x
	equazioneCirconferenza[1] = (-2) * y;//Coefficiente di y
	equazioneCirconferenza[2] = pow(x,2) + pow(y,2) - pow(raggio,2);//Valore noto senza incognita
}

/*Funzione--> che restituisce in un vettore i coefficienti dell'equazione della retta dell'asse radicale tra due circonferenze.
Parametri della funzione:
- *circonferenza1= vettore di 5 elementi che contiene i coefficienti dell'equazione di secondo grado della prima circonferenza;
- *circonferenza2= vettore di 5 elementi che contiene i coefficienti dell'equazione di secondo grado della seconda circonferenza;
- *retta= vettore di 3 elementi che contiene i coefficienti della retta asse radicale:
	-retta[0]= coefficiente angolare m della retta;
	-retta[1]= y della retta;
	-retta[2]= intercetta q della retta.*/
void asseRadicale(double xC1, double yC1, double notoC1,double xC2, double yC2, double notoC2, double *retta){
	retta[3]={};//retta[1]=y; retta[0]=m; retta[2]=q per quanto riguarda equazioni di circonferenze	

	/*Differenza tra le equazioni di secondo grado delle due circonferenze; ovviamente non ci sono le differenze tra i 
	coefficienti delle incognite con esponente al quadrato perchè sarà sempre zero...*/
	retta[0] = xC1 - xC2;//Differenza tra i coefficienti delle incognite x con esponente 1 delle 2 circonferenze 
	retta[1] = yC1 - yC2;//Differenza tra i coefficienti delle incognite y con esponente 1 delle 2 circonferenze 
	retta[2] = notoC1 - notoC2;//Differenza tra i termini noti delle 2 circonferenze 
	
	//Da cancellare dopo completamento funzione
	for(short int i=0; i<3; i++)
		cout<<"retta["<<i<<"]= "<<retta[i]<<endl;

	for(short int i=0; i<3; i++)			
		if(retta[0] == 0){//Caso che l'asse radicale è orizzontale quindi 0° e il coefficiente angolare m è uguale a 0
			retta[0] = 0;//Coefficiente angolare m uguale a 0
			retta[2] = -retta[2];//Trasporto dell'intercetta q dall'altro lato dell'uguale rispetto a y=(retta[1])
			retta[1] = retta[2] / retta[1];//Rapporto tra l'intercetta e il coefficiente di y; corrisponde all'equazione dell'asse radicale
			retta[2] = 0;//Azzeramento dell'intercetta
		}
		else{
			retta[0] = - retta[0];//Trasporto del coefficiente angolare m dall'altro lato dell'uguale rispetto a y=(retta[1])
			retta[2] = - retta[2];//Trasporto dell'intercetta q dall'altro lato dell'uguale rispetto a y=(retta[1])
			retta[0] /= retta[1];//Rapporto tra il coefficiente angolare m e la y
			retta[2] /= retta[1];//Rapporto tra l'intercetta q e la y
			retta[1] = 1;
		}
}

10 Risposte

  • Re: Chiarimenti su passaggio di valori a parametri di funzione

    La funzione

    double circonferenza

    non restituisce alcun valore double e al suo interno questa linea

    equazioneCirconferenza[3] = {};

    non ha senso
  • Re: Chiarimenti su passaggio di valori a parametri di funzione

    Potresti spiegarti meglio?
    Perchè in un senso funziona e nell'altro no?
    Come posso usare un vettore di tipo double che mi contiene in output i 3 valori dei coefficienti della retta, senza dovermi creare 3 indirizzi?

    Ciao e grazie per la risposta , sono qui per imparare
  • Re: Chiarimenti su passaggio di valori a parametri di funzione

    Ok sei qui per imparare ma, abbi pazienza, le risposte presuppongono la conoscenza di base del linguaggio. Altrimenti, bisognerebbe fare un corso di programmazione base per ogni risposta.

    Comunque, tu hai compilato il tuo programma senza errori? Non è possibile perché ci sono gli errori che ti ho indicato.
  • Re: Chiarimenti su passaggio di valori a parametri di funzione

    Guarda son sincero col Dev non mi dà nessun errore di compilazione, gli errori sono di tipo matematici... poi non lo so!
    So il tanto che mi basta per crearmi gli algoritmi da mettere in macchina...
  • Re: Chiarimenti su passaggio di valori a parametri di funzione

    Lasciamo perdere i messaggi di warning ed errore ... che dipendono dallo standard usato.

    Però dovresti spiegare cosa intendi con la linea

    equazioneCirconferenza[3] = {};

    perché non si capisce.

    E poi, dovresti dirci perché la funzione circonferenza restituisce un double. Forse non volevi che restituisse valori, quindi doveva essere void?
  • Re: Chiarimenti su passaggio di valori a parametri di funzione

    L'intenzione della riga:
    equazioneCirconferenza[3]={}; è quella di dichiarare il numero di elementi dell'array e di inizializzarli a zero.

    Si infatti mi sono sbagliato con la circonferenza perchè poi con l'asse radicale ho messo void...

    Comunque ho scritto questa variante che va bene, ma volevo comunque capire come usare un vettore che mi contenga i valori calcolati senza dover usare singolarmente gli indirizzi come ho fatto ora! Puoi spiegarmelo?
    
    #include <cstdlib>
    #include <cstdio>
    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    //Dichiarazione della costante globale PI_GRECO
    const double PI_GRECO = 3.141592653589793238462643383279502884197169399;
    
    //Prototipi delle funzioni
    double radianti(double gradi);
    
    void circonferenza(double xC, double yC, double raggio, double &x, double &y, double &noto);
    
    void asseRadicale(double xC1, double yC1, double notoC1,double xC2, double yC2, double notoC2, double &y, double &m, double &q);
    
    int main() {
    
    	double x1=0, y1=0, raggio1=0;
    	double x2=0, y2=0, raggio2=0;
    	double xC1=0, yC1=0, notoC1=0;
    	double xC2=0, yC2=0, notoC2=0;
    	double y=0, m=0, q=0;
    	
    
    	cout<<"*******Funzione che ritorna i coefficienti dell'equazione dell'asse radicale*******\n\n";
    
    	cout<<"X prima circonferenza: ";
    	cin>>x1;
    	cout<<"Y prima circonferenza: ";
    	cin>>y1;
    	cout<<"Raggio prima circonferenza: ";
    	cin>>raggio1;
    	
    	cout<<"\nX seconda circonferenza: ";
    	cin>>x2;
    	cout<<"Y seconda circonferenza: ";
    	cin>>y2;
    	cout<<"Raggio seconda circonferenza: ";
    	cin>>raggio2;
    
    	//Creo le equazioni delle due circonferenze invocando le relativi funzioni
    	circonferenza(x1,y1,raggio1,xC1,yC1,notoC1);
    	circonferenza(x2,y2,raggio2,xC2,yC2,notoC2);
    
    	//Ricavo l'equazione della retta dell'asse radicale invocando la relativa funzione
    	asseRadicale(xC1,yC1,notoC1,xC2,yC2,notoC2,y,m,q);
    	
    	if(m == 0)
    		cout<<endl<<endl<<"y="<<y;
    	else if(y == 0)
    			cout<<endl<<endl<<"x="<<m;
    		 else
    			cout<<endl<<endl<<y<<"y "<<m<<"x "<<q;
    	
    	fflush(stdin);
    	getchar();
    	return 0;
    }
    
    /*Funzione--> che trasforma i gradi in radianti*/
    double radianti(double gradi){
    	return (gradi * PI_GRECO * 2) / 360;
    }
    
    /*Funzione--> che restituisce i coefficienti dell'equazione di una circonferenza; per motivi di semplificazione, tale funzione restituisce
    solo i coefficienti delle incognite x e y con esponente 1 ed il termine noto dell'equazione di secondo grado della circonferenza, visto che nelle equazioni delle
    circonferenze i coefficienti di x^2 ed y^2 sono sempre 1.
    Parametri della funzione:
    - xC= coordinata dell'ascissa del centro circonferenza;
    - yC= coordinata dell'ordinata del centro circonferenza;
    - raggio= raggio della circonferenza;
    - &x= indirizzo che contiene il valore del coefficiente dell'incognita x con esponente 1 dell'equazione di secondo grado della circonferenza;
    - &y= indirizzo che contiene il valore del coefficiente dell'incognita y con esponente 1 dell'equazione di secondo grado della circonferenza;
    - &noto= indirizzo che contiene il valore del termine noto dell'equazione di secondo grado della circonferenza.*/
    void circonferenza(double xC, double yC, double raggio, double &x, double &y, double &noto){
    	x = (-2) * xC;//Coefficiente di x
    	y = (-2) * yC;//Coefficiente di y
    	noto = pow(xC,2) + pow(yC,2) - pow(raggio,2);//Valore noto senza incognita
    }
    
    /*Funzione--> che restituisce i coefficienti dell'equazione della retta dell'asse radicale tra due circonferenze.
    Parametri della funzione:
    -xC1= coefficiente dell'incognita x con esponente 1 dell'equazione di secondo grado della prima circonferenza
    -yC1= coefficiente dell'incognita y con esponente 1 dell'equazione di secondo grado della prima circonferenza
    -notoC1= termine noto dell'equazione di secondo grado della prima circonferenza
    -xC2= coefficiente dell'incognita x con esponente 1 dell'equazione di secondo grado della seconda circonferenza
    -yC2= coefficiente dell'incognita y con esponente 1 dell'equazione di secondo grado della seconda circonferenza
    -notoC2= termine noto dell'equazione di secondo grado della seconda circonferenza;
    -&y= indirizzo che contiene:
    	-il valore dell'ordinata della retta se m e q sono uguali a zero 0;
    	-0 se m è diverso da zero e q è uaguale a zero;
    	-1 se m e q sono diversi da zero.
    -&m= indirizzo che contiene:
    	- il valore dell'ascissa x se y e q sono uguali a zero 0;
    	- 0 se y è diverso da zero 0 e q è uguale a zero 0;
    	- il valore del coefficiente angolare se y è uguale a 1 e q è diverso da zero 0.
    -&q= indirizzo che contiene:
    	- 0 se la y è diverso da zero 0 e la m è uguale a zero 0;
    	- 0 se la y è uguale a zero 0 e la m è diversa da zero 0;
    	- il valore dell'intercetta dell'equazione della retta.*/
    void asseRadicale(double xC1, double yC1, double notoC1,double xC2, double yC2, double notoC2, double &y, double &m, double &q){
    	/*Differenza tra le equazioni di secondo grado delle due circonferenze; ovviamente non ci sono le differenze tra i 
    	coefficienti delle incognite con esponente al quadrato perchè sarà sempre zero...*/
    	m = xC1 - xC2;//Differenza tra i coefficienti delle incognite x con esponente 1 delle 2 circonferenze 
    	y = yC1 - yC2;//Differenza tra i coefficienti delle incognite y con esponente 1 delle 2 circonferenze 
    	q = notoC1 - notoC2;//Differenza tra i termini noti delle 2 circonferenze 
    	q = -q;//Trasporto dell'intercetta q dall'altro lato dell'uguale
    
    	if(y == 0 || m == 0){//Caso in cui l'asse radicale è sia orizzontale quindi 0° che verticale quindi 90° 
    		if(m == 0)//Caso in cui l'asse radicale è 0°
    			y = q / y;//Rapporto tra l'intercetta e il coefficiente di y; corrisponde all'equazione dell'asse radicale
    		else//Caso in cui l'asse radicale è 90°
    			m = q / m;//Rapporto tra l'intercetta e il coefficiente di x; corrisponde all'equazione dell'asse radicale
    		q = 0;//Azzeramento dell'intercetta
    	}
    	else{
    		m = -m;//Trasporto del coefficiente angolare m dall'altro lato dell'uguale
    		m /= y;//Rapporto tra il coefficiente angolare m e la y
    		q /= y;//Rapporto tra l'intercetta q e la y
    		y = 1;//Imposto a 1 la y
    	}
    }
    
  • Re: Chiarimenti su passaggio di valori a parametri di funzione

    Roberto1980 ha scritto:


    L'intenzione della riga:
    equazioneCirconferenza[3]={}; è quella di dichiarare il numero di elementi dell'array e di inizializzarli a zero.
    Non dentro quella funzione. Non stai dichiarando nulla perché quello è un parametro (il vettore che passi è già dichiarato e azzerato nel main) e tanto meno stai azzerando nulla.
    Devi eliminare quella riga.
  • Re: Chiarimenti su passaggio di valori a parametri di funzione

    Quindi se ho capito bene è solo nella funzione main che devo dichiarare ed inizializzare il numero di elementi che ha il vettore di output della funzione?
    E nella funzione come faccio a definirli ed usarli? O va bene già com'è togliendoci solo l'inizializzazione dell'array?
  • Re: Chiarimenti su passaggio di valori a parametri di funzione

    Sì ... nella funzione assegni dei valori ai 3 elementi (con indice 0 1 e 2)

    Comunque va bene tutto ma se decidi di usare un linguaggio di programmazione, devi acquisirne le basi (anche teoriche) prima di scrivere codice ...
    Sarebbe come mettersi a programmare un PLC senza sapere da dove iniziare.
  • Re: Chiarimenti su passaggio di valori a parametri di funzione

    Hai ragione Oregon, son sincero non seguo più da moltissimo tempo le lezioni su youtube, quel poco che ne so lo sfrutto per semplificarmi il lavoro in azienda, pensa prima per creare una macro a bordo macchina ci mettevo anche 2 o 3 giorni, mentre ora rispetto a prima sono un fulmine e quando ne ho voglia posso continuare il lavoro a casa.
    Grazie ancora Oregon per la tua disponibiltà ciaoooo
Devi accedere o registrarti per scrivere nel forum
10 risposte