Ir para o conteúdo
dramos21

Problema arrays

Mensagens Recomendadas

dramos21

Boas pessoal, eu tenho este problema em que tenho que criar uma funcao preencheVector para preencher o vector v3, o vector v3 vai ser preenchido da seguinte forma : se um elemento na posicao i do vector v1 ocorrer no vector v2, o vector v3 fica com o mesmo valor de v1 nessa posicao. se nao, o vector v3 fica com 0.

Eu fiz um exemplo em que preenchi alguns vectores para ver se o resultado me dava correcto mas não dá, quando peço o vector v3 ele dá-me sempre o vector v1, e a funcao nao retorna o nao_nulo.

Se alguem me conseguir dar algumas dicas do que fiz mal, obrigado

#include <stdio.h>
#define DIM 4
int preencheVector(int v1[], int v2[], int v3[], int dim);

int main(void)
{
 int i=0;
 int v1[DIM]={6,2,4,0};
 int v2[DIM]={4,2,3,8};
 int v3[DIM];

 preencheVector(v1,v2,v3,DIM);
 for(i=0; i<DIM; i++){
   printf("%d ",v3[i]);
 }
 return 0;
}

int preencheVector(int v1[], int v2[], int v3[], int dim)
{
 int i=0,j=0,nao_nulo=0;

 for(i=0; i<dim; i++){
   while((v1[i] != v2[j] || j<dim)){
     v3[i]=0;
     j=j+1;
   }
   if( (v1[i] != v2[j])== 0){
     v3[i]=v1[i];
   }
 }
 for(i=0; i<dim; i++){
   if(v3[i] != 0){
     nao_nulo=nao_nulo + 1;
   }
 }
 return nao_nulo;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

primeiro cria uma função que verifica se um valor se encontra dentro de um vector

depois cria a tua função que

- para todos elementos do vector v1
 - se o elemento se encontrar no vector v2
   - então v3 na posição iterada é o valor de v1 na posição iterada
   - caso contrário, o valor de v3 na posição iterada é zero


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Problema principal: o teu ciclo while

while((v1[i] != v2[j] || j<dim))

Estuda la bem as condicoes deste ciclo: se um elemento de v1 for diferente dum elemento de v2 OU j menor que dim. j é sempre menor que dim!!!

Alem disso o j nunca volta a zero e a validacao do segundo elemento de i nao vai funcionar.

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

primeiro cria uma função que verifica se um valor se encontra dentro de um vector

depois cria a tua função que

- para todos elementos do vector v1
- se o elemento se encontrar no vector v2
- então v3 na posição iterada é o valor de v1 na posição iterada
- caso contrário, o valor de v3 na posição iterada é zero

Mas não dá para fazer tudo numa mesma função? é que o exercício pede tudo isso numa mesma função. eu tentei faze-lo com dois ciclos for, um dentro do outro, mas o que eu quero é que , um elemento do vector v1 ao aparecer apenas uma vez no vector v2 e deixa de correr o ciclo. dai eu ter feito um while.

Problema principal: o teu ciclo while

while((v1[i] != v2[j] || j<dim))

Estuda la bem as condicoes deste ciclo: se um elemento de v1 for diferente dum elemento de v2 OU j menor que dim. j é sempre menor que dim!!!

Alem disso o j nunca volta a zero e a validacao do segundo elemento de i nao vai funcionar.

o j nunca voltar a 0 tens razão, não me apercebi disso para o resto das posições i que faltam!

agora o que disseste primeiro não percebi bem. eu quero que o ciclo pare quando aconteca uma coisa ou outra. porque eu queria retirar era o valor de j quando o ciclo parasse, pois esse era o valor que me ia dar a posição de j onde o ciclo falhava, visto que não incrementava mais.

como assim o j é sempre menor que dim?

Editado por dramos21

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Mas não dá para fazer tudo numa mesma função?

poder podes, mas a questão encontrasse na simplificação ... http://pt.wikipedia.org/wiki/Divis%C3%A3o_e_conquista

é que o exercício pede tudo isso numa mesma função.

pede ? é estranho que num enunciado peça que se faça tudo numa só função.

olha que:

- pedir uma função que faça o trabalho

é diferente de:

- pedir uma função que não possa chamar outra que faça o trabalho


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

agora o que disseste primeiro não percebi bem.

Hmm pois de facto foi mal explicado :/

A condicao que tens no ciclo (v1 != v2[j] || j<dim) é a mesma coisa que (j<dim).

Quer os elementos sejam iguais quer sejam diferentes, a valor de j vai ser sempre inferior ao valor de dim (ou entao estas a aceder a elementos que nao existem).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

poder podes, mas a questão encontrasse na simplificação ... http://pt.wikipedia.org/wiki/Divis%C3%A3o_e_conquista

pede ? é estranho que num enunciado peça que se faça tudo numa só função.

olha que:

- pedir uma função que faça o trabalho

é diferente de:

- pedir uma função que não possa chamar outra que faça o trabalho

foi num exame, e dizia lá a função que era para utilizar, e com essa função retornar o valor e alterar o vector.

Hmm pois de facto foi mal explicado :/

A condicao que tens no ciclo (v1 != v2[j] || j<dim) é a mesma coisa que (j<dim).

Quer os elementos sejam iguais quer sejam diferentes, a valor de j vai ser sempre inferior ao valor de dim (ou entao estas a aceder a elementos que nao existem).

por causa do OU? tás a dizer que mesmo que a primeira condição falhe, é preciso que as duas falhem para o ciclo deixar de correr e a segunda nunca deixa de acontecer certo? eu defini DIM = 4, quando j=4, ele vai logo aceder à posição inexistente do vector é isso? então como consigo fazer para parar o ciclo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

escreve em português as condições de continuação do ciclo

exemplo:

executar o ciclo enquanto estiver sol ou tenho guarda chuva


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

por causa do OU? tás a dizer que mesmo que a primeira condição falhe, é preciso que as duas falhem para o ciclo deixar de correr

Correcto. Para isso é que existe o OU.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

acho que já consegui perceber como o fazer.

Posso faze-lo com dois ciclos for, quando faço v1 == v2[j] , se acontecer, meto uma variável=1.

no primeiro for, sempre que ele muda a iteração inicializo essa variável a zero. e depois uso esses valores, conforme permaneça 0 ou 1.

Vou testar.

Já consegui resolver. Muito obrigado pela ajuda dois dois

Mas o programa continua sem me retornar o nao_nulo nao percebo porque.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Publica o teu programa actual, com as alteracoes que entretanto fizeste.

Na versao do post #1, o teu programa retorna o valor nao_nulo, mas a funcao main pura e simplesmente ignora-o.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dramos21

sim tens razão, esqueci-me que era preciso mesmo chama-lo e não apenas invocar a função para ele retornar o valor. bastou fazer o printf e ele apareceu naturalmente. Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.