Friday, December 13th 2019

While in C

Scopriamo come i controlli iterativi ci permettono di ripetere blocchi di codice e come usarli a nostro favore.

Programma di Esempio

Supponiamo di dover scrivere un programma che chieda in input un numero e stampi n volte la parola Ciao, dove n è il numero inserito dall’utente.

Se proviamo a scriverlo con delle istruzioni if else ci rendiamo subito conto di essere incappati in un processo infinito. Se decidiamo di fermarci ad un certo numero abbiamo comunque scritto un programma lunghissimo per fare una cosa molto semplice. Come possiamo scrivere il programma in maniera più efficiente?

#include <stdio.h>

int main(){
    int numero;

    scanf("%d",&numero);

    // stampo un numero di ciao diverso in base a numero
    if(numero > 0){
        if(numero == 1) {
            printf("Ciao \n");
        }
        else if(numero == 2) {
            printf("Ciao \n");
            printf("Ciao \n");
        }
        else if(numero == 3) {
            printf("Ciao \n");
            printf("Ciao \n");
            printf("Ciao \n");
        }
        //...
    }

    return 0;
}

La soluzione consiste nell’utilizzare l’istruzione while.

#include <stdio.h>

int main(){
  int numero;

  scanf("%d",&numero);

  // finchè i è minore di numero stampo ciao
  int i = 0;
  while(i < numero){

    printf("Ciao \n");

    //ogni volta che i risulta minore di numero
    //incremento di 1 il suo valore
    i = i + 1;
  }

  return 0;
}

L’ output di questo programma inserendo in input il numero 3 è:

Ciao
Ciao
Ciao

Il ciclo while

La nuova istruzione che abbiamo visto nell’esempio precedente è un ciclo while, che ci permette di iterare il suo contenuto finchè la condizione tra parentesi tonde risulta vera.

utilizzo while c

Guardando il programma d’esempio, la variabile i è stata aumentata alla fine di ogni iterazione. Questo ci permette di controllare il numero di iterazioni e di valutare falsa la condizione i < n in modo di uscire dal ciclo while. Senza la variabile i stamperemmo Ciao all’infinito.

tabella di trace istruzione while c

Scrivendo una tabella di traccia del programma possiamo vedere come il contenuto del ciclo while viene eseguito finchè la condizione è vera. Dopodichè il programma continua la sua esecuzione.

Calcolo del numero primo

Ora che abbiamo imparato la sintassi dell’ istruzione while scriviamo il programma per verificare se un numero è primo.

#include <stdio.h>

int main(){
    int numero;
    int primo=1;

    //chiedo in input numero
    printf("Inserisci un numero maggiore di 0: ");
    scanf("%d",&numero);

    //Parto dal primo numero maggiore di 1 cioè 2
    int i = 2;
    if(numero > 1){

        //cerco un numero più piccolo di numero
        //che è un divisore di numero
        while(i < numero){

        if(numero % i == 0){
            // se lo trovo allora numero non è primo
            primo = 0;
        }

        i = i + 1;
        }

    }
    else {
        //Se il numero inserito è minore di 2 non può essere primo
        primo = 0;
    }

    if(primo == 1){
        printf("Numero primo");
    }
    else{
        printf("Numero non primo");
    }


    return 0;
}

Testiamone il funzionamento:

Inserisco dei numeri primi ( 2, 3, 19, 113):

Numero primo

Inserisco dei numeri non primi ( 10, 50, 200, 134):

Numero non primo

Cosa è successo?

Sappiamo che un numero primo per definizione è un numero naturale maggiore di 1, divisibile per 1 e per se stesso. Se scriviamo un ciclo while dove al suo interno proviamo a dividere un numero n per tutti i numeri da 2 a n – 1 e una di queste operazioni ha resto 0 allora possiamo affermare che il numero non è primo. In caso contrario è primo.

range valori numero primo

Creiamo quindi due variabili: numero e primo. numero conterrà il numero richiesto in input mentre primo sarà inizializzato a 1 e lo assegneremo a 0 nel caso in cui il numero non fosse primo. Accertiamoci che il numero inserito sia maggiore di 1. In caso contrario possiamo essere sicuri che il numero non è primo.

int numero;
int primo=1;

printf("Inserisci un numero maggiore di 0: ");
scanf("%d",&numero);

if(numero > 1){
    //...
}
else{
    primo = 0;
}

Assegniamo a i il valore 2 e incrementiamo il suo valore ad ogni iterazione del while. Quando i non sarà più minore di n il programma proseguirà la sua esecuzione.

int i=2;
while(i < numero){

    //...

    i = i + 1;
}

All’interno del while vediamo se il resto di n / i è uguale a 0. Se si il numero è divisibile per altri valori oltre a 1 e se stesso e quindi non è primo. Assegniamo quindi 0 a primo e proseguiamo.

if(numero % i == 0){
    primo = 0;
}

Se primo è 1 avvisiamo l’utente che ha inserito un numero primo altrimenti stampiamo numero non primo.

if(primo == 1){
  printf("Numero primo");
}
else{
  printf("Numero non primo");
}

Ecco spiegato il funzionamento del programma! Come avrai notato i programmi stanno diventando più lunghi. Nei prossimi tutorial scopriremo delle nuove istruzioni che ci permetteranno di accorciarli, ottenendo un codice pulito e leggibile.