Ir ao conteúdo
  • Cadastre-se

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


Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

Link para o comentário
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.

Link para o comentário
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.

Link para o comentário
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

Link para o comentário
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.

 

Link para o comentário
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

Link para o comentário
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

Link para o comentário
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.

Link para o comentário
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?!

Link para o comentário
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

Link para o comentário
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.

 

Link para o comentário
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.

 

Link para o comentário
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.

 

Link para o comentário
Compartilhar em outros sites

  • 7 anos depois...

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

  • Membro VIP

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.

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber 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...