Ir ao conteúdo

Posts recomendados

Postado

Bom dia, 

Estou com problema na hora de excluir um contato nessa agenda em pseudocode. Ele não não exclui contato a contato. Alguém poderia dar uma força?

Algoritmo "Projeto Cadastro"
Var
   nome, endereco, email, tel: vetor [1..100] de caracter
   x: inteiro
   opcao: inteiro

Procedimento Menu
Var
Inicio
   escreval ("========================")
   escreval ("== PROJETO - CADASTRO ==")
   escreval ("========================")
   escreval ("")
   escreval ("========================")
   escreval ("==== [1] Cadastrar =====")
   escreval ("==== [2] Listar    =====")
   escreval ("==== [3] Editar    =====")
   escreval ("==== [4] Excluir   =====")
   escreval ("==== [5] Sair      =====")
   escreval ("========================")
   escreval ("")
   escreva ("Entre com a sua opção: ")
   leia (opcao)
   
   escolha opcao
   caso 1
      cadastronome
   caso 2
      listarnomes
   caso 3
      editarnome
   caso 4
      excluircadastro
   caso 5
      sair
   outrocaso
      escreval ("Opção Inválida.")
      Menu
   fimescolha
Fimprocedimento

procedimento cadastronome

Inicio
   limpatela
   escreval ("")
   escreval ("=================")
   escreval ("==",x,"o. Contato ==")
   escreval ("=================")
   escreval ("")
   escreva ("Nome: ")
   leia (nome[x])
   escreva ("Telefone: ")
   leia (tel[x])
   escreva ("Endereço: ")
   leia (endereco[x])
   escreva ("E-mail: ")
   leia (email[x])
   escreval("")
   x <- x + 1
   limpatela
   escreval("Contato cadastrado com sucesso!")
   escreval("")
   escreval ("== [1] Cadastrar novo contato ==")
   escreval ("== [2] Voltar Menu Principal  ==")
   escreval ("")
   escreva ("Entre com a sua opção: ")

   leia (opcao)
   escolha opcao
   caso 1
      cadastronome
   caso 2
      limpatela
      Menu
   outrocaso
      escreval ("Opção Inválida.")
      Menu

Fimprocedimento

Procedimento listarnomes
Var
   i, cadastro: inteiro

Inicio
   limpatela
   escreval ("========================")
   escreval ("== LISTA DE CADASTROS ==")
   escreval ("========================")
   para i de 1 ate (x-1) faca
      escreval (i,"o Cadastro")
      escreval ("Nome: ", nome[i])
      escreval ("Telefone: ", tel[i])
      escreval ("Endereço: ", endereco[i])
      escreval ("E-mail: ", email[i])
      escreval ("")
   fimpara

   escreval ("== [1] Listar novamente ==")
   escreval ("== [2] Voltar Menu Principal ==")
   escreval ("")
   escreva ("Entre com a sua opção: ")

   leia (opcao)
   escolha opcao
   caso 1
      listarnomes
   caso 2
      limpatela
      Menu
   outrocaso
      escreval ("Opção Inválida.")
      Menu

Fimprocedimento

Procedimento editarnome

Var
   cadastro, i, dado: inteiro

Inicio
   limpatela
   escreval ("")
   escreval ("======================")
   escreval ("== ALTERAR CADASTRO ==")
   escreval ("======================")
   escreval ("")
   para i de 1 ate (x-1) faca
      escreval (i,"o Cadastro")
      escreval ("Nome: ", nome[i])
      escreval ("Telefone: ", tel[i])
      escreval ("Endereço: ", endereco[i])
      escreval ("E-mail: ", email[i])
      escreval ("")
   fimpara
   escreval ("")
   escreval ("Entre com o nº do cadastro a ser alterado")
   leia (cadastro)
   para i de 1 ate (x-1) faca
      se i = cadastro entao
         escreval ("Nº de cadastro: ", i)
         escreval ("[1] - Nome: ", nome[i])
         escreval ("[2] - Telefone: ", tel[i])
         escreval ("[3] - Endereço: ", endereco[i])
         escreval ("[4] - E-mail: ", email[i])
         escreval ("[5] - Não alterar.")
         escreval ("Escolha o dado que deseja alterar: ")
         leia (dado)
         escolha (dado)
         caso 1
            escreval ("Digite o novo nome: ")
            leia (nome[i])
         caso 2
            escreval ("Digite o novo telefone: ")
            leia (tel[i])
         caso 3
            escreval ("Digite o novo endereço: ")
            leia (endereco[i])
         caso 4
            escreval ("Digite o novo e-mail: ")
            leia (email[i])
         caso 5
            escreval ("O cadastro não foi alterado.")
         outrocaso
            Menu
         fimescolha
      fimse
   fimpara
   escreval ("O Cadastro foi alterado com sucesso.")
   escreval ("")
   escreval ("== [1] Alterar outro contato ==")
   escreval ("== [2] Voltar Menu Principal ==")
   escreval ("")
   escreva ("Entre com a sua opção: ")
   leia (opcao)
   escolha opcao
      limpatela
   caso 1
      editarnome
   caso 2
      limpatela
      Menu
   outrocaso
      escreval ("Opção Inválida.")
      Menu

Fimprocedimento

Procedimento excluircadastro
Var
   cadastro,i: inteiro

Inicio
   limpatela
   escreval ("======================")
   escreval ("== EXCLUIR CADASTRO ==")
   escreval ("======================")
   escreval ("")
   escreval ("== LISTA DE CADASTROS ==")
   escreval ("")
   para i de 1 ate (x-1) faca
      escreval (i,"o Cadastro")
      escreval ("Nome: ", nome[i])
      escreval ("Telefone: ", tel[i])
      escreval ("Endereço: ", endereco[i])
      escreval ("E-mail: ", email[i])
      escreval ("")
   fimpara
   escreval ("==========================================")
   escreva ("Entre com o nº do cadastro a ser excluído: ")
   leia (cadastro)

   para i de 1 ate (x-1) faca
      se i = cadastro entao
         x <- i
      fimse
   fimpara
   escreval ("O Cadastro foi excluido com sucesso.")
   escreval ("")
   escreval ("== [1] Excluir outro contato ==")
   escreval ("== [2] Voltar Menu Principal  ==")
   escreval ("")
   escreva ("Entre com a sua opção: ")
   leia (opcao)
   escolha opcao
      limpatela
   caso 1
      excluircadastro
   caso 2
      limpatela
      Menu
   outrocaso
      escreval ("Opção Inválida.")
      Menu


Fimprocedimento

Procedimento sair

Inicio
   limpatela
Fimprocedimento

Inicio

   x <- 1

   Menu

Fimalgoritmo

 

 

  • Curtir 1
  • Membro VIP
Postado

@Leandro Charleaux, 2 pontos:

 

1) LOOP X RECURSIVIDADE

No seu código, você está "reinvocando" os procedimento em fez de simplesmente utilizar um loop. No paradigma do VisualG, cada vez que você invoca um método (procedimento ou função), é como se tivesse abrindo um "sub-programa"... vai ficar criando um monte de "processos" um dentro do outro.

 

Exemplo:

1 hora atrás, Leandro Charleaux disse:

   caso 5
      sair
   outrocaso
      escreval ("Opção Inválida.")
      Menu
   fimescolha
Fimprocedimento

Ali na terceira linha, você NÃO pode chamar novamente o Menu(). Seria como se cada vez que pressione o "C" lá na calculadora do Windows, fosse aberta uma calculadora nova dentro da própria calculadora (onde a anterior continuaria aberta)... iria ficar um monte de janelas abertas, mas uma sobrepondo a outra (vários processos)! o mais correto seria simplesmente usar um loop, ex.:

procedimento Menu()
inicio
   repita
      escreval("========================")
      escreval("== PROJETO - CADASTRO ==")
      escreval("========================")
      escreval("")
      escreval("========================")
      escreval("==== [1] Cadastrar =====")
      escreval("==== [2] Listar    =====")
      escreval("==== [3] Editar    =====")
      escreval("==== [4] Excluir   =====")
      escreval("==== [5] Sair      =====")
      escreval("========================")
      escreval("")
      escreva ("Entre com a sua opção: ")
      leia(opcao)

      escolha opcao
      caso 1
         CadastrarNomes()
      caso 2
         ListarNomes()
      caso 3
         EditarNomes()
      caso 4
         ExcluirCadastros()
      caso 5
         Sair()
      outrocaso
         escreval("Opção Inválida.")
      fimEscolha
   ate opcao = 5
fimProcedimento

Aqui, o método Menu() vai ficar repetindo o seu fluxo... o que é totalmente diferente de ficar "abrindo um novo menu recursivamente".

 

Obs.: na recursividade, vai existir um limite físico... cada vez que o Menu() é novamente aberto, vai consumindo um pouco dos recursos do Windows, vai chegar a um ponto que vai travar...

Obs. 2: a questão não é "ter recursos suficientes na máquina" simplesmente, mas sim uma questão de conceito! não deve-se utilizar da recursividade para repetir ou reinvocar um método.

 

Vai acontecer o mesmo dentro de cada um dos procedimento... você NÃO pode chamar o Menu() dentro de CadastrarNomes(), pois este último já está dentro do primeiro, basta fazer CadastrarNomes() terminar, que o fluxo vai voltar para o Menu().




2) SINTAXE COMPLETA DAS ESTRUTURAS
Basicamente ficou faltando alguns fimEscolha. Basta inseri-los.


3) ALGORITMO DE EXCLUSÃO

Você primeiro precisa (ou precisaria) pensar uma uma lógica para excluir o registro. O que é feito quando um registro é apagado?

 

Te adianto duas formas:

3.1) colocar uma flag ou algo que identifique que o registro está excluído. Algo como "o nome está vazio"; ou outro vetor chamado excluido, que conterá 0 para quando não está excluído, e 1 para quando está excluído etc. Daí, na hora de exibir na tela ou usar o registro para algo, verifica qual o estado dessa flag (se o nome não está vazio ou se o campo excluido está com 0).

 

3.2) realocar todos os registros posteriores uma casa para trás. Exemplo: se apaguei o registro 4, o registro 5 seria deslocado para o 4, o 6 vai para posição 5, a 7 para 6... etc
 

***

Abaixo dei uma mini organizada. Basicamente apenas inseri os fimEscolha mexi nuns padrões de nomenclaturas:

algoritmo "Projeto Cadastro"
var
   nome, endereco, email, tel: vetor [1..100] de caracter
   x: inteiro
   opcao: inteiro

procedimento Menu()
var
inicio
   escreval("========================")
   escreval("== PROJETO - CADASTRO ==")
   escreval("========================")
   escreval("")
   escreval("========================")
   escreval("==== [1] Cadastrar =====")
   escreval("==== [2] Listar    =====")
   escreval("==== [3] Editar    =====")
   escreval("==== [4] Excluir   =====")
   escreval("==== [5] Sair      =====")
   escreval("========================")
   escreval("")
   escreva ("Entre com a sua opção: ")
   leia(opcao)

   escolha opcao
   caso 1
      CadastrarNomes()
   caso 2
      ListarNomes()
   caso 3
      EditarNomes()
   caso 4
      ExcluirCadastros()
   caso 5
      Sair()
   outrocaso
      escreval("Opção Inválida.")
      Menu() //Não pode invocar novamente o procedimento
   fimEscolha
fimProcedimento

procedimento CadastrarNomes()
inicio
   LimpaTela()
   escreval("")
   escreval("=================")
   escreval("==",x,"o. Contato ==")
   escreval("=================")
   escreval("")
   escreva ("Nome: ")
   leia(nome[x])
   escreva ("Telefone: ")
   leia(tel[x])
   escreva ("Endereço: ")
   leia(endereco[x])
   escreva ("E-mail: ")
   leia(email[x])
   escreval("")
   x <- x + 1
   LimpaTela()
   escreval("Contato cadastrado com sucesso!")
   escreval("")
   escreval("== [1] Cadastrar novo contato ==")
   escreval("== [2] Voltar Menu Principal  ==")
   escreval("")
   escreva ("Entre com a sua opção: ")

   leia(opcao)
   escolha opcao
   caso 1
      CadastrarNomes()
   caso 2
      LimpaTela()
      Menu() //Não pode invocar novamente o procedimento
   outrocaso
      escreval("Opção Inválida.")
      Menu() //Não pode invocar novamente o procedimento
   fimEscolha //faltou essa linha
fimProcedimento

procedimento ListarNomes()
var
   i, cadastro: inteiro

inicio
   LimpaTela()
   escreval("========================")
   escreval("== LISTA DE CADASTROS ==")
   escreval("========================")
   para i de 1 ate (x-1) faca
      escreval(i, "o Cadastro")
      escreval("Nome: ", nome[i])
      escreval("Telefone: ", tel[i])
      escreval("Endereço: ", endereco[i])
      escreval("E-mail: ", email[i])
      escreval("")
   fimPara

   escreval("== [1] Listar novamente ==")
   escreval("== [2] Voltar Menu Principal ==")
   escreval("")
   escreva ("Entre com a sua opção: ")

   leia(opcao)
   escolha opcao
   caso 1
      ListarNomes() //Não pode invocar novamente o procedimento
   caso 2
      LimpaTela()
      Menu() //Não pode invocar novamente o procedimento
   outrocaso
      escreval("Opção Inválida.")
      Menu() //Não pode invocar novamente o procedimento
   fimEscolha //falou essa linha
fimProcedimento

procedimento EditarNomes()
var
   cadastro, i, dado: inteiro

inicio
   LimpaTela()
   escreval("")
   escreval("======================")
   escreval("== ALTERAR CADASTRO ==")
   escreval("======================")
   escreval("")
   para i de 1 ate (x-1) faca
      escreval(i,"o Cadastro")
      escreval("Nome: ", nome[i])
      escreval("Telefone: ", tel[i])
      escreval("Endereço: ", endereco[i])
      escreval("E-mail: ", email[i])
      escreval("")
   fimPara
   escreval("")
   escreval("Entre com o nº do cadastro a ser alterado")
   leia(cadastro)
   para i de 1 ate (x-1) faca
      se i = cadastro entao
         escreval("Nº de cadastro: ", i)
         escreval("[1] - Nome: ", nome[i])
         escreval("[2] - Telefone: ", tel[i])
         escreval("[3] - Endereço: ", endereco[i])
         escreval("[4] - E-mail: ", email[i])
         escreval("[5] - Não alterar.")
         escreval("Escolha o dado que deseja alterar: ")
         leia(dado)
         escolha (dado)
         caso 1
            escreval("Digite o novo nome: ")
            leia(nome[i])
         caso 2
            escreval("Digite o novo telefone: ")
            leia(tel[i])
         caso 3
            escreval("Digite o novo endereço: ")
            leia(endereco[i])
         caso 4
            escreval("Digite o novo e-mail: ")
            leia(email[i])
         caso 5
            escreval("O cadastro não foi alterado.")
         outrocaso
            Menu()
         fimEscolha
      fimse
   fimPara
   escreval("O Cadastro foi alterado com sucesso.")
   escreval("")
   escreval("== [1] Alterar outro contato ==")
   escreval("== [2] Voltar Menu Principal ==")
   escreval("")
   escreva ("Entre com a sua opção: ")
   leia(opcao)
   escolha opcao
      LimpaTela()
   caso 1
      EditarNomes() //Não pode invocar novamente o procedimento
   caso 2
      LimpaTela()
      Menu() //Não pode invocar novamente o procedimento
   outrocaso
      escreval("Opção Inválida.")
      Menu() //Não pode invocar novamente o procedimento
   fimEscolha

fimProcedimento

procedimento ExclurCadastros()
Var
   cadastro,i: inteiro

Inicio
   LimpaTela()
   escreval("======================")
   escreval("== EXCLUIR CADASTRO ==")
   escreval("======================")
   escreval("")
   escreval("== LISTA DE CADASTROS ==")
   escreval("")
   para i de 1 ate (x-1) faca
      escreval(i,"o Cadastro")
      escreval("Nome: ", nome[i])
      escreval("Telefone: ", tel[i])
      escreval("Endereço: ", endereco[i])
      escreval("E-mail: ", email[i])
      escreval("")
   fimPara
   escreval("==========================================")
   escreva ("Entre com o nº do cadastro a ser excluído: ")
   leia(cadastro)

   para i de 1 ate (x-1) faca
      se i = cadastro entao
         x <- i
      fimse
   fimPara
   escreval("O Cadastro foi excluido com sucesso.")
   escreval("")
   escreval("== [1] Excluir outro contato ==")
   escreval("== [2] Voltar Menu Principal  ==")
   escreval("")
   escreva ("Entre com a sua opção: ")
   leia(opcao)
   escolha opcao
      LimpaTela()
   caso 1
      ExclurCadastros()
   caso 2
      LimpaTela()
      Menu()
   outrocaso
      escreval("Opção Inválida.")
      Menu()
   fimEscolha //faltou essa linha
fimProcedimento

procedimento Sair()
inicio
   LimpaTela()
fimProcedimento

inicio
   x <- 1
   Menu()
fimAlgoritmo

 

RESUMINDO:

- no Menu(), use um repita/ate;

- nos outros métodos, também use um repita/ate para repetir, e para voltar para o Menu(), simplesmente deixe o atual método finalizar que ele vai voltar para o Menu().

- sugiro utilizar nomes de vetores no plural. Ex.: nome = nome de uma pessoa; já nomes = nomes de várias pessoas, ou seja: um vetor.

nomes, enderecos, emails, tels: vetor [1..100] de caracter

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!