Skip to content

Instantly share code, notes, and snippets.

@Alynva
Last active November 9, 2017 14:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Alynva/7788f9e1b6151bd0eebb1ae920f0cced to your computer and use it in GitHub Desktop.
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.
/*
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