/media/sda-magnetic/david/Dokumente-16-2024-08-01/informatikUmathematik/excerpt20240906before/progs2sources20240801/fsmprogs/automat11.c


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



#define MAX_SPECIAL_STATES      3
#define MAX_STATES              4
#define MIN_STATE               1
#define SPECIAL_STATE_1         1
#define SPECIAL_STATE_2         2
#define SPECIAL_STATE_3         3
#define MAX_INPUTS              2
#define MAX_OUTPUTS             2
#define TRUE                    1
#define FALSE                   0
#define Z_A                     0
#define Z_B                     1


void readcsv (int a [], int b [], int y [MAX_OUTPUTS][MAX_STATES]) {
    int i;
    int j;
    int i1, i2;
    int x1, x2;
    scanf ("Zustand,Eingabe,Ausgabe,Folgezustand\n");

    for (i = 0;  i < (MAX_STATES*MAX_OUTPUTS) ;  ) {
        scanf ("%i,%i,%i,%i\n", &i1, &x1, &y [Z_A][i/2], &a [i]);
        i++;
        scanf ("%i,%i,%i,%i\n", &i2, &x2, &y [Z_B][i/2], &b [i]);
        i++;


/*
        if (x1 != Z_A) {
            printf ("Error - I/O\n");
            exit (1);
        }
        if (x2 != Z_B) {
            printf ("Error - I/O\n");
            exit (1);
        }
        if (i1 != (i+1)) {
            printf ("Error - I/O\n");
            exit (1);
        }
        if (i2 != (i+1)) {
            printf ("Error - I/O\n");
            exit (1);
        }*/
    }

return;
}


void printcsv (int a [], int b [], int y [MAX_OUTPUTS][MAX_STATES]) {
    int i;
    printf ("Zustand,Eingabe,Ausgabe,Folgezustand\n");

    for (i = 0;  i < (MAX_STATES);  i++) {
        printf ("%i,%i,%i,%i\n", i+MIN_STATE, Z_A, y [Z_A][i], a [i]);
        printf ("%i,%i,%i,%i\n", i+MIN_STATE, Z_B, y [Z_B][i], b [i]);
    }

return;
}



void createnew (int a [], int b [], int y [MAX_OUTPUTS][MAX_STATES]) {
#define RAND_1      32
#define RAND_2      16
#define RAND_3      16
#define RAND_4      8


    time_t t;
    int i, j;
    int z [MAX_STATES][MAX_OUTPUTS];
    int flag;

    srand ((unsigned)time (&t));


    for (i = 0;  i < MAX_STATES;  i++) {
        z [i][Z_A] = i + MIN_STATE;
        z [i][Z_B] = i + MIN_STATE;
    }
    flag = 0;
    while (!flag) {
        for (i = 0;  i < MAX_STATES;  i++) {
            for (j = i + 1;  j < MAX_STATES;  j++) {
                if ((rand () % RAND_1) > RAND_2) {
                    t = z [j][Z_A];
                    z [j][Z_A] = z[i][Z_A];
                    z [i][Z_A] = t;
                }
            }
        }
        for (i = 0;  i < MAX_STATES;  i++) {
            for (j = i + 1;  j < MAX_STATES;  j++) {
                if ((rand () % RAND_3) < RAND_4) {
                    t = z [j][Z_B];
                    z [j][Z_B] = z[i][Z_B];
                    z [i][Z_B] = t;
                }
            }
        }
        flag = TRUE;
        for (i = 0;  i < MAX_STATES;  i++)
            if ((z[i][Z_A] == z[i][Z_B]) && (z[i][Z_B] == i)) {
                flag = FALSE;
            }

    }
    for (i = 0;  i < MAX_STATES;  i++) {
        a [i] = z [Z_A][i];
        b [i] = z [Z_B][i];
        y [Z_A][i] = rand () % MAX_OUTPUTS;
        y [Z_B][i] = rand () % MAX_OUTPUTS;
    }

return;
}

void printtex (int a [], int b [], int y [MAX_OUTPUTS][MAX_STATES]) {
    int i, j;
    printf("\\documentclass{article}\n");
    printf("\\usepackage[utf8]{inputenc}\n");
    printf("\\usepackage{pgf, tikz}\n");
    printf("\\usetikzlibrary{arrows , automata , positioning}\n");
    printf("\\begin{document}\n\n");


    printf("\\begin{center}\n");
    printf("\\begin{tikzpicture}[>=stealth',shorten >=1pt,auto,node distance=2.5cm]\n");
    printf("\%Knoten\n");

    printf("\\node (1) [state, thick] {1};\n");
    printf("\\node (2) [state, thick, right of= 1] {2};\n");
    printf("\\node (3) [state, thick, above of= 2, right of= 2] {3};\n");
    printf("\\node (4) [state, thick, above of= 3, right of= 1] {4};\n\n");

    printf("\%Verbindungen\n");
    printf("\\path[thick,->]\n");


    char *leftright [] = {"left", "right"};
    char *abovebelow [] = {"above", "below"};

    for (i = 0;  i < MAX_STATES;  i++) {
            if ((a [i] - MIN_STATE) == i)
                printf ("(%i) edge [loop] node {%i/%i} (%i)\n", i + MIN_STATE, Z_A, y [Z_A][i], a [i]);
            else
                printf ("(%i) edge [bend angle=%i, bend %s,%s] node {%i/%i} (%i)\n", i + MIN_STATE, (i+1)*10+(a[i]-MIN_STATE)*5, leftright [(i>(a [i]-MIN_STATE))&&((a [i]-MIN_STATE) != 3)], abovebelow    [((i+1)<=a[i])&&(a[i] != 4)], Z_A, y [Z_A][i], a [i]);
            if ((b [i] - MIN_STATE) == i)
                printf ("(%i) edge [loop] node {%i/%i} (%i)\n", i + MIN_STATE, Z_B, y [Z_B][i], b [i]);
            else
                printf ("(%i) edge [bend angle=%i, bend %s,%s] node {%i/%i} (%i)\n", i + MIN_STATE, (i+1)*25+(b[i]-MIN_STATE)*8, leftright [(i<=(b [i]-MIN_STATE)) &&((b [i]-MIN_STATE) != 3)], abovebelow [((i+MIN_STATE)>b [i])&&(b [i] != 4)], Z_B, y [Z_B][i], b [i]);
    }
    printf(";\n");
    printf("\\end{tikzpicture}\n");
    printf("\\end{center}\n");
    printf("\\end{document}\n");

}

int main (int argc, char *argv []) {
    #define CREATE_NEW      0
    #define READ_CSV        1
    #define PRINT_TEX       0
    #define PRINT_CSV       1
    #define PRINT_NO_HELP   0
    #define PRINT_HELP      1

    int b [MAX_STATES*MAX_OUTPUTS];
    int a [MAX_STATES*MAX_OUTPUTS];
    int y [MAX_OUTPUTS][MAX_STATES];
    int argi;
    int createnew_readcsv = CREATE_NEW;
    int printraw_printtex_print_csv = PRINT_CSV;
    int printhelp = PRINT_NO_HELP;

    for (argi = 1;  argi < argc;  argi++) {
        if ((strcmp ("--create-new", argv [argi]) == 0) || (strcmp ("-n", argv [argi]) == 0))
            createnew_readcsv = CREATE_NEW;
        if ((strcmp ("--read-csv", argv [argi]) == 0) || (strcmp ("-s", argv [argi]) == 0))
            createnew_readcsv = READ_CSV;
        if ((strcmp ("--print-csv", argv [argi]) == 0) || (strcmp ("-c", argv [argi]) == 0))
            printraw_printtex_print_csv = PRINT_CSV;
        if ((strcmp ("--print-tex", argv [argi]) == 0) || (strcmp ("-t", argv [argi]) == 0))
            printraw_printtex_print_csv = PRINT_TEX;
        if ((strcmp ("--help", argv [argi]) == 0) || (strcmp ("-h", argv [argi]) == 0))
            printhelp = PRINT_HELP;
    }
    if (printhelp == PRINT_HELP) {
        printf ("--create-new\n-n\n\n");
        printf ("--read-csv\n-r\n\n");
        printf ("--print-csv\n-c\n\n");
        printf ("--print-tex\n-t\n\n");
        printf ("--help\n-h\n\n");
        return 2;
    }
    if (createnew_readcsv == CREATE_NEW)
        createnew (a, b, y);
    else if (createnew_readcsv == READ_CSV);
        readcsv (a, b, y);
    if (printraw_printtex_print_csv == PRINT_TEX)
        printtex (a, b, y);
    else if (printraw_printtex_print_csv == PRINT_CSV)
        printcsv (a, b, y);
return 0;
}