Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - arcanaer

#1
Programación C/C++ / Optimizar un codigo
23 Noviembre 2016, 04:16 AM
Hola, buenas noches, tengo este codigo, que lo que hace es abrir un archivo .txt sacar todas las palabras, quitar puntuaciones y solo contar de separadores lo que es .,();
Ahora tomar cada palabra, ordenarla alfabeticamente, y checar cuantas veces aparece en el arreglo, despues añadir las veces que aparece esa palabra.
entonces por ejemplo si tenemos http://pagina.unam.mx/cyp
la primera palabra seria
http://pagina    1
unam      1
mx/cpy    1

La primera es la palabra y la segunda las veces que aparece, pero cuando hablamos de mas de 100 000 palabras en el .txt el codigo se torna muy lento y se tarda aprox 5 min en arrojar resultados, alguien me podria ayudar a optimizarlo?

void Diccionario(char *szNombre, char szPalabras[][TAMTOKEN], int iEstadisticas[], int &iNumElementos)
{
//char szNombre[50];
//printf("Dame el nombre del archivo");
//scanf_s("%s", szNombre, 49);
FILE *libro;
fopen_s(&libro, szNombre, "r");
char palabra[TAMTOKEN];
char *palabra1;
char szPalabras1[NUMPALABRAS][TAMTOKEN];
int estad[NUMPALABRAS];
char *next = NULL;
int i, j, k, conta = 0;
int numpala;
int mayor[NUMPALABRAS];
char aux[100];
if (libro == NULL)
{
printf("No se pudo abrir el archivo");
}
else
{
i = 0;

while (!feof(libro))
{
fscanf_s(libro, "%s", palabra, 49);
_strlwr_s(palabra);
palabra1 = strtok_s(palabra, " ;,.)(", &next);
while (palabra1 != NULL)
{
//printf("%s\n", palabra1);
strcpy_s(szPalabras1[i], palabra1);
palabra1 = strtok_s(NULL, " ;,.)(", &next);
i++;
}
//strcpy_s(diccionario[i], palabra1);

//printf("%s\n", diccionario[i]);
//i++;

}
numpala = i;

// ORDENAR CADENAS
for (i = 0; i < numpala -1 ; i++)
{
k = i;
strcpy_s(aux, szPalabras1[i]);
for (j = i + 1; j < numpala; j++)
{
if (strcmp(szPalabras1[j], aux) < 0)
{
k = j;
strcpy_s(aux, szPalabras1[j]);
//permite hacer una copia auxiliar de la cadena szPalabras[j];
}
}
strcpy_s(szPalabras1[k], szPalabras1[i]);
strcpy_s(szPalabras1[i], aux);
}

for (i = 0; i < numpala; i++)
{
//printf("%s\n", diccionario[i]);

}

}
//ordenamos por estadisticas.
for (i = 0; i < numpala; i++)
{
estad[i] = 0;
for (j = 0; j < numpala; j++)
{
if (strcmp(szPalabras1[i], szPalabras1[j]) == 0)
{
estad[i]++;
}

}

}
i = 0;
while (i < numpala)
{
if (estad[i] != 1)
{
//printf("La palabra %s se repite %i veces\n", diccionario[i], esta[i]);
}
else
{
//printf("La palabra %s solo se encuentra una vez\n", diccionario[i]);
}

i = i + estad[i];
}
iNumElementos = 0;
for (i = 0; i < numpala; i++)
{
if (strcmp(szPalabras1[i], szPalabras1[i + 1]) != 0)
{
iNumElementos++;
}
}
//printf("%i\n", iNumElementos);

i = 0;

while (i < numpala)
{
mayor[i] = 0;
if (estad[i] != 1)
{
for (j = i; j < i + estad[i]; j++)
{

if (estad[j] >= mayor[i])
{
mayor[i] = estad[j];
}
else
{
mayor[i] = mayor[i];
}
}

}
else
{
mayor[i] = estad[i];

}
//imprimimos diccionario
//printf("%s %i\n", szPalabras[i], mayor[i]);
strcpy_s(szPalabras[conta], szPalabras1[i]);
iEstadisticas[conta] = mayor[i];
conta++;
i = i + estad[i];

}

fclose(libro);

}
#2
Programación C/C++ / Problema con strtok
21 Noviembre 2016, 07:01 AM
Hola trato de separar esta cadena con strtok pero me la epara mala alguien sabra por que?

2015(c)(DR Ana de la regada)
Http://aragon.unam.mx (anita) (lava la) tina. Esta, es una frase en la que Ana, palabra que por si misma constituye un palindromo (ana,  leido al reves tambien dice ana), se transforma en un frase que es un palindromo. Anis no es palindromo.

De ese texto me quita la letra c, lo que me imprime es 2015 ana de la regada

este es mi codigo
FILE *libro;
fopen_s(&libro, "libro.txt", "r");
char diccionario[TAMTOKEN][TAMPALABRA];
char palabra[TAMPALABRA];
char *palabra1;
char palabra2[TAMPALABRA];
char *next = NULL;
int i, j, k, k1;
int numpala;
int mayor[TAMTOKEN];
int esta[TAMTOKEN];
int larg;
char aux[100];
if (libro == NULL)
{
printf("No se pudo abrir el archivo");
}
else
{
i = 0;
while (!feof(libro))
{
fscanf_s(libro, "%s", palabra, 99);
//fgets(palabra, 99, libro);
palabra1 = strtok_s(palabra, " ;,.)(", &next);

strcpy_s(diccionario[i], palabra1);
_strlwr_s(diccionario[i]);
printf("%s\n", diccionario[i]);
i++;

}
#3
Programación C/C++ / Como entregar este programa?
21 Noviembre 2016, 02:15 AM
Buenas noches, estoy realizando un proyecto en c, ya lo tengo listo, pero el profesor me dijo que mi programa se debia ajustar a estas especificaciones, como puedo hacer para que el corrector.cpp se conecte con el corrector.h?
A las variables les debo de poner el mismo nombre que pide el profesor? o como llamo a las funciones prototipo del corrector.h?
Lo que no se es, si yo utilice otros nombres en mis variables debo modificarlas?
les dejo una foto y un segmento de mi codigo para que me digan que debo modificar para que funcione con las especificaciones del maestro, gracias.

#include <stdio.h>
#include "stdafx.h"
#include <string.h>
#include<windows.h>
#include <stdlib.h>

#define TAMTOKEN 70000
#define TAMPALABRA 100
void diccionario();
void ClonaPalabras();

void main(void)
{


diccionario();
ClonaPalabras();
system("pause");

}

void diccionario()
{

FILE *libro;
fopen_s(&libro, "libro.txt", "r");
char diccionario[TAMTOKEN][TAMPALABRA];
char palabra[TAMPALABRA];
char *palabra1;
char palabra2[TAMPALABRA];
char *next = NULL;
int i, j, k, k1;
int numpala;
int mayor[TAMTOKEN];
int esta[TAMTOKEN];
char aux[100];
if (libro == NULL)
{
printf("No se pudo abrir el archivo");
}
else
{
i = 0;
while (!feof(libro))
{
fscanf_s(libro, "%s", palabra, 99);
palabra1 = strtok_s(palabra, ";,.()", &next);

strcpy_s(diccionario[i], palabra1);
_strlwr_s(diccionario[i]);
//printf("%s\n", diccionario[i]);
i++;

}
numpala = i;

// ORDENAR CADENAS
for (i = 0; i<numpala - 1; i++)
{
k = i;
strcpy_s(aux, diccionario[i]);


MOD: Imagen adaptada a lo permitido.
#4
Hice un problema similar hace un tiempo, das el numero de cuenta de un alumno y este puede tener varias calificaciones, despues ordena las calificaciones mas altas y las imprime, es un programa un poco completo, te dejo el codigo para que lo cheques.

#include <stdio.h>
#include "stdafx.h"
#include <windows.h>

void main(void)
{
int dat, i, j, k1, aux;
int num[2000];
float cal[2000], aux1;
float mayor = 0;

//printf("Dame el numero de datos: ");
scanf_s("%i", &dat);
int k[2000];

for (i = 0; i < dat; i++)
{
//printf("Dame el numero de cuenta numero %i: ", i+1);
scanf_s("%i", &num[i]);
//printf("Dame la calificacion numero %i: ", i+1);
scanf_s("%f", &cal[i]);

}

for (i = 0;i<dat;i++)
{
for (j = 0;j<dat - 1;j++)
{
if (num[j] >= num[j + 1])
{
aux = num[j];
num[j] = num[j + 1];
num[j + 1] = aux;

aux1 = cal[j];
cal[j] = cal[j + 1];
cal[j + 1] = aux1;

}
}
}
//printf("Ordenados de manera Ascendente\n");
for (i = 0;i<dat;i++)
{
//printf("%i %f\n", num[i], cal[i]);
}
//printf("\n");
//printf("Ordenados de manera descendente\n");
for (i = dat - 1;i >= 0;i--)
{
//printf("%i %f\n", num[i], cal[i]);
}
for (i = 0;i<dat;i++)
{
k[i] = 0
;
for (j = 0;j<dat;j++)
{
if (num[i] == num[j])
{
k[i]++;
}

}

}
//printf("\n");
i = 0;
while (i<dat)
{
if (k[i] != 1)
{
//printf("El numero de cuenta %i se repite %i veces\n", num[i], k[i]);
}
else
{
//printf("El numero de cuenta %i solo se encuentra una vez\n", num[i]);
}

i = i + k[i];
}
//printf("\n");
k1 = 0;
for (i = 0;i<dat;i++)
{
if (num[i] != num[i + 1])
{
k1++;
}
}
//Programa realizado por Carlos Valdes
printf("%i\n", k1);
i = 0;
while (i<dat)
{
if (k[i] != 1)
{
for (j = i;j<k[i];j++)
{

if (cal[j] >= mayor)
{
mayor = cal[j];
}
else
{
mayor = mayor;
}
}
}
else
{
mayor = cal[i];
}
//checa que aqui se imprimen solo una calificacion, si se repite solo mostrara la mas alta
printf("%i %.2f\n", num[i], mayor);
i = i + k[i];
}
}



El programa puede tener un alumno repetido con varias calificciones distintas, las ordena y despues toma solo la calificacion mas alta de ese alumno y los imprime en orden de menor a mayor.
#5
Utiliza gets, scanf solo se utiliza para guardar datos hasta el nulo, y get hasta el primer enter o salto de linea.
Investiga sobre gets.

Suerte!