Limericks. Uma limerick é um poema humorístico de cinco linhas, em que a primeira e a segunda linhas rimam com a quinta, e a terceira linha rima com a quarta. Usando técnicas semelhantes àquelas desenvolvidas no Exercício 8.11, escreva um programa que produza limericks aleatórias.

Modificar esse programa para produzir boas limericks é desafiador, mas o resultado é compensador!

Passo 1

Vamos escrever um programa que irá gerar limericks, usando técnicas semelhantes às desenvolvidas no exercício anterior.

Este programa não criará boas rimas, mas serão aleatórias e com a estrutura certa.

Passo 2

Primeiro, vamos incluir todas as bibliotecas necessárias e vamos definir os arrays de const char* (strings) que vão armazenar todas as palavras que serão usadas para gerar os limericks.

Na matriz de substantivos, dividiremos as strings em grupos, para que as palavras do mesmo grupo rimem entre si.

Eu escolhi essas palavras aleatoriamente. Se você quer que seu programa produza melhores rimas, sugiro que você escolha as palavras que fariam sentido na mesma frase e as agrupe de forma diferente. Além disso, você pode adicionar mais palavras, para que elas se repitam menos.

#include "time.h"

#include "stdio.h"

#include "string.h"

#include "stdlib.h"

#include "ctype.h"

int main()

{

const char* artigo[] = { "o", "um", "um", "algum", "qualquer",

"meu", "dele", "nosso", "seu", "ela", "deles" };

const char* substantivo[4][5] = {

{"cachorro", "sapo", "log", "porco", "cachorro-quente"},

{"estrela", "carro", "cigarra", "charuto", "guitarra"},

{"luz", "noite", "cavaleiro", "luta", "voo"},

{"gato", "morcego", "rato", "tapete", "chapéu"} };

const char* verb[] = { "dirigiu", "pulou", "correu", "andou", "saltou",

"observou", "chorou", "gritou", "retornou", "falou" };

const char* preposition[] = { "para", "de", "sobre", "sob", "on", "acima",

"depois", "abaixo", "dentro", "até", "antes", "através" };

Em seguida, na função main(), chamaremos a função srand() e declararemos duas variáveis int para armazenar um valor aleatório entre 0 e 4. Essas variáveis armazenarão valores diferentes.

Usaremos os valores dessas duas variáveis para escolher os substantivos de um determinado grupo, de modo que a primeira, segunda e quinta linhas rimem, assim como a terceira e a quarta.

srand(time(NULL));

int index1 = rand() % 4;

int index2;

do {

index2 = rand() % 4;

} while (index2 == index1);

Passo 3

Finalmente, na função main(), chamaremos a instrução printf() 5 vezes.

Dependendo de qual linha está sendo gerada e impressa, chamaremos a função shortLines() ou longLines(). Passaremos todos os arrays e uma das variáveis de índice para essas funções.

printf("%s\n", linhas mais longas(índice1, artigo, substantivo, verb, preposição));

printf("%s\n", linhas mais longas(índice1, artigo, substantivo, verb, preposição));

printf("%s\n", shortLines(índice2, artigo, substantivo, verb, preposição));

printf("%s\n", shortLines(índice2, artigo, substantivo, verb, preposição));

printf("%s\n", linhas mais longas(índice1, artigo, substantivo, verb, preposição));

}

A função shortLines()

Usaremos esta função para gerar a terceira e a quarta linha.

Essas linhas serão mais curtas e rimarão entre si. Para garantir que eles rimem, usamos o primeiro argumento ao escolher entre grupos de substantivos.

Se a linha for muito longa, geraremos outra linha.

char* shortLines(int n, const char** artigo, const char* substantivo[][5],

const char** verbo, const char** preposição)

{

char* str;

do {

str = new char[50];

strcpy(str, artigo[rand() % 11]);

strcat(str, " ");

str[0] = touper(str[0]);

strcat(str, substantivo[rand() % 4][rand() % 5]);

strcat(str, " ");

strcat(str, verb[rand() % 10]);

strcat(str, " ");

strcat(str, preposition[rand() % 12]);

strcat(str, " ");

strcat(str, artigo[rand() % 11]);

strcat(str, " ");

strcat(str, substantivo[n][rand() % 5]);

strcat(str, ".");

} while (strlen(str) > 28);

return str;

}

A função maisLinhas()

Esta função será usada para gerar as duas primeiras e a última linha, que irão rimar uma com a outra. Para garantir isso, usamos o valor do primeiro argumento ao escolher aleatoriamente um substantivo.

Se a linha gerada for muito curta, uma nova linha será gerada.

char* longLines(int n, const char** artigo, const char* substantivo[][5],

const char** verb, const char** preposição)

{

char* str;

do {

str = new char[50];

strcpy(str, artigo[rand() % 11]);

strcat(str, " ");

str[0] = touper(str[0]);

strcat(str, substantivo[rand() % 4][rand() % 5]);

strcat(str, " ");

strcat(str, verb[rand() % 10]);

strcat(str, " ");

strcat(str, preposition[rand() % 12]);

strcat(str, " ");

strcat(str, artigo[rand() % 11]);

strcat(str, " ");

strcat(str, substantivo[n][rand() % 5]);

strcat(str, ".");

} while (strlen(str)

return str;

}

Resposta

Ver todo desenvolvimento!