PDA

Visualizza la versione completa : [C++] Condizioni booleane


Andrmax
20-01-2009, 11:37
Salve a tutti.
Sono qua per chiedere chiarimenti sulle condizioni di verità con i tipi booleani.
L'esercizio sul quale mi sono inbattuto è il seguente:

"Siano dati due file numeri1.txt e numeri2.txt contenenti entrambi un elenco di numeri interi. Si scriva una funzione int conta (A) che riceve in ingresso un vettore A a valori interi di dimensione N. La funzione restituisce il numero degli elementi di A il cui valore compare sia in numeri1.txt che in numeri2.txt."

La risoluzione è la seguente;



#include <fstream.h>
const int N=10;
int controlla (int A[N]){
fstream f, g;
boolean b1=false;
boolean b2=false;
int n=0;
for(int i=0; i<N; i++){
f.open(“numeri1.txt”, ios::in);
g.open(“numeri2.txt”, ios::in);

while(f>>n1) { if(n1==A[i]) { b1=true;
break; }
while(g>>n2) { if(n2==A[i]) { b2=true;
break; }
if(b1 && b2) n++;
b1=false,
b2=false;
f.close();
g.close();
}
return n;
}

Non capisco perchè i tipi booleani b1 e b1 debbano essere inizializzati a false nella dichiarazione, e perchè vengono resettati a false alla fine dell'iterazione del for.

La cosa che però mi sbubbia di più è la condizione:


if(b1 && b2) n++;
Che significa? L'operatore AND restituisce TRUE se entrambi gli operandi sono TRUE, e restituisce FALSE altrimenti. Io al posto del mio professore avrei scritto:


if(b1 && b2 =true || b1 && b2 =false) n++;
è la stessa cosa o complico solamente la condizione?

Grazie in anticipo, spero di essere stato il più chiaro possibile!

Stoicenko
20-01-2009, 12:00
if(b1 && b2 =true || b1 && b2 =false) n++;


scritta così (anche se = true e = false sono sbagliati al limite usi ==) aumenti il contatore n anche se entrambe sono false cose che non è richiesta dall'esercizio.



if(b1 && b2 ) n++;


l'operatore && ritorna un booleano e quindi nel caso entrambe siano true (e quindi A[i] sia in entrambi i file) aumenta il contatore..


Non capisco perchè i tipi booleani b1 e b1 debbano essere inizializzati a false nella dichiarazione, e perchè vengono resettati a false alla fine dell'iterazione del for.

Perchè i due cicli while settano solo a true nel caso vengano trovati i numeri nei file e non a false nel caso opposto.. quindi ad ogni iterazione del ciclo for DEVONO essere riportati nello stato iniziale.

Andrmax
20-01-2009, 19:10
Ti ringrazio molto dei tuoi chiarimenti, soprattutto sul perchè b1 e b2 debbano essere inizializzate a false e resettate a false, ragionando un attimo potevo anche trovare la motivazione!

Ma non ho ancora chiaro come funziona l'istruzione


if(b1 && b2 ) n++;

Giustamene hai scritto che l'operatore AND ritorna un booleano, e l'if fa una determinata cosa quando una condizione è rispettata cioè quando quello che c'è tra parentesi è vero. Ma quando è che questa condizione è vera?...cioè è vera quando ritorna TRUE? è questo il senso?

>Vera quando l'operazione logica AND ritorna un valore uguale a TRUE (ovvero nel caso che siano entrambi true)
>Falsa altrimenti.

Fammi sapere se ho capito bene, perchè scritta a quel modo, mi vengono dei dubbi: ad esempio non è simile ad una cosa insensata come:


if(2+4) n++;

O forse nel caso dell'if con operatore booleano la condizione nelle parentesi è corretta senza un uguale proprio perchè è l'operatore che dice quando la condizione è rispettata o no?

Stoicenko
21-01-2009, 09:28
la condizione nelle parentesi è corretta senza un uguale proprio perchè è l'operatore che dice quando la condizione è rispettata o no?

esattamente così..

infatti è corretto pure scrivere così (corretto sintatticamente)




if(b1)
{
if(b2)
{
n++;
}
}



come vedi la if non ha bisogno per forza di una comparazione se all'interno c'è già un booleano

Andrmax
21-01-2009, 12:48
come vedi la if non ha bisogno per forza di una comparazione se all'interno c'è già un booleano

Grazie mille sei stato chiarissimo!

Loading