Ir ao conteúdo
  • Cadastre-se

Pascal


kbox

Posts recomendados

  • 5 meses depois...

olha...

tô com preguiça de ler o código pra te responder hiueahieuah

eu tenho aqui no meu pc um CAÇA-PALAVRAS q eu fiz ano passado...

ele lê o caça palavras de um arquivo .txt e acha as palavras pré-definidas...

ele usa vááárias dessa funçõeszinhas de navegação em arquivos...

espero q sirvam =)


PROGRAM CacaPalavras (input,output,arq);
{* Programa desenvolvido por Zohlhos do fórum do Clube do Hardware Qualquer dúvida, e-mail-me!. *}
{* Nessa versão, mesmo depois que o programa já tenha achado alguma palavra, ele continua
  a procurando (não a partir da mesma letra)...
  Isso gera mais comparações, porém pode detectar palavras duplicadas... *}
CONST
maxTam = 100; {* Tamanho máximo do lado do tabuleiro. *}
maxPals = 50; {* Número máximo de palavras a serem encontradas *}
maxString = 50; {* Tamanho máximo das palavras a serem encontradas *}
TYPE
arrLetras = ARRAY[0..maxTam +1 ,0..maxTam + 1] OF CHAR;
arrPals = ARRAY[1..maxPals] OF STRING[maxString];
regTab = RECORD
m, n: INTEGER;
ltrs : arrLetras;
END;
regPals = RECORD
p : INTEGER;
pals : arrPals;
END;
VAR
tab : regTab;
palavras : regPals;
arq : TEXT;
i, j, k : INTEGER;

PROCEDURE leTudo(VAR tab : regTab; VAR palavras : regPals);
VAR
i, j : INTEGER;
BEGIN
READLN(arq,palavras.p,tab.m,tab.n);

FOR i := 1 TO palavras.p DO
 READLN(arq,palavras.pals[i]);

{* É colocado tab.m + 1 pois ele lê a troca de linha como um caracter *}
FOR i := 1 TO tab.m + 1  DO
BEGIN
 FOR j := 1 TO tab.n + 1  DO
  READ(arq,tab.ltrs[i,j]);
END;
END;

PROCEDURE zeraCantos(VAR tab : regTab);
VAR
i: INTEGER;
BEGIN
FOR i := 0 TO tab.m + 1 DO
BEGIN
 tab.ltrs[i,0] := '#';
 tab.ltrs[i,tab.n + 1] := '#';
END;
FOR i:= 0 TO tab.n + 1 DO
BEGIN
 tab.ltrs[0,i] := '#';
 tab.ltrs[tab.m + 1,i] := '#';
END;
END;

PROCEDURE ordenaPalavras(VAR palavras : regPals);
{* Método da seleção que ordena as palavras da MAIOR pra MENOR. *}
VAR
i, j, maior : INTEGER;
aux : STRING[maxString];
BEGIN
FOR i := 1 TO palavras.p - 1 DO
BEGIN
 maior := i;
 FOR j := i + 1 TO palavras.p DO
  IF length(palavras.pals[maior]) < length(palavras.pals[j]) THEN
   maior := j;
 aux := palavras.pals[i];
 palavras.pals[i] := palavras.pals[maior];
 palavras.pals[maior] := aux;
END;

END;

PROCEDURE achaPalavra(VAR tab : regTab; VAR palavras : regPals; i,j,k : INTEGER);
VAR
l, ltrsIguais : INTEGER;
achou : BOOLEAN;
BEGIN
achou := FALSE;
{* Diagonal cima/esquerda *}
l := 0; ltrsIguais := 0;
WHILE (tab.ltrs[i-l,j-l] = palavras.pals[k][l+1]) AND (l < length(palavras.pals[k]))  DO
BEGIN
 ltrsIguais := ltrsIguais + 1;
 l := l + 1;
END;

IF ltrsIguais = length(palavras.pals[k]) THEN
BEGIN
 WRITELN('Achou a palavra ',palavras.pals[k],'!');
 WRITELN('Vai da posição [',i,',',j,'] até a posição [',i-l,',',j-l,'].');
 achou := TRUE;
END;
{* Cima *}
IF not achou THEN
BEGIN
 l := 0; ltrsIguais := 0;
 WHILE (tab.ltrs[i-l,j] = palavras.pals[k][l+1]) AND (l < length(palavras.pals[k])) DO
 BEGIN
  ltrsIguais := ltrsIguais + 1;
  l := l + 1;
 END;

 IF ltrsIguais = length(palavras.pals[k]) THEN
 BEGIN
  WRITELN('Achou a palavra ',palavras.pals[k],'!');
  WRITELN('Vai da posição [',i,',',j,'] até a posição [',i-l,',',j,'].');
  achou := TRUE;
 END;
END;
{* Diagonal cima/direita *}
IF not achou THEN
BEGIN
 l := 0; ltrsIguais := 0;
 WHILE (tab.ltrs[i-l,j+l] = palavras.pals[k][l+1]) AND (l < length(palavras.pals[k])) DO
 BEGIN
  ltrsIguais := ltrsIguais + 1;
  l := l + 1;
 END;

 IF ltrsIguais = length(palavras.pals[k]) THEN
 BEGIN
  WRITELN('Achou a palavra ',palavras.pals[k],'!');
  WRITELN('Vai da posição [',i,',',j,'] até a posição [',i-l,',',j+l,'].');
  achou := TRUE;
 END;
END;
{* Direita *}
       IF not achou THEN
       BEGIN
               l := 0; ltrsIguais := 0;
               WHILE (tab.ltrs[i,j+l] = palavras.pals[k][l+1]) AND (l < length(palavras.pals[k])) DO
               BEGIN
                       ltrsIguais := ltrsIguais + 1;
                       l := l + 1;
               END;

               IF ltrsIguais = length(palavras.pals[k]) THEN
               BEGIN
                       WRITELN('Achou a palavra ',palavras.pals[k],'!');
                       WRITELN('Vai da posição [',i,',',j,'] até a posição [',i,',',j+l,'].');
                       achou := TRUE;
               END;
       END;
{* Diagonal baixo/direita *}
       IF not achou THEN
       BEGIN
               l := 0; ltrsIguais := 0;
               WHILE (tab.ltrs[i+l,j+l] = palavras.pals[k][l+1]) AND (l < length(palavras.pals[k])) DO
               BEGIN
                       ltrsIguais := ltrsIguais + 1;
                       l := l + 1;
               END;

               IF ltrsIguais = length(palavras.pals[k]) THEN
               BEGIN
                       WRITELN('Achou a palavra ',palavras.pals[k],'!');
                       WRITELN('Vai da posição [',i,',',j,'] até a posição [',i+l,',',j+l,'].');
                       achou := TRUE;
               END;
       END;
{* Baixo *}
       IF not achou THEN
       BEGIN
               l := 0; ltrsIguais := 0;
               WHILE (tab.ltrs[i+l,j] = palavras.pals[k][l+1]) AND (l < length(palavras.pals[k])) DO
               BEGIN
                       ltrsIguais := ltrsIguais + 1;
                       l := l + 1;
               END;

               IF ltrsIguais = length(palavras.pals[k]) THEN
               BEGIN
                       WRITELN('Achou a palavra ',palavras.pals[k],'!');
                       WRITELN('Vai da posição [',i,',',j,'] até a posição [',i+l,',',j,'].');
                       achou := TRUE;
               END;
       END;
{* Diagonal baixo/esquerda *}
       IF not achou THEN
       BEGIN
               l := 0; ltrsIguais := 0;
               WHILE (tab.ltrs[i+l,j-l] = palavras.pals[k][l+1]) AND (l < length(palavras.pals[k])) DO
               BEGIN
                       ltrsIguais := ltrsIguais + 1;
                       l := l + 1;
               END;

               IF ltrsIguais = length(palavras.pals[k]) THEN
               BEGIN
                       WRITELN('Achou a palavra ',palavras.pals[k],'!');
                       WRITELN('Vai da posição [',i,',',j,'] até a posição [',i+l,',',j-l,'].');
                       achou := TRUE;
               END;
       END;
{* Esquerda *}
       IF not achou THEN
       BEGIN
               l := 0; ltrsIguais := 0;
               WHILE (tab.ltrs[i,j-l] = palavras.pals[k][l+1]) AND (l < length(palavras.pals[k])) DO
               BEGIN
                       ltrsIguais := ltrsIguais + 1;
                       l := l + 1;
               END;

               IF ltrsIguais = length(palavras.pals[k]) THEN
               BEGIN
                       WRITELN('Achou a palavra ',palavras.pals[k],'!');
                       WRITELN('Vai da posição [',i,',',j,'] até a posição [',i,',',j-l,'].');
                       achou := TRUE;
               END;
       END;

END;

BEGIN
ASSIGN(arq,'CacaPalavras.txt');
RESET(arq);
leTudo(tab,palavras);
zeraCantos(tab);
ordenaPalavras(palavras);
FOR i := 1 TO tab.m DO
 FOR j := 1 TO tab.n DO
  FOR k := 1 TO palavras.p DO
   achaPalavra(tab,palavras,i,j,k);

CLOSE(arq);
END.

e aqui vai o arquivo CacaPalavras.txt que é necessário:


16 19 19
modalidade
adeptos
trekking
caminhada
regras
rali
motocicletas
automoveis
normas
percurso
cidades
tensões
terreno
planilha
distancias
velocidade
eselwçgbnfsedadicxr
aedyhçsmatztfnenyth
hkaimhbaasaicnatsid
lgddlnyymmeuesgidhç
imiisaltcrmbãamdaon
ngcleorgrlocosoauzg
aeoçõeaoxornalshtne
ltlssxnasnohlfrroik
puehneõçamaeqbufmse
levreagmtbdarlciola
adeptosderaewnrnvre
natzkoztlnhqdneqedg
adeecibiclnmtapeicn
vijardjsihiogftjsdi
olixariacemlsobaaak
rarnemeiosargerlnek
çdcoflrntgcramycofe
motjdkibodxdetbtçdr
tmçnwekbmynmicwleft

espero q sejam úteis as funçõezinhas q estão aí =)

desculpem se estiver mal-escrito o código

é porque eu escrevi quando eu ainda era um programador iniciante heiuhaiuehai

Link para o comentário
Compartilhar em outros sites

bom...

andei analisando o código ehiuaheiua

basicamente você vai usar aquelas funções q tão no "main" (o final do meu código) pra abrir os arquivos

daí quando tiver q ler:

READ(arq,argumentos);

quando tiver q escrever:

WRITE(arq,argumetos);

acho q era isso =)

Link para o comentário
Compartilhar em outros sites

BEGIN
ASSIGN(arq,'CacaPalavras.txt');
RESET(arq); (AQUIII - ESTÁ DANDO "FILE NOT FOUND")
leTudo(tab,palavras);
zeraCantos(tab);
ordenaPalavras(palavras);
FOR i := 1 TO tab.m DO
FOR j := 1 TO tab.n DO
 FOR k := 1 TO palavras.p DO
  achaPalavra(tab,palavras,i,j,k);

CLOSE(arq);
END.

Eu copiei seu código e tentei rodá-lo no pascal, mas dá esse erro ai nessa linha, ai em cima no código. Porque?

Onde que eu tenho que colocar o arquivo "CacaPalavra.txt"?

Link para o comentário
Compartilhar em outros sites

CASE SENSITIVE: O compilador diferencia letras maiusculas de minusculas em um codigo.

O pascal não é CASE SENSITIVE, pois não diferencia letras maiusculas de minusculas em seu editor.

Ex: NOME é o mesmo q nome

Já em outras linguagens, como C/C++, são case sensitive, pois diferenciam letras maiusculas d minusculas..

Ex: Nome é diferente de nome, que é diferente de nomE

Link para o comentário
Compartilhar em outros sites

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!