#include #include /* Definiamo le strutture "punto" e "retta":*/ typedef struct punto{ double x; double y; } punto; typedef struct retta{ double pendenza; double intercetta; } retta; retta * NewRetta(); retta * OrtogonalePerUnPunto(const retta * r, const punto * p); retta * RettaPerDuePunti(const punto * p1, const punto * p2); int main(){ punto p1, p2, pm; retta *r1=NULL,*rort=NULL; printf("Questo programma calcola intercetta e pendenza di una retta ortogonale \n ad un segmento dato e passante per il suo punto medio.\n"); printf("Inserisci le coordinate x y del primo estremo del segmento:\n"); scanf("%lf %lf", &(p1.x),&(p1.y)); printf("Inserisci le coordinate x y del secondo estremo del segmento:\n"); scanf("%lf %lf", &(p2.x),&(p2.y)); pm.x = 0.5*(p1.x+p2.x); pm.y = 0.5*(p1.y+p2.y); printf("Le coordinate x y del punto medio del segmento sono %lf %lf\n", pm.x,pm.y); /* Attenzione: questo controllo va fatto PRIMA di creare la retta per due punti...*/ if(p1.x==p2.x){ if(p1.y == p2.y){ fprintf(stderr, "I due punti non devono coincidere !\n"); exit(1); } else{ printf("L'equazione della retta cercata e' y = %lf \n", pm.y); } } else{ r1 = RettaPerDuePunti(&p1,&p2); if(r1->pendenza){ rort = OrtogonalePerUnPunto(r1,&pm); printf("L'equazione della retta cercata e' y = %lfx + %lf\n", rort->pendenza,rort->intercetta); /* E' buona abitudine liberare lo spazio utilizzato quando non serve piu'...*/ free(r1); free(rort); } else{ printf("L'equazione della retta cercata e' x = %lf\n",pm.x); } } return(0); } retta * OrtogonalePerUnPunto(const retta * r, const punto * p){ retta * rort; /* Devo allocare la retta dinamicamente per poter restituire unb puntatore valido */ rort = NewRetta(); /* La generica retta ortogonale ha pendenza -1/m ( per m diverso da zero! ): */ if(r->pendenza) rort->pendenza = -1./(r->pendenza); else{ fprintf(stderr,"Non so rappresentare una retta parallela all'asse y !\n"); exit(1); } /* ...quella cercata passa per p, quindi...*/ rort->intercetta = p->y - (rort->pendenza)*p->x; return(rort); } retta * RettaPerDuePunti(const punto * p1, const punto * p2){ retta * r; /* Devo allocare la retta dinamicamente per poter restituire unb puntatore valido */ r = NewRetta(); /* Calcola i coefficienti */ if((p2->x - p1->x)!=0){ r->pendenza = (p2->y - p1->y)/(p2->x - p1->x); r->intercetta = p1->y - (r->pendenza)*(p1->x); } else{ fprintf(stderr,"Non so rappresentare una retta parallela all'asse y !\n"); exit(1); } return(r); } retta * NewRetta(){ retta * r; /*Alloca spazio per la retta */ r = (retta *)malloc(sizeof(retta)); if(r==NULL){ fprintf(stderr,"Non ho spazio per allocare una retta !\n"); exit(1); } return(r); }