ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Entrega final del proyecto semestral


Enviado por   •  4 de Junio de 2017  •  Tutorial  •  2.385 Palabras (10 Páginas)  •  149 Visitas

Página 1 de 10

[pic 1]

ITESM-CEM

Sistemas Operativos

 Entrega final del proyecto semestral

Profesor: Oscar Herrera

Fecha de entrega: 04 de mayo del 2017

Indicaciones

1. Introducción

En la Teoría de la Información de Shannon, se define la cantidad de información de un suceso si como I(si) = -log p(si) en donde p(si) es la probabilidad de ocurrencia de si, medida en bits cuando se usa logaritmo en base 2.

En la práctica, la probabilidad de un suceso o evento p(si) se estima mediante la frecuencia relativa fr(si) definida como fr(si) = f(si) / (f(si)) en donde f(si) es la frecuencia individual o número de veces que se repite el suceso si, y (f(si) es la suma de todas las frecuencias individuales de los n diferentes si.

La entropía o valor esperado de la información se define como H(S) =  p(si) I(si) = -  p(si) log p(si)

Una aplicación de esta teoría consiste en estimar la compresibilidad de un archivo, o de múltiples archivos, a los cuales se les calcula su entropía de los 256 códigos ASCII que se almacenan en esos archivos.        

Problema.

Calcular la entropía de archivos TXT, MP3, JPG, o MPG contenidos en un directorio dado por el usuario, incluyendo el recorrido recursivo de sus subdirectorios.

Metodología.

Escribir un programa en lenguage C en ambiente GNU/Linux que:

1. Use funciones de acceso a la estructura de archivos y directorios de GNU/Linux.

2. Reciba un directorio como parámetro de entrada dado por el usuario.

3. Reciba una extensión de tipo de archivo a filtrar (TXT, MP3, JPG, MPG) o un asterisco * para filtrar a los cuatro tipos de archivos anteriores. Filtral se refiere a no tomar en cuenta archivos que no sean de estos tipos, por ejemplo, BMP, WAV, etc.).

4. Genere un histograma con las frecuencias de cada código ASCII (evento si) en base al número de veces que se repite cada

código (evento si) en todos los archivos filtrados

5. Calcule la entropía para los casos (TXT, MP3, JPG, MPG) o asterisco *

Código fuente.

  1. //Proyecto Final SO  
  2.   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9. #include   
  10. #include   
  11. #include   
  12. #include   
  13. #include   
  14. #include   
  15. #include   
  16. #include   
  17.   
  18.   
  19.   
  20. double info[256];  
  21. double info2[256];  
  22.   
  23. double Entropia = 0;  
  24.   
  25. char tipoArchivo[50];  
  26.   
  27. long hist[256];  
  28. long total=0;  
  29. char str[70];  
  30.   
  31. double proba[256];  
  32.   
  33.   
  34.   
  35.   
  36. void *abre_carpeta(void *carp){  
  37.     char *name;  
  38.   
  39.     name=(char *)carp;  
  40.   
  41.     char bandera;  
  42.   
  43.     DIR * directo;  
  44.   
  45.     struct dirent *local_entry;  
  46.   
  47.     char direccion[100];  
  48.     char noarch[200];  
  49.   
  50.     int i=-1;  
  51.     int status;  
  52.   
  53.   
  54.     struct stat st;  
  55.   
  56.     int pq;  
  57.     directo = opendir(name);  
  58.   
  59.     if(directo==NULL){  
  60.         printf("Error\n");  
  61.         return 0;  
  62.     }  
  63.   
  64.     pthread_t extra[256];  
  65.   
  66.     uint8_t *buffer;  
  67.   
  68.     FILE *fp;  
  69.   
  70.     char *NombreArchivo;  
  71.   
  72.     int q;  
  73.   
  74.   
  75.     while ((local_entry = readdir(directo))!= NULL) {  
  76.   
  77.             NombreArchivo=local_entry->d_name;  
  78.   
  79.             bandera=0;  
  80.   
  81.             while(NombreArchivo[q]!='.'){  
  82.   
  83.                 q++;  
  84.             }  
  85.   
  86.   
  87.             if(tipoArchivo[0]=='*'&&(NombreArchivo[q+1]=='m'||NombreArchivo[q+1]=='t'||NombreArchivo[q+1]=='j')&&(NombreArchivo[q+2]=='p'  
  88.             ||NombreArchivo[q+2]=='x')&&(NombreArchivo[q+3]=='g'||NombreArchivo[q+3]=='3'||NombreArchivo[q+3]=='t')){  
  89.                 bandera=1;  
  90.             }  
  91.             else{  
  92.                 if(tipoArchivo[0]==NombreArchivo[q+1] && tipoArchivo[1]==NombreArchivo[q+2] && tipoArchivo[2]==NombreArchivo[q+3]){  
  93.                     bandera=1;  
  94.                 }  
  95.                 else{  
  96.                     bandera=0;  
  97.                 }  
  98.             }  
  99.   
  100.   
  101.   
  102.             if ((local_entry->d_name)[0]== q ==0||'.')  
  103.             {  
  104.                 continue;  
  105.             }  
  106.             else if (local_entry->d_type == DT_REG && bandera) {  
  107.   
  108.                 memset(noarch,0,200);  
  109.                 strcpy(noarch,local_entry->d_name);  
  110.   
  111.                 fp = fopen(noarch,"rb");  
  112.   
  113.                 if(fp==NULL){  
  114.                     printf("%s imposible abrir !! \n", local_entry->d_name);  
  115.                     continue;  
  116.                 }  
  117.                 else{  
  118.   
  119.                     fseek(fp,0,SEEK_END);  
  120.   
  121.                     pq=ftell(fp);  
  122.                     rewind(fp);  
  123.   
  124.                     buffer=(char *)malloc((pq+1)*sizeof(uint8_t));  
  125.   
  126.                     fread(buffer,pq,1,fp);  
  127.                 }  
  128.                 fclose(fp);  
  129.   
  130.                 for (int z = 0; z < pq; ++z)  
  131.   
  132.                 {  
  133.                     hist[buffer[z]]++;  
  134.                 }  
  135.   
  136.                 memset(buffer,0,pq+1);  
  137.                 free(buffer);  
  138.   
  139.                 stat(noarch, &st);  
  140.   
  141.                 total=total+st.st_size;  
  142.   
  143.                 printf("--%s: %li bytes\n",NombreArchivo,total);  
  144.             }  
  145.             else if (local_entry->d_type == (local_entry->d_name)[0] != '.' && DT_DIR  ){  
  146.   
  147.                 memset(direccion,0,100);  
  148.   
  149.                 strcpy(direccion,name);  
  150.   
  151.                 strcat(direccion,str);  
  152.   
  153.                 strcat(direccion, local_entry->d_name);  
  154.   
  155.                 i++;  
  156.   
  157.                 status=pthread_create(&extra[i],NULL,abre_carpeta,(void *)direccion);  
  158.   
  159.                 usleep(100);  
  160.   
  161.                 pthread_join(extra[i], NULL);  
  162.             }  
  163.             q=0;  
  164.     }  
  165.     closedir(directo);  
  166.   
  167.     return 0;  
  168. }  
  169.   
  170. int main(int argc, char* argv[]){  
  171.   
  172.   
  173.     printf("Cual extension desea seleccionar? si quiere todas las extensiones ponga *: ");  
  174.   
  175.     scanf("%s",tipoArchivo);  
  176.   
  177.     strcpy(str, "/");  
  178.   
  179.     abre_carpeta(argv[1]);  
  180.   
  181.     long tot=0;  
  182.   
  183.     for (int a = 0; a < 256; ++a){  
  184.         tot=tot+hist[a];  
  185.     }  
  186.   
  187.     for (int b = 0; b < 256; ++b){  
  188.         proba[b]=(double)hist[b]/(double)tot;  
  189.     }  
  190.   
  191.     for (int c = 0; c < 256; ++c){  
  192.         info[c]=log2(1/proba[c]);  
  193.     }  
  194.   
  195.     for (int c = 0; c < 256; ++c){  
  196.         info2[c]=proba[c]*info[c];  
  197.     }  
  198.   
  199.     for (int d = 0; d < 256; ++d){  
  200.         Entropia=Entropia+info2[d];  
  201.     }  
  202.   
  203.   
  204.   
  205.     printf("\n la Entropia es: %f\n",Entropia);  
  206. }  

Doxygen

Se presenta el link de la documentación en Doxygen:

file:///D:/Desktop/Doxygen/html/globals_vars.html

Doxygen

Se presenta captura de pantalla de cálculo de entropía realizada al obtener los histogramas y probabilidad tal y como lo vimos en clase.

Calculo de entropía con .JPG.

[pic 2]

Conclusión

La teoría es muy diferente a la práctica, cuando vimos los temas en clase no se veía tan complicado la realización de este proyecto. Cuando se pasó a la etapa de crear el programa, me pareció un poco complicado el unir las prácticas de laboratorio realizadas previamente. Al momento de probar el programa en la consola ingresando la extensión de los tipos de archivos a generar histograma y calcular entropía, la consola regresaba errores de “core dumped”. Debido a esto perdí mucho tiempo y no logre probar correctamente mi programa más que con archivos jpg.

...

Descargar como (para miembros actualizados) txt (9 Kb) pdf (250 Kb) docx (114 Kb)
Leer 9 páginas más »
Disponible sólo en Clubensayos.com