Skip to content

Instantly share code, notes, and snippets.

@rodrigogribeiro
Last active September 2, 2022 19:39
Show Gist options
  • Save rodrigogribeiro/c60b94ae81076d1cf473b2ae9c9ccf58 to your computer and use it in GitHub Desktop.
Save rodrigogribeiro/c60b94ae81076d1cf473b2ae9c9ccf58 to your computer and use it in GitHub Desktop.
Código exemplo

Implementação de fatorial usando a linguagem C

Introdução

O objetivo destas notas é apresentar aos alunos o org-mode, um componente do GNU-Emacs que provê suporte a literate programming, isto é, desenvolvimento de programas e sua respectiva documentação em um único formato de arquivo.

Configurando o GNU-Emacs

A maneira mais fácil de configurar o GNU-Emacs para o desenvolvimento é utilizando algum pacote de plug-ins. Pessoalmente, eu uso o Spacemacs, que possui um mecanismo simples para adicionar e configurar extensões. Instruções para instalar o Spacemacs podem ser encontradas em sua página. As configurações do Spacemacs ficam armazenadas no arquivo .spacemacs, que define diversas funções para modificar o comportamento padrão do Emacs. Para permitir o uso de literate-programming usando a linguagem C, você precisará modificar as seguintes funções no arquivo .spacemacs:

  1. Adicionando suporte a linguagem C no editor
  dotspacemacs-configuration-layers
'(
  c-c++)
  1. Adicionando suporte de literate programming para a linguagem C
(defun dotspacemacs/user-config ()
  ;; org-shift-selection
  (setq org-support-shift-select t)
  ;; org-babel support
  (setq org-src-fontify-natively t)
  (setq org-src-tab-acts-natively t)
  (org-babel-do-load-languages
   'org-babel-load-languages
   '( 
      (C . t)
    ))
)

Com o arquivo possuindo, no mínimo, essas configurações, pode-se exportar o conteúdo deste arquivo de modelo.

  1. Obter o arquivo .c contendo o código apresentado: Para exportar o código C presente neste arquivo .org, basta executar, no Emacs, a função org-babel-tangle (atalho no Spacemacs: M-m m b t) que será gerado o arquivo fatorial.c
  2. Exportar o conteúdo em um arquivo pdf: Para isso basta executar o comando org-export-dispatcher (atalho no Spacemacs: M-m m e e) e selecionar a opção Export to LaTeX (atalho l) seguida de As a PDF file (atalho p).

Cálculo iterativo do fatorial

Argumentos

Inteiro que representa o número para o qual desejamos calcular o fatorial. Caso o inteiro seja menor que 0, o valor -1 é retornado.

Retorno

Inteiro que representa o fatorial do número fornecido como argumento ou -1 caso o inteiro fornecido seja menor que 0.

Complexidade de tempo

Este algoritmo possui complexidade de tempo O(n), em que n é o número inteiro fornecido como argumento.

Implementação

int factorial (int n) {
  if (n < 0) return -1; 
  int fact = 1;
  for (int i = 1; i <= n ; i++)
    fact = fact * i;
  return fact;
}  

Aplicabilidade

A função de fatorial pode ser utilizada como parte de rotinas para calcular o número de permutações, combinações e arranjos de elementos.

Testes

Considere os seguintes casos de teste:

int testes[4][2] = {{-2 , -1}, {5, 120}, {0, 1}, {3 , 6}};
int testes_rows = 4;

int main () {
  int res  = 0;
  int n    = 0;
  int fact = 0;
  for (int i = 0; i < testes_rows; i++) {
    n = testes[i][0];
    res = testes[i][1];
    fact = factorial(n);
    if (res == fact)
      printf("O fatorial de %d é %d. Teste ok.\n", n, fact);
    else printf("Erro! Valor esperado: %d\nValor calculado:%d", res, fact);
  } 
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment