Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-07-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Calcular Año (condición cíclica)

Resulta que tengo un orden de equivalencias entre una Letra y su correspondiente Año, el cual se va repitiendo a lo largo de la historia.
Empieza con la letra K en el años 2000.

Código Delphi [-]
K=2000
L=2001
M=2002
N=2003
P=2004
R=2005
S=2006
T=2007
V=2008
X=2009
Z=2010
A=2011
B=2012
C=2013
D=2014
E=2015
F=2016
H=2017
J=2018
 
//y asi suscesivamente...
 
K=2019
L=2020
... etc.

Pero no se me ocurre como hacer, para que introciendo una variable "año", me devuelva la Letra del año que correspode, segun el orden cíclico establecido

Código Delphi [-]
 
anio:='2007';
//anio:='1995';
//anio:= .....  etc
QueAnio:=LetraAnio(anio);

Realmente no se me ocurre que hacer.

Saludos y Gracias
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #2  
Antiguo 31-07-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
La condición cíclica se puede conseguir con Mod.

Código:
1 mod 100 = 1
2 mod 100 = 2
...
99 mod 100 = 99
100 mod 100 = 0
101 mod 100 = 1
102 mod 100 = 2
....
200 mod 100 = 0
...
Con unos pequeños ajustes se puede conseguir el efecto que tu buscas.
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 31-07-2007
emilioeduardob emilioeduardob is offline
Registrado
 
Registrado: jul 2007
Posts: 4
Poder: 0
emilioeduardob Va por buen camino
y depende man...
Si es solo hasta la Z o sino seria un poquitin mas complejo.
Yo haria algo asi. Claro esto solo funcionaria hasta la Z.
Código Delphi
Código Delphi [-]
function AnoToLetra(Anho: integer): string; 
begin    
  result := Char(Anho - 1925); 
end;

Última edición por emilioeduardob fecha: 31-07-2007 a las 19:12:26.
Responder Con Cita
  #4  
Antiguo 31-07-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Cita:
Empezado por emilioeduardob
y depende man...
Si es solo hasta la Z o sino seria un poquitin mas complejo.
Yo haria algo asi. Claro esto solo funcionaria hasta la Z.
Código Delphi

Código Delphi [-]
function AnoToLetra(Anho: integer): string;
begin
result := Char(Anho - 1925);
end;


Pense en lo que decis, pero las letras no van de la A..Z, es decir, hay letras que no se usan en el ciclo, la "U" por ejemplo.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #5  
Antiguo 31-07-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Cita:
Empezado por Delphius
La condición cíclica se puede conseguir con Mod.

Código:
1 mod 100 = 1
2 mod 100 = 2
...
99 mod 100 = 99
100 mod 100 = 0
101 mod 100 = 1
102 mod 100 = 2
....
200 mod 100 = 0
...
Con unos pequeños ajustes se puede conseguir el efecto que tu buscas.
Saludos,
Esta buena la idea, pero esto seria para un Ciclo con una serie de 100. Yo solo utilizo 19 letras, lo que me lo complica bastante.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #6  
Antiguo 31-07-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
No la he probado... yo me estoy imaginando algo como esto:


EDITO:

Código Delphi [-]
function TForm1.AnnoALetra(Anno: integer): string;
const
 LETRAS = 'KLMNPRSTVXZABCDEFHJ';
var dif: integer;
begin
 dif := Anno mod  2000; //2000 es el primer año a contabilizar
 id Dif = 0
   then Dif = 1;
 result := LETRAS[(dif div Length(LETRAS))];
end;

Ahora si debería andar.
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 31-07-2007 a las 19:34:58.
Responder Con Cita
  #7  
Antiguo 31-07-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Cita:
Empezado por Delphius
No la he probado... yo me estoy imaginando algo como esto:


Código Delphi [-]
function TForm1.AnnoALetra(Anno: integer): string;
const
LETRAS = 'KLMNPRSTVXZABCDEFHJ';
var dif: integer;
begin
dif := Anno mod 2000; //2000 es el primer año a contabilizar
result := LETRAS[dif + 1];
end;





No lo he probado totalmente... habría que ver...
Saludos,
Está muy bien, retocando la sugerencia me quedo casi igual, ahora bien, que pasa si intento averiguar a que letra corresponde el año 1994, estoy en problemas porque defini que el ciclo arranque del 2000. Inicié del 2000 porque seria lo mas actual del ciclo, pero deberia arrancar de 1950. Y al llegar al tope maximo, volver a empezar. En este caso el año 2018 es la J, pero el 2019 deberia ser la K nuevamente y asi suscesivamente.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;

Última edición por MaMu fecha: 31-07-2007 a las 19:38:21.
Responder Con Cita
  #8  
Antiguo 31-07-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Si es como dices, que debe computarse dese una fecha más temprana puedes modificarla.

Estoy viendo porqué algo no me está andando el código... me parece raro. No logro ver donde estoy metiendo mal la pata.
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 31-07-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Bueno, creo que ahora si podría andar. Al menos, la he probado y está funcionando. Se pueden hacer algunas comprobaciones extras, pero creo que la idea está:

Código Delphi [-]
function TForm1.AnnoALetra(Anno, AnnoIni: integer): string;
const
 LETRAS = 'KLMNPRSTVXZABCDEFHJ';
var dif: integer;
begin
 dif := Anno mod AnnoIni; //AnnoIni es el primer año a computar
 dif := dif mod Length(LETRAS);
 result := LETRAS[dif+1];
end;

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 31-07-2007 a las 19:49:37.
Responder Con Cita
  #10  
Antiguo 31-07-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Cita:
Empezado por Delphius
Si es como dices, que debe computarse dese una fecha más temprana puedes modificarla.

Estoy viendo porqué algo no me está andando el código... me parece raro. No logro ver donde estoy metiendo mal la pata.
Saludos,
Yo lo que pienso, es jugar con la cantidad de Letras (18), y sus condiciones de <, > e =. Puesto a que puedo hacer:

Código Delphi [-]
function AnnoALetra(Anno: integer): string;
const
 LETRAS = 'KLMNPRSTVXZABCDEFHJ';
var dif: integer;
begin
 dif := Anno mod  2000; //2000 es el primer año a contabilizar
 if dif<=18 then result := LETRAS[dif + 1];
 if dif>18 then result := LETRAS[dif - 18];
end;

Lo que me faltaria, es usar una variable multiplo de 18, cosa de mantener su valor de entre 0 y 18.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #11  
Antiguo 31-07-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Mamu, acabo de editar mi función anterior... chequeala. El segundo mod hace lo que pides: que el rango oscile entre 0 y 18.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #12  
Antiguo 31-07-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Cita:
Empezado por Delphius
Mamu, acabo de editar mi función anterior... chequeala. El segundo mod hace lo que pides: que el rango oscile entre 0 y 18.

Saludos,
La he chequeado, pero el problema esta en el año de inicio, ya que segun varie este, me desplaza el orden ciclico. La letra T equivale al año 2007, y no debe varias segun el año de inicio a computar, ya sea que arranque del 2000, como del 1950, llegado al año 2007, deberia corresponderse con la letra T.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #13  
Antiguo 31-07-2007
[basti] basti is offline
Miembro Premium
 
Registrado: ago 2004
Posts: 388
Poder: 20
basti Va por buen camino
Modificando un poco la función
Código Delphi [-]
function AnnoALetra(Anno: integer): string;
const
 LETRAS = 'KLMNPRSTVXZABCDEFHJ';
var dif: integer;
begin
  // para los años mayores de 2000
 if anno - 2000 >= 0 then
   dif := (Anno - 2000) mod 19 + 1
 else
   dif := 19 - (2000 - Anno) mod 19;
 result := LETRAS[dif];
end;

No lo probé pero creo que la solución va por ahí.

Edito: el número de letras son 19 así que cambié algo

Última edición por basti fecha: 31-07-2007 a las 21:30:17.
Responder Con Cita
  #14  
Antiguo 01-08-2007
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
se me ocurrio esto, cuestion de probarlo bien:

Código Delphi [-]
// basado en el codigo de Delphius

function AnioALetra(Anio: integer): string;
const
 LETRAS = 'KLMNPRSTVXZABCDEFHJ';
var dif: integer;
begin
 dif := (Anio + 14) mod 19 + 1;
 result := LETRAS[dif];
end;
Responder Con Cita
  #15  
Antiguo 01-08-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Cita:
Empezado por luisgutierrezb
se me ocurrio esto, cuestion de probarlo bien:


Código Delphi [-]
// basado en el codigo de Delphius

function AnioALetra(Anio: integer): string;
const
LETRAS = 'KLMNPRSTVXZABCDEFHJ';
var dif: integer;
begin
dif := (Anio + 14) mod 19 + 1;
result := LETRAS[dif];
end;



SOLUCIONADO

Gracias a todos por la ayuda. Implemente esta funcion y el resultado fue optimo. Ahora bien, utilice un poco de todas las ideas para hacer una acorde a los cambios que necesitaba y logre solucionarlo.

Saludos
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #16  
Antiguo 01-08-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Ahora, me surgio una duda. Que pasa si quiciera hacer el proceso inverso?? es decir, si segun la letra que introduzca, me devuelva al año que equivale, obviamente dentro de las 19 posibles letras.

Código Delphi [-]
 
function LetraAnio(Letra:string):string;
.....
 
...
//"2007"
Label1.Caption:=LetraAnio('T');

Saludos
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #17  
Antiguo 01-08-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
SOLUCIONADO

Gracias a todos por sus consejos. Ya he logrado hacerlo.

Saludos
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #18  
Antiguo 01-08-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Hola mamu, seria bueno y hasta cortés que postearas la solución para futuras consultas de compañeros que tengamos la misma duda.

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #19  
Antiguo 01-08-2007
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Cita:
Empezado por egostar
Hola mamu, seria bueno y hasta cortés que postearas la solución para futuras consultas de compañeros que tengamos la misma duda.

Salud OS.
Si, mil disculpas, se me pasó.

Esta es la solución, mas bien, una variante, pero que se ajustó perfectamente a mi aplicación.

Código Delphi [-]
function LetraAnio(Letra: string;Orden:Boolean):string;
const
 LETRAS = 'KLMNPRSTVXZABCDEFHJ';
var a,m,d:word;
    i,cont:integer;
begin
  cont:=0;
  DecodeDate(now(),a,m,d);
  for i:=1 to 19 do
    begin
      cont:=cont+1;
      if Orden=True
      then begin
      if Letra=LETRAS[i]
        then begin
          cont:=cont-1;
          if cont<=10 then Result:=IntToStr(2000+cont)
          else Result:=IntToStr(2000+cont-19);
        end;
      end
      else begin
      if Letra=LETRAS[i]
        then begin
          cont:=cont-1;
          if cont<=10 then Result:=IntToStr(2000+cont-19)
            else Result:=IntToStr(2000+cont);
        end;
      end;  
    end;
end;

Saludos
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #20  
Antiguo 02-08-2007
luisgutierrezb luisgutierrezb is offline
Miembro
 
Registrado: oct 2005
Ubicación: México
Posts: 925
Poder: 19
luisgutierrezb Va por buen camino
a lo mejor es un poco tarde, pero se me ocurrio esto para lo inverso:

Código Delphi [-]
// basado en el codigo de Delphius

function LetraAAnio(Letra: Char): Integer;
const
  LETRAS = 'KLMNPRSTVXZABCDEFHJ';
var 
  i,j: integer; 
begin
  i := Pos(AnioALetra(Year(Now)), Letras);
  j := Pos(Letra, Letras);
  if i <= j then
    Result := Year(Now) + (j-i)
  else
    Result := Year(Now) - (i-j)
end;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
condición de query Dantael SQL 3 06-06-2007 05:44:37
filtrado por condicion aanil OOP 3 03-08-2006 19:13:22
Finalizar una Condición jdangosto OOP 3 02-12-2005 08:57:38
condicion en un edit !! romansiux Varios 5 10-04-2005 02:25:40
condicion IF haffo Varios 11 06-11-2003 22:36:04


La franja horaria es GMT +2. Ahora son las 17:40:52.


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