DEFINE STRING="CHAR ARRAY" ; sys.act DEFINE ASCII_SpaceBar="32" INT FUNC JaroWinklerDistance(STRING str1, str2) STRING Z(15) INT S1, S2, J, M, N, L, I, K, skip, Max, Min INT Result Result=0 S1=str1(0) S2=str2(0) IF S1>S2 THEN SCopy(Z,str1) SCopy(str1,str2) SCopy(str2,Z) M=S1 S1=S2 S2=M FI J=1 M=0 N=0 L=S2/2 SCopy(Z,str2) FOR I=1 TO S1 DO skip=0 IF str1(I)=str2(J) THEN M==+1 str2(J)=ASCII_SpaceBar skip=1 FI IF skip=0 THEN Max=1 IF Max<(I-L) THEN Max=I-L FI Min=S2 IF Min>(I+L) THEN Min=I+L FI FOR K=Max TO Min DO IF str1(I)=str2(K) THEN N==+1 M==+1 str2(K)=ASCII_SpaceBar IF K>J THEN J=K FI FI OD FI IF JS2 THEN Min=S2 FI M=Min IF M>3 THEN M=3 FI M==+1 L=0 SCopy(str2,Z) IF M>Min THEN M=Min FI FOR I=1 TO M DO IF str1(I)=str2(I) THEN L==+1 ELSE EXIT FI OD Result=Result*100 + (((L*100)/10)*(100 - Result)) ; Winkler Result=(Result+49)/100 RETURN(Result) PROC MAIN() INT result STRING Word_1(15), Word_2(15) PUT(125) PUTE() SCopy(Word_1,"MARTHA") SCopy(Word_2,"MARHTA") PrintF("%S - %S%E",Word_1,Word_2) result=JaroWinklerDistance(Word_1,Word_2) PrintF("Jaro Winkler Distance=%U%E%E",result) SCopy(Word_1,"DIXON") SCopy(Word_2,"DICKSONX") PrintF("%S - %S%E",Word_1,Word_2) result=JaroWinklerDistance(Word_1,Word_2) PrintF("Jaro Winkler Distance=%U%E%E",result) SCopy(Word_1,"JELLYFISH") SCopy(Word_2,"SMELLYFISH") PrintF("%S - %S%E",Word_1,Word_2) result=JaroWinklerDistance(Word_1,Word_2) PrintF("Jaro Winkler Distance=%U%E%E",result) RETURN