Jump to content
dramos21

Problema arrays

Recommended Posts

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;
}

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Edited by 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!

Share this post


Link to post
Share on other 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?

Edited by dramos21

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.