mateus-sm / BeeCrowd-Solved

Repository destined to document BeeCrowd problems.
https://www.beecrowd.com.br/judge/pt/profile/571361
MIT License
0 stars 0 forks source link

1045.c Erro 15% #2

Closed GabrielCoelho closed 1 year ago

GabrielCoelho commented 1 year ago

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

#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

int
biggestValue (int a, int b, int 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;
    }
}

int
main (int argc, char *argv[])
{
  FILE *fro = fopen ("./input/1045.in", "r");
  FILE *fwr = fopen ("./output/1045.out", "w+");

  double side_a, side_b, side_c, arrangementMule;
  while (fscanf (fro, "%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))
        {
          fprintf (fwr, "NAO FORMA TRIANGULO\n");
        }
      else
        {

          if (pow (side_a, 2) == (pow (side_b, 2) + pow (side_c, 2)))
            {
              fprintf (fwr, "TRIANGULO RETANGULO\n");
            }
          else if (side_a * side_a > side_b * side_b + side_c * side_c)
            {
              fprintf (fwr, "TRIANGULO OBTUSANGULO\n");
            }
          else if (pow (side_a, 2) < (pow (side_b, 2) + pow (side_c, 2)))
            {
              fprintf (fwr, "TRIANGULO ACUTANGULO\n");
            }
          if (side_a == side_b && side_a == side_c)
            {
              fprintf (fwr, "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))
            {
              fprintf (fwr, "TRIANGULO ISOSCELES\n");
            }
        }
    }
  return EXIT_SUCCESS;
}

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 e fscanf para printf e scanf respectivamente.

mateus-sm commented 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.

GabrielCoelho commented 1 year ago

Desde já, obrigado pela resposta. Vou testar isso que você me falou e venho com a réplica 🙏🏻

mateus-sm commented 1 year ago

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.

GabrielCoelho commented 1 year ago

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).

Código atualizado e aceito

#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;
}
mateus-sm commented 1 year ago

Perfeito então Gabriel, não sei se fui útil com algum detalhe mas feliz que tenha conseguido resolver o problema.

GabrielCoelho commented 1 year ago

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 🙏