Ir ao conteúdo
  • Cadastre-se

Pascal/Delphi Correção de provas usando texto e registros.


Posts recomendados

Program TN03testes;

uses crt, modulos;

		 
var		vett10:vetor;
			vet1t10:vet1;
			arqi:file of regis;
			ctv,ctp,es,a,poc,PAG,tv:integer;
			reg:regis;
			aux:cc;

PROCEDURE CABECA(ord:string[32]);{MODULO ESPECIFICO PARA ESTE PROGRAMA}
BEGIN
 CLRSCR ;
 PAG:=PAG+1;
 WRITELN('                         RELATORIO GERAL - ORDEM ',ord,'              PAGINA:',PAG:3);
 WRITELN;
 write('  ORD  NUM N O M E                              ===C P F=== NASCIMENTO CS  N1');
 WRITELN('  N2  N3  N4  SO  CG CC CV');

begin
 clrscr;
 CABECA(ord);
	poc:=ctv;
  for ctp:=1 to poc do
  	begin
  	seek(arqi,vett10[ctp].pf);
  	read(arqi,reg);
   		begin
   		tv:=tv+1;
     	writeln(tv:5,reg.num:5,' ',reg.NOME,' ',reg.cpf,' ',copy(reg.data,7,2),'/',copy(reg
			.data,5,2),'/',copy(reg.data,1,4),reg.car:3,reg.n1:4,reg.n2:4,reg.N3:4
     	,reg.N4:4,reg.so:4,reg.clg:4,reg.clc:3,reg.ccl:3 );  
     	if(tv MOD 40 = 0)THEN
      	BEGIN
       	readln;
       	CABECA(ord);
     		END;
    	end;
  close(arqi);
  writeln('Registros Lidos: ',tv:5);
   end;
end;
end;
procedure ordenanum(onum:string[32]);
BEGIN
//Monta o vetor usando o campo chave como número!!!
assign(arqi,'CAND.ind');
reset(arqi);
		readln(arqi,reg);
while not(eof(arqi)) do
	begin
	
			begin
			ctv:=1;
			vett10[a].pf:=ctv;
			seek(arqi,vett10[a].pf);
			Str(reg.num:4,vett10[a].c_chave);
			ctv:=ctv+1;
			end;
	end;
//Chama ordenacao
ordem(vett10,ctv);
 //Apresenta na tela o resultado conforme o arquivo LEDIR
CABECA(onum);
end;

procedure ordenanome(onum:string[32]);
BEGIN
//Monta o vetor usando o campo chave como número!!!
assign(arqi,'CAND.ind');
reset(arqi);
read(arqi,reg);
while not(eof(arqi)) do
	begin
	  
			ctv:=ctv+1;
		 	vett10[a].pf:=ctv;
			vett10[a].c_chave:=reg.nome;
			seek(arqi,vett10[a].pf);
			read(arqi,reg);
	end;
//Chama ordenacao
ordem(vett10,ctv);
 //Apresenta na tela o resultado conforme o arquivo LEDIR
CABECA(onum);
end;

procedure ordenacpf(onum:string[32]);
BEGIN
//Monta o vetor usando o campo chave como número!!!
assign(arqi,'CAND.ind');
reset(arqi);
read(arqi,reg);
while not(eof(arqi)) do
	begin
	
			ctv:=ctv+1;
		 	vett10[a].pf:=ctv;
			vett10[a].c_chave:=reg.cpf;
			seek(arqi,vett10[a].pf);
			read(arqi,reg);
	end;
//Chama ordenacao
ordem(vett10,ctv);
 //Apresenta na tela o resultado conforme o arquivo LEDIR
CABECA(onum);
end;

procedure ordenadata(onum:string[32]);
BEGIN
//Monta o vetor usando o campo chave como número!!!
assign(arqi,'CAND.ind');
reset(arqi);
read(arqi,reg);
while not(eof(arqi)) do
	begin
	
			ctv:=ctv+1;
		 	vett10[a].pf:=ctv;
			vett10[a].c_chave:=reg.data;
			seek(arqi,vett10[a].pf);
			read(arqi,reg);
	end;
//Chama ordenacao
ordem(vett10,ctv);
 //Apresenta na tela o resultado conforme o arquivo LEDIR
CABECA(onum);
end;

procedure ordenacar(onum:string[32]);
BEGIN
//Monta o vetor usando o campo chave como número!!!
assign(arqi,'CAND.ind');
reset(arqi);
read(arqi,reg);
while not(eof(arqi)) do
	begin
	
			ctv:=ctv+1;
		 	vett10[a].pf:=ctv;
			Str(reg.car:1,vett10[a].c_chave);
			seek(arqi,vett10[a].pf);
			read(arqi,reg);
	end;
//Chama ordenacao
ordem(vett10,ctv);
 //Apresenta na tela o resultado conforme o arquivo LEDIR
CABECA(onum);
end;
//Comeca o Programa
BEGIN
WRITELN('+++++++++++++++++++++++++++++++++++++++++++++++');
WRITELN('              BEM VINDO A PESQUISA             ');
WRITELN('+++++++++++++++++++++++++++++++++++++++++++++++');
WRITELN('DIGITE O NÚMERO DO TIPO DE ORDENACAO DESEJADA:');
WRITELN('1)Por Número de inscrição');
WRITELN('2)Por Nome');
WRITELN('3)Por CPF');
WRITELN('4)Por Data de Nascimento');
WRITELN('5)Por Cargo');
WRITE('R: ');
read(es);
if (es=1) or (es=01) then
	ordenanum('ORDENA POR NUMERO DE INSCRICAO');
if (es=2) or (es=02) then
	ordenanome('ORDENA POR NOME DE CANDIDATO');
if (es=3) or (es=03) then
	ordenacpf('ORDENA POR CPF');
if (es=4) or (es=04) then
	ordenadata('ORDENA POR DATA DE NASCIMENTO');
if (es=5) or (es=05) then
	ordenacar('ORDENA POR CARGO');

End.

esse é o 'MODULOS UNIT':

unit modulos;

interface
		 type
		 a36=string[36];
		 regis=record
      num:integer;
      nome:a36;
      cpf:string[11];
      data:string[8];
      car,n1,n2,n3,n4,so,clg,clc,ccl:integer
     end;
		 cc=record
      pf:integer;
      c_chave:a36;
     end;
     vetor=array[1..2000] of cc;
		 vet1=array[1..2000] of a36;

 PROCEDURE pebin1(vet:vetor;ext:a36;t:integer;VAR CC:INTEGER);
 function valdat(d,m,a:integer):boolean;
 function vercpf(num:string[11]):boolean;
 procedure ordea(var vet:vet1; t:integer);
 procedure ordem(var vet:vetor; t:integer);
implementation
//-----ordena vetor contento em cada posicao a estrutura registro PF+CAMPO CHAVE
procedure ordem(var vet:vetor; t:integer);
var aux:cc;
    tot,a,jt:integer;
    tro:boolean;
begin
 tot:=t;
 jt:=1;
 repeat
  tro:=true;
  tot:=tot-jt;
  for a:=1 to tot do
   if(vet[a].c_chave > vet[a+1].c_chave) then
    begin
     aux:=vet[a];
     vet[a]:=vet[a+1];
     vet[a+1]:=aux;
     tro:=false;
     jt:=1;
    end
   else
    jt:=jt+1;
 until tro;
end;
//-----ordena um vetor contendo em cada posicao um STRING[36]
procedure ordea(var vet:vet1; t:integer);
var aux:a36;
    tot,a,jt:integer;
    tro:boolean;
begin
 tot:=t;
 jt:=1;
 repeat
  tro:=true;
  tot:=tot-jt;
  for a:=1 to tot do
   if(vet[a] > vet[a+1]) then
    begin
     aux:=vet[a];
     vet[a]:=vet[a+1];
     vet[a+1]:=aux;
     tro:=false;
     jt:=1;
    end
   else
    jt:=jt+1;
 until tro;
end;
//------valida uma data
function valdat(d,m,a:integer):boolean;
   var dm:integer;
       DAT:BOOLEAN;
BEGIN
   DAT:=TRUE;
   IF(A<1900)THEN  //ano
    DAT:=FALSE
   ELSE
    IF(M<1) OR (M>12) THEN  //mes
     DAT:=FALSE
    ELSE
     BEGIN //dia
      DM:=31;
      IF(M=4) OR (M=6) OR (M=9) OR (M=11) THEN  //meses com 30 dias
       DM:=30;
      IF(M=2) THEN //fevereiro
       BEGIN
        DM:=28;
        IF(A MOD 4) = 0 THEN  //bissesto
         DM:=29;
       end;
      IF(D<1) OR (D>DM) THEN
       DAT:=FALSE
      END;
    valdat:=dat;
  END;
//-----pequisa binaria

PROCEDURE pebin1(vet:vetor;ext:a36;t:integer;VAR CC:INTEGER);
var ii,i9,meio:integer;
    achou:boolean;
begin
 achou:=false;
 ii:=1;
 i9:=t;
 repeat
  meio:=(ii+i9) div 2;
  if(ext = vet[meio].c_chave)then
	  achou:=true
  else
   if(ext > vet[meio].c_chave)then
    ii:=meio+1
   else
    i9:=meio-1;
 until ((achou) OR (ii > i9));
 if( achou ) then
  CC := meio
 else
  CC := 0;
end;
//-----valida CPF
function vercpf(num:string[11]):boolean;
var vet:array[1..11] of integer;
    dvs:array[1..2] of integer;
    som,a,b,e,f,m,r:integer;
    aux:boolean;
begin
 aux:=true;
 for a:=1 to 11 do
  val(num[a],vet[a],e);{o string "num" já vem validado}
 f:=8;
 m:=10;
 a:=0;
 repeat
   som:=0;
   a:=a+1;
	 f:=f+1;
	 m:=m+1;
	 for b:=1 to f do
	  som:=som+vet[b]*(m-b);
   r:=som mod 11;
   dvs[a]:=11-r;
   if(r<2)then
    dvs[a]:=0;
   if(vet[m-1] <> dvs[a])then
    aux:=false;
 until ((a=2) or (not aux));
 vercpf:=aux;
end;
end.

trabalho da faculdade.
Quando tento executar o primeiro code ele me diz "A posição 0 esta fora dos limites do vetor!",alguém pode me ajudar? (tudo foi compilado no pascalzim).

Essa é minha primeira vez postando,desculpe se cometi algum erro.

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

  • Membro VIP
27 minutos atrás, Lucas Pelepek disse:

Quando tento executar o primeiro code ele me diz "A posição 0 esta fora dos limites do vetor!",alguém pode me ajudar? (tudo foi compilado no pascalzim).

 

O erro completo.

 

obs.: faltou postar os dados do arquivo.

 

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Faltou informar qual o erro estava dando...

 

 

Vamos lá:

 

1#

Sobre:

3 horas atrás, Lucas Pelepek disse:

Quando tento executar o primeiro code ele me diz "A posição 0 esta fora dos limites do vetor!",alguém pode me ajudar? (tudo foi compilado no pascalzim).

 

Aqui deu linha 56... nesse trecho:

3 horas atrás, Lucas Pelepek disse:
3 horas atrás, Lucas Pelepek disse:


vett10[a].pf:=ctv;

 

Ou seja,  está tentando acessar a posição 0 do vet10. Existe a posição 0 nesse vetor?

 

Veja que está usando a variável a. E nesse momento ela está com o valor 0.

 

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

  • Membro VIP

 

@Lucas Pelepek, sempre poste o erro completo... lá no Pascal Zim ele diz o que aconteceu!!!

 

 

Vamos lá.... sobre:

15 horas atrás, Lucas Pelepek disse:

colocando 'a:=1' faz o programa não continuar o loop, na linha 62 "ctv:=ctv+1;".

 

E o valor de a é para ter 1 mesmo? (obs: é uma pergunta retórica!!! ou seja, NÃO É PARA TER ESSE VALOR!)

 

Vamos lá! O trecho a ser analisado é esse:

procedure ordenanum(onum:string[32]);
BEGIN
//Monta o vetor usando o campo chave como número!!!
assign(arqi,'CAND.ind');
reset(arqi);
		readln(arqi,reg);
while not(eof(arqi)) do
	begin
	
			begin
			ctv:=1;
			vett10[a].pf:=ctv;
			seek(arqi,vett10[a].pf);
			Str(reg.num:4,vett10[a].c_chave);
			ctv:=ctv+1;
			end;
	end;
//Chama ordenacao
ordem(vett10,ctv);
 //Apresenta na tela o resultado conforme o arquivo LEDIR
CABECA(onum);
end;

 

A primeira coisa a se fazer é organizar... a dica é simples: O CÓDIGO SEMPRE DEVE FICAR INDENTADO E ORGANIZADO... ex.:

procedure ordenanum(onum:string[32]);
  begin
  //Monta o vetor usando o campo chave como número!!!
  assign(arqi,'CAND.ind');
  reset(arqi);
  readln(arqi,reg);
  while not(eof(arqi)) do
    begin
    ctv:=1;
    vett10[a].pf:=ctv;
    seek(arqi,vett10[a].pf);
    Str(reg.num:4,vett10[a].c_chave);
    ctv:=ctv+1;
    end;
  ordem(vett10,ctv); //chama ordenacao
  cabeca(onum); //apresenta na tela o resultado conforme o arquivo LEDIR
  end;

Perceba que visualmente já dá para analisar... no mínimo já veria que tinha 2 begin/end no while. :)

 

Então, esse while faz o quê? pelo que entendi, está "preenchendo um vetor com dados de um arquivo"... correto? ou seja, coloca os dados num vetor, e para depois ser ordenado.

 

A questão é: quais valores a variável a deveria ter ali dentro do while? Ou seja, se quer preencher o vetor, provavelmente ele vai de 1 em diante... ela vai sendo atualizada a cada loop... caso registro lido vai para uma posição diferente.

 

 

 

 

No aguardo.

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

vou identar nas próximas  :);

 

Isso,ele preenche aquele vetor com os dados do CAND.IND ,mais especificamente com o numero de inscrição.

 

colocando assim:
 

begin
    
    //ctv:=1;
    a:=(reg.num);
		vett10[a].pf:=ctv;    
    seek(arqi,vett10[a].pf);
    Str(reg.num:4,vett10[a].c_chave);
    
    ctv:=ctv+1;
    
  end;

ele até roda,mas fica num loop infinito  na : PROCEDURE CABECA.
:mellow: 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1#

Sobre:

29 minutos atrás, Lucas Pelepek disse:

vou identar nas próximas  :);

 

Por que não indentar desde já? ex.:

begin
//ctv:=1;
a:=(reg.num);
vett10[a].pf:=ctv;    
seek(arqi,vett10[a].pf);
Str(reg.num:4,vett10[a].c_chave);
ctv:=ctv+1;
end;

 

 Por que a fica igual a reg.num? O que seria esse reg.num?

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

  • Membro VIP

@Lucas Pelepek, pense assim... vamos tentar abstrair os contextos... Veja... a base no seu programa está na "ordenação de vetores de registros", ou seja, você tem um determinado vetor e precisa ordenar de algumas formas diferentes, beleza?

 

Tá, acontece que os dados dos vetores não estão no código, e nem você vai ficar digitando um por um... ai o que foi feito? existe um arquivo binário contendo todos os dados que você precisa... ou seja, a finalidade do arquivo está em basicamente alimentar o vetor. É uma forma de "persistir os dados".

 

Resumidamente seria isso:

- carrega os dados do arquivo para o vetor;

- ordenada o vetor.

- faz mais o que seja...

 

 

Então, o que você precisa no momento é "carregar os dados do arquivo para o vetor", certo?

 

 

Como arquivos funcionam no Pascal?
Tá lá no pdf:

Citação

Os registros de CAND.IND podem ser acessados de forma direta, fazendo uma referência ao número da
posição física do registro dentro do arquivo.

 

Ou seja, a forma de acesso ao arquivo é por posição. Se tem 10 registros, eles vão ficar da posição 0 até a posição 9, certo? Se eu quero o registro número 5. Eu posiciono com o seek() na posição 4, correto?

 

Agora perceba (com voz do Prof. Procópio): você não quer acessar uma determinada posição, na verdade quer acessar todas, já que precisa jogá-las no vetor!!! Daí, estes estão em sequência... logo, não precisa ficar posicionando... apenas abre o arquivo e vai jogando no vetor.

 

RESUMINDO:

- abra o arquivo como leitura (reset());

- enquanto não for o fim do arquivo, leia um registro do arquivo e jogue no vetor;

 

obs.: veja, não precisa dar seek(). Ao abrir o arquivo, automaticamente vai para a posição 0...e ao dar read() no arquivo, vai automaticamente para próxima posição.

 

 

Tente implementar e poste os 2 código completo.

 

Caso tenha dúvidas, é só perguntar.

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

Opa,obrigado pela ajuda :).

acabei fazendo esse código de teste: 

Program ordenasonumero ;

uses modulos;

var

arqi:file of regis;
regi:regis;
c,a,tot:integer;
vet:vetor;

Begin
  
  assign(arqi,'cand.ind');
  reset(arqi);
  
  repeat
    read(arqi,regi);
    c:=c+1;
    vet[c].pf:=c-1; //c=indice do vetor; c-1=posicao fisica no arquivo
    str(regi.num:4,vet[c].c_chave);
  until (eof(arqi));
  tot:=c; //total de elementos do vetor
  ordem(vet,tot);
  
  for a:=1 to tot do //mostra na tela o ordenado
  begin
    writeln(vet[a].pf:5,' ',vet[a].c_chave);
    if(a mod 40) = 0 then
    readln;
  end;
  
  write(arqi,regi);
  close(arqi);
  
End.

Ele organiza pelo numero,como eu queria,mas agora não sei porque ele não está gravando isso no Cand.IND.
Quando olho o Cand ele continua igual ,não organizado por NUM.

Percebi que no cand.ind ele repetiu o ultimo numero executando esse programinha.

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

(trabalho da faculdade,tudo compilado usando pascalzim)

boa dia/tarde/noite
 

alguém poderia me dar uma luz em relação a este trabalho?

 

Program TxN04 ;

uses crt,modulos;

var br,er,prv,media,mediam,mediap,notam,notap:integer;
prvum,x,prvdo:text;
gab:array[1..50] of string;
corr:integer;
regi:regis;
resp:array[1..54] of string;
arqi:file of regis;
c,a,tot:integer;
vet:vetor;

Begin
  
  {Você receberá dois arquivos
  PROVA1.TXT = contém as respostas dos candidatos da primeira prova
  PROVA2.TXT = contém as respostas dos candidatos da segunda prova
  Ambos com as informações assim dispostas:
  01-04=inscrição;
  05-54=as 50 respostas (A,B,C,D,E, ou ESPAÇO (SEM RESPOSTA) OU * (MARCOU MAIS DE UMA
  OPÇÃO).}
  
  
{1:Antes de tudo, criar o vetor, a partir de CAND.IND, contendo o número de inscrição no campo
chave e a posição física ocupada pelo registro dentro do arquivo... (já foi feito este procedimento
no exercício 3). PORQUE???}


assign(arqi,'cand.ind');
reset(arqi);

repeat
  read(arqi,regi);
  c:=c+1;
  vet[c].pf:=c-1; //c=indice do vetor; c-1=posicao fisica no arquivo
  str(regi.num:4,vet[c].c_chave);
  
until (eof(arqi));

{2:Se você abriu o arquivo PROVA1.TXT ou PROVA2.TXT, verá que ambos estão em ordem de
número de inscrição, que não é a ordem em que os registros de CAND.IND estão gravados.
Como será necessário acessar o registro do candidato a partir do número de inscrição que está
nos arquivos de provas. Então usaremos o vetor para a partir do número de inscrição contido
nas respostas, descobrir qual a PF desta inscrição em CAND.IND, pois teremos que mostrar o
nome do candidato no relatório e teremos que atualizar os campos nota1 e nota2, quando da
correção da primeira prova e os campos nota3, nota4 e soma quando da correção da segunda
prova.}



{3:Perguntar qual prova será corrigida 1 ou 2??? (VALIDAR, o programa deve corrigir uma prova
por vez).}


repeat
  writeln ('qual prova será corrigida, 1 ou 2 ?');
  readln (prv);
until (prv=2) or (prv=1);

{4:Abrir o arquivo CAND.IND (RESET permite leitura e gravação)}


assign(arqi,'CAND.ind');
reset(arqi);

{5:Se a opção for 1 para correção, abrir PROVA1.TXT; se a opção for 2, abrir PROVA2.TXT.}

if (prv=1) then
x:=prvum;
assign (prvum,'PROVA1.TXT');
reset (prvum) ;
if (prv=2) then
x:=prvdo;
assign (prvdo,'PROVA2.TXT');
reset (prvdo);

{6. Ler o gabarito DO TECLADO, VALIDANDO (só pode ser A, B, C, D ou E) string[50]  }



writeln ('digite o gabarito');

repeat
  for corr:= 1 to 10 do
  readln (gab[corr]);
until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e');
writeln ('lol');

{7: Enquanto não fim do arquivo de prova  }


while not(eof(x)) do
begin
  
  {7.1: ler as respostas string[54]}
  
  read(x,regi);   //fala que quer dados primitivos!!
  
  
  {7.2:retirar o número de inscrição }
  
  resp:=[5..54];  ///????
  
  {7.3:  fazer pesquisa binária no vetor criado em 1 para descobrir a PF do num de inscr. Ver
  em MODULOS, quais informações de entrada e qual informação de saída da função
  que faz a pesquisa binária. }
  
  pebin1 ();
  
  {7.4: posicionar no CAND.IND (seek-para posicionar) e ler o registo (READ)  }
  
  seek(read.pf);
  
  {7.5: corrigir a prova}
  
  for a:= a+x to x+24 do
  readln (gab[a]);
  repeat
    if gab[a]=res[a+4] then
    ???
    else
    sf.(resp[a+4]=' ') then
    br:=br+1
    else
    er:=er+1;
    
    {7.6:calcular a nota}
    
    nota:=ce*4;
    x:=x+25;
    
    {7.7:somar a nota para cálculo da média}
    
    notap= ?
    notam= ?
    
    {7.8: se prova = 1, atualizar os campos nota1 e nota2; se prova =2, atualizar os campos
    nota3, nota4 e soma,no cand.ind}
    
    //??? sei que tem que atualizar n1,n2,n3,n4,mas como?
    
    {7.9: posicionar no CAND.IND (seek-para reposicionar) e gravar o registro (WRITE)}
    
    seek
    write(cand.ind)
    close (cand.ind)
    
    {8:mostrar as médias por disciplina...}
    
    mediap:=notap/portugues ;
    mediam:=notam/matematicas; }
    
  end;
End.

Ele requere (cand.ind,provas,Unit modulos);

o que está obviamente errado é o que eu não consigo desenvolver.

 

se alguém puder dar umas dicas.

a saída desse arquivo é pra sair igual a primeira foto do pdf (usando o ledir).

não sei se é permitido postar programas grandes como esse no fórum.

obrigado desde já.

programas necessarios.rar

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

  • Membro VIP

1#

Sobre:

5 horas atrás, Lucas Pelepek disse:

  repeat
    read(arqi,regi);
    c:=c+1;
    vet[c].pf:=c-1; //c=indice do vetor; c-1=posicao fisica no arquivo
    str(regi.num:4,vet[c].c_chave);
  until (eof(arqi));

 

Mesmo sabendo que terá pelo menos uma leitura, o mais adequado seria utilizar o while, ou seja, a verificação "se chegou ou não ao fim do arquivo" deve ser feito ANTES da primeira leitura...

 

 

 

2#

Sobre:

5 horas atrás, Lucas Pelepek disse:

Ele organiza pelo numero como eu queria, mas agora não sei porque ele não está gravando isso no Cand.IND.

 

Para gravar, é necessário gravar registro por registro... assim como para ler, teve que ler registro por registro.

 

Mas veja, pelo que eu vi não é para escrever nada no vetor... você não deve mexer no arquivo!

 

 

***

 

Então, pelo que eu entendi, o objetivo do programa é usar um vetor para ter um "índice dos registros". No caso da sugestão, pegar os nomes e as suas respectivas posições. Aí, ordena o vetor usando o nome como referência. Tendo esse índice ordenado, agora poderá ter acesso ao registros do arquivo em ordem alfabética.

 

Tá, mas como funciona esse tal de índice? ele serve para diminuir o custo operacional, ou seja, em vez de precisar criar um vetor com todos os dados do registro (que custaria muito mais para o computador), apenas cria uma com a chave que quer ordenar, e a posição onde está esta chave. Aí, quando precisar do restante do código, usa a chave que está no vetor para posicionar no arquivo e ler!!! :)

 

No seu código você não está exibindo os dados do vetor? perceba que só tem 1 dado (no caso o nome). Para ter acesso aos outros dados, você posiciona o arquivo com a posição física que está no vetor, ler o registro e exibe os dados do registro (não do vetor).

 

SUGESTÃO

- Após ter ordenado, em vez de exibir os dados do vetor, leia os dados do registro no arquivo e exiba INSCRIÇÂO, NOME, CPF e DATA.

 

 

 

adicionado 4 minutos depois

 

UPDATE 1

Fiz algumas alterações para servi de base:

Spoiler

program ordenasonumero;
uses
   modulos;
const
  //TAM = 5;  //quantidade de espaços reservados para imprimir na tela (se for usar a inscrição como chave)
  TAM = 36; //quantidade de espaços reservados para imprimir na tela (se for usar o nome como chave)
var
  arqi :file of regis; //arquivo que contém os registros
  regi :regis;         //para ler um registro do arquivo
  cont :integer;       //contador de registros já lidos
  {tot  :integer;}       //total de registro já lidos (NÃO NECESSÁRIO, PODE USR O PRÓPRIO CONT)
  vet  :vetor;         //vetor que armazenará um dos compos dos registros que estão no aruqivo E a sua respectiva posição física. 
  i    :integer;       //auxiliar para percorrer o vetor   (É MAIS COMUMENTE USADO)

BEGIN
  assign(arqi,'cand.ind'); //assinala o arquivo com seu respectivo caminho físico e seu nome com extensão
  reset(arqi);             //abre o arquivo para leitura e escrita, posicionando o ponteiro do arquivo no endereço zero. 

	{
  repeat
    read(arqi,regi);
    c:=c+1;
    vet[c].pf:=c-1; //c=indice do vetor; c-1=posicao fisica no arquivo
    str(regi.num:4,vet[c].c_chave);
  until (eof(arqi));
  }  
  
  //PREENCHE O VETOR COM OS DADOS DO ARUIVO
  writeln('Total de registro no aruqivo: ',FileSize(arqi));
  while not eof(arqi) do //enquanto não for o fim do arquivo
    begin
    read(arqi,regi);                   //ler o registro (obs.: o arquivo já ficará apontando para o próximo)
    cont:=cont+1;                      //atualiza o contador de registro já lidos
    vet[cont].pf:=cont-1;              //o vetor começa em 1, mas a posição fífica começa em 0
    {str(regi.num:4,vet[cont].c_chave);} //usa a inscrição como campo chave (que será usado para ordenada)
    vet[cont].c_chave:=regi.nome       //usa o nome como campo chave (que será usado para ordenada)
    end;    
  {tot:=cont;} //total de registros mo vetor VAI USAR O CONT
  writeln('Total de regisro no vetor   : ',cont);

  //ORDENA O VETOR PELO CAMPO DA CHAVE
  writeln;
  write  ('Ordenando...');
	ordem(vet,cont); 
	writeln;
	writeln('Numero de trocas ',numTrocas); //PRECISA ALTERAR A UNIT (QUALQUER COISA COLOQUE ESSA LINHA COMO COMENTÁRIO)
                                      
 //MOSTRA O VETOR ORDENADO
  writeln;
  writeln;
  writeln(' ':int(TAM/2-4),'CHAVE',' ':int(TAM/2-4),'POS. FISICA');
  writeln;
  for i:=1 to cont do
    begin
    {writeln(vet[i].pf:5,' ',vet[i].c_chave);} //tentar colocar como no pdf
    writeln(vet[i].c_chave:TAM,' ',vet[i].pf); //exibe os dados na tela
    if (i mod 40) = 0 then //para cada 40 registros
			readln; //dá um pause (aguard um ENTER no usuário)
    end;
  
  {write(arqi,regi);} //COMO JÁ COMENTADO, ESSE TRECHO ESTÁ ERRADO
  
  close(arqi); //fecha o arquivo  
END.

 

 

Daqui a pouco posto a UNIT reorganizada...

adicionado 16 minutos depois

 

UPDATE 2

Segue trecho da UNIT alterada:

Spoiler

//-----ordena vetor contento em cada posicao a estrutura registro PF+CAMPO CHAVE
procedure ordem(var vet:vetor; t:integer);
  var
    aux:cc;
    tot,a,jt:integer;
    tro:boolean;
  begin
  tot:=t;
  jt:=1;
  numTrocas:=0;
  repeat
    tro:=true;
    tot:=tot-jt;
    for a:=1 to tot do
      if (vet[a].c_chave > vet[a+1].c_chave) then
        begin
        numTrocas:=numTrocas+1;
        aux:=vet[a];
        vet[a]:=vet[a+1];
        vet[a+1]:=aux;
        tro:=false;
        jt:=1;
      end
   else
     jt:=jt+1;
  until tro;
end;

 

adicionado 19 minutos depois

 

UPDATE 3

Tentei dar uma arrumadinha em toda a UNIT.. para servi de base:

Spoiler

UNIT modulos;

INTERFACE
  type
     a36 = string[36];
     regis = record
       num :integer;    //número de inscrição
       nome:a36;        
       CPF :string[11];
       data :string[8];
       car,n1,n2,n3,n4,so,clg,clc,ccl:integer
     end;
     cc = record
       pf     :integer;
       c_chave:a36;
     end;
     vetor = array[1..2000] of cc;
     vet1  = array[1..2000] of a36;

var
  numTrocas :integer;

procedure pebin1 (vet:vetor;ext:a36;t:integer; var CC:integer);
function  valdat (d,m,a:integer):boolean;
function  vercpf (num:string[11]):boolean;
procedure ordea  (var vet:vet1; t:integer);
procedure ordem  (var vet:vetor; t:integer); 

IMPLEMENTATION 

//-----ordena vetor contento em cada posicao a estrutura registro PF+CAMPO CHAVE
procedure ordem(var vet:vetor; t:integer);
  var
    aux:cc;
    tot,a,jt:integer;
    tro:boolean;
  begin
  tot:=t;
  jt:=1;
  numTrocas:=0;
  repeat
    tro:=true;
    tot:=tot-jt;
    for a:=1 to tot do
      if (vet[a].c_chave > vet[a+1].c_chave) then
        begin
        numTrocas:=numTrocas+1;
        aux:=vet[a];
        vet[a]:=vet[a+1];
        vet[a+1]:=aux;
        tro:=false;
        jt:=1;
      end
   else
     jt:=jt+1;
	until tro;
end;

//-----ordena um vetor contendo em cada posicao um STRING[36]
procedure ordea(var vet:vet1; t:integer);
	var
	  aux:a36;
    tot,a,jt:integer;
    tro:boolean;
  begin
  tot:=t;
  jt:=1;
  repeat
    tro:=true;
    tot:=tot-jt;
    for a:=1 to tot do
      if (vet[a] > vet[a+1]) then
        begin
        aux:=vet[a];
        vet[a]:=vet[a+1];
        vet[a+1]:=aux;
        tro:=false;
        jt:=1;
        end
      else
        jt:=jt+1;
    until tro;
  end;
  
//------valida uma data
function valdat(d,m,a:integer):boolean;
  var
    dm:integer;
    DAT:boolean;
  begin
  DAT:=TRUE;
  if (a<1900) then  //ano
    DAT:=FALSE
  else
    if (M<1) or (M>12) then  //mes
      DAT:=FALSE
    else
      begin //dia
      DM:=31;
      if (M=4) or (M=6) or (M=9) or (M=11) then  //meses com 30 dias
        DM:=30;
      if (M=2) then //fevereiro
        begin
        DM:=28;
        if (A MOD 4) = 0 then  //bissesto
          DM:=29;
        end;
      if (D<1) or (D>DM) then
        DAT:=FALSE
      end;
    valdat:=dat;
  end;
  //-----pequisa binaria

procedure pebin1(vet:vetor;ext:a36;t:integer;VAR CC:INTEGER);
  var
    ii, i9, meio:integer;
    achou:boolean;
  begin
  achou:=false;
  ii:=1;
  i9:=t;
  repeat
    meio:=(ii+i9) div 2;
    if (ext = vet[meio].c_chave)then
      achou:=true
    else
      if (ext > vet[meio].c_chave)then
        ii:=meio+1
      else
        i9:=meio-1;
  until ((achou) or (ii > i9));
  if( achou ) then
    CC := meio
  else
    CC := 0;
  end;
  
//-----valida CPF
function vercpf(num:string[11]):boolean;
  var
    vet:array[1..11] of integer;
    dvs:array[1..2] of integer;
    som,a,b,e,f,m,r:integer;
    aux:boolean;
  begin
  aux:=true;
  for a:=1 to 11 do
    val(num[a],vet[a],e);{o string "num" j? vem validado}
  f:=8;
  m:=10;
  a:=0;
  repeat
    som:=0;
    a:=a+1;
    f:=f+1;
    m:=m+1;
    for b:=1 to f do
      som:=som+vet[b]*(m-b);
      r:=som mod 11;
      dvs[a]:=11-r;
      if (r<2)then
        dvs[a]:=0;
      if (vet[m-1] <> dvs[a])then
        aux:=false;
  until ((a=2) or (not aux));
  vercpf:=aux;
  end;
 END.

 

No aguardo.

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

  • Membro VIP

Olá.

 

Vá fazendo o programa por etapas... por exemplo:

 

3 horas atrás, Simon Viegas disse:

SUGESTÃO

- Após ter ordenado, em vez de exibir os dados do vetor, leia os dados do registro no arquivo e exiba INSCRIÇÂO, NOME, CPF e DATA.

 

Mas como no LEDIR.PAS já está exibindo os dados pela ordem do arquivo. Use o vetor do exercício 3 para exibir em ordem de inscrição. Algo como:

 

- carrega os dados do arquivo para o vetor;

- ordenada o vetor.

- usar o vetor para ir lendo os dados e exibir.

seek(arq2,vet2[a].pf);//posiciona (a variando de 1 até total de registros do arq2)
read(arq2,reg2);      //para a=12, irá LER o registro da inscrição 19

 

Ou seja, em vez de ler o arquivo em sequência, vai dar um seek() antes.

 


 

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

hummm,não entendi muito bem,como você usou arq2 e reg2 presumo que tenha falado do ledir.pas ,mas o ledir não é pra ser alterado.

bem, a primeira parte do Program TxN04  funciona,a maior duvida é do "7" pra frente.
no 7.1 , tentei usar o x para qual prova deveria ser, mas ele fala que quer dados primitivos.
no 7.8 eu não tenho a minima ideia,na verdade ,conhece algum bom tutorial de registros e coisas parecidas,estou bem perdido nesse assunto como pode perceber. 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Vamos nos reorganizar.. o projeto tem lá a sua complexidade, demorei um pouco para começar a entender (e ainda não entendi tudo). Eu também tentei mesclar os tópicos, mas ficou um pouco bagunçado, rs.

 

 

Poste todos os arquivos atuais em uma pasta .zip. Poste apenas até a parte que está funcionando... para revisarmos e vê se de fato está funcionando, ai posteriormente tenta implementar uma próxima etapa, beleza?

 

 

No aguardo.

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

haha, valeu pela ajuda e paciência.


Para que serve cada um:

Cand.ind : versão indexada de cand.txt.
exercicio3: foi o que você me passou,contem a parte que serve pro TxN04.
ledir.pas : lê o cand.ind,serve para ver os resultados de txN04.
TxN02: corrige cand.ind caso algo de errado.
outros: são auto explicativos.

 

Programas ate agora.rar

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

  • Membro VIP

1#

Sobre:

48 minutos atrás, Lucas Pelepek disse:

haha, valeu pela ajuda e paciência.


Para que serve cada um:

Cand.ind : versão indexada de cand.txt.
exercicio3: foi o que você me passou,contem a parte que serve pro TxN04.
ledir.pas : lê o cand.ind,serve para ver os resultados de txN04.
TxN02: corrige cand.ind caso algo de errado.
outros: são auto explicativos.

 

Programas ate agora.rar

Beleza...

 

 

 

2#

Sobre:

21 horas atrás, Lucas Pelepek disse:

read(x,regi); //fala que quer dados primitivos!!

 

Nesse caso, x está como text, mas você está tentando ler um registro... Você precisa ler uma string... Após, separa os dados e joga no registro.... assim como foi feito no TxN02.pas.

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

Mudei o seguinte:  
val
respx:string[54];

    //7.1:
    
    read(x,respx);
    
    //7.2:
    
    copy(respx,1,4),regi.num; 
    regi.resp:=copy(respx,5,50);

segui a lógica do N02, mas dá:

erro sintático na linha 80.
',' não esperado.
o que não estou entendendo aqui?


obs: esse N02 foi dado pelo professor.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
1 hora atrás, Lucas Pelepek disse:

segui a lógica do N02, mas dá:

erro sintático na linha 80.
',' não esperado.
o que não estou entendendo aqui?

 

Qual é a linha 80?

 

Em fim, essa sintaxe não existe.

1 hora atrás, Lucas Pelepek disse:

copy(respx,1,4),regi.num;

 

 

Compare com o código do 02. A lógica é exatamente a mesma...

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

  • Membro VIP
4 minutos atrás, Lucas Pelepek disse:

bem,se seguir a logica do 2 eu teria que criar um indexado das provas?

 

A minha sugestão é sobre a sua dúvida:

3 horas atrás, Simon Viegas disse:

read(x,regi); //fala que quer dados primitivos!!

 

Ou seja, você estava tentando ler um registro num arquivo de texto. O correto é ler o texto, e separar os dados para jogar no registro... isso foi feito no 02. Vai fazer a mesma coisa...

adicionado 18 minutos depois

Veja:

readln(arqt,regt); //aqui no seu códgigo estava tentando ler uma registro...
//abaixo está pegando os dados que estão concatenados na string, e passando para o registro
val(copy(regt,1,4),reg.num,e); 
reg.nome:=copy(regt,5,36);
reg.cpf:=copy(regt,41,11);
dd:=copy(regt,52,2);
mm:=copy(regt,54,2);
aa:=copy(regt,56,4);
insert(dd,auxd,1);
insert(mm,auxd,1);
insert(aa,auxd,1);
reg.data:=auxd;
val(copy(regt,60,1),reg.car,e);
reg.n1:=0;
reg.n2:=0;
reg.n3:=0;
reg.n4:=0;
reg.so:=0;
reg.clg:=0;
reg.clc:=0;
reg.ccl:=0;

 

Estamos apenas tratando disso... após resolver isso, ai posta qual seria a próxima dúvida.

 

No aguardo.

adicionado 19 minutos depois

PS:  esse código acima é do TxN02.

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