Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

leandro318

[Visualg] Comando para encerrar a execução do algoritmo

Recommended Posts

Olá galera estou fazendo um algoritmo de um sistema de cadastro de usuários, o sistema deverá sempre perguntar o que o usuário deseja fazer, se deseja cadastrar um novo usuário, se deseja imprimir os usuários já cadastrados, ou se deseja sair. O sistema já está praticamente pronto, só encontrei um problema, quando digito 3 que é o número da opção para sair do programa, ele não sai, mesmo eu tendo colocado o comando "interrompa", ele volta para o procedimento pedindo os dados do usuário ao invés de sair.

O código está assim:

var
    nome: vetor [1..8] de literal
    data_nasc: vetor [1..8] de literal
    rg: vetor [1..8] de literal
    cont, cont2, aux, opcao: inteiro
    
    procedimento ler
    inicio
        enquanto (cont <= 8) faca
            cont <- cont + 1
            escreval ("Digite o nome")
            leia (nome[cont])
            escreval ("Digite a data de nascimento")
            leia (data_nasc[cont])
            escreval ("Digite o RG")
            leia (rg[cont])
            aux <- cont
            menu
        fimenquanto
    fimprocedimento
    procedimento escrever
    inicio
        escreval ("Usuários cadastrados: ")
        escreval ("")
        para cont2 de 1 ate aux faca
            escreval ("Usuário", cont2," Nome: ",nome[cont2]," Data de nascimento: ",data_nasc[cont2]," RG: ",rg[cont2])
        fimpara
        menu
    fimprocedimento
    procedimento menu
    inicio
        escreval ("O que deseja fazer?")
        escreval ("")
        escreval ("1 - Cadastar usuário")
        escreval ("2 - Imprimir usuários já cadastrados")
        escreval ("3 - Sair")
        leia (opcao)
        enquanto (opcao <> 3)  faca
            escolha (opcao)
                caso 1
                    ler
                caso 2
                    escrever
                caso 3
                    escreval ("Obrigado pela preferência, volte sempre!")
                    interrompa
                outrocaso
                    escreval ("Opção inválida!!")
            fimescolha
            escreval ("O que deseja fazer?")
            escreval ("")
            escreval ("1 - Cadastar usuário")
            escreval ("2 - Imprimir usuários já cadastrados")
            escreval ("3 - Sair")
            leia (opcao)
        fimenquanto
    fimprocedimento
inicio
    cont <- 0
    menu
fimalgoritmo

Diante disso, gostaria de saber qual comando devo colocar dentro do "caso 3" para que quando o usário pressionar o 3, o programa encerrar imediatamente e só exibir a mensagem "Obrigado pela preferência, volte sempre!".

Compartilhar este post


Link para o post
Compartilhar em outros sites

acontece o seguinte: toda vez que você faz uma chamada a outro procedimento você cria o que é chamado "pilha de execução", um procedimento nao termina enquanto o procedimento que ele chamou não terminar.

no seu caso, quando você chama o procedimento ler dentro de menu, ele executa o ler e quando encerra volta para menu, mas observa que no procedimento ler você tem um laço de execução chamando o procedimento menu 8 vezes. ou seja quando você executa o procedimento ler, ele chama o procedimento menu, e só depois de sair desse menu ele volta a ler pois ainda nao terminou o laço de ler;

em resumo o que seu código está fazendo é ler os 8 registros de uma vez.

alterei um pouco seu código e acredito que o comportamento que você esperava do seu código na verdade seja mais parecido com este:

 

var
nome: vetor [1..8] de literal
data_nasc: vetor [1..8] de literal
rg: vetor [1..8] de literal
cont, cont2, aux, opcao: inteiro
procedimento ler
inicio
cont <- cont + 1
escreval ("Digite o nome")
leia (nome[cont])
escreval ("Digite a data de nascimento")
leia (data_nasc[cont])
escreval ("Digite o RG")
leia (rg[cont])
aux <- cont
fimprocedimento
procedimento escrever
inicio
escreval ("Usuários cadastrados: ")
escreval ("")
para cont2 de 1 ate aux faca
escreval ("Usuário", cont2," Nome: ",nome[cont2]," Data de nascimento: ",data_nasc[cont2]," RG: ",rg[cont2])
fimpara
fimprocedimento
procedimento menu
inicio
escreval ("O que deseja fazer?")
escreval ("")
escreval ("1 - Cadastar usuário")
escreval ("2 - Imprimir usuários já cadastrados")
escreval ("3 - Sair")
leia (opcao)
enquanto (opcao <> 3) faca
escolha opcao
caso 1
ler
caso 2
escrever
caso 3
escreval ("Obrigado pela preferência, volte sempre!")
interrompa
outrocaso
escreval ("Opção inválida!!")
fimescolha
escreval ("O que deseja fazer?")
escreval ("")
escreval ("1 - Cadastar usuário")
escreval ("2 - Imprimir usuários já cadastrados")
escreval ("3 - Sair")
leia (opcao)
fimenquanto
fimprocedimento
inicio
cont <- 0
menu
fimalgoritmo

 

 

abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mude o Procedimento MENU para:

procedimento menu
    inicio
        enquanto (opcao <> 3)  faca
            escreval ("O que deseja fazer?")
            escreval ("")
            escreval ("1 - Cadastar usuário")
            escreval ("2 - Imprimir usuários já cadastrados")
            escreval ("3 - Sair")
            leia (opcao)
            escolha opcao
                caso 1
                    ler
                caso 2
                    escrever
                caso 3
                    escreval ("Obrigado pela preferência, volte sempre!")
                    interrompa
                outrocaso
                    escreval ("Opção inválida!!")
            fimescolha
        fimenquanto
    fimprocedimento

Nunca seria exibida a mensagem da opção 3, pois enquanto for diferente de 3, o código é executado e sempre a opção era lida antes do loop.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Infelizmente, o programa fica dando erro, pedindo fimse não sei porque, modifiquei o código e está assim:

procedimento menu
    inicio
        enquanto (opcao <> 6) faca
            escreval ("Menu Principal - Nome do Banco")
            escreval ("")
            timer (1000) on
            timer (0) off
            escreval ("Cadastro de usuário/senha ----- Digite 1")
            escreval ("Efetuar Login ----------------- Digite 2")
            escreval ("Saque ------------------------- Digite 3")
            escreval ("Saldo ------------------------- Digite 4")
            escreval ("Depósito ---------------------- Digite 5")
            escreval ("Sair -------------------------- Digite 6")
            leia (opcao)
            escolha (opcao)
                caso 1
                    cadastro
                caso 2
                    login
                caso 3
                    fazersaque
                caso 4
                    versaldo
                caso 5
                    fazerdeposito
            fimescolha
        fimenquanto
        se (opcao = 6) entao
            escreval ("Tem certeza que deseja sair? (S/N)")
            leia (confirmacao)
            se (confirmacao = "s") entao
                escreval ("Obrigado pela preferência, volte sempre!")
                fimalgoritmo
            senao
                menu
            fimse
        senao
            escreval ("Opção inválida!!")
            menu
        fimse
    fimprocedimento

Alguém sabe porque ele fica dando erro pedindo fimse? Percebi uma coisa: se eu retirar o "fimalgoritmo" de dentro do "se", ele não dá mais esse erro, porém não sai do programa como preciso que aconteça. Também tentei com o "interrompa", mas também dá o mesmo erro.

O que posso alterar para ele sair do programa como deveria?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Este erro do "fimse" deve ser dentro de algum outro procedimento.

 

O programa pode não entender corretamente um "senao se", o correto seria colocar o "se" na linha de baixo, e fechar todos os "se", até os que estão dentro do "senao".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Este erro do "fimse" deve ser dentro de algum outro procedimento.

 

O programa pode não entender corretamente um "senao se", o correto seria colocar o "se" na linha de baixo, e fechar todos os "se", até os que estão dentro do "senao".

 

Não é isso, pois se eu tirar o "fimalgoritmo" o programa roda 100%, não dá nenhum erro, porém não finaliza quando o usuário digitar 6, o erro só ocorre quando coloco o "fimalgoritmo" ou o "interrompa" para encerrar o programa quando o usuário digitar 6.

Fiz algumas modificações e agora está assim:

procedimento menu  
    inicio  
        enquanto (opcao <> 6) faca  
            escreval ("Menu Principal - Nome do Banco")  
            escreval ("")  
            timer (1000) on  
            timer (0) off  
            escreval ("Cadastro de usuário/senha ----- Digite 1")  
            escreval ("Login ------------------------- Digite 2")  
            escreval ("Saque ------------------------- Digite 3")  
            escreval ("Saldo ------------------------- Digite 4")  
            escreval ("Depósito ---------------------- Digite 5")  
            escreval ("Sair -------------------------- Digite 6")  
            leia (opcao)  
            escolha (opcao)  
                caso 1  
                    cadastro  
                caso 2  
                    login  
                caso 3  
                    fazersaque  
                caso 4  
                    versaldo  
                caso 5  
                    fazerdeposito  
                caso 6  
                    escreval ("Obrigado pela preferência, volte sempre!")  
                    fimalgoritmo  
                outrocaso  
                    escreval ("Opção inválida!!")  
            fimescolha  
        fimenquanto  
    fimprocedimento

Porém o erro continua.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opção 6 sai do loop, dessa forma não precisa de mais nada, quando for para a próxima iteração o enquanto vai ver que a opção é 6 e acaba.

 

Mas esse é o problema, ele sai do loop, mas executa o próximo procedimento, preciso que ele saia totalmente do programa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez o problema seja você chamar várias vezes o procedimento "menu".

 

Quando você chama qualquer outro procedimento dentro do menu, ao chegar em seu final, volta para o menu. Por exemplo, dentro do procedimento "menu", eu escolho a opção de login, o algoritmo vai executar o procedimento "login", quando finalizar, vai retornar ao menu, executando a instrução após a chamada do procedimento "login".

algoritmo "entender recursao"
// Função : Tentando entender recursao
// Autor : Lokaodomau
// Data : 03/06/2015
// Seção de Declarações 
var
entendeu: literal

// procedimento
procedimento recursao
inicio
escreval("Isto é recursão, entendeu? (S/N)")
leia(entendeu)
se nao( entendeu = "S" ) entao
   // entenda recursao
   recursao
fimse
fimprocedimento

// algoritmo
inicio
// Seção de Comandos
recursao
fimalgoritmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Leandro, tudo certo? Fiz o algoritmo para lhe dar uma ideia, o mesmo nao trabalha com vetor, apenas soma dos dados (trabalhar com vetor e mais fácil, porem apenas quis lhe dar uma "luz". Se precisar de algo ou se meu código não condizer com oque deseja, só falar )

 

Obs Tem apenas cadastro de nome de usuário, para demais opções apenas adicione no codigo

algoritmo "semnome"
// Função : cadastrar novo user, imprimir os existentes
// Autor : Eduardo Cipriani
// Data : 04/06/2015
// Seção de Declarações 
var
   cont , validacao :inteiro
   uc , usuario : caracter
inicio
      escreval("Programa Iniciado")
      escreval("Oque deseja fazer? informe o numero para realizar a operaçao")
      escreval("1° Cadastrar novo usuario?")
      escreval("2° Imprimir os existentes")
      escreval("3°Sair do programa")
      leia(validacao) // o usuario informe oque quer executar
      repita //comando repita (ele ira repetir ate o user digitar 3 olha no fim do comando)
            se(validacao = 1)entao // Se digitar 1 ele ira dar a opcao de cadastrar user
                   escreval("Informe o nome do usuario")
                   leia(usuario)   // le o nome do usuario
                   uc <- uc + " e " + usuario //"pega o usuario cadastrado e soma com os ja existentes e joga na variavel uc (usuarios cadastrados)
                   cont <- cont + 1   // para validar se ja foram cadastrados usuario Ve na "validacao = 2" abaixo
                   escreval("Deseja executar novamente? informe o numero correspondente") //
                   leia(validacao)   // valida se quer executar novamente
            fimse
            se(validacao = 2)entao  // valida para que se o user digitar 2 imprima os usuarios cadastrados
                         se(cont > 0)entao // valida para ver se tem algum user cadastrado
                                 escreval("Usuarios Cadastrados;")
                                 escreval(uc) //mostrar os usuarios cadastrados
                                 escreval("Deseja executar novamente? informe o numero correspondente")
                                 leia(validacao)  // valida se quer executar novamente
                         senao
                              escreval("Nenhum usuario cadastrado")
                              escreval("Deseja executar novamente? informe o numero correspondente")
                              leia(validacao)   // valida se quer executar novamente
                         fimse
            fimse
            se(validacao = 3)entao // Se for digitado 3 exibe a mensagem abaixo
                         escreval("Obrigado por utilizar o programa")
            fimse
      ate validacao = 3 // Se o usuario digitar 3 o programa e finalizado
      
      //espero que tenha lhe ajudado. qualquer duvida so pedir.
      escreval("Programa finalizado")
fimalgoritmo

Comentei o código inteiro, espero que ajude.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.