Closed GabrielCoelho closed 1 year ago
Bom dia mano,
Não sei se sua função de maior valor está retornando o valor correto, no meu código só esta, if (a > b && a > c) A é o maior, assim vale para as outras, então eu nem cheguei a tratar casos onde duas variáveis são iguais, experimente retirar para ver se da algum resultado positivo assim como alterar a logica de como você define o maior;
Além disso não sei se a sua sintaxe das contas em relação as aspas está correta,
if (pow (side_a, 2) == (pow (side_b, 2) + pow (side_c, 2))) não seria if ( (pow (side_a, 2)) == (pow (side_b, 2)) + (pow (side_c, 2)) );
O que eu fiz foi o seguinte: veja qual é o maior lado, a partir do maior lado eu fiz três grandes blocos de código que essencialmente fazem a mesma coisa, só que onde A é maior as contas ficam if ((a a) == (b b + c c)) por exemplo, caso B fosse maior o programa pularia esse e os outros ifs dos outros triângulos e iria para o bloco B que teria a conta if ((b b) == (a a + c c)) assim como os outros ifs, desse jeito fica rudimentar mas funcionou.
Desde já, obrigado pela resposta. Vou testar isso que você me falou e venho com a réplica 🙏🏻
Acabei de ver que eu ainda não tinha colocado o 1045 no repositório, acabei de subir ele se quiser ver. Abri o seu código no meu editor e os parênteses não aparentem estar errados, peço perdão, creio então que seja algum erro de lógica. Seu if do triangulo isósceles esta com uma condição a menos do que o meu, da uma olhada no meu if, outra coisa é que, você colocou else nos ifs, então em casos onde era pra printar mais de um tipo de triangulo o programa irá pular os elses, ficando assim faltando prints.
Desculpe a demora Mateus, espero que tenha passado bem esses dias. Após diversas tentativas e erros no código, descobri o que estava errado.
Em todos os casos de input que eu estava tentando, durante o debug tudo dava certo, pois meus inputs eram sempre números inteiros (ex: 6.0 10.0 6.0). No entanto, dentro dos meus testes eu não:
Assim, quando fui testar com estes casos, percebi meus dois erros, pois a função estava retornando inteiro (lia 6.4, retornava 6); e quando o último número lido era o maior número, ele simplesmente não retornava como maior, e sobrescrevia pelo segundo valor. Assim, num exemplo, se eu mandasse 6.0 6.0 10.0, ele retornava um Triangulo Equilatero → pois armazenava o valor b dentro do c, sem retornar o 10.0 dentro do novo b. (ficou confuso a explicação aqui, desculpe - preciso melhorar na didática).
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
double
biggestValue (double a, double b, double c)
{
if (a > b && b > c)
{
return a;
}
else if (a < b && b > c)
{
return b;
}
else if (a < b && b < c)
{
return c;
}
else if ((a == b && a > c) || (a == c && a > b))
{
return a;
}
else if ((b == c && b > a) || (b == a && b > c))
{
return b;
}
else if (c == a && c == b)
{
return a;
}
else
{
return c;
}
}
int
main (int argc, char *argv[])
{
double side_a, side_b, side_c, arrangementMule;
while (scanf ("%lf %lf %lf", &side_a, &side_b, &side_c) != EOF)
{
// Arrange them in decreasing order, so side_a is the biggest.
if (side_a <= side_b || side_a <= side_c)
{
if (side_b < side_c)
{
while (side_b < side_c)
{
arrangementMule = side_b;
side_b = biggestValue (side_a, side_b, side_c);
side_c = arrangementMule;
}
}
arrangementMule = side_a;
side_a = biggestValue (side_a, side_b, side_c);
side_b = arrangementMule;
if (side_b < side_c)
{
arrangementMule = side_b;
side_b = side_c;
side_c = arrangementMule;
}
}
if (side_a >= (side_b + side_c))
{
printf ("NAO FORMA TRIANGULO\n");
}
else
{
if (pow (side_a, 2) == (pow (side_b, 2) + pow (side_c, 2)))
{
printf ("TRIANGULO RETANGULO\n");
}
else if (pow (side_a, 2) > pow (side_b, 2) + pow (side_c, 2))
{
printf ("TRIANGULO OBTUSANGULO\n");
}
else if (pow (side_a, 2) < (pow (side_b, 2) + pow (side_c, 2)))
{
printf ("TRIANGULO ACUTANGULO\n");
}
if (side_a == side_b && side_a == side_c && side_b == side_c)
{
printf ("TRIANGULO EQUILATERO\n");
}
else if ((side_a == side_b && side_a != side_c)
|| (side_b == side_c && side_b != side_a)
|| (side_a == side_c && side_a != side_b))
{
printf ("TRIANGULO ISOSCELES\n");
}
}
}
return EXIT_SUCCESS;
}
Perfeito então Gabriel, não sei se fui útil com algum detalhe mas feliz que tenha conseguido resolver o problema.
Foi muito útil. Numa das suas primeiras mensagens, você comentou que não tinha certeza se minha função estava retornando o maior valor. Embora eu tenha mexido nela em último lugar, testei cada uma das possibilidades aqui declaradas 🙏
Olá meu caro, espero que esteja bem. Embora aqui no repositório ainda não tenha o código do Problema 1045, eu vi no seu perfil do Beecrowd que o seu código foi aceito.
Eu estou num impasse neste exercício desde as 14h de ontem - pois o meu dá, sempre, 15% de erro, mostrando as seguintes diferenças:
Meu código abaixo
Comparei com diversos outros códigos e repositórios na internet, atestando que meu código está similar (em questões lógicas), fiz debug verificando diversos tipos de input, em todos o meu código resolve a ordem A>B>C conforme o exercício pede, e, por fim, resolvi postar aqui (tendo em vista que o Fórum da própria Beecrowd não está permitindo que eu poste por "erro interno"), pois seu repositório foi atualizado recentemente (10h atrás, no momento desta issue)
Agradeço se puder me auxiliar 🙏🏻
Obs: Eu testo tudo com um arquivo "input" e na hora de jogar o código na plataforma, eu mudo os
fprintf
efscanf
paraprintf
escanf
respectivamente.