Ir ao conteúdo
  • Cadastre-se

Pascal Manipulação de string em um vetor


N1tr0

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

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

Link para o comentário
Compartilhar em outros sites


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.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
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

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para 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...