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:  
viniciusv21

VisualG Exercício Visual G - Criança Esperança

Recommended Posts

Olá pessoal, tudo beleza?

Alguém pode dar uma lida no meu código para ver como está?

Agradeço desde já =D

 

algoritmo "Criança Esperança"
var
   N, Valor, Confirmar: inteiro
inicio
      EscrevaL("-----------------------")
      EscrevaL("   CRIANÇA ESPERANÇA   ")
      EscrevaL("-----------------------")
      EscrevaL()
      EscrevaL(" Muito obrigado por participar")
      EscrevaL()
      EscrevaL(" Para doar 15 reais, pressione [1]")
      EscrevaL(" Para doar 20 reais, pressione [2]")
      EscrevaL(" Para doar 30 reais, pressione [3]")
      EscrevaL(" Para doar 40 reais, pressione [4]")
      EscrevaL(" Para doar outros valores, pressione [5]")
      EscrevaL(" Para cancelar, pressione [6]")
      EscrevaL()
      Escreva(" Pressione a opção desejada: ")
      Leia(N)
      Escolha N
              Caso 1
                   Valor := 15
              Caso 2
                   Valor := 20
              Caso 3
                   Valor := 30
              Caso 4
                   Valor := 40
              Caso 5
                   Escreva(" Por favor, digite a quantia que deseja doar:")
                   Leia(Valor)
              Caso 6
                   Valor := 0
      FimEscolha
      Se N <> 6 então
         Enquanto (Confirmar <> 1) e (Confirmar <> 2) faca
            EscrevaL(" [1] Confirma a doação no valor de R$", Valor:3:2)
            EscrevaL(" [2] Cancela a doação")
            Leia(Confirmar)
               Se Confirmar = 1 então
                  EscrevaL(" Você doou R$", Valor, ",00.")
                  Escreva(" Obrigado pela participação!")
               Senao
                    Se Confirmar = 2 então
                       EscrevaL(" Você cancelou a participação. Valor doado: R$0,00.")
                    Senao
                         EscrevaL("Opção inválida")
                    Fimse
               Fimse
         FimEnquanto
      Senao
           EscrevaL(" Você cancelou a participação. Valor doado: R$0,00.")
      Fimse
fimalgoritmo

 

Editado por Simon Viegas
Alterar tipo de CODE para "C Languages"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @viniciusv21.

 

De um modo geral seu código está bom!

 

Mas veja... vai depender do que foi proposto para ser feito..  um algoritmo (passo para resolver um problema) está sempre associado ao problema em si... fazendo uma analogia exagerada, seria como se pedisse um cachorro quente e você entregasse um delicioso hambúrguer, ou seja, pode está bem feito, mas não foi o que foi solicitado.

 

 

Analisando apenas o código em si (sem entrar no contexto dele), sugiro esses pontos:

 

1- O case 6 não é necessário, apenas retire-o;

2- No cancelamento, não sei se é interessante deixar que "dou R$0,00", ou seja, na verdade não foi feito doação alguma. Cancelar é uma coisa. Doar R$0,00 é outra. Entende?

3- Para o menu principal, o programa só está tratando os números de 1 a 6.. ao inserir um número diferente destes, está sendo solicitado a confirmação da doação (não deveria, é análogo ao item 2)

 

 

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • 11 horas atrás, Simon Viegas disse:

    Olá @viniciusv21.

     

    De um modo geral seu código está bom!

     

    Mas veja... vai depender do que foi proposto para ser feito..  um algoritmo (passo para resolver um problema) está sempre associado ao problema em si... fazendo uma analogia exagerada, seria como se pedisse um cachorro quente e você entregasse um delicioso hambúrguer, ou seja, pode está bem feito, mas não foi o que foi solicitado.

     

     

    Analisando apenas o código em si (sem entrar no contexto dele), sugiro esses pontos:

     

    1- O case 6 não é necessário, apenas retire-o;

    2- No cancelamento, não sei se é interessante deixar que "dou R$0,00", ou seja, na verdade não foi feito doação alguma. Cancelar é uma coisa. Doar R$0,00 é outra. Entende?

    3- Para o menu principal, o programa só está tratando os números de 1 a 6.. ao inserir um número diferente destes, está sendo solicitado a confirmação da doação (não deveria, é análogo ao item 2)

     

     

    No aguardo.

     

    Olá Simon, tudo bem?

     

    O que foi pedido foi bem simples, mas eu quis pensar em todas as situações possíveis que o usuário digitasse.

    O gabarito é assim, do site CursoemVideo.com (...)

     

    algoritmo "CriancaEsperanca"
    var
       D : Inteiro
       Valor: Real
    inicio
          EscrevaL ("---------------------------")
          EscrevaL ("     CRIANCA ESPERANCA     ")
          EscrevaL ("---------------------------")
          Escreval (" Muito obrigado por ajudar ")
          Escreval (" [1] para doar R$10 ")
          Escreval (" [2] para doar R$25 ")
          Escreval (" [3] para doar R$50 ")
          Escreval (" [4] para doar outros valores ")
          Escreval (" [5] para cancelar ")
          Leia (D)
          Escolha D
             Caso 1
                  Valor <- 10
             Caso 2
                  Valor <- 25
             Caso 3
                  Valor <- 50
             Caso 4
                  Escreva ("Qual o valor da doacao? R$")
                  Leia (Valor)
             Caso 5
                  Valor <- 0
          FimEscolha
          Escreval ("------------------------")
          Escreval (" SUA DOACAO FOI DE R$", Valor)
          Escreval (" MUITO OBRIGADO!")
          Escreval ("------------------------")
    fimalgoritmo

    (...) mas eu pensei em praticar o que eu já tinha aprendido e colocar o máximo de coisas juntas. Hoje eu tentei refazer utilizando procedimento, (...)

    Algoritmo "Criança Esperança"
    //-----------------------------------
    procedimento opções()
    var
    inicio
       EscrevaL(" Para doar 15 reais, pressione [1]")
       EscrevaL(" Para doar 20 reais, pressione [2]")
       EscrevaL(" Para doar 30 reais, pressione [3]")
       EscrevaL(" Para doar 40 reais, pressione [4]")
       EscrevaL(" Para doar outros valores, pressione [5]")
       EscrevaL(" Para cancelar, pressione [6]")
       EscrevaL()
       Escreva(" Pressione a opção desejada: ")
       escolher_opcao()
    fimprocedimento
    //-----------------------------------
    procedimento escolher_opcao()
    var
    inicio
       Leia(N)
       Escolha N
          Caso 1
             Valor := 15
          Caso 2
             Valor := 25
          Caso 3
             Valor := 30
          Caso 4
             Valor := 40
          Caso 5
             Escreva(" Por favor, digite a quantia que deseja doar:")
             Leia(Valor)
          Caso 6
             Valor := 0
          OutroCaso
             opcaoinvalida()
    fimprocedimento
    //-----------------------------------
    procedimento confirmacao()
    var
    inicio
       EscrevaL(" [1] Confirma a doação no valor de R$", Valor:3:2, "?")
       EscrevaL(" [2] Cancela a doação")
          Leia(N)
             Escolha N
                Caso 1
                   EscrevaL(" Você doou R$", Valor, ",00.")
                   EscrevaL(" Obrigado pela participação!")
                Caso 2
                   cancelamento()
                OutroCaso
                   opcao_invalida()
             FimEscolha
    fimprocedimento
    //-----------------------------------
    procedimento cancelamento()
    var
    inicio
       EscrevaL(" Você cancelou a participação.")
    fimprocedimento
    //-----------------------------------
    procedimento opcao_invalida()
    var
    inicio
       EscrevaL(" Opção inválida.")
       EscrevaL(" [1] Voltar ao menu principal")
       EscrevaL(" [2] Cancelar doação")
       EscrevaL(" Escolha uma opção: ")
       Leia(N)
       Escolha N
          Caso 1
             opções()
          Caso 2
             cancelamento()
          Outrocaso
             opcao_invalida()
       FimEscolha
    fimprocedimento
    //-----------------------------------
    var
       N, Valor : inteiro
    inicio
       EscrevaL("-----------------------")
       EscrevaL("   CRIANÇA ESPERANÇA   ")
       EscrevaL("-----------------------")
       EscrevaL()
       opções()
          Escolha N
             Caso 1, 2, 3 , 4 , 5
                confirmacao()
             Caso 6
                cancelamento()
             OutroCaso
                opcao_invalida()
          FimEscolha
    Fimalgoritmo

     (...) mas não sei o que fiz de errado. O VisualG me deu a mensagem: "O fim do algoritmo foi encontrado inesperadamente" e "Linha 98: Esperava encontrar FIMALGORITMO"

     

    Abraços

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Olá @viniciusv21.

     

    1) SOBRE AS SUGESTÕES ANTERIORES

    17 horas atrás, viniciusv21 disse:

    O gabarito é assim, do site CursoemVideo.com (...)

     

    As mesmas dicas estão valendo.

     

     

     

    2) ERROS DE SINTAXES

    17 horas atrás, viniciusv21 disse:

    (...) mas não sei o que fiz de errado. O VisualG me deu a mensagem: "O fim do algoritmo foi encontrado inesperadamente" e "Linha 98: Esperava encontrar FIMALGORITMO"

     

    Vou tentar ajudar você achar os possíveis erros. A dica é simples:

    - Tire toda indentação do código. (selecione todo o texto, e vá pressionando "shift+tab" até o código ficar totalmente alinhado a esquerda);

    - Desabilite a "Tabulação inteligente":
    Desativar tabulação inteligente.gif

    - Reindente seu código revisando cada estrutura...

    - Pronto, no meio do caminho vai encontrar o(s) erro(s).

     

     

     

    3) ERROS DE ESTRUTURA

    17 horas atrás, viniciusv21 disse:

    Hoje eu tentei refazer utilizando procedimento, (...)

    Está legal... organiza mais o código, mas tem um pequeno problema:


    Resumidamente seria: uma função não pode chamar uma outra função que já está aberta! Mas vou deixar essa questão para depois... primeiro encontre o erro citado acima.

     

     

     

    No aguardo.

     

     

    Editado por Simon Viegas
    O item 3 estava como 2... apenas atualizei

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Opa, beleza? Achei o erro. Estava faltando Enquanto

    Mas eu acho que assim ficou mais fácil de entender:

    Só que acho que ainda está um pouco confuso. Teria um jeito mais claro de fazer esse código?

    Abraços

    Algoritmo "Criança Esperança"
    //-----------------------------------
    procedimento confirmacao()
    var
    inicio
       EscrevaL("[1] Confirma a doação no valor de R$", Valor:3:2, "?")
       EscrevaL("[2] Cancela a doação")
       Leia(N)
       Se N = 1 então
          EscrevaL(" Você doou R$", Valor, ",00.")
          EscrevaL(" Obrigado pela participação!")
          a <- VERDADEIRO
       Senao
          Se N = 2 então
             cancelamento()
          Senao
             opcao_invalida()
          Fimse
       Fimse
    fimprocedimento
    //-----------------------------------
    procedimento cancelamento()
    var
    inicio
       EscrevaL(" Você cancelou a participação.")
       a <- VERDADEIRO
    fimprocedimento
    //-----------------------------------
    procedimento opcao_invalida()
    var
    inicio
       EscrevaL(" Opção inválida.")
       EscrevaL(" [1] Voltar ao menu principal")
       EscrevaL(" [2] Cancelar doação")
       EscrevaL(" Escolha uma opção: ")
       Leia(N)
       Escolha N
          Caso 1
             a <- FALSO
          Caso 2
             cancelamento()
          Outrocaso
             opcao_invalida()
       FimEscolha
    fimprocedimento
    //-----------------------------------
    var
       N, Valor : inteiro
       a: logico
    inicio
       EscrevaL("-----------------------")
       EscrevaL("   CRIANÇA ESPERANÇA   ")
       EscrevaL("-----------------------")
       Enquanto a = FALSO faca
          EscrevaL(" Para doar 15 reais, pressione [1]")
          EscrevaL(" Para doar 20 reais, pressione [2]")
          EscrevaL(" Para doar 30 reais, pressione [3]")
          EscrevaL(" Para doar 40 reais, pressione [4]")
          EscrevaL(" Para doar outros valores, pressione [5]")
          EscrevaL(" Para cancelar, pressione [6]")
          EscrevaL()
          Escreva(" Pressione a opção desejada: ")
          Leia(N)
          Escolha N
             Caso 1
                Valor := 15
                confirmacao()
             Caso 2
                Valor := 20
                confirmacao()
             Caso 3
                Valor := 30
                confirmacao()
             Caso 4
                Valor := 40
                confirmacao()
             Caso 5
                Escreva(" Por favor, digite a quantia que deseja doar:")
                Leia(Valor)
                confirmacao()
             Caso 6
                cancelamento()
             OutroCaso
                opcao_invalida()
          FimEscolha
       FimEnquanto
    Fimalgoritmo

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Olá.

     

    1 hora atrás, viniciusv21 disse:

    Opa, beleza? Achei o erro. Estava faltando Enquanto

    Não, não foi isso. O enquanto apenas adicionou uma nova funcionalidade de repetição. Uma coisa não tem a ver com a outra. Imagine a situação: "o cliente leva o carro para oficina, diz que está com um barulho na roda... ai diz que resolveu ao instalar um ar condicionado e fazer outras alterações no carro".

     

    Sugiro que revive novamente o seu código e descubra o real erro. Só após, faça modificações... (no processo ganhará experiência).

     

     

     

    1 hora atrás, viniciusv21 disse:

    Mas eu acho que assim ficou mais fácil de entender:

    Assim como? utilizando enquanto?

     

     

     

    1 hora atrás, viniciusv21 disse:

    Só que acho que ainda está um pouco confuso.

    Peraê... está mais fácil ou tá mais confuso? :confused:

     

     

     

    1 hora atrás, viniciusv21 disse:

    Teria um jeito mais claro de fazer esse código?

    Existem infinitas formas de fazer um código.. tudo vai depender primeiramente da necessidade (requisitos) e da criatividade (melhorias, adaptações etc)

     

    Primeiramente precisa resolver a questão do erro anterior (item 2 da postagem anterior). Não dar para ir atropelando as etapas. Ache o erro e tente resolver (sem alterar o código ainda), pois o erro pode influenciar nas novas alterações. Posta aqui o código corrigido...

     

    Depois, começa a ver as melhorias... aí já se atentando no item 3... "uma função não pode chamar uma outra função que já está aberta", veja, no seu novo código, a função opcao_invalida() está chamando novamente a função opcao_invalida(). Não pode! Isso (uma função chamar a se mesma) tem até nome: recursividade! mas que só é usada para contextos específicos...

    RESUMINDO:

    Primeiro ache o erro e corrija. Depois vemos as modificações.

     

     

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 1 hora atrás, Simon Viegas disse:

    Olá.

     

    Não, não foi isso. O enquanto apenas adicionou uma nova funcionalidade de repetição. Uma coisa não tem a ver com a outra. Imagine a situação: "o cliente leva o carro para oficina, diz que está com um barulho na roda... ai diz que resolveu ao instalar um ar condicionado e fazer outras alterações no carro".

    Quis dizer que faltou o FimEscolha.

    Esse é código corrigido sem modificação:

    Algoritmo "Criança Esperança"
    //-----------------------------------
    procedimento opções()
    var
    inicio
       EscrevaL(" Para doar 15 reais, pressione [1]")
       EscrevaL(" Para doar 20 reais, pressione [2]")
       EscrevaL(" Para doar 30 reais, pressione [3]")
       EscrevaL(" Para doar 40 reais, pressione [4]")
       EscrevaL(" Para doar outros valores, pressione [5]")
       EscrevaL(" Para cancelar, pressione [6]")
       EscrevaL()
       Escreva(" Pressione a opção desejada: ")
       escolher_opcao()
    fimprocedimento
    //-----------------------------------
    procedimento escolher_opcao()
    var
    inicio
       Leia(N)
       Escolha N
          Caso 1
             Valor := 15
          Caso 2
             Valor := 25
          Caso 3
             Valor := 30
          Caso 4
             Valor := 40
          Caso 5
             Escreva(" Por favor, digite a quantia que deseja doar:")
             Leia(Valor)
          Caso 6
             Valor := 0
          OutroCaso
             opcao_invalida()
       FimEscolha
    fimprocedimento
    //-----------------------------------
    procedimento confirmacao()
    var
    inicio
       EscrevaL(" [1] Confirma a doação no valor de R$", Valor:3:2, "?")
       EscrevaL(" [2] Cancela a doação")
       Leia(N)
       Escolha N
          Caso 1
             EscrevaL(" Você doou R$", Valor, ",00.")
             EscrevaL(" Obrigado pela participação!")
          Caso 2
             cancelamento()
          OutroCaso
             opcao_invalida()
       FimEscolha
    fimprocedimento
    //-----------------------------------
    procedimento cancelamento()
    var
    inicio
       EscrevaL(" Você cancelou a participação.")
    fimprocedimento
    //-----------------------------------
    procedimento opcao_invalida()
    var
    inicio
       EscrevaL(" Opção inválida.")
       EscrevaL(" [1] Voltar ao menu principal")
       EscrevaL(" [2] Cancelar doação")
       EscrevaL(" Escolha uma opção: ")
       Leia(N)
       Escolha N
          Caso 1
             opções()
          Caso 2
             cancelamento()
          Outrocaso
             opcao_invalida()
       FimEscolha
    fimprocedimento
    //-----------------------------------
    var
    N, Valor : inteiro
    inicio
       EscrevaL("-----------------------")
       EscrevaL("   CRIANÇA ESPERANÇA   ")
       EscrevaL("-----------------------")
       EscrevaL()
       opções()
       Escolha N
          Caso 1, 2, 3 , 4 , 5
             confirmacao()
          Caso 6
             cancelamento()
          OutroCaso
             opcao_invalida()
       FimEscolha
    Fimalgoritmo

     

    1 hora atrás, Simon Viegas disse:

    .Depois, começa a ver as melhorias... aí já se atentando no item 3... "uma função não pode chamar uma outra função que já está aberta", veja, no seu novo código, a função opcao_invalida() está chamando novamente a função opcao_invalida(). Não pode! Isso (uma função chamar a se mesma) tem até nome: recursividade! mas que só é usada para contextos específicos..

    Por que não posso usar recursividade nesse caso?

    Editado por viniciusv21
    erro

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    17 horas atrás, viniciusv21 disse:

    Quis dizer que faltou o FimEscolha.

    Beleza!!! Creio que era que era só isso mesmo. :)

     

     

    17 horas atrás, viniciusv21 disse:

    Por que não posso usar recursividade nesse caso?

    Creio que primeiro por que,  provavelmente, você ainda não "chegou" nesse tema (senão já tinha entendido)..., ou seja, não é nada de outro mundo, mas é relativamente um conceito mais avançado. O ponto é que recursividade geralmente é utilizada para outros fins... o que não inclui o seu contexto. Seria como dizer que "está utilizando um recurso erroneamente ou por engano"... e este "engano" tem custos! Mesmo que o código funcione  (apresente um resultado como deseja), seria um erro de lógica (quebrando as técnicas de programação).

     

    Você está utilizando da recursividade para fins apenas de repetição... e a recursividade não serve para isso.. se quer repetir, utilize repita/ate ou enquanto/fimenquanto.

     

    Caso tenha interesse, dê uma pesquisada no Google com os termos "recursividade no visualg". Mas se atente que não tem nada a ver com o seu código...

     

     

    ***

     

    Para demonstrar o que acontece, abaixo inseri algumas linhas no código para exibir quando ENTRA e quando SAI de um procedimento. Experimente inserir no menu principal a opção 8 umas 20 vezes (fique apertando 8 e ENTER várias vezes, quanto mais erro, mais claro fica)... depois volte para o menu principal e faça uma doação. Veja o que acontece.

    Algoritmo "Criança Esperança"
    //-----------------------------------
    procedimento opcao()
       inicio
       EscrevaL("Entrou em OPCAO()")
       EscrevaL(" Para doar 15 reais, pressione [1]")
       EscrevaL(" Para doar 20 reais, pressione [2]")
       EscrevaL(" Para doar 30 reais, pressione [3]")
       EscrevaL(" Para doar 40 reais, pressione [4]")
       EscrevaL(" Para doar outros valores, pressione [5]")
       EscrevaL(" Para cancelar, pressione [6]")
       EscrevaL()
       Escreva (" Pressione a opção desejada: ")
       EscrevaL("SAIU de OPCAO()")
       escolher_opcao()
       EscrevaL("VOLTOU para OPCAO()")
       EscrevaL("FINALIZOU de OPCAO()")
    fimprocedimento
    
    //-----------------------------------
    procedimento escolher_opcao()
       inicio
       EscrevaL("Entrou em ESCOLHER_OPCAO()")
       Leia(N)
       Escolha N
          Caso 1
             Valor := 15
          Caso 2
             Valor := 25
          Caso 3
             Valor := 30
          Caso 4
             Valor := 40
          Caso 5
             Escreva(" Por favor, digite a quantia que deseja doar:")
             Leia(Valor)
          Caso 6
             Valor := 0
          OutroCaso
             EscrevaL("SAIU de ESCOLHER_OPCAO()")
             opcao_invalida()
             EscrevaL("VOLTOU para ESCOLHER_OPCAO()")
       FimEscolha
       EscrevaL("FINALIZOU de ESCOLHER_OPCAO()")
    fimprocedimento
    
    //-----------------------------------
    procedimento confirmacao()
       inicio
       EscrevaL("Entrou em CONFIRMACAO()")
       EscrevaL(" [1] Confirma a doação no valor de R$", Valor:3:2, "?")
       EscrevaL(" [2] Cancela a doação")
       Leia(N)
       Escolha N
          Caso 1
             EscrevaL(" Você doou R$", Valor, ",00.")
             EscrevaL(" Obrigado pela participação!")
          Caso 2
             cancelamento()
          OutroCaso
             EscrevaL("SAIU de CONFIRMACAO()")
             opcao_invalida()
             EscrevaL("VOLTOU para CONFIRMACAO()")
       FimEscolha
       EscrevaL("FINALIZOU de CONFIRMACAO()")
    fimprocedimento
    
    //-----------------------------------
    procedimento cancelamento()
       inicio
       EscrevaL("Entrou em CANCELAMENTO()")
       EscrevaL(" Você cancelou a participação.")
       EscrevaL("FINALIZOU de CANCELAMENTO()")
    fimprocedimento
    //-----------------------------------
    procedimento opcao_invalida()
       inicio
       EscrevaL("Entrou em OPCAO_INVALIDA()")
       EscrevaL(" Opção inválida.")
       EscrevaL(" [1] Voltar ao menu principal")
       EscrevaL(" [2] Cancelar doação")
       EscrevaL(" Escolha uma opção: ")
       Leia(N)
       Escolha N
          Caso 1
             opcao()
          Caso 2
             cancelamento()
          Outrocaso
             EscrevaL("SAIU de OPCAO_INVALIDA()")
             opcao_invalida()
             EscrevaL("VOLTOU para OPCAO_INVALIDA()")
       FimEscolha
       EscrevaL("FINALIZOU de OPCAO_INVALIDA()")
    fimprocedimento
    //-----------------------------------
    var
    N, Valor : inteiro
    inicio
       EscrevaL("-----------------------")
       EscrevaL("   CRIANÇA ESPERANÇA   ")
       EscrevaL("-----------------------")
       EscrevaL()
       opcao()
       Escolha N
          Caso 1, 2, 3 , 4 , 5
             confirmacao()
          Caso 6
             cancelamento()
          OutroCaso
             opcao_invalida()
       FimEscolha
    Fimalgoritmo

     

    Veja que cada vez que você entra em "recursividade", o procedimento anterior fica aberto, aguardando finalizar o atual...

     

    Em fim... se seu objetivo é confirmar a opção, você poderia ficar repetindo até que utilize uma opção válida. Utilizando o comando "repita/ate". O que não pode é chamar um procedimento que já está aberto...

     

     

     

    MINHA SUGESTÃO

    Pegue o gabarito e faça alterações SEM UTILIZAR procedimentos, ou seja, inserir o conceito de "Confirmação", "Cancelamento" e "Opção inválida" utilizando laços de repetições (repita ou enquanto). Só depois tente encontrar o que pode ser colocado como procedimento. Por exemplo, abaixo peguei o gabarito e apenas substitui partes por procedimentos.

    algoritmo "CriancaEsperanca"
    var
       D : Inteiro
       Valor: Real
    
    procedimento MenuOpcoes()
    inicio
       EscrevaL ("---------------------------")
       EscrevaL ("     CRIANCA ESPERANCA     ")
       EscrevaL ("---------------------------")
       Escreval (" Muito obrigado por ajudar ")
       Escreval (" [1] para doar R$10 ")
       Escreval (" [2] para doar R$25 ")
       Escreval (" [3] para doar R$50 ")
       Escreval (" [4] para doar outros valores ")
       Escreval (" [5] para cancelar ")
    fimprocedimento
    
    procedimento lerOpcao()
    inicio
       leia(D)
    fimprocedimento
    
    procedimento processamento()
    inicio
       Escolha D
          Caso 1
             Valor <- 10
          Caso 2
             Valor <- 25
          Caso 3
             Valor <- 50
          Caso 4
             Escreva ("Qual o valor da doacao? R$")
             Leia (Valor)
          Caso 5
             Valor <- 0
       FimEscolha
       Escreval ("------------------------")
       Escreval (" SUA DOACAO FOI DE R$", Valor)
       Escreval (" MUITO OBRIGADO!")
       Escreval ("------------------------")
    fimprocedimento
    
    inicio
    menuOpcoes()
    lerOpcao()
    processamento()
    fimalgoritmo

     

    Deu para pegar a ideia? os procedimento estão servindo basicamente para organizar o código (algo que já estava pronto)... esqueça os procedimentos por enquanto... estará mais atrapalhando que ajudando!

     

    Mais pra frente, quanto tiver mais experiência e entender melhor o funcionamento dos procedimento e funções, já daria para ir pensando na construção do algoritmo utilizando eles.... da forma como você planejou os procedimentos anteriormente, não servirá, pois está quebrando uns princípios, como foi o caso do uso da recursividade de modo "errado".

     

    Apenas faça as melhorias como se não existissem procedimentos!

     

    No aguardo.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Eu rodei o programa e consegui ver o erro. Entendi agora, não dá para colocar para abrir um procedimento que está aberto porque ele vai ter que finalizar várias vezes. Acho que entendi mais ou menos.

     

    Em 16/10/2017 às 11:09, Simon Viegas disse:

     

    MINHA SUGESTÃO

    Pegue o gabarito e faça alterações SEM UTILIZAR procedimentos, ou seja, inserir o conceito de "Confirmação", "Cancelamento" e "Opção inválida" utilizando laços de repetições (repita ou enquanto). Só depois tente encontrar o que pode ser colocado como procedimento. Por exemplo, abaixo peguei o gabarito e apenas substitui partes por procedimentos.

     

     

    Eu usei procedimento de novo , mas dessa vez só para organizar mesmo, aí não dá problemas rs.

     

    Algoritmo "Criança Esperança"
    //-----------------------------------
    procedimento menu_principal()
    var
    inicio
       EscrevaL(" Para doar 15 reais, pressione [1]")
       EscrevaL(" Para doar 20 reais, pressione [2]")
       EscrevaL(" Para doar 30 reais, pressione [3]")
       EscrevaL(" Para doar 40 reais, pressione [4]")
       EscrevaL(" Para doar outros valores, pressione [5]")
       EscrevaL(" Para cancelar, pressione [6]")
       EscrevaL()
       Escreva(" Pressione a opção desejada: ")
    fimprocedimento
    //-----------------------------------
    procedimento msg_voce_doou()
    var
    inicio
       EscrevaL(" Você doou R$", Valor, ",00.")
       EscrevaL(" Obrigado pela participação!")
    fimprocedimento
    
    //-----------------------------------
    procedimento pergunta_confirmacao()
    var
    inicio
       EscrevaL(" [1] Confirma a doação no valor de R$", Valor:3:2)
       EscrevaL(" [2] Cancela a doação")
    fimprocedimento
    //-----------------------------------
    procedimento msg_voce_cancelou()
    var
    inicio
       EscrevaL(" Você cancelou a participação.")
    fimprocedimento
    //-----------------------------------
    procedimento parar_programa()
    var
    inicio
       executar_programa := falso
    fimprocedimento
    //-----------------------------------
    procedimento voltar_ao_menu_principal()
    var
    inicio
       executar_programa := verdadeiro
    fimprocedimento
    //-----------------------------------
    procedimento msg_opcao_invalida()
    var
    inicio
       EscrevaL(" Opção Inválida.")
       EscrevaL(" [1] Voltar ao menu principal")
       EscrevaL(" [2] Cancelar doação")
       EscrevaL(" Escolha uma opção: ")
    fimprocedimento
    //-----------------------------------
    var
       N, Valor, B : inteiro
       executar_programa : logico
    inicio
       EscrevaL("-----------------------")
       EscrevaL("   CRIANÇA ESPERANÇA   ")
       EscrevaL("-----------------------")
       EscrevaL()
       executar_programa := verdadeiro
       Enquanto executar_programa = verdadeiro faca
          menu_principal()
          Leia(N)
          Escolha N
             Caso 1
                Valor := 15
             Caso 2
                Valor := 20
             Caso 3
                Valor := 30
             Caso 4
                Valor := 40
             Caso 5
                Escreva("Digite a quantia: ")
                Leia(Valor)
             Caso 6
                msg_voce_cancelou()
                parar_programa()
             OutroCaso
                Se N <> 6 então
                   repita
                      msg_opcao_invalida()
                      leia(B)
                      Se B = 1 então
                         voltar_ao_menu_principal()
                      Senao
                         Se(B = 2) então
                            msg_voce_cancelou()
                            parar_programa()
                         Fimse
                      Fimse
                   ate (B = 1) ou (B = 2)
                Fimse
          FimEscolha
          Se (N >= 1) e (N <= 5) então
             pergunta_confirmacao()
             leia(B)
             Se B = 1 então
                   msg_voce_doou()
                   parar_programa()
             Senao
                Se B = 2 então
                   msg_voce_cancelou()
                   parar_programa()
                Senao
                   repita
                      msg_opcao_invalida()
                      leia(B)
                      Se B = 1 então
                         voltar_ao_menu_principal()
                      Senao
                         Se (B = 2) então
                            msg_voce_cancelou()
                            parar_programa()
                         Fimse
                      Fimse
                   ate (B = 1) ou (B = 2)
                Fimse
             Fimse
          Fimse
       FimEnquanto
    Fimalgoritmo

    Edit : Faltou umas coisas e tirar comando repetido.

    Editado por viniciusv21
    erro no código
    • 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

    ×