Corso di Laboratorio di Informatica

Esercizi sui cicli - soluzioni

Cicli


Esercizio 1

Si può riutilizzare il codice scritto per calcolare il fattoriale di un numero intero k, inserendolo all'interno di un ciclo da 2 a N.

Codifica:

#include <stdio.h>
main()
{
    int N,F,I,k;
    printf("Inserire N: ");
    scanf("%d",&N);
    for (k=2; k<=N; k++)  /* CICLO ESTERNO, DA 2 A N */
    { /* si calcola il fattoriale di k */
        F=1;
        for (I=2; I<=k; I++) F = F*I;
        printf("Fatt(%d)=%d\n",k,F);
    }
}
 

Variante: osservando che fatt(N) = fatt(N-1) * N, è possibile utilizzare un ciclo solo.

#include <stdio.h>
main()
{
 int N,F,I,k;
 printf("Inserire N: ");
 scanf("%d",&N);
 F=1;
 for (k=2; k<=N; k++)
 {
  F = F*k;
  printf("Fatt(%d)=%d\n",k,F);
 }
}
 


Esercizio 2

Dalla definizione di potenza (con esponente intero positivo): N^M = N*N*...*N  (M volte).
 
Codifica:

#include <stdio.h>
main()
{
    double N,pot=1;
    int M,i;
    printf("Inserire N e M (M>=0): ");
    scanf("%lf%d",&N,&M);
    for (i=1;i<=M;i++) pot = pot*N;
    printf("N^M = %lf",pot);
}
 

Variante:

#include <stdio.h>
main()
{
 double N,pot;
 int M,i;
 printf("Inserire N e M: ");
 scanf("%lf%d",&N,&M);
 pot = N;
 if (M>=0)
    for (i=2;i<=M;i++) pot = pot*N;
 else {
      for (i=2;i<=(-M);i++) pot = pot*N;
      pot = 1/pot;
 }
 printf("N^M = %lf",pot);
}
 
 



Esercizio 3
  main()
{  int i;
    int x,y,somma;
    printf("digita due numeri interi\n");
    scanf("%d%d", &x, &y);
    somma=x;
    for(i=0; i<y;i++)
    somma++;
    printf("la somma di %de %d e' %d\n", x,y,somma);
}
 
 

Esercizio 4 main()
{
    float x,y,max;
    printf("digita due numeri reali\n");
    scanf("%f %f", &x, &y);
    max=(x>y?x:y);
    printf("il massimo fra %f e %f e' %f\n", x,y,max);
}
 

Esercizio 5

main()
{
    int lire,conv;
    char moneta;
    printf("digita la quantita' in lire da convertire e il tipo di conversione desiderata\n");
    printf ("e per euro - d per dollari\n");
    scanf("%d %c", &lire, &moneta);
    conv = (moneta=='e' ? lire/2000 : lire/2500);
    printf(" %d\n\n", conv);
}
 

Esercizio 6

Codifica:
 
#include <stdio.h>
main()
{
    int N,voto,max,min,i;
    printf("Inserire il numero dei voti: ");
    scanf("%d",&N);
    printf("Voto: ");
    scanf("%d",&voto);
    max = min = voto;
    for (i=2; i<=N; i++)
    {
        printf("Voto: ");
        scanf("%d",&voto);
        if (voto>max) max = voto;
        if (voto<min) min = voto;
    }
     printf("\nVoto max:%d\tVoto min:%d\n",max,min);
}
 

Alcune osservazioni:

Variante (con do...while):

#include <stdio.h>
main()
{
 int N,voto,max,min,i;
 printf("Inserire i voti e terminare con 0:\n");
 max = 18;
 min = 30;
 do {
    printf("Voto: ");
    scanf("%d",&voto);
    if (voto != 0) {
       if (voto>max) max = voto;
       if (voto<min) min = voto;
    }
 } while (voto != 0);
 printf("\nVoto max:%d\tVoto min:%d\n",max,min);
}
 
 

Alcune osservazioni:

Variante (con while):

#include <stdio.h>
main()
{
 int N,voto,max,min,i;
 printf("Inserire i voti e terminare con 0:\n");
 printf("Voto: ");
 scanf("%d",&voto);
 max = min = voto;
 while (voto != 0)
 {
  if (voto>max) max = voto;
  else if (voto<min) min = voto;
  printf("Voto: ");
  scanf("%d",&voto);
 }
 printf("\nVoto max:%d\tVoto min:%d\n",max,min);
}

Osservazione: è stato introdotto un ELSE per evitare di valutare la condizione del secondo IF; infatti, se voto>max allora sarà sicuramente voto>min e il secondo confronto può essere evitato. Si osservi che, con questa modifica, non sarebbe corretto (dal punto di vista logico) inizializzare MAX e MIN a 18 e 30 (perché?).