Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Fibonacci com FOR

Bom minha dúvida é a seguinte, eu decidi fazer a sequência de Fibonacci usando o for, e deu certo, porém depois fui testar o código disponibilizado na resolução, que utiliza o while, e ao rodar o programa ele exibe apenas uma tela que mostra toda a sequência, o meu porém exibe 1 tela para cada número, então fica aquela coisa chata de ficar apertando OK toda hora... eu fiz algumas modificações para ficar parecido com o da resolução e não deu certo, gostaria de saber onde está o erro.

Segue abaixo o código:

 public void btnCalcula_Click(object sender, EventArgs e)
        {
            try
            {
                string serie = "";
                int numPre = 0;
                int numPos = 1;

                int sequencia = int.Parse(txtFibonacci.Text);

                for (int i = 0; i <= sequencia; i++)
                {
                    serie += numPos + " ";
                    int fibonacci = numPre + numPos;
                    numPos = fibonacci;
                    numPre = numPos;


                    MessageBox.Show("A série de Fibonacci até " + txtFibonacci.Text + ": " + serie);
                }
            }
            catch (FormatException)
            {
                MessageBox.Show("Digite um número!");
            }

PS: só para vocês entenderem (provável que já saibam), mais eu fiz uma TextBox para o usuário digitar o tamanho da sequencia que ele quer e usei o Try/catch para evitar que o usuário digite outra coisa a não ser números! PS2: Eu esqueci de falar mas ele ta infinito, tipo eu digito 100 no tamanho e ele ultrapassa o 100 e não para mais kkk

7 respostas

Acho que dessa maneira ficaria melhor. Não sei qual resultado você esta esperando.

public void btnCalcula_Click (object sender, EventArgs e) {
        try {
            string serie = "";
            int numPre = 0;
            int numPos = 1;

            int sequencia = int.Parse (txtFibonacci.Text);
            var fibo = new StringBuilder ();

            for (int i = 0; i <= sequencia; i++) {
                serie += numPos + " ";
                int fibonacci = numPre + numPos;
                numPos = fibonacci;
                numPre = numPos;
                fibo.Append (serie);
            }
            MessageBox.Show ("A série de Fibonacci até " + txtFibonacci.Text + ": " + fibo.ToString);
        } catch (FormatException) {
            MessageBox.Show ("Digite um número!");
        }
solução!

Olá Gabriel, tudo bem?

Primeira coisa que eu recomendaria seria tirar o Messagebox do ciclo for.

Outra coisa, eu troquei a ordem da declaração de numPos e numPre dentro do for. No caso, o for ficou assim:

serie += numPos + " ";
ulong fibonacci = numPre + numPos;
numPre = fibonacci;
numPos = numPos;

O último detalhe é que como sequencia limita a variável i do for. Um valor de sequencia igual a 100 não indica que o maior valor da série será 100 e sim que a série terá 100 números, fazendo com que os últimos números sejam realmente muito grandes.

Por isso troquei o tipo de variável de int para ulong.

Este artigo da Caelum contem a descrição dos tipos de variaveis Tipos primitivos

Espero ter ajudado!

Luis Miguel, por que eu estanciou uma classe na var fibo? E o que significa fibo.Append(serie)?

Bom dia José, fazendo os outros exercícios do curso eu percebi que eu tinha que deixar o MessageBox fora do for, por que senão ele ia ficar repetindo toda hora kk Ah sim, não sabia desse tipo de variável ulong, vou dar uma pesquisada a mais sobre ela!! E pode me explicar o por que das alterações no for? Se caso eu alterasse o tipo da variável sequência para ulong e tirasse o MessageBox do loop já não resolveria meu problema?

O comando "var fibo = new StringBuilder ();" esta instanciando uma StringBuilder. Com essa classe conseguimos construir string de maneira mais flexível. A método "StringBuilder " adiciona uma nova cadeia de caracteres no final da string que existe até o momento.

Se você reparar, ao seguir o código original e entrar no loop com numPre = 0 e numPos = 1, teremos:

serie = 1 fibonacci = 1 + 0 = 1 numPos = fibonacci = 1 numPre = numPos = 1 (Nesse momento basicamente está igualando numPre = numPos = fibonacci)

Resultado:

Código original em que a sequência está incorreta

Código alterado

Aah certo, entendi, valeu José!!