Página 1 de 1

Continuação Rotina Sen, cose tang

Enviado: 25 Nov 2013 20:29
por Ricardo Sales Ribeiro
Boa Noite
Amigos


Como mencionei no meu post de agradecimento, estou postando aqui agora um outro problema que tenho que resolver:

Tenho aeguinte tabela:
Tab200 conteudo:
20,20,23,24,24,25,26,27,27,28,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,56,
60,64,67,72,73,80,84,85,86,89,91,95,96,100,107,113,120
Tab400 conteudo:
23,24,24,24,25,26,27,28,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,52,55,56,60,62,64,
64,67,72,75,80,86,87,100

Então a rotina é a seguinte:
Eu entro com uma variaves que recebe o valor de 200 ou 400
Entro com outra variavel que recebe o valor de 264,10

Se eu optar por 200, tenho que acessar a tab200, escolher quatro(4) valores, aleatoriamente que executando o seguinte
calculo: vamos que eu o programa escolha: 20,20,23,24 e calcule da seguinte forma:

((((200/20)*20)/23)*24) este calculo tem que dar 264,10

E assim vai aleatoriamente com mais 4 grupos, calculando e mostrando o resultado.
Ao termino de todas as cominações, a que mais se aproximar de 264,10 será o resultado.

Para maior entendimento, esses valores correspondem a engrenagens de uma máquina, quero dizer que, por exemplo
na Tab200 eu tenho disponivel duas engrenagens de tamanho 20, uma 23, duas 24, uma 25, uma 26 duas 27 e assim por diante. Ou seja, se no calculo o programa me dizer que para chegar ao valor aproximado de 264,10 precisou utilizar, duas engrenagens de 20, uma de 24 e uma de 25, vou na maquina e ponho essas engrenagens, para a máquina funcionar
e fazer o seu trabalho.

Eu posso utilizar as duas tabelas, 200 ou 400, que significam que tenho duas maquinas, se de repente na de 200 eu não conseguir uma aproximação, eu posso tentar outro calculo usando a tab400.

Como posso pegar esses valores aleatoriamente, sabendo que num grupo de quatro, eu só posso utilizar duas vezes 20, porque só disponho de duas engrenagens de 20. Eu só posso utilizar o que eu tenho na tabela.

Então a rotina tem que sair calculando até encontrar o valor aproximado de 264,10.

Atenciosamente

Continuação Rotina Sen, cose tang

Enviado: 28 Nov 2013 12:38
por Ricardo Sales Ribeiro
Bom Dia!

Alguem pode me ajudar a criar essa rotina, desde já agradeço.

Atenciosamente

Continuação Rotina Sen, cose tang

Enviado: 28 Nov 2013 16:59
por ronilson
Salve o código que se segue como prg e compile. Informe o valor e voilá.

Código: Selecionar todos

private amat200 := {20,20,23,24,24,25,26,27,27,28,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,56,60,64,67,72,73,80,84,85,86,89,91,95,96,100,107,113,120}
private xnum:=0;xa:=0;ya:=0;za:=0;qa:=0;xb:=0;yb:=0;zb:=0;qb:=0;xmin:=0; xmax:=0; xexato:=0
private xe:=0;ye:=0;ze:=0;qe:=0
cls
@ 02,10 say 'Entre número: ' get xnum pict '9999.999'
read
if lastkey()=27
	quit
endif
xmax:=xnum*10
calcula(xnum)

if xmax <(xnum*10)
	@ 03,10 say 'Acima.: '+transform(xmax,'9999.9999')  +'-'+str(amat200[xa])+' '+str(amat200[ya])+' '+str(amat200[za])+' '+str(amat200[qa])
endif
if xexato == xnum
	@ 04,10 say 'Exato.: '+transform(xexato,'9999.9999')+'-'+str(amat200[xe])+' '+str(amat200[ye])+' '+str(amat200[ze])+' '+str(amat200[qe])
endif
if xmin>0
	@ 05,10 say 'Abaixo: '+transform(xmin,'9999.9999')  +'-'+str(amat200[xb])+' '+str(amat200[yb])+' '+str(amat200[zb])+' '+str(amat200[qb])
endif
return


procedure calcula()
local i:=0; iret:=0
for x:= 1 to len(amat200)
	for y:= 1 to len(amat200)
		if x<> y
			for z:= 1 to len(amat200)
				if ((z <> x) .and. (z <> y))
					for q:= 1 to len(amat200)
						if ((q <> x) .and. (q <> y) .and. (q <> z))
							i += 1
							@ 10,10 say transform(i,'999999999')+' - '+transform(amat200[x],'999')
							iret :=calculo(amat200[x],amat200[y],amat200[z],amat200[q])
							@ 12,10 say transform(iret,'9999.9999')+' - '+str(amat200[x])+','+str(amat200[y])+','+str(amat200[z])+','+str(amat200[q])
							if iret > xnum
								if xmax > iret
									xmax := iret
									xa:=x;ya:=y;za:=z;qa:=q
								endif
							elseif iret < xnum
								if xmin < iret
									xb:=x;yb:=y;zb:=z;qb:=q
									xmin := iret
								endif
							elseif iret == xnum
								xe:=x;ye:=y;ze:=z;qe:=q
								xexato := iret
							endif
							inkey()
							if lastkey() == 27
								return
							endif
						endif
					next
				endif
			next
		endif
	next
next

function calculo(x,y,z,q)
xret:=((((200/x)*y)/z)*q)
return(xret)

Continuação Rotina Sen, cose tang

Enviado: 29 Nov 2013 17:16
por Ricardo Sales Ribeiro
Caro Amigo
Ronilson

Obrigado pela rotina, vou compilar e testar, informo assim que processar.


Atenciosamente

Continuação Rotina Sen, cose tang

Enviado: 04 Dez 2013 12:47
por Ricardo Sales Ribeiro
Amigo Ronilson
Bom Dia!


A Rotina funcionou corretamente, preciso agora acrescentar algumas informações, para filtrar mais os resultados, da
seguinte maneira:

Quero informar uma margem, tipo se eu informar 1.00 e se o valor informado for 264.100, esse valor deverá ser acrescentado ou diminuido de 1.00 ou seja, a rotina vai só me mostrar os resultados que tenham 263.100 ou 265.100
incluindo 264.100.

Se a margem for 0.1 os resultados vão interferir somente nas casas decimais. Ou seja mostra os resultados a partir de
264.100.

Esses resultados quero mostrar num arquivo texto com a seguinte formatação:

23 23 25 33 = 264.000000
23 23 28 37 = 264.285706

O meu chefe quer vê esse resultado num relatorio simples, para poder escolher a melhor opção, a gente trabalha com
maquinas, tornos mecanicos de alta precisão, e precisamos informar a maquina, os valores mais precisos.

Atenciosamente