PDA

View Full Version : [C++] Aiutatemi ad accorciare questo if-else


AngeL)
26-06-2006, 15:52
oggi pomeriggio scrivendo un codice mi sono accorto di aver scritto un if-else spropositato e vorrei sapere come è possibile accorciare una struttura di questo tipo.
questo è il codice
if(data>1582)
{
if(data%4==0&&(!(data%100==0)))
{
cout << "E' bisestile.\n";
}
if(data%100==0)
{
if (data%400==0)
{
cout << "E' bisestile.\n";
}
else
{
cout << "Non e' bisestile.\n";
}
}
}
else
{
cout << "Non e' bisestile.\n";
}
grazie in anticipo

sottovento
26-06-2006, 16:11
bool bisestile = (data>1582) && ((!(data % 4) && (data%100)) || (!data%400))

AngeL)
26-06-2006, 16:21
lho ridotto usando una variabile e uno switch ma è ancora grande :\

int a;
if(data%1582==0)
{
if(data%400==0)
{
a=1;
}
else
{
if(data%4==0)
{
a = 1;
}
}
}
switch(a)
{
case "1":
cout << "E' bisestile.\n";break;
default:
cout << "Non e' bisestile.\n;break;
}


edit: sottovento scusa non avevo visto la risposta (cho messo 20 minuti a scrivere il secondo post :D
grazie 1000

71104
26-06-2006, 16:46
non sono sicuro che funzioni, ma se ho capito bene dovrebbe essere equivalente a:

if(data>1582)
{
if(!((data % 4 == 0) ^ (data % 100 == 0)))
{
cout << "E' bisestile";
}
else
{
cout << "Non e' bisestile.\n";
}
}
else
{
cout << "Non e' bisestile.\n";
}

AngeL)
26-06-2006, 16:56
^ che significa? (elevato a?)

71104
26-06-2006, 17:25
no, è lo XOR:

false ^ false = false
false ^ true = true
true ^ false = true
true ^ true = false

trallallero
27-06-2006, 08:19
Io l'avevo fatta cosí:


bool IsLeap( int Y )
{
bool Leap = false;

if ( (Y % 4 ) == 0 ) Leap = true;
if ( (Y % 100) == 0 ) Leap = false;
if ( (Y % 400) == 0 ) Leap = true;

return Leap;
}


inglese obbligatorio deciso dall'azienda, codice e commenti.
Ma i bresciani stanno avanti :D

AngeL)
27-06-2006, 08:29
il codice + corto lha fatto sottovento, 1 riga :eek:
io non sarei mai riuscito a fare una cosa del genere :cry:

trallallero
27-06-2006, 08:39
il codice + corto lha fatto sottovento, 1 riga :eek:
io non sarei mai riuscito a fare una cosa del genere :cry:

non per screditare l'intervento di sottovento
ma la bravura non é inversamente proporzionale
al numero di righe ;)
Io quelle le chiamo "mandrakate" ... interventi geniali, sicuramente,
ma poi ti fanno stare 2 ore a capirli quando riprendi
il programma 1 mese dopo :muro:

AngeL)
27-06-2006, 08:42
vabbe basta un commentuccio :D

AngeL)
27-06-2006, 08:45
ma -?-:- si puo concatenare? tipo -?-: (-?-:-) (- sono le parti di codice^^)

trallallero
27-06-2006, 09:15
vabbe basta un commentuccio :D
si se ben commentata passi ma rimane sempre 'na mandrakata :D

ma -?-:- si puo concatenare? tipo -?-: (-?-:-) (- sono le parti di codice^^)
eh ? :confused:
un esempio ?
perché fai 'ste domande ar cane ? :rotfl:

AngeL)
27-06-2006, 09:31
intendevo:
anzike fare

if(x)
{y}
else
if(z)
{a}

si puo fare

(x)? //if(x)
(y) //{y}
: //else
(
(z)? //if(z)
(a) //{a}
:() //null
)

?

trallallero
27-06-2006, 09:50
l'operatore ternario é una if con ritorno di valore quindi si.
esempio


z = (x == 1) ? x : (y == 2) ? y : 0;

trallallero
27-06-2006, 09:56
una dritta ;)
puoi anche scegliere di fare un qualcosa o no con il ternario:

(++x) >= MAX_LEN ? PrintHeader() : (void)NULL

se x > MAX_LEN stampa header altrimenti non fa niente
Peró devi castare il NULL a void perché PrintHeader é void
;)

thebol
27-06-2006, 10:08
intendevo:
anzike fare

if(x)
{y}
else
if(z)
{a}

si puo fare

(x)? //if(x)
(y) //{y}
: //else
(
(z)? //if(z)
(a) //{a}
:() //null
)

?
si, se ti vuoi del male, puoi farlo :asd:

trallallero
27-06-2006, 10:13
si, se ti vuoi del male, puoi farlo :asd:
deve imparare a farle le cose per saper scegliere la meno dolorosa :D

sottovento
27-06-2006, 15:16
non per screditare l'intervento di sottovento
ma la bravura non é inversamente proporzionale
al numero di righe ;)
Io quelle le chiamo "mandrakate" ... interventi geniali, sicuramente,
ma poi ti fanno stare 2 ore a capirli quando riprendi
il programma 1 mese dopo :muro:

Non screditi nessuno, ed hai perfettamente ragione (a patto che togli il "geniali", che non si addice ne' a me ne' al mio intervento :) )

High Flying
Sottovento

trallallero
27-06-2006, 15:26
Non screditi nessuno, ed hai perfettamente ragione (a patto che togli il "geniali", che non si addice ne' a me ne' al mio intervento :) )

High Flying
Sottovento

beh riuscire a "comprimere" svariate condizioni di piú righe
in una riga é "geniale". Non ho detto che sei Einstein dai :D

AngeL)
27-06-2006, 18:02
non ho capito quella cosa con ++x max_num ... :D

mynos79
27-06-2006, 18:19
non ho capito quella cosa con ++x max_num ... :D
++x significa che prima incrementi di 1 la x e poi la usi ...

trallallero
28-06-2006, 07:17
++x significa che prima incrementi di 1 la x e poi la usi ...
quella é una delle prime cose che impari ... non penso
non abbia capito quello :eek:
Non ho capito cosa non hai capito :D

AngeL)
28-06-2006, 07:25
non ho capito l'espressione intera, l'unica cosa che sapevo era l'operatore di pre-incremento :D

(++x) >= MAX_LEN ? PrintHeader() : (void)NULL
ho capito che è uguale a if((++x) >= MAX_LEN){printheader()}else{(void)null}
ma non ho capito a che serve :D

trallallero
28-06-2006, 07:45
allora ...
mettiamo che tu debba scrivere X se x <> 0 e Y se x == 0.
Il sistema piú veloce é:

(x) ? puts("X") : puts("Y");

adesso mettiamo che tu debba scrivere X se x <> 0 e basta
il sistema piú veloce e piú leggibile é


if (x)
puts("X");


l'alternativa (é sempre meglio averne ;) ) é:

(x) ? puts("X") : NULL;

in questo caso la puts torna un int quindi NULL non lo casto
(sul mio compilatore va bene ma magari il tuo si lamenta)
ma nell'esempio che non hai capito ho dovuto castarlo perché
PrintHeader() torna void

se fai una tua funzione che torna un float casti il NULL a float

(x) ? Funz("X") : (float)NULL;


spero di essermi spiegato bene :D

trallallero
28-06-2006, 08:00
non ho capito l'espressione intera, l'unica cosa che sapevo era l'operatore di pre-incremento :D

(++x) >= MAX_LEN ? PrintHeader() : (void)NULL
ho capito che è uguale a if((++x) >= MAX_LEN){printheader()}else{(void)null}
ma non ho capito a che serve :D
ma che fai editi i tuoi post ?
non era cosí prima :mbe:

tutto puó servire ;)
l'importante é avere alternative, per me.
E questa é un'alternativa al if/else ...
Quando devi modificare un abominevole pro*C
fatto alla "verga di segugio" con le variabili
TUTTE globali :Puke: vedi che avere alternative serve ;)