Ciao alla fine avendo poco tempo a disposizione e non avendo capito bene le liste, ho deciso di cambiare metodo!
adesso vi posto qui sotto come ho fatto, e vorrei un'aiuto per sistemare meglio tutto il codice e per correggerlo nei punti in cui ho sbagliato o poco chiaro!
se provo a compilarlo mi esce fuori il risultato richiesto ma non so se scritto in questa maniera va bene...
poi ci sono alcune cose che vorrei modificare e vorrei un vostro parere;
ad esempio:
- definire in piu funzioni diverse;
- il problema di array di una lunghezza definita;
comunque ho scritto nei commenti in modo piu definito le cose che vorrei modificare e in che modo!
aspetto un vostro aiuto come sempre ciao e grazie
codice:
/********************************/
/* Dichiarazione delle librerie */
/********************************/
#include <stdio.h>
#include <stdlib.h>
/* definizione di un elemento della sottoformula*/
typedef struct elem_lista
{
int quant; /**/
char varq;
int neg;
char pred;
char varp;
} elem_lista_t;
/********************************/
/* Dichiarazione delle funzioni */
/********************************/
void stampa_messaggio_iniziale(void);
// definizione del main
int main(int argc, const char * argv[])
{
/* dichiarazione delle variabili locali alla funzione */
char carattere;
int esito;
char varleg[100];
char varlib[100];
int i = -1,
j = -1;
int quant; /* simbolo dell'argomento */
char varq;
int neg;
char pred;
char varp;
/* qui vorrei metterci un menu' che ripete queste due opzioni finche' non si e' scelta una
delle 2 e anche alla fine del punto 1) : 1) inserimento 2) uscita dal programma*/
/* stampa a video del messaggio iniziale del programma */
stampa_messaggio_iniziale();
/* questi comandi li devo mettere in una funzione a parte che inserisce le lettere e
verifica che siano corrette e finche non e' scritto in modo corretto lo fa riscrivere */
while((carattere = getchar()) != '\n')
{
if (carattere == '*' || carattere == '#')
{
esito = ((islower(carattere = getchar()))? 1: 0);
if (!esito)
printf("Dopo un quantificatore ci dev'essere una variabile...\n");
else
{
varq = carattere;
quant = 1;
}
}
else if (carattere == '^')
{
carattere = getchar();
neg = 1;
}
else if (isupper(carattere))
{
esito = ((islower(carattere = getchar()))? 1: 0);
pred = carattere;
if (!esito)
printf("Dopo un predicato ci dev'essere una variabile...\n");
else
{
varp = carattere;
}
}
else if (carattere >= '1' && carattere <= '4')
{
if (varq == varp)
varleg[++i] = varp;
else
varlib[++j] = varp;
}
if (!esito)
{
printf("E' necessario riscrivere la formula\n");
while(getchar() != '\n');
i = j = -1;
}
}
/* questi comandi qui sotto li devo racchiudere in una funzione*/
varleg[++i] = '\0';
varlib[++j] = '\0';
if (varq == varp)
varleg[++i] = varp;
else
varlib[++j] = varp;
printf("DEBUG: Le variabili legate sono: %s\n", varleg);
printf("DEBUG: i = %d, j = %d\n", i, j);
printf("DEBUG: Le variabili libere sono: %s\n", varlib);
// funzione per la verifica della formula
if (j == 0)
printf("la formula e' chiusa");
else
printf("la formula e' aperta");
return 0;
}
/* definizione della funzione di stampa a video del messaggio iniziale del programma */
void stampa_messaggio_iniziale(void)
{
/* viene stampato a video il messaggio iniziale del programma */
printf("\nInserire la formula di logica dei predicati.\n\n"
"==============================\n"
"# = esiste\n"
"* = per ogni\n"
"0 = operatore NOT (¬)\n"
"1 = operatore AND (^)\n"
"2 = operatore OR (v)\n"
"3 = operatore IMPLICAZIONE (->)\n"
"4 = operatore DOPPIA IMPLICAZIONE (<->)\n"
"==============================\n\n"
"Ogni sottoformula deve contenere un solo simbolo di predicato\n"
"Ogni sottoformula deve contenere un solo simbolo di quantificatore\n"
"Ogni sottoformula deve contenere una sola variabile associata al predicato e una sola variabile al quantificatore\n"
"Il simbolo di predicato dev'essere una lettera maiuscola.\n"
"Le variabili devono essere una lettera minuscola\n\n"
"Esempi di sintassi correttamente acquisibili dal programma:\n\n"
"... ");
}