Blue Flower

La ripetizione con contatore

Nel linguaggio C, la struttura di ripetizione con contatore (o enumerativa) viene rappresentata con la struttura for nel modo seguente:

for (i=inizio; i<=fine; i++)
{

istruzioni;
}

La notazione i++ indica l’incremento unitario per il contatore.
Le istruzioni da eseguire in modo iterato possono essere una o più istruzioni. In presenza di più istruzioni è necessario racchiuderle tra una coppia di parentesi graffe.
Le istruzioni vengono ripetute tante volte, quante ne occorrono per portare il valore del contatore dal valore iniziale al valore finale.
Il contatore deve essere una variabile dichiarata di tipo int.

for(i=1;i<=20;i++)
{

scanf("%d", &numero);
printf("%d \n", numero*2);
}

rappresenta un’iterazione per ottenere il doppio di 20 numeri inseriti da tastiera.
La struttura di ripetizione con contatore è una struttura derivata dalla struttura fondamentale di ripetizione, nel senso che il controllo della ripetizione delle istruzioni mediante un contatore può essere realizzato in modo equivalente usando una struttura di ripetizione postcondizionale do… while o una struttura precondizionale while, come si vede dal seguente esempio.

Queste tre strutture sono funzionalmente equivalenti:

struttura for

for(i=1;i<=n;i++)
{

printf("xxxxxxxxx \n");
}

struttura do … while

i = 1;
do
{

printf("xxxxxxxxx \n");
i++;
}
while (i<=n);

struttura while

i = 1;
while (i<=n)
{

printf("xxxxxxxxx \n");
i++;
}

La struttura for, nel caso di ripetizione con un numero prefissato di volte, risulta più compatta e più semplice da rappresentare rispetto alla struttura while, in quanto dentro il for sono rappresentati l’assegnazione del valore iniziale del contatore e l’incremento del contatore stesso.

Il programma seguente calcola il doppio dei primi 30 numeri naturali:

#include <stdio.h>
main()
{
/* input */
int i;
for(i=1;i<=30;i++)
{

printf("%d \n", i*2);
}
}

Il programma seguente produce su video la tavola pitagorica:

#include <stdio.h>
main()
{

/* input */
int r,c;
for(r=1;r<=10;r++)
{

for(c=1;c<=10;c++)
printf("%5d ",r*c);
printf("\n");
}
}

r indica il numero di riga, c il numero di colonna. I prodotti di ciascuna r per i diversi c vengono visualizzati sulla stessa riga all’interno di 5 posizioni di stampa (specificatore di formato “%5d”).
Alla fine di ogni riga c’è un ritorno a capo con l’istruzione printf(“\n”).
Il programma mostra l’uso di un ciclo for interno con contatore c, e di un ciclo for esterno con contatore r.
Per ogni valore di r vengono eseguite due istruzioni for e printf(“\n”); per questo motivo occorre usare le parentesi graffe.
Per ogni valore di c viene invece eseguita la sola istruzione printf e pertanto non occorrono le parentesi graffe.

La struttura di scelta multipla
Nel linguaggio C la struttura di scelta multipla è realizzata dall’istruzione switch e ha il seguente formato:

switch(variabile)
{
case valore-1:
istruzioni-1;
break;
case valore-2:
istruzioni-2;
break;
. . . . . .
case valore-n:
istruzioni-n;
break;
default:
istruzioni;
break;
}

Dopo la parola switch, tra parentesi tonde, è indicato il nome della variabile (selettore) di cui si deve controllare il valore per decidere quale strada seguire tra quelle possibili.
Accanto ai valori previsti, per ogni case, devono essere scritti l’istruzione o il blocco di istruzioni da eseguire nel caso che la variabile assuma quei valori.
Se nessuno dei valori elencati corrisponde al valore di variabile, vengono eseguite le istruzioni scritte dopo default.
Di solito, uno solo dei casi tra quelli previsti deve essere eseguito: è possibile quindi interrompere il controllo degli altri casi inserendo l’istruzione break che provoca l’uscita dalla struttura switch.
La struttura di selezione multipla è una struttura derivata dalla struttura fondamentale di selezione binaria, in quanto potrebbe essere rappresentata utilizzando una successione di 
controlli annidati del tipo if (condizione) ... else ...

Per esempio:

if (variabile == 1)
istruzioni1;
else
if (variabile == 2)
istruzioni2;
else
if (variabile == 3)
istruzioni3;
else
istruzioni4;

ESEMPIO: Sconto progressivo nella vendita di prodotti

Per la vendita di un prodotto si deve applicare uno sconto progressivo in base al numero dei pezzi ordinati secondo la tabella:

Pezzi Sconto
fino a 3 5%
fino a 5 10%
fino a 10 20%
più di 10 30%

Le informazioni necessarie per risolvere il problema sono: il numero dei pezzi e il prezzo dell’articolo. In base al numero dei pezzi si determina la percentuale dello sconto e si calcola l’importo totale scontato.

Programma C

/* ScontoProgr.c : sconto progressivo sui prodotti */
#include <stdio.h>
main()
{
/* input */
float prezzo; /* prezzo del prodotto */
int pezzi; /* pezzi acquistati */
/* output */
float importo; /* importo da pagare */
/* lavoro */
int sconto; /* percentuale di sconto */
printf("Pezzi acquistati: ");
scanf("%d", &pezzi);
printf("Prezzo del prodotto: ");
scanf("%f", &prezzo);
switch(pezzi)
{
case 1:
case 2:
case 3:
sconto = 5;
break;
case 4:
case 5:
sconto = 10;
break;
case 6:
case 7:
case 8:
case 9:
case 10:
sconto = 20;
break;
default:
sconto = 30;
break;
}
importo = (float)pezzi * prezzo * (100-sconto)/100;
printf("Importo da pagare = %10.2f \n", importo);
}

Si noti che le stesse istruzioni possono essere eseguite in corrispondenza di più valori possibili per la variabile: i diversi valori sono elencati con la parola case uno di seguito all’altro.

ESERCIZI

Struttura sequenziale

  1. Scrivere il programma che, ricevuto in input un numero intero positivo L, calcoli il perimetro e l’area di un quadrato di lato L.
  2. Scrivere il programma che, letto un numero intero, calcoli e scriva la sua metà.
  3. Dato il raggio del cerchio di base di un cilindro e la sua altezza, calcolare il peso del cilindro sapendo che la sostanza di cui è composto ha peso specifico = 3.4 g/cm³ (Volume = area della base x altezza; Peso = Volume x Peso specifico).
  4. Data la parabola di equazione y = a x2 + b x + c, determinare le coordinate del vertice V (xv, yv), ricordando che la sua ascissa si ottiene con la formula xv = - b / (2 * a).

Struttura di alternativa

  1. Una nuova compagnia telefonica ha promosso l’offerta “oltre80”: alla cifra fissa di 0,10 euro (costo alla risposta) occorre aggiungere la cifra di 0,15 euro per ogni secondo del tempo della telefonata; però oltre gli 80 secondi la tariffa per ogni secondo è di 0,09. Fornito da tastiera il numero dei secondi della telefonata, visualizzare il costo totale della chiamata. (Le tariffe indicate nel testo del problema possono diventare più opportunamente costanti).
  2. Conoscendo il risultato di una partita di calcio ad eliminazione diretta (non è consentito il pareggio), si vuole visualizzare il nome della squadra vincente.
  3. Dati i nomi di tre studenti e la distanza in Km. da casa a scuola, visualizza il nome degli studenti che abitano in comuni distanti più di 30 Km.
  4. Su un reddito si paga l’imposta del 35% se il reddito è superiore a 60.000 euro, altrimenti il 23%. Quanto si deve pagare?

Struttura di ripetizione

  1. Costruire un programma che accetta da tastiera dei numeri finché viene inserito il valore 0; man mano li visualizza.
  2. Costruire un programma che accetta da tastiera dei nomi e li conta. L’inserimento si interrompe quando il numero dei nomi inseriti diventa 10.

Struttura di ripetizione precondizionale

  1. Dato un elenco di prodotti con descrizione e prezzo, calcolare l’incremento del prezzo secondo una percentuale fornita da tastiera. Comunicare per ciascun prodotto la descrizione e il prezzo incrementato.
  2. Calcolare il consumo medio di carburante di un elenco di veicoli utilizzando come dati di input i valori dei km percorsi e dei litri di carburante per ciascun veicolo.

Struttura di ripetizione con contatore

  1. Costruire un programma che accetta da tastiera un elenco di N prezzi e li somma. Alla fine fornisce il totale dei prezzi inseriti.
  2. Dati i risultati in un test di una classe di 20 studenti, con nome e giudizio rappresentato con un valore numerico (1= sufficiente, 2 = buono, 3 = distinto, 4 = ottimo), calcolare la media dei giudizi usando i valori come peso.

Struttura di scelta multipla

  1. Dato un elenco di numeri compresi tra 1 e 7, visualizzare il giorno della settimana corrispondente a ciascuno, usando la seguente decodifica: 1 = lunedì, 2 = martedì, …, 7 = domenica.
  2. Un grande magazzino ha 4 reparti, rappresentati con i numeri 1, 2, 3, 4. La Direzione decide di applicare sui prodotti di ciascun reparto sconti con percentuali differenziate e precisamente: reparto 1 = sconto 0% (nessuno sconto), reparto 2 = sconto 3%, reparto 3 = sconto 2%, reparto 4 = sconto 5%. Dati N prodotti con reparto di appartenza e prezzo, calcolare e visualizzare per ciascuno il prezzo scontato.