broke31 ha scritto:
non ho capito come fai a fermare il for se come condizione imponi --l
in C la condizione è falsa se l'espressione è uguale a zero, vera se diversa da zero.
Il trucchetto della condizione --l si basa su questo principio, al fine di non usare un'ulteriore variabile per iterare, ma dobbiamo procedere a ritroso cioè dall'ultimo elemento (l-1) fino al 1 (l'elemento 0 lo abbiamo già caricato). Questo spiega il decremento e poi la verifica della condizione.
broke31 ha scritto:
i punti interrogativi sarebbero gli if giusto?
L'operatore ternario è pari ad un blocco IF/ELSE scritto in forma compatta, ed ha questa forma:
...
value = (exp1) ? (exp2) : (exp3);
...
corrispondente a:
...
if (exp1)
value = (exp2);
else
value = (exp3);
...
Nel ciclo ho scelto di usare l'operatore ternario non tanto per ridurre il numero righe da scrivere, ma per una prontezza visiva a favore del programmatore distinguibile nell'esempio sotto. E' comunque preferibile la forma IF per evitare le inutili riassegnazioni
...
FOR (....) {
MIN=(exp)?(exp):min;
MAX=(exp)?(exp):min;
}
...
FOR (....) {
IF (exp)
MIN=(exp);
IF (exp)
MIN=(exp);
}
...
Se poi piace la stessa versione con un accorpamento decisamente criptico:
int minimo_massimo(int *v, int l, int **min, int **max)
{
if (v && l>0)
for (*min=*max=v;--l;*min=**min>v[l]?v+l:*min,*max=**max<v[l]?v+l:*max);
else
l=-1;
return l;
}