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);
}
}