Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Paula Minaré

Separar palavras de uma string em pascal sem uso de funções

Recommended Posts

Olá galera!

A coisa tá preta! Preciso fazer um algoritmo que receba uma frase e forneca como saída as palavras da frase separadas por linha como no exemplo a seguir:

Frase: Eu adoro estudar algoritmo

1ª palavra: Eu

2ª palavra: Adoro

3ª palavra: Estudar

4ª palavra: Algoritmo

Já tô ficando :tantan: e não consigo fazer o código. Alguém pelo amor de Deus pode me dar uma força???

Consegui somente fazer o código para contar as palavras, mas mostrar separadamente, não sai de jeito nenhum.

program separa_palavra;
uses crt;
var
frase:string[30];
letra: string;
qtd, x: integer;
begin
clrscr;
frase:='';letra:='';qtd:=0;x:=0;
writeln('Digite uma frase: ');
readln(frase);
while frase='' do
begin
writeln('Informacao incorreta! Redigite: ');
readln(frase);
end;
for x:= 1 to length(frase)do
begin
letra :=frase[x];
if letra = ' ' then
qtd:= qtd+1;
end;
qtd:=qtd+1;
writeln('Quantidade de palavras da frase = ',qtd);
readkey;
end.

Desde já agradeço!

Bjus

Editado por Simon Viegas
Inserir tag CODE no código

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você deve fazer mais ou menos o seguinte.

Se houver letra para percorrer

Pular todos os espaços até acha a 1º letra e copiar a posição dela;

Achar o próximo espaço ou fim do programa e copiar a posição dela;

Imprimir lado-a-lado da posição inicial até a posição anterior ao do espaço;

Pular um linha;

Voltar para etapa 1;

Senão

Fim.

Espero ter ajudado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu acho que o que eu fiz agora ficou mais complicado do que devia. Mas é que o sono já tá brabo numa hora dessas.

var

_frase: String;

_v: array [1..100] of String;

_i, qtd, x: Integer;

begin

_Write('Digite uma frase: ');

_Readln(frase);

_Writeln;

_x := 0;

_for i := 1 to Length(frase) do

__if frase[i-x] = ' ' then

__begin

___Inc(qtd);

___v[qtd] := Copy(frase, 1, i-x);

___Delete(frase, 1, i-x);

___ x := i;

__end;

_v[qtd+1] := frase;

_for i := 1 to qtd+1 do

__Writeln(IntToStr(i), 'a palavra: ', v);

_Readln;

end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Thiaguito,

Joguei esse código no pascal e rodou belezinha. Mas preciso fazer sem as funções (array, delete, copy, etc)...

Sou iniciante e tá um pouco complicado tirar a função e fazer da forma que o professor quer.

Se você puder, me mostra como faz?

Muitíssimo obrigada pela atenção. E realmente, no horário em que tava fazendo o código, ficar acordado é uma verdadeira batalha. Vivo nessa situação tb...

Bju

Estilingue, (rsrsrsrsrsrsr)...

Clareou algo sim... o problema é que sou iniciante em programação e as vezes fica difícil exergar o que vocês que já conhecem bem, enxergam... Mas, não é falta de força de vontade! É mais complicado ainda achar quem te mostra como fazer no passo-a-passo. :( Com isso a gente vai ficando cada vez mais :confused:

Se você puder, se não for pedir demais... mostra o código pra eu? ;)

De toda forma, agradeço de coração.

Editado por gandalfnho
Evite o flood. Use Editar ou Multi-citar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ah, eu também sou iniciante... Eu paguei 1 ano de programação em pascal mas a gente não se prendeu muito nesses algorítmos que trabalham com string, a gente ficou mais estudando orientação a objeto e tal, ae eu me perco com essas coisas x)

Mas eu mudei um pouco o código, tirei o vetor (array) e imprimi logo no processamento, ae o código ficou um pouco menor:

var

frase: String;

i, qtd, x: Integer;

begin

_Write('Digite uma frase: ');

_Readln(frase);

_x := 0;

_for i := 1 to Length(frase) do

__if frase[i-x] = ' ' then

__begin

___qtd := qtd + 1;

___Writeln(IntToStr(qtd)+'a palavra: '+Copy(frase, 1, i-x));

___Delete(frase, 1, i-x);

___x := i;

__end;

_Writeln(IntToStr(qtd+1)+'a palavra: '+frase);

_Readln;

end.

Eu ainda vou ver se eu consigo tirar as funções Copy e Delete, mas eu acho meio difícil eu conseguir fazer sem elas :s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa beleza

Fiz esse programa ai...

Deu um certo trabalho, hehehe

Espero que ajude.

Program Palavras_Da_Frase;
uses crt;
var Frase ,Palavra : string;
Letra : char;
i, j, k : integer;
begin
clrscr;
writeln('Digite a frase');
i:= 0; {Coluna em que a letra vai ficar na variável Frase}
repeat
Letra:= readkey; {Guarda de uma em uma letra}
if Letra <> chr(13) then
begin
i:= i + 1;
clrscr;
Frase:= Letra;
write(Frase);
end;
until Letra = chr(13); {Para quando for apertada a tecla ENTER}
k:= 1;{Mostra o número da palavra ex: 1 palavra, 2 palavra, etc}
writeln;
write('1ª palavra: ');
i:= i + 1;
for j:= 1 to i do
begin
write(Frase[j]);
if Frase[j] = ' ' then
begin
k:= k + 1;
writeln;
write(k,'ª palavra: ');
end;
end;
writeln;
writeln('Fim');
readkey;
end.

 

Editado por Simon Viegas
Inserir tag CODE no código

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tó postando de novo :lol:

Tirei o Delete, só tem o Copy agora, que eu acho bem impossível tirar ele.

var

_frase: String;

_i, qtd, x: Integer;

begin

_Write('Digite uma frase: ');

_Readln(frase);

_x := 0;

_for i := 1 to Length(frase) do

__if frase = ' ' then

__begin

___qtd := qtd + 1;

___Writeln(IntToStr(qtd)+'a palavra: '+Copy(frase, x+1, i-x));

___x := i;

__end;

__Writeln(IntToStr(qtd+1)+'a palavra: '+Copy(frase, x+1, i-x));

_Readln;

end.

Fica até um pouco mais fácil de entender o código. O ruim desse algorítimo é que se a frase tiver um espaço nos primeiros carácteres ele vai acabar dando problema. Dá pra se livrar desse problema tranquilamente com a função Trim, mas ae já ia ser uma função a mais no programa :b

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Thiago!

Tô tentando achar um jeito de tirar as funções... não pode ter nem umazinha! O professor não aceita com função...Te agradeço demais!

Obrigada mesmo!

Bju

Escrifonife19,

Esse chr(13) é a mesma coisa que ENTER? Que código é esse? Infelizmente não posso usá-lo porque o professor não ensinou... Estamos fazendo algoritmo em pascal e a matéria é Indexação de Variáveis. E tmbém não podemos usar nenhum tipo de função... estamos todos perdidos, isso sim!

Nem sei como agradecer o trabalhão que você teve em fazer o código! Depois te pago um doce. :D

Bjus

Editado por gandalfnho
Evite o flood. Use Editar ou Multi-citar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem Copy!

:lol:

Só falta agora não poder usar Writeln e Readln :P

var

_frase, s: String;

_i, j, qtd, x: Integer;

begin

_Write('Digite uma frase: ');

_Readln(frase);

_x := 0;

_for i := 1 to Length(frase) do

__if frase = ' ' then

__begin

___qtd := qtd + 1;

___for j := x+1 to i do

____s := s + frase[j];

___Writeln(IntToStr(qtd), 'a palavra: ', s);

___s := '';

___x := i;

__end;

_for i := x+1 to Length(frase) do

__s := s + frase;

_Writeln(IntToStr(qtd+1), 'a palavra: ', s);

_Readln;

end.

O código ficou um pouco mais complicado mas é isso ae.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Thiago do céu!!!!

Muito bem! Sem copy...

E a IntToStr ???? você não tirou!!!!! Hauahauahauahauahauahauahuahaua...

Mas eu tirei... porque o Tan Tan do "Pascual" (Rsrsrsrsrs...) não entende essa função, coitadu!!!

Mas, enfim deu certo!!! Rodou! Que maravilha!

A proposito, você por acaso mora numa lâmpada???? Hauahauahauahauahauaha...

Afffff.... não vou sonhar com isso essa noite! Que beleza! Hauahauahauaha... você me salvou, Thiaguito!

Obrigada de verdade!

Um abraço de urso pra você!!!:P

P.S.: Tenho um colega de faculdade que diz "Pascual" ao invés de Pascal. É mole?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hahaaaaaa! Finalmente hein?

Já tava na hora de dar tudo certinho. Boa sorte com seus próximos exercícios e qualquer coisa é só postar aqui.

(:

Edit:

Tava de bobeira aqui e vi que o código tava um pouco renundante, pensei um pouquinho e deu pra tirar algumas linhas:

begin

_Write('Digite uma frase: ');

_Readln(frase);

_x := 0;

_for i := 1 to Length(frase) do

__if (frase = ' ') or (i = Length(frase)) then

__begin

___qtd := qtd + 1;

___for j := x+1 to i do

____s := s + frase[j];

___Writeln(IntToStr(qtd), 'a palavra: ', s);

___s := '';

___x := i;

__end;

_Readln;

end.

Eu tenho esse problema de criar o código e ir melhorando aos poucos ao invés de criar logo de uma forma ideal :s

Editado por thiago_rn

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem problemas!!! O que vale é saber fazer... não importa de que jeito!

E como eu já disse, pessoas assim moram dentro de lâmpadas! Rsrsrsrsrsrs...

Mais uma vez, obrigada!

Bjus

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ai beleza

Escrevi um outro codigo-fonte, talvez ele ajude também.

Ele usa a função LENGTH se num tiver problema ta ai:

Quando o professor passar a resposta, manda o codigo-fonte pra gente.

Program Palavras_Da_Frase;
uses crt;
var Frase : string;
Tamanho,i, j : integer;
begin
clrscr;
writeln('Digite a frase');
readln(Frase);
Tamanho:= length(Frase);
j:= 1;
write('1ª palavra: ');
for i:= 1 to Tamanho do
begin
write(Frase);
if Frase = ' ' then
begin
j:= j + 1;
writeln;
write(j,'ª palavra: ');
end;
end;
writeln;
writeln('Fim');
readkey;
end.

 

Editado por Simon Viegas
Inserir tag CODE no código

Compartilhar este post


Link para o post
Compartilhar em outros sites

Escrifonife19,

Gostei do código. Simples e prático. :D

Como você pediu tô postando o código que o professor desenvolveu. O que há de diferente é que ele não aceita a frase vazia (validação) e mesmo que o usuário inicie a frase com espaços ou coloque mais de um espaço entre as palavras, a quantidade de palavras digitadas não sofre alteração...

Valeu a força e a atenção!

vocês todos foram d+!

Bju

program mostrapalavra;
uses crt;
var frase:string;
palavra:string;
letra:char;
x:integer;
begin
clrscr;
frase:='';
palavra:='';
x:=1;
repeat
write('Digite uma frase: ');
readln(frase);
until frase<>'';
while x<=length(frase) do
begin
letra:=frase[x];
case letra of
'a'..'z','A'..'Z':
begin
palavra:=palavra+letra;
repeat
x:=x+1;
letra:=frase[x];
palavra:=palavra+letra;
until (letra=' ') or (x=length(frase));
writeln(palavra);
palavra:='';
end;
end;
x:=x+1;
end;
writeln;
readkey;
end.

 

Editado por Simon Viegas
Inserir tag CODE no código

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal a codificação.

Eu acrescentei umas coisas...

program mostrapalavra;
var frase:string;
palavra:string;
letra:char;
x, Tamanho:integer;
begin
clrscr;
frase:='';
palavra:='';
x:=1;
repeat
write('Digite uma PALAVRA ou FRASE: ');
readln(frase);
until length(frase)> 1; {porque quando era digitada so uma letra o programa dava erro na linha de AZUL}
writeln('Palavras da frase:');
Tamanho:= length(frase);{para não ficar chamando toda hora a função LENGTH}
while x <= Tamanho do
begin
letra:=frase[x];
case letra of
'a'..'z','A'..'Z':
begin
palavra:=palavra+letra;
repeat
x:=x+1;
letra:=frase[x]; {dava um erro aqui porque a variavel X era acrescida de uma unidade, so que a frase so tinha uma letra, ai a variavel LETRA recebia NADA}
palavra:=palavra+letra;
until (letra=' ') or (x=Tamanho);
writeln(palavra);
palavra:='';
end;
end;
x:=x+1;
end;
writeln;
end.

 

Editado por Simon Viegas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Po, legal o programa do seu professor. Com mais um laço eu fazia o meu pegar as palavras direitinho independente da quantidade de espaços. Mas usando só o While dele fica melhor. Eu sou meio viciado em repetição com o For.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas Olá Simon, to nessa de programar também e estava com dificuldades em gerar o código conforme o tópico, não gosto de colar, rsrsrsrs, antes de ler este tópico eu havia conseguido remover os espaços entre as palavras mas não estava conseguindo colocar uma palavra em cada linha, não sabia que a variável automaticamente guardava as informações como uma array, depois que descobri ficou fácil da uma olhada no meu código e veja como ficou, numa outra dúvida que tive você me deu umas dicas que abriram minha mente naquele caso. obrigado.

Program Pzim ;
uses crt;
var f, frase:string;
    i, letras:integer;
Begin
   writeln( 'Digite uma frase' ) ; 
   readln( frase ) ; 
   letras:=length(frase);
	 for i := 1 to letras do
   begin
      if frase[i] = ' ' then
      writeln ( frase[i] ) 
      else
      write( frase[i] ) ;
   end;

End.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @rovoliveira,


Ficou legal o código. Simples e objetivo.

 

Sugiro se atentar um pouco na identação (alinhamento do código), abaixo um exemplo (e compare com o seu postado acima):

Program Pzim ;
uses 
  CRT;
var 
  {f, frase :string;}
  frase :string;
  i, letras:integer;
BEGIN
writeln('Digite uma frase');
readln(frase); 
letras:=Length(frase);
for i := 1 to letras do
  begin
  if frase[i] = ' ' then
    writeln(frase[i]) 
  else
    write(frase[i]);
  end;
ReadKey; //dar um pause antes de fechar (no meu compilador, o FPC, ao chegar no END., fecha e não dá para ver o resultado!)
END.



Outra forma de identação:

Program Pzim;
uses 
  CRT;
var 
  frase :string;
  i, letras:integer;
BEGIN
writeln('Digite uma frase');
readln(frase); 
letras:=Length(frase);
for i := 1 to letras do
  begin
  if frase[i] = ' ' 
    then writeln(frase[i]) 
    else write(frase[i]);
  end;
ReadKey; //dar um pause antes de fechar (no meu compilador, o FPC, ao chegar no END., fecha e não dá para ver o resultado!)
END.

 

 

Caso deseje, tente fazer como pede o enunciado:

 

Em 06/10/2008 às 14:38, Paula Minaré disse:

Frase: Eu adoro estudar algoritmo

1ª palavra: Eu

2ª palavra: Adoro

3ª palavra: Estudar

4ª palavra: Algoritmo

 

No caso exibindo o resultado como nessas 5 linhas acima....
 

No aguardo.

 

 

 

Editado por Simon Viegas
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×