Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como hacer if 1,2,3..... (https://www.clubdelphi.com/foros/showthread.php?t=70238)

Panasys 08-10-2010 19:40:33

Como hacer if 1,2,3.....
 
Hola, estoy escuchando un puerto que me puede dar ciertos valores enteros, pero esos valores los quiero comparar de a grupos... es decir quiero hacer algo asi como:

if A = 1 or 2 or 3 etc etc.

Es decir hay algo como para hacer

if A "entre" 1...100 hago tal cosa
else
if A entre 101...200 hago tal otra?
para no tener que poner los 100 valores?

Seguramente es algo sencillo pero no logro hacerlo aun que sea tirenme un hilo donde buscar, muchas gracias.

rrf 08-10-2010 20:01:01

Hola, a ver si esto te sirve:

Código Delphi [-]
if  ( a >=1 ) and ( a <=100 )
 then ...

Saludos

Casimiro Noteví 08-10-2010 20:09:03

Creo que puedes hacer algo así:

Código Delphi [-]
if x in [1..100] then
  showmessage('x vale entre 1 y 100');

fjcg02 08-10-2010 23:57:55

Extraído de la ayuda.
Espero que te sirva.

Saludos

Código Delphi [-]
The case statement

case I of
  1..5: Caption := 'Low';
  6..9: Caption := 'High';
  0, 10..99: Caption := 'Out of range';
else
  Caption := '';
end;

is equivalent to the nested conditional

if I in [1..5] then
  Caption := 'Low'
  else if I in [6..10] then
    Caption := 'High'
    else if (I = 0) or (I in [10..99]) then
      Caption := 'Out of range'
      else
        Caption := '';

AzidRain 09-10-2010 00:35:26

Ya te dieron 3 formas de hacer lo mismo, sin embargo creo que la primera es la más eficiente por directa, las otras 2 no sé si al final el compilador las optimice hasta llegar a lo mismo que la primera. No indicas si siempre será un rango continuo o bien pueden ser lecturas discontinuas (ej: 1,2,3,4 vs 1,5,20, 4)

Panasys 09-10-2010 01:05:07

Wow !!! lluvia de respuestas rapidisimo !!! Gracias a todos !!! estoy probando con la segunda opcion de Casimiro y aca va , creo yo, algo mas detallado de lo que estoy haciendo Azid.

Estoy usando unos componentes basados en Indy para escuchar el puerto 502 para PLC, el tema es que el automata me envia una palabra (1,2, 5, 128, 255) yo lo que hice fue programar las salidas del automata para que me diga ciertos enteros dependiendo de lo que pase dentro del mismo.

Ahora cuando trabajo con pocas entradas no pasa nada, el codigo es corto y rapido, pero si tengo que procesar 8 bits se complica ya que obtengo de 0 a 255 combinaciones posibles entre esos bits!

El agruparlos con [1..100] me funciona, ahora mi problema es en los primeros bits, porque por ejemplo mi IF va con in[1,3,5,7,9,11,13.... asi hasta llegar a 255 !! , hay algun metodo que yo pueda usar para decirle oye cuenta pero solo los impares hasta 255??? y el bit 2 cuenta 2,4 7,8 etc?

De todas formas una vez escrito es copiar y pegar pero quiero aprender a hacer mas eficiente mi codigo ! :)

Gracias a todos !!!

AzidRain 09-10-2010 02:33:55

Si te devuelve un word puedes compararlo con su equivalente decimal que es más sencillo de hacer, ahora bien, mencionas que dependiendo de ciertas condiciones te devolverá diferentes enteros, pues esto es mas simple, a no ser que varias condiciones produzcan los mismos resultados, por ejemplo hablando en términos naturales : "ya no me puedo mover hacia arriba", "no me puedo mover hacia abajo", "no soporto el peso", etc. todas son condiciones que pudieran tener como respuesta " regresa al punto inicial".

Ya mas o menos te voy entendiendo, serviria si platicas más que hace tu robot y que esperas tú que haga con lo la información que te envía.

cmm07 09-10-2010 02:47:32

una manera fácil q supongo funcionaría y rápida (quizá no es la más optimizada) es esto:

Hacer un for o while en la que contenga 2 variables:

Una se llama por ej: formula de tipo integer o float.
la segunda ej: resultado de tipo array.

entonces, segun las matematicas para obtener un número impar es 2n (para asegurarnos de que sea par) + 1 (para el impar) esto es, (2n+1) <- nº impar.
en el for que ya contiene la variable I: integer; colocas "2 X I + 1" luego la agregas al array..

...

cmm07 09-10-2010 02:59:28

hola más o menos así sería:

Código Delphi [-]
var
I, formula: integer;
resultante: array[1..255] of integer;
begin

for I := 1 to 255  do begin
  formula := 2 * I + 1;
    resultante[i] := formula
end;

resultante es el array que contiene los números impares.., no está del todo perfecto, ni siquiera tengo el delphi a mano xD pero obtinene los primeros 255 impares

Caro 13-10-2010 19:10:18

Cita:

Empezado por Panasys (Mensaje 378835)
El agruparlos con [1..100] me funciona, ahora mi problema es en los primeros bits, porque por ejemplo mi IF va con in[1,3,5,7,9,11,13.... asi hasta llegar a 255 !! , hay algun metodo que yo pueda usar para decirle oye cuenta pero solo los impares hasta 255??? y el bit 2 cuenta 2,4 7,8 etc?

Hola Panasys, nose si te he entendido bien, pero podrías utilizar la función odd para saber si es impar ademas de verificar si esta en el rango de 1..255.

Código:

if (x in [1..255]) and Odd(x) then
  showmessage('x vale entre 1..255 y es impar');
 
 //para par
 if (x in [1..255]) and Not Odd(x) then
 ...........

Saluditos

ecfisa 13-10-2010 21:03:08

Cita:

Empezado por Panasys (Mensaje 378835)

Ahora cuando trabajo con pocas entradas no pasa nada, el codigo es corto y rapido, pero si tengo que procesar 8 bits se complica ya que obtengo de 0 a 255 combinaciones posibles entre esos bits!

hay algun metodo que yo pueda usar para decirle oye cuenta pero solo los impares hasta 255??? y el bit 2 cuenta 2,4 7,8 etc?

Al leer tu segundo post veo que hablas de 'bits' no de bytes por lo que pareciera que querés obtener la sumatoria
de los 'bits' pares e impares recibidos...

Si no entiendo mál y es eso lo que buscas, podrías hacer:
Código Delphi [-]
procedure SumaBitParImpar(Num: Integer; var Par, Non: Integer);
var
  i,c : Byte;
begin
  c:= 0;
  for i:= 0 to 7 do
   if (Num shr i) and 1 = 1 then // verificar sucesivos bits encendidos
     Inc(c);
  if Num and 00000001 = 1 then  //También puede ser: if Odd(Num), pero ya que estamos con bits...
    Non:= Non + c
  else
    Par:= Par + c
end;

Ejemplo de llamada:
Código Delphi [-]
...
var
  i: Integer;
  Par, Non: Integer;
begin
  Par:= 0;
  Non:= 0;
  for i:= 1 to 3 do
    SumaBitParImpar(i,Par,Non);
  ShowMessage(Format('Par: %d Impar: %d',[Par,Non]));
end;
Lo que te arroja el mensaje: 'Par: 1 Impar: 3' dado que:
1 = 01 (un bit número impar)
2 = 10 (un bit número par)
3 = 11 (dos bits número impar)

Es sólo un ejemplo, modificando un poco el código podes hacer que solo haga el conteo de bits por numero recibido, o en última instancia, espero que te aporte alguna idea...

Saludos. :)


La franja horaria es GMT +2. Ahora son las 01:50:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi