Ir ao conteúdo
  • Cadastre-se

VisualG VisuAlg - Tratamento de erro


Posts recomendados

Saudações gerais.

Minha dúvida ultrapassa os conhecimentos até dos meus mestres, e eu sequer sei como pesquisar isso na internet.

No VisuAlg (leitor de algoritmos em Portugol), eu executo algoritmos, insiro condições matemáticas para impedir erros ou paradoxos em números (como dividir por 0, ou etc.), fiz até um algoritmo irrepreensível, porém estou com um probleminha.

Se eu declaro uma variável do tipo numérica e REAL, e insiro algum caracter inválido, como um espaço ou uma letra, o próprio programa abre uma janela que acusa o erro "Esperava uma variável do tipo REAL", porém eu não quero que essa janela abra, quero controlar esse erro e exibir meu próprio texto, algo do tipo "Impossível continuar. Foram inseridos caractéres inválidos.", como na imagem a seguir:

algortmoinvlido.jpg

(Esse é um algorítmo fictício que eu criei com variáveis caractere só para exemplificar o que eu quero.)

Se quiserem um Algoritmo para inserir os comandos, podem usar esse:

algoritmo "Ferraduras de cavalos por Haras."
// usadas numa haras. Deve ser oferecida a quantidade de cavalos.
// Autor : Edgar Froes Brito Leal
// Data : 24/02/2010
var
   ferr : real
   cav : inteiro
inicio
   escreval ("Descubra a quantidade de ferraduras de um haras inserindo a quantidade de cavalos")
   escreval ("existente nesse haras.")
   escreval
   escreval ("Digite a quantidade de cavalos do háras:")
   leia (cav)
   SE (cav < 0) então
      repita
         Escreval ("Valor inválido. Digite um valor inteiro maior ou igual a zero.")
         leia (cav)
      ate cav >= 0
   FIMSE
   ferr <- (cav * 4)
   escreval
   escreval ("________________________________________________________________")
   escreval ("Esse háras contém",ferr," ferraduras.")
   escreva ("________________________________________________________________")
fimalgoritmo
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 8 anos depois...

@Elton Chagas     creio que o que ele queria é um modo de controlar a entrada de dados do tipo errado , como o programa pedir um número e o usuário digitar uma letra,  e nesse caso  pode ser usada  duas funções juntas para saber se é número ou letra , que são,   asc()  e carac() assim :

leia(dado)
x := asc(carac(dado))    //se digitar letras ou carac especiais ele retorna zero

então esse programa do @Salazar3070  com algumas modificações ficaria assim :

algoritmo "Ferraduras de cavalos por Haras."
// Função : Desenvolver um programa que calcule a quantidade de ferraduras
// usadas numa haras. Deve ser oferecida a quantidade de cavalos.
// Autor : Edgar Froes Brito Leal
// Data : 5/03/2018
var
  ferr : real
  cav,x,p : inteiro
inicio
  escreval("Descubra a quantidade de ferraduras de um haras inserindo")
  escreval("a quantidade de cavalos existente nesse haras .")
  repita
    escreval
    escreval("Digite a quantidade de cavalos do háras, no mínimo hum cavalo : ")
    leia(cav)
    cav := abs(cav)
    x := asc(carac(cav))//se digitar letras ou carac especiais ele retorna zero
    se x = 0 ENTÃO
      escreval("Valor inválido. Digite um valor inteiro maior que zero .")
    fimse
  ate x > 0
  ferr <- (cav * 4)
  escreval
  escreval ("____________________________________________________________")
  escreval ("Esse háras contém",ferr," ferraduras.")
  escreva ("_____________________________________________________________")
fimalgoritmo

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

@devair1010, acho que não será tão simples (especialmente no Visualg, que tem lá as suas limitações...). Veja:

 

Demonstração 1:

teste.jpg

 

 

Demonstração 2:

tela2.jpg

 

 

 

Creio eu que dá para fazer, mas acho que vai ser mais complexo...

 

 

UPDATE:

Esqueci de comentar:

 

Boa noite meu amigo!

    Erro se encontra no "então"

Geralmente esse "erro" ocorre devido as ferramentas ortográficas do site . Veja:

então    <---- eu escrevi sem o ~

*****    <---- isso foi um palavrão

 

Para o Visual 3 pra cima, a dica é usar "ENTÃO"... dessa forma, mesmo com o ~ funciona!! (mais um dos "bugzinhos" do Visualg... vá entender)

 

 

No aguardo.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 5 anos depois...
Em 06/03/2018 às 09:20, Simon Viegas disse:

Olá.

 

@devair1010, acho que não será tão simples (especialmente no Visualg, que tem lá as suas limitações...). Veja:

 

Demonstração 1:

teste.jpg

 

 

Demonstração 2:

tela2.jpg

 

 

 

Creio eu que dá para fazer, mas acho que vai ser mais complexo...

 

 

UPDATE:

Esqueci de comentar:

Geralmente esse "erro" ocorre devido as ferramentas ortográficas do site . Veja:

então    <---- eu escrevi sem o ~

*****    <---- isso foi um palavrão

 

Para o Visual 3 pra cima, a dica é usar "ENTÃO"... dessa forma, mesmo com o ~ funciona!! (mais um dos "bugzinhos" do Visualg... vá entender)

 

 

No aguardo.

 

 

Fiz algumas alterações, entrada como carácter para buscar cód. ASC II, tentei preservar a ideia  do código !

 

Algoritmo "semnome"
// Disciplina  : Linguagem e Lógica de Programação
// Professor  : Eduardo Gouveia
// Descrição  : Aqui você descreve o que o programa faz! (função)
// Autor(a)  : Nome do(a) aluno(a)
// Data atual : 06/05/2023
Var
   ferr : real
   cav,x,p : inteiro
   ent:caractere
Inicio
   escreval("Descubra a quantidade de ferraduras de um haras inserindo")
   escreval("a quantidade de cavalos existente nesse haras .")
   repita
      escreval
      escreval("Digite a quantidade de cavalos do háras, no mínimo hum cavalo : ")
      leia(ent) //Entrada como caractere para pegar o cod ASC II

      x :=asc(ent)

      //cav := abs(cav)
      //x := asc(carac(cav))////se digitar letras ou carac especiais ele retorna zero
      se (x <= 49) E (x >= 57) ENTÃO
         escreval("Valor inválido. Digite um valor inteiro maior que zero .")
         cav <- 0
      senao
         cav <- Caracpnum (ent)
      fimse
   ate cav > 0
   ferr <- (cav * 4)
   escreval
   escreval ("____________________________________________________________")
   escreval ("Esse háras contém",ferr," ferraduras.")
   escreva ("_____________________________________________________________")
Fimalgoritmo

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@EduGouveia, opa!. Vou tentar desmiuçar para tentar enriquecer o tópico.

 

1 hora atrás, EduGouveia disse:

Fiz algumas alterações, entrada como carácter para buscar cód. ASC II, tentei preservar a ideia  do código !

 

O problema geral seria esse:

 

Em 24/02/2010 às 15:05, Salazar3070 disse:

Se eu declaro uma variável do tipo numérica e REAL e insiro algum caractere inválido, como um espaço ou uma letra, o próprio programa abre uma janela que acusa o erro "Esperava uma variável do tipo REAL", porém eu não quero que essa janela abra, quero controlar esse erro e exibir meu próprio texto, algo do tipo "Impossível continuar. Foram inseridos caractéres inválidos."

 

 

Mas daí ainda está com o mesmo problema que citei:

 

Em 06/03/2018 às 09:20, Simon Viegas disse:

Demonstração 1:

teste.jpg

 

Vejam:

image.png

 

 

 

Já matando a charada: se for informado uma cadeia de caractere iniciado com algoritmo, o processamento fica errado!

 

Já adianto também a raiz do problema:

 

Citação

Asc (s : caractere) : Retorna um inteiro com o código ASCII do primeiro caractere da expressão.

Fonte: https://www.apoioinformatica.inf.br/produtos/item/30-as-funcoes-do-visualg-versão-2-0

 

 

A própria definição da função entrega a sua (da função) limitação.

 

Existe soluções. Exemplo:

 

image.png

 

 

 

Mas como na época, deixo em aberto para quem quiser tentar. De preferência só postar a tela, não entregar o código ou o método! 😁

 

 

 

 

 

 

 

 

 

 

 

Adendo 1: imagino que a proposta do @EduGouveia foi justamente propor uma alternativa para o problema. Se eu tivesse dado uma solução, talvez não teríamos essa oportunidade atual. 😉

Adendo 2: ainda complementando/enriquecendo o tópico... @EduGouveia, sobre:

 

2 horas atrás, EduGouveia disse:
      se (x <= 49) E (x >= 57) ENTÃO

 

 

Deveria utilizar uma disjunção, em vez de conjunção. Só inverteu :). Desse forma aí tem uma Contradição (oposto de Tautologia), pois não existe número que atenda as duas expressões ao mesmo tempo.

 

Essa questão é bem curiosa... abaixo complemento mais sobre essa questão...

 

Para outros visitantes: como achar a faixa de códigos que preciso, ou seja, entre 0 a 9?

 

Exemplo:

image.png

 

Eu "sei" que a tabela está em sequência... daí, o dígitos de 0 a 9 vão de 48 a 57. Profissionalmente seria mais sensato testar um a um ou confirmar de alguma forma.

 

 

Por fim, a condição poderia ficar com algo como:

      se (x <= 49) OU (x >= 58) então

 

ou de forma que acho mais elegante:

      se (x < 48) OU (x > 57) então

Seria algo como: "se código está abaixo de 0 ou acima de 9 então". 

 

Só para exemplificar, poderia ser assim tb:

      se não ((x >= 48) E (x <= 57)) então

Seria algo como "se o código não está acima 0 e abaixo de 9 então". 

 

 

 

Adendo 3: "Ue? E por que está funcionado com aquele código"? Duas respostas:

 

[1] não, não tá funcionando, apenas em alguns casos o resultado da execução corresponde ao esperado (BUG!!!), como o caso de letras do alfabeto (está relacionado ao 2); (Lembrando que deve funcionar para todos os casos.)

E [2], como já citado, a expressão é uma contração, ou seja, para qualquer valor de x, "a expressão necessariamente resultará em falso", ou seja, era para não funcionar sempre! Provavelmente ocorre algum erro de gerenciamento de memória do VisualG.

Resumindo: era para nunca entrar no se, mas está entrando para alguns casos. 

 

 

image.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!