funcion array struct

BAT

Moderatore
Staff Forum
Utente Èlite
22,668
11,452
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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?
Te lo faccio vedere con un piccolo codice:
C:
#include <stdio.h>
#include <math.h>

#define N 5 // dim. vettore

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

void stampaPunto(Punto a){
    printf("(%.2f, %.2f)", a.x, a.y);
}

stampaVettPunti(Punto ps[], int n){
    for(int i=0; i<n; i++){
        stampaPunto(ps[i]);
        if(i < n-1) printf(", ");
    }
}

int main(void)
{
    printf("*********************************\n");
    printf("     INIZIO\n");
    printf("*********************************\n\n");
    double xs[N] = {0.5, 1.0, 2.0, 3.0, 5.0}; // tutte le x
    double ys[N] = {0.5, 1.0, 2.0, 3.0, 5.0}; // tutte le y
    Punto ps[N]; // vettore di punti (xs[i], ys[i])
    for(int i=0; i<N; i++){
        ps[i].x = xs[i];
        ps[i].y = ys[i];
    }
    stampaVettPunti(ps, N);

    printf("\n*********************************");
    printf("\nPremi un tasto per terminare\n");
    getchar();
    return 0;
}
con una costante definisco un certo numero di punti (#define N 5)
codtruisco 2 vettori, uno per le x, uno per le y; a ciascuna ordinata x corrisponde un'ordinata y, quindi i vettori
xs = {0.5, 1.0, 2.0, 3.0, 5.0}
ys = {0.5, 1.0, 2.0, 3.0, 5.0}

definiscono i punti (0.5, 0.5) , (1.0, 1.0), (2.0, 2.0), (3.0, 3.0), (5.0, 5.0)
ok? tutte queste coppie costituiscono un Punto ciascuna; per costruire un vettore di punti lo metti a sua volta in un array
Punto ps[N]; // vettore di punti (xs, ys)
costruito con un ciclo for. E' di questo vettore Punto ps[N] che devi restituire gli indici dei punti con distanza minima; coi i numeri che ho messo, indici da restituire sono 0 e 1 perché tra (0.5, 0.5) e (1.0, 1.0) la distanza è minima.
Fatti il copia-incolla, compila ed esegui e capirai meglio. Fai delle prove cambiando i valori e/o la dimensione N (N=quanti punti). Tu devi calcolare TUTTE le distanze tra tutti i punti
 
Ultima modifica:

Andretti60

Utente Èlite
6,440
5,091
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:
     int dist;
     int minDist;
Ho lasciato le linee sbagliate: quelle due variabili devono essere definite double, non interi. Sono distanze.
Vedo cha alla fine visualizzi il valore dei punti, ma l'esercizio richiede che tu stampi gli indici del vettore che corrispondono ai punti piu; vicini.
Devi inoltre stampare minDist, e non dist.
PS poiche' la distanza puo' essere ugiale a 0 (se due punti coincidono) ti consiglio di inizializzare minDist con un valore negativo.
 

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Ho lasciato le linee sbagliate: quelle due variabili devono essere definite double, non interi. Sono distanze.
Vedo cha alla fine visualizzi il valore dei punti, ma l'esercizio richiede che tu stampi gli indici del vettore che corrispondono ai punti piu; vicini.
Devi inoltre stampare minDist, e non dist.
PS poiche' la distanza puo' essere ugiale a 0 (se due punti coincidono) ti consiglio di inizializzare minDist con un valore negativo.
See lo inizializza a negativo e tutte le distanze che si calcola sono positive allora restituirà il valore negativo che hai inizializzato e non va bene.
La deve inizializzare con il valore del calcolo della distanza tra due punti.
 

Andretti60

Utente Èlite
6,440
5,091
See lo inizializza a negativo e tutte le distanze che si calcola sono positive allora restituirà il valore negativo che hai inizializzato e non va bene.
La deve inizializzare con il valore del calcolo della distanza tra due punti.
No: prima controlli il valore, se è negativo significa che non è inizializzato e quindi assegni la prima distanza computa. È un trucco abbastanza comune per evitare di usare una ulteriore variabile booleana.
 

Sysken

Nuovo Utente
51
20
Oppure, come ho indicato precedentemente nel codice, basta valutare la distanza dei primi due punti (che esistono sempre) e ripetere il calcolo nel ciclo, senza dover valutare la condizione dell'if ad ogni ciclo.
 
  • Mi piace
Reazioni: Ibernato

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
Oppure, come ho indicato precedentemente nel codice, basta valutare la distanza dei primi due punti (che esistono sempre) e ripetere il calcolo nel ciclo, senza dover valutare la condizione dell'if ad ogni ciclo.
Questo intendevo io :)
Di solito si fa così
 
  • Mi piace
Reazioni: Sysken

Andretti60

Utente Èlite
6,440
5,091
In genere non mi piace suggerire metodi alternativi, in casi come questo preferisco solo correggere il metodo originale. Del resto è questione di preferenza personale, in casi semplici esistono sempre più di una soluzione.
Post unito automaticamente:

... basta valutare la distanza dei primi due punti (che esistono sempre)
Chi ti dice che esistono sempre? Cosa succede se decido di digitare 0 punti come lunghezza del vettore? :)
 

Ibernato

Utente Èlite
4,328
2,047
OS
Windows 10 Pro / Ubuntu 22.04
In genere non mi piace suggerire metodi alternativi, in casi come questo preferisco solo correggere il metodo originale. Del resto è questione di preferenza personale, in casi semplici esistono sempre più di una soluzione.
Post unito automaticamente:


Chi ti dice che esistono sempre? Cosa succede se decido di digitare 0 punti come lunghezza del vettore? :)
Ci sono i controlli da fare.
 

Sysken

Nuovo Utente
51
20
@Andretti60
L'ho affermato per via del codice postato dall'autore del thread.

EDIT: La modifica (controllo della dimensione) era stata attuata da Ibernato. Ad ogni modo io sono sempre dell'idea che una funzione non deve essere caricata da troppi controlli sui dati in input, sempre nei limiti possibili e sempre a seconda del contesto (nello sviluppo di una libreria questa sorta di libertà è da evitare).
 
Ultima modifica:

Andretti60

Utente Èlite
6,440
5,091
Oppure, come ho indicato precedentemente nel codice, basta valutare la distanza dei primi due punti (che esistono sempre) e ripetere il calcolo nel ciclo, senza dover valutare la condizione dell'if ad ogni ciclo.
Quella che proponi tu e' una possibile soluzione. Ce ne sono altre.
Permettemi due osservazioni:
1) il tuo metodo calcona la distanza dei primi due punti due volte, una all'nizio e una durante il ciclo. In questo caso va bene in quanto la funzione non richiede tempo, ma in genere potrebbe essere un problema
2) una istruzione condizionale if non prende alcun tempo, e in genere tale tempo e' irrisorio rispetto al resto (il calcolo della distanza)

Questo e' il mio metodo preferito, che richiede una variable in piu'. E' il metodo piu' sicuro che non fa alcuna assunzione ne' sul numero ne' sul intervallo dei valori. Alla fine del loop, il valore minDist e' valido se flag==0

C:
int flag;
double minDist;
double dist;

flag = 1;

for(;;)
{
    ...
    dist = ...
    if (flag == 1)
    {
        minDist = dist;
        flag = 0;
    }
    else
    {
        if (dist < minDist)
            minDist = dist;
    }
}
 
  • Mi piace
Reazioni: Sysken

Sysken

Nuovo Utente
51
20
1) il tuo metodo calcona la distanza dei primi due punti due volte, una all'nizio e una durante il ciclo. In questo caso va bene in quanto la funzione non richiede tempo, ma in genere potrebbe essere un problema
Ne sono consapevole, è un "vincolo" che ho fatto presente ed effettivamente il calcolo della distanza è abbastanza dispendioso, tuttavia, mettendo la questione sul piano temporale c'è il vantaggio che il calcolo aggiuntivo è univoco, a differenza della serie di CMP che il processore dovrà effettuare per valutare la condizione if. Ma è anche vero che all'infinito quell'istruzione è irrisoria. Sicuramente esiste una soglia per cui una delle due soluzioni sarà poco più efficiente dell'altra.
Concludo dicendo che ad ogni modo sono pienamente d'accordo con te, le possibili soluzioni sono tante, in particolare la funzione da te indicata è particolarmente indipendente, il che la rende molto versatile. :ok:
 
  • Mi piace
Reazioni: Andretti60

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

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili