Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

@Simon Viegas

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,numx:integer;
regi:regis;
regii:regis;
respx:string[54];
resp:array[1..54] of string;
arqi:file of regis;
c,a,z,e,tot:integer;
vet:vetor;


Begin
  
  //1:  Funciona
  
  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:
  
  //3: funciona
  
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: funciona
  
  
  assign(arqi,'CAND.ind');
  reset(arqi);
  
  //5: funciona
  
  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: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.
  
  { writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e'); }
  
  
  //7:
  
  while not(eof(x)) do
  begin
    
    //7.1:
    for z:=1 to 54 do
    readln(x,respx[z]);
    writeln(respx[z]); //só pra testar
     end;
    
    //7.2:
    
    
    
    //7.3:
    
    { pebin1 ();}
    
    //7.4:
    
    {seek(read.pf);}
    
    //7.5:
    
    {for a:= a+x to x+24 do
    readln (gab[a]);
    repeat
      if gab[a]=resp[a+4] then
      else
      sf.(resp[a+4]=' ') then
      br:=br+1
      else
      er:=er+1; }
      
      //7.6:
      
      {nota:=ce*4;
      x:=x+25;}
      
      //7.7:
      
      {notap= ?
      notam= ?}
      
      //7.8
      
      {??? sei que tem que atualizar n1,n2,n3,n4,mas como?}
      
      //7.9:
      
      {seek
      write(cand.ind)
      close (cand.ind)}
      
      //8:
      
      {mediap:=notap/portugues ;
      mediam:=notam/matematicas; }
      
    
  End.

 

bem,acabei fazendo isso para tentar arrumar,seguindo um fórum daqui mesmo.
 

 //7:
  
  while not(eof(x)) do
  begin
    
    //7.1:
    for z:=1 to 54 do
    readln(x,respx[z]);
    writeln(respx[z]); // só pra testar
     end;

rodando o programa ele dá o erro quando chega no EOF

"arquivo fechado no comando EOF".

opa,não tinha visto sua ultima edição no post passado.

tem que ser pra registro mesmo então.

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

  • Membro VIP

Provavelmente não conseguiu abrir o arquivo...

 

Para a prova só precisa usar um arquivo, ou seja, só muda assign(). "ou o arquivo assinala com a Prova 1 ou assinala com a prova 2".

 

A lógica seria mais ou menos essa:

  if (prv=1) then
    assign(arqProva,'PROVA1.TXT');
  else
    if (prv=2) then
      assign(arqProva,'PROVA2.TXT');

 

Tenta ajustar isso...

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

fiz como me disse e alterei: 

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

para:

  //5: funciona
  
  if (prv=1) then
  
  assign (arqprova,'PROVA1.TXT');
  reset (arqprova) ;
  writeln(' ');
  
  if (prv=2) then
  
  assign (arqprova,'PROVA2.TXT');
  reset (arqprova);
  writeln(' ');

agora funciona,mas quando ele imprime na tela esse teste:

 //7:
  
  while not(eof(x)) do
  begin
    
    //7.1:
    for z:=1 to 54 do
    readln(x,respx[z]);
    writeln(respx[z]); // só pra testar
     end;

sai o seguinte resultado:


"
0
0
0
0
0
0
0
0
0
0
1
1
1
1
"

o que aconteceu aqui?

 

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

  • Membro VIP

Vamos lá:

 

1#

Sempre mantenha o código indentado. Sem a indentação não tem como eu ler! Beleza?

Ficariam respectivamente algo assim:

 

1.1

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

 

1.2

 //5: funciona 
  if (prv=1) then  
    assign (arqprova,'PROVA1.TXT');
  reset (arqprova) ;
  writeln(' ');
  if (prv=2) then
    assign (arqprova,'PROVA2.TXT');
  reset (arqprova);
  writeln(' ');

 

1.3

  //7:
  while not(eof(x)) do
    begin
    //7.1:
    for z:=1 to 54 do
      readln(x,respx[z]);
    writeln(respx[z]); // só pra testar
    end;

 

 

 

2#

Sobre o código 1.1 e 1.2 ficaram faltando os begin/end.

E, como dito, só muda o assing(), logo, ficaria algo como:

  //5: funciona 
  if (prv=1) then  
    assign(arqprova,'PROVA1.TXT');
  else
    if (prv=2) then
      assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');

 

 

 

3#

Sobre o código 1.3.

Veja, não foi usado vetor lá no 02. Como é a mesma coisa (ler um string e separar os para jogar num registro), devem-se fazer a mesma coisa também... caso contrário, teria que também fazer isso lá no 02... "para coisas iguais, procedimentos iguais". (vulgo "O pau que dá em Chico dá em Francisco").

 

Logo, seria algo como:

  //7:
  while not(eof(x)) do
    begin
    //7.1:
    readln(x,respx); //ler a linha do arquivo
    writeln(respx); // só pra testar
    end;

 

Mas precisamente:
 

  //7:
  while not(eof(arqprova)) do
    begin
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    writeln(respx); // só pra testar
    end;

 

 

Link para o comentário
Compartilhar em outros sites

thanks, hahaha.
tava usando o identador do pascalzim, mas pelo jeito ele edenta errado,farei certo nas próximas .
bem, agora tá funcionado certinho.
a próxima etapa era:

7.2 retirar o número de inscrição,que são os 4 primeiros números.

bem, como faço pra ele contar apenas do 4 em diante?

seria o mesmo processo do T02?  

jogar tudo em registro,nesse caso devo criar um novo,certo? ou aquele mesmo que já existe serve?.

 


esses 4 números serão usados mais pra frente.

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

  • Membro VIP

O código está assim:

Program TxN04 ;
uses
  CRT, modulos;
var
  br,er,prv,media,mediam,mediap,notam,notap:integer;
  arqProva:text;
  gab:array[1..50] of string;
  corr,numx:integer;
  regi:regis;
  regii:regis;
  respx:string[54];
  resp:array[1..54] of string;
  arqi:file of regis;
  c,a,z,e,tot:integer;
  vet:vetor;

BEGIN
  //1:  Funciona 
  assign(arqi,'cand.ind');
  reset(arqi);  
  repeat  //TÁ ERRADO, TEM QUE USUAR WHILE!!! [Simon.Viegas]
    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:
  
  //3: funciona  
  repeat
    writeln ('Qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=1) or (prv=2);
  
  //4: funciona  
  {assign(arqi,'CAND.ind');} //já está assinalado
  reset(arqi);
  
  //5: funciona 
  if (prv=1) then  
    assign(arqProva,'PROVA1.TXT')
  else
    if (prv=2) then //esse if não precisa, mas acho que não tem problema deixar [Simon.Viegas]
      assign(arqProva,'PROVA2.TXT');
  reset(arqProva);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.
  { writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
    repeat
      z:=z+1;
      writeln (z,':');
      readln (gab[corr]);
    until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e'); }
    
  //7:
  while not(eof(arqProva)) do
    begin
    //7.1:
    readln(arqProva,respx); //ler a linha do arquivo
    writeln(respx); // só pra testar
    end;
    
    //7.2:
    
    //7.3:    
    {pebin1 ();}
    
    //7.4:    
    {seek(read.pf);}
    
    //7.5:    
    {for a:= a+x to x+24 do
      readln (gab[a]);
    repeat
      if gab[a]=resp[a+4] then
    
      else
        sf.(resp[a+4]=' ') then
      br:=br+1
      else
        er:=er+1; }
      
      //7.6:      
      {nota:=ce*4;
      x:=x+25;}
      
      //7.7:      
      {notap= ?
      notam= ?}
      
      //7.8      
      {??? sei que tem que atualizar n1,n2,n3,n4,mas como?}
      
      //7.9:      
      {seek
      write(cand.ind)
      close (cand.ind)}
      
      //8:      
      {mediap:=notap/portugues ;
      mediam:=notam/matematicas; }
 END.

 

Pronto, está lendo a linha do txt corretamente. Agora precisa jogar as "respostas dos candidatos da prova" num registro. (para posteriormente poder corrigir)

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

  • Membro VIP
agora, Lucas Pelepek disse:

7.2 retirar o número de inscrição,que são os 4 primeiros números.

bem, como faço pra ele contar apenas do 4 em diante?

seria o mesmo processo do T02?  

Sim... a lógica é exatamente a mesma... (só muda que os dados dos arquivos são para coisas diferentes....)

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

sim,eu fiz assim:

 //7.2:
  
  val(copy(respx,1,4),regi.num,e);
   regi.resp:=copy(respx,5,50); //<- erro

mas ele diz que 'resp' não faz parte do Regi,
como faz para adicionalo sem mudar o Modulos?.

 

...
 

9 minutos atrás, Simon Viegas disse:

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

o que é pra ser esse "codigo" ?

Link para o comentário
Compartilhar em outros sites

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

mas ele diz que 'resp' não faz parte do Regi,

 

Pois então, só pode usar o que faz parte do registro. Mas veja:

59 minutos atrás, Simon Viegas disse:

Sim... a lógica é exatamente a mesma... (só muda que os dados dos arquivos são para coisas diferentes....)

 

O que você está lendo no arquivo? seria isso:

Citação

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

 

Ou seja, você precisa de uma estrutura para armazenar esses dados...

 

Daí:

7 minutos atrás, Lucas Pelepek disse:

como faz para adicionalo sem mudar o Modulos?.

 

Crie no próprio programa.

 

O registro só precisa de 2 campos: a inscrição e o gabarito (uma string do tamanho da quantidade de respostas).

 

 

 

adicionado 1 minuto depois
21 minutos atrás, Lucas Pelepek disse:

o que é pra ser esse "codigo" ?

 

É apenas um exemplo... o comando val() precisa de 3 parâmetros. O terceiro é um código.

adicionado 17 minutos depois

PS: Vou sair do computador. Se postar qualquer coisa dou uma olhada amanhã...

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

@Simon Viegas Bem,não sei o que fiz mas funcionou.

 

Program TxN04 ;

uses crt,modulos;





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


Begin
  
  //1:  Funciona
  
  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:
  
  //3: funciona
  
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: funciona
  
  
  assign(arqi,'CAND.ind');
  reset(arqi);
  
  //5: funciona
  
  if (prv=1) then
  assign(arqprova,'PROVA1.TXT')
  else
  if (prv=2) then
  assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.
  
  { writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e'); }
  
  
  //7:
  while not(eof(arqprova)) do
  begin
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    
  end;
  
  //7.2:
  
  val(copy(respx,1,4),regi.num,e);
  regi.resp:=copy(respx,5,50);
  
  //7.3:
  
  pebin1 ();
  
  //7.4:
  
  seek(read.pf);
  
  //7.5:
  
  {for a:= a+x to x+24 do
  readln (gab[a]);
  repeat
    if gab[a]=resp[a+4] then
    else
    sf.(resp[a+4]=' ') then
    br:=br+1
    else
    er:=er+1; }
    
    //7.6:
    
    {nota:=ce*4;
    x:=x+25;}
    
    //7.7:
    
    {notap= ?
    notam= ?}
    
    //7.8
    
    {??? sei que tem que atualizar n1,n2,n3,n4,mas como?}
    
    //7.9:
    
    {seek
    write(cand.ind)
    close (cand.ind)}
    
    //8:
    
    { media:=0;}
    
    
  End.

não sei para o que essas etapas:

 

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.

 

7.4 posicionar no CAND.IND (seek-para posicionar) e ler o registo (READ)

não deveriam vir depois?

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

Aqui não funcionou. Está dando erro nesta linha:

6 horas atrás, Lucas Pelepek disse:

  regi.resp:=copy(respx,5,50);

 

Erro:

=> Erro semântico na lina 84...
=> O campo 'RESP' não pertence ao registro 'REGI'!

 

adicionado 6 minutos depois

O erro está aqui:

6 horas atrás, Lucas Pelepek disse:

regi:regis;

 

Os dados que estão contidos nos arquivos de texto NÃO servem para preencher dados do tipo regis.

 

Como não pode alterar a unit modulos, poderia criar um registro no próprio programa principal (ou criar outra unit).

 

Algo assim:

9 horas atrás, Simon Viegas disse:

O registro só precisa de 2 campos: a inscrição e o gabarito (uma string do tamanho da quantidade de respostas).

 

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

ops, tinha colocado no modulos pra testar e esqueci de retirar :P.
arrumei:

 

Program TxN04 ;

uses crt,modulos;

type
regiis = record
resp:string[50];
end;



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


Begin
  
  //1:  Funciona
  
  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:
  
  //3: funciona
  
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: funciona
  
  
  assign(arqi,'CAND.ind');
  reset(arqi);
  
  //5: funciona
  
  if (prv=1) then
  assign(arqprova,'PROVA1.TXT')
  else
  if (prv=2) then
  assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.
  
  { writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e'); }
  
  
  //7:
  while not(eof(arqprova)) do
  begin
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    
  end;
  
  //7.2:
  
  val(copy(respx,1,4),regi.num,e);
  regiis.resp:=copy(respx,5,50);
  
  //7.3:
  
 // pebin1 ();
  
  //7.4:
  
  //seek(read.pf);
  
  //7.5:
  
  {for a:= a+x to x+24 do
  readln (gab[a]);
  repeat
    if gab[a]=resp[a+4] then
    else
    sf.(resp[a+4]=' ') then
    br:=br+1
    else
    er:=er+1; }
    
    //7.6:
    
    {nota:=ce*4;
    x:=x+25;}
    
    //7.7:
    
    {notap= ?
    notam= ?}
    
    //7.8
    
    {??? sei que tem que atualizar n1,n2,n3,n4,mas como?}
    
    //7.9:
    
    {seek
    write(cand.ind)
    close (cand.ind)}
    
    //8:
    
    { media:=0;}
    
    
  End.

agora se der:

8 horas atrás, Lucas Pelepek disse:

não sei para o que essas etapas:

 

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.

 

7.4 posicionar no CAND.IND (seek-para posicionar) e ler o registo (READ)

não deveriam vir depois?

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá.

 

1#
Peguei o seu código e deu uma reorganizada na indentação. Por favor, utilize ele como base, ok?

Spoiler

Program TxN04 ;

uses
  CRT, modulos;
  
type
  regiis = record
    resp:string[50];
  end;

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

BEGIN 
  //1:  Funciona
  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:
  
  //3: funciona  
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: funciona  
  assign(arqi,'CAND.ind');
  reset(arqi);
  
  //5: funciona  
  if (prv=1) then
    assign(arqprova,'PROVA1.TXT')
  else
    if (prv=2) then
      assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.  
  {
  writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e');
  }
  
  //7:
  while not(eof(arqprova)) do
    begin
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    end;
  
  //7.2:  
  val(copy(respx,1,4),regi.num,e);
  regiis.resp:=copy(respx,5,50);
  
  //7.3:  
  {
  pebin1 ();
  }
  
  //7.4:
  {
  seek(read.pf);
  }
  
  //7.5:
  {
  for a:= a+x to x+24 do
    readln(gab[a]);
  repeat
    if gab[a]=resp[a+4] then
    
    else
      sf.(resp[a+4]=' ') then
    br:=br+1
    else
      er:=er+1;
    }
    
    //7.6:
    {
    nota:=ce*4;
    x:=x+25;
    }
    
    //7.7:
    {
    notap= ?
    notam= ?
    }
    
    //7.8
    {
    ??? sei que tem que atualizar n1,n2,n3,n4,mas como?
    }
    
    //7.9:
    {
    seek
    write(cand.ind)
    close (cand.ind)
    }
    
    //8:    
    {
    media:=0;
    }    
END.

 

 

Obs.: estou editando ainda, foi publicado sem querer...

adicionado 26 minutos depois

2#

Sobre:

  //1:  Funciona
  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));

Precisa corrigir. Está usando repeat, mas o correto seria while().

 

 

 

3#

Sobre:

  //4: funciona  
  assign(arqi,'CAND.ind');
  reset(arqi);

O arquivo já está assinalado, pode remover esse assing() aí.

 

 

 

4#

Sobre:

  //7:
  while not(eof(arqprova)) do
    begin
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    end;
  
  //7.2:  
  val(copy(respx,1,4),regi.num,e);
  regiis.resp:=copy(respx,5,50);

O 7.2 fica dentro do 7. No código acima, o 7.1 está apenas lendo a linha e não fazendo nada. Já o 7.2 pegou a última leitura e jogou em 2 registros diferentes. Você tem que pegar cada linha e jogar no registro correspondente.

 

4.1#

Sobre

  //7.2:  
  val(copy(respx,1,4),regi.num,e);
  regiis.resp:=copy(respx,5,50);

Os dados do arquivo são para um único registro, você está usando 2 diferentes... e até porque o tipo do regi não tem nada a ver com esse arquivo. Resumidamente use algo como:

type
  regGabProvaAluno = record
    insc:integer;    //número de inscrição
    gab :string[50]; //gabarito da prova (do aluno)
  end;

e

var
  GabProvaAluno :regGabProvaAluno;

 

***

 

Daí, pegue o código do 1# e faça os ajustes sugeridos.

 

Para testar, após ler os dados do aluno na prova, exibia na tela, algo como:

Inscricao: 0001   Gabarito: AAAAAAAAAABDCEBABDCDAAAAACCCCCAAAAADDDDDEADDAAEDDC
Inscricao: 0002   Gabarito: AAAAAAAAAACDACECBDEDAAAAACCCCCAAAAADDDDDBCCCCBCCEE
...

- ler a linha;

- separa os dados jogando no registro

- imprime os dados usando o registro

 

Aí posta o código completo aqui..

obs.: lembrando: use o código do 1# e mantenha a indentação

 

No aguardo.

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

@Simon Viegas  :thumbsup:

 

Program TxN04 ;

uses
  CRT, modulos;
  
type
  regGabProvaAluno = record
    insc:integer;    //número de inscrição
    gab :string[50]; //gabarito da prova (do aluno)
  end;

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

BEGIN 
  //1:  Funciona
  assign(arqi,'cand.ind');
  reset(arqi);  
  while not (eof(arqi)) do
    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);    
  
  
  //2:
  
  //3: funciona  
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: removido.
  
  //5: funciona  
  if (prv=1) then
    assign(arqprova,'PROVA1.TXT')
  else
    if (prv=2) then
      assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.  
  {
  writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e');
  }
  
  //7:
  while not(eof(arqprova)) do
    begin 
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    
  
  //7.2:  
  val(copy(respx,1,4),GabProvaAluno.insc,e);
  GabProvaAluno.gab:=copy(respx,5,50);
  
  writeln('inscricao: ',GabProvaAluno.insc,'    ','gabarito: ',GabProvaAluno.gab);
  
  end;
  //7.3:  
  {
  pebin1 ();
  }
  
  //7.4:
  {
  seek(read.pf);
  }
  
  //7.5:
  {
  for a:= a+x to x+24 do
    readln(gab[a]);
  repeat
    if gab[a]=resp[a+4] then
    
    else
      sf.(resp[a+4]=' ') then
    br:=br+1
    else
      er:=er+1;
    }
    
    //7.6:
    {
    nota:=ce*4;
    x:=x+25;
    }
    
    //7.7:
    {
    notap= ?
    notam= ?
    }
    
    //7.8
    {
    ??? sei que tem que atualizar n1,n2,n3,n4,mas como?
    }
    
    //7.9:
    {
    seek
    write(cand.ind)
    close (cand.ind)
    }
    
    //8:    
    {
    media:=0;
    }    
END.


 

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

  • Membro VIP

1#

Faltou o begin/end do while lá no //1.

 

 

2#

O código sempre deve está indentado! Ex.:

23 minutos atrás, Lucas Pelepek disse:

  //7:
  while not(eof(arqprova)) do
    begin 
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    
  
  //7.2:  
  val(copy(respx,1,4),GabProvaAluno.insc,e);
  GabProvaAluno.gab:=copy(respx,5,50);
  
  writeln('inscricao: ',GabProvaAluno.insc,'    ','gabarito: ',GabProvaAluno.gab);
  
  end;

 

 

Indentado:

  //7:
  while not(eof(arqprova)) do
    begin 
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo   
    //7.2:  
    val(copy(respx,1,4),GabProvaAluno.insc,e);
    GabProvaAluno.gab:=copy(respx,5,50);
    writeln('inscricao: ',GabProvaAluno.insc,'    ','gabarito: ',GabProvaAluno.gab);
    end;

 

Veja, é crucial que o código SEMPRE esteja organizado.

 

 

 

3#

Agora poderia fazer o:

- 7.5 corrigir a prova;

- 7.6 calcular a nota.

 

Desabilite essa impressão na tela... era apenas para testar...

 

Pegue o gabarito oficial. Obs.: por enquanto não precisa seguir o pdf:

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

 

Ou seja, não faz sentido ficar digitando toda hora o gabarito (no mínimo estaria num arquivo, mas em fim). Deixe-o numa numa variável ou constante no próprio código. Ex.:

uses
  CRT, modulos;
const
  gabaritoOficial = 'AAAAAAAAAAADACCCCCCEAAAAACCCCCAAAAADDDDDEADDDDEDDE';
type

Obs.: se tiver a resposta real, coloquei... eu peguei uma aleatória.

 

Ai, inicialmente pegue uma úncia resposta de um aluno e corrija. Vai comparando cada posição do gabarito do aluno, com cada posição do gabarito oficial, se os valores forem iguais, acertou.... vai calculando.

 

E posta a nota na tela.

 

PS: para acessar uma posição da string, basta usar [], assim com é feito com o vetor. Ou seja, vai comparar da posição 1 até a posição 54. Algo como do gabaritoOficial[numQuestao]  com GabProvaAluno.gab[numQuestao].

 

 

Posta o código aqui.

 

Depois que conseguir, ler de todos os alunos e exibe todas as notas na tela... mais pra frente ajusta para ficar de acordo com o PDF.

 

 

No aguardo.

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

@Simon Viegas  fiz o seguinte:
Código:

Spoiler

Program TxN04 ;

uses
  CRT, modulos;
const
  gabaritoOficial = 'AAAAAAAAAAADACCCCCCEAAAAACCCCCAAAAADDDDDEADDDDEDDE';  
type
  regGabProvaAluno = record
    insc:integer;    //número de inscrição
    gab :string[50]; //gabarito da prova (do aluno)
  end;

var
  GabProvaAluno :regGabProvaAluno;
  br,er,prv,media,mediam,mediap,notam,notap:integer;
  prvum,arqprova,prvdo:text;
  gab:array[1..50] of string;
  corr,numx:integer;
  regi:regis;
  regii:regis;
  respx:string[54];
  resp :string[50];
  arqi:file of regis;
  ce,er,br,c,a,z,e,tot:integer;
  vet:vetor;

BEGIN 
  //1:  Funciona
  assign(arqi,'cand.ind');
  reset(arqi);  
  while not (eof(arqi)) do
   begin
    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);
	 end;	    
  
  
  //2:
  
  //3: funciona  
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: removido.
  
  //5: funciona  
  if (prv=1) then
    assign(arqprova,'PROVA1.TXT')
  else
    if (prv=2) then
      assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.  
  {
  writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e');
  }
  
  //7:
  while not(eof(arqprova)) do
    begin 
     //7.1:
     readln(arqprova,respx); //ler a linha do arquivo
     //7.2:  
     val(copy(respx,1,4),GabProvaAluno.insc,e);
     GabProvaAluno.gab:=copy(respx,5,50);
    end;
    
  //7.3:  
  //pebin1 (regi.num,respx,c,c_chave);
  
  //7.4:
   {
   seek(read.pf);
   }
	  
   //7.5:    
   for a:= 1 to 24 do
     readln(GabProvaAluno.gab[a]);
      if GabProvaAluno.gab[a]=gabaritoOficial[a] then
      ce:=ce+4
      else
      GabProvaAluno.gab[a]=null then
      br:=br+1
      else
      er:=er+1;
   end;
    
    
    //7.6:
    
   { nota:=ce*4;
    writeln ( GabProvaAluno.insc,' ',nota);
    //x:=x+25;
    
    
    //7.7:
    {
    notap= ?
    notam= ?
    }
    
    //7.8
    {
    ??? sei que tem que atualizar n1,n2,n3,n4,mas como?
    }
    
    //7.9:
    {
    seek
    write(cand.ind)
    close (cand.ind)
    }
    
    //8:    
    {
    media:=0;
    }   
		 
END.

porém dá erro na linha 95
"erro sintático
'=' não esperado!"

 //7.5:    
   for a:= 1 to 24 do
     readln(GabProvaAluno.gab[a]);
      if GabProvaAluno.gab[a]=gabaritoOficial[a] then
      ce:=ce+4
      else
      GabProvaAluno.gab[a]=null then  //<====== aqui
      br:=br+1
      else
      er:=er+1;
   end;

não consigo achar o motivo.

Link para o comentário
Compartilhar em outros sites

bem, ignorando aquele problema:

Código:

Spoiler

Program TxN04 ;

uses
  CRT, modulos;
const
  gabaritoOficial = 'AAAAAAAAAAADACCCCCCEAAAAACCCCCAAAAADDDDDEADDDDEDDE';  
type
  regGabProvaAluno = record
    insc:integer;    //número de inscrição
    gab :string[50]; //gabarito da prova (do aluno)
  end;

var
  GabProvaAluno :regGabProvaAluno;
  br,er,prv,media,mediam,nota,mediap,notam,notap:integer;
  prvum,arqprova,prvdo:text;
  gabc:string[50];
  corr,numx:integer;
  regi:regis;
  regii:regis;
  respx:string[54];
  resp :string[50];
  arqi:file of regis;
  ce,c,a,z,e,tot:integer;
  vet:vetor;

BEGIN 
  //1:  Funciona
  assign(arqi,'cand.ind');
  reset(arqi);  
  while not (eof(arqi)) do
   begin
    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);
	 end;	    
  
  
  //2:
  
  //3: funciona  
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: removido.
  
  //5: funciona  
  if (prv=1) then
    assign(arqprova,'PROVA1.TXT')
  else
    if (prv=2) then
      assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.  
  {
  writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e');
  }
  
  //7:
  gabc:=gabaritoOficial;
  while not(eof(arqprova)) do
  
    begin 
     //7.1:
     readln(arqprova,respx); //ler a linha do arquivo
     //7.2:  
     val(copy(respx,1,4),GabProvaAluno.insc,e);
     GabProvaAluno.gab:=copy(respx,5,50);
    //end;
    
  //7.3:  
  //pebin1 (regi.num,respx,c,c_chave);
  
  //7.4:
   {
   seek(read.pf);
   }
	  
   //7.5:     
      for a:= 1 to 24 do         
       if GabProvaAluno.gab[a]=gabaritoOficial[a] then
       ce:=ce+4
   //  else
   //  GabProvaAluno.gab[a]=null then
   //  br:=br+1
       else
       er:=er+1;
          
      //7.6:      
      nota:=ce*4;
      writeln ( GabProvaAluno.insc,'   acertos: ',nota,'   erros: ',er); 
      end;   
    
    //x:=x+25;
    
    
    //7.7:
    {
    notap= ?
    notam= ?
    }
    
    //7.8
    {
    ??? sei que tem que atualizar n1,n2,n3,n4,mas como?
    }
    
    //7.9:
    {
    seek
    write(cand.ind)
    close (cand.ind)
    }
    
    //8:    
    {
    media:=0;
    }   
		 
END.



aconteceu algo bem errado no resultado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Sobre:

2 horas atrás, Lucas Pelepek disse:

aconteceu algo bem errado no resultado.

 

Alguns pontos:

1#

4 horas atrás, Simon Viegas disse:

gabaritoOficial[numQuestao]

 

Não funciona (não sabia que com constante não funcionava). No caso copiar para uma string... como você fez.

gabc:=gabaritoOficial;

Ai na hora de calcular, use o gabc.

 

 

 

2#

Antes de começar a calcular os acertos, é preciso será os contadores de acertos e erros.

 

 

 

3#

Mais um vez: o código SEMPRE deve ficar indentado. ok?

Por exemplo:

Código:

Spoiler
2 horas atrás, Lucas Pelepek disse:


  //7:
  gabc:=gabaritoOficial;
  while not(eof(arqprova)) do
  
    begin 
     //7.1:
     readln(arqprova,respx); //ler a linha do arquivo
     //7.2:  
     val(copy(respx,1,4),GabProvaAluno.insc,e);
     GabProvaAluno.gab:=copy(respx,5,50);
    //end;
    
  //7.3:  
  //pebin1 (regi.num,respx,c,c_chave);
  
  //7.4:
   {
   seek(read.pf);
   }
	  
   //7.5:     
      for a:= 1 to 24 do         
       if GabProvaAluno.gab[a]=gabaritoOficial[a] then
       ce:=ce+4
   //  else
   //  GabProvaAluno.gab[a]=null then
   //  br:=br+1
       else
       er:=er+1;
          
      //7.6:      
      nota:=ce*4;
      writeln ( GabProvaAluno.insc,'   acertos: ',nota,'   erros: ',er); 
      end;

 

 

Indentado:

Código:

Spoiler

  //7:
  gabc:=gabaritoOficial;
  while not(eof(arqprova)) do
    begin 
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    //7.2:  
    val(copy(respx,1,4),GabProvaAluno.insc,e);
    GabProvaAluno.gab:=copy(respx,5,50);
    //end;
    
    //7.3:  
    //pebin1 (regi.num,respx,c,c_chave);
   
     //7.4:
     {
     seek(read.pf);
     }
	  
     //7.5:     
     for a:= 1 to 24 do         
       if GabProvaAluno.gab[a]=gabc[a] then
         ce:=ce+4
       //else
       //  GabProvaAluno.gab[a]=null then
       //br:=br+1
       else
         er:=er+1;          
    //7.6:      
    nota:=ce*4;
    writeln ( GabProvaAluno.insc,'   acertos: ',nota,'   erros: ',er); 
    end;   

 

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

@Simon Viegas tem que desenvolver um programa para identar XP.

 

Código:

Spoiler

Program TxN04 ;

uses
  CRT, modulos;
const
  gabaritoOficial = 'AAAAAAAAAAADACCCCCCEAAAAACCCCCAAAAADDDDDEADDDDEDDE';  
type
  regGabProvaAluno = record
    insc:integer;    //número de inscrição
    gab :string[50]; //gabarito da prova (do aluno)
  end;

var
 
  GabProvaAluno :regGabProvaAluno;
  br,er,prv,media,mediam,nota,mediap,notam,notap:integer;
  prvum,arqprova,prvdo:text;
  gabc:string[50];
  corr,numx:integer;
  regi:regis;
  regii:regis;
  respx:string[54];
  resp :string[50];
  arqi:file of regis;
  ce,c,a,z,e,tot,x:integer;
  vet:vetor;

BEGIN

  //1:  Funciona
  assign(arqi,'cand.ind');
  reset(arqi);  
  while not (eof(arqi)) do
   begin
    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);
	 end;	    
  
  
  //2:
  
  //3: funciona  
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: removido.
  
  //5: funciona  
  if (prv=1) then
    assign(arqprova,'PROVA1.TXT')
  else
    if (prv=2) then
      assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.  
  {
  writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e');
  }
  
 //7:
  gabc:=gabaritoOficial;
  while not(eof(arqprova)) do
    begin 
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    //7.2:  
    val(copy(respx,1,4),GabProvaAluno.insc,e);
    GabProvaAluno.gab:=copy(respx,5,50);
    //end;
    
    //7.3:  
    //pebin1 (regi.num,respx,c,c_chave);
   
     //7.4:
     {
     seek(read.pf);
     }
	  
     //7.5:
		 ce:=0;
		 er:=0;     
     for a:= 1 to 24 do         
       if GabProvaAluno.gab[a]=gabc[a] then
         ce:=ce+4
       //else
       //GabProvaAluno.gab[a]=null then
       //br:=br+1
       else
         er:=er+1;          
    //7.6:        
    nota:=ce;
    writeln ( GabProvaAluno.insc,'   nota: ',nota,'   erros: ',er); 
    end;  
    
    //7.7:
    {
    notap= ?
    notam= ?
    }
    
    //7.8
    {
    ??? sei que tem que atualizar n1,n2,n3,n4,mas como?
    }
    
    //7.9:
    {
    seek
    write(cand.ind)
    close (cand.ind)
    }
    
    //8:    
    {
    media:=0;
    }   
		 
END.

 

opa,agora tá dando certo. nota maxima:80.

 //7.5:
		 ce:=0;
		 er:=0;     
     for a:= 1 to 24 do         
       if GabProvaAluno.gab[a]=gabc[a] then
         ce:=ce+4
       //else
       //GabProvaAluno.gab[a]=null then //<======== 
       //br:=br+1
       else
         er:=er+1; 

mas sabe porque essa linha não quer funcionar.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

1#

Sobre:

33 minutos atrás, Lucas Pelepek disse:

@Simon Viegas tem que desenvolver um programa para identar XP.

Alguns programa já indentam. Tem ferramentas online também.

 

Eu uso um padrão um pouco diferente... a depender, pode usar a ferramenta para indentar, e após ajusta ao seu gosto... mas quando o código já está indentando, e proposta é implementar já seguindo o padrão.

 

 

 

2#

33 minutos atrás, Lucas Pelepek disse:

opa,agora tá dando certo. nota maxima:80.

 

Acho que não. Se são 50 questões, e cada uma você colocou valendo 4 pontos , a nota máxima será 200.

 

 

 

3#

33 minutos atrás, Lucas Pelepek disse:

mas sabe porque essa linha não quer funcionar.

Não entendi. O que não que linha?

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

2#
ali apenas conta as primeiras 24 questões ,mas agora que você falou eu percebi.
 

3#
 

Spoiler

Program TxN04 ;

uses
  CRT, modulos;
const
  gabaritoOficial = 'AAAAAAAAAAADACCCCCCEAAAAACCCCCAAAAADDDDDEADDDDEDDE';  
type
  regGabProvaAluno = record
    insc:integer;    //número de inscrição
    gab :string[50]; //gabarito da prova (do aluno)
  end;

var
 
  GabProvaAluno :regGabProvaAluno;
  br,er,prv,media,mediam,nota,mediap:integer;
  prvum,arqprova,prvdo:text;
  gabc:string[50];
  corr,numx:integer;
  regi:regis;
  regii:regis;
  respx:string[54];
  resp :string[50];
  arqi:file of regis;
 nota1,nota2, totalu,ce,c,a,z,e,tot,x:integer;
  vet:vetor;
  notap,notam:real;

BEGIN

  //1:  Funciona
  assign(arqi,'cand.ind');
  reset(arqi);  
  while not (eof(arqi)) do
   begin
    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);
	 end;	    
  
  
  //2:
  
  //3: funciona  
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: removido.
  
  //5: funciona  
  if (prv=1) then
    assign(arqprova,'PROVA1.TXT')
  else
    if (prv=2) then
      assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.  
  {
  writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e');
  }
  
 //7:
  gabc:=gabaritoOficial;
  
  while not(eof(arqprova)) do
    
    begin
		 
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    //7.2:  
    val(copy(respx,1,4),GabProvaAluno.insc,e);
    GabProvaAluno.gab:=copy(respx,5,50);
    //end;
    
    //7.3:  
    //pebin1 (regi.num,respx,c,c_chave);
   
     //7.4:
     {
     seek(read.pf);
     }
	  
     //7.5:
     //portugues
     begin
     totalu:=0;
		 ce:=0;
		 er:=0;     
     for a:= 1 to 24 do         
       if GabProvaAluno.gab[a]=gabc[a] then
         ce:=ce+4
       else
       GabProvaAluno.gab[a]=null then
       br:=br+1
       else
         er:=er+1;          
       nota1:=ce;
       end;
      //matematica 
     begin  
     ce:=0;
		 er:=0;     
     for a:= 25 to 50 do         
       if GabProvaAluno.gab[a]=gabc[a] then
         ce:=ce+4
       //else
       //GabProvaAluno.gab[a]=null then
       //br:=br+1
       else
         er:=er+1; 
       nota2:=ce;
       end;
    // writeln ( GabProvaAluno.insc,'   nota: ',nota,'   erros: ',er); 
    end;  
     
    //7.7:
    totalu:=totalu+1;
    notap:=nota1/totalu;
    notam:=nota2/totalu;
    writeln('matematica:  ',notam,'  portugues:   ',notap);
    
    
     //7.8  7.8 se prova = 1, atualizar os campos nota1 e nota2; se prova =2, atualizar os campos
     // nota3, nota4 e soma
    
    
    
    //7.9:
    {
    seek
    write(cand.ind)
    close (cand.ind)
    }
    
    //8:    
    {
    media:=0;
    }   
		 
END.

 

linha 105
'=' não esperado.

adicionado 54 minutos depois

bem, ignorando o código da linha 105.
código até agora:
 

Spoiler

Program TxN04 ;

uses
  CRT, modulos;
const
  gabaritoOficial = 'AAAAAAAAAAADACCCCCCEAAAAACCCCCAAAAADDDDDEADDDDEDDE';  
type
  regGabProvaAluno = record
    insc:integer;    //número de inscrição
    gab :string[50]; //gabarito da prova (do aluno)
  end;

var
 
  GabProvaAluno :regGabProvaAluno;
  br,er,prv,media,mediam,nota,mediap:integer;
  prvum,arqprova,prvdo:text;
  gabc:string[50];
  corr,numx:integer;
  regi:regis;
  regii:regis;
  respx:string[54];
  resp :string[50];
  arqi:file of regis;
 nota1,nota2, totalu,ce,c,a,z,e,tot,x:integer;
  vet:vetor;
  notap,notam:real;

BEGIN

  //1:  Funciona
  assign(arqi,'cand.ind');
  reset(arqi);  
  while not (eof(arqi)) do
   begin
    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);
	 end;	    
  
  
  //2:
  
  //3: funciona  
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: removido.
  
  //5: funciona  
  if (prv=1) then
    assign(arqprova,'PROVA1.TXT')
  else
    if (prv=2) then
      assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.  
  {
  writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e');
  }
  
 //7:
  gabc:=gabaritoOficial;
  
  while not(eof(arqprova)) do
    
    begin
		 
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    //7.2:  
    val(copy(respx,1,4),GabProvaAluno.insc,e);
    GabProvaAluno.gab:=copy(respx,5,50);
    //end;
    
    //7.3:  
    //pebin1 (regi.num,respx,c,c_chave);
   
     //7.4:
     {
     seek(read.pf);
     }
	  
     //7.5:
     //portugues
     begin
     totalu:=0;
		 ce:=0;
		 er:=0;     
     for a:= 1 to 24 do         
       if GabProvaAluno.gab[a]=gabc[a] then
         ce:=ce+4
       //else
       //GabProvaAluno.gab[a]=null then
      // br:=br+1
       else
         er:=er+1;          
       nota1:=ce;
       end;
      //matematica 
     begin  
     ce:=0;
		 er:=0;     
     for a:= 25 to 50 do         
       if GabProvaAluno.gab[a]=gabc[a] then
         ce:=ce+4
       //else
       //GabProvaAluno.gab[a]=null then
       //br:=br+1
       else
         er:=er+1; 
       nota2:=ce;
       end;
    // writeln ( GabProvaAluno.insc,'   nota: ',nota,'   erros: ',er); 
    end;  
     
    //7.7:
    totalu:=totalu+1;
    notap:=nota1/totalu;
    notam:=nota2/totalu;
    //writeln('matematica:  ',notam,'  portugues:   ',notap);
    
    
     //7.8  7.8 se prova = 1, atualizar os campos nota1 e nota2; se prova =2, atualizar os campos
     // nota3, nota4 e soma
     
     {if prv:= 1 then
		 write (arqui, } //?? 
     
     
    
    
    
    //7.9:
    {
    seek
    write(cand.ind)
    close (cand.ind)
    }
    
    //8:    
    {
    media:=0;
    }   
		 
END.

 

o que devo fazer em 7.8 ?
seria o rewrite? se sim não entendo como implementá-lo.
 

//7.8  7.8 se prova = 1, atualizar os campos nota1 e nota2; se prova =2, atualizar os campos
     // nota3, nota4 e soma
     
     if prv = 1 then
     seek(arqi,reg.n1);
	  write (arqi,reg);   //teste
	  reg.n1:=(nota1);
		
	  end;  
     close (arqi);

 

update:

fiz mais algumas coisas.
 

Spoiler

Program T16N04 ;

uses
CRT, modulos;
const
gabaritoOficial = 'AAAAAAAAAAADACCCCCCEAAAAACCCCCAAAAADDDDDEADDDDEDDE';
type
regGabProvaAluno = record
  insc:integer;    //número de inscrição
  gab :string[50]; //gabarito da prova (do aluno)
end;

var
reg:regis;
GabProvaAluno :regGabProvaAluno;
br,er,prv,media,mediam,nota,mediap:integer;
prvum,arqprova,prvdo:text;
gabc:string[50];
corr,numx:integer;
regi:regis;
regii:regis;
respx:string[54];
resp :string[50];
arqi:file of regis;
nota1,nota2,ab, totalu,ce,c,a,z,e,tot,x:integer;
vet:vetor;
pagina,notap,notam:real;

BEGIN
  
  //1:  Funciona
  assign(arqi,'cand.ind');
  reset(arqi);
  while not (eof(arqi)) do
  begin
    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);
  end;
  
  
  //2:
  
  //3: funciona
  repeat
    writeln ('qual prova será corrigida, 1 ou 2 ?');
    readln (prv);
  until (prv=2) or (prv=1);
  
  //4: removido.
  
  //5: funciona
  if (prv=1) then
  assign(arqprova,'PROVA1.TXT')
  else
  if (prv=2) then
  assign(arqprova,'PROVA2.TXT');
  reset(arqprova);
  writeln(' ');
  
  //6: como faço pra ele arrumar apenas o que foi digitado errado? no mais ele funciona.
  {
  writeln ('digite o gabarito,apenas: a,b,c,d,e');
  for corr:= 1 to 10 do
  repeat
    z:=z+1;
    writeln (z,':');
    readln (gab[corr]);
  until (gab[corr]='a') or (gab[corr]='b') or (gab[corr]='c') or (gab[corr]='d') or (gab[corr]='e');
  }
  
  //7:
  gabc:=gabaritoOficial;
  
  while not(eof(arqprova)) do
  
  begin
    
    //7.1:
    readln(arqprova,respx); //ler a linha do arquivo
    //7.2:
    val(copy(respx,1,4),GabProvaAluno.insc,e);
    GabProvaAluno.gab:=copy(respx,5,50);
  //end;
  
  //7.3:
  //pebin1 (regi.num,respx,c,c_chave);
  
  //7.4:
  {
  seek(read.pf);
  }
  
  //7.5:
  //portugues
  begin
    totalu:=0;
    ce:=0;
    er:=0;
    br:=0;
    for a:= 1 to 24 do
    if GabProvaAluno.gab[a]=gabc[a] then
    ce:=ce+4
    //else
    //GabProvaAluno.gab[a]=null then
    // br:=br+1
    else
    er:=er+1;
    nota1:=ce;
  end;
  //matematica
  begin
    ce:=0;
    er:=0;
    for a:= 25 to 50 do
    if GabProvaAluno.gab[a]=gabc[a] then
    ce:=ce+4
    //else
    //GabProvaAluno.gab[a]=null then
    //br:=br+1
    else
    er:=er+1;
    nota2:=ce;
  end;
  // writeln ( GabProvaAluno.insc,'   nota: ',nota,'   erros: ',er);
  
  
  //7.7:
  {totalu:=totalu+1;
  notap:=nota1/totalu;
  notam:=nota2/totalu;}
  //writeln('matematica:  ',notam,'  portugues:   ',notap);
  
  
  //7.8  7.8 se prova = 1, atualizar os campos nota1 e nota2; se prova =2, atualizar os campos
  // nota3, nota4 e soma
  
  if prv = 1 then       //teste
  write (arqi,reg);
	seek(arqi,reg.n1);
    
  reg.n1:=(nota1);
  
end;
close (arqi);




//7.9:
//pagina:=totalu mod 40 = 0;
writeln (' relatorio correção - ordem inscricao         pagina');
writeln (' num  nome                   portugues        matematica  ');
writeln ('                            ce er br not     ce er br not');
writeln (GabProvaAluno.insc,'       ',ce,er,br,nota1,'',ce,er,br,nota2);
//8:
totalu:=totalu+1;
  notap:=nota1/totalu;
  notam:=nota2/totalu;
  writeln('matematica:  ',notam,'  portugues:   ',notap);

END.

 

 

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