Last active
April 5, 2017 02:18
-
-
Save vmattos/5b31e4fc7a37e2b7495a7610c3e9fa9f to your computer and use it in GitHub Desktop.
Functional C
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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