Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created January 16, 2019 17:25
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 parzibyte/6c8428848a79191a011c507f00eec38f to your computer and use it in GitHub Desktop.
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
/*
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