Ir ao conteúdo
  • Cadastre-se

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


Ir à solução Resolvido por devair1010,

Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

  • Solução

@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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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
Link para o comentário
Compartilhar em outros sites

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