/**********************************************************************/
/* 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