Linguaggio c

16chicca901
void f1( int *a, int **b)
{
int i =0;
for( i=0; i<*a; i+=2) **b+=(*a)++;
}

Mi spiegate come posso capite cosa restituisce?

Grazie mille !

Risposte
claudio862
a è un puntatore a intero. Il ciclo for itera fintantoché i è minore del valore puntato da a (i < *a), incrementando i di 2 ad ogni iterazione.

b è un puntatore a puntatore a intero. Nel corpo del ciclo, si accede all'intero (doppiamente) puntato e gli si aggiunge il valore puntato da a, che viene poi incrementato di 1 (**b = (a)++).

In generale, l'operatore ++ postfisso restituisce il valore corrente e poi lo incrementa, mentre l'operatore ++ prefisso fa il contrario:

int a = 4;
int b = a++;

// Ora b = 4,
//     a = 5

int c = ++a;
// Ora c = 6,
//     a = 6



Ad esempio, se a punta all'intero 3 e b punta ad puntatore a 8:

int a0 = 3, b0 = 8;
int * a = & a0;
int * b1 = & b0;
int ** b = & b1;

f1(a, b);


// i = 0;
i < *a   =   0 < 3 sì
**b += (*a)++    =    8 += 3
// b = 11, a = 4

// i = 2;
i < *a   =   2 < 4 sì
**b += (*a)++    =    11 += 4
// b = 15, a = 5

// i = 4;
i < *a   =   4 < 5 sì
**b += (*a)++    =    15 += 5
// b = 20, a = 6

// i = 6;
i < *a   =   6 < 6 no
esce dal ciclo

// Alla fine
// a0 = 6
// b0 = 20



In sostanza, sia *a che i aumentano di valore ad ogni iterazione, ma i aumenta più velocemente, quindi prima o poi supera *a e il ciclo termina.

vict85
void f1( int *a, int **b)
{
int i =0;
for( i=0; i<*a; i+=2) **b+=(*a)++;
}


Ora che Claudio ti ha spiegato il codice, vediamo di darne una analisi approfondita.

Se \({}^*a < 0\) allora \(i > {}^*a\) e quindi il codice non fa nulla.

Se \({}^*a = 0\) allora il ciclo viene eseguito una sola volta, \({}^*a\) viene cambiato a \(1\) e \({}^{**}b\) non cambia (leggi il messaggio di Claudio su perché).

Se \({}^*a = n > 0\) allora all'inizio del programma \({}^*a-i = n\). Questa differenza decresce di \(1\) ogni ripetizione, infatti \(i\) incrementa di \(2\) e \({}^*a\) di \(1\). Il ciclo finisce quando \({}^*a-i = 0\) cioè dopo \(n\) ripetizioni. \({}^*a\) sarà grande \(n + n = 2n = i\). E \({}^{**}b\)? Beh lui sarà:
\begin{align} {}^{**}b &= b_0 + \sum_{k=n}^{2n-1} k \\
&= b_0 + n^2 + \sum_{k=1}^{n-1} k \\
&= b_0 + n^2 + \frac{n(n-1)}{2} \\
&= b_0 + \frac{2n^2 + n^2 - n}{2} \\
&= b_0 + \frac{n(3n -1)}{2}\end{align}
dove \(b_0\) era il suo valore iniziale.

I conti ti tornano, qualche dubbio?

16chicca901
i conti tornano grazie mille..

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.