Trabalhando Com Branches (2)
Esse capítulo é a parte dois do exemplo de branches.
Ainda No Computador Do Colega
O colega vai adicionar trigonometria inversa também:
Arquivo ops.h
:
#define OP_COS_SYM "cos"
#define OP_TAN_SYM "tan"
+#define OP_ARCSIN_SYM "arcsin"
+#define OP_ARCCOS_SYM "arccos"
+#define OP_ARCTAN_SYM "arctan"
enum operation {
op_add,
op_sub,
op_mul,
op_div,
op_sin,
op_cos,
- op_tan
+ op_tan,
+ op_arcsin,
+ op_arccos,
+ op_arctan
};
Arquivo ops.c
:
#include "ops.h"
int op_exec(enum operation op, struct stack **stack)
{
...
stack_push(stack, tan(left));
}
break;
+ case op_arcsin:
+ success = stack_pop(stack, &left);
+ if (success) {
+ stack_push(stack, asin(left));
+ }
+ break;
+ case op_arccos:
+ success = stack_pop(stack, &left);
+ if (success) {
+ stack_push(stack, acos(left));
+ }
+ break;
+ case op_arctan:
+ success = stack_pop(stack, &left);
+ if (success) {
+ stack_push(stack, atan(left));
+ }
+ break;
}
return success;
O colega vai ver se não ocorre algum erro de compilação (no Linux):
gcc -o ops.o -c ops.c
Perfeito, não ocorre.
Precisamos alterar o parser também.
Arquivo parser.c
:
} else if (advance_op(parser, OP_DIV_SYM, sizeof(OP_DIV_SYM))) {
*output = op_div;
} else if (advance_op(parser, OP_SIN_SYM, sizeof(OP_SIN_SYM))) {
*output = op_sin;
} else if (advance_op(parser, OP_COS_SYM, sizeof(OP_COS_SYM))) {
*output = op_cos;
} else if (advance_op(parser, OP_TAN_SYM, sizeof(OP_TAN_SYM))) {
*output = op_tan;
+ } else if (advance_op(parser, OP_ARCSIN_SYM, sizeof(OP_ARCSIN_SYM))) {
+ *output = op_arcsin;
+ } else if (advance_op(parser, OP_ARCCOS_SYM, sizeof(OP_ARCCOS_SYM))) {
+ *output = op_arccos;
+ } else if (advance_op(parser, OP_ARCTAN_SYM, sizeof(OP_ARCTAN_SYM))) {
+ *output = op_arctan;
} else {
success = 0;
}
return success;
Vamos ver se não ocorre algum erro de compilação (no Linux):
gcc -o parser.o -c parser.c
Perfeito, não ocorre.
O colega vai testar também (precisa de -lm
para usar funções math
):
gcc main.o parser.o stack.o ops.o -lm -o rpn-calc
Vamos fazer três testes: 1 arccos
, 0 arcsin
, e 0 arctan
, que devem
resultar em 0
, 0
, e 0
respectivamente.
Funciona! Agora ele pode subir as modificações:
git add .
git status
git commit -m 'implementada trigonometria inversa'
git push
O colega está pronto, e vai mandar as mudanças pra branch main
. Primeiro,
ele vai trocar para ela.
git checkout main
Após isso, ele vai checar se o repositório local está atualizado.
git pull
Ele está atualizado. Ele vai executar o merge
.
git merge trig
Não é necessário resolver conflitos. O colega vai publicar as mudanças.
git push
Voltando Para Nosso Computador
Temos que estar na branch exp
(git checkout exp
). Vamos fazer mais uma
mudança, vamos adicionar logaritmos.
Arquivo ops.h
:
#define OP_POW_SYM "^"
#define OP_EXP_SYM "exp"
+#define OP_LOG_SYM "log"
+#define OP_LN_SYM "ln"
enum operation {
op_add,
op_sub,
op_mul,
op_div,
op_pow,
- op_exp
+ op_exp,
+ op_log,
+ op_ln
};
Depois, vamos implementar a execução dessas operações:
Arquivo ops.c
:
#include "ops.h"
int op_exec(enum operation op, struct stack **stack)
{
...
stack_push(stack, exp(left));
}
break;
+ case op_log:
+ success = stack_pop(stack, &right) && stack_pop(stack, &left);
+ if (success) {
+ stack_push(stack, log(right) / log(left));
+ }
+ break;
+ case op_ln:
+ success = stack_pop(stack, &left);
+ if (success) {
+ stack_push(stack, log(left));
+ }
+ break;
}
return success;
Vamos ver se não ocorre algum erro de compilação (no Linux):
gcc -o ops.o -c ops.c
Perfeito, não ocorre.
Precisamos alterar o parser também.
Arquivo parser.c
:
} else if (advance_op(parser, OP_MUL_SYM, sizeof(OP_MUL_SYM))) {
*output = op_mul;
} else if (advance_op(parser, OP_DIV_SYM, sizeof(OP_DIV_SYM))) {
*output = op_div;
} else if (advance_op(parser, OP_POW_SYM, sizeof(OP_POW_SYM))) {
*output = op_pow;
} else if (advance_op(parser, OP_EXP_SYM, sizeof(OP_EXP_SYM))) {
*output = op_exp;
+ } else if (advance_op(parser, OP_LOG_SYM, sizeof(OP_LOG_SYM))) {
+ *output = op_log;
+ } else if (advance_op(parser, OP_LN_SYM, sizeof(OP_LN_SYM))) {
+ *output = op_ln;
} else {
success = 0;
}
return success;
Vamos ver se não ocorre algum erro de compilação (no Linux):
gcc -o parser.o -c parser.c
Perfeito, não ocorre.
Vamos testar também (precisamos de -lm
para usar funções math
):
gcc main.o parser.o stack.o ops.o -lm -o rpn-calc
Vamos fazer dois testes: 3 81 log
, e 2.718282 ln
, que devem resultar em 4
e 1
respectivamente.
Funciona! Agora podemos subir as modificações:
git add .
git status
git commit -m 'implementado logaritmo'
git push github exp
Vamos dar um push
:
git push
Já podemos fazer merge
.
git checkout main
Agora, vamos ver se não estamos desatualizados:
git pull
Ok, estávamos desatualizados, mas baixamos as atualizações. É possível que tenhamos que resolver algum conflito. Vamos ver:
git merge exp
E... deu conflito. Resolveremos no próximo capítulo.