Advertisement
rohan_

[fin semestre 2] -> (archivos) dominio de emails

Nov 20th, 2017
606
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.78 KB | None | 0 0
  1. /* ENTRADA.TXT EN LA MISMA CARPETA DEL PROGRAMA, GENERA SALIDA.TXT EN EL MISMO LUGAR
  2. el programa actua como contador de dominios, guardando en un archivo de salida los dominios ordenados descendentemente en el siguiente orden de prioridad:
  3.     - total de cuentas vinculadas al mismo dominio
  4.     - orden alfabetico
  5.     ejemplo :
  6. input (entrada.txt):
  7. JUANPEREZ@GMAIL.COM    ana@gmail.com
  8. pedro.piedra@gmail.com  atenea.pug@gmail.com
  9. juana.gomez@PUCV.CL   Rodrigo.fernandez@upm.es catalina.griffiths@pucv.cl
  10. ana.ruiz@upla.cl    DELIA.ibacache@upla.cl
  11. maria.fernandez@UPM.ES
  12.  
  13. output (salida.txt):
  14. gmail.com 4
  15. pucv.cl 2
  16. upla.cl 2
  17. upm.es 2
  18.  
  19. */
  20.  
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <ctype.h>
  25.  
  26. typedef struct facebook{
  27.     char dominio[256];
  28.     unsigned long long total;
  29. }facebook;
  30.  
  31. int compara(const void *a, const void *b) //orden descendente, prioridad: cantidad de dominios, orden alfabetico
  32. {
  33.     const facebook *p = a;
  34.     const facebook *q = b;
  35.     unsigned long long cmp = q->total - p->total;
  36.     if(!cmp) return strcmp(p->dominio, q->dominio);
  37.     return cmp;
  38. }
  39.  
  40.  
  41. void dominiosYFrecuencia(FILE *entrada,FILE **salida)
  42. {
  43.     facebook *base = NULL;
  44.     char correo[321]; //guarda cada correo ingresado
  45.     int i, j;
  46.     unsigned long long cuentas = 0; //total de cada dominio
  47.     while(fscanf(entrada, "%s", correo) != EOF) {
  48.         /* se guarda solo el dominio (lo que sigue al @)*/
  49.         for(i=0 ; correo[i]!='@' && i!=strlen(correo); i++); i++;
  50.         if(i == strlen(correo)+1) {
  51.             printf("ADVERTENCIA: %s no es un correo electronico\n", correo);
  52.             continue;
  53.         }
  54.         j=0;
  55.         while(correo[i]) {
  56.             correo[j] = tolower(correo[i]);
  57.             i++;
  58.             j++;
  59.         }
  60.         correo[j]='\0';
  61.  
  62.         /* se van sumando el total de cada dominio, si no se encuentra se almacena*/
  63.         for(i=0 ; i<cuentas ; i++) {
  64.             if(!strcmp(correo, base[i].dominio)) {
  65.                 base[i].total++;
  66.                 break;
  67.             }
  68.         }
  69.         if(i == cuentas) {
  70.             base = realloc(base, sizeof(facebook)*(cuentas+1));
  71.             strcpy(base[cuentas].dominio, correo);
  72.             base[cuentas].total = 1;
  73.             cuentas++;
  74.         }
  75.     }
  76.     /* se guardan los datos ordenados*/
  77.     if(cuentas) {
  78.         qsort(base, cuentas, sizeof(facebook), compara);
  79.         for(i=0 ; i<cuentas ; i++) {
  80.             fprintf(*salida, "%s %llu\n", base[i].dominio, base[i].total);
  81.         }
  82.     }
  83.     free(base);
  84. }
  85.  
  86. int main(int argc, char **argv)
  87. {
  88.     FILE *entrada, *salida;
  89.     entrada = fopen("entrada.txt", "r");
  90.     salida = fopen("salida.txt", "w");
  91.     dominiosYFrecuencia(entrada,&salida);
  92.     fclose(entrada);
  93.     fclose(salida);
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement