· 8 years ago · Nov 25, 2017, 09:24 PM
1/* Top level domain:
2
3Twitter desea hacer una segmentación según el dominio de nivel superior (Top Level Domain TLD) de las cuentas de correo electrónico con la que se registraron sus usuarios. 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, y el dominio de nivel superior es lo que va después del último punto en este caso com.
4
5Tu 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 Twitter y escriba en un archivo de salida un listado con todos los dominios de nivel superior diferentes encontrados y la cantidad de usuarios que se registraron con cuentas de correo electrónico que incluyen ese TLD.
6
7El prototipo de esta función es :
8
9void TLDYFrecuencia(FILE *entrada,FILE **salida);
10
11Esta función recibe :
12
13entrada : 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.
14salida : 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 TLD's deben ser ordenados por su frecuencia (de mayor a menor). Si existen frecuencias iguales, entonces los TLD's 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.
15NOTAS IMPORTANTES:
16
17Considera 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.
18NO SE CONOCE el total de direcciones de correo electrónico registrados, por lo tanto debes usar vectores dinámicos para almacenar los TLD's diferentes.
19Puedes incluir otras funciones que consideres necesarias para resolver el problema.
20Puedes incluir la definición de MACROS y nuevos tipos de datos (por ejemplo struct), si lo consideras necesario.
21
22Casos de pruebas:
23
24INTPUT OUTPUT
25--------------------------------------------------------------------------------------
26JUANPEREZ@GMAIL.COM ana@gmail.com cl 4
27pedro.piedra@gmail.com atenea.pug@gmail.com com 4
28juana.gomez@PUCV.CL Rodrigo.fernandez@upm.es es 2
29catalina.griffiths@pucv.cl
30ana.ruiz@upla.cl DELIA.ibacache@upla.cl
31maria.fernandez@UPM.ES
32--------------------------------------------------------------------------------------
33
34CÓDIGO:
35*/
36
37typedef long long int ill;
38
39typedef struct datos{
40 char dominio[256];
41 ill frecuencia;
42}datos;
43
44void cortarMail(char *mail){
45 char cadenaAux[256] = "";
46 ill pos = (strchr(mail,'@') - mail)+1;
47 ill i;
48 ill largo = strlen(mail) - pos;
49
50 for(i = 0 ; i < largo ; i++){
51 cadenaAux[i] = mail[pos+i];
52 }
53
54 strcpy(mail,cadenaAux);
55}
56
57void cortar(char *mail){
58 char cadenaAux[256] = "";
59 ill pos = (strchr(mail,'.') - mail)+1;
60 ill i;
61 ill largo = strlen(mail) - pos;
62
63 for(i = 0 ; i < largo ; i++){
64 cadenaAux[i] = mail[pos+i];
65 }
66
67 strcpy(mail,cadenaAux);
68}
69
70void cortarPuntos(char *cadenita)
71{
72 while(strchr(cadenita, '.') != NULL)
73 {
74 cortar(cadenita);
75 }
76}
77
78void minuscula(char *cadenita)
79{
80 ill i;
81 ill largo = strlen(cadenita);
82
83 for(i=0 ; i<largo ; i++)
84 {
85 cadenita[i] = tolower(cadenita[i]);
86 }
87}
88
89ill buscar(datos *punt, ill tamano, char *clave){
90 ill i;
91
92 for(i=0; i<tamano; i++)
93 {
94 if((strcmp(punt[i].dominio, clave)) == 0) return i;
95 }
96 return -1;
97}
98
99int compararAlph(const void *a, const void* b)
100{
101 datos *ptr_a= (datos *)a;
102 datos *ptr_b= (datos *)b;
103
104 if((strcmp(ptr_a->dominio, ptr_b->dominio)) >0)
105 {
106 return 1;
107 }
108 else
109 {
110 return 0;
111 }
112}
113
114int compararNum (const void *a, const void* b)
115{
116 datos *ptr_a= (datos*)a;
117 datos *ptr_b= (datos*)b;
118
119 if(ptr_a-> frecuencia < ptr_b->frecuencia)
120 {
121 return 1;
122 }
123 else
124 {
125 return 0;
126 }
127}
128
129void TLDYFrecuencia(FILE *entrada,FILE **salida)
130{
131 datos *puntero= NULL;
132 ill tamano= 0 ;
133 char cadena[321];
134 ill i;
135 ill posicion;
136 while(fscanf(entrada, "%s", cadena) != EOF)
137 {
138 cortarMail(cadena);
139 cortarPuntos(cadena);
140
141 minuscula(cadena);
142 posicion= (buscar(puntero, tamano, cadena));
143
144 if(posicion == -1)
145 {
146 puntero= (datos *) realloc(puntero, sizeof(datos)*(tamano+1));
147 strcpy(puntero[tamano].dominio, cadena);
148 puntero[tamano].frecuencia= 1;
149 tamano++;
150 }
151 else
152 {
153 puntero[posicion].frecuencia++;
154 }
155 }
156 qsort(puntero, tamano, sizeof(datos), compararAlph);
157 qsort(puntero, tamano, sizeof(datos), compararNum);
158
159 for(i=0; i<tamano; i++)
160 {
161 fprintf(*salida, "%s %llu\n", puntero[i].dominio, puntero[i].frecuencia);
162 }
163}