Neuer Automaten Generator

Benutzeravatar
davidvajda.de
Site Admin
Beiträge: 1424
Registriert: Di Jul 18, 2023 8:36 pm
Wohnort: D-72072, Tübingen
Kontaktdaten:

Neuer Automaten Generator

Beitrag von davidvajda.de »

Neuer Automaten Generator

Ich habe eine neue Möglichkeit gefunden, Automaten und Zustandsdiagramme zu zeichnen. Mit LaTeX

das Lustige ist, ich kann jetzt meinen generator für C, für meine Automaten nehmen und LaTeX Quelltext erzeugen lassen. Dann habe ich den Automat vor mir. Ich stelle es gleich vor.

In LaTeX fängt das so an

Code: Alles auswählen

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgf, tikz}
\usetikzlibrary{arrows , automata , positioning}
\begin{document}
Nein, ich habe es wirklich geschafft.

Hier das C-Programm

Code: Alles auswählen


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

#define EMPTY_Z -1
#define UNINIT_Z -2

int main (void) {
    time_t t;
    int i, j;
    int z [4][4];
    int v;
    int k, l;
    int n;

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

    for (i = 0;  i < 4;  i++) {
        for (j = 0;  j < 4;  j++)
            z [i][j] = j;
    }

    for (n = rand () % 100; n >= 0;  n--) {
        for (i = 0;  i < 4;  i++) {
            if ((rand () % 2) == 0) {
                for (k = 0;  k < 4;  k++) {
                    for (l = k + 1;  l < 4;  l++) {
                        if (z[i][l] > z[i][k]) {
                            t = z [i][l];
                            z [i][l] = z[i][k];
                            z [i][k] = t;
                        }
                    }
                }
            }
            else {
                for (k = 0;  k < 4;  k++) {
                    for (l = k + 1;  l < 4;  l++) {
                        if (z[i][l] < z[i][k]) {
                            t = z [i][l];
                            z [i][l] = z[i][k];
                            z [i][k] = t;
                        }
                    }
                }
            }
        }
        for (j = 0;  j < 4;  j++) {
            if ((rand () % 2) == 0) {
                for (k = 0;  k < 4;  k++) {
                    for (l = k + 1;  l < 4;  l++) {
                        if (z[l][j] > z[k][j]) {
                            t = z [l][j];
                            z [l][j] = z[k][j];
                            z [k][j] = t;
                        }
                    }
                }
            }
            else {
                for (k = 0;  k < 4;  k++) {
                    for (l = k + 1;  l < 4;  l++) {
                        if (z[l][j] < z[k][j]) {
                            t = z [l][j];
                            z [l][j] = z[k][j];
                            z [k][j] = t;
                        }
                    }
                }
            }
        }
    }

/*
    for (i = 0;  i < 4;  i++) {
        for (j = 0;  j < 4;  j++)
            printf ("%i ", z[i][j]);
        printf ("\n");
    }

    printf ("Zustand\tEingabe\tAusgabe\tFolgezustand\n");
    for (i = 0;  i < 4;  i++) {
        for (j = 0;  j < 4;  j++)
            printf ("%i\t\t%i\t\t%i\t\t%i\n", i, j, rand () % 4, z[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 (0) [state, thick] {0};\n");
printf("\\node (1) [state, thick, right of= 0] {1};\n");
printf("\\node (2) [state, thick, right of= 1] {2};\n");
printf("\\node (3) [state, thick, below of= 1] {3};\n\n");

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


for (i = 0;  i < 4;  i++) {
        j = 0;
        if (z [i][j] == i)
            printf ("(%i) edge [loop above] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        else
            printf ("(%i) edge node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        j = 1;
        if (z [i][j] == i)
            printf ("(%i) edge [loop] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        else
            printf ("(%i) edge [bend angle=15, bend left,below] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        j = 2;
        if (z [i][j] == i)
            printf ("(%i) edge [loop] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        else
            printf ("(%i) edge [bend angle=15, bend right,below] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        j = 3;
        if (z [i][j] == i)
            printf ("(%i) edge [loop] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
        else
            printf ("(%i) edge [bend angle=15, bend left,above] node {%i/%i} (%i)\n", i, j, rand () % 4, z[i][j]);
}
/*
printf("(1) edge node {1/0} (2)\n");
printf("(1) edge [bend angle=15, bend left] node {0/0} (4)\n\n");

printf("(2) edge [bend angle=15, bend left,pos=0.4] node {0/0}(3)\n");
printf("(2) edge node {1/0} (4)\n\n");

printf("(3) edge [bend angle=15, bend left,below] node {0/0} (2)\n");
printf("(3) edge [bend angle=35, bend right, above] node {1/0} (1)\n\n");

printf("(4) edge [right] node {1/0} (3)\n");
printf("(4) edge [bend angle=15, bend left] node {0/0} (1)\n");*/
printf(";\n");
printf("\\end{tikzpicture}\n");
printf("\\end{center}\n");
printf("\\end{document}\n");


return 0;
}
Dann, hier mögliche LaTeX Dateien

Code: Alles auswählen

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgf, tikz}
\usetikzlibrary{arrows , automata , positioning}
\begin{document}

\begin{center}
\begin{tikzpicture}[>=stealth',shorten >=1pt,auto,node distance=2.5cm]
%Knoten
\node (0) [state, thick] {0};
\node (1) [state, thick, right of= 0] {1};
\node (2) [state, thick, right of= 1] {2};
\node (3) [state, thick, below of= 1] {3};

%Verbindungen
\path[thick,->]
(0) edge node {0/0} (1)
(0) edge [loop above] node {1/3} (0)
(0) edge [bend angle=15, bend right,below] node {2/2} (3)
(0) edge [bend angle=15, bend left,above] node {3/2} (3)
(1) edge [loop above] node {0/1} (1)
(1) edge [loop above] node {1/1} (1)
(1) edge [bend angle=15, bend right,below] node {2/2} (3)
(1) edge [bend angle=15, bend left,above] node {3/1} (3)
(2) edge [loop above] node {0/0} (2)
(2) edge [loop above] node {1/1} (2)
(2) edge [bend angle=15, bend right,below] node {2/2} (1)
(2) edge [bend angle=15, bend left,above] node {3/2} (0)
(3) edge node {0/3} (2)
(3) edge [bend angle=15, bend left,below] node {1/1} (2)
(3) edge [bend angle=15, bend right,below] node {2/0} (0)
(3) edge [bend angle=15, bend left,above] node {3/3} (0)
;
\end{tikzpicture}
\end{center}
\end{document}
Die sind erzeugt worden

Hier noch eine

Code: Alles auswählen

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{pgf, tikz}
\usetikzlibrary{arrows , automata , positioning}
\begin{document}

\begin{center}
\begin{tikzpicture}[>=stealth',shorten >=1pt,auto,node distance=2.5cm]
%Knoten
\node (0) [state, thick] {0};
\node (1) [state, thick, right of= 0] {1};
\node (2) [state, thick, right of= 1] {2};
\node (3) [state, thick, below of= 1] {3};

%Verbindungen
\path[thick,->]
(0) edge [loop above] node {0/3} (0)
(0) edge [bend angle=15, bend left,below] node {1/3} (3)
(0) edge [bend angle=15, bend right,below] node {2/0} (1)
(0) edge [bend angle=15, bend left,above] node {3/1} (3)
(1) edge [loop above] node {0/0} (1)
(1) edge [bend angle=15, bend left,below] node {1/1} (2)
(1) edge [loop right] node {2/2} (1)
(1) edge [bend angle=15, bend left,above] node {3/3} (3)
(2) edge [loop above] node {0/1} (2)
(2) edge [loop above] node {1/3} (2)
(2) edge [bend angle=15, bend right,below] node {2/1} (1)
(2) edge [bend angle=15, bend left,above] node {3/1} (0)
(3) edge node {0/3} (2)
(3) edge [bend angle=15, bend left,below] node {1/0} (0)
(3) edge [loop right] node {2/2} (3)
(3) edge [bend angle=15, bend left,above] node {3/1} (0)
;
\end{tikzpicture}
\end{center}
\end{document}
Das Ergebnis als PDF

https://davidvajda.de/david4/2024-01-24/test.pdf

https://davidvajda.de/david4/2024-01-24/test3.pdf

Bild

Bild
Antworten