Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
KillerSkull_Mk

VisualG Por que estaria dando erro?

Recommended Posts

Postado (editado)

   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

 

Editado por Simon Viegas
Inserir tag CODE
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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.

Editado por Luís Roberto C. da Silva
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

  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"

 

Editado por DiF
inserir o código com o botão CODE <>
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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.

 

Editado por DiF
Simon, só adicionei a tag code nos códigos que estavam na citação.
  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)
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.

 

Editado por Simon Viegas
Remover "resposta" de dentro da citação

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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


 

Editado por DiF
Inserir os códigos com o botão CODE <>
  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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

Editado por Luís Roberto C. da Silva
  • 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






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

×