Logo Hardware.com.br
Maciel-dp
Maciel-dp Novo Membro Registrado
11 Mensagens 2 Curtidas

Regra de três em C como saber quando e necessário inverter

#1 Por Maciel-dp 21/11/2017 - 16:54
Ola pessoal fiz uma função simples para calcular regra de três simples, ela funcionou bem porém em alguns casos quando e necessário inverter a expressão, o código leva isso em consideração mas a matemática não!
Na internet tem umas calculadoras que sofrem do mesmo mal, testem os exemplos abaixo:
Exemplo 1(funciona)
Para assoalhar um quarto de 15m2 de área, gastam-se 900 tacos. Quantos tacos serão necessários para 23m2? Resp:1380
Exemplo 2(falha)
Na contrução de uma casa, 6 operários levam 18 dias. Quanto tempo levaria se fossem 12? Resp:9
Porem as caculadoras e minha função respondem 36!
O problema e que a função segue as regras e não inverte a ordem da expressão, oquê é correto no primeiro caso e errado no segundo!
6 18 6 x
--- --- deveria ser --- ---
12 x 12 18
A função:
/*
A B
-- --
C D
*/
[HASHTAG]#include[/HASHTAG]

int r3s(int A, int B, int C, int D){
int vcn,inv;
vcn=0; //conta entradas dif. 0
inv= 0;//inverter(T/F)
//Descobre onde esta o x neste caso o 0 e verifica se valido(no minimo 3 valores)
if( A != 0 ) vcn++;
if( B != 0 ) vcn++;
if( C != 0 ) vcn++;
if( D != 0 ) vcn++ ;
if(vcn != 3 ) return 0;
//inverter?
if( A > C && B > D )
inv=0;
else
inv=1;
if( inv ) {
if( A == 0 || C == 0 ){ cnv = A; A = C ; C = cnv; }
else if( B == 0 || D == 0 ){ cnv = B; B = D ; D = cnv; }
}
//calculo
if( A == 0 ) return ((C*B)/D);
else if( B == 0) return ((A*D)/C);
else if( C == 0) return ((A*D)/B);
else if( D == 0) return ((C*B)/A);
else return 0;
}
faguirre
faguirre Super Zumbi Registrado
4.2K Mensagens 1.5K Curtidas
#2 Por faguirre
21/11/2017 - 20:48
Acontece que são dois problemas distintos. No primeiro caso é algo que diretamente proporcional, quanto maior a área, mais material eu vou precisar, enquanto o segundo caso é algo inversamente proporcional, ou seja, quanto mais operários, menor é o tempo de execução da obra.

Primeiro caso:
[mathtex]
\frac{15}{23} = \frac{900}{x} \rightarrow x = \frac{900 * 23}{15} m^2 \rightarrow x=1380 m^2
[/mathtex]

Segundo caso:
[mathtex]
\frac{12}{6} = \frac{18}{x} \rightarrow x = \frac{18 * 6}{12} \rightarrow x = 9 dias
[/mathtex]

Você de alguma forma deve informar ao programa sobre que tipo de problema você está lidando ou simplesmente colocar os valores na ordem inversa.
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#3 Por esquiloesper...
22/11/2017 - 01:32
faguirre disse:

- Exatamente.
As máquinas, assim como os vegetais, não são dotados de capacidade intuitiva.

É por isto que nelas, as calculadoras, existe uma tecla inversora com a inscrição "INV" ou "Shift" ou "2ndF", etc... Minha sugestão é que copie esta ideia ou faça você mesmo a inversão ao digitar os valores, conforme indicou muito bem o nobre @faguirre .
Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
Maciel-dp
Maciel-dp Novo Membro Registrado
11 Mensagens 2 Curtidas
#4 Por Maciel-dp
22/11/2017 - 17:17
Então todo mundo concorda que não e possível descrever uma regra para função tratar cada caso?
Esta função inverte corretamente neste problema:
"Oito pedreiros fazem um muro em 72 horas, quanto tempo levarão 6 pedreiros?"
Resposta 96 horas

As máquinas, assim como os vegetais, não são dotados de capacidade intuitiva.

Sim concordo, mas maquinas(PC) são baseados na matemática, e a matemática e baseada em regras!
Infelizmente eu não sou tão bom em matemática como eu queria, mas sei que deve haver uma regra expressa
que trate o caso em questão, sendo que para provar algo ele deva ser reversível, ou estou errado?
Exemplo:
4 120 x 80
Com a função acima o x pode estar em qualquer lugar e dará a resposta certa, que é o ponto principal, de
certo modo provando em parte a minha tese maluca. E claro não e necessário inverter.
No caso da calculadora, apenas citei como exemplo a minha ideia era ter a mão uma função confiavel
para esses cálculos de modo automático, ou seja uma outra função extrai os valores do texto e repassa
para a r3s fazer os cálculos sem interferência da minha parte!:-?
Maciel-dp
Maciel-dp Novo Membro Registrado
11 Mensagens 2 Curtidas
#10 Por Maciel-dp
22/11/2017 - 22:13
esquiloesperto disse:

Ok era uma brincadeira!
Mesmo em sites estrangeiros e outros fóruns os exemplos dos algoritmos apresentados não levam em consideração a inversão.
Abaixo alguns exemplos que podem levar usuário a erro:
https://pt.calcuworld.com/calculadoras-matematicas/calculadora-de-regra-de-tres/
http://internet-toolbox.com/free_online_ruleofthree_calculator
https://forum.codigofonte.net/topic/19506-regra-de-3/
faguirre
faguirre Super Zumbi Registrado
4.2K Mensagens 1.5K Curtidas
#14 Por faguirre
23/11/2017 - 09:39
Você está pensando na matemática como uma simples caixa preta, onde você coloca números de um lado e sai o resultado correto do outro. Como já explicado você está querendo lidar com dois problemas distintos utilizado a mesma ferramenta. Não vai funcionar pois até o momento os computadores não possuem capacidade cognitiva aprimorada para escolher qual ferramenta utilizar.
Maciel-dp
Maciel-dp Novo Membro Registrado
11 Mensagens 2 Curtidas
#15 Por Maciel-dp
23/11/2017 - 16:09
faguirre disse:

Concordo em parte, a matemática não e uma caixa preta, porém ela e regida de regras , estas quais tem de ser provadas em forma de expressões, equações e afins..
o objetivo da postagem era saber se alguém mais esclarecido na área pude-se dizer se há alguma regra aplicável ou não.
Infelizmente não e possível encontrar uma solução ótima para o caso, mesmo usando inferência o acerto continua sendo inferior a 90%, nem outras técnicas como
correlação funcionam, já na visão da matemática a melhor solução e "A * D = C * B".
Relembrando só estou perguntando e há uma regra matemática para decidir se de haver ou não há inversão, não estou pedindo uma solução pronta e sim já
fiz uma busca exaustiva e sim já tentei todos os métodos que dispunha no meu parco conhecimento em matemática!
Então se alguém puder dar ideia,dica não abstrata eu sou muito grato, e um obrigado a todos contribuíram com seu conhecimento e tempo.

Edit:
Bom a minha solução tosca pro problema foi criar script que lê o enunciado e busca palavras chaves conhecidas, então compara a ordem da grandeza e decide se
inverte ou não antes de repassar os valores para função, mas e obvio que se não tiver a palavra previamente definida vai dar a resposta errada, além de quê para
melhorar a precisão o script vai aumentando de tamanho numa progressão geométrica ao definir novas palavras.confused.png

Bom eu acho que o problema esta acima capacidade, se alguém tiver o e-mail do Stephen Hawk, posta ai
acho que só ele para resolver essa!smile.png
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal