Ir ao conteúdo
  • Cadastre-se

VisualG Registro Dentro de Uma Matriz Bidimensional


Posts recomendados

Eu estou com alguns problemas pra fazer um programa que tenha um registro dentro de uma matriz com duas dimensões no VisualG. Eu consigo fazer registro com um vetor de boa, o problema só surge quando eu preciso de dois índices pra definir os elementos.

Segue o código do meu programa. O programa dá erro na linha que eu peço pra ler Automoveis.MAutomovel[i,j]

 

Algoritmo "MovimentacaoDeLocacao"
Tipo
Clientela = registro
     Codigo : inteiro
     NCliente : caractere
     Soma : real
fimregistro

Carros = registro
     MAutomovel : caractere
     ValorLoc : real
fimregistro

Var
// Seção de Declarações das variáveis 
Clientes : Vetor [1..100] de Clientela
Automoveis : Vetor [1..100,1..100] de Carros
i, j , n , p , class : inteiro

Inicio
// Seção de Comandos, procedimento, funções, operadores, etc...
escreval ("Digite o número de clientes a serem cadastrados :")
leia (n)
para i de 1 ate n faca
Clientes.Codigo[i] := i + 1000
escreval ("Digite o nome do cliente :")
leia (Clientes.NCliente[i])
escreval ("Digite o número de automóveis que o cliente pretende cadastrar :")
leia (p)
     para j de 1 ate p faca
     escreval ("Digite o nome da marca/modelo do ", j ,"° automóvel ")
     leia (Automoveis.MAutomovel[i,j])
     escreval ("Selecione a classificação do automóvel")
     escreval ("1 - Básico (R$ 80,00) ")
     escreval ("2 - Intermediário (R$ 150,00) ")
     escreval ("3 - Executivo (R$ 300,00) ")
     leia (class)
     escolha class
     caso 1
     Automoveis.ValorLoc[i,j] := 80,00
     caso 2
     Automoveis.ValorLoc[i,j] := 150,00
     caso 3
     Automoveis.ValorLoc[i,j] := 300,00
     outrocaso
     escreval ("Opção inválida!")
     j := j - 1
     fimescolha
     Clientes.Soma[i] := Clientes.Soma[i] + Automoveis.ValorLoc[i,j]
     limpatela
     fimpara
limpatela
fimpara
escreval ("CLIENTES CADASTRADOS")
escreval (" ")
para i de 1 ate n faca
escreval ("Código : C", Clientes.Codigo[i])
escreval ("Nome Do Cliente : ", Clientes.NCliente[i])
     para j de 1 ate p faca
     escreval ("Marca/Modelo do ", j ,"° Automóvel : ", Automoveis.MAutomovel[i,j])
     escolha Automoveis.ValorLoc[i,j]
     caso 80,00
     escreval ("Descrição Da Classificação : Básico ")
     escreval ("Valor Da Locação : R$ 80,00 ", )
     caso 150,00
     escreval ("Descrição Da Classificação : Intermediário ")
     escreval ("Valor Da Locação : R$ 150,00 ", )
     caso 300,00
     escreval ("Descrição Da Classificação : Executivo ")
     escreval ("Valor Da Locação : R$ 300,00 ", )
     fimescolha
     fimpara
escreval ("Valor Total Da Locação : R$ ", Clientes.Soma[i])
fimpara
Fimalgoritmo

 

É para um trabalho semestral que eu preciso entregar em no máximo duas semanas, então eu preciso resolver esse problema o mais rápido possível. Conto com a ajuda de vocês e agradeço desde já pela atenção.

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

  • Membro VIP

Olá @LuisGCarv.

 

Você confundiu o vetor com um campo desse vetor (ou apenas está usando uma si). Ex.:

 

2 horas atrás, LuisGCarv disse:

Clientes.Codigo[i] := i + 1000
escreval ("Digite o nome do cliente :")
leia (Clientes.NCliente[i])
escreval ("Digite o número de automóveis que o cliente pretende cadastrar :")
leia (p)
     para j de 1 ate p faca
     escreval ("Digite o nome da marca/modelo do ", j ,"° automóvel ")
     leia (Automoveis.MAutomovel[i,j])

 

Veja como definiu:

Clientes : Vetor [1..100] de Clientela

Ou seja, Clientes é um vetor do tipo Clientela.  Na primeira linha, o Clientes é que é vetor. O NCliente é apenas um "campo", de uma posição desse vetor. Logo, serial algo assim:

Clientes[i].Codigo:=i + 1000

o mesmo para o restante, como por exemplo:

 

leia (Automoveis[i,j].MAutomovel)

A matriz está a esquerda.. uma posição dessa matriz tem o "campo" MAutomovel". Como tá lá no seu código, ficou como se Clientes fosse apenas uma variável comum, e um campo dele fosse uma matriz, entende?

 

 

ADENDO:

Sobre as nomenclaturas...

 

Para um campo de um registro, não precisa repetir a identificação... é implícita. Ex.:

Tipo
   Clientela = registro
      Codigo:inteiro
      Nome  :caractere //perceba que apenas se chamar de "Nome", para acessar usuário, por exemplo, "cliente[i].nome". Sei que esse nome é desse "objeto"
      Soma  :real
   fimregistro

   Carros = registro
      Nome     :caractere //aqui inserir propositalmente a mesma nomenclatura para demonstrar, mas ela não tema nada a ver com a outra... esse nome é do Carro... não vai haver duplicidade de variáveis, entende? Exemplo de acesso: "Carro[2].nome"
      Modelo   :caractere
      ValorLoc :real
   fimregistro

 

 

No aguardo.

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

@Simon Viegas , muito obrigado pelos esclarecimentos!

O pior é que eu estava fazendo errado já faz algum tempo e eu nem sei porque, estou revendo na apostila e está da forma que você explicou, acho que foi pura falta de atenção. :mellow:

adicionado 1 minuto depois

Mas mesmo não tendo um vetor chamado NCliente, o programa aceitou daquela forma. Por quê?

Link para o comentário
Compartilhar em outros sites

  • 7 meses depois...
  • Membro VIP

Olá.

 

Eu acabei não respondendo na ocasião.. mas por um acaso me deparei com essa postagem... apesar de antiga, acho que vale o comentário.

 

Sobre:

Em 06/10/2017 às 19:32, LuisGCarv disse:

Mas mesmo não tendo um vetor chamado NCliente, o programa aceitou daquela forma. Por quê?

 

Bug! Simplesmente isso! Não vejo explicação lógica clara... o  Visuagl funciona como "ele quer", rs. De um modo geral, acho que o Visuagl tem alguns problemas com o uso de registro...

 

Vamos nos basear por esse código:

Em 06/10/2017 às 15:39, LuisGCarv disse:

leia (Clientes.NCliente[i])

 

Em relação ao Visualg temos 2 erros de sintaxe:

1- Clientes é um vetor, logo precisa do [] para indicar a posição.

2- NCliente não é um vetor, é apenas um caracter, logo não pode usar []. obs.: em algumas linguagens, como Pascal, uma string  (análogo ao caractere), mesmo não sendo um vetor, pode ser acessado usado um [], ou seja, lá funciona ao mesmo tempo como um vetor de char (um caractere de uma posição). O [] serve para acessar determinada posição do "frase". Mas não vem ao caso se aprofundar agora.

 

Em relação a NÃO dá erro ou algo do tipo, temos:

1- O Visualg meio que não compila o código, apenas o roda, ou seja, os possíveis erros de sintaxe são identificados (ou não!) em tempo de execução; Em outras linguagens mais populares, logo ao tentar compilar, já acusa os erros. Só roda se a sintaxe estiver correta (regras da linguagem).

2- O Visualg tem um comportamento nebuloso... como citado mais acima, ele parece que funciona como quer... de fato o comando [] não funciona para o tipo caractere. Acho que o [] serve apenas para vetores mesmo...

 

 

 

 

 

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

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!