poseiapoesia.c
Código
Poseía Poesía es un libro de poesía (o de posesiones pretéritas) generado con 9999 simuladas tiradas de dados, contestando de manera divertida a la famosa frase de Mallarmé. Contiene un precioso prólogo de Aída B. Márquez.
Un curioso experimento fue la utilización de un sintetizador para que leyese el texto que había generado la salida del programa para 999 tiradas de dado.
Atención a la función siestecita()
/*****************************************
poseiapoesia.c
Programa que escribe la cantidad de palabras
indicadas en la invocación al programa
que alternan azarosamente "poesía" y "poseía".
*****************************************/
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#define OK 1
#define KO 0
int poseiapoesia(int numero_de_palabras);
int dado();
int siestecita(long milisegundos);
int main(int argc, char *argv[])
{
setlocale(LC_CTYPE, ""); // Necesario para que funcionen las ñ
int numero_de_palabras;
char *loquesea;
if (argc != 2)
{
printf("\n\nUtilización: %s número natural\n\n", argv[0]);
return KO;
}
numero_de_palabras = strtol(argv[1], &loquesea, 10);
// Verificamos que lo introducido es un número natural
if ((loquesea == argv[1]) || (*loquesea != '\0') || (numero_de_palabras < 0)) {
printf ("|%s| No es un argumento válido\n", argv[1]); return KO;
}
if (poseiapoesia(numero_de_palabras) == OK) return OK;
} // main()
/*****************************************
poseiapoesia()
Función que escribe un "numero_de_palabras"
que alternan azarosamente "poesía" y "poseía".
Esta segunda aparece si en la "tirada del dado"
sale un 6. (1 poseía por cada 5 poesías)
*****************************************/
int poseiapoesia(int numero_de_palabras)
{
// Array de palabras poesía y poseía
char *palabra[] = { "poseía", "poesía" };
int i;
srand (time(NULL));
printf("¿poseía %d poesía?\n", numero_de_palabras);
for (i = 0; i < numero_de_palabras; i++)
{
siestecita(400);
printf("%s ", palabra[dado()]);
fflush(stdout);
};
printf("\n");
return OK;
}
/*****************************************
dado()
Función que tira un dado (de 1 a 6)
y considera un buen resultado cuando sale
un número del 1 al 5, devolviendo OK.
Devuelve KO si sale un 6.
*****************************************/
int dado() {
int tirada_de_dado;
tirada_de_dado = rand()%6 +1; // Obtenemos un número del 1 al 6
if (tirada_de_dado == 6) return KO;
return OK;
}
/*****************************************
siestecita()
Función que se echa una siestecita de milisegundos
*****************************************/
int siestecita(long milisegundos)
{
struct timespec ts;
if (milisegundos < 0) return KO;
ts.tv_sec = milisegundos / 1000;
ts.tv_nsec = (milisegundos % 1000) * 1000000;
do {
// ZZZZZZZZZZ
} while (nanosleep(&ts, &ts));
return OK;
}