PDA

Ver la Versión Completa : ¿Que esta indicando esta expresión?


franco_cvm
17-06-2015, 07:44:44
Hola, navegando por Internet, encontré un código de lista de punteros y me surgió curiosidad de la forma en que escribió una sentencia de WHILE, donde la variable bandera es un booleano:
While (bandera) do
yo siempre estaba acostumbrado a poner
While (bandera=false) do
o esta
While (bandera=true) do

¿que significa cuando la variable esta sola?

acá el código completo, ordena la lista de menor a mayor según la información de los nodos:
procedure TForm1.Button2Click(Sender: TObject);
var
ULT,X,Y,Z: pnodo;
bandera:Boolean;
aux:integer;
BEGIN
ULT:=nil;
bandera:=True;
While (bandera) do
Begin
X:=CZO^.prox;
Y:=X^.prox;
bandera:=False;
While (Y<>ULT) do
begin
if (X^.data)>(Y^.data) then
begin
bandera:=true;
aux:=x^.data;
X^.data:=Y^.data;
Y^.data:=aux;
end;
X:=Y;
Y:=Y^.prox;
end;
if (Y=ULT) then
ULT:=X;
End;
Z:=CZO;
While (Z^.prox)<>nil do
begin
Z:=Z^.prox;
memo2.Lines.Add(inttostr(Z.data));
end;
END;

AgustinOrtu
17-06-2015, 09:12:22
Cuando esta sola es lo mismo que decir = True

Para comparar por falso podes usar el operador not



while not archivo.Eof do
\\ código

ecfisa
17-06-2015, 09:41:30
Hola franco_cvm.

El tipo Boolean enumera los valores verdadero o falso. Cuando en Delphi haces una comparación del tipo,
if (a = b) then
de "(a = b)" se obtiene un resultado que puede ser verdadero o falso según sean los contenidos de 'a' y 'b'. Supongamos que,

var
B : Boolean;
begin
B := ( 5 = 5)

la variable "B" recoge un valor (que es True en el código anterior) y ya debes ver claro que: B = (5 = 5) = True. Entonces la construcción,
if (B = True) ...
si bién no es sintácticamente incorrecta, es redundante.

Una variable de tipo booleana almacena la conclusión de una o mas premisas, y su resultado puede ser bivalente (True o False). De allí que es reiterativo evaluar la igualdad por verdadero o falso si la variable ya posee ese valor.

Resumiendo, si B tiene el valor True hacer:
if B then
tiene el mismo resultado que:
if B = True then

Del mismo modo que si B tiene el valor False hacer:
if not B then
tiene el mismo resultado que:
if B = False then
Y aunque el compilador es generoso, mi consejo es que no uses el modo redundante.

Saludos :)

Edito: No había visto el mensaje de Agustín mientras escribía pero es la misma idea.

franco_cvm
17-06-2015, 14:23:39
Graciass

lo que no entiendo es porque si pongo:

begin
ULT:=nil;
While (bandera=true) do
Begin
X:=CZO^.prox;
Y:=X^.prox;
bandera:=False;
While (Y<>ULT) do
begin
if (X^.data)>(Y^.data) then
begin
bandera:=true;
aux:=x^.data;
X^.data:=Y^.data;
Y^.data:=aux;
end;
.......


Hola franco_cvm.

El tipo Boolean enumera los valores verdadero o falso. Cuando en Delphi haces una comparación del tipo,
if (a = b) then
de "(a = b)" se obtiene un resultado que puede ser verdadero o falso según sean los contenidos de 'a' y 'b'. Supongamos que,

var
B : Boolean;
begin
B := ( 5 = 5)

la variable "B" recoge un valor (que es True en el código anterior) y ya debes ver claro que: B = (5 = 5) = True. Entonces la construcción,
if (B = True) ...
si bién no es sintácticamente incorrecta, es redundante.

Una variable de tipo booleana almacena la conclusión de una o mas premisas, y su resultado puede ser bivalente (True o False). De allí que es reiterativo evaluar la igualdad por verdadero o falso si la variable ya posee ese valor.

Resumiendo, si B tiene el valor True hacer:
if B then
tiene el mismo resultado que:
if B = True then

Del mismo modo que si B tiene el valor False hacer:
if not B then
tiene el mismo resultado que:
if B = False then
Y aunque el compilador es generoso, mi consejo es que no uses el modo redundante.

Saludos :)

Edito: No había visto el mensaje de Agustín mientras escribía pero es la misma idea.

ecfisa
17-06-2015, 14:54:24
Hola franco
Graciass

lo que no entiendo es porque si pongo:

begin
ULT:=nil;
While (bandera=true) do
Begin
X:=CZO^.prox;
Y:=X^.prox;
bandera:=False;
While (Y<>ULT) do
begin
if (X^.data)>(Y^.data) then
begin
bandera:=true;
aux:=x^.data;
X^.data:=Y^.data;
Y^.data:=aux;
end;
.......
Tendrías que explicar que es lo que no entendes, por así como está planteado, no veo a donde apunta tu duda.

Saludos :)

Al González
17-06-2015, 20:00:23
Después de la generosa explicación de ecfisa y con lo ya dicho por AgustinOrtu, difícilmente podría yo agregar algo importante. Baste decir que donde quiera que se espere una expresión Boolean, es decir, un fragmento de código que se evaluará o ejecutará dando por resultado un valor de falso o verdadero, puede ser colocada tanto una llamada a una función de resultado Boolean, como una variable o propiedad de tipo Boolean sola, o bien una combinación de otras expresiones (usando paréntesis y And, Or, etc.).

En la sentencia
If IsUpperCase ('ABC') Then
la expresión Boolean es: IsUpperCase ('ABC')

En la sentencia
If IsUpperCase ('ABC') = True Then
la expresión Boolean es: IsUpperCase ('ABC') = True

Al If entrará si la expresión evalúa a (resulta en) True. Así que si "IsUpperCase ('ABC')" es ya una expresión falso/verdadero, entonces no hay necesidad de hacer más compleja esa expresión añadiéndole una comparación con el signo de igual y la constante True ("IsUpperCase ('ABC') = True").

Ese If sería válido incluso si escribieras:
If ((IsUpperCase ('ABC') = True) = True) = True Then
Pero es mejor escribir código conciso:
If IsUpperCase ('ABC') Then
Y, como dije antes, lo mismo aplica a una variable o propiedad Boolean:
If MiVariable Then
De este modo, evitamos recargar a la aplicación con ciclos de CPU innecesarios, o, en caso de que el compilador simplifique las expresiones redundantes, al menos no ofuscamos el código fuente, dejándolo un poco más limpio y fácil de leer.

Al González.

ecfisa
17-06-2015, 22:33:58
Agregando, también suele ser muy útil usar el tipo Boolean en los constant arrays para alternar valores de acuerdo a una condición:

const
CCOLOR : array[Boolean] of TColor = (clRed, clLime);
begin
Edit1.Color := CCOLOR[Edit1.Text > ''];
...


Saludos :)

nlsgarcia
17-06-2015, 23:16:36
franco_cvm,


...¿Que esta indicando esta expresión?...While (bandera) do...

:rolleyes:

Revisa esta información:


http://i.imgur.com/jrmBJ2C.jpg

1- Pascal - Boolean (http://www.tutorialspoint.com/pascal/pascal_booleans.htm)

2- Delphi Basics : Boolean (http://www.delphibasics.co.uk/RTL.asp?Name=Boolean)

3- Delphi Basics : $BoolEval (http://www.delphibasics.co.uk/RTL.asp?Name=$BoolEval)

4- Delphi Basics : TBits (http://www.delphibasics.co.uk/RTL.asp?Name=TBits)

5- System.Boolean (http://docwiki.embarcadero.com/Libraries/XE8/en/System.Boolean)
Espero sea útil :)

Nelson.