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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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
  • Autor do tópico
  • 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

    ×