-
Notifications
You must be signed in to change notification settings - Fork 0
/
tarea.cc
124 lines (110 loc) · 3.16 KB
/
tarea.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "tarea.hh"
#include <iostream>
Tarea::Tarea(const string& title) {
(*this).title = title;
}
Tarea::~Tarea() {
}
void Tarea::write(const Fecha& f) const {
cout << title << " ";
f.write();
writeEtiquetas();
cout << endl;
}
void Tarea::addEtiqueta(const string &e) {
int i;
if(!hasEtiqueta(e, i)) {
etiquetas.push_back(e);
int j = etiquetas.size()-1;
while(j > i) {
etiquetas[j] = etiquetas[j-1];
--j;
}
etiquetas[i] = e;
}
}
bool Tarea::i_hasEtiqueta(const string& e, int i, int j, int& pos) const {
if(i > j) {
pos = i;
return false;
} else {
int k = (i+j)/2;
if(e < etiquetas[k]) {
return i_hasEtiqueta(e, i, k-1, pos);
} else if( e > etiquetas[k]) {
return i_hasEtiqueta(e, k+1, j, pos);
} else {
pos = k;
return true;
}
}
}
bool Tarea::hasEtiqueta(const string& e, int& pos) const {
return i_hasEtiqueta(e, 0, etiquetas.size()-1, pos);
}
void Tarea::setTitle(const string& title) {
(*this).title = title;
}
char Tarea::getOperator(const string& e, int& i) {
//Devuelve el tipo de operador (. o ,) de una expresión que comienza en i. También deja en i su posición.
++i;
if (e[i] == '#') {
//En el caso en el que la primera parte es un a etiqueta, se recorre hasta que acaba (y llega al operador)
++i;
while(e[i] != '.' && e[i] != ',') {
++i;
}
} else {
//En el caso en el que la primera parte es otra expresión, se recorre contando paréntesis abiertos hasta que se cierran todos
//(y llega al operador)
int cont = 1;
++i;
while (cont != 0) {
if(e[i] == '(') {
++cont;
} else if (e[i] == ')') {
--cont;
}
++i;
}
}
return e[i];
}
bool Tarea::i_tieneExpresion(const string& expresion, int i, int j) const {
if(expresion[i] == '#') {
//Caso base en el que la expresión es una etiqueta suelta (no es expresión)
int pos;
return hasEtiqueta(expresion.substr(i, j-i+1), pos);
} else {
//Caso recursivo en el que es una expresión
int k = i;
if(getOperator(expresion, k) == '.') {
return i_tieneExpresion(expresion, i+1, k-1) && i_tieneExpresion(expresion, k+1, j-1);
} else {
return i_tieneExpresion(expresion, i+1, k-1) || i_tieneExpresion(expresion, k+1, j-1);
}
}
}
bool Tarea::tieneExpresion(const string& expresion) const {
//Se le llama a la función de inmersión para hacer la recursividad
return i_tieneExpresion(expresion, 0, expresion.size()-1);
}
bool Tarea::deleteEtiqueta(const string& e) {
int pos;
if(hasEtiqueta(e, pos)) {
etiquetas.erase(etiquetas.begin()+pos);
return false;
} else {
return true;
}
}
void Tarea::deleteEtiquetas() {
etiquetas = vector<string>();
}
void Tarea::writeEtiquetas() const {
int size = etiquetas.size();
for(int i = 0; i < size; ++i) {
cout << " ";
cout << etiquetas[i];
}
}