• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

machi

[Resolvido] ponteiros / função de verificação de elementos repetidos

8 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é 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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

encontrei uma solução !!  :biggrin:

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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! ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Realmente desta forma torna-se mais simples de implementar.  :)

Na minha implementação só iria complicar !!  :D

0

Partilhar esta mensagem


Link 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