Ausbau des Integral Übungssystems

Mögliche Gammatiken, die letzte ist richtig

(C) David Vajda
2024-12-22
Grammar Expressions for Integration Excersize

expr ::= term
term ::= fact | fact + term
fact ::= smpl | (expr) | (expr) * fact

expr ::= term | expr + simpleterm
term ::= factor
fact ::= simpleterm | (expr) | (expr) * fact
simpleterm ::= simple


expr ::= term | simpleexpr
simpleexpr ::= simpleexpr + simpleterm
term ::= factor
fact ::= simpleterm | (expr) | (expr) * fact
simpleterm ::= simple


expr ::= term | simpleexpr
simpleexpr ::= simpleexpr + simple
term ::= fact
fact ::= simple | (expr) | (expr) * fact

expr ::= term | simpleexpr
simpleexpr ::= simple + simpleexpr
term ::= fact
fact ::= simple | (expr) | (expr) * fact


expr ::= term | simpleexpr
simpleexpr ::= simple + simpleexpr
term ::= fact
fact ::= simple | (expr) | (expr) * notsimpleexpr
notsimpleexpr ::= (expr) | (expr) * notsimpleexpr

expr ::= term | simpleexpr
simpleexpr ::= simple + simpleexpr
term ::= fact
fact ::= simple | (expr) | (expr) * notsimplefact
notsimpleexpr ::= (expr) | (expr) * notsimplefact


fact ::=    (expr) * simple |
            simple * (expr) |
            (expr) * (expr)

fact ::=    simple |
            (expr) * simple |
            simple * (expr) |
            (expr) * (expr)

expr ::=    term | term + expr
term ::=    fact
fact ::=    simple |
            (expr) * simple |
            simple * (expr) |
            (expr) * (expr)


expr    ::=     term | term + expr
expr2   ::=     term + expr
term    ::=     fact
fact    ::=     simple |
                (expr2) * simple |
                simple * (expr2) |
                (expr2) * (expr2)

Das ist die richtige


expr    ::=     term | term + expr
expr2   ::=     term + expr
term    ::=     fact
fact    ::=     simple |
                (expr2) * simple |
                simple * (expr2) |
                (expr2) * (expr2)

C-Code


#include <stdio.h>
#include <time.h>
#include <stdlib.h>

/*
expr    ::=     term | term + expr
expr2   ::=     term + expr
term    ::=     fact
fact    ::=     simple |
                (expr2) * simple |
                simple * (expr2) |
                (expr2) * (expr2)

*/

void expr (void);
void expr2 (void);
void term (void);
void fact (void);
void simple (void);

int main  (void) {
    time_t t;
    struct tm tm = *localtime(&(time_t){time(NULL)});


    printf ("(C) David Vajda\n");
    printf ("%s", asctime(&tm));
    printf ("Uebungen fuer Integralrechnung und Extrema\n\n");

    srand ((unsigned)time (&t));
    expr ();
    printf ("\n");
return 0;
}

void expr (void) {
        term ();
        if ((rand () % 2) == 1) {
            printf (" + ");
            expr ();
        }
return;
}

void expr2 (void) {
        term ();
        printf (" + ");
        expr ();
return;
}


void term (void) {
        fact ();
return;
}

int count = 0;

void fact (void) {
    int r = rand () % 4;

    count++;
    if ((r == 0) | (count > 3))
        simple ();
    else if (r == 1) {
        printf ("(");
        expr2 ();
        printf (") * ");
        simple ();
    }
    else if (r == 2) {
        simple ();
        printf (" * (");
        expr2 ();
        printf (")");
    }
    else if (r == 3) {
        printf ("(");
        expr2 ();
        printf (") * (");
        expr2 ();
        printf (")");
    }
return;
}

void simple (void) {
    printf ("%i*x^%i", 1+rand() % 8, rand () % 8);
}

Erzeugt:


(C) David Vajda
Sun Dec 22 19:38:48 2024
Uebungen fuer Integralrechnung und Extrema

((3*x^7 + 7*x^4) * 7*x^3 + 5*x^7) * (5*x^5 + 1*x^3)
(C) David Vajda
Sun Dec 22 19:46:00 2024
Uebungen fuer Integralrechnung und Extrema

3*x^0* (8*x^2* (3*x^0 + 8*x^0 + 7*x^1 + 1*x^1) + 1*x^1 + 2*x^6 + 1*x^2 + 8*x^2 + 7*x^0 + 7*x^5 + 6*x^4) + 2*x^6
(C) David Vajda
Sun Dec 22 19:50:18 2024
Uebungen fuer Integralrechnung und Extrema

3*x^2 * (2*x^3 * (4*x^0 + 7*x^2) + 5*x^7)