-
Notifications
You must be signed in to change notification settings - Fork 0
/
BuscaBinaria.cpp
112 lines (85 loc) · 3.13 KB
/
BuscaBinaria.cpp
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
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <cctype>
using namespace std;
/*Ler o arquivo nomes.txt em anexo.
Utilizando a busca binária, ler um nome e retornar todos os nomes que se encaixam com a busca no início da palavra.
Por exemplo:
Adalberto Estevez
Adelia Rosmaninho
Adelina Paredes
Adelio Clementino
Afonso Cantanhede
Afonso Herrera
Bruna Adenisia
Se buscar pelas iniciais Ade, sua busca deve trazer "Adelia Rosmaninho", "Adelina Paredes", "Adelio Clementino".
Ignorar letras maiúsculas e minúsculas na hora de ler.
Funções úteis:
https://cplusplus.com/reference/cstring/strstr/
https://cplusplus.com/reference/cctype/toupper/
https://cplusplus.com/reference/cctype/tolower
*/
// Função para converter uma string para minúsculas (case insensitive)
string toLowerCase(const string& str) {
string result = str;
for (char& ch : result) {
ch = tolower(ch);
}
return result;
}
// Função de busca binária para encontrar todos os nomes com um determinado prefixo
void buscaBinariaPrefixo(const vector<string>& nomes, const string& prefixo) {
string prefixoLower = toLowerCase(prefixo);
int s = 0, e = nomes.size() - 1;
while (s <= e) {
int m = (s + e) / 2;
string nomeLower = toLowerCase(nomes[m]);
// Verificar se o prefixo coincide no início da palavra
if (nomeLower.compare(0, prefixoLower.size(), prefixoLower) == 0) {
// Encontramos um nome com o prefixo, agora buscamos para os lados
cout << "Resultado da busca: " << nomes[m] << "\n";
// Buscar à esquerda para encontrar outros possíveis resultados
int esquerda = m - 1;
while (esquerda >= 0 && toLowerCase(nomes[esquerda]).compare(0, prefixoLower.size(), prefixoLower) == 0) {
cout << "Resultado da busca: " << nomes[esquerda] << "\n";
--esquerda;
}
// Buscar à direita para encontrar outros possíveis resultados
int direita = m + 1;
while (direita < nomes.size() && toLowerCase(nomes[direita]).compare(0, prefixoLower.size(), prefixoLower) == 0) {
cout << "Resultado da busca: " << nomes[direita] << "\n";
++direita;
}
return; // Encontramos todos os possíveis resultados
} else if (nomeLower > prefixoLower) {
e = m - 1;
} else {
s = m + 1;
}
}
cout << "Nenhum resultado encontrado para o prefixo: " << prefixo << "\n";
}
int main() {
ifstream file("C:/Users/natsa/OneDrive/Documentos/nomes.txt");
if (!file) {
cerr << "Erro ao abrir o arquivo 'nomes.txt'.\n";
return 1;
}
vector<string> nomes;
string nome;
// Leitura dos nomes do arquivo
while (getline(file, nome)) {
nomes.push_back(nome);
}
file.close();
// Ordenar os nomes para a busca binária (ordem alfabética)
sort(nomes.begin(), nomes.end());
string prefixo;
cout << "Digite o prefixo para busca: ";
ncin >> prefixo;
buscaBinariaPrefixo(nomes, prefixo);
return 0;
}