Ciao, questa e' la soluzione che propongo:
/*
* insieme.c
*
* Descrizione : Routines per la gestione di un insieme di integer.
* L'insieme viene terminato con il terminatore TERMINA_INSIEME.
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include "insieme.h"
#define MAX_BUFF (255)
#define TERMINA_INSIEME 'Z'
typedef enum { FALSE, TRUE } Bool;
/* Prototipi funzioni private */
static int* add_elemento (int*, unsigned, int);
/*
* extern int* Insieme_input(void);
*
* Descrizione : Input di un insieme da tastiera.
* Parametri : void
* Valore di ritorno : Indirizzo del primo elemento dell'insieme.
* Data : 28/04/2010
*/
extern int* Insieme_input(void) {
Bool end;
unsigned nElem;
int* v;
char s[MAX_BUFF];
end = FALSE;
nElem = 0;
v = NULL;
while (!end) {
printf("[-] Elemento %d: ",nElem + 1);
fgets(s,sizeof(s) - 1,stdin);
if (s[0] == '\n') end = TRUE;
else
v = add_elemento(v,nElem++,atoi(s));
}
/* La gestione interna dell'insieme e' mia quindi lo termino come voglio */
v = add_elemento(v,nElem,TERMINA_INSIEME);
return v;
}
/*
* extern void Insieme_output(const int* insieme);
*
* Descrizione : Output su video di un insieme.
* Parametri : Indirizzo del primo elemento dell'insieme.
* Valore di ritorno : void
* Data : 28/04/2010
*/
extern void Insieme_output(const int* insieme) {
unsigned n;
for (n = 0; *(insieme + n) != TERMINA_INSIEME; ++n)
printf("[-] Elemento %d => %d\n",n + 1,*(insieme + n));
}
/*
* extern int Insieme_mediano(const int* insieme);
*
* Descrizione : Cerca e restituisce il valore mediano dell'insieme
* NON vuoto.
* Parametri : Indirizzo del primo elemento dell'insieme.
* Valore di ritorno : Valore mediano dell'insieme.
* Data : 28/04/2010
*/
extern int Insieme_mediano(const int* insieme) {
unsigned dim;
int mediano;
int m1;
int m2;
for (dim = 0; *(insieme + dim) != TERMINA_INSIEME; ++dim)
;
if (dim % 2) mediano = (dim + 1) / 2;
else {
m1 = dim / 2;
m2 = (dim / 2) + 1;
mediano = (m1 + m2) / 2;
}
return *(insieme + --mediano);
}
/*
* extern int Insieme_massimo(const int* insieme);
*
* Descrizione : Cerca e restituisce il valore massimo dell'insieme
* NON vuoto.
* Parametri : Indirizzo del primo elemento dell'insieme.
* Valore di ritorno : Valore massimo dell'insieme.
* Data : 28/04/2010
*/
extern int Insieme_massimo(const int* insieme) {
static unsigned ipos = 0;
static int max = INT_MIN;
if (*(insieme + ipos) != TERMINA_INSIEME) {
if (max < *(insieme + ipos)) max = *(insieme + ipos);
++ipos;
return Insieme_massimo(insieme);
}
return max;
}
/*
* extern int Insieme_minimo(const int* insieme);
*
* Descrizione : Cerca e restituisce il valore minimo dell'insieme
* NON vuoto.
* Parametri : Indirizzo del primo elemento dell'insieme.
* Valore di ritorno : Valore minimo dell'insieme.
* Data : 28/04/2010
*/
extern int Insieme_minimo(const int* insieme) {
static unsigned ipos = 0;
static int min = INT_MAX;
if (*(insieme + ipos) != TERMINA_INSIEME) {
if (*(insieme + ipos) < min) min = *(insieme + ipos);
++ipos;
return Insieme_minimo(insieme);
}
return min;
}
/*
* extern void Insieme_cancella(int* insieme);
*
* Descrizione : Cancella, liberando la memoria occupata, l'insieme.
* Parametri : Indirizzo del primo elemento dell'insieme.
* Valore di ritorno : void
* Data : 28/04/2010
*/
extern void Insieme_cancella(int* insieme) {
free(insieme);
}
/* ******************* Implementazione funzioni private ******************** */
static int* add_elemento(int* v, unsigned n, int val) {
if (!(v = realloc(v,(n + sizeof(int)) * sizeof(int)))) {
perror("realloc()");
exit(-1);
}
*(v + n) = val;
return v;
}
Come si puo' vedere nell'indice 0 (zero) del vettore non inserisco la dimensione dell'insieme, per poter determinare la fine dell'insieme lo termino con un valore arbitrario (TERMINA_INSIEME), un po' come fa il C per determinare la fine di una stringa ('\0').
La funzione "Insieme_input" prende da stdin elemento per elemento fino a quando non si inserisce un elemento nullo, cioe' si preme solamente il tasto INVIO.
Dato che deve essere una libreria il suo header e':
#ifndef INSIEME_H_
#define INSIEME_H_
#ifdef __cplusplus
extern "C" {
#endif
extern int* Insieme_input (void);
extern void Insieme_output (const int*);
extern int Insieme_mediano (const int*);
extern int Insieme_massimo (const int*);
extern int Insieme_minimo (const int*);
extern void Insieme_cancella (int*);
#ifdef __cplusplus
}
#endif
#endif /* INSIEME_H_ */
Le funzioni della libreria possono essere usate in modo simile a questo:
int main(void) {
int* v;
v = Insieme_input();
printf("\nElementi dell'insieme:\n");
Insieme_output(v);
printf("\nElemento di valore massimo => %d\n",Insieme_massimo(v));
printf("Elemento di valore minimo => %d\n",Insieme_minimo(v));
printf("Valore elemento mediano => %d\n",Insieme_mediano(v));
Insieme_cancella(v);
return 0;
}
Questa volta credo (e sperto) di aver rispettato tutte le consegne
Saluti, netburst.