Ir ao conteúdo

Duvidas com vetor diferença


Jean Nogueira F

Posts recomendados

Postado

Estou fazendo um programa que le dois vetores e cria um novo vetor para armazenar a os elementos que pertencem ao primeiro vetor e não pertence ao segundo(diferença).

Fiz esse procedimento, mas não da o resultado esperado. Alguém pode me dizer o que pode estar errado? já tentei de varias outras formas, mas essa foi a que chegou mais perto. Grato.^_^

procedure diferencaovetor(var x,y,z:vetor; var quant:integer);
var i,j:integer;
diferenca:boolean;
begin
quant:=0;
for i:= 1 to 10 do begin
j:=1;
diferenca:= true;
while (j<=10) and (diferenca) do begin
if (x[i]=y[j]) then
diferenca:=false
else
j:=j+1;
end;
if (diferenca) then
quant:=quant+1;
z[quant]:= x[i];
end;

  • Membro VIP
Postado
Estou fazendo um programa que le dois vetores e cria um novo vetor para armazenar a os elementos que pertencem ao primeiro vetor e não pertence ao segundo(diferença).

Fiz esse procedimento, mas não da o resultado esperado. Alguém pode me dizer o que pode estar errado? já tentei de varias outras formas, mas essa foi a que chegou mais perto. Grato.^_^

procedure diferencaovetor(var x,y,z:vetor; var quant:integer);
var i,j:integer;
diferenca:boolean;
begin
quant:=0;
for i:= 1 to 10 do begin
j:=1;
diferenca:= true;
while (j<=10) and (diferenca) do begin
if (x[i]=y[j]) then
diferenca:=false
else
j:=j+1;
end;
if (diferenca) then
quant:=quant+1;
z[quant]:= x[i];
end;

Olá Jean Nogueira F.

Faltou informar o que está dando errado...

Mas um erro, só analisando pela identação, está no não uso do begin/end no último if, ou seja, acaba deixando esse

z[quant]:= x[i];

fora do if, mas deveria está dentro... já que a própria identação sugere isso e analisando o código tb...

Corrigindo isso, meus testes deram certo.

Ex.:

const
FAIXA = 10; //faixa de 0 a 9
TAM = 10; //tamanho do vetor
type
tipo_vetor = integer;
vetor = array[1..TAM] of tipo_vetor;

procedure diferencaoVetor(x,y:vetor; var z:vetor; var quant:integer);
var
i,j:integer;
diferenca:boolean;
begin
quant:=0;
for i:= 1 to TAM do begin
j:=1;
diferenca:=true;
while (j<=TAM) and (diferenca) do begin
if (x[i]=y[j]) then
diferenca:=false
else
j:=j+1;
end;
if (diferenca) then
begin
quant:=quant+1;
z[quant]:= x[i];
end;
end;
end;

var
i :byte;
qtdC :integer;
a,b,c :vetor;
BEGIN
Randomize;
for i:=1 to TAM do
begin
a[i]:=Random(FAIXA);
b[i]:=Random(FAIXA);
end;

write('A:');
for i:=1 to TAM do
begin
write(a[i]:2); //:2 = cada número ocupa no mínimo 4 espaços (como só tem 1, vai dar um espaço a esquerda)
end;
writeln;

write('B:');
for i:=1 to TAM do
begin
write(b[i]:2);
end;
writeln;

diferencaoVetor(a,b,c,qtdC);
writeln;
writeln;

write('C:');
for i:=1 to qtdC do
begin
write(c[i]:2);
end;
readln;
END.

Como observado, fiz algumas mudanças e ao mesmo tempo passando algumas sugestões..

Obs1.: Nem todos os parâmetros da procedure devem ficar com o var;

Obs.2: Em vez de um while dentro do for, você poderia usar dois for;

Obs.2: A depender do enunciado, tem que verificar a questão de números repetidos no vetor final, pois isso NÃO está sendo tratado.

No aguardo

  • Membro VIP
Postado
Já tinha conseguido resolver, mas mesmo assim obrigado. Foi a mesma coisa que você falou e obrigado pelas dicas.

Ok, beleza..

E sobre está permitindo números repetidos?

Ex.:

A: 8 [B]8[/B] 0 7 [B]8[/B] 5 3 3 1 6
B: 6 3 3 5 3 9 1 4 4 1

C: 8 [B]8[/B] 0 7 [B]8[/B]

No aguardo.

Postado

Já havia criado um procedimento para remover os números repetidos.

procedure removervaloresrepetidos(var x:vetor;var quant:integer);
var i,k:integer;
begin
i:=2;
while i<=quant do begin
if (x[i-1]<>x[i]) then
i:=i+1
else begin
for k:= i to n-1 do
x[k]:= x[k+1];
quant:=quant-1;
end;
end;
end;

Ai depois vem o procedimento para imprimir esse vetor.

Agradeço pela sua atenção. :)

  • Membro VIP
Postado
Já havia criado um procedimento para remover os números repetidos.

procedure removervaloresrepetidos(var x:vetor;var quant:integer);
var i,k:integer;
begin
i:=2;
while i<=quant do begin
if (x[i-1]<>x[i]) then
i:=i+1
else begin
for k:= i to n-1 do
x[k]:= x[k+1];
quant:=quant-1;
end;
end;
end;

Ai depois vem o procedimento para imprimir esse vetor.

Agradeço pela sua atenção. :)

Olá, Jean Nogueira F.

1) CÓDIGO INCOMPLETO

procedure removervaloresrepetidos(var x:vetor;var quant:integer);
var i,k:integer;
begin
i:=2;
while i<=quant do begin
[B] if (x[i-1]<>x[i]) then
i:=i+1[/B]
else begin
for k:= i to n-1 do
x[k]:= x[k+1];
quant:=quant-1;
end;
end;
end;

Pelo que analisei (e "comprovei" por testes), o seu código "só está removendo as repetições que estão em sequência, ou seja, quando vem uma 'atrás do outro'").

Programa usado:

Código


FAIXA = 10; //faixa de 0 a 9
TAM = 10; //tamanho do vetor
type
tipo_vetor = integer;
vetor = array[1..TAM] of tipo_vetor;

procedure removerValoresRepetidos(var x:vetor;var quant:integer);
var i,k:integer;
begin
i:=2;
while i<=quant do begin
if (x[i-1]<>x[i]) then
i:=i+1
else
begin
for k:= i to TAM-1 do
x[k]:= x[k+1];
quant:=quant-1;
end;
end;
end;

procedure diferencaoVetor(x,y:vetor; var z:vetor; var quant:integer);
var
i,j:integer;
diferenca:boolean;
begin
quant:=0;
for i:= 1 to TAM do begin
j:=1;
diferenca:=true;
while (j<=TAM) and (diferenca) do begin
if (x[i]=y[j]) then
diferenca:=false
else
j:=j+1;
end;
if (diferenca) then
begin
quant:=quant+1;
z[quant]:= x[i];
end;
end;
end;

var
i :byte;
qtdC :integer;
a,b,c :vetor;
BEGIN
Randomize;
for i:=1 to TAM do
begin
a[i]:=Random(FAIXA);
b[i]:=Random(FAIXA);
end;

write('A:');
for i:=1 to TAM do
begin
write(a[i]:2); //:2 = cada número ocupa no mínio 4 espacoes (como só tem 1, vai dar um espaço a esquerda)
end;
writeln;

write('B:');
for i:=1 to TAM do
begin
write(b[i]:2);
end;
writeln;

diferencaoVetor(a,b,c,qtdC);
writeln;
writeln;

write('C1:');
for i:=1 to qtdC do
begin
write(c[i]:2);
end;
writeln;

removerValoresRepetidos(c,qtdC);

write('C2:');
for i:=1 to qtdC do
begin
write(c[i]:2);
end;
readln;
END.
const

2) MELHORA DE PROCESSO

Pelo que eu entendi do seu algoritmo, ele está cadastrando os números, e depois está removendo os repetidos... mas eu acho mais recomendado logo não cadastrar repetidos (em detrimento de cadastrar sem verificar e depois remover).

***

RESUMIDAMENTE

1) Precisa corrigir o seu código;

2) Se deseja corrigir ou não esse código, recomendo não utilizar, mas sim ajustar para NÃO CADASTRAR REPETIDOS (em vez de REMOVER OS REPETIDOS).

No aguardo.

No aguardo.

Postado

Perdão, esqueci de mencionar que havia criado um procedimento para colocar o vetor em ordem crescente, pois acreditei que fazendo isso, facilitaria a remoção dos elementos repetidos. O programa está rodando corretamente. Mas eu gostei da ideia. como eu faria para não cadastrar esse repetidos?

Eu estou no primeiro período da faculdade de SI. Estou aprendendo agora a programar, então cada dica é muito valiosa, principalmente se facilitar na hora de programar.

Grato

  • Membro VIP
Postado
Como eu faria para não cadastrar esse repetidos?

Você pode fazer de forma análoga a verificação do "já existe no outro"...

Fica a dica:

    if (diferenca) and (not repetido) then
begin
quant:=quant+1;
z[quant]:= x[i];
end;

Obs.1: São duas verificações... e no caso tanto faz fazer uma ou outra primeiro...

Obs.2: A segunda verificação só precisará ser feita se a primeira assim sugeri; (se for igual não faz sentido verificar se é repito, nem muito menos se for repetido, verificar se é igual).

No aguardo.

  • 2 semanas depois...
  • Moderador
Postado

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

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