Ir ao conteúdo

Manipular strings em Pascal


neodarkman

Posts recomendados

Postado

Olá... sou novato em pascal.

Tenho um arquivo txt com o conteúdo:

01011101
00001011
11111011
00001111
11110111
00001111
11110111
00000111
11101101
00000100

Preciso ler esse arquivo e pegar apenas as linhas ímpares, desprezar o primeiro dígito e testar os 4 seguintes da seguinte forma:

trocar os 0s por ABCD, mas seguindo a ordem:

01234        => ordem
ABCD

00111101 => 1ª Linha
-A
00101101 => 3ª Linha
- B
0001101 => 5ª Linha
C
00001001
D

Consigo trocar tudo, mas não consigo pular as linhas e pegar o resultado delas e juntar numa só string tipo:

A;B;C;D;A;B;C;D;....

O que eu já fiz:

program trata_dados;
uses
crt,strutils,Sysutils;

var
R, Linha,X: string;
i,ext: integer;
arq: TextFile;
Begin
i := 0;
Assign(arq,'amostra_lido.txt');
Reset(arq);
While not eof(arq) do
begin
Readln(arq,Linha);
R:= ReverseString(Linha);
Writeln(R);
Write(' ');
For ext:=1 to 8 do
begin
For i:= 2 To 5 do
begin
if ((R[i]= '0') and (i=2)) then X:= 'A;'
else
if ((R[i]= '0') and (i=3)) then X:= 'B;'
else
if ((R[i]= '0') and (i=4)) then X:= 'C;'
else
if ((R[i]= '0') and (i=5)) then X:= 'D;'
else
X:= '';
Write(X);


end;
writeln();
end;

end;

end.

Qualquer ajuda eu agradeço.

  • Membro VIP
Postado

Olá neodarkman.

Preciso ler esse arquivo e pegar apenas as linhas ímpares, desprezar o primeiro dígito e testar os 4 seguintes da seguinte forma:

trocar os 0s por ABCD, mas seguindo a ordem:

01234        => ordem
ABCD

00111101 => 1ª Linha
-A
00101101 => 3ª Linha
- B
0001101 => 5ª Linha
C
00001001
D

Até tentei, mas não consegui entender o problema... ^_^

Por favor, explique melhor o que deve ser feito... e por exemplo, postando como ficaria o resultado final na tela se estivesse usando esse arquivo...

PS: Para pular uma linha no arquivo de texto, basta "ler a linha" e não fazer nada. Dai ler a próxima e verifica.

No aguardo.

Postado
Olá neodarkman.

Até tentei, mas não consegui entender o problema... ^_^

Por favor, explique melhor o que deve ser feito... e por exemplo, postando como ficaria o resultado final na tela se estivesse usando esse arquivo...

PS: Para pular uma linha no arquivo de texto, basta "ler a linha" e não fazer nada. Dai ler a próxima e verifica.

No aguardo.

Olá, obrigado por responder, ficou confuso mesmo a minha explicação, mas vamos lá....

Tenho um arquivo :



01011101
00001011
11111011
00001111
11110111
00001111
11110111
00000111
11101101
00000100

É uma arquivo txt. Desprezamos os primeiros caracteres, contando do 2º em diante até 4 caracteres. Veja são números binários, levamos em conta do 2º até o 4º bit:

11101101

logo meu arquivo seria uma tabela da seguinte maneira



- ABCD---
0 1011101 =>- -B-----
0 0001011 => pula
1 1111011 =>- ABCD
0 0001111 =>pula
1 1110111 =>- ---D---
0 0001111 =>pula
1 1110111 =>- ---D---
0 0000111 =>pula
1 1101101 =>- --C-D---
0 0000100 =>pula
0 1111111 =>- ------

Cada coluna, desprezando a 1ª, corresponde as letras A,B,C e D; cada zero nas linhas correspondem a uma seleção na coluna correspondente...

No final gero a string com todas as respostas, como um gabarito:

B;ABCD;D;D;CD;ABCD;;

Está menos confuso?? é é é

Mudei o código, mas está aparecendo uns caracteres estranhos:


program trata_dados;
uses
crt,strutils,Sysutils;

var
R, Linha,X: string;
dados: array[1..150] of string;
i,j,k: integer;
arq: TextFile;

alts: array[1..4] of string = ('A','B','C','D');
begin
i := 0;

Assign(arq,'amostra_lido.txt');
Reset(arq);
While not eof(arq) do
begin
Readln(arq,Linha);
R:= ReverseString(Linha);
dados[i]:= Linha;
i := i + 1;
end;

for j:=0 to (i-1) do
begin
for k:=0 to 3 do
begin
if not odd(j) then
begin

if (Copy(dados[j],k+1,1)='0') then X:=alts[k];

write(X);

end;
write(';');
end;
end;

writeln();
end.

Aparece isso num terminal:



�D�<@B0�D�^D▒;�D�<@B0�D�^D▒;�D�<@B
0�D�^D▒;�D�<@B0�D�^D▒;;;;;�D�<@B0�D�^D▒;�
D�<@B0�D�^D▒;�D�<@B0�D�^D▒;�D�<@B
0�D�^D▒;;;;;�D�<@B0�D�^D▒;�D�<@B0�D�^D▒;�D
�<@B0�D�^D▒;�D�<@B0�D�^D▒;;;;;�D�<@B
0�D�^D▒;�D�<@B0�D�^D▒;�D�<@B0�D�^D▒;�D
�<@B0�D�^D▒;;;;;�D�<@B0�D�^D▒;�D�<@B
0�D�^D▒;�D�<@B0�D�^D▒;C;;;;;C;C;B;B;;;;;�D�<@B0�D
�^D▒;�D�<@B0�D�^D▒;B;B;;;;;�D�<@B0�D�^D▒;A;B;
C;;;;;�D�<@B0�D�^D▒;�D�<@B0�D�^D▒;�D�<@B
0�D�^D▒;C;;;;;C;C;C;C;;;;;C;C;C;C;;;;;C;C;C;C;;;;;C;C;C;C;;;;;C;C;C;C;

  • Membro VIP
Postado
É uma arquivo txt. Desprezamos os primeiros caracteres, contando do 2º em diante até 4 caracteres. Veja são números binários, levamos em conta do 2º até o 4º bit:

Não seria do 2º a 5º? (mas eu entendi ^_^)

Cada coluna, desprezando a 1ª, corresponde as letras A,B,C e D; cada zero nas linhas correspondem a uma seleção na coluna correspondente...

No final gero a string com todas as respostas, como um gabarito:

B;ABCD;D;D;CD;ABCD;;

Meu gabarito deu diferente...

Minha análise:

- ABCD---
0 1011101 =>- -B-----
0 0001011 => pula
1 1111011 =>- ABCD //PORQUE "ABCD" SE NÃO TEM NENHUM 0 ???
0 0001111 =>pula
1 1110111 =>- ---D---
0 0001111 =>pula
1 1110111 =>- ---D---
0 0000111 =>pula
1 1101101 =>- --C-D--- //NÃO SERIA SOMENTE "C" ?
0 0000100 =>pula
0 1111111 =>- ------

Logo: B;;D;D;C;;

***

Vamos ao que interessa...

Então, existem vários pequenos detalhes, e que um de certo modo influência no outro.. mas basicamente você precisa revisar o código se atentando ao detalhe da faixa do array e a faixa percorrida pelas variáveis auxiliares, ou seja, num você começa 1, indo de 1..4, no outro começa de 0, indo de 0..3. ;)

Esse caracteres bagunçados é justamente por o código está acessando uma posição que "não existe", logo pega o "lixo da memória"...

Outro detalhe é que o ODD() verifica se é impar, ou seja, um "not ODD()" é o mesmo que "se é par"... (tá o contrário).

E para simplificar o processo, você pode verificar se é impar, antes de do for que copia e compara, e não dentro dele... tipo:

O seu código está assim:

para cada uma das linhas faça
para cada uma das quatro colunas faça
se é PAR faça (reforçando que está invertido)

Mas, seria melhor verificar logo antes!!!

para cada uma das linhas faça
se é IMPAR faça
para cada uma das quatro colunas faça

Percebes a diferença?

RESUMINDO

- A verificação de paridade está invertida (está par em vez de ímpar);

- Melhor verificar a paridade antes de começar ver as colunas;

- Precisa-se decidir se vai trabalhar de 0..3 ou de 1..4.

- Por ai vai...

Creio que "corrigindo" esses pontos, você já chega perto...

PS: A depender da sua evolução, podemo passar outras dicas. (não passo logo para não atrapalhar o seu próprio desenvolvimento)

No aguardo.

Postado
Não seria do 2º a 5º? (mas eu entendi ^_^)

De fato eu me atrapalhei, é do 2º ao 5º

Meu gabarito deu diferente...

Minha análise:

- ABCD---
0 1011101 =>- -B-----
0 0001011 => pula
1 1111011 =>- ABCD //PORQUE "ABCD" SE NÃO TEM NENHUM 0 ???
0 0001111 =>pula
1 1110111 =>- ---D---
0 0001111 =>pula
1 1110111 =>- ---D---
0 0000111 =>pula
1 1101101 =>- --C-D--- //NÃO SERIA SOMENTE "C" ?
0 0000100 =>pula
0 1111111 =>- ------

Logo: B;;D;D;C;;

***

eu errei de novo, estou há dias tentando resolver esse problema...

Vamos ao que interessa...

Então, existem vários pequenos detalhes, e que um de certo modo influência no outro.. mas basicamente você precisa revisar o código se atentando ao detalhe da faixa do array e a faixa percorrida pelas variáveis auxiliares, ou seja, num você começa 1, indo de 1..4, no outro começa de 0, indo de 0..3. ;)

Eu achei que o array com as letras começaria no 0 (0,1,2,3), mas depois percebi que começa no 1, (1,2,3,4)

Esse caracteres bagunçados é justamente por o código está acessando uma posição que "não existe", logo pega o "lixo da memória"...

foi o que imaginei, pegando lixo na memória...

Outro detalhe é que o ODD() verifica se é impar, ou seja, um "not ODD()" é o mesmo que "se é par"... (tá o contrário).

Aí é a questão de começar a contar com 0 ou com 1. Usei o ODD() percebi que pegava a 2 linha... não a primeira. Daí coloquei o NOT e começou a pegar a primeira...

E para simplificar o processo, você pode verificar se é impar, antes de do for que copia e compara, e não dentro dele... tipo:

O seu código está assim:

para cada uma das linhas faça
para cada uma das quatro colunas faça
se é PAR faça (reforçando que está invertido)

Mas, seria melhor verificar logo antes!!!

para cada uma das linhas faça
se é IMPAR faça
para cada uma das quatro colunas faça

Percebes a diferença?

RESUMINDO

- A verificação de paridade está invertida (está par em vez de ímpar);

- Melhor verificar a paridade antes de começar ver as colunas;

- Precisa-se decidir se vai trabalhar de 0..3 ou de 1..4.

- Por ai vai...

Creio que "corrigindo" esses pontos, você já chega perto...

PS: A depender da sua evolução, podemo passar outras dicas. (não passo logo para não atrapalhar o seu próprio desenvolvimento)

No aguardo.

Muito obrigado pelos seus esclarecimentos.... irei verificar os pontos.

Depois eu posto os resultados obtidos.

Postado

Olá...

tentei fazer as mudanças....


program trata_dados;
uses
crt,strutils,Sysutils;

var
R, Linha,X: string;
dados: array[1..150] of string;
i,j,k: integer;
arq: TextFile;

alts: array[1..4] of string = ('A','B','C','D');
begin
i := 0;
Assign(arq,'amostra_lido.txt');
Reset(arq);
While not eof(arq) do
begin
Readln(arq,Linha);
R:= ReverseString(Linha);
dados[i]:= R;

i := i + 1;
end;
for j:=1 to (i) do
begin
if not odd(j) then
begin
for k:=1 to 4 do
begin

if (Copy(dados[j],k+1,1)='0') then X:=alts[k];

write(X);
write(';');

end;

end;

end;

writeln();
end.

Até deixeir o arquivo texto "arquivo_lido.txt" com somente linhas ímpares:


01011101

11111011

11110111

11110111

11101101

11011111

01010101

00000011

01101001

Mas... não produz o que preciso.

Se tiro o not odd(j) e deixo apenas odd(j) tenho:


10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;101
11010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;101110
10;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;10111010;

Se deixo o not odd(j)

tenho:

10111010;B;B;B;B;B;C;C;C;C;C;C;A;A;A;D;D;D;D;D;A;A;C;C;C;B;C;D;A;B;B;D;

Deveria retornar algo do tipo:

 A;A;C;C;AD;;AC;BCD;ABD 

Já que temos apenas 9 linhas ímpares...

Ops.. mudei essa parte do código novamente:


for j:=1 to (i) do
begin
if not odd(j) then
begin
for k:=1 to 4 do
begin

if (Copy(dados[j],k+1,1)='0') then X:=alts[k];

end;
writeln(dados[j]+' = ' + X);

end;

end;

e... tive como resultado:


11011111 = B
11101111 = C
11101111 = C
10110111 = D
11111011 = D
10101010 = C
11000000 = D
10010110 = D

Melhorou!!! Falta apenas verificar quando tiver 2 ou mais zeros nos 4 bits analisados, o que corresponderia a marcação dupla; e quando todos os 4 bits forem 1, resultando na não marcação.

O curioso é que continuo tendo que usar o not odd(j)... se não a rotina pega as linhas pares...

  • Membro VIP
Postado

Olá...

1) Faixa do array

Como já comentado na postagem anterior, você está utilizando uma faixa no array começando com 1..4, mas está acessando começando com "0". Está errado!

Solução:

Veja que o i está começando com "0", e por consequência, está acessando uma posição invalida em dados[], ou seja, não existe a posição dados[0]..

^_^

Então, se i começar com "0" (zero), o i:=i+1; deve ficar antes de atribuir o valor a dados[], pois ai vai ficar dados[1], dados[2]... etc.

Ou simplesmente mude de i:=0 para i:=1;

Obs.: Eu acho o mais correto começar com "0", ou seja, a medida que vai adicionando um novo, o valor é atualizado... (faz mais sentido)

2) Ordem de varredura

O Copy() copia os caracteres seguindo a nossa ordem de escrita, ou seja, da esquerda para direita. Logo, se as posições a serem copiadas são 2,3,4,5, a linha deve ficar também escrita da esquerda para direita... logo do modo original...

Resumidamente: não é para inverter a string. (não precisa desse ReverseString(Linha);).

3) Impressão do resultado

O caractere correspondente a posição só deve ser impresso se for encontrado um "0" (zero) e o ";" somente uma vez a cada linha.

***

Abaixo uma imagem do resultado:

resultadom.jpg

No aguardo.

Abraços

Postado

Quanto a varredura Copy...

Eu inverto a string pois ela é recebida invertida!!! Para que haja a correspondência correta é necessário invertê-la.

Essa string (8bits) ela é assim

01234567 => são os "canais" ou colunas do gabarito real.

-ABCD--- (considere o '-' um espaço)

10000111

Mas ela é recebida assim:

76543210

---DCBA- (considere o '-' um espaço)

11100001

Quanto ao i:=0, bom, coloquei o i:=i+1 antes de dados[];

Mas não consegui resolver, ainda a outra parte...

Todavia, obrigado pela ajuda.

  • Membro VIP
Postado
Quanto a varredura Copy...

Eu inverto a string pois ela é recebida invertida!!! Para que haja a correspondência correta é necessário invertê-la.

Não entendi... "recebida invertida" como? Mas em fim, isso não vai mudar o restante da lógica... pois basta usar ou não usar a inversão.

Quanto ao i:=0, bom, coloquei o i:=i+1 antes de dados[];

Esse era o problema central, estava lendo os dados de forma errada...

Mas não consegui resolver, ainda a outra parte...

Que parte?

Vou recapitular:

- Após corrigir essa questão do "contador" de dados, basta agora você imprimir os dados na hora certa: só imprimir "X" se algum zero for encontrado, ou seja, a impressão fica dentro do if também e a impressão do ";" ao final da linha, ou seja, fora do fora do for do k.

Abaixo seu código re-indentado e já implementados algumas mudanças.

Obs.: Fiz algumas mudanças e adicionei outros comandos como demonstração, mas creio que estão autoexplicativos.

[color=#0000ff]program[/color] trata_dados[color=#000000];[/color]
[color=#0000ff]uses[/color]
CRT[color=#000000],[/color]
StrUtils[color=#000000];[/color]
[color=#008000]{Sysutils;}[/color] [color=#008000]//Não está sendo utilizado[/color]

[color=#0000ff]var[/color]
[color=#008000]{R,}[/color] [color=#008000]//dá para inverter direto[/color]
Linha [color=#000000]:[/color][color=#0000ff]string[/color][color=#000000];[/color]
[color=#008000]{X :string;}[/color]
X [color=#000000]:[/color][color=#0000ff]char[/color][color=#000000];[/color]
dados [color=#000000]:[/color][color=#0000ff]array[/color][color=#000000][[/color][color=#ff8000]1[/color][color=#000000].[/color][color=#ff8000].150[/color][color=#000000]][/color] [color=#0000ff]of string[/color][color=#000000];[/color]
i[color=#000000],[/color]j[color=#000000],[/color]k [color=#000000]:[/color][color=#0000ff]integer[/color][color=#000000];[/color]
arq [color=#000000]:[/color]TextFile[color=#000000];[/color]
[color=#008000]{alts: array[1..4] of string = ('A','B','C','D');}[/color]
alts [color=#000000]:[/color][color=#0000ff]array[/color][color=#000000][[/color][color=#ff8000]1[/color][color=#000000].[/color][color=#ff8000].4[/color][color=#000000]][/color] [color=#0000ff]of[/color] [color=#0000ff]char[/color] [color=#000000]= ([/color][color=#a31515]'A'[/color][color=#000000],[/color][color=#a31515]'B'[/color][color=#000000],[/color][color=#a31515]'C'[/color][color=#000000],[/color][color=#a31515]'D'[/color][color=#000000]);[/color]
[color=#0000ff]BEGIN[/color]
ClrScr[color=#000000];[/color]
[color=#ff0080]TextColor[/color][color=#000000]([/color][color=#ff8000]15[/color][color=#000000]);[/color] [color=#008000]//15=código cor branca (mais brilhante)[/color]
i[color=#000000]:=[/color][color=#ff8000]0[/color][color=#000000];[/color]
[color=#ff0080]Assign[/color][color=#000000]([/color]arq[color=#000000],[/color][color=#a31515]'amostra_lido.txt'[/color][color=#000000]);[/color]
[color=#ff0080]Reset[/color][color=#000000]([/color]arq[color=#000000]);[/color]
[color=#0000ff]while[/color] [color=#0000ff]not[/color] [color=#ff0080]eof[/color][color=#000000]([/color]arq[color=#000000])[/color] [color=#0000ff]do[/color]
[color=#0000ff]begin[/color]
[color=#008000]{i:=i+1;}[/color]
[color=#ff0080]inc[/color][color=#000000]([/color]i[color=#000000]);[/color]
[color=#ff0080]readln[/color][color=#000000]([/color]arq[color=#000000],[/color]Linha[color=#000000]);[/color]
[color=#008000]{R:=ReverseString(Linha);}[/color]
[color=#008000]{dados[i]:=R;}[/color]
dados[color=#000000][[/color]i[color=#000000]]:=[/color][color=#ff0080]ReverseString[/color][color=#000000]([/color]Linha[color=#000000]);[/color] [color=#008000]//Eu não entendi ainda porque inverte [/color]
[color=#0000ff]end[/color][color=#000000];[/color]
[color=#0000ff]for[/color] j[color=#000000]:=[/color][color=#ff8000]1[/color] [color=#0000ff]to[/color] i [color=#0000ff]do[/color]
[color=#0000ff]begin[/color]
[color=#008000]{if not odd(j) then}[/color]
[color=#0000ff]if[/color] [color=#ff0080]ODD[/color][color=#000000]([/color]j[color=#000000])[/color] [color=#0000ff]then[/color]
[color=#0000ff]begin[/color]
[color=#0000ff]for[/color] k[color=#000000]:=[/color][color=#ff8000]1[/color] [color=#0000ff]to[/color] [color=#ff8000]4[/color] [color=#0000ff]do[/color]
[color=#0000ff]begin[/color]
[color=#0000ff]if[/color] [color=#000000]([/color][color=#ff0080]Copy[/color][color=#000000]([/color]dados[color=#000000][[/color]j[color=#000000]],[/color]k[color=#000000]+[/color][color=#ff8000]1[/color][color=#000000],[/color][color=#ff8000]1[/color][color=#000000])=[/color][color=#a31515]'0'[/color][color=#000000])[/color] [color=#0000ff]then[/color]
X[color=#000000]:=[/color]alts[color=#000000][[/color]k[color=#000000]];[/color]
[color=#ff0080]write[/color][color=#000000]([/color]X[color=#000000]);[/color]
[color=#ff0080]write[/color][color=#000000]([/color][color=#a31515]';'[/color][color=#000000]);[/color]
[color=#0000ff]end[/color][color=#000000];[/color]
[color=#0000ff]end[/color][color=#000000];[/color]
[color=#0000ff]end[/color][color=#000000];[/color]
writeln[color=#000000];[/color]
ReadKey[color=#000000];[/color] [color=#008000]//para aguardar uma tecla ser pressionada antes de finalizar[/color]
[color=#0000ff]end[/color][color=#000000].[/color]

Restando somente organizar a impressão dos dados...

SUGESTÃO

Em vez de "tabulação" (tab), prefira usar "espaços". Assim evita que o código fique "bagunçado".

PS: Se for o caso, geralmente nos editores (compiladores) dá para configurar para inserir, por exemplo, 2 espaços ao pressionar TAB, em vez de "tabular".

PS2: Se preferir usar tabulação, atente-se a sempre usar em todo o código, para ficar uniforme.

EXTRA

Não sei se você já sabe, mas a string no Pascal funcionam como um array, ou seja, dá para acessar um caractere passando a posição da mesma forma como se faz com os array. Logo, poderia ficar assim:

      [color=#008000]{if (Copy(dados[j],k+1,1)='0') then}[/color]
[color=#0000ff]if[/color] dados[color=#000000][[/color]j[color=#000000]][[/color]k[color=#000000]+[/color][color=#ff8000]1[/color][color=#000000]]=[/color][color=#a31515]'0'[/color] [color=#0000ff]then[/color]

PS: Abaixo uma versão superultramega reduzida...

Atenção, essa versão já está "pronta", logo é por sua conta e risco... :lol:

Depois não diga que não avisei

Cuidaaado

Agora é sério, pode abrir...


[color=#0000ff]uses[/color]
CRT[color=#000000],[/color]
StrUtils[color=#000000];[/color]
[color=#0000ff]const[/color]
alts [color=#000000]=[/color][color=#a31515]'ABCD'[/color][color=#000000];[/color]
[color=#0000ff]var[/color]
Linha [color=#000000]:[/color][color=#0000ff]string[/color][color=#000000];[/color]
i [color=#000000]:[/color][color=#0000ff]byte[/color][color=#000000];[/color]
arq [color=#000000]:[/color][color=#0000ff]Text[/color][color=#000000];[/color]
[color=#0000ff]BEGIN[/color]
ClrScr[color=#000000];[/color] [color=#008000]//limpa a tela[/color]
[color=#ff0080]TextColor[/color][color=#000000]([/color][color=#ff8000]15[/color][color=#000000]);[/color] [color=#008000]//15=código cor branca (mais brilhante)[/color]
[color=#ff0080]Assign[/color][color=#000000]([/color]arq[color=#000000],[/color][color=#a31515]'amostra_lido.txt'[/color][color=#000000]);[/color] [color=#008000]//assinala o arquivo com o caminho[/color]
[color=#ff0080]Reset[/color][color=#000000]([/color]arq[color=#000000]);[/color] [color=#008000]//abre o arquivo[/color]
[color=#0000ff]while[/color] [color=#0000ff]not[/color] [color=#ff0080]Eof[/color][color=#000000]([/color]arq[color=#000000])[/color] [color=#0000ff]do[/color] [color=#008000]//enquanto não for o fim do arquivo[/color]
[color=#0000ff]begin[/color]
[color=#ff0080]readln[/color][color=#000000]([/color]arq[color=#000000],[/color]Linha[color=#000000]);[/color] [color=#008000]//ler a linha atual (e faz apontar para o próximo)[/color]
linha[color=#000000]:=[/color][color=#ff0080]ReverseString[/color][color=#000000]([/color]linha[color=#000000]);[/color] [color=#008000]//inverte a linha[/color]
[color=#0000ff]for[/color] i[color=#000000]:=[/color][color=#ff8000]1[/color] [color=#0000ff]to[/color] [color=#ff8000]4[/color] [color=#0000ff]do[/color] [color=#008000]//para os 4 caracteres[/color]
[color=#0000ff]if[/color] linha[color=#000000][[/color]i[color=#000000]+[/color][color=#ff8000]1[/color][color=#000000]]=[/color][color=#a31515]'0'[/color] [color=#0000ff]then[/color] [color=#008000]//se conter "0"[/color]
[color=#ff0080]write[/color][color=#000000]([/color]alts[color=#000000][[/color]i[color=#000000]]);[/color] [color=#008000]//imprime o código correspondente[/color]
[color=#ff0080]write[/color][color=#000000]([/color][color=#a31515]';'[/color][color=#000000]);[/color] [color=#008000]//imprime um ";" sempre ao final da linha[/color]
[color=#ff0080]readln[/color][color=#000000]([/color]arq[color=#000000],[/color]Linha[color=#000000]);[/color] [color=#008000]//ler mais uma vez, para pular a linha par[/color]
[color=#0000ff]end[/color][color=#000000];[/color]
writeln[color=#000000];[/color]
ReadKey[color=#000000];[/color] [color=#008000]//para aguardar uma tecla ser pressionada antes de finalizar[/color]
[color=#0000ff]END[/color][color=#000000].[/color]
[color=#0000ff]program[/color] trata_dados[color=#000000];[/color]

No aguardo.

Abraços

Postado

Antes de ler a sua mensagem, a última, eu já tinha conseguido resolver... ficou bem parecido com o seu código.

A questão da inversão é a seguinte:

Eu, programei muito no passado (idos dos anos 80): basic, cobol, assembler Z80... e pascal na universidade.

Hoje sou professor de Física e a escola onde trabalho (sou servidor público, a escola é pública) comprou a cerca de 2 anos uma leitora de gabaritos que nunca conseguiram por para funcionar... eu resolvi pegar o desafio e fazê-la trabalhar.... pois bem.

A leitora foi comprada com critério preço na época, sem levar em conta os programas que a fariam funcionar.... compraram uma que vem apenas com um programa demo e o fabricante vende, muito, mas muito caro, o programa completo. A escola não tem recursos para comparar esse programa, levamos quase os 2 anos pagando a leitora.... olha que foi a mais barata, na época. Mas foi o barato que saiu caro. Imagina que ela custo quase 5 mil reais... o programa que atende as nossas necessidades custa 4 mil.

Eu descobri que a mesma pode ser acessada via serial, usando um protocolo de comunicação, tal qual está nos manuais dela... mal documentado mas está la. O fabricante vende uma biblioteca de acesso... mas custa 3.800 reais.... só a biblioteca. Ter comprado essa leitora é como se você tivesse comprado um carro, mas a chave que veio nele só o faz andar a 40 km/h.... para ele andar a 80 km/h, você tem que compara outra chave que custa quase o valor do carro.

Daí, eu resolvi retomar meus tempos de programador e escrever um programa para essa leitora que atenda às nossas necessidades em particular. Estou desenvolvendo usando o Lazarus+freepascal... desenvolvendo rotina por rotina.... espero inciar 2013 com o programa funcional.

Já consigo comunicar com a leitora... consigo fazê-la ler gabaritos, mas ela devolve a informação como uma string binária.... invertida. ela lê gabaritos (tipo cartão da mega sena, só que mais comprido) com 12 colunas (ou canais, 0 a 11), mas ela devolve a informação invertida assim:

Canais=> (0)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12) => ordem real

(7)(6)(5)(4)(3)(2)(1)(0)(X)(X)(X)(X)(11)(10)(9)(8) =>ordem enviada, só que em binário.

E mais ela devolve da última linha em direção da primeira.

Esse programainha que você me ajudou a desenvolver, será uma rotina de interpretação desses dados binários... transformando-os nas informações marcadas no gabarito.

Entendeu agora porque tenho que inverter a string?

Já sei como pegar os dados da leitora...

falta interpretar esses dados binários e transformá-los em:

matrícula,respostas do aluno

bloco de prova, tipo de prova, número de chamada....

Tem uns 20 anos que não lido diretamente com programação.... mas sou micreiro desde 1986....

Já passei por TK90X, TK95, TK2000, Apple][ e+, TK3000, MSX (hotbit/expert); cp200/cp300, TRScolor.... XT,AT.... já quebrei cabeça com Msdos, CPM/80, MSXDOS, COBOL, MSBASIC, HBASIC, C, Assembler do Z80, Assembler do 65C02 (processador dos clones apples II no Brasil)...., Pascal na faculdade.... lidei com aqueles terminais IBM3270... e hoje sou professor de Física...

Já tinha arranhado no Delphi anos atrás.... com PHP/GTK-PHP/Postgres recentemente... mas tudo isso sozinho... lendo livros, fuçando na net... testando código...

Minha formação mesmo é Técnico em Eletronica/Eletricidade e Graduação em Física pela Universidade de Brasília - UnB.

Eu aprendi muito lendo teus posts em outras dúvidas de colegas dessse fórum e aprendi muito com suas dicas ness post.

Eu uso Linux desde 1997... windows só para jogos fps(COD..).

Os programinhas em pascal edito no Geany (http://www.geany.org/) com o freepascal 2.6.0 num Core i7 rodando kubuntu 12.10.

Digamos que estou reaprendendo a programar.... antes eu brincava com PHP/javascript...

Então, voltando....

A leitora devolve uma string assim:

<ack><stx><tam><F1><última linha ..... primeira linha><etx><crc1><crc2>

os dados entre <F1> e <etx> são os marcados no gabarito.

O arquivo_lido.txt é apenas uma pequena parte dos dados enviados de UM gabarito lido. O chato, talvez, será invertes esses dados para a ordem:

1ª Linha -> Última linha..... já que as 10 primeiras informam a matrícula e número de chamada, as 2 seguintes o bimestre e o bloco de prova, as demais as respostas marcadas.

Já que a leitora além de inverter os dados nas linhas, ainda inverte a ordem:

Última linha -> 1ª linha.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!