DOMANDA Esercizio Di Eliminazione Dei Duplicati In C

Salvo9595

Nuovo Utente
4
0
Ciao a tutti, sto imparando il C dal manuale di Deitel per l'esame di programmazione 1.
Ho terminato il capitolo degli array e ora ho un problema con un determinato esercizio.
La traccia dice:
"Utilizzate un vettore unidimensionale per risolvere questo problema. Leggete in input 20 numeri, ognuno dei quali sarà compreso tra 10 e 100, estremi inclusi. Ogni volta che leggete un numero, visualizzatelo qualora non sia un duplicato di uno già letto. Preparatevi al "caso peggiore" in cui tutti e 20 numeri siano differenti. Utilizzate il vettore più piccolo per risolvere questo problema."

Il problema che ho riscontrato è che non riesco a implementare nel codice il controllo del <10 e >100

Il codice è questo:
Codice:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 20

int main()
{
    int a[SIZE], i, temp[SIZE], j;

    for ( i = 1; i <= SIZE; i++ ){
        printf (  "Inserire %d-esimo elemento dell'array (valore compreso tra 10 e 100): ", i  );
        scanf (  "%d", &a[i] );
        if (  a[i]  <  10 &&  a[i]  >  100 )
         {
           printf ( "Errore\n" );
           break;
         }
    }
}

Anche se inserisco 101 o 9 in input continua a chiedermi altri valori fino al 20esimo.
Come posso risolvere? è come se non mi leggesse il controllo sottostante.
Ringrazio in anticipo chi mi aiuterà.

@EDIT Ho risolto, avevo messo && invece di || e ovviamente era impossibile inserire un valore minore di 10 e allo stesso tempo maggiore di 100, non ci avevo fatto caso.

Adesso però non so come andare avanti, ho dichiarato un array temp sempre con size 20 dove concettualmente dovrei memorizzare i dati dell'array a e confrontare poi i successivi inserimenti con quelli già memorizzati in temp credo, solo che non so come farlo praticamente
 
Ultima modifica:

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Dopo la lettura dell'i-esimo numero, controlla se quel numero esiste già nell'array, cioè se uno dei numeri nelle prime "i" posizioni è uguale a quello inserito. In caso negativo, visualizzi il valore.
Non capisco comunque cosa voglia dire con "preparatevi al caso peggiore"...
Non mi è molto chiaro nemmeno "utilizzate il vettore più piccolo". Con un vettore di lunghezza 20 sicuramente il problema si risolve, non penso che intenda un vettore dinamicamente (ri)allocato ad ogni inserimento; in questo caso non si può nemmeno parlare propriamente di "vettore" in quanto si alloca direttamente della memoria. Si può fare, come mostrato in qualche thread fa, ma non mi è mai parsa una cosa ottimale farlo per *ogni* inserimento.
 
Ultima modifica:

Eduadie

Utente Attivo
204
24
Anche a me la traccia non è molto chiara però provo a farti capire come l'ho intesa io.

Se io ad esempio riempissi il primo array (facendolo più piccolo) di 5 elementi potrei avere: 10 22 31 22 45.
Utilizzando in contemporanea un array di supporto che memorizzi solo gli elementi non duplicati il tuo tmp sarebbe: 10 22 31 45.

A questo punto potresti visualizzare l'array tmp direttamente per la risoluzione dell'esercizio.
 

Salvo9595

Nuovo Utente
4
0
Si è quello il punto la traccia non è chiara neanche a me, il punto è che posso utilizzare un solo array come dice la traccia, quindi l'array temp non posso utilizzarlo per memorizzare i duplicati.
Non capisco quindi come faccio a confrontare gli elementi già inseriti dell'array a per vedere se ci sono duplicati, sono riuscito soltanto a farlo verificando se l'elemento precedente è già stato inserito ovvero se temp-1 == a(i) mi visualizza "Valore duplicato".

Senza l'array temp e quindi con un solo array che memorizza gli input come faccio a fare questa verifica?
 

Eduadie

Utente Attivo
204
24
Ah io invece credevo dovessi utilizzarlo l'array tmp.

Ti basta scorrere l'array fino all'indice dell'elemento che stai inserendo e controllare se questo numero è stato già inserito nell'array.

Nel caso precedente che ti ho fatto arrivato al secondo 22 scorrendo l'array dall'indice 0 all'indice 2 verifica che all'indice 1 c'è il 22 quindi non deve visualizzarlo.
 

Salvo9595

Nuovo Utente
4
0
Scusami ma non mi è ancora chiaro, dovrei quindi utilizzare una variabile momentanea che memorizza l'indice per il secondo for innestato?
 

Eduadie

Utente Attivo
204
24
No, non ti serve nessun altra variabile poichè hai già i e il ciclo for di controllo deve partire da 0 e terminare ad i-1. Se l'elemento è già stato inserito non deve visualizzarlo.

Mi sono accorto di un errore però: tu fai partire il for da 1 ed è errato poichè gli array memorizzano elementi dalla posizione 0 a size-1.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Mi sono accorto di un errore però: tu fai partire il for da 1 ed è errato poichè gli array memorizzano elementi dalla posizione 0 a size-1.
Nessun errore, il conteggio ( a livello di memoria) parte si da 0, ma gli elementi vengono memorizzati in base all'indice dato (in questo caso 1).
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
  • Mi piace
Reazioni: Eduadie

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili