Ir para o conteúdo
darkangel_13

Verificação de propriedades de triangulos

Mensagens Recomendadas

darkangel_13    0
darkangel_13

Tal como publiquei na área do Pascal , esta ideia (pequeno programa) veio de forma a ajudar os mais pequenos e foi uma forma de eu treinar e ajudar os que estão a iniciar tal como eu :)

Espero opiniões e criticam construtivas :)

/*Problema:
Ler os lados de um triangulo e determina-lo se é isoscelos,escaleno ou equilatero.}
David Russo  3/ 1 /2012
Para uso escolar*/
#include <conio.h>
#include <stdio.h>
main()
{

   float e,d,b;
   printf("Verificacão de propriedade de triangulos");
printf("\nDigite o comprimento do lado esquerdo ->");
scanf("%f",&e);
printf("Digite o comprimento do lado direito  ->");
scanf("%f",&d);
printf("Digite o comprimento da base          ->");
scanf("%f",&b);
if ((e<(d+b)) && (d<(e+b)) && (b<(d+e)))     
           if ((e==b) && (d==e))
              printf("Esses comprimentos formam um triangulo equilatero");
            else  if ((e==b) || (b==d) || (d==e))
              printf("Esses comprimentos formam um triangulo isosceles");
            else  if ((e!=b) && (d!=b) && (e!=d))  // esta linha pode estar omissa   , pois é uma linha subentendida  != é o simbolo de diferente
              printf("Esses comprimentos formam um triangulo escaleno");

   else
       printf("Nao e um triangulo");
	getch();

}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

1) So precisas do <conio.h> para o getch() e essa funcao pode muito bem ser substituida pela getchar() (prototipo em <stdio.h>) e libertas-te da dependencia de um header e biblioteca nao padrao.

2) Prefere double em vez de float para variaveis de virgula flutuante. O double esta para virgula flutuante assim como o int esta para inteiros.

3) Deves verificar se o valor de retorno do scanf() esta de acordo com o numero de variaveis a alterar. Se nao estiver, no minimo, apresenta uma mensagem de erro e aborta o programa.

4) a funcao main deve ser definida como int main(void), e, para maior portabilidade entre diferentes versoes de compiladores, deves ter um return 0; antes do ultimo } da funcao main.

5) os ifs encadeados com um else final que nao pertence an encadeamento pode dar origem a enganos, mesmo tendo em conta a indentacao. Eu acharia bom acrescentar uns {} no if exterior para marcar bem o que pertence a que.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

Por acaso tenho algumas críticas, sem olhar muito para o código, mas o pmg já respondeu a bastantes, vou só por a que não foi indicada:

Não estás a validar os valores de entrada. Se o utilizador inserir números menores ou iguais a zero...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

1) So precisas do <conio.h> para o getch() e essa funcao pode muito bem ser substituida pela getchar() (prototipo em <stdio.h>) e libertas-te da dependencia de um header e biblioteca nao padrao.

2) Prefere double em vez de float para variaveis de virgula flutuante. O double esta para virgula flutuante assim como o int esta para inteiros.

3) Deves verificar se o valor de retorno do scanf() esta de acordo com o numero de variaveis a alterar. Se nao estiver, no minimo, apresenta uma mensagem de erro e aborta o programa.

4) a funcao main deve ser definida como int main(void), e, para maior portabilidade entre diferentes versoes de compiladores, deves ter um return 0; antes do ultimo } da funcao main.

5) os ifs encadeados com um else final que nao pertence an encadeamento pode dar origem a enganos, mesmo tendo em conta a indentacao. Eu acharia bom acrescentar uns {} no if exterior para marcar bem o que pertence a que.

Por acaso tenho algumas críticas, sem olhar muito para o código, mas o pmg já respondeu a bastantes, vou só por a que não foi indicada:

Não estás a validar os valores de entrada. Se o utilizador inserir números menores ou iguais a zero... Aliás, só assim é que o resultado deve ser "não é um triângulo", porque quaisquer 3 valores positivos, não nulos permitem formar um triângulo.

Agradeço pelas criticas , amanha irei aprender mais sobre os itens aqui falados e remodelar este código , obrigado :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

Mas, já agora, não estou a perceber como é que isso valida correctamente um triângulo. A verificação devia ser o quadrado do maior lado (hipotenusa) é igual à soma dos quadrados dos outros dois lados (catetos). Isso poderia levar a alguns problemas de precisão em certos casos, mas podes sempre passar para precisão inteira.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

Mas, já agora, não estou a perceber como é que isso valida correctamente um triângulo. A verificação devia ser o quadrado do maior lado (hipotenusa) é igual à soma dos quadrados dos outros dois lados (catetos). Isso poderia levar a alguns problemas de precisão em certos casos, mas podes sempre passar para precisão inteira.

Sim é verdade , mas ainda não tenho conhecimento para fazer algo tão elaborado e inicialmente este pequeno programa é para ajudar crianças que estão a começar a estudar os triângulos e as suas propriedades

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

E essa verificação (teorema de Pitágoras ) serve para calcular um cateto ou hipotenusa sabendo ângulos ou lados mas não comprova directamente que é um triângulo

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Só mais uma coisa: um conceito muito importante sobre o qual se baseia muito do input/output em C é a linha: um conjunto de 1 ou mais caracteres incluindo e terminando com um '\n' (fgets, puts, ...).

Para manter este conceito aquetivo --- blah pó Acordo :) --- eu terminaria os printf possiveis com "...\n" em vez de o meter no principio do printf seguinte.

Quanto aos printf em que se pretende mesmo não fazer uma linha, convém fazer fflush(stdout); para garantir que o output se torna visível antes de se processar o input (o '\n' também força o output)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

Eu não percebi esse comando pois não o aprendi ainda (quando eu digo não o aprendi é porque ainda não li nada sobre ele), então quer dizer que é aconselhável utilizar o \n sempre no final do comando?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

Se mandares imprimir qualquer coisa sem terminar com o \n só tens garantias de que o output vai aparecer ao utilizador se fizeres um flush ao buffer. É para isso que a função fflush() serve. Mas podes fazer algumas experiências para ficares a perceber exactamente o problema :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade