Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
// Copyright (c) 2008 Pedro Quaresma, Coimbra, Portugal // Versão 1.0 // Cálculo do Índice de Coincidência Mútuo // (Mg(yi))~\cite{Stinson2006} %{ #include /* Codificação: (A,65)-(Z,90); (a,97)-(z,122); (À,-64)-(Ã,-61); (Ç,-57)-(Ê,-54); (Ì,-52)-(Î,-50); (Ò,-46)-(Õ,-43); (Ù,-39)-(Ú,-38); (Ü,-36); (à,-32)-(ã,-29); (ç,-25)-(ê,-22); (ì,-20)-(î,-18); (ó,-13)-(õ,-11); (ù,-7)-(ú,-6); (ü,-4); os índices do vector vão coincidir com os valores da codificação dos caracteres, que no caso dos caracteres acentuados é ajustada de forma a não haver conflitos, 122+1+64 = 187, 122 - valor numérico de "z" (o maior positivo) +1 - a próxima posição +64 - o valor (mais negativo) de "À" isto dado não se poderem considerar índices negativos. O gasto de memória que esta solução implica não é (muito) significativo. A solução tem de passar por adoptar os novos tipos de "wide chars" ou algo do género. */ #define MAXCOD 187 %} int i; double conta_palavra=0; int conta_letra=0; int vec[MAXCOD]; char ch; double frequenciaRelativa; double d1; double d2; letras [a-z]|"á"|"à"|"ã"|"â"|"ç"|"é"|"è"|"ê"|"í"|"ì"|"ó"|"ò"|"õ"|"ô"|"ú"|"ù"|"ü" %% {letras} { // 122+1-4=119 ('z'+1-'ü'), isto para obter uma gama contínua if(yytext[0]<0) { i =-1*yytext[0]+119; vec[i]++; conta_letra++; } else { i = yytext[0]; vec[i]++; conta_letra++; } } .|\n %% main(int argc, char *argv[]) { // interface linha de comando // media char *ficheiroEntrada,*ficheiroSaida, *ficheiroFrequencias; double somaFis=0,total_letras=0,indiceCM[MAXCOD]; float freq[MAXCOD], pi; int vecAjustado[MAXCOD]; char auxC; int aux,g; float auxV; FILE *fsai, *ffreq, *fopen(); if (argc<=3) { // valores de entrada insuficientes (3+1) printf("\nUtilização: indiceCoincidenciaMutua nome_ficheiro_frequencias nome_ficheiro_entrada nome_ficheiro_saída\n\n"); return; } // obtêm os argumentos da linha de comando ficheiroFrequencias=argv[1]; ficheiroEntrada=argv[2]; ficheiroSaida=argv[3]; printf ("\nFicheiro a Processar: %s\nFicheiro com resultados: %s\n\n",ficheiroEntrada,ficheiroSaida); if ((ffreq = fopen(ficheiroFrequencias,"r")) == NULL) { printf("Não foi possível abrir o ficheiro %s\n",ficheiroFrequencias); } else if ((yyin = fopen(ficheiroEntrada,"r")) == NULL) { printf("Não foi possível abrir o ficheiro %s\n",ficheiroEntrada); } else if ((fsai = fopen(ficheiroSaida,"w")) == NULL) { printf("Não foi possível abrir para escrita o ficheiro %s\n",ficheiroSaida); } else { /* Ler o ficheiro com os valores das frequências. Para se poder fazer a multiplicação com os valores de frequência encontrados vai-se usar o mesmo princípio de arrumação dos valores, o índice do vector é o valor numérico (ASCII+correcções) do próprio caracter. */ // Inicializar o vector freq e vecAjustado for (i=0; i < MAXCOD; i++) { freq[i]=0; vecAjustado[i]=0; } // os índices vão ser definidos como uma gama contínua a começar // em zero. i=0; while (!feof(ffreq)) { fscanf(ffreq,"%c%f\n",&auxC,&auxV); freq[i]=auxV; i++; } // processar o ficheiro de entrada yylex(); // Contar o número total de letras lidas for (i=0; i < MAXCOD; i++) if(vec[i] != 0) { total_letras = total_letras+vec[i]; } // Tenho de ajustar os vectores dos valores para estarem numa gama // continua a começar no zero. // a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z, (26) // ü,ú,ù,õ,ô,ó,ò,í,ì,ê,é,è,ç,ã,â,á,à // gama a-z for (i=0; i<=25; i++) { vecAjustado[i]=vec[i+97]; // n-97 //printf("%d,%c,%d\n",i,i+97,vecAjustado[i]); } // 123=119-(-4), -4='ü') for (i=26; i<=26; i++) { vecAjustado[i]=vec[i+98]; // 26+97=123 //printf("%d,%c,%d\n",i,-(i+97)+119,vecAjustado[i]); } // 125=119-(-6), -6='ú', ... ù for (i=27; i<=28; i++) { vecAjustado[i]=vec[i+99]; // 27+98=125, ... //printf("%d,%c,%d\n",i,-(i+98)+119,vecAjustado[i]); } // 130=119-(-11), -11='õ',...ô,ó,ò for (i=29; i<=32; i++) { vecAjustado[i]=vec[i+102]; // 29+101=130, ... //printf("%d,%c,%d\n",i,-(i+101)+119,vecAjustado[i]); } // 138=119-(-19)='í',... ì for (i=33; i<=34; i++) { vecAjustado[i]=vec[i+105]; // 33+105=138, ... //printf("%d,%c,%d\n",i,-(i+105)+119,vecAjustado[i]); } // 141=119-(-22)='ê',... é,è,ç for (i=35; i<=38; i++) { vecAjustado[i]=vec[i+106]; // 35+106=141, ... //printf("%d,%c,%d\n",i,-(i+106)+119,vecAjustado[i]); } // 148=119-(-29)='ã',... â,á,à for (i=39; i<=42; i++) { vecAjustado[i]=vec[i+106]; // 39+109=148, ... //printf("%d,%c,%d\n",i,-(i+109)+119,vecAjustado[i]); } for (g=0; g <= 42; g++) { somaFis=0; for (i=0; i <= 42; i++) { pi=freq[i]/100; somaFis=somaFis+(vecAjustado[(i+g) % 43]*pi/total_letras); } // escreve o índice de coincidência Mútua indiceCM[g] = somaFis; fprintf(fsai,"Índice de Coincidência Mútuo[%d]: %0.6f\n",g,indiceCM[g]); } } }