Skip to content

Instantly share code, notes, and snippets.

@vmattos
Last active April 5, 2017 02:18
Show Gist options
  • Save vmattos/5b31e4fc7a37e2b7495a7610c3e9fa9f to your computer and use it in GitHub Desktop.
Save vmattos/5b31e4fc7a37e2b7495a7610c3e9fa9f to your computer and use it in GitHub Desktop.
Functional C
#include <stdio.h>
/***************************
* Estratégias de cálculo *
***************************
*
* Essas funções devem retornar void e receber dois int como parametros
* Por quê? Veja o próximo comentário...
*
*/
void soma(int n1, int n2)
{
printf("%d + %d = %d", n1, n2, n1 + n2);
}
void subtracao(int n1, int n2)
{
printf("%d - %d = %d", n1, n2, n1 - n2);
}
void divisao(int n1, int n2)
{
printf("%d / %d = %d", n1, n2, n1 / n2);
}
void multiplicacao(int n1, int n2)
{
printf("%d * %d = %d", n1, n2, n1 * n2);
}
/***************************
* Função calc *
***************************
*
* A função calc recebe apenas 1 parametro: um ponteiro para uma função
* quetem como assinatura: retorno void, e recebe dois int como parametros
*
*/
void calc(void (*estrategia)(int, int))
{
int n1, n2;
printf("Digite n1: ");
scanf("%d", &n1);
printf("Digite n2: ");
scanf("%d", &n2);
estrategia(n1, n2);
printf("\n\n");
}
int main()
{
calc(soma);
calc(subtracao);
calc(divisao);
calc(multiplicacao);
}
/*
* A única vantagem dessa abordagem é que o código fica extensível sem
* precisar sofrer modificações (não da pra quebrar código se você não
* mexer nele ¯\_(ツ)_/¯ )
*
* Se quisermos uma nova estratégia de cálculo, basta criar uma nova função,
* sem precisar alterar a função calc
* ex:
*
* void mediaSimples(int n1, int n2)
* {
* printf("Média entre %d e %d = %d", n1, n2, (n1 + n2) / 2)
* }
*
* e para invoca-la:
*
* calc(mediaSimples)
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment