Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Last active November 13, 2018 16:30
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/e838334f674a3817c8981dc5c6659747 to your computer and use it in GitHub Desktop.
Save parzibyte/e838334f674a3817c8981dc5c6659747 to your computer and use it in GitHub Desktop.
FrecuenciaDePalabrasEnC created by parzibyte - https://repl.it/@parzibyte/FrecuenciaDePalabrasEnC
/**
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