Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

darkangel_13

Verificação de propriedades de triangulos

Mensagens Recomendadas

darkangel_13    0
darkangel_13

Boa noite , hoje propus-me um problema simples baseado em ajuda escolar que talvez possa vir ajudar a quem está a iniciar como eu, gostava de obter opiniões, etc..

{Problema:
Ler os lados de um triangulo e determina-lo se é isoscelos,escaleno ou equilatero.}
//David Russo  3/ 1 /2012
//Para uso escolar

program triangulo ;

         var e,d,b :real;

begin
   writeln('Verificacao de propriedades de triangulos');
writeln('Digite o comprimento do lado esquerdo ->');
   readln(e);
   writeln('Digite o comprimento do lado direito  ->');
readln(d);
   writeln('Digite o comprimento da base          ->');
readln(b);

if (e<(d+b)) and (d<(e+b)) and (b<(d+e)) then     
           if ((e=b) and (d=e)) then
	       write('esses comprimentos formam um triangulo equilatero')
            else  if ((e=b) or (b=d) or (d=e)) then
              write('Esses comprimentos formam um triangulo isosceles')
            else  if ((e<>b) and (d<>b) and(e<>d)) then // esta linha pode estar omissa   , pois é uma linha subentendida
	       write('Esses comprimentos formam um triangulo escaleno')


        else
    writeln('Nao e um triangulo');
       readln();

end.

Espero ter contribuido, daqui a uns minutos posto para Java e para C

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pwseo    222
pwseo

Sugiro-te que melhores a indentação que utilizaste no teu código. Tirando isso, penso estar geralmente bem. Não compilei (não estou com um compilador à mão).

Coloco aqui, no entanto, uma variação do teu código, utilizando tipos de dados definidos pelo utilizador e abstraindo o código que faz a verificação para dentro de uma função.

Sei que és principiante, mas não faz mal nenhum olhares para como ficou o código... é uma oportunidade para veres como duas funcionalidades de uma linguagem se juntam para criar código mais natural e avançado.

Se tiveres dúvidas, avisa :)

program triangulo;

type TTipoTriangulo = (triIsosceles, triEquilatero, triEscaleno, triInvalido);

function verificarTriangulo(e, d, b: real): TTipoTriangulo;
begin
  // Começamos por assumir que é inválido
  verificarTriangulo := triInvalido;

  if (e < (d + b)) and (d < (e + b)) and (b < (d + e)) then
    if ((e = b) and (d = e)) then
      verificarTriangulo := triEquilatero
    else if ((e = b) or (b = d) or (d = e)) then
      verificarTriangulo := triIsosceles
    else
      verificarTriangulo := triEscaleno;
end;

var
  e, d, b :real;

begin
  writeln('Verificacao de propriedades de triangulos');
  write('Lado esquerdo: ');
  readln(e);
  write('Lado direito: ');
  readln(d);
  write('Base: ');
  readln(b);

  case verificarTriangulo(e, d, b) of
    triIsosceles:  writeln('Triângulo isósceles');
    triEquilatero: writeln('Triângulo equilátero');
    triEscaleno:   writeln('Triângulo escaleno');
    triInvalido:   writeln('Triângulo inválido');
  end;
end.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

Sugiro-te que melhores a indentação que utilizaste no teu código.

como assim ? já agora obrigado :)

Realmente vi o código e  percebi-o mais ou menos visto que ainda não estou a fazer coisas muito mais "a frente" com cases e assim , mas quando lá chegar garanto que irei perceber plenamente B)

Realmente versões diferentes e o mesmo resultado.

Obrigado

EDIT: quote devido adicionado.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pwseo    222
pwseo

O que eu quero dizer com indentação é para uniformizares os locais onde dás espaços e quantos espaços deves dar no teu código.

Se reparares no exemplo que coloquei, uso sempre 2 espaços.

Tu tens alguns locais com 4, outros com 8... o número não importa, o importante é que seja sempre o mesmo número de espaços para cada nível.

E nesse aspecto, relembro-te que os writeln devem estar ao mesmo nivel que os readln, por uma questão de organização :)

Quanto ao código que eu coloquei, não tem nada a ver com a indentação, como agora deves estar a perceber. Apenas o coloquei para perceberes que existe muita coisa além de fazer um programa com toda a lógica no bloco de código principal. Foi "um cheirinho" de coisas mais avançadas para um dia voltares a pegar.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pwseo    222
pwseo

Outra coisa:

Algumas das críticas que fizeram à tua versão deste programa em C são aplicáveis aqui também, mas uma vez que estás a aprender preferi não lhes fazer referência.

Ou seja, não te esqueças que programas "reais" validam sempre os dados que o utilizador introduz, etc etc :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pwseo    222
pwseo

Validar no sentido de verificar se o utilizador introduziu dados válidos. Por exemplo, o user pode introduzir números negativos ou letras e tu não podes aceitar isso como válido :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    611
thoga31

E como o faria ?

repeat
     write('Lado: ');
     readln(a);
until (a>0);  // um lado não pode ser negativo nem nulo (isso significa que não existe).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

repeat
     write('Lado: ');
     readln(a);
until (a>0);  // um lado não pode ser negativo nem nulo (isso significa que não existe).

Ok!! Obrigado :) qualquer dúvida posto aqui B)

cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
passarito    56
passarito

repeat
    write('Lado: ');
    readln(a);
until (a>0);  // um lado não pode ser negativo nem nulo (isso significa que não existe).

Thoga, esse código pode servir academicamente, mas é muito fácil de dar erro. Repara:

Se a for numérico inteiro, Integer por exemplo, se inserires 0.5 dá erro;

Se a for numérico real, Real por exemplo, se inserires ABC dá erro;

Se a for texto, String por exemplo, dá erro logo na compilação, o conhecido "Type mismatch";

A validadção é uma coisa muito bonita, mas não é assim tão directa a sua implementação!

Uma implementação simples e bem feita passará sempre pelo menos por mais do que uma variavel.

um exemplo abaixo.

program test_variavel;

var
a:string;
b:integer;
code:integer;

function IsInteger(s:string):boolean;
var
 i:integer;
 ok:boolean;

begin
 ok:=true;
 for i:=1 to length(s) do
   if not(s[i] in ['0'..'9']) then begin
     ok:=false;
     i:=length(s);
   end;
 IsInteger:=ok;
end;

begin
 repeat
   readln(a);
 until IsInteger(a) OR (a='');
 if a<>'' then begin
   val(a,b,code); {com este codigo de validacao o code não tem qualquer efeito}
   writeln('variavel inteira: ',b);
 end
 else writeln('Programa abortado pelo utilizador');
end.

Para reais, datas, variaveis monetárias, etc. será apenas necessário arranjar a função com as nossas especificidades, mas provavelmente isto já deverá andar pela Wiki, não?!?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    611
thoga31

Bem, eu dei a solução geral e simples. Não quis ser mais papista que o Papa - para isso é que temos um.

E essa função IsInteger está uma complicação em três actos. Ora vê esta maravilha:

function IsInteger(const numero : string) : boolean;
var i : integer;
    erro : word;
begin
     val(numero, i, erro);
     if (erro <> 0) then result := false
     else result := true;
end;

Isto porque, se i é um Integer, então "numero" só pode ter a formatação de um inteiro. Se for "0.5", não pode ser atribuído a i, logo dará erro na posição 2.

Keep It Simple. B)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
passarito    56
passarito

Sim, é o exemplo do Pascal... e para o problema apresentado essa solução resolve o problema, mas algo que eu aprendi é que não se deve resolver um problema criando outros num possivel futuro.

Eu, tento na medida dos possiveis, deixar caminho livre para a evolução da solução.

No entanto volto a afirmar: "para o problema apresentado essa solução resolve o problema"

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    611
thoga31

@passarito, só agora reparei, mas quando pegaste no meu código, eu estava a subentender "a" como uma variável do tipo Real, seguindo o programa original. Porque é que pegaste nele e lançaste tantas opções (e se, e se, e se) e, logo, um problema que não estava presente no tópico até ao momento em que o introduziste?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    611
thoga31

supostamente eu ao dizer que o tipo de dados é real e ao validar daquela forma já não deveria dar erro, certo?

Certo.

Daí não estar a entender a saída do @passarito... apateceu-lhe piar para além do que a encomendava mandava, suponho. B)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    611
thoga31

Nice , eu a pensar que apenas fazia porcaria de codigo

Não estás a fazer porcaria. Estás nos primórdios.

Há é pessoal que está na sua onda avançada e que não resiste em dar o seu toque. Mesmo quando nem se encaixa no snippet em debate.

Por isso, quando tiveres um código melhor indentado e com validação de dados, coloca o novo código (num novo post).

Sugestão: se a validação de dados falhar, faz o famoso try again. B)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

{Problema:
Ler os lados de um triangulo e determina-lo se é isoscelos,escaleno ou equilatero.}
//David Russo  3/ 1 /2012
//Para uso escolar

program triangulo ;

         var e,d,b :real;

begin
   writeln('Verificacao de propriedades de triangulos');
   repeat
   writeln('Digite o comprimento do lado esquerdo ->');
          readln(e);
   until (e>0);
   repeat
          writeln('Digite o comprimento do lado direito  ->');
   readln(d);
   until (d>0);
   repeat
          writeln('Digite o comprimento da base          ->');
   readln(b);
   until (b>0);

if (e<(d+b)) and (d<(e+b)) and (b<(d+e)) then       //sempre que o se tem mais de duas linhas de condiçao temos de delimitalos com um begin e um end
            if ((e=b) and (d=e)) then
	       write('esses comprimentos formam um triangulo equilatero')
            else  if ((e=b) or (b=d) or (d=e)) then
                     write('Esses comprimentos formam um triangulo isosceles')
            else  if ((e<>b) and (d<>b) and(e<>d)) then // esta linha pode estar omissa   , pois é uma linha subentendida
	      write('Esses comprimentos formam um triangulo escaleno')


      else
 	             writeln('Nao e um triangulo');
                    readln();

end.

Creio que já está validado , experimentei com numeros decimais e negativos :)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    611
thoga31

A tua indentação é que não é, de todo, a melhor. Compara o teu mesmo programa com uma indentação melhor:

program triangulo;

var e,d,b :real;

begin
   writeln('Verificacao de propriedades de triangulos');

   repeat
         write('Digite o comprimento do lado esquerdo ->');
         readln(e);
   until (e>0);

   repeat
         write('Digite o comprimento do lado direito  ->');
         readln(d);
   until (d>0);

   repeat
         write('Digite o comprimento da base          ->');
         readln(b);
   until (b>0);

   if (e<(d+b)) and (d<(e+b)) and (b<(d+e)) then begin
      if ((e=b) and (d=e)) then
         write('Triangulo equilatero')
      else begin
           if ((e=b) or (b=d) or (d=e)) then
              write('Triangulo isosceles')
           else begin
                if ((e<>b) and (d<>b) and(e<>d)) then
                   write('Triangulo escaleno')
           end;
      end;
   end else
       writeln('Nao e um triangulo!');
   readln; // pausa
end.

Acrescento que testei o teu programa sem os Begin-End e com estes. Sem estes, não funcionou bem, apesar de ter compilado. Com estes funcionou bem.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
passarito    56
passarito

Ena... tanta gente a bater no mesmo gajo!!!!

Para quem não percebeu, eu continuo a afirmar que uma boa validação não é para quem está a começar....

Uma boa validação pressupõe duas partes, que os valores introduzidos não abortem o programa e que depois de serem aceites o programa devolva resultados dentro do esperado.

Ora a validação é apenas uma pseudo-validação.

repeat
  write('Digite o comprimento do lado esquerdo ->');
  readln(e);
until (e>0);

darkangel_13, experimenta colocar letras e diz que te acontece...

Na minha opinião, a validação é util sim, mas não numa fase tão inicial.

@Thoga, não sei onde é que viste no meu código tantos e se's, o código essencial é o que está na função, apenas fiz um programa completo para quem o quizesse experimentar, mas ok!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    611
thoga31

@Thoga, não sei onde é que viste no meu código tantos e se's, o código essencial é o que está na função, apenas fiz um programa completo para quem o quizesse experimentar, mas ok!

Não é no código, homem! ;)

Repara:

Se a for numérico inteiro, Integer por exemplo, se inserires 0.5 dá erro;

Se a for numérico real, Real por exemplo, se inserires ABC dá erro;

Se a for texto, String por exemplo, dá erro logo na compilação, o conhecido "Type mismatch";

A validadção é uma coisa muito bonita, mas não é assim tão directa a sua implementação!

Colocaste muitos ses a algo que não tinha ses - em conversa e não no código, acrescento por via das dúvidas.

E a validação para ver se há letras e etc etc é já uma questão para além da académica. A solução que deste e a que eu dei são válidas, sendo a minha mais directa - o val vai falhar conforme o tipo de dados logo à partida - basta alterar Integer para Real, por exemplo -, enquanto que tu tens de acrescentar parâmetros à tua análise. :confused:


Voltando ao cerne do tópico... @darkangel_13, começa a indentar melhor. Que IDE estás a utilizar?

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 a nossa Política de Privacidade