Ir ao conteúdo
  • Cadastre-se
KillerSkull_Mk

VisualG Por que estaria dando erro?

Recommended Posts

   Galera eu estou criando um algoritmo que teste se o número é maior que 10.
   Ai pensei comigo que até agora os algoritmos que crie no Visualg executam 1 vez.Ai pensei em formas de criar um algoritmo de repetição para repetir o programa e cheguei a um código.
   Na teoria esta perfeito mas o Visualg esta bugado dizendo haver erro de sintaxe nas linhas 17 e 18 mas eu já revisei e não encontrei. 
   Preciso que me ajudem a corrigir este erro, desde já agradeço
C Ó D I G O :

Algoritmo "Número>10?"
Var
   num:inteiro
   x:caractere
Inicio
   repita
      escreval("digite um número:")
      leia(num)
      se num >10 então
         escreval("o valor é maior que 10")
         escreval("repetir programa? não/sim")
         leia(x)
      fimse
      se x<> "não","sim" então
         escreval("!!Respostas invalida!!.Repetir programa? sim/não")
         leia(x)
      fimse
   ate x="nao",x="não",x="Não",x="Nao",x="NAO",x="NÃO"
Fimalgoritmo

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que o problema é esse SE:

se x<> "não","sim" então

Deveria ser:

se (x<>"não") ou (x<>"sim") então

Esse separando com vírgula é utilizado no comando escolha:

escola x
	caso "sim","SIM"
		escreval("continue")
	caso "NAO","NÃO","nao","não"
		escreval("encerre")
fimescolha

Em outro trecho você pede pra ler o x e depois encerra o se:

leia(x)
fimse

Deveria encerrar o se e iniciar a pergunta se quer sair do programa.

Além disso, você não fez nenhum trecho para repetir a pergunta se deseja sair caso persista a resposta inválida. E o melhor é pedir 'n' ou 's' como  resposta para repetir ou sair do programa, economiza código.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

  Muito bem observado obrigado agora eu tive 1 conclusão e algumas  duvida

  A conclusão é que para resolver a repetição da saída "resposta invalida" seria melhor eu usar o (enquanto faça) assim:

   enquanto (x<>s) ou (x<>"n") faca:

       escreval("!Resposta invalida! Repetir programa? s/n")

       leia(x)

       limpatela

   fimenquanto

 

   Minhas duvidas são em relação as  múltiplas condições qual seria a sintaxe, se seria múltiplos parenteses seguido de operadores relacionais como mostrado?: se (condição1)  ou (condição2) ou (codição3) ou seria separados por virgulas? isso varia de linguagem para linguagem?

  E quanto a indentação quantos espaços são necessários nas indentações ? em outras linguagens muda o valor de espaço de indentação para indentação?

 

adicionado 9 minutos depois

simplesmente não compreendo porque da erro se não é erro de sintaxe ele não encontra o faça 

     

enquanto (x<>"n") ou (x<>"s") faca:
         escreva("!!Respostas invalida!!.Repetir programa? s/n")
         leia(x)
         limpatela
      fimenquanto

 

já tentei virgulas parenteses e outras combinações  mas não acerto a sintaxe to ficando frustrado.  

adicionado 36 minutos depois

por algum motivo eu coloquei faca em maiúsculo e deu certo.

  Mas a algo errado no loop pois quando se da a resposta s ou n corretamente ele entra no loop, mas deveria entrar caso fosse diferente(<>) seu comportamento no laço é como se x foce igual a "n" ou "s"

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

1#

6 horas atrás, KillerSkull_Mk disse:

  Muito bem observado obrigado agora eu tive 1 conclusão e algumas  duvida

  A conclusão é que para resolver a repetição da saída "resposta invalida" seria melhor eu usar o (enquanto faça) assim:   


enquanto (x<>s) ou (x<>"n") faca:

       escreval("!Resposta invalida! Repetir programa? s/n")

       leia(x)

       limpatela

   fimenquanto

 

De certo modo sim. Pois o laço de repetição ficará "protegendo" o trecho em si... não precisa repetir do o trecho só porque o usuário informou um valor inválido. Só vai repetir esse pedaço.

 

 

 

2#

6 horas atrás, KillerSkull_Mk disse:

   Minhas duvidas são em relação as  múltiplas condições qual seria a sintaxe, se seria múltiplos parenteses seguido de operadores relacionais como mostrado?: se (condição1)  ou (condição2) ou (codição3) ou seria separados por virgulas? isso varia de linguagem para linguagem?

É relativo... cada linguagem pode ter a sua própria sintaxe... mas de um modo geral, as condição do se, enquanto, repita etc (ou equivalentes nas outras linguagens, como if, while, repeat (ou do/while) etc), são separado por OPERADORES LÓGICOS mesmo, ou seja, algo como:

(<expressão lógica>) <operador lógico> (<expressão lógica>) <operador lógico> (<expressão lógica>)

Assim como , cada expressão lógica pode utilizar Operadores Relacionais... etc etc...

 

No final.. essas estruturas (se, enquanto e repita) precisam ter como retorno um resultado booleano. RESUMINDO: toda essa operação utilizada lá na condição tem que retornar VERDADEIRO (true ou 1) ou FALSO (false ou 0). Você pode montar da forma "que quiser*", se no final retornar VERDADEIRO ou FALSO, tá valendo.

 

Ex.:

se (x<>"não") ENTÃO

A "pergunta" desse se vai retornar "VERDADEIRO" ou "FALSO"? Vai!.

Se VERDADEIRO, o se executa o que está dentro dele. Caso seja FALSO, não executa. Pula para próxima instrução após a estrutura do se...

 

Já lá no escolha/caso, como citado por @Luís Roberto C. da Silva, este tem a sua própria sintaxe, ou seja, não segue "esse padrão citado acima". A estrutura é diferente. Este separa cada "possibilidade" por uma ",". Poderia ser por exemplo:

//exemplo de utilização errada do escolha/caso
escolha x
  caso "sim" or "SIM"
     escreval("continue")
  caso "NAO" or "NÃO" or "nao" or"não"
     escreval("encerre")
fimescolha

Mas não... o "criador" da linguagem quis usar ",". Tem que seguir como é definido...

 

 

 

RESUMINDO:

Você precisará usar de modo que esteja de acordo acordo com a sintaxe do linguagem.

 

 

 

3#

Sobre:

6 horas atrás, KillerSkull_Mk disse:
adicionado 9 minutos depois

simplesmente não compreendo porque da erro se não é erro de sintaxe ele não encontra o faça 

   


  enquanto (x<>"n") ou (x<>"s") faca:
         escreva("!!Respostas invalida!!.Repetir programa? s/n")
         leia(x)
         limpatela
      fimenquanto

 

já tentei virgulas parenteses e outras combinações  mas não acerto a sintaxe to ficando frustrado.  

adicionado 36 minutos depois

por algum motivo eu coloquei faca em maiúsculo e deu certo.

  Mas a algo errado no loop pois quando se da a resposta s ou n corretamente ele entra no loop, mas deveria entrar caso fosse diferente(<>) seu comportamento no laço é como se x foce igual a "n" ou "s"

O ideal seria ter postado o código atual completo, para analisarmos o trecho em específico... mas acho que seria o seguinte, veja:

 

6 horas atrás, KillerSkull_Mk disse:

enquanto (x<>"n") ou (x<>"s") faca:

obs.: Na sintaxe não existe esse ":" ai depois do faca.

 

 

Vamos analisar a expressão:

 

Supondo temos x="g", então equivale a:

enquanto ("g"<>"n") ou ("g"<>"s")

logo resultando:

enquanto (VERDADEIRO) ou (VERDADEIRO)

O que resulta em "VERDADEIRO OU VERDADEIRO"? (vide tabela verdade. obs.: ou = disjunção) A resposta é: VERDADEIRO, logo o enquanto vai iniciar (ou continuar repetindo). Tá certo "g" entrar no enquanto? SIM.

 

Agora vamos testar o tal de x="n".

enquanto ("n"<>"n") ou ("g"<>"s")

logo resultando:

enquanto (VERDADEIRO) ou (FALSO)

O que resulta em "VERDADEIRO OU FALSO"? A resposta é: VERDADEIRO também (vide tabela verdade)!!!, logo o enquanto vai iniciar (ou continuar repetindo). Tá certo "n" entrar no enquanto? NÃO, então o que está errado é a "EXPRESSÃO". :D

 

Após análises, veria que o correto é utilizar o operador "e" (conjunção)  (em vez do "ou" (disjunção)). Fincando:

enquanto (x<>"n") e (x<>"s") faca

Ou seja, "'x' tem que ser diferente de "n" E 'x' tem que ser diferente de "s"".

 

 

 

***

 

Então, para facilitar, poste o seu código completo e onde está com dúvida. Acho que utilizando ele fica mais fácil para (tentar) explicar item a item.

 

No aguardo.

 

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites
7 horas atrás, KillerSkull_Mk disse:

enquanto (x<>s) ou (x<>"n") faca:

 

Então, desse jeito nunca vai sair do laço, olha a lógica:

Se digitar 'n', que é diferente de 's', não passa;

Se digitar 's', que é diferente de 'n', não passa;

Se digitar qualquer coisa diferente de 's' ou 'n', não passa, ou seja, 'n' também é diferente de 's' e vice-versa.

Como já foi dito, terá que colocar:

enquanto (x<>'s') e (x<>'n') faca

Para que somente os valores diferentes de 's' e de 'n' sejam inválidos.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum entendi muito obrigado. vocês não sabem a alegria que eu to aqui, agora graças a Deus que colocou vocês dois para poder me ajudar a corrigir meu código. :D^_^:lol::)

   Para min é um marco gigantesco poder imaginar que eu consegue criar sozinho uma estrutura que repetisse todo o algoritmo é claro com a ajuda de vocês para me ajudar a mostrar onde errei.   

 Como solicitado por  Simon Viegas vou postar o Código e já corrigido, Luis Roberto você me ajudou bastante também me mostrando essa nova estrutura "escolha". só para ver se aprendi essa estrutura tem a seguinte estrutura confere?

escolha <variavel> 

caso (condição)

      instrução

caso (condição)

     instrução

fimescolha

  Me lembra muito a estrutura "Se".

  Só uma ultima pequena duvida ainda não respondida.:D

Quantos espaços são necessários para indentação ?

e em questão de bons hábitos de programar mais assim para o lado de sintaxe vocês podem me sugerir algumas ?

 

Muito obrigado pelas explicações e correções ao meu código Galera :lol:

 

 

adicionado 0 minutos depois

Quase me esqueço o Código:

Algoritmo "Número>10?"

Var
   // Seção de Declarações das variáveis
   num:inteiro
   x:caractere
Inicio
   // Seção de Comandos, procedimento, funções, operadores, etc...
   repita
      escreval("digite um número:")
      leia(num)
      se num >10 ENTÃO
         escreval("o valor é maior que 10")
         escreval("repetir programa? n/s")
         leia(x)
         limpatela
      fimse
      enquanto (x<>"n")e(x<>"s") FACA
         escreval("!!Respostas invalida!!.Repetir programa? s/n")
         leia(x)
         limpatela
      fimenquanto
   ate x="n"

Fimalgoritmo


 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ótimo, fico feliz em ajudar, programação é uma arte.

 

A estrutura escolha está correta, mas pode indentar a instrução 'caso':

escolha <variavel> 
   caso (condição)
      instrução
   caso (condição)
      instrução
fimescolha

Quanto a indentação, costumo colocar três espaços, fica mais elegante.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @KillerSkull_Mk.

 

1#

18 horas atrás, KillerSkull_Mk disse:

Quantos espaços são necessários para indentação ?

Sugiro usar o "padrão" do Visualg, que são 3 colunas.

 

Para "auto-indentar", basta pressionar Ctrl+G".

 

 

 

2#

Ainda sobre a indentação, pode usar o "tab" para inserir os "3 espaços", mas antes é necessário efetuar uma pequena configuração para desabilitar a "tabulação inteligente". Vide animação:

Desativar tabulação inteligente.gif

 

 

 

 

3#

Eu uso o CTRL+G com base para indentação... Ela não é perfeita para mim, ou não fica exatamente como desejo, mas já adianta bastante... eu particularmente não indento entre inicio e fimAlgotimo e faço outros "ajustes" também. Seu código ficaria assim:

algoritmo "Número>10?" //utilizo basicamente o "comandos" todo em minúsculo
var
   num:inteiro
   x  :caractere //costumo alinhar os tipos...
inicio
//seleciono todo texto até antes do fimAlgoritmo e dou um "CTRL+TAB" ai o dente
//anda pra trás
repita
   escreval("Digite um número:") //iniciar a frase com letra maiúsculla
   leia(num)
   se (num >10) ENTÃO //n é necessário, + pode ser interessante deixar entre ()
      escreval("O valor é maior que 10")//aqui tb iniciar com maiúsculo
      escreval("Repetir programa? n/s") //aqui tb iniciar com maiúsculo
      leia(x)
      limpaTela //quando tem "duas palavras", acho interessante deixa da segunda
                //em diante maiúscula
   fimse
   enquanto (x<>"n") e (x<>"s") FACA //geralmente deixo os comando juntos, mas
                                     //dou um espaço entre o operador lógico
      escreval("!!Resposta invalida!!. Repetir programa? s/n") //espaçamento
                                                               //após pontuação
      leia(x)
      limpaTela
   fimEnquanto
ate (x="n")
fimAlgoritmo

Por ai vai.

 

De um modo geral, o "seu padrão" vai surgindo aos pouco... e pode variar um pouco a depender do contexto.. o importante que mantenha uma coerência... a indentação tem que fazer sentido.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado novamente, Eu perguntei isso porque tipo não sei ao certo se existe um consenso comum de bons hábitos para escrever códigos a unica coisa que sei a respeito é de comentar códigos, mas como não estou apresentando a ninguém mesmo então estou estudando por conta própria então to  um pouco mais desleixado quanto a isso, Peço ao moderador que já pode fechar o tópico 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×