Ir ao conteúdo

Pascal/Delphi PASCAL error com código identificador de Palavras.


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado
Program Pzim ;
			var
				P:string; //Palavra
				Cont:string; //palavra ao contrario
				x:integer;
				r:char;
Begin
write ('Digita a palavra: ');
read(P);
P:=upcase(P);
  repeat delete(P,pos(' ',P),1) until pos(' ',P) = 0; //remover espaços
  repeat delete(P,pos('-',P),1) until pos('-',P) = 0; //remover hífens
for x:= length(P) downto 1 do
			cont:=cont + P[x];
			
		clrscr;
 writeln(' A palavra normal é: ', P);
 writeln(' A palavra ao contrario é: ',cont); 
 if P = cont then
 				writeln(' Essa palavra é Polindromo!!')
 				else 
 				writeln(' Essa palavra não é um Polindromo.'); 				  
//====================================================================================//
  writeln;
  write('OUTRA CONSULTA? [S/N]  >> ');
  repeat
    sair:=upcase(readkey)
    until sair in ['S','N'];
  until sair='N';
End.
 	
 	

 

Ele simplesmente fica cismando com a parte inferior, onde tento fazer outra consulta.

  • Curtir 1
  • Solução
Postado

@TheMajor   está com um erro no último until , que parece ser da linguagem lua ou python ,  então seu código com algumas modificações poderia se assim   :

Program Pzim ;
uses crt;
var
  P,sair : string;   //Palavra
  Cont   : string;   //palavra ao contrario
  x      : integer;
  r      : char;
Begin
  repeat
  cont:='';
  write('Digita a palavra: ');
  readln(P);
  P := upcase(P);  
  repeat delete(P,pos(' ',P),1) until pos(' ',P) = 0; //remover espaços
  repeat delete(P,pos('-',P),1) until pos('-',P) = 0; //remover hífens
  for x := length(P) downto 1 do
  begin
	  cont := cont + P[x];	
  end;
  clrscr;
  writeln(' A palavra normal é: ', P);
  writeln(' A palavra ao contrario é: ',cont); 
  if P = cont then
 	  writeln(' Essa palavra é Polindromo!!')
 	else 
 	  writeln(' Essa palavra não é um Polindromo.'); 				  
//====================================================================================//
  writeln;
  write('OUTRA CONSULTA? [S/N]  >> ');
  repeat
    sair := upcase(readkey);
  until (sair = 'S') or (sair = 'N');   // in ['S','N'];
  writeln;
  writeln;
  until sair='N';
End.

 

  • Curtir 2
Postado
6 minutos atrás, TheMajor disse:

@devair1010  Não entendi muito bem, apesar de que esse código que você passou a opção de fazer outra consulta não funcionou muito bem, to iniciando em pascal.

 

Apesar de você ter mandado o seu, ainda não funciona direito. A pergunta se deseja continuar só ta aceitando N como resposta.

adicionado 1 minuto depois

@devair1010 Agora sim funciona, porém ele aceita qualquer tecla que não seja S, e além disso ele não limpa a frase digitada anteriormente, só faz por cima. Necessário que ele resete o valor de P e CONT.

adicionado 12 minutos depois
12 minutos atrás, TheMajor disse:

 

Apesar de você ter mandado o seu, ainda não funciona direito. A pergunta se deseja continuar só ta aceitando N como resposta.

adicionado 1 minuto depois

@devair1010 Agora sim funciona, porém ele aceita qualquer tecla que não seja S, e além disso ele não limpa a frase digitada anteriormente, só faz por cima. Necessário que ele resete o valor de P e CONT.

Ainda não consegui resolverr aqui, consegue dar uma ajuda?

  • Curtir 1
  • Membro VIP
Postado

Olá a todos.


Vou tentar "destrinchar" um geral do ocorrido:

 

1# IDENTIFICANDO O PROBLEMA ATUAL

Compilando o código original. Segue um print:

tela1.png

 

Acusou erro de sintaxe na linha 29. Informando que o um comando until não era esperado, ou seja: tem um until onde não deveria ter.

 

 

 

2# DEIXE SEMPRE O CÓDIGO INDENTADO (sugestão, é claro)

Segue o código no meu estilo de indentação:

program Pzim;
var
  P    :string; //Palavra
  Cont :string; //palavra ao contrario
  x    :integer;
  r    :char;
begin
write  ('Digita a palavra: ');
read(P);
P:=UpCase(P);
//remover espaços
repeat
  Delete(P, Pos(' ',P), 1);
until Pos(' ',P) = 0;
//remover hífens
repeat
  Delete(P, Pos('-',P), 1);
until Pos('-',P) = 0;
for x:= length(P) downto 1 do
  cont:=cont + P[x];
clrScr;
writeln(' A palavra normal é: ', P);
writeln(' A palavra ao contrario é: ', cont); 
if P = cont then
  writeln(' Essa palavra é Polindromo!!')
else 
  writeln(' Essa palavra não é um Polindromo.'); 				  
//====================================================================================//
writeln;
write('OUTRA CONSULTA? [S/N]  >> ');
repeat
  sair := UpCase(ReadKey)
until sair in ['S','N'];
until sair='N'; //<---PERCEBA QUE EXISTEM DOIS UNTIL PARA UM ÚNICO REPEAT
end.

 

 

3# UM RESUMO DE COMO IDENTIFICAR E CORRIGIR OS ERROS

  1. Pela própria indentação já dá para ver que existem 2 until para um único repeat. Daí, OU você esqueceu de colocar o repeat do segundo until; OU você colocou um until a mais. É mais provável que ESQUECEU DE COLOCAR O REPEAT DO SEGUNDO UNTIL;
  2. Ao compilar novamente, acusará que a variável sair não foi declarada. Declare-a (ou utilizar o "r", se essa seria a variável para tal);

Pronto! A SINTAXE do código estará corrigida, ou seja, DEVE COMPILAR E RODAR.

 

 

 

4# QUESTÃO DA LÓGICA E OUTROS AJUSTES NO CÓDIGO

 

Uma coisa é rodar, outra coisa é "rodar certo". A minha sugestão seria que você pegasse o seu primeiro código lá de cima e fosse corrigindo. Verás que vai ocorrer outro probleminhas e também a necessidade de outros ajustes.

 

Segue abaixo um código com algumas sugestões de como poderia ficar. (obs.: melhor você mesmo ir corrigindo seu código original. Pois não basta só corrigir o repeat e declarar o sair. Você mesmo fazendo, vai se habituar em como atuar em cada caso.

program Pzim;
var
  frase :string; //frase que será verificada se é palíndromo ou não
  fraseInvertida :string; //frase invertida
  sair :char; //flag para verificar se que sair ou não
  i :byte; //utiliar para controlar o for
  
begin
repeat
  ClrScr;
  write  ('Digite a frase: '); readln(frase); //[5]
  frase := UpCase(frase); //deixa a string em CAIXA ALTA
  repeat Delete(frase, Pos(' ',frase),1) until Pos(' ', frase) = 0; //remover espaços
  repeat Delete(frase, Pos('-',frase),1) until Pos('-', frase) = 0; //remover hífens 
  fraseInvertida := ''; //(re)determina o valor inicial
  for i:= Length(frase) downto 1 do
    fraseInvertida := fraseInvertida + frase[i];
  ClrScr;
  writeln(' Frase original  : ', frase);
  writeln(' Frase invertida : ', fraseInvertida);
  if frase = fraseInvertida then
    writeln(' Essa frase é Polindromo!!')
  else 
    writeln(' Essa frase não é um Polindromo.');
  //====================================================================================//
  writeln;
  write  ('OUTRA CONSULTA? [S/N]  >> ');
  repeat
    sair := UpCase(ReadKey)
  until sair in ['S','N'];
until sair='N';
end.
{
  {P    :string; //Palavra} //[1]
  {Cont :string; //palavra ao contrario} //[2]
  {x    :integer;} // [3]
  {r    :char;} // [4]
  
  { SEGUE EXPLICAÇÃO DE CADA COMENTÁRIO
  
  [1] Palavras não tem espaços, logo OU não faz sentido remover os espaços lá
      no código; OU não faz sentido utilizar o termo "palavra", já que se tem
      espaços seria uma "frase" ou algo do tipo;
      
  [2] O "termo" "Cont" geralmente é utilizado para referenciar-se a um "contador".
      Recomendo utilizar outro nome.
      
  [3] Para contadores, geralmente utilizam-se a nomenclatura "i". "x" não me parece
      ter relação com a sua funcionalidade.
    
  [4] Esse "r" seria a "resposta para continuar ou não"? 
  
  [5] Não utilize read(), use apenas readln(). O comando read() é utilizado apenas
      em caso especiais e pode dar problemas em alguns caso. Use o comando
      padrão: readln().
}

 

ADENDO:

@devair1010:

 

9 horas atrás, devair1010 disse:

@TheMajor   está com um erro no último until , que parece ser da linguagem lua ou python ,  então seu código com algumas modificações poderia se assim   :

 

A estrutura do until com o in funciona no Pascal... o problema foi que faltou o repeat do until de baixo.

 

 

 

Qual dúvida ou contra-argumentação é só postar.

 

 

No aguardo.

  • Obrigado 1

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!