Jump to content

Ponteiros / função de verificação de elementos repetidos


Go to solution Solved by Guest id194,

Recommended Posts

Posted

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
Posted

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.

Posted

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

Posted

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.

Posted

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

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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.