Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Lucas Pelepek

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

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

não,o vetor vai de 1..2000.(não posso mudar esses parametros por ordem do professor),mesmo mudando dá o mesmo erro.
usando como exemplo a procedure ordenanum.
colocando 'a:=1' faz o programa não continuar o loop, na linha 62 "ctv:=ctv+1;". 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

@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

Compartilhar este post


Link para o post
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: 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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?

Editado por Simon Viegas
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

:oops:.

 

 

reg.num seria o número de inscrição em cand.ind.
se não está claro,talvez queira ver o pdf?
na verdade estou testando tudo que vem a cabeça para fazer ele funcionar. 

COMOFAZERO03.pdf

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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.

Editado por Lucas Pelepek
Observação.
  • Curtir 1

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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.

Editado por Simon Viegas
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu comecei a analisar, mas vou precisar sair... ainda hoje posto uma resposta...

 

T+

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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. 

Editado por Lucas Pelepek
Erro de na escrita.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
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.

Editado por Lucas Pelepek
Esqueci algo.

Compartilhar este post


Link para o post
Compartilhar em outros sites
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem,se seguir a logica do 2 eu teria que criar um indexado das provas?
ou não é necessário? não pede isso no pdf.

ou ele guarda em alguma memoria sem precisar fazer um novo indexado?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
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

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






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

×