Ver Mensaje Individual
  #6 (permalink)  
Antiguo 30/11/2016, 17:11
Arcana
 
Fecha de Ingreso: mayo-2010
Mensajes: 185
Antigüedad: 14 años, 6 meses
Puntos: 2
Respuesta: Optimizar un codigo

Muchas gracias!!
Modifique un poco mi codigo y aumento mas la velocidad, pero necesito aun mas velocidad, ya he intentado con punteros como me dices, pero no me funciona, tal vez hago algo mal, el codigo queda asi:
Este es el codigo que funciona Normal.
Código:
void Diccionario(char *szNombre, static char szPalabras[][TAMTOKEN], static int iEstadisticas[], int &iNumElementos)
{
	FILE *libro;
	fopen_s(&libro, szNombre, "r");
	static char palabra[TAMTOKEN];
	char *palabra1;
	static char szPalabras1[NUMPALABRAS][TAMTOKEN];
static int estad[NUMPALABRAS];
	char *next = NULL;
	int i, j, k;
	int  conta = 0;
	int numpala = 0;
	static 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)
			{
				strcpy_s(szPalabras1[i], palabra1);
				palabra1 = strtok_s(NULL, " ;,.)(", &next);
				i++;
			}

		}
		numpala = i;

		// ORDENAR CADENAS
		int pos;
		for (i = 0; i < numpala;i++)
		{
			pos = i;
			strcpy_s(aux, szPalabras1[i]);
			while ((pos > 0) && (strcmp(aux, szPalabras1[pos - 1]) < 0))
			{
				strcpy_s(szPalabras1[pos], szPalabras1[pos - 1]);
				pos--;
			}
			strcpy_s(szPalabras1[pos], aux);
		}

	}
	iNumElementos = 0;
	//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]++;
			}

		}
		if (strcmp(szPalabras1[i], szPalabras1[i + 1]) != 0)
		{
			iNumElementos++;
		}
	}

	i = 0;

	while (i < numpala)
	{
		strcpy_s(szPalabras[conta], szPalabras1[i]);
		iEstadisticas[conta] = estad[i];
		conta++;
		i = i + estad[i];

	}

	fclose(libro);

}
Este es el codigo con punteros, me imprime los resultados, pero al parecer parece que solo imprime la ultima palabr del archivo o algo asi:
Código:
#include <stdio.h>
#include "stdafx.h"
#include <string.h>
#include<windows.h>
#include "corrector.h"
#include <stdlib.h>


void Diccionario(char *szNombre, static char szPalabras[][TAMTOKEN], static int iEstadisticas[], int &iNumElementos)
{
	FILE *libro;
	fopen_s(&libro, szNombre, "r");
	static char palabra[TAMTOKEN];
	char *palabra1;
	static char **szPalabras1;
static int estad[NUMPALABRAS];
	char *next = NULL;
	int i, j, k;
	int  conta = 0;
	int numpala = 0;
	static int mayor[NUMPALABRAS];
	char *aux;
	if (libro == NULL)
	{
		printf("No se pudo abrir el archivo");
	}
	else
	{
		i = 0;
		szPalabras1 = (char**)malloc(sizeof(char*) * NUMPALABRAS);
		while (!feof(libro))
		{
			fscanf_s(libro, "%s", palabra, 49);
			_strlwr_s(palabra);
			palabra1 = strtok_s(palabra, " ;,.)(", &next);
			while (palabra1)
			{
				szPalabras1[i] = palabra1;
				palabra1 = strtok_s(NULL, " ;,.)(", &next);
				i++;
			}

		}
		numpala = i;

		// ORDENAR CADENAS
		int pos;
		for (i = 0; i < numpala;i++)
		{
			pos = i;
			aux = szPalabras1[i];
			while ((pos > 0) && (strcmp(aux, szPalabras1[pos - 1]) < 0))
			{
				szPalabras1[pos]= szPalabras1[pos - 1];
				pos--;
			}
			szPalabras1[pos] =aux;
		}

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

		}
		if (szPalabras1[i] != szPalabras1[i + 1])
		{
			iNumElementos++;
		}
	}

	i = 0;

	while (i < numpala)
	{
		strcpy_s(szPalabras[conta], szPalabras1[i]);
		iEstadisticas[conta] = estad[i];
		conta++;
		i = i + estad[i];

	}

	fclose(libro);
}

Última edición por Arcana; 30/11/2016 a las 17:23