/**********************************************************************/
/* programma che calcola unione e differenza tra due linguaggi finiti */
/**********************************************************************/
/*****************************/
/* inclusione delle librerie */
/*****************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*****************************************/
/* definizioni delle costanti simboliche */
/*****************************************/
#define SIMBOLI 6
/********************************/
/* dichiarazione delle funzioni */
/********************************/
void richiedi_allocazione_linguaggio(int  esito_lettura,
                                     int *num_sequenze,
                                     int *lunghezza_max_sequenza);
void inserisci_sequenze(int   lunghezza_max_sequenza,
                        int   num_sequenze,
                        int   cont,
                        int   copia_cont,
                        int   i,
                        int   j,
                        int   esito_lettura,
                        int   continua,
                        char *sequenza);
void modifica_allocazione(int  esito_lettura,
                          int *continua);
/******************************/
/* definizione delle funzioni */
/******************************/
/* definizione della funzione main */
int main(void)
{
    /* dichiarazione delle variabili locali alla funzione */
    char   alfabeto[SIMBOLI] = {"aeiou"},      /* input: alfabeto di simboli da tenere in considerazione */
         **linguaggio_1,                       /* input: primo linguaggio finito di simboli finiti */
         **linguaggio_2,                       /* input: secondo linguaggio finito di simboli finiti */
          *sequenza;                           /* lavoro: contenitore della sequenza finita prima delle validazioni */ 
    int    num_sequenze,                       /* lavoro: numero di sequenze che l'utente vorrà inserire */
           lunghezza_max_sequenza,             /* lavoro: lunghezza di simboli che una sequenza può contenere */
           sequenza_trovata,                   /* lavoro: parametro per la validazione della sequenza */
           esito_lettura = 0,                  /* lavoro: parametro per la validazione degli input */
           cont = 1,                           /* lavoro: contatore */
           copia_cont,                         /* lavoro: copia della variabile cont */
           continua,                           /* lavoro: indice di proseguimento*/
           i,                                  /* lavoro: indice di scorrimento dell'array */
           copia_i,                            /* lavoro: copia della variabile i */
           j;                                  /* lavoro: indice di scorrimento dell'array */
    
    /*stampa dell'alfabeto utilizzabile per la creazione dei linguaggi */
    printf("Utilizza l'alfabeto {%s} per la creazione di 2 linguaggi.\n",
           alfabeto);
    /* richiesta all'utente dei dati per l'allocazione del linguaggio */
    richiedi_allocazione_linguaggio( esito_lettura,
                                    &num_sequenze,
                                    &lunghezza_max_sequenza);
    /* allocazione dinamica delle stringhe */
    linguaggio_1 = (char **)calloc(num_sequenze,
                                   sizeof(char*));
    for (i = 0;
         (i < num_sequenze); 
         i++)
        linguaggio_1[i] = (char *)calloc(lunghezza_max_sequenza, 
                                         sizeof(char));
    /* inserimento e validazione sull'alfabeto delle sequenze all'interno del linguaggio */
    
    if (num_sequenze > 0)
        printf("Crea il primo linguaggio!\n");
    sequenza = (char *)calloc(lunghezza_max_sequenza,
                              sizeof(char));
    i = 0;
    do
    {
        for (copia_cont = cont;
             (i < num_sequenze);
             i++)
        {
            do
            {
                /* inserimento delle sequenze con opportune validazioni */
                
                inserisci_sequenze(lunghezza_max_sequenza,
                                   num_sequenze,
                                   cont,
                                   copia_cont,
                                   i,
                                   j,
                                   esito_lettura,
                                   continua,
                                   sequenza);    
            
                /* validazione della sequenza di simboli all'interno dell'insieme e se valida viene memorizzata */
        
                for (j = 0, sequenza_trovata = 1;
                     (j <= i && sequenza_trovata != 0);
                     j++)
                {
                    sequenza_trovata = strcmp(sequenza, linguaggio_1[j]);
                    if (sequenza_trovata == 0)
                    {
                        printf("Sequenza di simboli gia' memorizzata all'interno del linguaggio!");
                        printf(" Un insieme non puo' contenere 2 simboli uguali.\n");
                    }
                }
            }
            while (sequenza_trovata == 0);
            if (sequenza_trovata != 0)
            {
                strcpy(linguaggio_1[i], sequenza);
                cont++;
            }
        }
        /* richiesta all'utente per una modifica dell'allocazione */
        modifica_allocazione( esito_lettura,
                             &continua);
        if (continua == 1)
        {
            /* richiesta all'utente dei dati per l'allocazione del linguaggio */
            
            richiedi_allocazione_linguaggio( esito_lettura,
                                            &num_sequenze,
                                            &lunghezza_max_sequenza);
            linguaggio_1 = (char **)realloc(linguaggio_1,
                                            num_sequenze * sizeof(char *));
            for (copia_i = 0;
                 (copia_i < num_sequenze); 
                 copia_i++)
                linguaggio_1[copia_i] = (char *)realloc(linguaggio_1,
                                                        lunghezza_max_sequenza * sizeof(char));
            sequenza = (char *)realloc(sequenza,
                                       lunghezza_max_sequenza * sizeof(char)); 
        }
    }
    while (continua == 1);
void richiedi_allocazione_linguaggio(int  esito_lettura,
                                     int *num_sequenze,
                                     int *lunghezza_max_sequenza)
{
    /* richiesta all'utente delle dimensioni dei linguaggi */
    do
    {
        printf("Quante sequenze finite di simboli, presi dall'alfabeto, ");
        printf("vuoi memorizzare all'interno del linguaggio? (>=0)  ");
        esito_lettura = scanf("%d",
                              num_sequenze);
        if (esito_lettura != 1 || *num_sequenze < 0)
            printf("Valore non accettabile!\n");
        while (getchar() != '\n');
    }
    while (esito_lettura != 1 || *num_sequenze < 0);
    if (*num_sequenze == 0)
        *lunghezza_max_sequenza = 0;
    else
    {
        do
        {
            printf("Quale sara' la lunghezza massima della sequenza (>0)  ");
            esito_lettura = scanf("%d",
                                  lunghezza_max_sequenza);
            if (esito_lettura != 1 || *lunghezza_max_sequenza <= 0)
                printf("Valore non accettabile!\n");
            while (getchar() != '\n');
        }
        while (esito_lettura != 1 || *lunghezza_max_sequenza <= 0);
    }
}
/* definizione della funzione per inserire nuove sequenze con opportune validazioni */
void inserisci_sequenze(int   lunghezza_max_sequenza,
                        int   num_sequenze,
                        int   cont,
                        int   copia_cont,
                        int   i,
                        int   j,
                        int   esito_lettura,
                        int   continua,
                        char *sequenza)
{
    /*richiesta sequenza e validazioni */
    do
    {
        printf("\nInserisci la sequenza %d rispettando la lunghezza scelta:   ",
               cont);
        scanf("%ms",
              &sequenza);
        esito_lettura = strlen(sequenza);
        for (j = 0, continua = 0;
             (esito_lettura <= lunghezza_max_sequenza && sequenza[j] != '\0');
             j++)
        {
            if (sequenza[j] == 'a' || sequenza[j] == 'e' || sequenza[j] == 'i' || sequenza[j] == 'o' || sequenza[j] == 'u')
                continua = 1;
            else
            {
                continua = 0;
                printf("Sequenza di simboli non valida, riprova!");
            }
        }
    }
    while (continua == 0);
}
/* definizione della funzione per eventuale modifica dell'allocazione*/
void modifica_allocazione(int  esito_lettura,
                          int *continua)
{
    do
    {
        printf("Vuoi memorizzare altre sequenze di simboli all'interno del linguaggio? (1 = si, 0 = no)  ");
        esito_lettura = scanf("%d",
                              continua);
        if (esito_lettura != 1 || *continua < 0 || *continua > 1)
            printf("Valore non accettabile!");
        while (getchar() != '\n');
    }
    while (esito_lettura != 1 || *continua < 0 || *continua > 1);
}
questo è l'intero programma, poi il codice viene ripetuto perche creo due linguaggi. Quindi il tutto poi sarà chiuso tra 2 funzioni che inglobano il tutto. ad esempio crea_linguaggio_1 e poi ..._2. spero di venirne a capo. il programma se scritto uguale all'interno della main funziona, è gia stato testato...ma per rendere il codice piu comprensibile è meglio dividerlo in funzioni, cosa che pero non sono riuscito a fare dato che la sequenza scritta nella funzione inserisci sequenza non torna nel chiamante con il valore che invece ho attribuito all'interno della funzione