Como fazer a divisão de números do vetor [RESOLVIDO]

1. Como fazer a divisão de números do vetor [RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 06/08/2023 - 03:53h

Olá galera beleza?

Estou fazendo um algoritmo em c++ que acha o próximo número da sequência de Fibonacci pela razão, mas ao tentar fazer a divisão dos números no vetor não consigo obter o número "0.618" qual é o erro?


 
#include <cmath>
#include <iostream>

using namespace std;

int main() {

// razao = 21/34
// razao = 0.617;
double razao;
int anterior, atual, proximo;
int fibNum[] = {21, 34, 55, 89, 144, 233, 377};

int tam = (sizeof(fibNum) / sizeof(fibNum[0]));

for (int i = 0; i < tam; i++) {
razao = ((double)fibNum[0] / (double)fibNum[1]);
anterior = round(fibNum[i] * razao);
atual = round(anterior / razao);
proximo = round(fibNum[i] / razao);

cout << "\nAnterior: " << anterior
<< "\nAtual: " << atual
<< "\nProximo: " << proximo
<< "\nRazão: " << razao << endl;
}

return EXIT_SUCCESS;
}



wiki.anon


  


2. Re: Como fazer a divisão de números do vetor [RESOLVIDO]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 06/08/2023 - 03:53h

Olá!

Primeiro de tudo, reparei que pareces estar a usar o operador de divisão (/) para inteiros no c++. Quando divides inteiros, a C++ vai truncar a parte decimal, retornando apenas um número inteiro. Se quiseres uma divisão em ponto flutuante (quer dizer, manter a parte decimal), precisas de certificar-te pelo menos um dos operandos é em ponto flutuante. No teu caso, podes converter os operandos para float para manter a precisão decimal.

Assim, a linha onde acontece a divisão deve ser alterada para:

razao = round((float)fibNum[0] / (float)fibNum[1]);

Outra coisa, vejo que a variável razão está sendo declarada como constante. No entanto, estás tentando modificá-la dentro do loop for, e o compilador não vai permitir isso, porque uma constante em C++ é um valor que não pode ser alterado depois de inicializado.

Por último, reparei que as variáveis 'anterior', 'atual' e 'proximo' não estão recebendo nenhum valor, mas estão sendo impressas na saída. Precisas dar um valor para essas variáveis antes de as usar.

Após estas alterações, o teu algoritmo


3. Re: Como fazer a divisão de números do vetor [RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 06/08/2023 - 04:03h


alexabolada escreveu:

Olá!

Primeiro de tudo, reparei que pareces estar a usar o operador de divisão (/) para inteiros no c++. Quando divides inteiros, a C++ vai truncar a parte decimal, retornando apenas um número inteiro. Se quiseres uma divisão em ponto flutuante (quer dizer, manter a parte decimal), precisas de certificar-te pelo menos um dos operandos é em ponto flutuante. No teu caso, podes converter os operandos para float para manter a precisão decimal.

Assim, a linha onde acontece a divisão deve ser alterada para:

razao = round((float)fibNum[0] / (float)fibNum[1]);

Outra coisa, vejo que a variável razão está sendo declarada como constante. No entanto, estás tentando modificá-la dentro do loop for, e o compilador não vai permitir isso, porque uma constante em C++ é um valor que não pode ser alterado depois de inicializado.

Por último, reparei que as variáveis 'anterior', 'atual' e 'proximo' não estão recebendo nenhum valor, mas estão sendo impressas na saída. Precisas dar um valor para essas variáveis antes de as usar.

Após estas alterações, o teu algoritmo


a razão continua dando 1 mas teria que dar 0.618 e não está dando certo.

wiki.anon


4. Re: Como fazer a divisão de números do vetor [RESOLVIDO]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 06/08/2023 - 04:03h

Olá!

Parece que você seguiu as instruções e efetuou as alterações sugeridas corretamente. No entanto, você está ainda enfrentando problemas com o resultado da razão. A função round() pode estar arredondando o valor para o inteiro mais próximo, o que pode ser a causa da razão continuar dando 1.

Uma possível solução seria eliminar a função round() da linha da razão. Assim, a linha seria algo como:

razao = (float)fibNum[0] / (float)fibNum[1];

E se mesmo assim a razão continuar dando 1, verifique a ordem dos operandos. Talvez você possa estar fazendo a divisão ao contrário, e por isso a razão sempre retorna 1.

Espero poder ter ajudado.

Alexa Bolada.


5. Re: Como fazer a divisão de números do vetor [RESOLVIDO]

Jean César
dark777

(usa Linux Mint)

Enviado em 06/08/2023 - 04:43h


alexabolada escreveu:

Olá!

Parece que você seguiu as instruções e efetuou as alterações sugeridas corretamente. No entanto, você está ainda enfrentando problemas com o resultado da razão. A função round() pode estar arredondando o valor para o inteiro mais próximo, o que pode ser a causa da razão continuar dando 1.

Uma possível solução seria eliminar a função round() da linha da razão. Assim, a linha seria algo como:

razao = (float)fibNum[0] / (float)fibNum[1];

E se mesmo assim a razão continuar dando 1, verifique a ordem dos operandos. Talvez você possa estar fazendo a divisão ao contrário, e por isso a razão sempre retorna 1.

Espero poder ter ajudado.

Alexa Bolada.


Agora deu certo eu não estava fazendo casting para float

wiki.anon


6. Re: Como fazer a divisão de números do vetor [RESOLVIDO]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 06/08/2023 - 04:43h

Olá, wiki.anon!

Fico feliz que a minha dica tenha ajudado e que você conseguiu resolver o problema! O casting para float é um detalhe pequeno, mas faz muita diferença em alguns casos como o que você estava enfrentando. Espero poder ajudar com outras dúvidas no futuro.

Um grande abraço,

Alexa Bolada.


7. Re: Como fazer a divisão de números do vetor [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 13/08/2023 - 03:54h

Seu programa original (a não ser que você tenha editado a postagem ao longo do tópico) “funcionou” de primeira aqui para mim.

O problema que ele tinha, no entanto, era que você sempre calculava a razão dividindo o primeiro elemento do array pelo segundo (i.e. “razao = ((double)fibNum[0] / (double)fibNum[1]);”), em lugar de ir aprimorando a qualidade da convergência com novos valores da sequência para cálculo da razão.

Suspeito que o que você queria era algo como o seguinte.
#include <cmath>
#include <iostream>

using namespace std;

int main() {
// razao = 21/34
// razao = 0.617;
double razao;
int anterior, atual, proximo;
int fibNum[] = {21, 34, 55, 89, 144, 233, 377, 610};
int tam = (sizeof(fibNum) / sizeof(fibNum[0]));
for (int i = 1; i < tam; i++) {
razao = ((double)fibNum[i-1] / (double)fibNum[i]); // <-- Note que, aqui, a razão vai sendo aprimorada a cada novo número.
anterior = round(fibNum[i] * razao);
atual = round(anterior / razao);
proximo = round(fibNum[i] / razao);
cout
<< "\nAnterior: " << anterior
<< "\nAtual: " << atual
<< "\nProximo: " << proximo
<< "\nRazão: " << razao << endl
;
}
return EXIT_SUCCESS;
}


Note, porém, que o que se costuma considerar como razão para a sequência de Fibonacci, também conhecida como “razão áurea”, “razão de ouro” ou “número de ouro”, é F(n)/F(n-1), que é exatamente o inverso do que você fez (F(n-1)/F(n)).

A razão áurea é representada pelo símbolo &#966; (letra grega minúscula phi, que corresponde a U+03C6 no Unicode), e corresponde ao valor (1+&#8730;5)/2 (em C++, (1.0+std::sqrt(5.0))/2.0), que é aproximadamente igual a 1,61803398874989484820458683436563811772030917980576286213544862270526046281890244970720720418939113748475 (cf. https://oeis.org/A001622).

Uma versão do programa usando a razão áurea ficaria assim, portanto.
#include <cmath>
#include <iostream>

using namespace std;

int main() {
// phi = 34/21
// phi = 1.61904761904761904761;
double phi;
int anterior, atual, proximo;
int fibNum[] = {21, 34, 55, 89, 144, 233, 377, 610};
int tam = (sizeof(fibNum) / sizeof(fibNum[0]));
for (int i = 1; i < tam; i++) {
phi = ((double)fibNum[i] / (double)fibNum[i-1]);
anterior = round(fibNum[i]/phi);
atual = fibNum; //round(anterior*phi);
proximo = round(fibNum[i[i]
]*phi);
cout
<< "\nAnterior: " << anterior
<< "\nAtual: " << atual
<< "\nProximo: " << proximo
<< "\nRazão: " << phi << endl
;
}
return EXIT_SUCCESS;
}



... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts