Salve, vorrei un parere sul seguente esercizio:
ES: Scrivete un programma che produca 20 numeri casuali compresi tra 1 e 20. Il programma dovrà immagazzinare in un vettore tutti i valori non duplicati. Utilizzate il vettore più piccolo possibile per portare a termine questo compito.
Io ho svolto l'esercizio in questo modo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define DIM 21 // impostato a 21 per poter partire da 1
void trova_duplicati();
int main()
{
srand(time(NULL));
printf("\nTROVA DUPLICATI\n");
trova_duplicati();
printf("\n\n");
return 0;
}
void trova_duplicati()
{
int i, j, y = 1, trovato, casuale, vettore[DIM] = {0};
printf("\ngenero %d numeri casuali : \n\n", DIM - 1);
for(i = 1; i < DIM; i++)
{
printf("%d ", casuale = 1 + rand() % 20);
trovato = 0;
for(j = 1; j <= y; j++)
{
if(vettore[j] == casuale)
{
trovato++;
}
}
if(trovato == 0)
{
vettore[y] = casuale;
y++;
}
}
printf("\n\nstampo il vettore senza duplicati :\n\n");
for(i = 1; i < y; i++)
printf("%d ", vettore[i]);
}
Il mio codice funziona ma il vettore che stampo prende come "dimensione di stampa" y ma la sua dimensione effettiva è quella di DIM, infatti sostituendo DIM a y nell'ultimo for il codice mostrerebbe oltre i numeri diversi tanti 0 quanto serve per raggiungere DIM. La mia domanda è, 20 è l'effettiva dimensione minima necessaria? Quello a cui ho pensato io è, poichè i numeri sono casuali, il caso peggiore dovrebbe essere che sono tutti diversi, e quindi necessito di venti elementi. Potreste dirmi se è corretto? Esiste qualche modo per creare il vettore con l'effettiva dimensione nei numeri diversi?
Grazie