machi Posted June 28, 2006 at 07:03 PM Report #35323 Posted June 28, 2006 at 07:03 PM Viva! Estou com uma pequena dúvida relacionada com ponteiros. É o seguinte : int *p ; int x = 2 ; p = &x ; *p = x + 3 ; x += 2 * x ; printf("*p = %d ; x = %d", *p, x); resutado => *p = 15 ; x = 15 ; Porque motivo depois de passar aqui *p = x + 3 o valor de x passa a ser 5 ? x passa automaticamente a ter o valor de *p ? Espero ter sido bem explícito.
Solution Guest id194 Posted June 28, 2006 at 07:07 PM Solution Report #35325 Posted June 28, 2006 at 07:07 PM porque tu ao fazeres p = &x tas a dizer que o ponteiro p é igual ao endereço de memoria onde esta alocado o x e ao alterares o valor de p na linha a seguir, alteras o do x. não tenho a certeza total disto, mas penso que seja isso.
Rui Carlos Posted June 28, 2006 at 07:14 PM Report #35329 Posted June 28, 2006 at 07:14 PM é mais ou menos isso, *p e x estão na mesma posição de memória, logo tem sempre o mesmo valor (enquanto p=&x) Rui Carlos Gonçalves
machi Posted June 28, 2006 at 10:02 PM Author Report #35369 Posted June 28, 2006 at 10:02 PM Dúvida anterior esclarecida! 😉 Mais uma dúvida agora com uma função: Como poderei implementar uma função que determine se um dado vector contêm elementos repetidos? ?
Rui Carlos Posted June 28, 2006 at 10:18 PM Report #35373 Posted June 28, 2006 at 10:18 PM uma hipótese (talvez não muito eficiente) consiste em percorrer o vector e, para cada elemento, verificar se nas posições seguintes existe um elemento igual... podes sempre ordenar o vector e a tarefa fica mais simples. para vectores de grandes dimensões esta solução é mais eficiente do que a anterior. Rui Carlos Gonçalves
machi Posted June 28, 2006 at 10:22 PM Author Report #35375 Posted June 28, 2006 at 10:22 PM encontrei uma solução !! 😁 é necessário recorrer a duas funções que vou apresentar de seguida: Esta função percorre o vector e verifica se existe mais de um elemento com o mesmo valor int fcontar (int *V, int x, int N) { int cont = 0; for (int i=0; i < N; i++) if (V[i]==x) cont++; return cont; } Esta função devolve o valor true / false caso haja ou não valores repetidos bool ContemRepetidos(int *U, int N) { for (int i = 0; i < N; i++) if( fcontar(V,V[i],N) > 1 ) return false; }
TheDark Posted June 29, 2006 at 02:57 AM Report #35397 Posted June 29, 2006 at 02:57 AM Não sei se precisas da função fcontar para saber quantos elementos de um determinado valor existem no array noutra ocasião, mas de qualquer forma ao usares essas duas funções dessa maneira estás a complicar, porque para cada valor no array estás a percorrê-lo desde o início para comparar com todas as posições, e isto não é necessário. Apenas precisas de comparar cada valor do array com os valores seguintes, porque já o comparaste com os anteriores. De qualquer forma, com o array desordenado, uma maneira melhor de verificares se existem valores duplicados (ou mais), é utilizando 2 fors encadeados numa só função, cada um a controlar um indice. O for exterior percorre as posições de 0 a N-1 (exclusivé), e o for interior percorre as posiçoes de i+1 até N (também exclusivé); comparando as duas, se forem iguais retorna true, e se sair dos dois fors retorna false. é outro problema da função ContemRepetidos é que nunca retorna true. E já agora, em C não podes declarar o int i dentro do for... Em C ficará algo deste género: bool ContemRepetidos(int *U, int N) { int i, j; for (i=0; i<N-1; ++i) for (j=i+1; j<N; ++j) if (U[i]==U[j]) return true; // Existem elementos repetidos return false; // Saiu do for, entao nao encontrou elementos repetidos } Quaisquer dúvidas, pergunta! 😉 Desaparecido.
machi Posted June 29, 2006 at 02:01 PM Author Report #35471 Posted June 29, 2006 at 02:01 PM Realmente desta forma torna-se mais simples de implementar. 🙂 Na minha implementação só iria complicar !! 😄
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now