Linguaggio C, ritornare puntatore alla componente dell'array

di il
26 risposte

Linguaggio C, ritornare puntatore alla componente dell'array

Implementare float* minimo(const float* array, int size)

che, presi in input un array di float e la sua dimensione size, restituisce il puntatore alla componente dell’array contenente il valore minimo.


main.c
{
...
...
	printf ("Il minimo e': %f\n", *(minimo(v,size)));
}
funzione.c
float *minimo(float* array, int size)
{
	int i = 1;
	float min, res;
	min = array[0];
	res = controllo(array, size, min, i);
	return res;
}
Non posto tutto il codice poiché non serve (anche perché funziona) ma non ho capito come devo ritornare il valore res(?)

26 Risposte

  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Cosa fa la funzione controllo?

    E come funziona se neanche dovrebbe compilare?
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Aspetta posto il codice completo. La parte del minimo l'ho provata a parte e funziona.

    Testo:
    a) Implementare in C la funzione: 
    
    float* leggi_array(const char* nomefile, int *n) 
    
    Tale funzione, presa in input una stringa nomefile che rappresenta il percorso di un file di testo contenente valori reali ed un puntatore n ad intero, 
    restituisce un array di float, di opportuna dimensione, contenente i valori presenti nel file, nello stesso ordine in cui occorrono nel file. 
    La funzione, inoltre, assegna alla variabile puntata da n la dimensione dell’array restituito.
    Se il file non può essere aperto correttamente (perché, ad esempio, inesistente), la funzione deve restituire il puntatore NULL assegnando 0 come dimensione.
    NOTA: I valori nel file sono separati da spazi bianchi o caratteri di ritorno a capo.  
    
    ESEMPIO. Con il seguente file di input:
    0.456 9.785 13.0
    12.9
    2.5
    
    La funzione restituisce l’array: [0.456 9.785 13.0 12.9 2.5].
    
    b) Successivamente, implementare la funzione RICORSIVA:
    
    float* minimo(const float* array, int size)
    
    che, presi in input  un array di float e la sua dimensione size, restituisce il puntatore alla componente 
    dell’array contenente il valore minimo. 
    Nell’implementazione di tale funzione non è consentito l’uso di cicli, né nella funzione stessa né in eventuali funzioni ausiliare che essa dovesse usare.
    Main.c:
    #include "../libtest/libtest.h"
    #include "esercizio.h"
    
    int main(int argc, char** argv)
    {
    	char* nomefile = "file1.txt";
    	int size = 0, i;
    		    
    	float* v = leggi_array(nomefile, &size);
    	for(i = 0; i < size; i++)
    		printf("v[%d] = %f\n", i, v[i]);
    
    	//printf("\n");
    	    
    	printf ("Il minimo e': %f\n", *(minimo(v,size)));
    	//minimo(v, size);
    
    	
    }
    
    funzioni.c:
    #include <stdio.h>
    #include <stdlib.h>
    #include "esercizio.h"
    
    float* leggi_array(char* nomefile, int* n)
    {
    	//Array per allocazione dinamica
    	float *array, flag, x;
    	int dim, i = 0;
    
    	//Controllo apertura file
    	FILE *f = fopen(nomefile, "r");
    	if(f == NULL)
    		printf("Errore nell'apertura del file");
    	else
    	{
    		//Riposizionamento del cursore all'inizio del file
    		//fseek(f, 0, 0);
    		
    		while(!feof(f))
    		{
    			//flag = fgetc(f);
    			fscanf(f, "%f", &x);
    			*n = *n +1;
    		}
    				
    		//Allocazione dinamica della memoria
    		array = (float*) malloc (*n * sizeof(float));
    
    		//Riposizionamento del cursore all'inizio del file
    		fseek(f, 0, 0);
    		
    
    		for(i = 0; i < *n; i++)
    		{
    			fscanf(f, "%f", &x);
    			array[i] = x;
    		}
    		
    		return array;
    		
    	}
    }
    
    float *minimo(float* array, int size)
    {
    	int i = 1;
    	float min, res;
    	min = array[0];
    	res = controllo(array, size, min, i);
    	return *res;
    }
    float controllo(float *array, int dim, float minimo, int j)
    {
    	if(minimo > array[j])
    	{
    		minimo = array[j];
    		if(j == dim - 1)
    			return minimo;
    		else
    			controllo(array, dim, minimo, j+1);
    	}
    	else 
    		if(minimo < array[j])
    		{
    			if(j == dim - 1)
    				return minimo;
    			else
    				controllo(array, dim, minimo, j+1);
    		}
    		else
    			if(minimo == array[j])
    			{
    				if(j == dim - 1)
    					return minimo;
    				else
    					controllo(array, dim, minimo, j+1);
    	
    			}
    	
    }
    
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Beh ... la cosa è un po' più complessa ...

    La funzione deve essere ricorsiva e deve restituire il puntatore all'elemento minimo dell'array

    Non è come avevi detto all'inizio ...
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    La funzione non è ricorsiva ma lo è "controllo", la funzione ausiliaria che è chiamata al suo interno. Se leggi le ultime righe del testo c'è scritto:

    Nell’implementazione di tale funzione non è consentito l’uso di cicli, né nella funzione stessa né in eventuali funzioni ausiliare che essa dovesse usare.

    L'importante è che non tocchi il main. A me serve solo sapere come ritornare il puntatore a quel valore
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    L'esercizio dice che la funzione RICORSIVA deve essere questa

    float* minimo(const float* array, int size)

    con gli ARGOMENTI indicati e NON che deve essere una funzione ausiliaria. Sei fuori strada.
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    No, mi spiace ma questa volta sbagli tu. C'è scritto chiaramente che si posso utilizzare funzioni ausiliarie. Minimo è la funzione che dovrebbe essere ricorsiva ma che non è, e controllo è quella ausiliaria. Anche il prof ha detto che va bene in questo modo. A me serve sapere come tornare il puntatore a quella componente, grazie
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Mi dispiace ma non è come dici tu. L'esercizio è chiaro. La funzione ricorsiva è quella indicate e le funzioni ausiliarie sono EVENTUALI, quindi possono anche non esserci. Se il tuo professore ti ha detto diversamente, cambia professore.

    Già che ci sei, dai al tuo professore la soluzione, che è questa (senza alcuna funzione ausiliare e con la funzione ricorsiva implementata come richiesto)
    
    float *minimo(const float* array, int size)
    {
        float *min_c;
        
    	if(--size==0)
    		return (float *)array;
        
    	min_c = minimo(array, size);
        
    	if(*min_c < array[size])
    		return min_c;
        
    	return (float *)&array[size];
    }
    
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    float* recmin(const float* vect,const float* val, int sz)
    {
        if ( *vect < *val )
            val = vect;
        --sz;
        ++vect;
    
        if ( !sz )
            return val;
    
        return recmin(vect,val,sz);
    }
    
    float* minimo(const float* vect,int sz)
    {
        return recmin(vect,vect,sz);
    }
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Mah.. Sarà. Comunque, sareste così gentili da spiegarmelo? Non conosco qualche sintassi. Grazie
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Cosa non conosci?
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Il primo if e perché (float *)array tra parentesi?
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Parli di questo

    if(--size==0)

    ?
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Esatto
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Non c'è molto da capire ...

    E' equivalente a queste due righe

    --size;
    if(size==0)

    Così le comprendi meglio?
Devi accedere o registrarti per scrivere nel forum
26 risposte