2007 – 1

Si consideri la seguente funzione

int ES1(int a, int b)
{
    int j;
    int k=1;
    int p=0;
    while(k <= a)
    {
        k++;
        j=0;
        while(j < b)
        {
            j++;
            p=p+j;
        }
    }
    return 2*p/b;
}

Dire cosa calcola la funzione nell'ipotesi che a e b siano sempre positivi e che il programma non generi mai un overflow durante le operazioni aritmetiche.

Risposte:

  1. a*b
  2. a*(b+1)
  3. (a+1)*(b-1)
  4. nessuna delle precedenti.

Soluzione: b (a*(b+1))


Considera la chiamata ES1(1,1) e osserva i valori assunti dalla variabili

  • a=1, b=1
  • k=1, p=0
  • (1 <= 1) ?
    • k=2, j=0
    • (0 < 1) ?
      • j=1, p=1
    • (1 < 1) ? NO
  • (2 <= 1) ? NO
  • ES1=2*1/1=2

Il valore ottenuto soddisfa la risposta b.

Considera la chiamata ES1(2,1) e osserva i valori assunti dalla variabili

  • a=2, b=1
  • k=1, p=0
  • (1 <= 2) ?
    • k=2, j=0
    • (0 < 1) ?
      • j=1, p=1
    • (1 < 1) ? NO
  • (2 <= 2) ?
    • k=3, j=0
    • (0 < 1) ?
      • j=1, p=2
    • (1 < 1) ? NO
  • (3 <= 2) ?
  • ES1=2*2/1=4.

Il valore ottenuto soddisfa la risposta b.