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:
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.
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:
- uma
struct fibonacci
que contém um vetor dinâmico e seu tamanho; - funções para inicializar, preencher e liberar essa estrutura;
- uma função pra imprimir a sequência;
- a
main
que orquestra tudo.
Passo 2
Teoria sobre
Em C, usamos
struct
em CEm 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
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:
- define o tamanho
n
; - chama
malloc(n * sizeof(int))
pra reservar espaço pro vetor; - retorna a struct montada.
Passo 4
Função de preenchimento
A sequência de Fibonacci satisfaz a fórmula de recorrência
A sequência de Fibonacci satisfaz a fórmula de recorrência
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:
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
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
A gente lê
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.