Corretor Ortográfico.: Universidade Federal de Sergipe Departamento de Matemática
Corretor Ortográfico.: Universidade Federal de Sergipe Departamento de Matemática
Corretor Ortográfico.: Universidade Federal de Sergipe Departamento de Matemática
DEPARTAMENTO DE MATEMÁTICA
Corretor ortográfico.
São Cristóvão - SE
2023
1
1 Funções auxiliares do programa
A seguir, há uma função min() que recebe dois inteiros a e b como parâme-
tros e retorna o menor deles.
2
void a e b, que são convertidos em ponteiros do tipo PalavraDistancia. Essa
estrutura de dados armazena a palavra e a distância calculada em relação à
palavra digitada pelo usuário. A função compara as distâncias e retorna -1 se
a primeira distância for menor do que a segunda, 1 se a primeira distância for
maior do que a segunda e 0 se as distâncias forem iguais.
2 Main
3
3 O Código
22 // levenshtein
23 int dist1 ( char i [] , int m , char pdig [] , int n ) {
24 // caso vazio
25 if ( m == 0) {
26 return n ;
27 }
28 if ( n == 0) {
29 return m ;
30 }
31 int cost ;
32 // se os ultimos caracteres das strings corresponderem
33 if ( i [ m - 1] == pdig [ n - 1]) {
34 cost = 0;
35 }
36 else {
37 cost = 1;
38 }
39 return min (
40 min ( dist1 (i , m - 1 , pdig , n ) + 1 , dist1 (i , m , pdig , n - 1) +
1) ,
41 dist1 (i , m - 1 , pdig , n - 1) + cost
42 );
43 }
44
4
47 int maxt = fmax (m , n ) ;
48 int * num_i = ( int *) malloc (( m +1) * sizeof ( int ) ) ;
49 int * num_pdig = ( int *) malloc (( n +1) * sizeof ( int ) ) ;
50 int som = 0;
51 convertechi (i , num_i , m ) ;
52 convertechi ( pdig , num_pdig , n ) ;
53 for ( int e = 0; e < maxt ; e ++) {
54 int val_i , val_pdig ;
55 if ( e < m ) {
56 val_i = num_i [ e ];
57 } else {
58 val_i = 0;
59 }
60 if ( e < n ) {
61 val_pdig = num_pdig [ e ];
62 } else {
63 val_pdig = 0;
64 }
65 som += pow ( val_i - val_pdig , 2) ; // eleva ao quadrado e o for
faz com que vire uma soma
66 }
67 return sqrt ( som ) ;
68 }
69 // Calcula a d i s t n c i a angular entre dois vetores
70 double dist_ang ( char i [] , int m , char pdig [] , int n ) {
71 int maxt = fmax (m , n ) ;
72 int * num_i = ( int *) malloc ( m * sizeof ( int ) ) ;
73 int * num_pdig = ( int *) malloc ( n * sizeof ( int ) ) ;
74 double dot_prod = 0.0 , mod_i = 0.0 , mod_pdig = 0.0;
75 convertechi (i , num_i , m ) ;
76 convertechi ( pdig , num_pdig , n ) ;
77
5
97 }
98
119 }
120
6
144 } // resolveu o problema de tirar o vazio do fim das palavras
lendo da direita para a esquerda
145 p1 [ idx ] = malloc ( m + 1) ; // aloca m e m r i a para a palavra
146 strncpy ( p1 [ idx ] , linha , m ) ; // copia a palavra lida para a
m e m r i a alocada
147 int levenshtein = dist1 ( p1 [ idx ] , m , pdig , n ) ;
148 double euclidiana = dist2 ( p1 [ idx ] , m , pdig , n ) ;
149 double angular = dist_ang ( p1 [ idx ] , m , pdig , n ) ;
150 distancias1 [ idx ] = levenshtein ;
151 distancias2 [ idx ] = euclidiana ;
152 distancias3 [ idx ] = angular ;
153 idx ++;
154 }
155 fclose ( arquivo ) ;
156 PalavraDistancia pd1 [ idx ];
157 for ( int i = 0; i < idx ; i ++) {
158 pd1 [ i ]. palavra = p1 [ i ];
159 pd1 [ i ]. distancia = distancias1 [ i ];
160 }
161
162 // OrdenarPARALEV
163 qsort ( pd1 , idx , sizeof ( PalavraDistancia ) , comparaDistancias ) ;
164
7
187 }
188
204 return 0;
205 }
4 Resultados
Palavras Levenshtein
Sugestão Distâncias
CURAR 1.000000
DURAR 1.000000
ZURAR
FURAR 1.000000
JURAR 1.000000
MURAR 1.000000
Palavras Euclidiana
Sugestão Distâncias
URRAR 5.830952
TURCO 7.000000
ZURAR
URUBU 7.280110
TROAR 7.348469
VOTAR 7.483315
8
Palavras Angular
Sugestão Distâncias
ROMAN 0.000926
ROMANA 0.001471
ZURAR
TONAL 0.001625
TOMBO 0.002310
TROCO 0.003043
5 Considerações finais