Created
January 16, 2019 17:25
-
-
Save parzibyte/6c8428848a79191a011c507f00eec38f to your computer and use it in GitHub Desktop.
Anagrama en C created by parzibyte - https://repl.it/@parzibyte/Anagrama-en-C
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
/* | |
Comprobar si dos palabras son anagramas, o si una palabra es anagrama | |
de otra usando el lenguaje de programación C | |
@author parzibyte | |
*/ | |
#include <stdio.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include <ctype.h> | |
#define MAXIMA_LONGITUD_CADENA 100 | |
// Prototipos de funciones | |
// Función tomada de: | |
// https://parzibyte.me/blog/2019/01/16/remover-caracteres-de-cadena-c/ | |
void removerCaracteres(char *cadena, char *caracteres); | |
// La función para ordenar cadenas, una simple envoltura de strcmp | |
int comparar(const void *a, const void *b); | |
// La función que nos interesa | |
int esAnagrama(char *cadena, char *otraCadena); | |
int main() { | |
// Un arreglo de arreglos de cadenas, sólo es para ejemplificar | |
// https://parzibyte.me/blog/2018/11/08/arreglos-de-cadenas-en-c/ | |
char palabras[5][2][MAXIMA_LONGITUD_CADENA] = { | |
{"I am Lord Voldemort", "Tom Marvolo Riddle"}, | |
{"Amor", "Roma"}, | |
{"Luis", "Parzibyte"}, | |
{"Esto no es", "un anagrama"}, | |
{"Frase", "Fresa"}}; | |
for (int x = 0; x < 5; x++) { | |
printf("\n\nProbando con '%s' y '%s'\n", palabras[x][0], palabras[x][1]); | |
int resultado = esAnagrama(palabras[x][0], palabras[x][1]); | |
if (resultado) { | |
printf("SON anagramas"); | |
} else { | |
printf("NO SON anagramas"); | |
} | |
} | |
return EXIT_SUCCESS; | |
} | |
int comparar(const void *a, const void *b) { | |
// Castear a char y regresar lo que regresaría strcmp ;) | |
return strcmp((char *)a, (char *)b); | |
} | |
void removerCaracteres(char *cadena, char *caracteres) { | |
int indiceCadena = 0, indiceCadenaLimpia = 0; | |
int deberiaAgregarCaracter = 1; | |
// Recorrer cadena carácter por carácter | |
while (cadena[indiceCadena]) { | |
// Primero suponemos que la letra sí debe permanecer | |
deberiaAgregarCaracter = 1; | |
int indiceCaracteres = 0; | |
// Recorrer los caracteres prohibidos | |
while (caracteres[indiceCaracteres]) { | |
// Y si la letra actual es uno de los caracteres, ya no se agrega | |
if (cadena[indiceCadena] == caracteres[indiceCaracteres]) { | |
deberiaAgregarCaracter = 0; | |
} | |
indiceCaracteres++; | |
} | |
// Dependiendo de la variable de arriba, la letra se agrega a la "nueva | |
// cadena" | |
if (deberiaAgregarCaracter) { | |
cadena[indiceCadenaLimpia] = cadena[indiceCadena]; | |
indiceCadenaLimpia++; | |
} | |
indiceCadena++; | |
} | |
// Al final se agrega el carácter NULL para terminar la cadena | |
cadena[indiceCadenaLimpia] = 0; | |
} | |
int esAnagrama(char *palabra, char *otraPalabra) { | |
// Quitar caracteres como signos de puntuación o espacios | |
removerCaracteres(palabra, " ,.!"); | |
removerCaracteres(otraPalabra, " ,.!"); | |
// Convertir a minúsculas a ambas palabras | |
// https://parzibyte.me/blog/2018/09/20/convertir-cadena-a-mayuscula-y-minuscula-en-c/ | |
int contador = 0; | |
while (palabra[contador]) { | |
palabra[contador] = tolower(palabra[contador]); | |
contador++; | |
} | |
contador = 0; | |
while (otraPalabra[contador]) { | |
otraPalabra[contador] = tolower(otraPalabra[contador]); | |
contador++; | |
} | |
// Ordenar las letras de ambas palabras | |
qsort(otraPalabra, strlen(otraPalabra), sizeof(char), comparar); | |
qsort(palabra, strlen(palabra), sizeof(char), comparar); | |
// Si al ordenarlas y ponerlas en minúsculas son iguales, entonces son | |
// anagramas | |
return strcmp(palabra, otraPalabra) == 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment