Riempire array con controllo

mathys
ciao a tutti sto cercando di fare un programmino in C che legge 5 numeri inseriti da tastiera e li mette in un array.
dopo questo vorrei calcolare la media dei valori e la loro frequenza.
ho cominciato la prima parte con un ciclo for e ad ogni ciclo prelevo i numeri con scanf immettendoli nell'array.
pero gia qui mi blocco!
come posso mettere un controllo in modo che i numeri inseriti debbano essere compresi in un range tipo 1-10?
avevo pensato ad un if ma non so come implementarlo, mi aiutate gentilmente?

Risposte
vict85
Nel caso in cui il numero non sia nel range che deve fare il codice? Richiedere nuovemente il numero, oppure inserire un numero di default?

Sherlock.h
Un do-while farebbe al caso tuo. ;)
EDIT:Scusa Vict85, non avevo visto la tua risposta.

mathys
Nel caso non sia nel range chiedere di reinserire il numero avvisando l utente

vict85
Si può fare con un do-while oppure con un for.

Con il for per esempio verrebbe qualcosa di questo tipo:
for(int i = 0; i != 5; ++i)
{
  int t;
  scanf("%d", &t);
  if( 0 < t && t < 10)
    a[i] = t;
  else
  {
    puts("Numero non valido ...");
    --i;
  }
}

con il do-while lo lascio a te.

La versione con il do-while fa due operazioni in meno quando non entri del range ma lo scanf sovrasta ampiamente le performance quindi sono insignificanti.

mathys
con il do while sono ancora in fase di studio e sto provando qualcosa su questo tipo di codice:

do
{
scanf("%d", &temp);
for (j = 0; j < SIZE1; j++)
array1[j] = temp;
} while((temp <= 10) && (temp >= 1));

non riesco a capire per ora il motivo per cui non va

mathys
ecco :)

do
{
scanf("%d", &temp);
if ((temp <= 10 ) && (temp >= 1))
array1[j] = temp;
else
{
printf("inserisci un voto valido");
return 1;
}
j++;
} while(j < SIZE1);


ovviamente sono agli inizi, questo codice funziona ma accetto critiche e consigli :)
buona giornata

vict85
SUL PRIMO CODICE: Sinceramente non capisco come tu possa pensare che quel codice faccia quello che richiede l'esercizio. Insomma: legge un valore intero e lo scrive in ogni elemento di un array lungo SIZE1, se questo elemento è nel range richiesto ripete il procedimento sovrascrivendo ogni elemento dell'array altrimenti esce.

SUL SECONDO: il codice è quasi corretto. Dovresti comunque usare il tag
[code]
[/code]

Le correzioni:
do
{
  scanf("%d", &temp);
  if ((temp <= 10 ) && (temp >= 1))
  {
    array1[j] = temp;
    j++;
  }
  else 
    printf("inserisci un voto valido\n");
} while(j < SIZE1);

mathys
Grazie vict per l'aiuto ma non capisco la correzione, cioè io voglio che lui deve accettare solo valori nel range 1-10 con gli estremi compresi e non solo 1. Per il resto ho capito grazie

mathys
ho un'ulteriore richiesta legata sempre a questo piccolo esercizio:
adesso ho creato un nuovo array "frequenze" di 10 elementi che vorrei usare per immagazzinare gli incrementi dei vari voti, quindi stampare alla fine del programmino la frequenza dei vari voti.
ecco per fare questo ho usato uno switch case, nel mio caso ho 10 case quindi tutto sommato non tanto ripetitivo, ma nel caso avessi avuto centinaia di case era un problema.
la mia domanda e' avrei potuto incrementare l'array frequenze senza usare uno switch case?
forse con una funzione esterna?
grazie

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.