Continuação Rotina Sen, cose tang

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Continuação Rotina Sen, cose tang

Mensagem 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
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Continuação Rotina Sen, cose tang

Mensagem por Ricardo Sales Ribeiro »

Bom Dia!

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

Atenciosamente
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
ronilson
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 28 Nov 2013 16:56
Localização: mg contagem

Continuação Rotina Sen, cose tang

Mensagem 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)
Editado pela última vez por Toledo em 28 Nov 2013 17:01, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Continuação Rotina Sen, cose tang

Mensagem por Ricardo Sales Ribeiro »

Caro Amigo
Ronilson

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


Atenciosamente
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Continuação Rotina Sen, cose tang

Mensagem 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
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Responder