Corso di Fondamenti di Informatica

Soluzione degli esercizi proposti in laboratorio

Esercitazione n.3

Esercizio 1

Specifica:
    Calcolare il valore  delta = b2 - 4ac
    Se delta >= 0
        calcolare d = sqrt(delta)
        calcolare le due radici   x1, x2 =  - (b ± d) / 2a
    altrimenti (radici complesse: halt)
 

Codifica:

#include <math.h>
main (){
  float a=1.0, b=2.0, c=-15.0;
  float delta, d, x1, x2;
  delta = b*b-4*a*c;
  if (delta>=0){
  d  = sqrt(delta);
  x1 = -(b+d)/(2*a);
  x2 = -(b-d)/(2*a);
  }
}
 

Esercizio 2

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 3

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 4

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é?).