JPG Posted April 29, 2013 at 11:29 PM Report #505257 Posted April 29, 2013 at 11:29 PM 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.
nunopicado Posted April 29, 2013 at 11:40 PM Report #505261 Posted April 29, 2013 at 11:40 PM 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.
JPG Posted April 30, 2013 at 12:05 AM Author Report #505264 Posted April 30, 2013 at 12:05 AM A minha duvida se encontra na parte em tenho que ler o arquivo palavra a palavra.
passarito Posted April 30, 2013 at 01:20 AM Report #505267 Posted April 30, 2013 at 01:20 AM Para fazeres isso usas a seguinte expressão: readln(f,s); em que f é um file of text s é uma string
nunopicado Posted April 30, 2013 at 12:03 PM Report #505303 Posted April 30, 2013 at 12:03 PM 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.
thoga31 Posted April 30, 2013 at 01:30 PM Report #505312 Posted April 30, 2013 at 01:30 PM 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... 🙂 1 Report Knowledge is free!
passarito Posted April 30, 2013 at 02:33 PM Report #505318 Posted April 30, 2013 at 02:33 PM (edited) 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! Edited April 30, 2013 at 02:33 PM by passarito
nunopicado Posted April 30, 2013 at 08:07 PM Report #505366 Posted April 30, 2013 at 08:07 PM 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.
passarito Posted May 1, 2013 at 04:19 PM Report #505474 Posted May 1, 2013 at 04:19 PM Numa iniciação tenho as minhas dúvidas, mas é claro que concordo contigo.
frankd2 Posted May 5, 2013 at 12:16 PM Report #505863 Posted May 5, 2013 at 12:16 PM (edited) JPG, como ficou o final do programa? Edited May 5, 2013 at 01:30 PM by thoga31 Retirar maiúsculas
JPG Posted May 6, 2013 at 07:45 PM Author Report #505962 Posted May 6, 2013 at 07:45 PM (edited) 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. Edited May 6, 2013 at 08:06 PM by nunopicado Adicionada a linguagem às tags GeShi
thoga31 Posted May 6, 2013 at 08:13 PM Report #505965 Posted May 6, 2013 at 08:13 PM 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. 1 Report Knowledge is free!
thoga31 Posted May 6, 2013 at 09:10 PM Report #505971 Posted May 6, 2013 at 09:10 PM 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!
JPG Posted May 6, 2013 at 11:23 PM Author Report #505994 Posted May 6, 2013 at 11:23 PM 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.
thoga31 Posted May 7, 2013 at 12:29 PM Report #506069 Posted May 7, 2013 at 12:29 PM 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!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now