Progetto C Programmazione Università

di il
41 risposte

41 Risposte - Pagina 2

  • Re: Progetto C Programmazione Università

    Non ho copiato nessun codice ho il mio già fatto, a me manca solo la parte del'equivalenza che sto cercando di buttare giù da sola ma non so se è giusta quindi chiedevo qualche dritta perché è difficile calcolare (non ricorsivamente) tutte le possibilità e le tabelle di verità.
    Tutto qui!
  • Re: Progetto C Programmazione Università

    vbextreme ha scritto:


    stanotte se non mi addormento vi faccio un regalo....
    Mi ritrovo un sorgente pronto con tanto di relazione sotto l'albero?
  • Re: Progetto C Programmazione Università

    Non ho copiato nessun codice ho il mio già fatto
    e perchè non aiuti i bisognosi?
    posta sto codice....
  • Re: Progetto C Programmazione Università

    Si ma poi se da come ho capito abbiamo lo stesso prof sono cavoli nostri...
  • Re: Progetto C Programmazione Università

    Dato che i mezzi a disposizione sono limitati,ovvero da quel che ho capito non si possono usare le liste ma solamente i vettori,il codice diventa un pelo lungo e leggermente piu complesso.
    Ho volontariamente usato caratteri per i connettivi (!&|>-) al posto dei numeri solo per darvi un pò di lavoro anche a voi.
    Ho cercato anche di non comprimere troppo il codice e non l'ho ottimizzato,questo per aiutarvi nel comprenderlo e nel modificarlo.
    Ecco la pappa
    
    ///LOGICA PROPOSIZIONALE CALCULATOR
    /// Grammatica elementare:
    /// word                : "abcdefghijklmnopqrstuvwxyz"
    /// operator:
    /// negazione           : "!" : operator word
    /// congiunzione        : "&" : word operatoror word
    /// disgiunzione        : "|" : word operatorand word
    /// implicazione        : ">" : word operatorand word
    /// doppiaimplicazione  : "-" : word operatorand word
    
    /// precedenza  : negazione,congiunzione,disgiunzione,implicazione,doppiaimplicazione
    
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define INPUT_MAX 100
    #define CONNETTIVI_MAX 3
    #define PROPOSIZIONI_MAX 4
    
    #define SYNTAX_PROPOSIZIONE 0
    #define SYNTAX_CONNETTIVO 1
    
    #define SYNTAX_ERR_LASTCHAR      -99
    #define SYNTAX_ERR_MAXPROPOSIZIONE -100
    #define SYNTAX_ERR_MAXCONNETTIVO   -101
    
    typedef enum {ERR = -1 , F , V} PROPOSIZIONE;
    typedef enum {NONCONNETTIVO,NEGAZIONE,CONGIUNZIONE,DISGIUNZIONE,IMPLICAZIONE,DOPPIAIMPLICAZIONE,COUNTCONNETTIVO} CONNETTIVO;
    
    ///SUPPORT
    
    int isword(char c)
    {
        if ( (c >= 'a' && c <= 'z') )
            return 1;
        return 0;
    }
    
    CONNETTIVO ctocon(char c)
    {
        switch (c)
        {
            case '!':
                return NEGAZIONE;
            case '&':
                return CONGIUNZIONE;
            case '|':
                return DISGIUNZIONE;
            case '>':
                return IMPLICAZIONE;
            case '-':
                return DOPPIAIMPLICAZIONE;
        }
        return NONCONNETTIVO;
    }
    
    int isoperator(char c)
    {
        switch (c)
        {
            case '!':case '&':case '|':case '>':case '-':return 1;
        }
        return 0;
    }
    
    PROPOSIZIONE eval(PROPOSIZIONE lval,CONNETTIVO op,PROPOSIZIONE rval)
    {
        switch (op)
        {
            case NEGAZIONE:
                return !rval;
            case CONGIUNZIONE:
                return lval && rval;
            case DISGIUNZIONE:
                return lval || rval;
            case IMPLICAZIONE:
                return (lval && !rval) ? 0 : 1;
            case DOPPIAIMPLICAZIONE:
                return ( (lval && rval) || (!lval && !rval)) ? 1 : 0;
        }
        return -1;
    }
    
    void proset(PROPOSIZIONE* p,unsigned char lowbyte)
    {
        int i;
        for (i = 0 ; i < 4 ; i++ , lowbyte >>= 1)
            p[i] = lowbyte & 0x001;
    }
    
    void prorem(PROPOSIZIONE* s,PROPOSIZIONE* c)
    {
        int nc = PROPOSIZIONI_MAX - (c-s);
        for ( ; nc > 0 ; nc-- , c++)
            *c = *(c+1);
    }
    
    void conrem(CONNETTIVO* s,CONNETTIVO* c)
    {
        int nc = CONNETTIVI_MAX - (c-s);
        for ( ; nc > 0 ; nc-- , c++)
            *c = *(c+1);
    }
    
    PROPOSIZIONE equieval(PROPOSIZIONE* p1,int* np1,CONNETTIVO* c1,int* nc1,PROPOSIZIONE* p2,int* np2,CONNETTIVO* c2,int* nc2)
    {
        PROPOSIZIONE parser(PROPOSIZIONE*,int*,CONNETTIVO*,int*);
    
        CONNETTIVO mem1[CONNETTIVI_MAX];
                   memcpy(mem1,c1,sizeof(CONNETTIVO) * CONNETTIVI_MAX);
        int memnp1 = *np1;
        int memnc1 = *nc1;
    
        CONNETTIVO mem2[CONNETTIVI_MAX];
                   memcpy(mem2,c2,sizeof(CONNETTIVO) * CONNETTIVI_MAX);
        int memnp2 = *np2;
        int memnc2 = *nc2;
    
        int easy = 0;
        PROPOSIZIONE a,b;
    
        for ( easy = 0 ; easy < 0x100 ; easy++ )
        {
            proset(p1,(unsigned char)easy);
            proset(p2,(unsigned char)easy >> 4);
            memcpy( c1 , mem1 , sizeof(CONNETTIVO) * CONNETTIVI_MAX);
            memcpy( c2 , mem2 , sizeof(CONNETTIVO) * CONNETTIVI_MAX);
            *np1 = memnp1;
            *nc1 = memnc1;
            *np2 = memnp2;
            *nc2 = memnc2;
            a = parser(p1,np1,c1,nc1);
            b = parser(p2,np2,c2,nc2);
            if ( a == ERR || b == ERR ) return ERR;
            if ( a != b) return F;
        }
    
        return V;
    }
    
    ///END SUPPORT
    
    
    ///SYNTAX
    
    int syntax(PROPOSIZIONE* p,int* np,CONNETTIVO* c,int* nc,const char* buffer)
    {
        *np = 0;
        *nc = 0;
    
        const char* st = buffer;
    
        while (*buffer && *buffer == ' ') ++buffer;
    
        int step = (isword(*buffer)) ? SYNTAX_PROPOSIZIONE : SYNTAX_CONNETTIVO;
    
        for ( ; *buffer ; buffer++)
        {
            if (*buffer == ' ') continue;
    
            if (step == SYNTAX_PROPOSIZIONE)
            {
                step = SYNTAX_CONNETTIVO;
                if ( !isword(*buffer) )
                {
                    if (*buffer != '!')
                        return (buffer - st) + 1;
                }
                else
                {
                    if ( (*np)++ == PROPOSIZIONI_MAX) return SYNTAX_ERR_MAXPROPOSIZIONE;
                    *p++ = 0;
                    continue;
                }
            }
    
            if ( step == SYNTAX_CONNETTIVO)
            {
                if ( (*nc)++ == CONNETTIVI_MAX) return SYNTAX_ERR_MAXCONNETTIVO;
                if ( (*c = ctocon(*buffer)) == NONCONNETTIVO )
                    return (buffer - st) + 1;
                ++c;
                step = SYNTAX_PROPOSIZIONE;
            }
        }
    
        if (step == SYNTAX_PROPOSIZIONE) return SYNTAX_ERR_LASTCHAR;
    
        return 0;
    }
    
    ///END SYNTAX
    
    
    ///PARSER
    
    
    int parser_single(PROPOSIZIONE* p,CONNETTIVO* c,int* nc,CONNETTIVO op)
    {
        CONNETTIVO* stc = c;
    
        int ic;
        int ex = 0;
        for (ic = 0; ic < *nc ; ic++)
        {
            if (*c == op)
            {
                *p = eval(F,op,*p);
                if (*p == -1 ) return -1;
    
                conrem(stc,c);
                ++ex;
            }
            else
            {
                ++c;
                ++p;
            }
        }
        return 0;
    }
    
    int parser_double(PROPOSIZIONE* p,int* np,CONNETTIVO* c,int* nc,CONNETTIVO op)
    {
        PROPOSIZIONE* stp = p;
        CONNETTIVO* stc = c;
    
        int ic;
        int ex = 0;
        for (ic = 0 ; ic < *nc ; ic++)
        {
            if (*c == op)
            {
                *p = eval(*p,op,*(p+1));
                if (*p == -1 ) return -1;
    
                prorem(stp,p+1);
                --*np;
                conrem(stc,c);
                ++ex;
            }
            else
            {
                ++c;
                ++p;
            }
        }
    
        *nc -= ex;
        return 0;
    }
    
    PROPOSIZIONE parser(PROPOSIZIONE* p,int* np,CONNETTIVO* c,int* nc)
    {
        if ( parser_single(p,c,nc,NEGAZIONE) ) return ERR;
        if ( parser_double(p,np,c,nc,CONGIUNZIONE) ) return ERR;
        if ( parser_double(p,np,c,nc,DISGIUNZIONE) ) return ERR;
        if ( parser_double(p,np,c,nc,IMPLICAZIONE) ) return ERR;
        if ( parser_double(p,np,c,nc,DOPPIAIMPLICAZIONE) ) return ERR;
        return *p;
    }
    
    
    ///END PARSER
    
    
    
    
    int main ()
    {
        //Formula A
    
        char f1[INPUT_MAX];
        PROPOSIZIONE p1[PROPOSIZIONI_MAX];
        CONNETTIVO c1[CONNETTIVI_MAX];
        int np1,nc1;
    
        printf("Insert formula A:");
        gets(f1);
    
        printf("Syntax...");
        int erc = syntax(p1,&np1,c1,&nc1,f1);
        switch (erc)
        {
            case 0:
                printf("ok\n");
            break;
    
            case SYNTAX_ERR_LASTCHAR:
                printf("errore ultimo carattere deve essere proposizione\n");
            return erc;
    
            case SYNTAX_ERR_MAXCONNETTIVO:
                printf("errore inseriti troppi connettivi\n");
            return erc;
    
            case SYNTAX_ERR_MAXPROPOSIZIONE:
                printf("errore inseriti troppe proposizioni\n");
            return erc;
    
            default:
                printf("carattere non valido(%d) :%c\n",erc,f1[erc-1]);
            return -1;
        }
    
        //Formula B
    
        char f2[INPUT_MAX];
        PROPOSIZIONE p2[PROPOSIZIONI_MAX];
        CONNETTIVO c2[CONNETTIVI_MAX];
        int np2,nc2;
        printf("Insert formula B:");
        gets(f2);
    
        printf("Syntax...");
        erc = syntax(p2,&np2,c2,&nc2,f2);
        switch (erc)
        {
            case 0:
                printf("ok\n");
            break;
    
            case SYNTAX_ERR_LASTCHAR:
                printf("errore ultimo carattere deve essere proposizione\n");
            return erc;
    
            case SYNTAX_ERR_MAXCONNETTIVO:
                printf("errore inseriti troppi connettivi\n");
            return erc;
    
            case SYNTAX_ERR_MAXPROPOSIZIONE:
                printf("errore inseriti troppe proposizioni\n");
            return erc;
    
            default:
                printf("carattere non valido(%d) :%c\n",erc,f2[erc-1]);
            return -1;
        }
    
        printf("Le formule ");
        PROPOSIZIONE ret = equieval(p1,&np1,c1,&nc1,p2,&np2,c2,&nc2);
        switch (ret)
        {
            case ERR:
                printf("errate secondo il parser\n");
            return -1;
            case V:
                printf("sono equivalenti\n");
            break;
            case F:
                printf("non sono equivalenti\n");
            break;
        }
    
    
        return 0;
    }
    
    Sembra funzionare,almeno teoricamente,poi vedete voi se saltano fuori piccoli bug correggeteli o ditemelo.
    Spero almeno vi sia di aiuto per capire il concetto.
    Il problema fondamentale rimane l'uso esclusivo dei vettori.
  • Re: Progetto C Programmazione Università

    A me non sembra che abbiamo studiato come creare una sintax quindi non so se andrebbe bene...comunque grazie lo stesso
  • Re: Progetto C Programmazione Università

    Cos'è che non comprendi della funzione syntax?
    sai cosa sono i puntatori?
  • Re: Progetto C Programmazione Università

    X quanto mi riguarda sono al 1° anno diciamo 1° semestre del primo anno e quindi non ho mai studiato come creare una sintaxt x questo ho detto k può esse non lo accetta ma non ne sono sicuro... I puntatori si li abbiamo studiati
  • Re: Progetto C Programmazione Università

    Beh intanto io ti ringrazio; ho tradotto il programma in versione RPN, adesso devo solo creare il parser per leggere l'espressione in inversa con tanto di stack e dovrei essere a posto.
  • Re: Progetto C Programmazione Università

    X quanto mi riguarda sono al 1° anno diciamo 1° semestre del primo anno e quindi non ho mai studiato come creare una sintaxt x questo ho detto k può esse non lo accetta ma non ne sono sicuro... I puntatori si li abbiamo studiati
    La frase che hai detto è priva di senso.
    Se conosci i puntatori allora è plausibili che tu sappia implementare una funzione syntax,che per tua informazione la puoi chiamare come vuoi.Non fa altro che controllare l'input utente,ovvero che non superi i limiti imposti e che non ci siano errori grammaticali.
    è d'obbligo una funzione simile alla syntax per controllare le forumule prima di essere analizzate,nel mio caso eseguo una trasformazione durante il syntax ma poteva essere benissimo fatto dopo.La trasformazione non fa altro che contare quanti dati ci sono e settare azero il relativo vettore e inserire nell'altro vettore le operazioni da svolgere una dopo l'altra.Ottenendo cosi una notazione polacca su beffer separati.
    Beh intanto io ti ringrazio; ho tradotto il programma in versione RPN, adesso devo solo creare il parser per leggere l'espressione in inversa con tanto di stack e dovrei essere a posto.
    Non so se ti sei accorto ma il codice usa due buffer,uno per i valori e uno per gli operatori,syntax oltre che a validare la formula la trasforma in notazione polacca suddivisa in due buffer distinti,uno per i valori e uno per gli operatori.
    Uso due buffer distinti per semplificare tutto il lavoro(e per essere compreso meglio),se vuoi puoi unirli.
    In bocca al lupo con lo stack
  • Re: Progetto C Programmazione Università

    Non so neanche cosa sia una notazione polacca...
  • Re: Progetto C Programmazione Università

  • Re: Progetto C Programmazione Università

    Intendevo che non l abbiamo studiata quindi forse non si poteva usare
  • Re: Progetto C Programmazione Università

    Juanito
    hai presente cosa siano almeno i motori di ricerca?
  • Re: Progetto C Programmazione Università

    Tu non sapevi che era la notazione polacca...non l'hai studiata...perciò non l'hai usata hai semplicemente separato i dati dagli operatori
Devi accedere o registrarti per scrivere nel forum
41 risposte