Trabalhando Com Branches (1)
Suponha que temos mais um colega no time. Suponha que ele decidiu
adicionar trigonometria. Suponha que nós decidimos adicionar exponenciação
e logaritmo. Para fazer tais tarefas, vamos criar mais duas branches, uma
chamada trig
, a outra chamada exp
.
Nossa Branch
Para criá-la, e ao mesmo tempo mudar para ela:
git checkout -b exp
Vamos começar com exponenciação adicionando os identificadores das operações. Uma
exponenciação em qualquer base, e outra na base e
(número de Euler). As linhas
marcadas com -
no início serão excluídas, e as marcadas com +
serão incluídas.
Arquivo ops.h
:
#define OP_MUL_SYM "*"
#define OP_DIV_SYM "/"
+#define OP_POW_SYM "^"
+#define OP_EXP_SYM "exp"
enum operation {
op_add,
op_sub,
op_mul,
- op_div
+ op_div,
+ op_pow,
+ op_exp
};
Depois, vamos implementar a execução dessas operações:
Arquivo ops.c
:
#include "ops.h"
+#include <math.h>
int op_exec(enum operation op, struct stack **stack)
{
...
stack_push(stack, left / right);
}
break;
+ case op_pow:
+ success = stack_pop(stack, &right) && stack_pop(stack, &left);
+ if (success) {
+ stack_push(stack, pow(left, right));
+ }
+ break;
+ case op_exp:
+ success = stack_pop(stack, &left);
+ if (success) {
+ stack_push(stack, exp(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
:
if (advance_op(parser, OP_ADD_SYM, sizeof(OP_ADD_SYM))) {
*output = op_add;
} else if (advance_op(parser, OP_SUB_SYM, sizeof(OP_SUB_SYM))) {
*output = op_sub;
} 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 {
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 4 ^
, e 1 exp
, que devem resultar em 81
e
2.718282
respectivamente.
Funciona! Agora podemos subir as modificações:
git add .
git status
git commit -m 'implementada exponenciação'
git push -u github exp
Como essa é a primeira vez em que a branch vai para o GitHub, precisamos da
flag -u
.
A Branch Do Colega
Agora suponha que trocamos de computador, que somos o colega no computador
dele. A HEAD deve estar na main
a partir de agora (execute
git checkout main
).
Para criar a nova branch, e ao mesmo tempo mudar para ela:
git checkout -b trig
O colega vai adicionar as operações trignonométricas que quer adicionar. Vamos
começar pelas três funções mais conhecidas: sin
, cos
, tan
.
Arquivo ops.h
:
#define OP_MUL_SYM "*"
#define OP_DIV_SYM "/"
+#define OP_SIN_SYM "sin"
+#define OP_COS_SYM "cos"
+#define OP_TAN_SYM "tan"
enum operation {
op_add,
op_sub,
op_mul,
- op_div
+ op_div,
+ op_sin,
+ op_cos,
+ op_tan
};
Arquivo ops.c
:
#include "ops.h"
+#include <math.h>
int op_exec(enum operation op, struct stack **stack)
{
...
stack_push(stack, left / right);
}
break;
+ case op_sin:
+ success = stack_pop(stack, &left);
+ if (success) {
+ stack_push(stack, sin(left));
+ }
+ break;
+ case op_cos:
+ success = stack_pop(stack, &left);
+ if (success) {
+ stack_push(stack, cos(left));
+ }
+ break;
+ case op_tan:
+ success = stack_pop(stack, &left);
+ if (success) {
+ stack_push(stack, tan(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
:
if (advance_op(parser, OP_ADD_SYM, sizeof(OP_ADD_SYM))) {
*output = op_add;
} else if (advance_op(parser, OP_SUB_SYM, sizeof(OP_SUB_SYM))) {
*output = op_sub;
} 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_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 {
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: 0 cos
, 0 sin
, e 0 tan
, que devem resultar em 1
,
0
, e 0
respectivamente.
Funciona! Agora ele pode subir as modificações (com flag -u
):
git add .
git status
git commit -m 'implementada trigonometria básica'
git push -u github trig