fazer o programa encontrar valor ideal
Olá senhores!
Estou com uma dúvida para encontrar um valor ideal ou otimizado para um sistema de vendas que precisa encontrar uma quantidade de produtos ideal para um valor:
exemplo: o usuario digita em um edit que precisa de 17 litros de oleo. Em um DBgrid existem varios modelos de um garrafas de oleos, cada uma com quantidades unicas, como:
-5 litros
-10 litros
-3 litros
como fazer o programa achar a quantidade de garrafas ideal para essa situação?
desde já agradeço muito!
Estou com uma dúvida para encontrar um valor ideal ou otimizado para um sistema de vendas que precisa encontrar uma quantidade de produtos ideal para um valor:
exemplo: o usuario digita em um edit que precisa de 17 litros de oleo. Em um DBgrid existem varios modelos de um garrafas de oleos, cada uma com quantidades unicas, como:
-5 litros
-10 litros
-3 litros
como fazer o programa achar a quantidade de garrafas ideal para essa situação?
desde já agradeço muito!
Antonio Brandão
Curtidas 0
Respostas
Emerson Nascimento
04/02/2020
ideal não precisa ser exata, certo?
GOSTEI 0
Antonio Brandão
04/02/2020
ideal não precisa ser exata, certo?
exatamente
GOSTEI 0
Emerson Nascimento
04/02/2020
conseguiu resolver?
eu fiz uma função aqui... não ficou aqueeeela coisa, mas funciona...
eu fiz uma função aqui... não ficou aqueeeela coisa, mas funciona...
GOSTEI 0
Antonio Brandão
04/02/2020
conseguiu resolver?
eu fiz uma função aqui... não ficou aqueeeela coisa, mas funciona...
fiz um algoritmo semelhante a um algoritmo de "quantidade de moedas de troco em centavos" mas não funciona para encontrar valores aproximados.eu fiz uma função aqui... não ficou aqueeeela coisa, mas funciona...
pode postar o que você fez por favor?
GOSTEI 0
Emerson Nascimento
04/02/2020
teste o programa e veja se é isso que espera:
https://www.4shared.com/rar/SgGQCYmCiq/Project6.html
ao descompactar, troque a extensão txt para exe
GOSTEI 0
Antonio Brandão
04/02/2020
teste o programa e veja se é isso que espera:
https://www.4shared.com/rar/SgGQCYmCiq/Project6.html
ao descompactar, troque a extensão txt para exe
é muito parecido com isso, quais os comandos o programa faz?
GOSTEI 0
Emerson Nascimento
04/02/2020
segue a função (em Delphi):
para trabalhar com a função no Delphi, criei dois tipos de dados para guardar tanto as opções possíveis, quanto o resultado:
para utilizar você precisará passar para a função o valor que deseja distribuir, as opções que poderão ser utilizadas, a variável que receberá o resultado da distribuição, se aceita valor aproximado e, caso o valor possa ser aproximado, se será permitido 'estourar' o valor.
exemplo de uso:
procedure CalcTroco( Valor: integer; Opcoes: TMoedas; var aResult: TRetornoCalc; lAceitaAproximado: boolean = False; lNaoEstourar: boolean = True ); var nInit, i, n, nMult: integer; nResto: integer; ValorCalc: integer; begin TArray.Sort<integer>(Opcoes); ValorCalc := Valor; SetLength(aResult,Length(Opcoes)); nInit := Low(aResult); for i := High(Opcoes) downto Low(Opcoes) do begin aResult[nInit,0] := Opcoes[i]; aResult[nInit,1] := -1; Inc(nInit); end; nInit := Low(aResult); while (ValorCalc <> 0) do begin while (ValorCalc <> 0) and (nInit <= High(aResult)) do begin ValorCalc := Valor; for i := nInit to High(aResult) do begin if aResult[i,1] = -1 then aResult[i,1] := ValorCalc div aResult[i,0]; ValorCalc := ValorCalc - (aResult[i,1] * aResult[i,0]); if ValorCalc = 0 then break; end; // se não conseguiu o cálculo exato if ValorCalc <> 0 then begin if aResult[nInit,1] > 0 then aResult[nInit,1] := aResult[nInit,1] - 1; for i := nInit+1 to High(aResult) do aResult[i,1] := -1; if aResult[nInit,1] = 0 then Inc(nInit); end; end; // se o valor não foi exato if ValorCalc <> 0 then begin if lAceitaAproximado then // verifico se pode ser valor aproximado begin if lNaoEstourar then Dec(Valor) else Inc(Valor); nInit := Low(aResult); for i := Low(aResult) to High(aResult) do aResult[i,1] := -1; end else ValorCalc := 0; end; end; // zero as quantidades que estiverem negativas for i := Low(aResult) to High(aResult) do if aResult[i,1] < 0 then aResult[i,1] := 0; // redistribui os valores, caso necessário for i := High(aResult) downto Low(aResult)+1 do if aResult[i,1] > 0 then for n := (i-1) downto Low(aResult) do begin nMult := (aResult[i,1] * aResult[i,0]) div aResult[n,0]; nResto := (aResult[i,1] * aResult[i,0]) - (nMult * aResult[n,0]); if (nMult > 0) and ((nResto = 0) or ((nResto mod aResult[i,0])=0)) then begin aResult[i,1] := aResult[i,1] - ((nMult * aResult[n,0]) div aResult[i,0]); aResult[n,1] := aResult[n,1] + nMult; end; end; end;
para trabalhar com a função no Delphi, criei dois tipos de dados para guardar tanto as opções possíveis, quanto o resultado:
type TRetornoCalc = array of array[0..1] of integer; TMoedas = TArray<integer>;
para utilizar você precisará passar para a função o valor que deseja distribuir, as opções que poderão ser utilizadas, a variável que receberá o resultado da distribuição, se aceita valor aproximado e, caso o valor possa ser aproximado, se será permitido 'estourar' o valor.
exemplo de uso:
procedure TForm3.Button4Click(Sender: TObject); var i: integer; aRetorno: TRetornoCalc; aMoedas: TMoedas; strMensagem: string; begin SetLength(aMoedas, 3); aMoedas[0] := 5; aMoedas[1] := 3; aMoedas[2] := 10; CalcTroco( 7, // valor desejado aMoedas, // opções disponíveis aRetorno, // retorno calculado True, // indica se aceita cálculo aproximado (se não conseguir exato) False ); // indica se calculo aproximado pode 'estourar' o valor strMensagem := ''; for i := Low(aRetorno) to High(aRetorno) do strMensagem := strMensagem + FloatToStr(aRetorno[i,1])+' un de '+FloatToStr(aRetorno[i,0])+'l' + Chr(10) + Chr(13); ShowMessage(strMensagem); end;
GOSTEI 0