Ir ao conteúdo
  • Cadastre-se

Problema com vetor


Visitante: RodneyPipoca

Posts recomendados

Visitante: RodneyPipoca
 

Olá pessoal, será que alguem pode me dar uma luzinha???

Fiz o codigo mas na hora de rodar dá erro, pedindo duas dimensões pro vetor...

estou perdido, pois acho que já coloquei-as?

Pelo amor dos seus bixinhos,,,Help!!

PROGRAM VETOR;
USES CRT;
TYPE
PT_EST=^ESTANTE;
LIVRO = RECORD
TITULO:STRING;
AUTOR:STRING;
CODIGO:STRING;
PROX:LIVRO;
END;

PRAT=array [1..20] of LIVRO;


ESTANTE= RECORD
PRATELEIRA:ARRAY [1..5]OF PRAT;
END;



VAR
PRATS :PRAT;
P:PT_EST;
EXCLUI_LIVRO,OP,j,indice_ESTANTE,INDICE_LIVROS,indice_prateleira:INTEGER;
L:LIVRO; NOME:STRING;


PROCEDURE INSERE;
VAR PRATS:PRAT; L:LIVRO;
indice_livros, INDICE_PRATELEIRA:INTEGER;
FIM_LIVROS, FIM_PRATELEIRA:INTEGER;
P:PT_EST; COD:CHAR;
BEGIN
CLRSCR;
INDICE_LIVROS:=0;
INDICE_PRATELEIRA:=0;
FIM_LIVROS:=0;
FIM_PRATELEIRA:=0;
REPEAT
BEGIN
WRITELN ('DIGITE O TITULO DO LIVRO');
READLN (L.TITULO);
WRITELN;
WRITELN ('DIGITE O NOME DO AUTOR');
READLN (L.AUTOR);
WRITELN;
WRITELN('INFORME QUAL O CODIGO DO LIVRO');
READLN (L.CODIGO);
FIM_LIVROS:=1;
FOR INDICE_LIVROS:=1 TO FIM_LIVROS DO
BEGIN
PRATS [INDICE_LIVROS].TITULO:=L.TITULO;
PRATS [INDICE_LIVROS].AUTOR:=L.AUTOR;
PRATS [INDICE_LIVROS].CODIGO:=L.CODIGO;
END;
IF (FIM_LIVROS)<=20 THEN
BEGIN
FIM_PRATELEIRA:=FIM_PRATELEIRA+1;
END;

FOR INDICE_PRATELEIRA:=1 TO FIM_PRATELEIRA DO
BEGIN
P^.PRATELEIRA[INDICE_PRATELEIRA]:= PRATS;
END;
IF INDICE_PRATELEIRA>=5 THEN
BEGIN
WRITELN ('ESTANTE CHEIA!!!');
END;

WRITELN;
WRITELN('DESEJA CONTINUAR? S/N');
READLN (COD);
IF COD='S' THEN
BEGIN
FIM_LIVROS:=FIM_LIVROS+1;
END;

UNTIL (COD='N');
END;


PROCEDURE EXCLUIR; VAR EXCLUI_LIVRO,INDICE_LIVROS,I,j:INTEGER;
BEGIN
CLRSCR;
WRITELN ('PARA EXCLUIR O PRIMEIRO LIVRO DIGITADO DIGITE SUA LOCALIZACAO:');
READLN ( EXCLUI_LIVRO);
FOR INDICE_PRATELEIRA:=1 TO 3 DO
BEGIN

END;

END;

PROCEDURE IMPRIME; VAR I:INTEGER; P:PT_EST; FIM_PRATELEIRA,INDICE_PRATELEIRA,INDICE_LIVROS:INTEGER;L:LIVRO;

BEGIN

CLRSCR;
WRITELN ('* - ABAIXO OS LIVROS JA CADASTRADOS - *');
NEW(P);
FOR INDICE_PRATELEIRA:=1 TO FIM_PRATELEIRA DO
BEGIN
[COLOR="Red"]writeln(p^.prateleira [indice_prateleira].prats {aqui que dá erro}[indice_livros].titulo);[/COLOR]

WRITELN;
WRITELN;
WRITELN ('*----------------------------------------*');
WRITELN;
END;


READKEY;
END;


procedure menu;
begin
REPEAT
WRITELN ('E S C O L H A U M A O P C A O');
WRITELN;
WRITELN ('1 - PARA CADASTRAR LIVROS');
WRITELN ('2 - PARA VER OS LIVROS CADASTRADOS');
WRITELN ('3 - PARA EXCLUIR LIVROS');
WRITELN ('4 - PARA SAIR DO PROGRAMA');



READLN (OP);

CASE OP OF
1: INSERE;

2: BEGIN
IMPRIME;
END;

3: EXCLUIR;
END;{FIM CASE}



UNTIL (OP=4);
end;


BEGIN {PROGRAMA PRINCIPAL}
CLRSCR;
menu;
END.

ficou meio grande mas é que eu estou aprendendo...

Link para o comentário
Compartilhar em outros sites

Nunca trabalhei com apontadores. Para mim são uma dor de cabeça. Você está a cometer um erro que consiste em duplicar os nomes das variaveis. Se bem me lembro, quando o programa usa uma varivel, ele considera a variavel global e não a local. Essa poderá ser uma das razões. No entanto, parece-me que existe um erro mais acima de onde você diz. Veja esta mensagem:

msgz.png

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá pessoal, será que alguem pode me dar uma luzinha???

Fiz o codigo mas na hora de rodar dá erro, pedindo duas dimensões pro vetor...

estou perdido, pois acho que já coloquei-as?

Pelo amor dos seus bixinhos,,,Help!!

PROGRAM VETOR;

USES CRT;

TYPE

PT_EST=^ESTANTE;

LIVRO = RECORD

TITULO:STRING;

AUTOR:STRING;

CODIGO:STRING;

PROX:LIVRO;

END;

PRAT=array [1..20] of LIVRO;

ESTANTE= RECORD

PRATELEIRA:ARRAY [1..5]OF PRAT;

END;

VAR

PRATS :PRAT;

P:PT_EST;

EXCLUI_LIVRO,OP,j,indice_ESTANTE,INDICE_LIVROS,indice_prateleira:INTEGER;

L:LIVRO; NOME:STRING;

PROCEDURE INSERE;

VAR PRATS:PRAT; L:LIVRO;

indice_livros, INDICE_PRATELEIRA:INTEGER;

FIM_LIVROS, FIM_PRATELEIRA:INTEGER;

P:PT_EST; COD:CHAR;

BEGIN

CLRSCR;

INDICE_LIVROS:=0;

INDICE_PRATELEIRA:=0;

FIM_LIVROS:=0;

FIM_PRATELEIRA:=0;

REPEAT

BEGIN

WRITELN ('DIGITE O TITULO DO LIVRO');

READLN (L.TITULO);

WRITELN;

WRITELN ('DIGITE O NOME DO AUTOR');

READLN (L.AUTOR);

WRITELN;

WRITELN('INFORME QUAL O CODIGO DO LIVRO');

READLN (L.CODIGO);

FIM_LIVROS:=1;

FOR INDICE_LIVROS:=1 TO FIM_LIVROS DO

BEGIN

PRATS [iNDICE_LIVROS].TITULO:=L.TITULO;

PRATS [iNDICE_LIVROS].AUTOR:=L.AUTOR;

PRATS [iNDICE_LIVROS].CODIGO:=L.CODIGO;

END;

IF (FIM_LIVROS)<=20 THEN

BEGIN

FIM_PRATELEIRA:=FIM_PRATELEIRA+1;

END;

FOR INDICE_PRATELEIRA:=1 TO FIM_PRATELEIRA DO

BEGIN

P^.PRATELEIRA[iNDICE_PRATELEIRA]:= PRATS;

END;

IF INDICE_PRATELEIRA>=5 THEN

BEGIN

WRITELN ('ESTANTE CHEIA!!!');

END;

WRITELN;

WRITELN('DESEJA CONTINUAR? S/N');

READLN (COD);

IF COD='S' THEN

BEGIN

FIM_LIVROS:=FIM_LIVROS+1;

END;

UNTIL (COD='N');

END;

PROCEDURE EXCLUIR; VAR EXCLUI_LIVRO,INDICE_LIVROS,I,j:INTEGER;

BEGIN

CLRSCR;

WRITELN ('PARA EXCLUIR O PRIMEIRO LIVRO DIGITADO DIGITE SUA LOCALIZACAO:');

READLN ( EXCLUI_LIVRO);

FOR INDICE_PRATELEIRA:=1 TO 3 DO

BEGIN

END;

END;

PROCEDURE IMPRIME; VAR I:INTEGER; P:PT_EST; FIM_PRATELEIRA,INDICE_PRATELEIRA,INDICE_LIVROS:INTEGER;L:LIVRO;

BEGIN

CLRSCR;

WRITELN ('* - ABAIXO OS LIVROS JA CADASTRADOS - *');

NEW(P);

FOR INDICE_PRATELEIRA:=1 TO FIM_PRATELEIRA DO

BEGIN

writeln(p^.prateleira [indice_prateleira].prats {aqui que dá erro}[indice_livros].titulo);

WRITELN;

WRITELN;

WRITELN ('*----------------------------------------*');

WRITELN;

END;

READKEY;

END;

procedure menu;

begin

REPEAT

WRITELN ('E S C O L H A U M A O P C A O');

WRITELN;

WRITELN ('1 - PARA CADASTRAR LIVROS');

WRITELN ('2 - PARA VER OS LIVROS CADASTRADOS');

WRITELN ('3 - PARA EXCLUIR LIVROS');

WRITELN ('4 - PARA SAIR DO PROGRAMA');

READLN (OP);

CASE OP OF

1: INSERE;

2: BEGIN

IMPRIME;

END;

3: EXCLUIR;

END;{FIM CASE}

UNTIL (OP=4);

end;

BEGIN {PROGRAMA PRINCIPAL}

CLRSCR;

menu;

END.

ficou meio grande mas é que eu estou aprendendo...

Nunca trabalhei com apontadores. Para mim são uma dor de cabeça. Você está a cometer um erro que consiste em duplicar os nomes das variaveis. Se bem me lembro, quando o programa usa uma varivel, ele considera a variavel global e não a local. Essa poderá ser uma das razões. No entanto, parece-me que existe um erro mais acima de onde você diz. Veja esta mensagem:

msgz.png

Olá,

Aqui comigo já deu erro na declaração do type.

TYPE
PT_EST=^ESTANTE;
[COLOR="Red"]LIVRO[/COLOR] = RECORD
TITULO:STRING;
AUTOR:STRING;
CODIGO:STRING;
[COLOR="Red"]PROX:LIVRO;[/COLOR]
END;

Eu entendendo também que não seja possível declarar um campo no record que seja do tipo do próprio record, mas sim de "um ponteiro de record", ou seja, um record não pode ter a si mesmo, a não ser que seja por ponteiro.

Eu acredito que o correto seria algo assim:

TYPE
[COLOR="Blue"] P_LIVRO = ^nodo_LIVRO;[/COLOR] {ponteiro de livro}
nodo_LIVRO = RECORD {estrutura de um nodo livro - cada noh da estrutura}
TITULO :STRING; {titulo do livro}
AUTOR :STRING; {autor do livro}
CODIGO :STRING; {codigo do livro}
[COLOR="Blue"]PROX _LIVRO;[/COLOR] {enderenco na memoria do proximo livro}
END;

Percebam a diferença. Neste caso o "próximo" elemento seria "um nodo" de livro, ou seja, o próximo livro da estante. Essa estrutura deveria funcionar assim: Cada livro tem seus dados (Título, Autor, Código) e um campo que diz onde está o próximo livro (prox). Desta forma faz-se uma estrutura onde cada livro deverá ter o endereço do livro do "lado", assim para chegar no terceiro, por exemplo, vai pro primeiro, olha onda está o segundo, e vai, no segundo olha onde está o terceiro e vai...

Eu acredito que você está fazendo uma estrutura incoerente, ou seja, o "erro" está logo na declaração dos tipo e variáveis, logo a estrutura do programa vai herdar esse erro...

Veja esse trecho por exemplo:


PRAT = [COLOR="Red"]ARRAY [1..20][/COLOR] OF LIVRO;

ESTANTE = RECORD
PRATELEIRA:[COLOR="Red"]ARRAY [1..5][/COLOR] OF PRAT;
END;

Se você está usando arrays para os livros e para as prateleiras para que você está usando ponteiros?????

Uma das característica para usar os ponteiros é justamente a utilidade de criar arrays com tamanhos variados... ou seja, para casos onde não se sabe a quantidade de elementos a ser inseridos.

Abaixo fiz um exemplo de estrutura de como poderia ser usado:

PROGRAM VETOR;

USES
CRT;

TYPE
P_LIVRO = ^nodo_LIVRO; {ponteiro de livros}
nodo_LIVRO = RECORD {estrutura de um nodo livro - cada noh da estrutura}
TITULO :STRING; {titulo do livro}
AUTOR :STRING; {autor do livro}
CODIGO :STRING; {codigo do livro}
PROX _LIVRO; {enderenco na memoria do proximo livro}
END;

T_LIVROS = RECORD {tipo livros}
QTD :WORD; {quantidade de livros cadastrados}
DADOS:P_LIVRO; {dados do primeirolivro cadastrado}
END;

P_PRATELEIRA = ^nodo_PRATELEIRA; {estrutura de um nodo prateleira}
nodo_PRATELEIRA = RECORD
CODIGO :STRING; {codigo do prateleira}
LIVROS :T_LIVROS; {primeiro livro da estante}
PROX _PRATELEIRA; {endereco na memoria da proxima
prateleira}
END;



T_ESTANTE = RECORD
QTD :WORD; {quantidade de prateleiras já cadastradas}
DADOS _PRATELEIRA; {dados da primeira prateleira cadastrada}
END;

PROCEDURE IMPRIMIR_LIVRO(L:P_LIVRO);
BEGIN
WRITELN('TITULO : ',L^.TITULO);
WRITELN('AUTOR : ',L^.AUTOR);
WRITELN('CODIGO : ',L^.CODIGO);
END;


PROCEDURE IMPRIMIR_ESTANTE(E:T_ESTANTE);
VAR
LIVROS :T_LIVROS;
I :WORD;

BEGIN
IF E.DADOS^.LIVROS.QTD > 0 THEN
BEGIN
LIVROS:=E.DADOS^.LIVROS;
LIVROS.DADOS:=LIVROS.DADOS^.PROX; {vai pro primeiro (o atual é o ultimo)}
WRITELN(' LIVROS NESTA ESTANTE');
WRITELN;
FOR I:=1 TO LIVROS.QTD DO
BEGIN
WRITELN(LIVROS.DADOS^.TITULO);
LIVROS.DADOS:=LIVROS.DADOS^.PROX;
END;
END
ELSE
WRITELN('ESTANTE VAZIA');
READKEY;
END;


PROCEDURE INSERIR_LIVRO(VAR E:T_ESTANTE);
VAR
LIVRO _LIVRO;
BEGIN
WRITELN('QTD DE PRATELEIRAS CADASTRADAS :',E.QTD);
WRITELN('CODIGO DA PRATELEIRA ATUAL :',E.DADOS^.CODIGO);
WRITELN('QTD DE LIVROS NESTA PRATELEIRA :',E.DADOS^.LIVROS.QTD);

{coleta dados do livro}
NEW(LIVRO); {cria um novo livro (novo nodo - ponteiro)}
WRITELN;
WRITELN('INFORME OS DADOS DO LIVRO');
WRITELN;
WRITE('TITULO :'); READLN(LIVRO^.TITULO);
WRITE('AUTOR :'); READLN(LIVRO^.AUTOR);
WRITE('CODIGO :'); READLN(LIVRO^.CODIGO);

{INSERIR LIVRO NA ESTANTE}
IF E.DADOS^.LIVROS.QTD<>0 THEN {se não é o primeiro livro}
BEGIN
LIVRO^.PROX := E.DADOS^.LIVROS.DADOS^.PROX; {entra no fim da fila}
E.DADOS^.LIVROS.DADOS^.PROX := LIVRO; {o proximo do livro anterior passa
ser o livro atual}
E.DADOS^.LIVROS.DADOS := LIVRO; {o atual passar ser o livro}
END
ELSE {caso seja o primeiro livro}
BEGIN
E.DADOS^.LIVROS.DADOS:=LIVRO; {'adiciona' o novo livro}
LIVRO^.PROX:=LIVRO; {aponta para ele mesmo}
END;
INC(E.DADOS^.LIVROS.QTD);
END;

PROCEDURE EXCLUIR(VAR E:T_ESTANTE);
BEGIN
WRITELN('EM CONSTRUCAO');
READKEY;
{implementar}
END;

PROCEDURE MENU(VAR E:T_ESTANTE);
VAR
OP :CHAR; {opcao escolhida}
BEGIN
REPEAT
CLRSCR;
TEXTCOLOR(15);

WRITELN ('E S C O L H A U M A O P C A O');
WRITELN;
WRITELN ('1 - PARA CADASTRAR LIVROS');
WRITELN ('2 - PARA VER OS LIVROS CADASTRADOS');
WRITELN ('3 - PARA EXCLUIR LIVROS');
WRITELN ('4 - PARA SAIR DO PROGRAMA');
READLN (OP);
CLRSCR;
CASE OP OF
'1': INSERIR_LIVRO(E);
'2': IMPRIMIR_ESTANTE(E);
'3': EXCLUIR(E);
END;{FIM CASE}
UNTIL (OP='4');
END;


PROCEDURE INICIAR_ESTANTE(VAR E:T_ESTANTE);
BEGIN
NEW(E.DADOS); {cria uma prateleira nova}
E.QTD:=0; {zera quantidade de estantes}



{adicionando uma prateleira nova (supondo que só terah uma)}
INC(E.QTD); {atualiza a quantidade de estantes}
E.DADOS^.CODIGO:=('PTL 1'); {codigo desta prateleira}
E.DADOS^.LIVROS.QTD:=0; {nenhum livro cadastrado}

{obs.: se for utilizar mais de uma prateleira tem que atualizar um pouco mais
o algoritmo, para tratar questoes por exemplo de como será o criterio de
como vai adicionar uma nova... saber em que prateleira vai ser
adicionando um livro (por categoria, por primeira letra em ordem alfabetica,
etc)}
END;

{VARIAVEIS GLOBAIS}
VAR
ESTANTE :T_ESTANTE;

BEGIN {PROGRAMA PRINCIPAL}
INICIAR_ESTANTE(ESTANTE);
MENU(ESTANTE);
END.

Se você observar bem o código verá que não é complicado. Basta mais ou menos entender como o Pascal acessar cada valor.

ex.:

Se for um campo de um record, usa-se "." (ponto);

Se for um campo de um ponteiro , usa-se "^" ("ponteiro");

E como acessa um campo de um record de um ponteiro?

Simples: "^." (ponteiro+ponto).

No caso, o "^" (ponteiro) funciona como um "atalho para o endereço da memória". Assim, por exemplo se poderia fazer:

LIVROS.DADOS^.PROX^.PROX^.PROX^.CODIGO;

"DADOS" é um endereço e "DADOS^" acessará o endereço;

"DADOS^.PROX" é o endereço do "próximo" que está no endereço "DADOS";

"DADOS^.PROX^.PROX" é um endereço do "próximo" que está em "DADOS^.PROX", que por sua vez está em "DADOS"...

O segredo dos ponteiros é entender esta lógica de o "^" significar "ir ou acessar ao endereço"... entendeu isso, matou o assunto!!

OBS.: Eu estou explicando esse assunto com minhas palavras, possa ser que me equivoque em algumas (muitas) coisas... podem ficar a vontade analisar e criticar.

UPDATE

Sobre o comentário de valecovo:

Você está a cometer um erro que consiste em duplicar os nomes das variaveis. Se bem me lembro, quando o programa usa uma varivel, ele considera a variavel global e não a local.

Pelo contrário, é possível "duplicar" os nomes sim das variáveis (globais x locais)... e no caso o compilador vai dar preferência justamente a variável local (o que vale é o que está mais perto).

PROGRAM GLOBAL_X_LOCAL;
VAR
X :INTEGER;

PROCEDURE TESTE;
VAR
X :INTEGER;
BEGIN
WRITELN('X DENTRO DE TESTE (direto) : ',X);{aqui tera 1 valor aleatorio}
X:=1000; {atribuindo um novo valor}
WRITELN('X DENTRO DE TESTE (modificado) : ',X);
END;

BEGIN
X:=-10;
WRITELN('X ANTES DO TESTE : ',X);
TESTE;
WRITELN('X DEPOIS DO TESTE : ',X); {o valor deve permanecer o mesmo}
READLN;
END.

A ideia das variáveis locais é justamente tentar não mexer com as globais. Assim cada procedimento terá as suas próprias variáveis, mesmo que vários procedimentos usem o mesmo tipo... e no caso, quando necessitam de um valor global é recomendado passar esse valor por parâmetro.

Só relembrando uma dica:

Prefiram colocar as variáveis globais logo acima do begin principal... (como no meu exemplo do livro)

Abraços

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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...

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

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!