Logo Hardware.com.br
Bbruno
Bbruno General de Pijama Registrado
3.2K Mensagens 102 Curtidas

Ajuda para entender algorítmo

#1 Por Bbruno 02/08/2014 - 21:29
public class MaxMin3 {
public static int[] maxMin3(int v[], int n) {
int max, min, FIM;
if ((n % 2) > 0) {
v[n] = v[n - 1];
FIM = n;
} else
FIM = n - 1;
if (v[0] > v[1]) {
max = v[0];
min = v[1];
} else {
max = v[1];
min = v[0];
}
int i = 2;
while (i < FIM) {
if (v[i] > v[i + 1]) {
if (v[i] > max)
max = v[i];
if (v[i + 1] < min)
min = v[i + 1];
} else {
if (v[i] < min)
min = v[i];
if (v[i + 1] > max)
max = v[i + 1];
}
i = i + 2;
}
int maxMin[] = new int[2];
maxMin[0] = min;
maxMin[1] = max;
return maxMin;
}
}
Na verdade a dúvida é nas primeiras linhas de código.. não entendi a utilização de mod e consequentemente o else logo após o mod...
screenblack
screenblack Super Participante Registrado
360 Mensagens 18 Curtidas
#2 Por screenblack
02/08/2014 - 21:53
O mod retorna a sobra de uma divisão.
Caso o numerador seja multiplo do divisor, o resultado será zero.

Vou tomar como exemplo 10 dividido por 2:

10 / 2 = 5 (retorna a parte inteira)
10 % 2 = 0 (retorna a fração/sobra)


Para 3 dividido por 2:

3 / 2 = 1 (parte inteira)
3 % 2 = 5 (parte fracionada/sobra)


Att.
"Se BEBER, não compile o KERNEL. Se compilar o KERNEL, não BEBA." By: A.A.
screenblack
screenblack Super Participante Registrado
360 Mensagens 18 Curtidas
#4 Por screenblack
03/08/2014 - 00:47
Certo.

Acho que fica melhor eu explicar por comentários no código.
Segue:

if ((n % 2) > 0) // Verdadeiro se o resultado da divisão for uma fração, ou seja, maior que zero.
{
v[n] = v[n - 1]; // O valor da posição anterior a 'n' no vetor será atribuido a posição atual.
FIM = n; // Variável 'FIM' armazena a última posição válida do vetor. Provavelmente ela é um atributo da classe e assim permitir fazer o controle interno no objeto)
}
else // Se o resultado da divisão for um valor inteiro
FIM = n - 1; // Variável 'FIM' armazena a posição anterior do vetor. Novamente, parece ser um controle interno da classe.


Acredito que o 'else' não seja necessário, caso o controle da posição do vetor esteja bem estruturado.

Att.
"Se BEBER, não compile o KERNEL. Se compilar o KERNEL, não BEBA." By: A.A.
andremachado
andremachado Super Zumbi Registrado
3.4K Mensagens 2K Curtidas
#5 Por andremachado
03/08/2014 - 09:48
Como licenciando em Matemática, devo dizer que a explicação não é exatamente essa. A interpretação correta dessa parte do código seria:



if ((n % 2) > 0) { // Se n não for divisível por 2, isto é, se for ímpar...
v[n] = v[n - 1]; // O valor de V[n] será o antecessor de n, ou seja, um número par...
FIM = n; // E FIM será igual a n (número ímpar);
} else // Se m for um número par...
FIM = n - 1; // Variável 'FIM' armazena a posição anterior do vetor (número ímpar).
}


No final das contas (sic), fica claro que o valor de FIM sempre será um número ímpar.
56 6F 63 EA 20 E9 20 6D 75 69 74 6F 20 63 75 72 69 6F 73 6F 2E 2E 2E
----------------------------------------
Acer Aspire E5-471-30DG (Casa)
Samsung Book 550XDA-K07 (Trabalho)
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#7 Por tpcvasco
05/08/2014 - 13:13
Explicação correta do andre, apenas duas ressalvas:


v[n] = v[n - 1]; // O valor de V[n] será o antecessor de n, ou seja, um número par...
Não há como saber se o V[n] é um número par ou ímpar, acho q vc quis dizer "um *índice* par".

} else // Se m for um número par...
m não, n.

Bbruno disse:


Pelo q a função recebe de parâmetros parece q sim, pois afinal em C não temos como saber o tamanho de um vetor recebendo apenas ele como parâmetro.
Não entendi muito bem oq a função faz, mas a explicação da 1a. parte do código é essa.
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
© 1999-2025 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal