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.
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:
- Adicionando suporte a linguagem C no editor
dotspacemacs-configuration-layers
'(
c-c++)
- 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.
- 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
- 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).
Inteiro que representa o número para o qual desejamos calcular o fatorial. Caso o inteiro seja menor que 0, o valor -1 é retornado.
Inteiro que representa o fatorial do número fornecido como argumento ou -1 caso o inteiro fornecido seja menor que 0.
Este algoritmo possui complexidade de tempo O(n), em que n é o número inteiro fornecido como argumento.
int factorial (int n) {
if (n < 0) return -1;
int fact = 1;
for (int i = 1; i <= n ; i++)
fact = fact * i;
return fact;
}
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.
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);
}
}