Errore in un programma con file di testo,funzioni e struct

di il
6 risposte

Errore in un programma con file di testo,funzioni e struct

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)

6 Risposte

  • Re: Errore in un programma con file di testo,funzioni e struct

    Ci sono degli errori di compilazione, eccome. Ad esempio (ma non solo), qui

    array[indice].vicino = trova_vicino(array, punti_caricati, indice, &distanzamin);

    la funzione restituisce un int ma vicino non è un intero ...

    Devi correggere gli errori di compilazione e solo dopo provare il codice.
  • Re: Errore in un programma con file di testo,funzioni e struct

    Giusto, che errore stupido grazie mille! Perdonami non voglio sembrare stupida, ma non riesco a trovare altri errori di questo genere.. per di più non ricevo nemmeno messaggi di “warnings”.
  • Re: Errore in un programma con file di testo,funzioni e struct

    C'è una linea senza ; finale
    Come fai a non avere messaggi? Che compilatore usi scusa?

    E la questione precedente come l'hai corretta?
  • Re: Errore in un programma con file di testo,funzioni e struct

    Uso Dev C++... comunque a me non da alcun tipo di errore, probabilmente facendo copia e incolla mi è saltata un virgola. Ho coretto come segue:
    	for(indice=0;indice<punti_caricati;indice++){
    		
    		j=trova_vicino(array, punti_caricati, indice, &distanzamin);
    		array[indice].vicino=array[j].vicino; 
    		array[indice].distanza=distanzamin;
    	}
  • Re: Errore in un programma con file di testo,funzioni e struct

    DevC++ non è molto affidabile.

    Comunque, adesso il codice completo lo puoi postare correttamente qui? Hai altri problemi?
  • Re: Errore in un programma con file di testo,funzioni e struct

    L'esercizio non potrà mai tornare perché la soluzione che hai postato è errata.

    La distanza tra Beta e Zero è 12.672016, non è 6.021628 - quel valore ti viene se nel file hai Beta 7.4 3.2 4.0

    Controlla di non aver fatto casino con i segni
    
    #include <float.h> 
    #include <math.h>
    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    
    #define NOME_MAX 50
    #define PUNTI_MAX 100
    
    typedef struct s_punti{	
    	float x;
    	float y;
    	float z;
    	char nome[NOME_MAX];
    	int vicino; 
            float distanza;
    }punto;
    
    punto punti[PUNTI_MAX];
    
    int main(void) {  
        FILE *fp = fopen("punti.txt", "r");  
        if(fp == NULL)
    	return -1;   
        
        char buffer[1000];
        int i, j, k;
        
        for(i = 0; fgets(buffer, sizeof(buffer), fp) != NULL && i < PUNTI_MAX; i++){ 
            char *cp = strtok(buffer, " ");
            memcpy(punti[i].nome, buffer, strlen(buffer) + 1);
            cp = strtok(NULL, " ");
            punti[i].x = atof(cp);
            cp = strtok(NULL, " ");
            punti[i].y = atof(cp);
            cp = strtok(NULL, " ");
            punti[i].z = atof(cp);  
            punti[i].vicino = i;
            punti[i].distanza = FLT_MAX;        
        }
        fclose(fp);
        
        for(j = 0; j < i; j++){
            for(k = 0; k < i; k++){
                if(k == j)
                    continue;
                float dist = (punti[j].x - punti[k].x) * (punti[j].x - punti[k].x);
                dist += (punti[j].y - punti[k].y) * (punti[j].y - punti[k].y);
                dist += (punti[j].z - punti[k].z) * (punti[j].z - punti[k].z); 
                dist = sqrt(dist);
                printf ("Distanza tra %s e %s = %f\n", punti[j].nome, punti[k].nome, dist);
                if(dist < punti[j].distanza){
                    punti[j].vicino = k;
                    punti[j].distanza = dist;
                }
            }
        }
        
        for(j = 0; j < i; j++)
            printf ("%s -> %s (%f)\n", punti[j].nome, punti[punti[j].vicino].nome , punti[j].distanza);
    
        return 0;
    }
    
Devi accedere o registrarti per scrivere nel forum
6 risposte