funcion array struct

toni1705

Nuovo Utente
98
9
perchè non funziona?
C:
/*Sviluppare 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 parametri di output
gli indici dei due punti che hanno distanza minima tra loro.
I campi x e y contengono l’ascissa e l’ordinata, rispettivamente, di un punto.*/
#include <stdio.h>
#include <math.h>
typedef struct punto{
    double x;
   double y;
} Punto;

int distanzaF(int x,int y);

  main(){
  double x,y;
     int i,n;
     int dist;
Punto vettore[4];
printf("\ninserire la dimensione dell'array: ");
scanf("%d",&n);
  printf("\ninserire le cordinate: ");
for (i=0;i<n;i++)
scanf("%d",&vettore[i]);
dist=distanzaF(x,y);
printf("la distanza minima \x8A:%d",dist);
}
int distanzaF(int x,int y)
  {
      Punto p1,p2;
      return sqrt(pow((p2.x-p1.x),2) + pow((p2.y-p1.y),2));

  }
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
perchè non funziona?
C:
/*Sviluppare 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 parametri di output
gli indici dei due punti che hanno distanza minima tra loro.
I campi x e y contengono l’ascissa e l’ordinata, rispettivamente, di un punto.*/
#include <stdio.h>
#include <math.h>
typedef struct punto{
    double x;
   double y;
} Punto;

int distanzaF(int x,int y);

  main(){
  double x,y;
     int i,n;
     int dist;
Punto vettore[4];
printf("\ninserire la dimensione dell'array: ");
scanf("%d",&n);
  printf("\ninserire le cordinate: ");
for (i=0;i<n;i++)
scanf("%d",&vettore[i]);
dist=distanzaF(x,y);
printf("la distanza minima \x8A:%d",dist);
}
int distanzaF(int x,int y)
  {
      Punto p1,p2;
      return sqrt(pow((p2.x-p1.x),2) + pow((p2.y-p1.y),2));

  }
Ma che errore ti da?
Da quel che vedo, tu hai dichiarato un Array di lunghezza 4 e ora chiedi di far inserire la dimensione dell'array.
Metti una costante N=lunghezza che vuoi.
Poi fai inserire la lunghezza dell'array. Questo è il primo errore.
Poi la struct è composta da due infromazioni. Rivediti come funziona la scan per assegnare i valori nelle struct
distanzaF(x,y) che vuol dire? x e y non valgono nulla.
Mi sa che hai le idee un pò confuse.
Rivediti bene la lezione sulle struct :)
 

toni1705

Nuovo Utente
98
9
giustamente conviene dichiarare uno più grande per non finire in overflow?
altrimenti dovrei allocare la dimensione
non è errore di compilazione.
ma se inserisco i numeri il calcolo o è sempre zero o un numero enorme che inizia con -214....
per la scanf avevo in mente di dichiarare nel main p1,p2 e poi scanf("%d",p1.x)
 
Ultima modifica:

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
non è errore di compilazione
ma se inserisco i numeri il calcolo o è sempre zero o un numero enorme che inizia con -214....
Se dai in input una size maggiore di 4 ti da errore.
Poi tu sbagli a prendere l'input dei punti.
Per accedere ad una struct si fa vettore.x e vettore.y
Ma anche la funzione è sbagliata.
Punto p1, p2 chi sono? Non li assegni da nessuna parte.
Per questo ti sto dicendo che forse non sai come funzionano le struct


Ecco il codice, ma studia altirmenti non saprai fare niente.
Se ho capito bene devi trovare la distanza minima tra un insieme di punti.


C:
/******************************************************************************

                            Online C Compiler.
                Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <stdio.h>
#include <math.h>
typedef struct punto{
    double x;
   double y;
} Punto;

int distanzaF(Punto, Punto);

  int main(){
  double x,y;
     int i,n,j;
     int dist;
     int minDist;
     Punto p1, p2;
Punto vettore[4];
printf("\ninserire la dimensione dell'array: ");
scanf("%d",&n);
if(n > 4 || n < 2){
    printf("La size deve essere maggiore di 1 e minore di 5\n");
    return;
}
  printf("\ninserire le cordinate: ");
for (i=0;i<n;i++){
    printf("Cordinata punto %d x y:", i + 1);
    scanf("%lf %lf",&vettore[i].x, &vettore[i].y);
    printf("\n");
}
minDist = 0;
for(i = 0; i < n; i++){
    for(j = i + 1; j < n; j++){
        dist =distanzaF(vettore[i], vettore[j]);
        if(minDist == 0) minDist = dist;
        else if(dist < minDist){ 
                minDist = dist;
                p1 = vettore[i];
                p2 = vettore[j];
        }
    }
}
printf("Punto 1: x=%lf y=%lf -- Punto 2: x=%lf y=%lf: \n", p1.x, p1.y, p2.x, p2.y);
printf("la distanza minima è:%d",dist);
}
int distanzaF(Punto p1, Punto p2)
  {
      return sqrt(pow((p2.x-p1.x),2) + pow((p2.y-p1.y),2));

  }
 
Ultima modifica:
  • Mi piace
Reazioni: toni1705

toni1705

Nuovo Utente
98
9
nemmeno funziona il tuo perchè se assegno alla variabile 1 dopo quando stampi la variabile dice che è 0.. cioè assegno al punto p(1,2)
p2(3,4)
riporta che al punto 1 alla x è assegnato 0.000..
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
nemmeno funziona il tuo perchè se assegno alla variabile 1 dopo quando stampi la variabile dice che è 0.. cioè assegno al punto p(1,2)
p2(3,4)
riporta che al punto 1 alla x è assegnato 0.000..
la distanza dice che è 4 quindi funziona.
Probabilmente perde l'assegnazione mi sa. Di certo non mi metto a scrivere il codice perfetto.
Già è tanto che ti ho fatto il programma :)
 

toni1705

Nuovo Utente
98
9
infatti cercavo solo di capire come mai queste cose poi io volevo capire non ricercavo il codice completo anche se utile volevo farlo con le mie mani cosi sarebbe stato più semplice per me capirlo.
 
  • Mi piace
Reazioni: Andretti60

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Una distanza non può essere un int, devi ritornare un double;
inoltre, invece di fare una lettura, almeno all'inizio ti converrebbe definire manualmente all'inizio del programma un po' di struct Punto (3-4-5 quante ne vuoi) con coordinate prefissate, da inserire poi in un array da passare alla funzione;
ho dato solo uno sguardo ai codici inseriti, e vedo solo letture di int... ma il testo è chiarissimo: le coordinate devono essere dei double, non degli int.
 
Ultima modifica:
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
Beh, non funziona perche' ci sono molti sbagli nel tuo codice.
Non me ne volere, non sto criticandoti, abbiamo tutti iniziato per cui cerco di aiutarti.
Mi pare che hai "qualche" idea di programmazione, ma le idee sono confuse e hai molte lacune. In parte e' dovuto al fatto che usi il linguaggio C standard (capisco non sia la tua scelta) il cui compilatore e' troppo permissivo. Almeno dovresti usare il C ANSII mettendo al massimo gli avvertimenti, ma lasciamo da parte per il momento.

Partiamo dalla parte piu' difficile, ossia il "capire" come risolvere un problema. Il resto sono dettagli di programmazione, ma il problema qui e' piu' profondo, non e' che hai fatto "alcuni" errori, proprio non hai capito il problema che ti si e' presentato e non hai saputo scrivere un "algoritmo" per risolverlo. Occorre fare bene questa parte altrimenti non si va da nessuna parte, si scrive solo codice sbagliato. Questo e' quello che successo.

Quando si legge il testo di un esercizio, occorre fare un bel respiro, e stare lontani dalla tastiera. Reprimere la voglia di iniziare a scrivere del codice. E' quello che si deve fare sempre, non solo a scuola quando si impara, e' quello che continuo a fare io quando ho un progetto. Capire il concetto, e capire come va risolto. In genere ci sono molte maniere per risolverlo, quando si impara basta trovarne una (in futuro si cerchera' la maniera migliore, ma lasciamo perdere).

Il tuo problema e' semplice.
  1. Hai un insieme di coordinate cartesiane, che rappresentano punti in uno spazio bidimensionale (ossia hai solo due coordinate x e y).
  2. Devi trovare quale di questi punti sono piu' vicini tra loro.
  3. Quindi devi calcolare le distanze tra tutti i punti, e trovare la distanza minima.
  4. Ma il problema non chiede la distanza minima, bensi' quali siano questi punti.
  5. Poiche' i punti sono contenuti in un vettore, quello che il problema chiede sono gli indici di tali punti.

Riguarda adesso il tuo codice originale.
Hai dichiarato un struttura Punto, che va bene. Hai un vettore di punti che inizializzi all'inizio, anche questo va bene.
Il resto no. Calcoli solo una distanza (tra l'altro sbagliata, passi due interi e calcoli la distanza tra due Punti dichiarati localmente, non inzializzati) e la visualizzi.

Cominciamo quindi con il correggere la funzione Distanza. Deve calcolare la distanza tra due punti, quindi devi passare due variabili di tipo Punto, e ritornare la distanza che e' un double, non un intero.
Fatto quello, devi calcolare le distanze tra tutte le coppie di punti. Questo va fatto (per esempio) con un doppio ciclo, il ciclo esterno va su tutti i punti del vettore, il ciclo interno va su tutti gli altri punti (occorre quindi "giocare" un po' con gli indici dei cicli).
Trova la distanza minima, e gli indici corrispondenti del vettore.

Provaci un po'. E ricorda: pensa prima di cominciare a scrivere il codice. E non ti demoralizzare, il fatto che sei qui dimostra che vuoi imparare. Ma ti avviso: hai molte lacune di base.
Post unito automaticamente:

Non costa nulla iniziare anche a scrivere codice leggibile.
Il linguaggio C e' un linguaggio "libero", ossia non richiede formattazione. Le linee di codice finiscono con il punto e virgola. metodi e cicli sonjo racchiusi tra parentesi graffe. Purtroppo poiche' non ci sono regole, se non si fa attenzione si finisce con lo scrivere codice che non si capisce, infatti esistono competizioni dove vince chi riesce a scrivere un codice (funzionante) il piu' oscuro possibile.

Ci sono alcune regoli semplici, ma le piu' importanti sono queste due:

  1. Indentazione. Le linee di ogni "corpo" del codice vanno indentate dello stesso numero di spazi. Se usi un buon editore di testo, che capisce che usi il linguaggio C, questo viene fatto automaticamente (per esempio notepadd++)
  2. Parentesi graffe. le "coppie" di parentesi (aperta e chiusa) vanno indentate allo stesso livello, cosi' "a occhio" si vede subito quali siano.
Ti ho riscritto parte del tuo codice originale. Non ho corretto gli errori, solo per mostrare come sia piu' facile leggere il codice quando le linee di codice sono allineate correttamente.

Codice:
typedef struct punto
{
   double x;
   double y;
} Punto;

int distanzaF(int x,int y);

main()
{
   double x,y;
   int i,n;
   int dist;

   for (;;)
   {
   }
  
   printf();
}
 
Ultima modifica:

toni1705

Nuovo Utente
98
9
mi ero talmente fissato con la distanza che avevo dimenticato il quesito principale.
quindi devo avere 4 Punti
a=(x1,x2)
b=(x3,x4)
c=(x5,x6)
d=(x7,x8)
fra questi quattro devo praticamente calcolare la distanza minima tra a & b e c &d
poi confrontarli e vedere qual'è dei due ha distanza minima maggiore.
come output nel caso in cui fosse la coppia c&d deve visualizzare x5,x6,x7,x8
giusto?
 
Ultima modifica:

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
mi ero talmente fissato con la distanza che avevo dimenticato il quesito principale.
quindi devo avere 4 Punti
a=(x1,x2)
b=(x3,x4)
c=(x5,x6)
d=(x7,x8)
fra questi quattro devo praticamente calcolare la distanza minima tra a & b e c &d
poi confrontarli e vedere qual'è dei due a distanza minima maggiore.
come output nel caso in cui fosse la coppia c&d deve visualizzare x5,x6,x7,x8
giusto?
No, da come ho capito io devi calcolare la distanza tra tutte le coppie di punti
ab
ac
ad
bc
bd
cd
 

toni1705

Nuovo Utente
98
9
non è per niente semplice allora ... x.x
come faccio a salvare i numeri in x e y?
considerando che gli indici devono essere richiamati dalla function?
 

Ibernato

Utente Èlite
4,330
2,047
OS
Windows 10 Pro / Ubuntu 22.04
non è per niente semplice allora ... x.x
come faccio a salvare i numeri in x e y?
considerando che gli indici devono essere richiamati dalla function?
guarda il codice del mio programma e capisci.
Ma soprattutto, rivediti le cose perchè hai molte lacune.
 

toni1705

Nuovo Utente
98
9
funziona . l'unica cosa mi sorge un dubbio avendo dichiaro x ed y come double il risultato stampato non dovrebbe essere int, giusto? bensi un bel double il fatto è che se cambio da int a double ed alla printf assegno un bel l %lf
il programma mi da sempre come risultato 0 xDDDDDDDDD
C:
#include <math.h>
#include <stdio.h>
typedef struct
{
double x;
double y;
}Punto;
double  distanzaF(Punto p1, Punto p2);
main()
{
    double x,y;
     int i,n,j,a;
     int dist;
     int minDist;
Punto p1, p2;
Punto vettore[4];
printf("\ninserire la dimensione dell'array: ");
scanf("%d",&n);
printf("\ninserire le cordinate: ");

for (i=0;i<n;i++)
    {
    printf("Cordinata punto %d x y:", i + 1);
    scanf("%lf %lf",&vettore[i].x, &vettore[i].y);
    printf("\n");
    }
minDist = 0;
for(i = 0; i < n; i++)     
    {
    for(j = i + 1; j < n; j++)   
     {
        dist =distanzaF(vettore[i], vettore[j]);
        if(minDist == 0) minDist = dist;
        else if(dist < minDist)       
         {
                minDist = dist;
                p1 = vettore[i];
                p2 = vettore[j];
       }
     }
   }
printf("Punto 1: x=%lf y=%lf -- Punto 2: x=%lf y=%lf: \n", p1.x, p1.y, p2.x, p2.y);
printf("la distanza minima è:%d",dist);
}


double  distanzaF(Punto p1, Punto p2)
{
    return sqrt((pow(p2.x - p1.x,2) + pow(p2.y - p1.y,2)));

}
 

Sysken

Nuovo Utente
51
20
Ciao @toni1705,
nota bene che la richiesta dell'esercizio non è ricavare la distanza minima, bensì ricavare gli indici dei due punti che hanno distanza minima, che sono chiaramente due interi. La funzione dovrà quindi essere di tipo void e restituire i due indici mediante reference.

C:
#include <stdio.h>
#include <math.h>
#define MAX_L 5  // Ina alternativa è possibile utilizzare VLA

struct point{
    double x;
    double y;
};
typedef struct point POINT;

void minDist(POINT[], int *, int *);
double distCalc(POINT, POINT);

int main(void){
  ...
}

void minDist(POINT points[], int *indexP1, int *indexP2){  // La dim dell'array è costante (*!semplificazione!*) non è necessario passarla alla funzione.
    double distMin = distCalc(points[0], points[1]);       // Inizializziamo la distanza minima in modo da poterla confrontare
    *indexP1 = 0;
    *indexP2 = 1;
    double dist;
    for(size_t i=0; i<MAX_L-1; i++){                       // Dal primo al penultimo
        for(size_t j=i+1; j<MAX_L; j++){                   // Dall'elemento immediatamente successivo ad i fino all'ultimo
            dist = distCalc(points[i], points[j]);
            if(dist < distMin){
                distMin = dist;
                *indexP1 = i;
                *indexP2 = j;
            }
        }
    }
}

double distCalc(POINT point1, POINT point2){
    return sqrt(pow((point1.x-point2.x),2) + pow((point1.y-point2.y),2));
}
Da notare che i due cicli ricalcolano la distanza minima dei due punti iniziali anche se non necessario, questo perché non è possibile far partire il primo for dal secondo elemento, altrimenti nessun'altro punto successivo al secondo verrà confrontato con il primo.


EDIT: È normalissimo che la funzione ti restituisca sempre 0. Qual'è la distanza minima assoluta di due punti? E proprio 0! Questo sta a significare che i due punti combaciano, quindi, inizializzando minDist a 0 hai già definito il minimo assoluto, ogni altra distanza ricavata è superflua.
 
Ultima modifica:

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili