Vi sembra corretto?[C]
Ragazzi vi sembra corretto il seguente programma?? Compila perfettamente però nn sono sicuro che faccia il suo dovere:
Grazie per eventuali risposte
/*Scrivere il codice di una funzione in linguaggio C che permetta di calcolare il coseno dell'angolo formato tra due generici vettori di double.*/ #include<stdio.h> #include<stdlib.h> #include<math.h> void coseno(double*, double*); int main(){ double *vet1; double *vet2; int i; vet1=(double*)calloc(2,sizeof(double)); vet2=(double*)calloc(2,sizeof(double)); printf("Inserire i valori del primo vettore\n"); for(i=0;i<2;i++) scanf("%lf",&vet1[i]); printf("Inserire i valori del secondo vettore\n"); for(i=0;i<2;i++) scanf("%lf",&vet2[i]); coseno(vet1,vet2); system("pause"); return 0; } void coseno(double *vet1, double *vet2){ double x; double tangente_1, tangente_2; tangente_1=vet1[1]/vet1[0]; tangente_2=vet2[1]/vet2[0]; double alpha = atan(tangente_1); double beta = atan(tangente_2); printf("L'angolo del primo vettore e': %lf\n", alpha); printf("L'angolo del secondo vettore e': %lf\n",beta); if(beta > alpha) x=cos((beta-alpha)); else if(alpha > beta) x=cos((alpha-beta)); else x=cos(0); printf("Il coseno dell'angolo tra i due vettori e': %lf\n",x); return; }
Grazie per eventuali risposte
Risposte
"fk16":
Ragazzi vi sembra corretto il seguente programma?? Compila perfettamente però nn sono sicuro che faccia il suo dovere:
Sembra funzionare, solo che mi sembra un po'...barocco

Permettimi di farti un po' di pulci

Per cominciare, se vuoi calcolare il coseno basta fare il prodotto scalare tra i due vettori e poi dividere per il prodotto delle due lunghezze.
Poi per esempio allochi due vettori di lunghezza fissata a compile time: a che serve? Tanto vale dichiarare direttamente i due array bidimensionali che conterranno le componenti dei due vettori...(a meno che non vuoi in futuro modificarlo per gestire vettori a dimensione arbitraria: ma allora dovresti modificare anche la funzione coseno(), perche' come la scrivi tu funziona solo in dimensione 2).
Inoltre queste if
if(beta > alpha) x=cos((beta-alpha)); else if(alpha > beta) x=cos((alpha-beta)); else x=cos(0);
sono completamente inutili, visto che il coseno e' pari, quindi $cos(x)=cos(-x)$.
Anche se cosi' non fosse, l'ultimo else sarebbe inutile lo stesso, visto che se finisci in quel ramo, allora alpha=beta...
Per il resto: perche' dici che secondo te non funziona del tutto correttamente?
Innanzi tutto grazie dei consigli...=)ora farò le opportune modifiche..=) comunque, dico che non funziona come dovrebbe perchè se con la calcolatrice faccio l'arcotangente del rapporto tra i due cateti, il valore che mi stampa il compilatore è diverso da quello che mi viene nella calcolatrice.
Immagino sia perché stai usando atan invece di atan2. atan2, al contrario di atan è infatti in grado di restituire angoli in tutti e quattro i quadranti, mentre atan non ne è in grado. Siccome ad esempio \(\cos(3\pi/2) \neq \cos(-\pi/2)\), è importante usare atan2 al posto di atan. Cerca su google per scoprire come funziona. Inoltre, come ti ha già anche detto yoshiharu, la funzione coseno è pari per cui non è necessario gestire quei casi separatamente. Ma yoshiharu ti ha già fornito il metodo più efficiente e robusto per calcolare il coseno tra due vettori: calcolare il prodotto scalare e dividere per i moduli dei due vettori. Questo metodo ha inoltre il vantaggio di funzionare anche in dimensioni diverse da \(2\) (il tuo metodo non è generalizzabile facilmente a dimensioni qualsiasi).