A sequência de Fibonacci é uma sequência que começa com os termos 0 e 1, e cada próximo valor será sempre a soma dos dois valores imediatamente anteriores: 0,1,1,2,3,5 ldots
Junte todos os trechos de código solicitados nos exercícios a seguir em um código só, completo, conforme o que se pede.
Redefina o tipo da estrutura para que ela tenha o nome fibonacci.

Passo 1

O enunciado pede pra juntar num único programa em C todos os trechos de código dos exercícios anteriores, redefinindo o nome da estrutura pra fibonacci. O conteúdo da matéria envolve:
  • uso de struct em C
  • alocação dinâmica de memória (malloc/free)
  • preenchimento de uma sequência (a de Fibonacci)
  • impressão dos resultados
Pra resolver, vamos criar:
  1. uma struct fibonacci que contém um vetor dinâmico e seu tamanho;
  2. funções para inicializar, preencher e liberar essa estrutura;
  3. uma função pra imprimir a sequência;
  4. a main que orquestra tudo.

Passo 2

Teoria sobre struct em C
Em C, usamos struct pra agrupar vários dados sob um único nome. Aqui a gente quer guardar:
  • um ponteiro para um vetor de inteiros (int *vetor)
  • o tamanho desse vetor (int tamanho)
Então declaramos:
typedef struct {
    int *vetor;
    int tamanho;
} fibonacci;
Isso diz que sempre que escrevermos fibonacci, estamos nos referindo a esse bloco de dados.

Passo 3

Função de inicialização
Pra usar um vetor dinâmico, precisamos alocar memória com malloc. Vamos criar uma função que recebe n e retorna uma fibonacci já preparada:
fibonacci init_fibonacci(int n) {
    fibonacci f;
    f.tamanho = n;
    f.vetor = (int*) malloc(n * sizeof(int));
    return f;
}
Aqui a gente:
  1. define o tamanho n;
  2. chama malloc(n * sizeof(int)) pra reservar espaço pro vetor;
  3. retorna a struct montada.

Passo 4

Função de preenchimento
A sequência de Fibonacci satisfaz a fórmula de recorrência
F0 = 0, F1 = 1, Fn = Fn-1 + Fn-2 para n>=2
Então, pra preencher:
void fill_fibonacci(fibonacci *f) {
    if (f->tamanho >= 1) f->vetor[0] = 0;
    if (f->tamanho >= 2) f->vetor[1] = 1;
    for (int i = 2; i < f->tamanho; i++) {
        f->vetor[i] = f->vetor[i-1] + f->vetor[i-2];
    }
}
A gente verifica se o tamanho é pelo menos 1 ou 2 pra não estourar memória, e depois roda um for pra calcular cada termo.

Passo 5

Função de impressão
Só um loop que mostra cada elemento do vetor:
void print_fibonacci(const fibonacci *f) {
    for (int i = 0; i < f->tamanho; i++) {
        printf("%d ", f->vetor[i]);
    }
    printf("\n");
}

Passo 6

Função de liberação
Como usamos malloc, precisamos chamar free pra não vazar memória:
void free_fibonacci(fibonacci *f) {
    free(f->vetor);
    f->vetor = NULL;
    f->tamanho = 0;
}

Passo 7

Função main
A gente lê n, monta a struct, preenche, imprime e libera:
int main() {
    int n;
    printf("Quantos termos da Fibonacci? ");
    scanf("%d", &n);

    fibonacci f = init_fibonacci(n);
    fill_fibonacci(&f);
    print_fibonacci(&f);
    free_fibonacci(&f);

    return 0;
}

Resposta

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int *vetor;
    int tamanho;
} fibonacci;

fibonacci init_fibonacci(int n) {
    fibonacci f;
    f.tamanho = n;
    f.vetor = (int*) malloc(n * sizeof(int));
    return f;
}

void fill_fibonacci(fibonacci *f) {
    if (f->tamanho >= 1) f->vetor[0] = 0;
    if (f->tamanho >= 2) f->vetor[1] = 1;
    for (int i = 2; i < f->tamanho; i++) {
        f->vetor[i] = f->vetor[i-1] + f->vetor[i-2];
    }
}

void print_fibonacci(const fibonacci *f) {
    for (int i = 0; i < f->tamanho; i++) {
        printf("%d ", f->vetor[i]);
    }
    printf("\n");
}

void free_fibonacci(fibonacci *f) {
    free(f->vetor);
    f->vetor = NULL;
    f->tamanho = 0;
}

int main() {
    int n;
    printf("Quantos termos da Fibonacci? ");
    scanf("%d", &n);

    fibonacci f = init_fibonacci(n);
    fill_fibonacci(&f);
    print_fibonacci(&f);
    free_fibonacci(&f);

    return 0;
}
Esse código reúne todos os trechos, define a struct fibonacci e faz tudo que o exercício pediu.

Exercícios relacionados