Spasseshalber Deepsearch

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

Re: Spasseshalber Deepsearch

Beitrag von davidvajda.de »

So, ich fange jetzt an. Als erstes initialisiere ich die Zustände.

Ich mache es mit der Sortierung, wie vorher.

Entschuldigung, das hat etwas gedauert, weil ich habe auf der Strasse angefangen zu schreiben, dann bin ich zwischendrin nach hause und dann habe ich mich noch ausgeruht

Code: Alles auswählen

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

#define ERR_FILE_WRON_FORMAT            3
#define ERR_FILE_WRON_FORMAT_MSG        "IO-Error: File Wrong Format"
#define MAX_STR_INPUT_LEN               128


#define MAX_SPECIAL_STATES      3
#define MAX_STATES              128
#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;
    char s [MAX_STR_INPUT_LEN];

    //scanf ("Zustand,Eingabe,Ausgabe,Folgezustand\n");
    scanf ("%s\n", s);
    if (strcmp (s, "Zustand,Eingabe,Ausgabe,Folgezustand") != 0) {
            printf ("%s\n", ERR_FILE_WRON_FORMAT_MSG);
            exit (ERR_FILE_WRON_FORMAT);
    }


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

        if (x1 != Z_A) {
            printf ("%s\n", ERR_FILE_WRON_FORMAT_MSG);
            exit (ERR_FILE_WRON_FORMAT);
        }
        if (x2 != Z_B) {
            printf ("%s\n", ERR_FILE_WRON_FORMAT_MSG);
            exit (ERR_FILE_WRON_FORMAT);
        }
        if (i1 != (i+1)) {
            printf ("%s\n", ERR_FILE_WRON_FORMAT_MSG);
            exit (ERR_FILE_WRON_FORMAT);
        }
        if (i2 != (i+1)) {
            printf ("%s\n", ERR_FILE_WRON_FORMAT_MSG);
            exit (ERR_FILE_WRON_FORMAT);
        }
    }

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]) {
    time_t t;
    int i, j;
    int flag;
    int s;

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


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

return;
}

int deepsearch (int p [], int n, int a [], int b [], int m);
int deepsearch_inner (int p [], int i, int n, int a [], int b [], int j);

int deepsearch_inner (int p [], int i, int n, int a [], int b [], int j) {
    int r1 = 1;

    if (i >= n)
        return 1;

    if ((p [i] == a [j]) && (p [i] != b [j])) {
        return deepsearch_inner (p, i+1, n, a, b, a[j]);
    }
    else if ((p [i] != a [j]) && (p [i] == b [j])) {
        return deepsearch_inner (p, i+1, n, a, b, b[j]);
    }
    if ((p [i] == a [j]) && (p [i] == b [j]))
        return (deepsearch_inner (p, i+1, n, a, b, a[j]) || deepsearch_inner (p, i+1, n, a, b, b[j]));
return 0;
}

int deepsearch (int p [], int n, int a [], int b [], int m) {
    int i;

    for (i = 0;  i < m;  i++)
        if (deepsearch_inner (p, 0, n, a, b, i))
            return 1;
return 0;
}

/*
void printtex (int a [], int b [], int y [MAX_OUTPUTS][MAX_STATES]) {
    int i, j;
    int codez = 8;
    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 ("\\begin{center}\n");
    printf ("\\begin{tabular}{|l|l|l|l||l|l|l|l|}\n");
    printf ("\\hline\n");
    printf ("Zustand & Eingabe & Ausgabe & Folgezustand & \\multicolumn{4}{|l|}{Codefolgezustand}\\\\\n");
    printf ("\\hline\n");
    printf ("& & & & \\verb\"z3+\" &  \\verb\"z2+\" &  \\verb\"z1+\" &  \\verb\"z0+\"\\\\\n");
    printf ("\\hline\n");
    for (i = 0;  i < MAX_STATES;  i++) {
        printf ("\\verb\"z%i\" & \\verb\"%i\" &  \\verb\"%i\" & \\verb\"z%i\" & \\verb\"%i\"  & \\verb\"%i\"  & \\verb\"%i\"  & \\verb\"%i\"\\\\\n", i + MIN_STATE, Z_A, y [Z_A][i], a [i], ((0x01 << (a [i]-MIN_STATE)) & 0x08) >> (a [i]-MIN_STATE), ((0x01 << (a [i]-MIN_STATE)) & 0x04) >> (a [i]-MIN_STATE), ((0x01 << (a [i]-MIN_STATE)) & 0x02) >> (a [i]-MIN_STATE), ((0x01 << (a [i]-MIN_STATE)) & 0x01) >> (a [i]-MIN_STATE));
        printf ("\\verb\"z%i\" & \\verb\"%i\" &  \\verb\"%i\" & \\verb\"z%i\" & \\verb\"%i\"  & \\verb\"%i\"  & \\verb\"%i\"  & \\verb\"%i\"\\\\\n", i + MIN_STATE, Z_B, y [Z_B][i], b [i], (((0x01 << (b [i]-MIN_STATE))) & 0x08) >> (b [i]-MIN_STATE), ((0x01 << (b [i]-MIN_STATE)) & 0x04) >> (b [i]-MIN_STATE), ((0x01 << (b [i]-MIN_STATE)) & 0x02) >> (b [i]-MIN_STATE), ((0x01 << (b [i]-MIN_STATE)) & 0x01) >> (b [i]-MIN_STATE));

    }
    printf ("\\hline\n");
    printf ("\\end{tabular}\n");
    printf ("\\end{center}\n");


    printf ("\\begin{center}\n");
    printf ("\\begin{verbatim}\n");
    for (i = MIN_STATE;  i < (MAX_STATES + MIN_STATE);  i++) {
        printf ("z%i+ := ", i);
        for (j = 0;  j < MAX_STATES;  j++) {
            if ( a [j] == i )
                printf ("z%i and x or ", j+MIN_STATE, y [j]);
            if ( b [j] == i )
                printf ("z%i and not x or ", j+MIN_STATE, y [j]);
        }
        printf (" true;\n");
    }
    printf ("\\end{verbatim}\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

    char *existsstr [] = {"nicht gefunden\n", "gefunden\n"};

    int b [MAX_STATES];
    int a [MAX_STATES];
    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;
    int p [4];

    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);
    int i;
    for (i = 0;  i < 4;  i++)
        p [i] = rand () % MAX_STATES;

    a [12] = 13;
    b [13] = 14;
    a [13] = 14;
    a [14] = 15;

    p [0] = 13;
    p [1] = 14;
    p [2] = 15;

    printf ("%s", existsstr[deepsearch (p, 3, a, b, MAX_STATES)]);

    a [12] = 13;
    b [13] = 22;
    a [13] = 22;
    a [22] = 15;

    p [0] = 13;
    p [1] = 22;
    p [2] = 15;

    printf ("%s", existsstr[deepsearch (p, 3, a, b, MAX_STATES)]);

return 0;
}

Code: Alles auswählen

int deepsearch (int p [], int n, int a [], int b [], int m);
int deepsearch_inner (int p [], int i, int n, int a [], int b [], int j);

int deepsearch_inner (int p [], int i, int n, int a [], int b [], int j) {
    int r1 = 1;

    if (i >= n)
        return 1;

    if ((p [i] == a [j]) && (p [i] != b [j])) {
        return deepsearch_inner (p, i+1, n, a, b, a[j]);
    }
    else if ((p [i] != a [j]) && (p [i] == b [j])) {
        return deepsearch_inner (p, i+1, n, a, b, b[j]);
    }
    if ((p [i] == a [j]) && (p [i] == b [j]))
        return (deepsearch_inner (p, i+1, n, a, b, a[j]) || deepsearch_inner (p, i+1, n, a, b, b[j]));
return 0;
}

int deepsearch (int p [], int n, int a [], int b [], int m) {
    int i;

    for (i = 0;  i < m;  i++)
        if (deepsearch_inner (p, 0, n, a, b, i))
            return 1;
return 0;
}
Antworten