Salve a tutti! E' da qualche giorno che ragiono sul mio possibile errore nel programma scritto qui sotto. Non mi da errori di sintassi ma il risultato non è quello desiderato. Potreste aiutarmi a risolvere il mio dubbio?
#include<stdio.h> //per input/output
#include<stdlib.h> //allocazione dinamica della memoria
#include <math.h>
#define nmax 50 //dimensione massima per la stringa
#define N 100 //dimensione massima per array
//STRUTTURE
typedef struct s_punti{ //definisco una struttura per rappresentare i punti
float x;
float y;
float z;
char nome[nmax]; //stringa (terminatore NULL)
float distanza;
struct punto* vicino;
}punto;
struct punto* vicino =NULL;
//PROTOTIPI FUNZIONI
int carica (FILE* puntatore_file, punto array[], int n);
int trova_vicino (punto array[], int punti_caricati, int indice, float* distanzamin );
punto memorizza_vicini(punto array[], int punti_caricati);
void stampa (punto array[],int punti_caricati);
int main(){
FILE* puntatore_file;
punto p;
punto array[N];
int n, indice;
float distanzamin;
int punti_caricati;
//lettura del file di testo e in caso di errore lo comunica all'utente e interrompe il programma
if((puntatore_file=fopen("punti.txt","r"))==NULL){
printf("Errore nell'apertura del file\n");
exit(EXIT_FAILURE);
}
//funzione che ritorna il numero effettivo di punti e memorizza il valore in punti_caricati
if(carica(puntatore_file, array, n)==0){
printf("Errore di lettura");
exit(EXIT_FAILURE);
}else {
punti_caricati=carica(puntatore_file, array, n);
printf("Punti caricati: %d\n", punti_caricati);
}
printf ("Di quale tra i punti caricati vuoi trovare il vicino?\n");
scanf ("%d",&indice);
//funzione che grazie alla distanza Euclidea trova il punto più vicino
trova_vicino (array, punti_caricati, indice, &distanzamin );
//trova il vicino a tutti i punti
memorizza_vicini(array,punti_caricati);
printf("\nAvvio la funzione stampa");
//stampa il nome dei punti con i relativi vicini e la distanza
stampa (array,punti_caricati);
fclose(puntatore_file);
}//fine main
//FUNZIONI
int carica (FILE* puntatore_file, punto array[], int n){
punto p; //variabile per memorizzare una riga del file di testo
int status; //variabile per controllare se la lettura da file è stata eseguita correttamente
while((status=fscanf(puntatore_file, " %s %f %f %f ",p.nome,&p.x,&p.y,&p.z))!=EOF && n<N){
if(status==4) {
array[n]=p; //non serve
n++;
}
else if(status>=0 && status<4){
status=0; //a che serve
return 0;
}
}
return n;
}
int trova_vicino (punto array[], int punti_caricati, int indice, float* distanzamin){
int vicino;
float d[N];
int i;
for(i=0;i<punti_caricati;i++){
//if(i!=indice)
d[i]=sqrt(pow(array[indice].x - array[i].x ,2) + pow(array[indice].y - array[i].y,2) + pow(array[indice].z - array[i].z,2));
*distanzamin=d[i];
vicino=i;
if(*distanzamin>d[i+1]){
vicino=i+1;
*distanzamin=d[i+1]
}
}
return vicino;
}
punto memorizza_vicini(punto array[], int punti_caricati){
float distanzamin;
int indice;
float d;
for(indice=0;indice<punti_caricati;indice++){
array[indice].vicino=trova_vicino(array, punti_caricati, indice, &distanzamin);
array[indice].distanza=distanzamin;
}
}
void stampa (punto array[],int punti_caricati){
int i=0;
for(i=0;i<punti_caricati;i++){
printf("\n%s -> %s (%f)", array[i].nome, array[i].vicino, array[i].distanza);
}
}
allego qui sotto anche il file di testo in entrata e la stampa che dovrei ottenere
File di testo:
A 0.12 0.46 0.23
Gamma 1.0 5.4 -3.7
Z 1.1 -0.2 -1.5
Beta -7.4 3.2 4.0
Zero 4.2 3.3 9.1
Stampa finale:
A -> Z (2.094970)
Gamma -> Z (6.017475)
Z -> A (2.094970)
Beta -> Zero (6.021628)
Zero -> Beta (6.021628)