Last active
November 9, 2017 14:11
-
-
Save Alynva/7788f9e1b6151bd0eebb1ae920f0cced to your computer and use it in GitHub Desktop.
Analisa duas listas de stings ORDENADAS e retorna outra lista que contém as strings que pertence simultaneamente às duas listas fornecidas.
This file contains 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
/* | |
Autor: | |
Alisson Nunes V. A. (www.alynva.com) | |
Descrição: | |
Este algoritmo foi desenvolvido com | |
o propósito de analisar duas listas de | |
stings ORDENADAS e retornar outra lista | |
que contém as strings que pertence | |
simultaneamente às duas listas | |
fornecidas. | |
A implementação foi realizada em C++ | |
apenas para possibilitar que o vetor de | |
strings possa conter strings de tamanho | |
variado. | |
*/ | |
#include <cstdio> // printf | |
#include <iostream> // std::string | |
#include <cstring> // strcmp | |
// Utilização de funções macro (realizadas pelo preprocessador) para simplificar operações | |
#define MENOR(x, y) (((x) < (y)) ? (x) : (y)) // Retorna o menor dentre dois números | |
#define TAMARRAY(a) (sizeof(a) / sizeof(a[0])) // Retorna o tamanho de um dado vetor | |
#define VARNOME(var) #var // Retorna uma string que contém o nome da variável (ou qualquer outro comando) passado no parâmetro (stringification) | |
int main() { | |
// Declaração e inicialização das listas, estas podem ser recolidas de um arquivo | |
std::string lista_1[9] = {"c", "d", "f", "g", "j", "k", "m", "r", "v"}; | |
std::string lista_2[7] = {"c", "d", "f", "h", "j", "m", "q"}; | |
int tam_lista_maior = MENOR(TAMARRAY(lista_1), TAMARRAY(lista_2)); // Obtém o tamanho da menor lista, pois a menor está contida na maior e não o contrário | |
std::string lista_r[tam_lista_maior]; // Cria a lista resultante do tamanho da menor lista | |
printf("Tamanho de %s: %lu\n", VARNOME(lista_1), TAMARRAY(lista_1)); | |
printf("Tamanho de %s: %lu\n", VARNOME(lista_2), TAMARRAY(lista_2)); | |
printf("\n"); | |
// Inicia o loop de comparações | |
// A variável i é utilizada apenas para manter o loop rodando (mesmo resultado se utilizasse while [TO DO]) | |
// As variáveis j, k e l definem as posições das listas 1, 2, e resultante, respectivamente | |
// A condição de parada corresponde a: "ENQUANTO j E k SÃO POSIÇÕES VÁLIDAS NAS LISTAS", ou seja, o loop para quando o último elemento da uma lista é menor do que o próximo elemento da outra lista | |
for (long unsigned int i = 0, j = 0, k = 0, l = 0; j < TAMARRAY(lista_1) && k < TAMARRAY(lista_2); i++) { | |
printf("Comparando valor >%s< [%lu] com >%s< [%lu]\n", lista_1[j].c_str(), j, lista_2[k].c_str(), k); | |
int cmp = strcmp(lista_1[j].c_str(), lista_2[k].c_str()); // Realiza a comparação, obtendo a informação de se o primeiro valor | |
// é menor ou maior do que o segundo, caso a diferença exista | |
if (cmp == 0) { // Os valores são iguais, portanto deve-se salvá-lo | |
printf("\tValor salvo e ambas as listas são avançadas\n"); | |
lista_r[l++] = lista_1[j]; // Insere o valor na lista resultante já incrementando o contador l | |
j++; // Incrementa a string a ser comparada da lista 1 | |
k++; // Incrementa a string a ser comparada da lista 2 | |
} else if (cmp < 0) { // O primeiro valor é menor, portanto ele não está na segunda lista | |
printf("\t%s avançada por possuir valor menor\n", VARNOME(lista_1)); | |
j++; // Incrementa a string a ser comparada da lista 1 | |
} else if (cmp > 0) { // O primeiro valor é maior, portanto o segundo valor não está na primeira lista | |
printf("\t%s avançada por possuir valor menor\n", VARNOME(lista_2)); | |
k++; // Incrementa a string a ser comparada da lista 2 | |
} | |
} | |
printf("\n"); | |
printf("Resultado:\n"); // Exibe a lista resultante | |
for (long unsigned int i = 0; i < TAMARRAY(lista_r); i++) { | |
printf("[%lu]: %s\n", i, lista_r[i].c_str()); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment