Il Linguaggio C - Cicli for, while, do-while ed Esercizi.

VII. Cicli ed Esercizi di Riepilogo

« Older   Newer »
 
  Share  
.
  1.     Like  
     
    .
    Avatar

    Advanced Member

    Group
    Honorary Member
    Posts
    1,843
    Respect
    +90
    Location
    Carcere Statale del Mississippi

    Status
    Offline
    Cicli for, while, do-while ed Esercizi di Riepilogo



    Arriviamo adesso ad uno degli argomenti più importanti in termini di programmazione: i cicli. I cicli sono delle istruzioni che ripetono il codice che contengono nel loro blocco, nel loro dominio, fino a quando la condizione che viene dichiarata non viene soddisfatta. Abbiamo due tipologie di cicli: cicli con controllo della condizione in entrata e cicli con controllo in uscita. I cicli con controllo in entrata controllano la condizione prima di eseguire le istruzioni contenute nel suo blocco; i cicli con controllo in uscita eseguono prima le istruzioni e poi verificano se la condizione è soddisfatta. In entrambi i casi sta al programmatore trovare l'algoritmo adatto per il tipo di ciclo.

    while


    Il ciclo while si implenta nel codice con questa sintassi:

    while(condizione){
    /*codice*/
    }


    La condizione del ciclo while, come quella di tutti gli altri cicli, ricalca quelle del costrutto if-else. E' un tipo di ciclo con controllo in entrata, quindi il programma verificherà prima la condizione e poi eseguirà il codice. "Finché è vero questo, esegui queste istruzioni"


    do-while


    Il ciclo do-while si implenta nel codice con questa sintassi:

    do{
    /*codice*/
    }while(condizione);


    Il ciclo do-while è un tipo di ciclo con controllo in uscita, quindi il programma prima eseguirà il codice e poi verificherà la condizione. "Esegui queste istruzioni finché è vero questo."


    for


    Il ciclo for è un ciclo leggermente più complesso degli altri due. Ammette una condizione d'entrata (che molto spesso è un assegnamento di un valore ad una variabile), una per rimanere nel ciclo e una d'uscita che viene eseguita ogni volta che il ciclo si ripete.
    E' un tipo di ciclo con controllo in entrata. "Esegui questa istruzione; Finché è vero questo, esegui il codice; Infine esegui questa istruzione e ricontrolla la condizione"

    for(istruzione_d'ingresso;condizione_di_permanenza_nel_ciclo;istruzione_d'uscita){
    /*codice*/
    }


    Esercizi



    L'esercizio costante porta al successo. Sono a difficoltà crescente, soluzioni sotto spoiler.



    Esercizio 0.1 (ripresa dell'if): Si scriva un programma in C che, dati in ingresso tre numeri stampi a video rispettivamente il maggiore, il minore e la loro somma (solo if, niente cicli)
    Soluzione:

    CODICE
    #include <stdio.h>

    int main(void) {int a,b,c,somma;
           scanf("%d", &a);
           scanf("%d", &b);
           scanf("%d", &c);
           printf("---------------------------REPORT--------------------------------------\n");
           somma=a+b+c;
           if(a==b&&b==c) {printf("I numeri %d %d %d sono uguali\n", a,b,c);
                   printf("---------------------------END REPORT----------------------------------\n");}
           else {
           if (a>=b&&a>c){printf("Il massimo e': %d\n", a);}
           if (b>a&&b>c){printf("Il massimo e': %d\n", b);}
           if (c>=b&&c>a){printf("Il massimo e': %d\n", c);}
           if (a<=b&&a<c){printf("Il minimo e': %d\n", a);}
           if (b<a&&b<c){printf("Il minimo e': %d\n", b);}
           if (c<=b&&c<a){printf("Il minimo e': %d\n", c);}
           printf("La somma e': %d\n", somma);
           printf("---------------------------END REPORT----------------------------------\n");
           }
           

           getchar();
           return(0);
    }




    Esercizio 1: Si scriva un programma in C che calcoli la radice quadrata intera di un numero dato da tastiera.
    Soluzione:

    CODICE
    #include <stdio.h>

    int main(void) {int x,radx,i;
           scanf("%d", &x);
           i=0;
           for(radx=0;radx<x;i++){
                   radx=i*i;
           }
           printf("La radice quadrata (intera) e' %d", i-1);
           getchar();
           return(0);
    }



    Esercizio 2: Si scriva un programma in C che calcoli la somma di tutti i numeri che vengano inseriti da tastiera fino a che non si inserisca -1.
    Soluzione:

    CODICE
    #include <stdio.h>

    int main(void) {int n=0,a,somma;
    scanf("%d",&a);
    if(a>-1){
           for(somma=a;n>-1;somma=somma+n){
                   
                   scanf("%d",&n);
    }
           

    printf("La somma e' %d", somma+1);
    }

    else printf("La somma e' 0");
    getchar();
    return(0);
    }



    Esercizio 3: Si scriva un programma in C che, dato un numero da tastiera tra 0 e 30, stampi a video tutti i numeri pari e i numeri dispari precedenti a quel numero. Esempio: preso in input 4: i numeri pari sono: 2, i dispari sono: 1, 3.
    Soluzione:

    CODICE
    #include <stdio.h>

    int main (void){int x,i,n;

    scanf("%d", &x);
    if(x>=0&&x<=30) {
           printf("Dispari:\n");
           for(i=1;i<x;i++)
           {        
                   n=i%2;
                   if(n!=0) printf("%d\n", i);
                   
    }
           printf("Pari:\n");
           for(i=1;i<x;i++){
                   n=i%2;
                   if(n==0){printf("%d\n", i);}
           }
    }
    else printf("Non provarci neanche.\n");

    getchar();
    return 0;
    }



    Esercizio 4: Si scriva un programma in C che, dato una numero di valori in input, crei un array contenenti questi valori e chieda all'utente se stamparli a video in ordine d'inserimento o inverso. La dimensione fisca dell'array è 100.
    Soluzione:

    CODICE
    #include <stdio.h>
    #include <conio.h>
    #define N 100

    int main (void){int n, i, A[N]; char z;
    printf("Numero valori:\n");
    scanf("%d", &n);
    printf("Insert valori:\n");

    for(i=0;i<n;i++) {
           scanf("%d", &A[i]);
    }

    printf("Stampare in ordine normale o inverso?[s=stesso ordine, i=inverso]\n");

    scanf("%c", &z);

    if (z==115){
    for(i=0;i<n;i++) printf("%d\\", A[i]);
    }
    else {
    if(z==105){
    for(i=n-1;i>=0;i--) printf("%d\\", A[i]);}
    }
    getchar();
    return 0;
    }



    Esercizio 5: Si scriva un programma in C che, dato un array da tastiera, chieda all'utente di cercare un elemento, e di stampare a video la posizione nell'array e quante volte lo trova se lo trova; altrimenti deve stampare un messaggio di all'utente che comunichi che l'elemento non è stato trovato. La dimensione fisica dell'array è 100.
    Soluzione:

    CODICE
    #include <stdio.h>


    int main(void){int A[100],i,n,x,rip;
    printf("Bla bla\n");
    scanf("%d", &n);
    if (n>0&&n<=100){
    for (i=0;i<n;i++){
           scanf("%d", &A[i]);
    }}
    else printf("Dati non validi");

    printf("Elemento X:\n");
    scanf("%d", &x);
    rip=0;
    for(i=0;i<n;i++){
           if(x==A[i]) {printf("Found in: %d \n", i+1);
           rip++;}
    }
    if (rip==0) printf("Elemento non presente.\n");
    else printf("Frequenza: %d", rip);
           getchar();
           return(0);




    Esercizio 6: Si scriva un programma in C che riconosca se un numero di telefono è valido oppure no, attraverso il seguente criterio: il primo numero deve essere 0, e le due cifre successive devono essere comprese tra 1 e 4 mentre le rimanenti cifre possono essere tra 0 e 9 con l'eccezione della 4 cifra del numero che deve essere diversa da 0. Il programma deve stampare a video la conferma o meno.
    Soluzione:

    CODICE
    #include <stdio.h>

    #include <stdlib.h>

    int main (void){char tel[21];
    scanf("%­s",tel);
    int i=1;
           if(tel[0]!='0'){
               printf("\nInvalid Number.");
               getchar();
               exit(0);
               }
           
           if(tel[10]!='\0'){
               printf("\nInvalid Number.");
               getchar();
               exit(0);
               }

           while(i<=2){
               if (tel[i]!='1' || tel[i]!='2' || tel[i]!='3' || tel[i]!='4'){
                   printf("\nInvalid Number.");
                   getchar();
                   exit(0);
                   }
           i++;
           }
           
           if(tel[3]=='0'){
                  printf("\nInvalid Number.");
                  getchar();
                  exit(0);}

    printf("Valid.");
    }




    Esercizio 7: Si scriva un programma in C che calcoli, dato un capitale iniziale di un conto bancario e un tasso di interesse, quanti soldi avrà accumulato in totale trascorsi gli anni.
    N.B.: Gli interessi variano con il passare del tempo.
    Soluzione:

    CODICE
    #include <stdio.h>


    int main (void) {int ci, cf,anni,tasso,anniI, c;
           printf("Insert Capitale Iniziale, Anni e Tasso di Interesse(separati da virgola)\n");
           scanf("%d,%d,%d",&ci,&anni,&tasso);
           c=(ci*tasso)/100;
           cf = ci;
           for (anniI=0;anniI!=anni;anniI++) {
                   cf=cf+c;
                   c = (cf*tasso)/100;
           }
           printf("Hai un Capitale finale di %d", cf);
           getchar();
           return 0;
    }




    RIPRODUZIONE RISERVATA | COPYRIGHT © Blues_Man, 2016
    @Legion Errant



    Edited by Blues_Man - 5/2/2017, 18:35
     
    .
  2. SSlevin
        Like  
     
    .

    User deleted


    Non capisco il perchè della chiamata a getchar alla fine del programma.
     
    .
  3.     Like  
     
    .
    Avatar

    Advanced Member

    Group
    Honorary Member
    Posts
    1,843
    Respect
    +90
    Location
    Carcere Statale del Mississippi

    Status
    Offline
    Questioni storiche e di necessità. La getchar() serve per congelare il programma, altrimenti una volta fatti i calcoli e stampato, la finestra si chiude.
     
    .
  4. SSlevin
        Like  
     
    .

    User deleted


    Ah capito, in pratica lo usi al posto di system ("pause") in ambiente di sviluppo, io ho dato un occhiata da terminale Ubuntu prima di commentare e lì non cambia niente per ovvi motivi. Comunque era un metodo che non avevo mai visto, è vero che non si smette mai di imparare xD
     
    .
  5.     Like  
     
    .
    Avatar

    Advanced Member

    Group
    Honorary Member
    Posts
    1,843
    Respect
    +90
    Location
    Carcere Statale del Mississippi

    Status
    Offline
    È il metodo più antico infatti. :asd:
     
    .
4 replies since 6/9/2016, 21:06   848 views
  Share  
.