· 8 years ago · Nov 20, 2017, 12:56 PM
1/* ENTRADA.TXT EN LA MISMA CARPETA DEL PROGRAMA, GENERA SALIDA.TXT EN EL MISMO LUGAR
2el 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 :
6input (entrada.txt):
7JUANPEREZ@GMAIL.COM ana@gmail.com
8pedro.piedra@gmail.com atenea.pug@gmail.com
9juana.gomez@PUCV.CL Rodrigo.fernandez@upm.es catalina.griffiths@pucv.cl
10ana.ruiz@upla.cl DELIA.ibacache@upla.cl
11maria.fernandez@UPM.ES
12
13output (salida.txt):
14gmail.com 4
15pucv.cl 2
16upla.cl 2
17upm.es 2
18
19*/
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <ctype.h>
25
26typedef struct facebook{
27 char dominio[256];
28 unsigned long long total;
29}facebook;
30
31int 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
41void 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
86int 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}