Ir ao conteúdo
  • Cadastre-se

Problema com vetor visualg


Posts recomendados

Eai pessoal, tudo bem?

 

Preciso fazer um programa que cadastre pessoas e que essas pessoas possam cadastrar suas contas no programa, para que no final vejam os seus gastos.

 

Estou bem no começo do projeto, e sou iniciante em programação.

Quando coloco pra rodar o algoritmo ele diz que está faltando um "ate", só que até agora nao consegui achar aonde está faltando, poderiam me ajudar?

 

 

algoritmo "Trabalho"
// Função :
// Autor :
// Data : 26/05/2014
// Seção de Declarações
var
a1,a2,a3,a4 :inteiro
a5, i : caractere
moradores: vetor[1..10] de caracter
contas: vetor[1..10, 1..10] de caracter inteiro
sair: inteiro
inicio
// Seção de Comandos
Escreva ("Menu principal")
Escreva ("1. Cadastrar Moradores")
Escreva ("2. Cadastrar contas")
Escreva ("3. Mostrar Moradores Menores de idade")
Escreva ("4. Sair ")
leia (a1)
     //incluindo moradores
     escolha a1
          para a1=1 faca
             Escreva ("Insira o nome do morador:")
                     leia (moradores)
         fimpara
//comando para sair
ate a1=4
fimalgoritmo

 

 

desde já agradeço

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@brunoalv182 Bem, faz muito tempo que não uso Pseudocódigo...

To achando Java,C++ e C# mas claro q isso kkkkkkk

 

Pelo que eu li, você criou um loop infinito:

                         Para a1=1 faça;

 

Ou seja, se o usuário digitar 1 ele repetira o comando.

Acho que deveria ser assim, eu acho:

                    SE a1=1 faça;

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@brunoalv182     o até está faltando ali no comando para,  e o comando escolha só funciona 

se você colocar o comando Caso para que ele saiba o que fazer.   Então modifiquei seu código

acrescentando o comando Caso e coloquei o comando Para também.   Assim ele vai funcionar

mas ainda falta muita coisa para terminar seu programa.  e o então tem que ser sem TIL .  Experimente assim:

Algoritmo "Cadastro"
Var
a1,a2,a3,a4,x,y :inteiro
a5, i,cad     : caractere
moradores: vetor[1..10] de caracter
contas: vetor[1..10, 1..10] de caracter inteiro
sair: inteiro
Inicio
x:=1
cad:="s"
repita
  Escreval ("      Menu principal")
  Escreval ("1. Cadastrar Moradores")
  Escreval ("2. Cadastrar contas")
  Escreval ("3. Mostrar Moradores Menores de idade")
  Escreval ("4. Sair ")
  a1:=0
  leia (a1)
     //incluindo moradores
     escolha a1
       caso 1
         //cadastrar moradores
         enquanto cad <> "n" faca
           escreval("digite o nome do morador e tecle enter")
           leia (moradores[x])
           escreval("cadastrar outro morador  S  N")
           leia(cad)
           x:=x+1
           se x > 10 então
             escreval("Só podes Cadastrar 10 Moradores")
             cad:="n"
           fimse
         fimenquanto
         limpatela
       caso 2
         //cadastrar contas
       caso 3
         //mostrar moradores menoresde idade
         limpatela
         para y de 1 ate 10 faca
           escreval(y," morador ",moradores[y])
         fimpara
         escreval("           tecle enter")
         leia(a2)
         limpatela
     fimescolha
ate a1=4
       //    para a1=1 faca
       //    Escreva ("Insira o nome do morador:")
       //              leia (moradores)
       //  fimpara
       //comando para sair
//ate a1=4
Fimalgoritmo

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

17 horas atrás, devair1010 disse:

@brunoalv182     o até está faltando ali no comando para,  e o comando escolha só funciona 

se você colocar o comando Caso para que ele saiba o que fazer.   Então modifiquei seu código

acrescentando o comando Caso e coloquei o comando Para também.   Assim ele vai funcionar

mas ainda falta muita coisa para terminar seu programa.  e o então tem que ser sem TIL .  Experimente assim:


Algoritmo "Cadastro"
Var
a1,a2,a3,a4,x,y :inteiro
a5, i,cad     : caractere
moradores: vetor[1..10] de caracter
contas: vetor[1..10, 1..10] de caracter inteiro
sair: inteiro
Inicio
x:=1
cad:="s"
repita
  Escreval ("Menu principal")
  Escreval ("1. Cadastrar Moradores")
  Escreval ("2. Cadastrar contas")
  Escreval ("3. Mostrar Moradores Menores de idade")
  Escreval ("4. Sair ")
  a1:=0
  leia (a1)
     //incluindo moradores
     escolha a1
       caso 1
         //cadastrar moradores
         enquanto cad <> "n" faca
           escreval("digite o nome do morador e tecle enter")
           leia (moradores[x])
           escreval("cadastrar outro morador  S  N")
           leia(cad)
           x:=x+1
           se x > 10 então
             escreval("Só podes Cadastrar 10 Moradores")
             cad:="n"
           fimse
         fimenquanto
       caso 2
         //cadastrar contas
       caso 3
         //mostrar moradores menoresde idade
         limpatela
         para y de 1 ate 10 faca
           escreval(y," morador ",moradores[y])
         fimpara
       fimescolha
ate a1=4
       //    para a1=1 faca
       //    Escreva ("Insira o nome do morador:")
       //              leia (moradores)
       //  fimpara
       //comando para sair
//ate a1=4
Fimalgoritmo

 

Muito obrigado cara, tanto você quanto as outras dicas me ajudaram a sair dessa parte.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @brunoalv182,

 

Caso necessário, poste seu código atual para darmos uma analisada.

 

Sobre o código, alguns pontos:

 

Como está definido o uso dessas variáveis?

Em 03/10/2016 às 02:00, devair1010 disse:

Var
  a1,a2,a3,a4,x,y :inteiro
  a5, i,cad     : caractere
  moradores: vetor[1..10] de caracter
  contas: vetor[1..10, 1..10] de caracter inteiro
  sair: inteiro

 

 

Sugiro utilizar nomenclaturas mais sugestíveis, por exemplo, em relação ao "a1", pelo que vi do uso dela, poderia utilizar algo como "menu", ou "opcao" ou "op" etc. Veja, se as outras estiverem relacionadas as "alternativas do menu", elas não precisam ser declaradas... utilizam-se apenas uma variável, e o "conteúdo" delas que seria "1" ou "2" ou "3" ou "4" (ou outra)...

 

Em relação a "contas"... por quê o primeiro tem "caracter inteiro" ? não tenho certeza, mas acho que para "matrizes" (vetores com 2 ou mais coordenadas) utilizam uma tipo só mesmo...

 

No aguardo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Algoritmo "Cadastro"
Var

menu,a2,a3,a4,x,y:inteiro
a5, i,cad, prod,l   : caractere
moradores: vetor[1..10] de caracter
cont: vetor[1..10, 1..10] de caractere inteiro
sair: inteiro
Inicio
x:=1
cad:="s"
repita
  Escreval ("Menu principal")
  Escreval ("1. Cadastrar Moradores")
  Escreval ("2. Cadastrar contas")
  Escreval ("3. Mostrar Moradores Menores de idade")
  Escreval ("4. Exportar para TXT")
  Escreval ("5. Sair ")
  menu:=0
  leia (menu)
     //incluindo moradores
     escolha menu
       caso 1
         //cadastrar moradores
         enquanto cad <> "n" faca
           escreval("digite o nome do morador e tecle enter")
           leia (moradores[x])
           escreval("cadastrar outro morador  S  N")
           leia(cad)
           x:=x+1
           se x > 10 então
             escreval("Só podes Cadastrar 10 Moradores")
             cad:="n"
           fimse
         fimenquanto
           caso 2
         //cadastrar contas
         enquanto prod <> "n" faca
                  y:= y+1
                  escreval ("Digite o nome da conta que deseja cadastrar")
                  leia (cont[x])
                  escreval ("Digite o valor da conta")
                  leia (cont[y])
                  escreval("Deseja cadastrar mais uma conta? S N")
                  leia (prod)
                  x:= x+1
                   se x > 10 então
                     escreval("Só podes cadastrar 10 contas")
                     prod:="n"
                  fimse
         fimenquanto
       caso 3
         //mostrar moradores menoresde idade
         limpatela
         para y de 1 ate 10 faca
              escreval(y," morador ",moradores[y])
           fimpara
           caso 4
                //salvar resultados em txt
       fimescolha
ate menu=5
       //    para a1=1 faca
       //    Escreva ("Insira o nome do morador:")
       //              leia (moradores)
       //  fimpara
       //comando para sair
//ate a1=4
Fimalgoritmo

A ajuda de vocês realmente ajudou, agora só está faltando duas coisas, a primeira, somar todos os valores das contas e depois salvar em txt, até agora nao consegui, ainda estou tentando.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @brunoalv182.

 

Antes de somar as contas, é necessário armazená-las corretamente. Abaixo dou algumas sugestões de como melhorar o seu código.

Obs.: Sugiro diminuir a quantidade de cadastro no início. Ex. para 2 moradores e 3 contas.

 

 

Você precisa primeiramente arrumar as suas variáveis (mais abaixo já dou uma sugestão).

- Nomenclatura mais sugestível

A orientação é que as variáveis tenham nomes mais próximos dos seus usos.

- Variáveis declaradas e não usadas

Algumas das suas variáveis não estão sendo usadas no código, que é o caso da a2, a3, a4 e a5. Devem ser apagadas!

- Reutilização de variáveis

Geralmente as variáveis que verificam se deseja continuar podem ser reutilizadas. Haja vista que essas respostas não precisam ficar armazenadas após serem verificadas.

- Declaração correta das variáveis

Você declarou:

16 horas atrás, brunoalv182 disse:

cont: vetor[1..10, 1..10] de caractere inteiro

 

Os vetores só tem "UM tipo", que no seu contexto seria inteiro (ou real, se for considerar as frações). Você declarou como caractere inteiro.

Nesse caso, as coordenadas têm 2 posições, o que fica caracterizado uma MATRIZ (de duas coordenadas), mas essas  coordenadas apontam para UMA única posição da matriz. Não tem mistério. Veja:

 

Vamos imaginar o vetor de um coordenada:

16 horas atrás, brunoalv182 disse:

moradores: vetor[1..10] de caracter

Essa estrutura comportar-se como um conjunto de 10 variáveis, ou seja, como se estivesse declarando moradores1, moradores2, moradores3 etc. A diferença que pode acessar as posições (as variáveis) mais facilmente. (o que você já faz no seu código)

 

A diferença de contas é que ela tem 2 coordenadas, logo, para acessá-las seriam necessárias 2 valores.

Ex.:

contas[3,5]

 

Para demonstração, veja esse exemplo:

     contas   :vetor[1..3, 1..5] de inteiro

Chamemos a primeira coordenada de linha, e a segunda de coluna. Logo, para cada linha, temos 5 colunas, o que totalizam 15 variáveis!!! Entende?

 

Contextualizando, poderíamos dizer que as linhas representam os moradores e as colunas as contas dos respectivos moradores. Se eu quero a 4a conta do morador 2, acessaria como: contas[2,4].

 

Abaixo uma base de como pode reorganizar as variáveis:

Var
  //VARIÁVEIS AUXILIARES
  menu      :caracter //utilizado no menu principal
  continuar :caracter //para verificar se deseja continuar ou não
  totalM    :inteiro  //total de moradores cadastrados
  posM      :inteiro  //posição do morador na matriz
  posC      :inteiro  //posição da conta do morador na matriz
  
  //VARIÁVEIS PARA ARMAZENAMENTO
  moradores:vetor[1..10] de caracter       //cadastro dos nomes dos moradores
  contas   :vetor[1..10, 1..10] de inteiro //cadastro das contas dos moradores*
   {contas[x,y];
      x=posição do morador (ex.: morador da posição 2 em "moradores",
    terá suas contas na posção 2 em contas)
      y=contas do morador. Cada posição será uma conta, ou seja, cada morador
    pode ter até 10 contas}

Daí, na hora de cadastrar as contas, precisa saber em qual posição está o morador antes. Logo, primeiro pergunta qual é o morador (posição) e após o valor das contas...

 

As contas seriam inseridas assim:

contas[posM,posC]

O posM é informado pelo usuário (ou o código acha usando o nome*) e o posC vai de 1 a 10. Ai você vê como vai gerenciar... se vai cadastrar os 10 de uma vez ou se vai cadastrando aos poucos.

 

Lembrando que você pode inicialmente diminuir a quantidade de cadastras (ex.: 2 moradores com 3 contas cada)

 

 

No aguardo.

 

 

 

 

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Citação:

Spoiler
2 horas atrás, Simon Viegas disse:

Olá @brunoalv182.

 

Antes de somar as contas, é necessário armazená-las corretamente. Abaixo dou algumas sugestões de como melhorar o seu código.

Obs.: Sugiro diminuir a quantidade de cadastro no início. Ex. para 2 moradores e 3 contas.

 

 

Você precisa primeiramente arrumar as suas variáveis (mais abaixo já dou uma sugestão).

- Nomenclatura mais sugestível

A orientação é que as variáveis tenham nomes mais próximos dos seus usos.

- Variáveis declaradas e não usadas

Algumas das suas variáveis não estão sendo usadas no código, que é o caso da a2, a3, a4 e a5. Devem ser apagadas!

- Reutilização de variáveis

Geralmente as variáveis que verificam se deseja continuar podem ser reutilizadas. Haja vista que essas respostas não precisam ficar armazenadas após serem verificadas.

- Declaração correta das variáveis

Você declarou:

Os vetores só tem "UM tipo", que no seu contexto seria inteiro (ou real, se for considerar as frações). Você declarou como caractere inteiro.

Nesse caso, as coordenadas têm 2 posições, o que fica caracterizado uma MATRIZ (de duas coordenadas), mas essas  coordenadas apontam para UMA única posição da matriz. Não tem mistério. Veja:

 

Vamos imaginar o vetor de um coordenada:

Essa estrutura comportar-se como um conjunto de 10 variáveis, ou seja, como se estivesse declarando moradores1, moradores2, moradores3 etc. A diferença que pode acessar as posições (as variáveis) mais facilmente. (o que você já faz no seu código)

 

A diferença de contas é que ela tem 2 coordenadas, logo, para acessá-las seriam necessárias 2 valores.

Ex.:



contas[3,5]

 

Para demonstração, veja esse exemplo:



     contas   :vetor[1..3, 1..5] de inteiro

Chamemos a primeira coordenada de linha, e a segunda de coluna. Logo, para cada linha, temos 5 colunas, o que totalizam 15 variáveis!!! Entende?

 

Contextualizando, poderíamos dizer que as linhas representam os moradores e as colunas as contas dos respectivos moradores. Se eu quero a 4a conta do morador 2, acessaria como: contas[2,4].

 

Abaixo uma base de como pode reorganizar as variáveis:



Var
  //VARIÁVEIS AUXILIARES
  menu      :caracter //utilizado no menu principal
  continuar :caracter //para verificar se deseja continuar ou não
  totalM    :inteiro  //total de moradores cadastrados
  posM      :inteiro  //posição do morador na matriz
  posC      :inteiro  //posição da conta do morador na matriz
  
  //VARIÁVEIS PARA ARMAZENAMENTO
  moradores:vetor[1..10] de caracter       //cadastro dos nomes dos moradores
  contas   :vetor[1..10, 1..10] de inteiro //cadastro das contas dos moradores*
   {contas[x,y];
      x=posição do morador (ex.: morador da posição 2 em "moradores",
    terá suas contas na posção 2 em contas)
      y=contas do morador. Cada posição será uma conta, ou seja, cada morador
    pode ter até 10 contas}

Daí, na hora de cadastrar as contas, precisa saber em qual posição está o morador antes. Logo, primeiro pergunta qual é o morador (posição) e após o valor das contas...

 

As contas seriam inseridas assim:



contas[posM,posC]

O posM é informado pelo usuário (ou o código acha usando o nome*) e o posC vai de 1 a 10. Ai você vê como vai gerenciar... se vai cadastrar os 10 de uma vez ou se vai cadastrando aos poucos.

 

Lembrando que você pode inicialmente diminuir a quantidade de cadastras (ex.: 2 moradores com 3 contas cada)

 

 

No aguardo.

 

 

 

 

 

Agradeço mais uma vez a ajuda do forum, arrumei as nomenclaturas, mas ai por alguma motivo o algoritmo para de funcionar.

E quando eu coloco um vetor de "inteiro" ele também para de funcionar, só volta a funcionar se eu colocar de "caractere inteiro"

 

 

e em relação ao cadastro das contas no vetor e salva-las, também não consegui.

 

/cadastrar contas
         enquanto continuar <> "n" faca

                  escreval ("Digite o nome da conta que deseja cadastrar")
                  leia (contas[posM])
                  escreval ("Digite o valor da conta")
                  leia (contas[posC])
                  escreval("Deseja cadastrar mais uma conta? S N")
                  leia (continuar)
                  x:= x+1
                   se x > 10 então
                     escreval("Só podes cadastrar 10 contas")
                     continuar:="n"
                  fimse

         fimenquanto

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas Olá

 

Então, eu li umas 5x haha, o problema é que quando eu mudo não funcionar.

 

Deixa eu explicar melhor

 

A matriz de contas é de duas cordeadas, a primeira posM (moradores) e a segunda é posC (contas).

Mas além do valor de contas, eu preciso por o nome da conta, então seria três coordenadas?

 

Eu estou relendo meu material inteiro sobre vetores e matrizes pra tentar entender o que estou fazendo de errado.

Peço desculpas se meu erro é muito fácil de se perceber, mas ainda não percebi uashasuhas.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Ai que está... o nome dos moradores já está em moradores. O nome do morador 1 está na posição 1, do morador 2, está na posição 2... e assim por diante.

 

Já o vetor contas servirá para armazenar as contas desses moradores. As contas do morador 1 está na posição 1, do morador 2 está na posição 2... e assim por diante. Vamos imaginar que é apenas um conta por morador:

moradores:vetor[1..10] de caracter
contas   :vetor[1..10] de inteiro

ou seja, o nome do morador fica no primeiro vetor, e a conta do morador fica no segundo. Para posições iguais, terá dados para o mesmo morador. Beleza? Esses vetores também são matrizes, no caso ambas são matriz linha. Como uma matriz 1x10.

 

Ex.:

escreval("Digite o nome do morador")
leia (moradores[totalM])
escreval("Digite o valor da conta")
leia (contas[totalM])

Veja que está cadastrando dados usando a mesma posição como referência para ambos os valores! Supondo totamM vale 3 naquele momento, o morador 3 terá seu nome e sua conta na posição 3 respectivamente nos vetores.

 

Mas ai, você precisa que um mesmo morador tenha mais de uma conta!!! E agora? Ai entra o vetor de 2 coordenadas.

3 horas atrás, Simon Viegas disse:

//VARIÁVEIS PARA ARMAZENAMENTO
moradores:vetor[1..10] de caracter //cadastro dos nomes dos moradores
contas   :vetor[1..10, 1..10] de inteiro //cadastro das contas dos moradores*

 

 

Conta agora tem DUAS COORDENADAS, no caso como uma matriz 10x10. A moradores tem apenas uma linha! essa linha tem 10 posições, onde cada uma delas armazenará um nome, certo?

 

Já em contas, temos 10 linhas e cada linha com 10 colunas!!!

 

Podemos imaginar os vetores assim:

moradores =
["João","Maria","Bruno","Simon"," "," "," "," "," "," ",]

contas =
[415,345,100,230,242,425,524,324,425,320] //linha um é referente a posição um do outro vetor, logo de João
[430,340,450,860,240,680,350,620,723,560] //linha dois de Maria (que tá na posição 2)
[0,0,0,0,0,0,0,0,0,0] //linha 3 de Bruno
[0,0,0,0,0,0,0,0,0,0] //linha 4 de Simon
[0,0,0,0,0,0,0,0,0,0] //e assim por diante
[0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0]
[0,0,0,0,0,0,0,0,0,0]

Daí, na hora de cadastrar as contas, precisa saber para qual morador está cadastrando. No caso, a posição que ele está.

 

Vamos supor que quer cadastrar as contas de Bruno. Ele está na posição 3, logo posM tem que valer 3 ("posição do morador"). Cadastrando as contas em ordem, posC começaria com 1 e iria aumentando de um em um.

leia(posM,posc);

 

 

***********

 

 

Tente fazer o seguinte!!! Cadastre apenas uma conta para cada morador.

Veja, precisa saber a POSIÇÃO do morador, e não "nome da conta".  Armazena a posição em posM, e ler o valor da conta:

leia(posM,1); //posM será posição do morador, e esse 1 é a posição dessa única conta desse morador)

Ai poste o seu código completo aqui.

 

 

No aguardo.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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