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ú

Temas - 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.