· 8 years ago · Nov 20, 2017, 03:20 AM
1Facebook desea hacer una segmentación de usuarios según el dominio del correo electrónico con el que crearon sus cuentas. En una dirección de correo electrónico, el dominio es la parte que va después del carácter arroba (@). Por ejemplo en la dirección de correo electrónico juan.perez@gmail.com, el dominio es gmail.com.
2
3Tu tarea es programar una función en C que reciba un archivo de texto con las direcciones de correo electrónico de todos los usuarios de Facebook y escriba en un archivo de salida un listado con todos los dominios de correo electrónico diferentes encontrados y la cantidad de usuarios que se registraron con cuentas de ese dominio.
4
5El prototipo de esta función es :
6
7void dominiosYFrecuencia(FILE *entrada,FILE **salida);
8
9Esta función recibe :
10
11entrada : un puntero a FILE traspasado por valor que contiene el texto del archivo que se debe procesar. Considere que el archivo que contiene el texto de entrada fue abierto exitosamente en modo lectura en la función main.
12salida : un puntero a FILE traspasado por referencia que almacenará la lista de dominios diferentes en minúsculas que contiene el texto y su frecuencia. En esta lista los dominios deben ser ordenados por su frecuencia (de mayor a menor). Si existen frecuencias iguales, entonces los dominios se deben ordenar alfabéticamente (Vea los casos de prueba para una mejor comprensión). Considere que el archivo que almacenará estos datos fue abierto exitosamente en modo escritura en la función main.
13NOTAS IMPORTANTES:
14
15Considera que una dirección de correo electrónico tiene como máximo 320 caracteres. 64 caracteres máximo para el nombre de usuario, 1 carácter para el arroba y 255 caracteres máximo para el dominio. Considera que todas las direcciones de correo en el archivo de entrada son válidas.
16NO SE CONOCE el total de direcciones de correo electrónico registrado, por lo tanto debes usar vectores dinámicos para almacenar los dominios diferentes.
17Puedes incluir otras funciones que consideres necesarias para resolver el problema.
18Puedes incluir la definición de MACROS y nuevos tipos de datos (por ejemplo struct), si lo consideras necesario.
19
20Input
21JUANPEREZ@GMAIL.COM ana@gmail.com
22pedro.piedra@gmail.com atenea.pug@gmail.com
23juana.gomez@PUCV.CL Rodrigo.fernandez@upm.es catalina.griffiths@pucv.cl
24ana.ruiz@upla.cl DELIA.ibacache@upla.cl
25maria.fernandez@UPM.ES
26
27Output
28gmail.com 4
29pucv.cl 2
30upla.cl 2
31upm.es 2
32//----------------------------------------------------------------------------------------------------------------------------------
33#define NULA -1
34#define ll_i long long int
35
36typedef struct Datos{
37 char secuencia[321];
38 ll_i coincidencias;
39
40}Datos;
41
42
43int compararNum(const void * a, const void * b){
44
45 Datos *pA = (Datos *) a;
46 Datos *pB = (Datos *) b;
47
48 if ( pA -> coincidencias < pB -> coincidencias)
49 return 1;
50 else
51 return 0;
52}
53
54int compararAlfa(const void * a, const void * b){
55
56 Datos *pA = (Datos *) a;
57 Datos *pB = (Datos *) b;
58
59 if ( (strcmp(pA -> secuencia , pB -> secuencia)) > 0 )
60 return 1;
61 else
62 return 0;
63}
64
65
66int esDominio(char *palabra){
67 if (strchr(palabra,'@') == NULL) return 0;
68 return 1;
69}
70
71
72ll_i buscar(Datos *vector, ll_i tamano, char *clave){
73 ll_i i;
74
75 for (i = 0 ; i < tamano ; i++){
76 if ( (strcmp(vector[i].secuencia, clave)) == 0){
77 return i;
78 }
79 }
80 return NULA;
81}
82
83void cortarMail(char *mail){
84 char cadenaAux[256] = "";
85 ll_i pos = (strchr(mail,'@') - mail)+1;
86 ll_i i;
87 ll_i largo = strlen(mail) - pos;
88
89 for(i = 0 ; i < largo ; i++){
90 cadenaAux[i] = mail[pos+i];
91 }
92
93 strcpy(mail,cadenaAux);
94}
95
96void dominiosYFrecuencia(FILE *entrada,FILE **salida){
97
98 Datos *vector = NULL; //vector dinámico
99 char mail[321];
100 ll_i cant_dominios = 0;
101 ll_i i;
102 ll_i pos;
103 ll_i largo;
104
105 while((fscanf(entrada,"%s",mail)) != EOF){ //JUANPEREZ@GMAIL.COM
106
107 if(esDominio(mail)){ //JUANPEREZ@GMAIL.COM ES CORREO?
108
109 largo = strlen(mail); //JUANPEREZ@GMAIL.COM (19)
110
111 for(i = 0; i < largo; i++){
112 mail[i] = tolower(mail[i]); //juanperez@gmail.com
113 }
114
115 cortarMail(mail); //Buscar caracter "@" y cortar la cadena ---> gmail.com
116
117 pos = buscar(vector,cant_dominios,mail);
118
119 if(pos == NULA){
120
121 vector = (Datos *) realloc(vector, sizeof(Datos)*(cant_dominios + 1));
122 if (vector == NULL)
123 exit(0);
124 strcpy(vector[cant_dominios].secuencia, mail);
125 cant_dominios++;
126 }
127 else{
128 vector[pos].coincidencias++;
129 }
130 }
131 }
132
133 qsort(vector, cant_dominios, sizeof(Datos),compararAlfa);
134 qsort(vector, cant_dominios, sizeof(Datos),compararNum);
135
136 for(i = 0 ; i < cant_dominios ; i++){
137 fprintf(*salida , "%s %lli\n", vector[i].secuencia, vector[i].coincidencias+1);
138 }
139}