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:  
Entre para seguir isso  
N1tr0

[Resolvido] Pascal Manipulação de string em um vetor

Recommended Posts

Estou tentando resolver este problrma:

-Leia um vetor contendo letras de uma frase inclusive os espaços em branco. Retirar os espaços em branco do vetor e depois escrevê-lo e contar os espaços em branco.

Cheguei a este código, mas tá errado!

O programa só elimina o 1° espaço em branco e faz a conta errada.

Alguém tem alguma sugestão?


Program Exercicio_9;

Var
frase:string[51];
i, cont:integer;
Begin
cont := 0;
readln (frase);
for i := 1 to 20 do
if (frase[i]) = ' ' then
begin
frase[i] := frase[i + 1];
frase[i + 1] := ' ';
cont := cont + 1;
end;
writeln ('Frase modificada: ', frase);
writeln ('A frase continha ', cont, 'espaços em branco.');

End.

Obrigado

Editado por Mog.Lucas
Retirar titulo "Resolvido". Obrigado por se preocupar mas quando um tópico for resolvido apenas denuncie o mesmo e informe que o mesmo está resolvido. Assim, a equipe de moderação realiza

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou tentando resolver este problrma:

-Leia um vetor contendo letras de uma frase inclusive os espaços em branco. Retirar os espaços em branco do vetor e depois escrevê-lo e contar os espaços em branco.

Cheguei a este código, mas tá errado!

O programa só elimina o 1° espaço em branco e faz a conta errada.

Alguém tem alguma sugestão?


Program Exercicio_9;

Var
frase:string[51];
i, cont:integer;
Begin
cont := 0;
readln (frase);
for i := 1 to 20 do
if (frase[i]) = ' ' then
begin
frase[i] := frase[i + 1];
frase[i + 1] := ' ';
cont := cont + 1;
end;
writeln ('Frase modificada: ', frase);
writeln ('A frase continha ', cont, 'espaços em branco.');

End.


Obrigado

Olá N1tr0,

Vamos lá:

Program Exercicio_9;

Var
frase :string[51];
i,
cont :integer;
Begin
cont := 0;
readln(frase);
for i := 1 to 20 do [COLOR="Red"]{porque exatamente 20?}[/COLOR]
if (frase[i]) = ' ' then
begin
frase[i] := frase[i + 1]; [COLOR="Red"]{e se no i+1 tiver um espaco em branco??}[/COLOR]
frase[i + 1] := ' '; [COLOR="Red"]{aqui voce esta colocando mais um espaco em
branco a linha posterior? nao faz sentido.
observe que no proximo loop esta posicao vai
conter justamente mais um espaco em branco}[/COLOR]
cont := cont + 1;
end;
writeln ('Frase modificada: ', frase);
writeln ('A frase continha ', cont, 'espaços em branco.');
End.

1) O tamanho do for deve ser baseado na quantidade de letras da frase.

No caso poderia usar Length(frase); em vez de 20 (ou 51, que seria o tamanho máximo)

2) Acho melhor ir copiado as letras válidas do que apagar os espaços na frase original.

Sugiro que você use uma lógica semenhante, mas em vez de tentar deslocar as letras, você poderia ir concatenando os "não espaços" em outra String.

Algo como:

fraseNova := fraseNova + frase[i];

PS: Abaixo algumas caracteríscas que vi caso queira deslocar

3) O descolamento da frase original vai acarretar alguns cuidados

A princípio acredito que se for utilizar um técnica de deslocamento, você terá que deslocar, a cada espaço encontrado, todas as letras posteriores para esquerda, e são somente a primeira posterior. Observe que neste caso a frase NÃO DIMINUIARÁ de tamanho, e sim terá seus espaços deslocados para o final.

Exemplo, no que seria na prática:

Fórum do Clube do Hardware

Fórumdo Clube do Hardware

FórumdoClube do Hardware

Eu não fiz os testes, mas caso seja feito esse descolocamente, a frase não ficará diretamente assim, ou seja, vai ter um bugzinho...

Se só ir deslocando deverá ficar assim?

Fórum do Clube do Hardware

Fórumdo Clube do Hardwaree

FórumdoClube do Hardwareee

PARA SOLUCIONAR ESSE PROBLEMA você poderia substiuir, após já ter deslocado pela 1º vez, um espaço em branco na última coluna. Ai nas próximas substituições automaticamente já conterá espaços nos final. (observe que só a última letra que se repete, e como terá espaço, continuará tendo só espaços - Uma outra forma mais simples de corrigir essa duplicação no final, é simplemente adicionar um espaço em braco logo após a leitura, mas neste caso a string teria que ter 52 lugares (51+1).

Outra coisa que implicará é o fato que as última linhas teram espaços, daí estes TAMBÉM vão ser contabilizado no for, ou seja, em tese a quantidade vai sair dobrada... para corrigir isso poderia por exemplo atualizar o for para o novo tamanho ou dividir o resultado final por dois. Como eu disse, eu não fiz testes, ai os detalhes tem que ser feitos de acordo com os resultados... ^_^

RESUMINDO: Sugiro que faça usando a técnica de copia. Depois se desejar, faça também utilizando pelo deslocamento... Se precisar de uma força para ambos os casos estaremos aqui para ajudar também.

Qualquer coisa é só postar.

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Caro EstilingueAtomico (porreta esse nick!!), eu, na verdade, preciso substituir a string por um vetor e não sei como fazer. E o programa deve calcular apenas os espaços entre as palavras da frase.

    Se defino um vetor -> frase:array [1..51] of string, por exemplo, como faço aleitura dele?

    Obrigado.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico

  • Program pzim;
    Var
    frase, result: string;
    i, count: integer;
    Begin
    count := 0;
    result := '';
    readln(frase);

    for i := 1 to Length(frase) do
    begin
    if (frase[i]) = ' ' then
    Inc(count)
    else
    result := result + frase[i];
    end;

    writeln ('Frase modificada: ', result);
    writeln ('A frase continha ', count, ' espaços em branco.');

    end.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Caro EstilingueAtomico (porreta esse nick!!), eu, na verdade, preciso substituir a string por um vetor e não sei como fazer. E o programa deve calcular apenas os espaços entre as palavras da frase.

    Se defino um vetor -> frase:array [1..51] of string, por exemplo, como faço aleitura dele?

    Obrigado.

    Eu não entendi muito bem a sua dúvida, mas de qualquer modo uma String já é como se fosse um vetor (pascal não suporta strings nativamente). É como se fosse declarado assim:

    frase :array [1..255] of [B]char[/B];

    Por isso que por exemplo é possível usar frase[x];.

    Veja que no seu caso:

    frase:array [1..51] of string;

    você teria 51 String, e não uma String com 51 posições. Para tanto você poderia declarar:

    frase :array [1..51] of [B]char[/B]; {o mesmo que frase :string[51]}

    ***


    Program pzim;
    Var
    frase, result: string;
    i, count: integer;
    Begin
    count := 0;
    result := '';
    readln(frase);

    for i := 1 to Length(frase) do
    begin
    if (frase[i]) = ' ' then
    Inc(count)
    else
    result := result + frase[i];
    end;

    writeln ('Frase modificada: ', result);
    writeln ('A frase continha ', count, ' espaços em branco.');

    end.

    Aqui parece que você já conseguiu resolver seu programa.

    PS: Só precisa colocar um ReadLN ou ReadKey (do CRT) no final do programa, para dar um pause antes de fechar.

      writeln ('Frase modificada: ', result);
    writeln ('A frase continha ', count, ' espaços em branco.');
    readln; {dah um pause antes de fechar o programa}

    e a declaração do numeréricos devem ficar em byte, e não integer;

      {i, count: integer;} {integer = -32766 a 32767 e 2 bytes de memoria}
    i, count: byte; {byte = 0 a 255 e 1 byte de memoria}

    OBS.: Todos dois vão funcionar, mas byte tem um tamanho mais específico. É como se usasse um "string" para ler somente um caractere (char). É desperdício de recurso!!!

    A título de trinamento sugiro tentar fazer usando um "descolamento da frase original" também (vide tópico "3" da minha última postagem). Como esse método é um pouco mais complicado e você já tem uma boa noção do que fazer, servirá para estimular o seu desenvolvimento e aprender coisas novas.

    Estamos à disposição. Se for o caso, tente fazer algo e poste aqui suas dúvidas.

    Abraços

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • EstilingueAtomico, muito obrigado pela atenção. Vou tentar aqui sim.

    abraço

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Visitante
    Este tópico está impedido de receber novos posts.
    Entre para seguir isso  





    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

    ×