Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-10-2010
Panasys Panasys is offline
Miembro
 
Registrado: ago 2007
Posts: 88
Poder: 17
Panasys Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 08-10-2010
rrf rrf is offline
Miembro
 
Registrado: ago 2003
Ubicación: S/C Tenerife, España
Posts: 454
Poder: 21
rrf Va por buen camino
Smile

Hola, a ver si esto te sirve:

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

Saludos
Responder Con Cita
  #3  
Antiguo 08-10-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que puedes hacer algo así:

Código Delphi [-]
if x in [1..100] then
  showmessage('x vale entre 1 y 100');
Responder Con Cita
  #4  
Antiguo 08-10-2010
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.410
Poder: 22
fjcg02 Va camino a la fama
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 := '';
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #5  
Antiguo 09-10-2010
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
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)
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #6  
Antiguo 09-10-2010
Panasys Panasys is offline
Miembro
 
Registrado: ago 2007
Posts: 88
Poder: 17
Panasys Va por buen camino
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 !!!
Responder Con Cita
  #7  
Antiguo 09-10-2010
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
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.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #8  
Antiguo 09-10-2010
cmm07 cmm07 is offline
Miembro
 
Registrado: nov 2007
Posts: 526
Poder: 17
cmm07 Va por buen camino
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..

...
Responder Con Cita
  #9  
Antiguo 09-10-2010
cmm07 cmm07 is offline
Miembro
 
Registrado: nov 2007
Posts: 526
Poder: 17
cmm07 Va por buen camino
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

Última edición por cmm07 fecha: 09-10-2010 a las 03:08:44.
Responder Con Cita
  #10  
Antiguo 13-10-2010
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Cita:
Empezado por Panasys Ver Mensaje
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
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.
Responder Con Cita
  #11  
Antiguo 13-10-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Panasys Ver Mensaje

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.

Última edición por ecfisa fecha: 13-10-2010 a las 21:18:08.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como hacer un smtp server ¿relay? como el de argosoft JXJ Varios 5 02-12-2008 19:13:52
como hacer graficos en php? gabrielflowers PHP 2 22-04-2008 22:15:17
como hacer conexion con dbe cutfe Conexión con bases de datos 1 18-04-2008 05:15:57
¡¡Como hacer un exe que modifique un EXE JXJ Varios 0 09-08-2005 20:36:33
No se como hacer SQL Alexander SQL 1 28-06-2005 22:27:51


La franja horaria es GMT +2. Ahora son las 20:34:47.


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