Programma struct in c

di il
18 risposte

Programma struct in c

Salve a tutti dovrei sviuluppare una function C che, dato come parametro di input un array di tipo struct punto { double x; double y;
} e il suo size, determina e restituisce come paramentri di output gli indici dei due punti che ahnno distnza
minima tra loro. I campi x e y contengono l' ascissa e l' ordinata, rispettivamente, di un punto.

il mio problema sta nel restituire gli indici: questo è il mio programma


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef struct punto{
double x;
double y;
};
typedef struct punto Punto[4];
double dist(struct punto p1,struct punto p2);
void indici(Punto,int,int *,int *);
void main()
{
Punto m_p={{2.0,2.0},{6.0,0.0},{5.0,3.0},{5.0,4.0}};
double ab,ac,ad,bc,bd,cd;
int n=4;
int ind1,ind2;
ab=dist(m_p[0],m_p[1]);
ac=dist(m_p[0],m_p[2]);
ad=dist(m_p[0],m_p[3]);
bc=dist(m_p[1],m_p[2]);
bd=dist(m_p[1],m_p[3]);
cd=dist(m_p[2],m_p[3]);
printf("Distanza ab: %lf\n",ab);
printf("Distanza ac: %lf\n",ac);
printf("Distanza ad: %lf\n",ad);
printf("Distanza bc: %lf\n",bc);
printf("Distanza bd: %lf\n",bd);
printf("Distanza cd: %lf\n",cd);
indici(m_p,n,&ind1,&ind2);
printf("Valore indici: %d e %d",ind1,ind2);

}

void indici(Punto vettore,int n,int *ind1,int *ind2){
int i,j;
double min,diff;
min=sqrt(pow((vettore[1].x-vettore[0].x),2)+pow((vettore[1].y-vettore[0].y),2));
for(i=0;i<n-1;i++)
{
for(j=1;j<n;j++)
{
diff=sqrt(pow((vettore[j].x-vettore.x),2)+pow(vettore[j].y-vettore.y,2));
if(diff<min)
{
min=diff;
*ind1=i;
*ind2=j;
}
}
}
}


Qualcuno di buona volontà che mi puo dare qualche dritta?

18 Risposte

  • Re: Programma struct in c

    Ma scusa, perchè all'interno della funzione indici() non richiami la funzione dist()? Semplificherebbe di molto il codice; inoltre ti permetterebbe di capire meglio cos'è che non va, in quanto hai già correttamente posizionato delle printf() di "debug" prima della chiamata a indici()
  • Re: Programma struct in c

    Si quello ci avevo gia pensato e l'ho corretto..quello che non mi torna sono il valore degli indici che con i valori che ho assegnato mi dovrebbe restituire gli indici 2 e 3 mentre si ferma a 2 e 2.
  • Re: Programma struct in c

    Posta, usando i tag code, il codice modificato
  • Re: Programma struct in c

    Comunque, secondo me, dovresti rivedere il ciclo for interno, for(j=1;j<n;j++)
    A mio avviso j non dovrebbe partire sempre da 1...
  • Re: Programma struct in c

    L ho modificato facendolo partire da 2 e mi restituisce gli indici 2 e 2..quando parta da j=1 mi restituisce invece 1 e 1
  • Re: Programma struct in c

    Ora l'ho modificato facendolo partire da 3 e mi trovo pero cosi facendo salto un calcolo di distanza
  • Re: Programma struct in c

    Posta il codice modificato ...
  • Re: Programma struct in c

    Void indici(Punto vettore,int n,int *ind1,int *ind2){
    int i,j;
    double min,diff;
    min=dist(vettore[0],vettore[1]);
    *ind1=0;
    *ind2=1;
    for(i=0;i<n-1;i++)
    {
    for(j=2;j<n;j++)
    {
    diff=dist(vettore,vettore[j]);
    {
    min=diff;
    *ind1=i;
    *ind2=j;
    }
    }
    }
    }


    adesso va..mi sapresti dire cosa è cambiato usando la funzione dist negli indici invece di farlo manualmente?nella mia testa non ci sono differenze...
  • Re: Programma struct in c

    Ma il codice della funzione dist qual è?

    P.S. Usa i tag CODE come da regolamento, altrimenti il codice NON SI CAPISCE !
  • Re: Programma struct in c

    @Gnocchino: prima di tutto segui le indicazioni di oregon che chiede il codice della funzione dist() e il codice completo con i tag "Code".
    Per quanto riguarda la soluzione, ti posso dire che non è ancora corretto, e del perchè te ne puoi rendere conto se provi a scrivere
    for(i=0;i<n-1;i++)
    {
       for(j=2;j<n;j++)
       {
          printf("i=%d j=%d\n", i, j);
          // ... resto del codice
       }
    }

    così vedrai i confronti che i tuoi cicli fanno.
    Infine c'è da dire che ha tolto il confronto, infatti manca una if all'interno...
  • Re: Programma struct in c

    double dist(struct punto p1,struct punto p2){
    return sqrt(pow((p2.x-p1.x),2)+pow((p2.y-p1.y),2));
    }
    
    questo è il codice della funzione distanza.
    void indici(Punto vettore,int n,int *ind1,int *ind2){
    int i,j;
    double min,diff;
    min=dist(vettore[0],vettore[1]);
    *ind1=0;
    *ind2=1;
    for(i=0;i<n-1;i++)
    {
    for(j=2;j<n;j++)
    {
    diff=dist(vettore[i],vettore[j]);
    {
        if(diff<min)
    min=diff;
    *ind1=i;
    *ind2=j;
    }
    }
    }
    }

    questo invece è la funzione indici..quindi nonostante gli indici restituiti siano corretti ho sbagliato qualcosa?
  • Re: Programma struct in c

    Metti la printf all'interno del ciclo, come ti ho spiegato nel mio precedente post e ti accorgerai subito dell'errore
  • Re: Programma struct in c

    Trova 6 coppie di indici mentre le distanze calcolabili ne sono di meno..è questo l'errore?
  • Re: Programma struct in c

    Ah no,cosi facendo gli indici tornano ad essere 2 e 2..
Devi accedere o registrarti per scrivere nel forum
18 risposte