Ruby - Implementación AUTOMATA FINITO DETERMINISTA (AFD) en Ruby

 
Vista:
sin imagen de perfil

Implementación AUTOMATA FINITO DETERMINISTA (AFD) en Ruby

Publicado por Miguel (1 intervención) el 30/07/2017 22:23:31
Buenas tardes, estoy implementando un automata finito determinista en ruby, tenia uno perfectamente funcional en C y lo pase a ruby, pero no funciona correctamente, alguien sabe si cometi un error al momento de pasar codigo C a ruby

CODIGO EN C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<stdio.h>
#include<string.h>
 
#define fl(i,a,b) for(i=a; i<b; i++)
#define scan(a) scanf("%d", &a)
#define nline printf("\n")
 
#define MAX 1000
 
int states, symbols, symdir[20], final_states, mark[20], mat[20][20];
 
int main()
{
    int i, j, k;
    printf("Enter the number of states : ");
    scan(states);
    printf("Enter the number of symbols : ");
    scan(symbols);
 
    printf("Enter the symbols : ");
    nline;
    fl(i,0,symbols)
    {
        printf("Enter the symbol number %d : ", i);
        scan(symdir[i]);
    }
 
    printf("Enter the number of final states : ");
    scan(final_states);
 
    printf("Enter the number of the states which are final : ");
    nline;
    fl(i,0,final_states)
    {
        int temp;
        scan(temp);
        mark[temp]=1;
    }
 
    printf("Define the relations for the states and symbols : ");
    nline;
    fl(i,0,states)
    {
        fl(j,0,symbols)
        {
            printf("Enter the relation for Q(%d) -> %d : ", i, symdir[j]);
            scan(mat[i][symdir[j]]);
        }
    }
 
 
 
    //--------------------------------------------------------//
    int cases;
    printf("Enter the number of strings to be tested : ");
    scan(cases);
    fl(k,0,cases)
    {
        printf("Enter the string to be tested : ");
        char str1[MAX];
        scanf("%s", &str1);
        int curr=0;
        int limit=strlen(str1);
        fl(i,0,limit)
        {
            int ele=(int)(str1[i]-'0');
            curr=mat[curr][ele];
        }
        printf("The entered string is ");
        if(mark[curr]==1)
            printf("Accepted");
        else
            printf("Rejected");
        nline;
    }
 
    return 0;
 
}

CODIGO EN RUBY

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class AFDs
 
    def initialize
    end
 
    num_simbolos = 2
    simbolos = [0,1]
 
    finales = []
    estados = []
 
    puts 'Introduce el numero de estados: '
    estados = gets.to_i
    num_estados=gets.to_i
 
    puts 'Introduce el numero de estados finales:'
    estados_finales = gets.to_i
 
    puts 'Introduce los estados finales:'
 
            for i in (0..estados_finales-1)
                    temporal = gets.to_i
                    finales[temporal] = 1
            i = i+1
            end
 
    puts 'Define la relacion entre los estados y los simbolos:'
 
            for a in (0..num_estados-1)
                    for j in(0..num_simbolos-1)
                        puts "Introduce la relacion entre Q(#{a}) ->#{simbolos[j]}: "
                                 estados[a][simbolos[j]] << gets.to_i
                    j = j+1
                    end
            a = a+1
            end
 
    puts 'Ingrese el numero de cadenas que quiere probar: '
 
        num_cadenas = gets.to_i
 
                    for b in (0..num_cadenas-1)
                        puts 'Introduzca la cadena a probar:'
                        str1 = []
                        str1 = gets
                        curr=0
                        limit = 0
                            limit = str1.length
                        #limit= str1.length 
                            for c in(0..limit)
                                ele = str1[c].to_i - 0
                                curr = estados[curr][ele]
                                c=c+1
                            end
 
 
                    puts'La cadena ingresada es: '
 
                        if finales[curr] == 1
                            puts 'Aceptada'
                        else
                            puts'Rechazada'
                        end
                    b = b+1
                    end
end
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Emanuel
Val: 19
Ha mantenido su posición en Ruby (en relación al último mes)
Gráfica de Ruby

Implementación AUTOMATA FINITO DETERMINISTA (AFD) en Ruby

Publicado por Emanuel (7 intervenciones) el 12/04/2019 01:27:44
No es necesario implementarlo en Ruby, podés crear una extensión que use el soft que creaste en C desde Ruby... Hay muchos tutos sobre extensión de Ruby.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar