Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

JPG

Arquivo texto em pascal

Mensagens Recomendadas

JPG    0
JPG

Desenvolva um programa em pascal que processe dois arquivos texto da seguinte forma. Inicialmente, o programa deve pedir ao usuario os nomes dos arquivos, grantindo nomes distintos. Em seguida deve mostrar na tela o conteúdo dos dois arquivos.

Supondo que o primeiro arquivo possua, no máximo, 500 palavras distintas, o programa deve então remover todas as palavras do segundo arquivo que ocorrem no primeiro e mostrar novamente os dois arquivos na tela.

Preciso de ajuda já tentei fazer de varias formas mas nenhuma da certo. Caso alguem possa ajudar agradeço.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nunopicado    1090
nunopicado

Boa noite

Em que fase é que não está a dar certo?

Divide o programa em vários programas menores:

1. Ler o nome do primeiro arquivo -> Básico

2. Ler o nome do segundo artigo, até que seja diferente do 1º -> Simples

3. Construir uma função que leia um arquivo e mostre no ecrã o conteúdo -> Simples dentro da manipulação de arquivos

4. Construir uma função que leia o arquivo palavra a palavra (assumindo por exemplo o espaço como divisor de palavras).

5. Percorrer o segundo arquivo com a função criada em 4.

a) Para cada palavra encontrada, percorrer com a função criada em 4 o primeiro arquivo e contar o número de incidências

b) Regravar no segundo arquivo apenas as palavras cuja contagem de incidências efetuada em a) seja 0

Dependendo do método que resolveres usar, é mais ou menos esta a divisão geral de problemas

O que já fizeste, ou que está a falhar, onde estão as dúvidas.

Para poderes ter ajuda, tens de especificar onde tens duvidas. Uma questão genérica do tipo "Caso alguém possa ajudar" sem mais indicação, indicia desejo que te façam o trabalho, e isso dificilmente alguém aqui o fará.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nunopicado    1090
nunopicado

Passarito: Ele quer palavra a palavra, e não linha a linha.

JPG:

Para leres palavra a palavra, como as palavras não têm todas o mesmo tamanho, tens de ir controlando o divisor de palavras (em principio o espaço.

Uma forma de fazeres isso será leres o ficheiro caracter a caracter ( read(f,ch); - sendo ch uma variável do tipo CHAR ) e ires acumulando o valor dessa variável numa variavel temporaria do tipo string, até que encontres um novo espaço. Quando encontrares, significa que na variavel temporaria tens uma palavra completa.

Fazes os testes que tens a fazer com ela, e no fim limpas a variavel temporaria, para voltar a ler o ficheiro caracter a caracter.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    594
thoga31

Ter em atenção os caracteres de terminação de linhas (ou parágrafos). Há que lhes dar o devido desconto e não incluí-las nas palavras erroneamente. E claro, cuidado com a pontuação - ponto final, vírgula, ponto de exclamação, etc... :)


Knowledge is free!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
passarito    51
passarito

Dá-me ideia que cada linha é uma palavra, mas se queremos ir pelo método mais complicado, então que assim seja!

Se é para ler palavra a palavra, então é muito simples...

1. Colocar as palavras do 1º ficheiro num array tipo string palavra a palavra

Var
 Palavras: array [1..500] of string;
 ch:char;
 nw: integer; {numero de palavras}
 f1: text;

....
nw:=0;
while not eof(f1) and nw<500 do begin
 read(f1,ch);
 if ch in ['a'..'z','A'..'Z'] then
inc(nw);
palavras[nw]:='';
repeat
  palavras[nw]:=palavras[nw]+ch;
  read(f1,ch);
until not (ch in ['a'..'z','A'..'Z']);
 end;
end;
.....

2. Renomear o 2º ficheiro para outro nome qualquer, normalmente uso ou .BAK ou .OLD

3. Ler o 2º para um 3º com antigo nome do 2º verificando as palavras do array

- No fim do ciclo guardar o numero de palavras (nw) noutra variavel para quando for comparar o array não o fazer até às 500 palavras se este não as tiver!

Editado por passarito

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nunopicado    1090
nunopicado

Se o enunciado indicar que cada linha é uma palavra, então sim, evita-se tudo isto.

Mas se não indicar nada, é melhor fazer assim.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
JPG    0
JPG

PROGRAM Q1;

VAR
ARQ1, ARQ2, AUX: TEXT;
V1, V2: ARRAY[1..20] OF STRING;
L, K, I, J: INTEGER;
PALAVRA:STRING;
A, B: STRING;
CONT1, CONT2:INTEGER;

BEGIN
WRITE('PRIMEIRA QUESTÃO DA AD2 2013-1 DE FUNDAMENTOS DE PROGRAMACAO');
WRITELN;
WRITELN;
WRITELN;

REPEAT
WRITE('ENTRE COM O NOME DO PRIMEIRO ARQUIVO: ');
READLN(A);
WRITE('ENTRE COM O NOME DO SEGUNDO ARQUIVO: ');
READLN(B);
WRITELN;
WRITELN;
IF A = B THEN
WRITELN('ERRO! O SEGUINTE ERRO DOI DETECTADO:');
WRITELN;
IF A = B THEN
WRITELN('OS ARQUIVOS DEVEM SER DIFERENTES!');
WRITELN;
WRITELN;
UNTIL (A)<>(B);

ASSIGN(ARQ1, A);
ASSIGN(ARQ2, B);
ASSIGN(AUX, 'AUXILIAR.TXT');
ASSIGN(AUX1, 'AUX1.TXT');
ASSIGN(AUX2, 'AUX2.TXT');

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

WRITELN;
WRITELN('PRIMEIRO ARQUIVO');
WRITELN;
RESET(ARQ1);


WHILE NOT EOF(ARQ1) DO
BEGIN

READLN(ARQ1,PALAVRA);
WRITELN(PALAVRA);
END;
CLOSE(ARQ1);

WRITELN;
WRITELN('PRESSIONE  PARA PROSEGUIR!');
READLN;

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

WRITELN;
WRITELN('SEGUNDO ARQUIVO');
WRITELN;
RESET(ARQ2);

WHILE NOT EOF(ARQ2) DO
BEGIN

READLN(ARQ2,PALAVRA);
WRITELN(PALAVRA);
END;
CLOSE(ARQ2);

RESET(ARQ1);
I:=1;
J:=1;


WHILE NOT EOF(ARQ1) DO
BEGIN
READLN(ARQ1,PALAVRA);
V1[i]:=PALAVRA;
I:=I+1;
CONT1:=CONT1+1;

END;
CLOSE(ARQ1);

RESET(ARQ2);


WHILE NOT EOF(ARQ2) DO
BEGIN
READLN(ARQ2,PALAVRA);
V2[J]:=PALAVRA;
J:=J+1;
CONT2:=CONT2+1;

END;
CLOSE(ARQ2);


REWRITE(AUX);

FOR L:= 1 TO CONT1 DO
BEGIN
FOR K:= 1 TO CONT2 DO
BEGIN
IF V2[K]=V1[L] THEN
WRITELN(AUX,V2[K])

END;

END;


CLOSE(AUX);

WRITELN;
WRITELN('PRESSIONE  PARA PROSEGUIR!');
READLN;

WRITELN;
WRITELN('****************************************');
WRITELN;
WRITELN;
WRITELN('ARQUIVO CONTENDO AS PALAVRAS REPITIDAS: ');
WRITELN;
WRITELN;
RESET(AUX);

WHILE NOT EOF(AUX) DO
BEGIN

READLN(AUX,PALAVRA);
WRITELN(PALAVRA);
END;
CLOSE(AUX);

WRITELN;
WRITELN('PRESSIONE  PARA PROSEGUIR!');
READLN;

WRITELN;
WRITELN;
WRITELN('****************************************************');
WRITELN;
WRITELN;
WRITELN('O PRIMEIRO ARQUIVO: ');
WRITELN;
WRITELN;
RESET(ARQ1);

WHILE NOT EOF(ARQ1) DO
BEGIN

READLN(ARQ1,PALAVRA);
WRITELN(PALAVRA);
END;
CLOSE(ARQ1);

WRITELN;
WRITELN;
WRITELN('****************************************************');
WRITELN;
WRITELN;
WRITELN('O SEGUNDO ARQUIVO DEPOIS A RETIRADA DAS PALAVRAS: ');
WRITELN;
WRITELN;
RESET(AUX);

WHILE NOT EOF(AUX) DO
BEGIN

READLN(AUX,PALAVRA);
WRITELN(PALAVRA);
END;
CLOSE(AUX);

WRITELN;
WRITELN;
WRITE('PARA FECHAR O PROGRAMA DIGITE !');
WRITELN;
READLN;
END.

Fiz a questão so que quando tenho que mostrar o segundo arquivo depois de modificado não esta mostrando a resposta certa. Gostaria de ouvir opiniões.

Editado por nunopicado
Adicionada a linguagem às tags GeShi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    594
thoga31

Eu neste momento, infelizmente, não tenho tempo para ver com cuidado o programa. Mas há duas coisas fundamentais que me saltam à vista: 1) a falta de indentação e 2) o uso exclusivo de maiúsculas. Facilitaria muito o código ter indentação para a sua legibilidade, e o uso selectivo de capital letters também.


Knowledge is free!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    594
thoga31

Ok, demorei menos tempo do que pensava a preparar as aulas de amanhã...

IF A = B THEN
WRITELN('ERRO! O SEGUINTE ERRO DOI DETECTADO:');
WRITELN;
IF A = B THEN
WRITELN('OS ARQUIVOS DEVEM SER DIFERENTES!');

Para quê dois IF's? Não basta um para dar a mensagem?

WHILE NOT EOF(ARQ1) DO
BEGIN
READLN(ARQ1,PALAVRA);
WRITELN(PALAVRA);
END;
CLOSE(ARQ1);

Estás sempre a repetir estes blocos de código. Que tal criar um procedimento que receba o ficheiro a ser trabalhado por referência?

READLN(ARQ1,PALAVRA);

É suposto cada linha do arquive ser uma palavra?

Imaginemos estes dois ficheiros:

FICHEIRO 1:
Este e um ficheiro magnifico e unico no mundo.
Voila! Francois!

FICHEIRO 2:
Ja este e um ficheiro rasca.
Toma la que ja foste.

Supostamente o output do ficheiro 2 deveria ser este (segundo o que percebi):

Ja rasca.
Toma la que ja foste.

Mas, com o teu código, obtens o 2º ficheiro na íntegra, tal como ele era.

Isto deve-se ao facto de estares a comparar linha a linha e não palavra a palavra. Estás a comparar assim:

"Este e um ficheiro magnifico e unico no mundo."  =  "Ja este e um ficheiro rasca."
FALSO

"Voila! Francois!"  =  "Toma la que ja foste."
FALSO

Mas devia estar a comparar as palavras separadas.

Para isso tens de ler caracter a caracter e fazer o controlo de quando acaba uma palavra e de quando começa outra, tal como o @passarito disse.


Knowledge is free!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
JPG    0
JPG

Entendi perfeitamente oque vc me explicou, Estou aprendendo esta linguagem ainda. Suas criticas foram extremamente uteis. E sobre a leitura dos arquivos fiz o codigo baseado em um arquivo texto em que contem uma palavra por linha, o exercicio não menciona, mas fui orientado a fazer desta forma.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
thoga31    594
thoga31

De nada, estamos aqui para ajudar ;)

Pronto, se é uma palavra por linha então torna-se mais fácil. Estás no caminho certo, portanto.Eu não tenho mesmo tempo para correr uns testes ao teu programa, mas a minha sugestão é fazeres tu mesmo uns testes com vários ficheiros, incluindo alguns "códigos" pelo meio para saberes o que o programa anda a fazer e se está a deslindar bem quais são as palavras repetidas e etc.

Proponho-te fazeres isto pois é muito bom começarmos a ganhar estratégias de "debug caseiro" que nos permitam detectar pequenos problemas sem a necessidade de "grandes ferramentas".


Knowledge is free!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.