Ir ao conteúdo
  • Cadastre-se
Leandro Charleaux

VisualG Programação em pseudocode não exclui elemento correto do vetor

Posts recomendados

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

 

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

×
×
  • Criar novo...