[C] - Elimina Duplicati

di il
6 risposte

[C] - Elimina Duplicati

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

6 Risposte

  • Re: [C] - Elimina Duplicati

    Ma perché 21 elementi? Perché parti da 1 con l'indice?

    Ti bastano 20 elementi. All'inizio il riempi con i numeri da 1 a 20 e poi li mischi casualmente a due a due
  • Re: [C] - Elimina Duplicati

    g@lil3o ha scritto:


    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?
    Il worst case è 20, quindi a parte che hai usato un array da 21 il ragionamento è corretto. Se hai fatto puntatori e memoria dinamica, dovresti usare realloc() come sembra dalla traccia dall'esercizio, anche se poi verrà fuori una soluzione meno efficiente come tempi di esecuzione
    https://en.cppreference.com/w/c/memory/reallo
  • Re: [C] - Elimina Duplicati

    oregon ha scritto:


    Ma perché 21 elementi? Perché parti da 1 con l'indice?

    Ti bastano 20 elementi. All'inizio il riempi con i numeri da 1 a 20 e poi li mischi casualmente a due a due
    Sono partito da 1 consapevolmente poichè non volevo partire da zero e per questo ho usato una dimensione di 21 elementi. Se faccio come dici avrei i primi 20 numeri naturali in ordine casuale ma non potrei scartare i duplicati poichè non ci sono e quindi la traccia non avrebbe senso.
  • Re: [C] - Elimina Duplicati

    Weierstrass ha scritto:


    g@lil3o ha scritto:


    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?
    Il worst case è 20, quindi a parte che hai usato un array da 21 il ragionamento è corretto. Se hai fatto puntatori e memoria dinamica, dovresti usare realloc() come sembra dalla traccia dall'esercizio, anche se poi verrà fuori una soluzione meno efficiente come tempi di esecuzione
    https://en.cppreference.com/w/c/memory/reallo
    Si ne ho usati 21 consapevolmente. Per quanto riguarda puntatori e memoria dinamica ora dovrei iniziare i puntatori e la traccia di questo esercizio si trova in un capitolo precedente a tale argomento.
  • Re: [C] - Elimina Duplicati

    g@lil3o ha scritto:


    Si ne ho usati 21 consapevolmente.
    E hai sbagliato. Ragionaci un attimo e vedrai che il problema si può risolvere con un array da 20. Se la traccia ti chiede una cosa, se tu non fai quella - consapevolmente o no - sempre errore è
  • Re: [C] - Elimina Duplicati

    Si, il mio array è di 21 elementi, definisco DIM a 20 e ho effettivamente 20 elementi (da 0 a 19) poi iniziallizzo y a 0 invece che a 1 e nei for parto da 0.
Devi accedere o registrarti per scrivere nel forum
6 risposte