Clipper On Line • Ver Tópico - vetor: busca maior número

vetor: busca maior número

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

vetor: busca maior número

Mensagempor cjp » 20 Jun 2021 00:42

É impossível fazer um programa funcionar sem saber exatamente o que ele deve fazer. É muita controvérsia, indefinição...

Postei meu exemplo logo após o início do tópico. Naquele momento a regra era o item 1 acima. Quando você testou meu exemplo, a regra já havia mudado para o item 7 acima. Com isto, meu exemplo não vai funcionar mesmo. Teoricamente, para ele funcionar, é só inverter o sinal na linha 71, que ficaria ...
Nem vou alterar meu exemplo agora. Provavelmente vão acontecer outras mudanças de regra...
Acho que todos os exemplos do Quintas também não estão aplicando a regra do item 7.


Realmente eu errei acima. Peço desculpas.

A informação correta: preciso pegar os 4 melhores cartões de uso no dia atual, sendo o melhor o que tem vencimento (nvenc) maior possível, desde que o melhor dia de uso (nmelh) seja igual ou MAIOR que a data atual.

Outra coisa: creio que deva ser considerado o mês comercial, sem o dia 31. Pelo menos nunca vi cartão tendo o dia 31 como melhor dia de compra. O meu vence dia 20 e o melhor dia é 14...


Não tem mesmo melhor dia de compra no dia 31. Mas o sistema precisa funcionar também no dia 31, indicando, neste caso, que o cartão do dia é o que tem nmelh como dia 28.
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1258
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 14 vezes

vetor: busca maior número

Mensagempor alxsts » 20 Jun 2021 00:54

Olá!

Considerando os cartões
Cartão Venc Melhor Dia
CRT1 05 12
CRT2 12 19
CRT3 15 22

Qual cartão pegar se estivermos no dia 25?
Precisa pegar os 4 melhores. E se não tiver 4?
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2535
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 15 vezes
Mens.Curtidas: 185 vezes

vetor: busca maior número

Mensagempor cjp » 20 Jun 2021 02:01

No caso concreto, sempre terá pelo menos 8 cartões. Nunca haverá a hipótese de não ter 4 cartões.

Cartão Venc Melhor Dia
CRT1 05 12
CRT2 12 19
CRT3 15 22

Qual cartão pegar se estivermos no dia 25?


A tua lista está ao contrário, porque o vencimento é sempre posterior ao melhor dia. Colocando ela na ordem certa:

Cartão Venc Melhor Dia
CRT1 12 05
CRT2 19 12
CRT3 22 19


No dia 25, o melhor será o CRT3.
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1258
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 14 vezes

vetor: busca maior número

Mensagempor alxsts » 20 Jun 2021 13:05

Olá!
cjp escreveu:A tua lista está ao contrário...

Entendi.

cjp escreveu:No dia 25, o melhor será o CRT3.

Não entendi pois o melhor dia é menor que o dia atual...
cjp escreveu:A informação correta: preciso pegar os 4 melhores cartões de uso no dia atual, sendo o melhor o que tem vencimento (nvenc) maior possível, desde que o melhor dia de uso (nmelh) seja igual ou MAIOR que a data atual
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2535
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 15 vezes
Mens.Curtidas: 185 vezes

vetor: busca maior número

Mensagempor cjp » 20 Jun 2021 16:30

Não entendi pois o melhor dia é menor que o dia atual...


O problema é que, neste teu exemplo, não tem outra opção.

Mas na realidade dificilmente isso aconteceria.
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1258
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 14 vezes

vetor: busca maior número

Mensagempor alxsts » 20 Jun 2021 22:30

Olá!
cjp escreveu:Mas na realidade dificilmente isso aconteceria.

Dificilmente não quer dizer nunca...

E se acontecer? O que deve ser feito?

Crt  Vc MD
CRT1 12 05
CRT2 19 12
CRT3 22 12
CRT4 20 14
CRT5 30 22
CRT6 15 07
CRT7 25 17
CRT8 01 23  ==> Isto é possível? Um cartão que vence no dia 1º do mês, o melhor dia seria na semana final do mês anterior...


Na tabela acima, tem os 8 cartões mas, se o dia atual estiver entre 24 e 30, sua regra fica furada.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2535
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 15 vezes
Mens.Curtidas: 185 vezes

vetor: busca maior número

Mensagempor cjp » 21 Jun 2021 00:15

Dificilmente não quer dizer nunca...

E se acontecer? O que deve ser feito?


Se acontecer, fica como te disse acima. Mas em anos isso ainda não aconteceu, acho difícil que venha a ocorrer.

CRT8 01 23 ==> Isto é possível? Um cartão que vence no dia 1º do mês, o melhor dia seria na semana final do mês anterior...


Sim, exatamente assim. Isso é possível e perfeitamente normal.

Na tabela acima, tem os 8 cartões mas, se o dia atual estiver entre 24 e 30, sua regra fica furada.


Não fica não. Nesse caso, do dia 23 ao dia 31 (quando houver), e do dia 1 ao dia 4, o melhor cartão do dia será o CRT8, que vence dia 1.
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1258
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 14 vezes

vetor: busca maior número

Mensagempor alxsts » 21 Jun 2021 14:02

Olá!

Gosto deste tipo de desafio e por isto insisto. Mas este, realmente não consigo entender...
cjp escreveu:Não fica não. Nesse caso, do dia 23 ao dia 31 (quando houver), e do dia 1 ao dia 4, o melhor cartão do dia será o CRT8, que vence dia 1

Se a regra diz "desde que o melhor dia de uso (nmelh) seja igual ou MAIOR que a data atual", considerando a data atual entre 24 e 31, como é que se vai selecionar o CRT8, sendo que nele o nmelh é 23 (que é o maior nmelh da lista) e portanto não é "igual ou MAIOR que a data atual", no caso, 24 a 31? No caso dos dias 1 a 4, o problema é o mesmo para datas atuais maiores que 4 (nenhum destes nmelh será maior que os dias 1 a 4).
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2535
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 15 vezes
Mens.Curtidas: 185 vezes

vetor: busca maior número

Mensagempor cjp » 21 Jun 2021 16:27

Realmente vc tem toda razão, eu passei a informação errada. Desculpe.
Na verdade é ao contrário. Eu quis dizer: desde que a data atual seja igual ou maior que o nmelh.
Peço desculpas pela confusão criada. Na minha cabeça as coisas estão claras, mas não soube passar corretamente aqui, e gerei esta confusão.
Com esta informação correta, acho que ficou fácil pra vc entender que no dia 24, por exemplo, o melhor cartão, no teu exemplo, seria o crt8, né?
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1258
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 14 vezes

vetor: busca maior número

Mensagempor JoséQuintas » 21 Jun 2021 17:52

Na prática o melhor será simular o cálculo em cada cartão, e colocar em ordem de vencimento.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 16933
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 948 vezes

vetor: busca maior número

Mensagempor alxsts » 22 Jun 2021 12:53

Olá!
cjp escreveu:Realmente vc tem toda razão, eu passei a informação errada. Desculpe.

Percebe como a comunicação errada gera uma perda de tempo desnecessária? O problema deste tópico não precisaria de 40 posts até agora...

Veja se a solução abaixo resolve o caso.
Capturar.JPG

// Compilar: hbmk2 teste hbmemio.hbc

// Economizando variáveis locais...
//                CRT     VC  MD
#define CRT1    { "I...",  1, 23 }
#define CRT2    { "O...",  5, 28 }
#define CRT3    { "B...",  8, 24 }
#define CRT4    { "V...", 12,  2 }
#define CRT5    { "N...", 18, 11 }
#define CRT6    { "C...", 20, 10 }
#define CRT7    { "S...", 22, 10 }
#define CRT8    { "R...", 25, 11 }
#define CRT9    { "X...", 28, 18 }

// Posições em aArray
#define A_DESCRICAO    1
#define A_VENCIMENTO   2
#define A_MELHOR_DIA   3

#include "box.ch"
#include "inkey.ch"

REQUEST HB_MEMIO
REQUEST DBFCDX
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PTISO

FUNCTION CrtMelhor()

   LOCAL aArray, aList
   LOCAL aSelecionados, aSelecionado
   LOCAL nDay

   Hb_LangSelect( 'PT' )
   Hb_CdpSelect( "PTISO" )

   SetBlink( .F. )
   SetColor( "N/W,W+/N" )
   SetMode( 45, 100 )
   CLS

   aArray := {}

   AAdd( aArray, CRT1 )
   AAdd( aArray, CRT2 )
   AAdd( aArray, CRT3 )
   AAdd( aArray, CRT4 )
   AAdd( aArray, CRT5 )
   AAdd( aArray, CRT6 )
   AAdd( aArray, CRT7 )
   AAdd( aArray, CRT8 )
   AAdd( aArray, CRT9 )

   DbCreate("mem:Teste", { { "Dia", "N", 2, 0 }, ;
                           { "Cartao", "C", 4, 0 }, ;
                           { "Vencimento", "N", 2, 0 }, ;
                           { "MelhorDia", "N", 2, 0 } } ,"DBFCDX", .T., "Teste")

   For nDay := 1 To 31
      aSelecionados := DefineCrt( nDay, AClone( aArray ) )
      If Empty( aSelecionados )
         // Nenhum cartão encontrato... cria um registro "fake"
         aSelecionados := { { "NULL", 0, 0 } }
      Endif

      For Each aSelecionado In aSelecionados
         Teste->( DbAppend() )
         Teste->Dia := nDay
         Teste->Cartao     := aSelecionado[ A_DESCRICAO ]
         Teste->Vencimento := aSelecionado[ A_VENCIMENTO ]
         Teste->MelhorDia  := aSelecionado[ A_MELHOR_DIA ]
      Next
   Next
   
   DispBox( 2, 53, 15, 85, B_SINGLE + " " )
   DispOutAt( 3, 55, "Dia   Cart  Venc  Melhor dia", "B+/GR*" )

   For Each aSelecionado In aArray
      DispOutAt( aSelecionado:__enumIndex() + 3, 55, ;
         PadC( aSelecionado[ A_DESCRICAO ], 6 ) + ;
         PadC( Transform( aSelecionado[ A_VENCIMENTO ], "99" ), 14 ) + ;
         PadC( Transform( aSelecionado[ A_MELHOR_DIA ], "99" ), 10 ) )
   Next

   DispOutAt( maxRow() - 3, 2, PadC( "Use " + Chr(27) + Chr(24) + Chr(25) + Chr(26) + ;
   " Ctrl[PgUp/PgDn] [ESC]...", 50 ) )

   Teste->( DbGoTop(), Browse( 2, 2, MaxRow()-5, 50 ) )

   DbCloseArea( "Teste" )
   DbDrop("mem:Teste",,"DBFCDX")

   CLS

RETURN NIL
//---------------------------------------------------------------------------------
STATIC FUNCTION DefineCrt( nDay, aCartoes )

   LOCAL aSelecionados := {}, aCartao, nLoop, nPos
   LOCAL aTemp

   For nLoop := 1 To 4
      nPos := 0

      // Para cada elemento e no aArray...
      For Each aCartao In aCartoes
         // Cada elemento aCartao também é um array...
         // Se o dia atual em nDay for maior ou igual
         // à terceira posição do aCartao (MELHOR DIA) ...
         If nDay >= aCartao[ A_MELHOR_DIA ]
            // Se primeira vez ou se a segunda posição do aCartao (VENCIMENTO)
            // for maior que o anterior, guarda o aCartao atual
            If Empty( aTemp ) .Or. ;
                      aCartao[ A_VENCIMENTO ] > aTemp[ A_VENCIMENTO ]
               aTemp := aCartao
               nPos  := aCartao:__enumIndex()
            Endif
         Endif
      Next

      If nPos > 0
         // Se encontrou, acumula
         AAdd( aSelecionados, aTemp )
         ADel( aCartoes, nPos )
         ASize( aCartoes, Len( aCartoes ) - 1 )
         aTemp := {}
      Else
         // não encontrou nenhum cartão para o dia atual
         Exit
      Endif
   Next

// Ordena os cartões encontrados para o dia por vencimento e retorna   
RETURN ASort( aSelecionados,,, { |x,y| x[ A_VENCIMENTO ] > y[ A_VENCIMENTO ] } )
//---------------------------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2535
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 15 vezes
Mens.Curtidas: 185 vezes

vetor: busca maior número

Mensagempor JoséQuintas » 22 Jun 2021 18:12

É que tem mais complicações no bolo, e dia e vencto não são suficientes.

Dia 02/06 vence 12/07
Dia 23/06 vence 01/08

Comparar dia melhor e dia do vencimento não é suficiente, por isso acrescentei a coluna prazo.
12 é maior que 1, mas somente se fosse o mesmo mês.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 16933
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 948 vezes

vetor: busca maior número

Mensagempor cjp » 23 Jun 2021 00:42

Percebe como a comunicação errada gera uma perda de tempo desnecessária? O problema deste tópico não precisaria de 40 posts até agora...


Percebo sim, e me penitencio por isto. Reitero meu pedido de desculpas.

Veja se a solução abaixo resolve o caso.


Achei duas coisas estranhas:
1) dia 1 está sem resultado;
2) tem dias repetidos, com cartões diferentes.

Não é este o propósito.
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1258
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 14 vezes

vetor: busca maior número

Mensagempor alxsts » 23 Jun 2021 01:32

Olá!
cjp escreveu:1) dia 1 está sem resultado;
Palavras tuas: "desde que a data atual seja igual ou maior que o nmelh."
Estando no dia 1 e olhando na tabela de cartões, existe algum cartão com data atual (dia 1) que seja igual ou maior que algum dos nmelh existentes?
cjp escreveu:2) tem dias repetidos, com cartões diferentes.
Palavras tuas: "E o próximo passo é pegar também o segundo melhor e o terceiro melhor cartão em cada dia. Creio que neste código eu consiga pegar. Mas ainda não sei como fazer isso."
Peguei 3 e, quando existem, 4 cartões para cada dia, em ordem decrescente de vencimento.

cjp escreveu:Não é este o propósito.

Qual seria então? Por favor, seja claro e objetivo. Vou tentar mais uma vez...
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2535
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 15 vezes
Mens.Curtidas: 185 vezes

vetor: busca maior número

Mensagempor cjp » 23 Jun 2021 09:39

Estando no dia 1 e olhando na tabela de cartões, existe algum cartão com data atual (dia 1) que seja igual ou maior que algum dos nmelh existentes?


Sim, sempre tem. Lembrando que o dia 1 de um mês é posterior ao dia 30 ou 31 do mês anterior.

Então, na tua tabela, no dia 1, o melhor cartão é o O..., cujo nmelh é 28.

Peguei 3 e, quando existem, 4 cartões para cada dia, em ordem decrescente de vencimento.


Ah, agora entendi. Não tinha entendido que vc estava pegando os 3 ou 4 melhores na sequência.

Qual seria então? Por favor, seja claro e objetivo. Vou tentar mais uma vez...


Então, como eu havia dito, o propósito é sempre pegar os 4 melhores do dia, na sequência, em todos os dias. Algo assim:

- no dia 1:

cMelh1="O"
cMelh2="B"
cMelh3="I"
cMelh4="X"

- no dia 2:

cMelh1="V"
cMelh2="O"
cMelh3="B"
cMelh4="I"


E assim por diante. Entende?
Inacio de Carvalho Neto
cjp
Usuário Nível 5

Usuário Nível 5
 
Mensagens: 1258
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 8 vezes
Mens.Curtidas: 14 vezes

Anterior



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Ahrefs [Bot], Google [Bot] e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro