/* File: fraseit.c */
/* Scopo: utilizzo di stringhe, array di puntatori bidimensionali */

/* Il programma genera frasi del tipo ARTICOLO NOME VERBO ARTICOLO NOME
   utilizzando estrazioni di numeri casuali per gli indici degli array. */


#include <stdio.h>       /* per puts()                           */
#include <string.h>      /* per strcpy(), strcat() e strlen()    */
#include <ctype.h>       /* per toupper()                        */
#include <stdlib.h>      /* per srand() e rand()                 */
#include <time.h>        /* per time(NULL), argomento di srand() */

#define max 80
#define dim 4


void EstraiAggiungi(char frase[max], char *stringhe_dati[][dim],
                    int sesso);
/* Estrae la parola random tra le stringhe contenute nella riga indicata dal
   sesso [0/1] dell'array bidimensionale di puntatori a stringa e la aggiunge
   alla frase corrente.
   Infine accoda uno spazio alla stringa di output.
*/


int main(void)
{
  char *articolo[2][dim] ={{"il","un","qualche","ogni"},        /* maschili  */
                           {"la","una","nessuna","quella"}};    /* femminili */

  char *nome[2][dim] ={{"ragazzo","topo","gatto","piatto"},     /* maschili  */
                       {"ragazza","tazza","zebra","mucca"}};    /* femminili */

  char *verbo[2][dim] ={{"guardo`","mangio`","prese","spinse"}, /* maschili  */
                        {"guardo`","mangio`","prese","spinse"}};/* femminili */

  /* La prima riga e` uguale alla seconda riga per avere la possibilita` di
     passare lo stesso parametro, array bidimensionale di puntatori a
     caratteri, alla funzione EstraiAggiungi(...).  */

  int sex, giri;
  char *estratta;
  char frase[max];

  srand(time(NULL));    /* inizializza il generatore di numeri pseudocasuali */

  for (giri = 0; giri < 20; giri++) {
    frase[0] = '\0';                                      /* azzera la frase */
    sex = rand() % 2;                   /* estrae sesso: 0 = masc. 1 = femm. */

    EstraiAggiungi(frase, articolo, sex); /* estrae l'articolo e lo aggiunge al
                                             contenuto di frase */
    frase[0] = toupper(frase[0]);                 /* prima lettera maiuscola */

    EstraiAggiungi(frase, nome, sex);     /* estrae il nome e lo aggiunge al
                                             contenuo di frase */
    EstraiAggiungi(frase, verbo, sex);    /* estrae il verbo e lo aggiunge al
                                             contenuo di frase */

    sex = rand() % 2;         /* estrae sesso   0=masc. 1=femm. */

    EstraiAggiungi(frase, articolo, sex); /* estrae l'articolo e lo aggiunge al
                                             contenuto di frase */
    EstraiAggiungi(frase, nome, sex);     /* estrae il nome e lo aggiunge al
                                             contenuo di frase */
    frase[strlen(frase)-1] = '.'; /* mette il punto alla fine di frase:
                                     sovrascrive l'ultimo carattere che e` ' '
                                  */

    puts(frase);
  }

  return 0;
}


void EstraiAggiungi(char *frase, char *parola[2][dim], int sesso)
{
  strcat(frase, parola[sesso][rand() % dim]);
  strcat(frase, " ");              /* aggiunge uno spazio alla fine di frase */
}