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 2.0, Pedro Quaresma
// versão 1.0, desenvolvida por Augusto Pinho
// (sob supervisão de Pedro Quaresma)
%{
#include
/*
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+32 = 155, isto dado não se
poderem considerar índices negativos. O gasto de memória que
esta solução implica não é (muito) significativo.
*/
#define MAXCOD 155
int paraminuscula(char c) {
/*
A diferença entre letras maiúsculas e minúsculas é de
32, no caso das letras não acentuadas pode-se usar a função
pré-definida tolower, no caso das letras acentuadas essa função
não faz nada
*/
if (c >= -64 && c <= -36)
return(c+32);
else
return(c);
}
%}
double conta_inicial=0;
double conta_final=0;
double conta_inicialT=0;
double conta_finalT=0;
int i=0;
int j=0;
int k=0;
int conta_digrama=0;
int Inicial[MAXCOD];
int Final[MAXCOD];
char chI;
char chF;
/*
ao colocar como "letra" o caracter '-' está-se a considerar as
palavras do tipo ab-cd, em que "a" é a primeira letra, e "d" a
última, sendo que "b" e "c" são letras no meio.
É de notar que se considerou que:
*) uma palavra do tipo "manda-chuva" conta como uma só palavra.
*) o "-" não conta como letra.
*/
letras [a-zA-Z]|"á"|"à"|"ã"|"â"|"ç"|"é"|"è"|"ê"|"í"|"ì"|"ó"|"ò"|"õ"|"ô"|"ú"|"ù"|"ü"|"Á"|"À"|"Ã"|"Â"|"Ç"|"É"|"È"|"Ê"|"Í"|"Ì"|"Ó"|"Ò"|"Õ"|"Ô"|"Ú"|"Ù"|"Ü"|"-"
%%
{letras}{2,} {
//Letras iniciais:
// se o primeiro é diferente de - então
if(yytext[0] != '-' ){
// se o numero for ocupar na tabela ASCII uma posição
// negativa vou somar-lhe 123;
if(yytext[0] < 0) {
i =-1*paraminuscula(yytext[0])+123;
Inicial[i]++;
}
else {
i = tolower(yytext[0]);
Inicial[i]++;
}
}
// se o primeiro é igual a - então, considera-se que se está
// no meio de uma palavra, caso do partir de uma palavra devido
// à hifenização, como tal não se precede à contabilização
//Letras finais
j=yyleng;
if(yytext[j-1] != '-') {
// se o ultimo é diferente de - então
if(yytext[j-1]<0) {
k =-1*paraminuscula(yytext[j-1])+123;
Final[k]++;
}
else {
k = tolower(yytext[j-1]);
Final[k]++;
}
}
// se o último é igual a - então, considera-se que se está
// no meio de uma palavra, caso do partir de uma palavra devido
// à hifenização, como tal não se precede à contabilização
if(yytext[j-1] == '-' && yyleng > 2) {
if(yytext[j-2]<0) {
k =-1*paraminuscula(yytext[j-2])+123;
Final[k]++;
}
else {
k = tolower(yytext[j-2]);
Final[k]++;
}
}
}
.|\n
%%
main(int argc, char *argv[]) {
// interface linha de comando
// media
char *ficheiroEntrada,*ficheiroSaida;
FILE *fsai, *fopen();
if (argc<=2) { // valores de entrada insuficientes (2+1)
printf("\nUtilização: curtas nome_ficheiro_entrada nome_ficheiro_saída\n\n");
return;
}
// obtêm os argumentos da linha de comando
ficheiroEntrada=argv[1];
ficheiroSaida=argv[2];
printf ("\nFicheiro a Processar: %s\nFicheiro com resultados: %s\n\n",ficheiroEntrada,ficheiroSaida);
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 {
// processar
yylex();
fprintf(fsai,"Letras Iniciais:\n");
//d2=conta_letra;
// Conta número de letras iniciais:
conta_inicial=0;
for (i=0; i < MAXCOD; i++) {
if(Inicial[i] != 0) {
conta_inicial=conta_inicial+1;
conta_inicialT=conta_inicialT+Inicial[i];}
}
for (i=0; i < MAXCOD; i++) {
if(Inicial[i] != 0) {
if (i>123) {
chI=-1*(i-123);
fprintf(fsai,"%c\t%0.6f \n",chI,(Inicial[i]/conta_inicialT)*100);}
else {
chI=i;
fprintf(fsai,"%c\t%0.6f \n",chI,(Inicial[i]/conta_inicialT)*100);}
}
}
fprintf(fsai,"\n\nLetras Finais: \n");
// Conta número de letras finais usadas:
conta_final=0;
conta_finalT=0;
for (i=0; i < MAXCOD; i++) {
if(Final[i] !=0) {
conta_final=conta_final+1;
conta_finalT=conta_finalT+Final[i];
}
}
for (i=0; i < MAXCOD; i++) {
if(Final[i] !=0) {
if (i>123) {
chF=-1*(i-123);
fprintf(fsai,"%c\t%0.6f \n",chF,(Final[i]/conta_finalT)*100);
}
else {
chF=i;
fprintf(fsai,"%c\t%0.6f \n",chF,(Final[i]/conta_finalT)*100);
}
}
}
}
}