Last active
November 13, 2018 16:30
-
-
Save parzibyte/e838334f674a3817c8981dc5c6659747 to your computer and use it in GitHub Desktop.
FrecuenciaDePalabrasEnC created by parzibyte - https://repl.it/@parzibyte/FrecuenciaDePalabrasEnC
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
/** | |
Contar la frecuencia con la que ocurre una palabra dada una oración | |
Se utiliza una pila para poder tener palabras infinitas | |
@author parzibyte | |
Visita: https://parzibyte.me/blog | |
*/ | |
#include <stdio.h> // printf | |
#include <stdlib.h> // malloc y free | |
#include <string.h> // strcasecmp | |
#define MAXIMA_LONGITUD_PALABRA 100 | |
struct DetalleDePalabra { | |
char palabra[MAXIMA_LONGITUD_PALABRA]; | |
int frecuencia; | |
}; | |
struct nodo { | |
struct DetalleDePalabra detalleDePalabra; | |
struct nodo *siguiente; | |
}; | |
void agregar(struct DetalleDePalabra detalleDePalabra); | |
void agregarPalabra(char palabra[MAXIMA_LONGITUD_PALABRA]); | |
void imprimir(void); | |
// Todo comienza con el nodo superior :-) | |
struct nodo *superior = NULL; | |
int main() { | |
// Sin acentos, porque se imprime mal. El original es: | |
/* | |
Conocí a un viajero de una tierra antigua | |
quien dijo: «dos enormes piernas pétreas, sin su tronco | |
se yerguen en el desierto. A su lado, en la arena, | |
semihundido, yace un rostro hecho pedazos, cuyo ceño | |
y mueca en la boca, y desdén de frío dominio, | |
cuentan que su escultor comprendió bien esas pasiones | |
las cuales aún sobreviven, grabadas en estos inertes objetos, | |
a las manos que las tallaron y al corazón que las alimentó. | |
Y en el pedestal se leen estas palabras: | |
"Mi nombre es Ozymandias, rey de reyes: | |
¡Contemplad mis obras, poderosos, y desesperad!" | |
Nada queda a su lado. Alrededor de la decadencia | |
de estas colosales ruinas, infinitas y desnudas | |
se extienden, a lo lejos, las solitarias y llanas arenas» | |
*/ | |
char granCadena[] = | |
"Conoci a un viajero de una tierra antigua quien dijo: dos enormes " | |
"piernas petreas, sin su tronco se yerguen en el desierto. A su lado, en " | |
"la arena, semihundido, yace un rostro hecho pedazos, cuyo cenio y mueca " | |
"en la boca, y desden de frio dominio, cuentan que su escultor " | |
"comprendio bien esas pasiones las cuales aun sobreviven, grabadas en " | |
"estos inertes objetos, a las manos que las tallaron y al corazon que " | |
"las alimento. Y en el pedestal se leen estas palabras: 'Mi nombre es " | |
"Ozymandias, rey de reyes: Contemplad mis obras, poderosos, y " | |
"desesperad' Nada queda a su lado. Alrededor de la decadencia de estas " | |
"colosales ruinas, infinitas y desnudas se extienden, a lo lejos, las " | |
"solitarias y llanas arenas"; | |
char delimitador[] = ",;:. \n!\"'"; // coma, punto y coma, dos puntos, punto, | |
// espacios y saltos de línea | |
// Sacar el primer token | |
char *token = strtok(granCadena, delimitador); | |
// Y sacar todos los siguientes | |
// Por cada uno, agregar la palabra a la pila | |
while (token != NULL) { | |
agregarPalabra(token); | |
token = strtok(NULL, delimitador); | |
} | |
// Luego de agregar todas las palabras, imprimimos nuestra pila | |
imprimir(); | |
} | |
void agregar(struct DetalleDePalabra detalleDePalabra) { | |
// El que se agregará; reservamos memoria | |
struct nodo *nuevoNodo = malloc(sizeof(struct nodo)); | |
// Le ponemos el dato | |
nuevoNodo->detalleDePalabra = detalleDePalabra; | |
// Y ahora el nuevo nodo es el superior, y su siguiente | |
// es el que antes era superior | |
nuevoNodo->siguiente = superior; | |
superior = nuevoNodo; | |
} | |
void agregarPalabra(char palabra[MAXIMA_LONGITUD_PALABRA]) { | |
struct nodo *temporal = superior; | |
while (temporal != NULL) { | |
// Comprobar si la encontramos | |
int resultadoDeComparacion = | |
strcasecmp(temporal->detalleDePalabra.palabra, palabra); | |
// Si es 0, entonces sí | |
if (resultadoDeComparacion == 0) { | |
// Aumentar frecuencia y terminar ciclo y función | |
temporal->detalleDePalabra.frecuencia++; | |
return; | |
} | |
temporal = temporal->siguiente; | |
} | |
// Si no encontramos nada, agregamos una nueva | |
struct DetalleDePalabra detalleDePalabra; | |
strcpy(detalleDePalabra.palabra, palabra); | |
detalleDePalabra.frecuencia = 1; // La primera vez es 1 | |
agregar(detalleDePalabra); | |
} | |
void imprimir(void) { | |
// Un simple encabezado, no hay que confundirse | |
char guiones[] = "--------------------"; | |
printf("+%s+%s+\n", guiones, guiones); | |
printf("|%-20s|%-20s|\n", "PALABRA", "FRECUENCIA"); | |
printf("+%s+%s+\n", guiones, guiones); | |
// A partir de aquí el código sí importa; simplemente recorremos la pila | |
struct nodo *temporal = superior; | |
while (temporal != NULL) { | |
printf("|%-20s|%-20d|\n", temporal->detalleDePalabra.palabra, | |
temporal->detalleDePalabra.frecuencia); | |
temporal = temporal->siguiente; | |
} | |
// El pie | |
printf("+%s+%s+\n", guiones, guiones); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment