Vi sembra corretto?[C]

fk16
Ragazzi vi sembra corretto il seguente programma?? Compila perfettamente però nn sono sicuro che faccia il suo dovere:
/*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
yoshiharu
"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?

fk16
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.

apatriarca
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).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.