SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: Serj en Sábado 24 de Julio de 2010, 17:30

Título: While y OR
Publicado por: Serj en Sábado 24 de Julio de 2010, 17:30
Hola!

Seguro que es una tonteria de problema, pero necesito que la funcion while tenga dos condiciones, y que no se tengan que cumplir las dos a la vez, solo una o la otra.
Las condiciones son:

Rango.Value2!=null;
alarmaxux!=1;

Lo he intentado asi pero no me sale bien.

while (Rango.Value2!=null || alarmaxux!=1)
{
}

Alguien me puede ayudar?

Un saludo y gracias!
Título: Re: While y OR
Publicado por: gerloxxx en Sábado 24 de Julio de 2010, 18:47
Pues yo lo veo bien, el or con uno que sea verdadero entra, la unica forma que no entrara a ese while, es cuando los dos son false

saludos
Título: Re: While y OR
Publicado por: ProfesorX en Sábado 24 de Julio de 2010, 18:53
Me temo que el operador logico XOR (or exclusivo) no existe en C#. Es por eso que no obtienes el resultado que deseas.

Aunque se me ocurre que podrias simular su funcionamiento por medio de banderas. A continuacion te dejo un ejemplo de como lo podrias implementar:

Código: C#
  1.  
  2. bool ban = false;
  3. if (Rango.Value2!=null)
  4. {
  5.   if (alarmaxux==1)
  6.      ban = true;
  7.   else
  8.      ban = false;
  9. }
  10. else
  11.   if (alarmaxux != 1)
  12.      ban = true;
  13.   else
  14.       ban = false;
  15. // Si ban es verdadero, significa que solo se cumplio
  16. // una de las dos condiciones
  17. while (ban == true)
  18. {
  19. // Aqui iria el codigo que quieres dentro del ciclo while
  20. // y tendrias que actualizar la bandera con el codigo
  21. // de arriba tal como lo pongo
  22. if (Rango.Value2!=null)
  23. {
  24.   if (alarmaxux==1)
  25.      ban = true;
  26.   else
  27.      ban = false;
  28. }
  29. else
  30.   if (alarmaxux != 1)
  31.      ban = true;
  32.   else
  33.       ban = false;
  34. }
  35.  
  36.  

Saludos :)
Título: Re: While y OR
Publicado por: Serj en Sábado 24 de Julio de 2010, 20:55
Hola!

Muchas gracias a los dos.

Asi que el simbolo || es XOR???
PEnsando en mi programa, tambien podria ser OR.
Como seria el simbolo??
Título: Re: While y OR
Publicado por: tannke en Lunes 26 de Julio de 2010, 18:28
cito:
Cita de: "Serj"
Asi que el simbolo || es XOR???
No.
Vuelvo a citar:
Cita de: "ProfesorX"
Me temo que el operador logico XOR (or exclusivo) no existe en C#. Es por eso que no obtienes el resultado que deseas.

Por lo tanto || és OR.

Otra manera de simular el XOR podria ser:

Código: C#
  1.  
  2. while ((Rango.Value2 == null && alarmaxux != 1) || (Rango.Value2 != null && alarmaxux ==1 ) )
  3. {
  4. }
  5.  

un saludo
Título: Re: While y OR
Publicado por: Amilius en Martes 27 de Julio de 2010, 01:03
El gorro de gnomo es el operador XOR.  :)

Código: C#
  1.  
  2.         static void Main(string[] args)
  3.         {
  4.             int a, b;
  5.             bool x, y;
  6.             for (int i = 0; i < 4; i++)
  7.             {
  8.                 a = i & 1;
  9.                 b = i >> 1;
  10.                 x = a == 1;
  11.                 y = b == 1;
  12.                 Console.WriteLine("{0} xor {1} = {2}", a, b, a ^ b);
  13.                 Console.WriteLine("{0} xor {1} = {2}", x, y, x ^ y);
  14.             }
  15.         }
  16.  
  17.  
Título: Re: While y OR
Publicado por: tannke en Martes 27 de Julio de 2010, 15:11
Cita de: "Amilius"
El gorro de gnomo es el operador XOR. :)
+1

Tienes toda la razón! Habria jurado que no existía, hasta me hicistes desempolvar el libro de programación, jejejej. Supongo que la falta de costumbre en usarlo (creo que nunca lo utilicé).

Un Saludo
Título: Re: While y OR
Publicado por: ProfesorX en Martes 27 de Julio de 2010, 19:27
Cita de: "Amilius"
El gorro de gnomo es el operador XOR.  :)

Temo que estas equivocado en parte, y acertado en parte.

El simbolo ^ es el operado XOR pero solo para operaciones de bits, y en este caso necesitamos XOR para operaciones logicas y tal como mencione en un mensaje anterior, el operador logico XOR no existe.

Por eso en realidad ^ no sirve para el problema mencionado arriba donde necesitamos un operador logico.

Repasando

Operadores de bits

& and
| or
! not
^ XOR

operadores logicos
&& and
|| or
! not

Asi que para el problema que esta mencionado en el primer mensaje solo sirve mi solucion y la solucion de tannke

Saludos :)
Título: Re: While y OR
Publicado por: tannke en Martes 27 de Julio de 2010, 20:16
El libro que yo tengo no dice eso (Microsoft C# Curso de programacion, de Fco. Javier Ceballos) para el que lo tenga, pagina 74:
Operadores lógicos:     && o & (AND),    || o | (OR),     !(NOT),     ^(XOR)

Operadores a nivel de bits:     &(AND),     |(OR),     ^(XOR),     <<(Carry izq.),     >>(carry der.)

test porque ya no sabia que pensar

Código: C#
  1. static void Main(string[] args)
  2.         {
  3.            
  4.             //provando XOR (amos a ver)
  5.  
  6.             string Value2;
  7.             int alarmaxux;
  8.  
  9.             //voy a provar los 4 casos posibles
  10.  
  11.             Value2 = null;
  12.             alarmaxux = 1;
  13.             if (Value2 != null ^ alarmaxux != 1) Console.WriteLine("string en nulo y int en 1");
  14.  
  15.  
  16.             Value2 = null;
  17.             alarmaxux = 5;
  18.             if (Value2 != null ^ alarmaxux != 1) Console.WriteLine("string en nulo y int diferente de 1");
  19.  
  20.  
  21.             Value2 = "No nulo";
  22.             alarmaxux = 1;
  23.             if (Value2 != null ^ alarmaxux != 1) Console.WriteLine("string NO nulo y int en 1");
  24.  
  25.  
  26.             Value2 = "No nulo";
  27.             alarmaxux = 5;
  28.             if (Value2 != null ^ alarmaxux != 1) Console.WriteLine("string NO nulo y int diferente de 1");
  29.  
  30.  
  31.             Console.ReadLine();
  32.         }
  33.  
Título: Re: While y OR
Publicado por: Amilius en Sábado 31 de Julio de 2010, 01:27
Cita de: "ProfesorX"
...
Por eso en realidad ^ no sirve para el problema mencionado arriba donde necesitamos un operador logico.
...

De hecho XOR es siempre un operador lógico que trabaja a nivel de bits. Son las características del lenguaje las que hacen transparente su aplicación como operador para el tipo bool y tipos enteros. La gracia del tipo bool es que fuerza a que sus valores sean 0 o 1, en C# no puedes hacer un casting de entero a bool, tienes que usar un operador que retorna un valor bool: "bool b = i != 0;". En C++ puedes hacer el casting de un entero a bool y el compilador generará código para que el tipo bool contenga 0 si el entero es 0 o 1 si no es cero. Sin embago en C++ es recomendable usar la misma forma de c#: "bool b = i != 0;" para evitar un Warning de nivel 4, además de hacer explícito el hecho que la variable b contiene 0 si i es 0 o 1 si i no es 0.