elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... 24
31  Programación / Programación C/C++ / Re: Tutorial de archivos en lenguaje C. - en: 15 Septiembre 2016, 02:42 am
Hola esta bien tu código pero me pregunto, necesitas un arreglo para almacenar los registro y otro del mismo tamaño para saber en que posición se encontrarían ordenados? siendo muy estrictos realmente no es un método de ordenamiento ya que los datos siguen como en su estado original.

Pero bueno tomemos tu algoritmo como valido y comparemoslo frente a otros algoritmos amplia-mente documentados y como serian bubble sort y Quick sort como se comporta

Para ello necesitamos algunas subrutinas que nos midan el tiempo de procesamiento de nuestros algoritmos lamentablemente hacer esto no siempre es muy preciso y depende del sistema operativo y arquitectura de la computadora donde se ejecuten estas pruebas.

La primera prueba que vamos a hacer es con tu algoritmo para ello lo encapsule en una función y decidí tomar algunas muestras

Código
  1. #include <stdio.h>
  2. #include<windows.h>
  3. #include <time.h>
  4.  
  5. double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b){
  6.    LARGE_INTEGER freq;
  7.    QueryPerformanceFrequency(&freq);
  8.    return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
  9. }
  10.  
  11.  
  12.  
  13. void rellenarOrdenarDatos(int numeros[],int ordenar[],int tamano){
  14.    int i,j,ingreso;
  15.    srand(time(NULL));
  16.  
  17.    for( i=0; i<tamano; i++){
  18.  
  19.        ingreso = rand()%100;
  20.        numeros[i]=ingreso;
  21.        ordenar[i] = 1;
  22.  
  23.        if(i>0){
  24.            j=0;
  25.            while(j<i){
  26.                if( ingreso < numeros[j] ){
  27.                    ordenar[j] += 1;
  28.                }
  29.                else{
  30.                    ordenar[i] += 1;
  31.                }
  32.                j++;
  33.            }
  34.        }
  35.    }
  36. }
  37.  
  38. int main()
  39. {
  40.    const int TAMANO=15000;
  41.    int *arreglo=malloc(sizeof(int)*TAMANO);
  42.    int *ordenar=malloc(sizeof(int)*TAMANO);
  43.  
  44.    LARGE_INTEGER t_ini, t_fin;
  45.    double secs;
  46.  
  47.    QueryPerformanceCounter(&t_ini);
  48.  
  49.    rellenarOrdenarDatos(arreglo,ordenar,TAMANO);
  50.  
  51.    QueryPerformanceCounter(&t_fin);
  52.  
  53.    secs = performancecounter_diff(&t_fin, &t_ini);
  54.    printf("%.16g milliseconds\n", secs * 1000.0);
  55.  
  56.    free(arreglo);
  57.    free(ordenar);
  58.  
  59.    return 0;
  60. }

Entre las muestras que obtuve fueron estos tiempos en milisegundos
Citar
937.9348
1006.7837
984.6807
917.7779
1013.7831
993.5917

Ahora la prueba con BubbleSort

Código
  1. #include <stdio.h>
  2. #include<windows.h>
  3. #include <time.h>
  4.  
  5. double performancecounter_diff(LARGE_INTEGER *a, LARGE_INTEGER *b){
  6.    LARGE_INTEGER freq;
  7.    QueryPerformanceFrequency(&freq);
  8.    return (double)(a->QuadPart - b->QuadPart) / (double)freq.QuadPart;
  9. }
  10.  
  11.  
  12.  
  13.  
  14. void rellenarArreglo(int numeros[],unsigned int tamano){
  15.    srand(time(NULL));
  16.    int i=0;
  17.  
  18.    for(i=0; i<tamano; i++)
  19.    {
  20.        int r = rand()%100+1;
  21.        numeros[i]=r;
  22.    }
  23. }
  24.  
  25. void bubbleSort(int numeros[],int tamano){
  26.    int i,j,temp;
  27.    for (i=1; i<tamano; i++){
  28.      for(j=0 ; j<tamano - 1; j++){
  29.         if (numeros[j] > numeros[j+1]){
  30.            temp = numeros[j];
  31.            numeros[j] = numeros[j+1];
  32.            numeros[j+1] = temp;
  33.         }
  34.      }
  35.    }
  36. }
  37.  
  38.  
  39.  
  40. int main()
  41. {
  42.    const int TAMANO=15000;
  43.    int *arreglo=malloc(sizeof(int)*TAMANO);
  44.  
  45.  
  46.    LARGE_INTEGER t_ini, t_fin;
  47.    double secs;
  48.  
  49.    QueryPerformanceCounter(&t_ini);
  50.  
  51.    rellenarArreglo(arreglo,TAMANO);
  52.    bubbleSort(arreglo,TAMANO);
  53.  
  54.    QueryPerformanceCounter(&t_fin);
  55.  
  56.    secs = performancecounter_diff(&t_fin, &t_ini);
  57.    printf("%.16g milliseconds\n", secs * 1000.0);
  58.  
  59.    free(arreglo);
  60.  
  61.  
  62.    return 0;
  63. }

Utilizando el algoritmo bubble sort el tiempo de procesamiento fue mas alto por ende menos optimo aproximadamente 1500 milsegundos en promedio, en este caso te debo los tiempos exactos

Por ultimo utilize el algoritmo Quick Sort y la diferencia fue abismal
El siguiente codigo es similar al anterior salvo por el metodo de ordenamiento

Código
  1. void qs(int lista[],int limite_izq,int limite_der)
  2. {
  3.    int izq,der,temporal,pivote;
  4.  
  5.    izq=limite_izq;
  6.    der = limite_der;
  7.    pivote = lista[(izq+der)/2];
  8.  
  9.    do{
  10.        while(lista[izq]<pivote && izq<limite_der)izq++;
  11.        while(pivote<lista[der] && der > limite_izq)der--;
  12.        if(izq <=der)
  13.        {
  14.            temporal= lista[izq];
  15.            lista[izq]=lista[der];
  16.            lista[der]=temporal;
  17.            izq++;
  18.            der--;
  19.  
  20.        }
  21.  
  22.    }while(izq<=der);
  23.    if(limite_izq<der){qs(lista,limite_izq,der);}
  24.    if(limite_der>izq){qs(lista,izq,limite_der);}
  25.  
  26. }
  27.  
  28. void quicksort(int lista[],int n)
  29. {
  30.    qs(lista,0,n-1);
  31. }
  32.  
  33.  
  34.  
  35. int main()
  36. {
  37.    const int TAMANO=15000;
  38.    int *arreglo=malloc(sizeof(int)*TAMANO);
  39.  
  40.  
  41.    LARGE_INTEGER t_ini, t_fin;
  42.    double secs;
  43.  
  44.    QueryPerformanceCounter(&t_ini);
  45.  
  46.    rellenarArreglo(arreglo,TAMANO);
  47.    quicksort(arreglo,TAMANO);
  48.  
  49.    QueryPerformanceCounter(&t_fin);
  50.  
  51.    secs = performancecounter_diff(&t_fin, &t_ini);
  52.    printf("%.16g milliseconds\n", secs * 1000.0);
  53.  
  54.    free(arreglo);
  55.  
  56.  
  57.    return 0;
  58. }

Aqui una lista de tiempos obtenidos
Citar
2.1082
2.2769
2.1349
2.1203
2.0972
2.1325

En promedio 2 mili-segundos el tiempo de procesamiento

En conclusion yo te recomendaria usar une metodo de ordenamiento ya que ademas de que evitas reservar memoria inecesaria el performance es mejor.

SI hay dudas o no estas de acuerdo con algo no dudes en hacermelo saber.
Saludos.... :silbar:




32  Programación / Programación C/C++ / Re: ¿Cómo poner opciones dentro de un case? en: 11 Septiembre 2016, 04:55 am
Hola creo te refieres a los switch anidados revisa este codigo

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.    int opcion;
  8.    cout<<"Escoga una opcion del 1 al 5"<<endl;
  9.    cin>>opcion;
  10.  
  11.    switch(opcion){
  12.        case 1:cout<<"Opcion 1"<<endl; break;
  13.        case 2:cout<<"Opcion 2"<<endl;break;
  14.        case 3:{
  15.            int opc;
  16.            cout<<"ingrese una opcion del 1 al 3" <<endl;
  17.            cin>>opc;
  18.            switch(opc){
  19.                case 1:cout<<"Opcion 1 interna"<<endl;break;
  20.                case 2:cout<<"Opcion 2 interna"<<endl;break;
  21.                case 3:cout<<"Opcion 3 interna"<<endl;break;
  22.                default: cout<<"Opcion interna incorrecta"<<endl;break;
  23.            }
  24.        }break;
  25.        case 4:cout<<"Opcion 4"<<endl; break;
  26.        case 5:cout<<"Opcion 5"<<endl; break;
  27.        default: cout<<"Opcion incorrecta"<<endl; break;;
  28.    }
  29.    return 0;
  30. }
  31.  

Espero te sirva saludos....
33  Programación / Programación C/C++ / Re: como asignar valores a una variable de tipo entero en c++ en: 9 Septiembre 2016, 05:46 am
La verdad si eres totalmente novato en programacion te animo seguir algun curso de programacion puedes empezar con este de jesus conde la verdad es simple

https://www.youtube.com/playlist?list=PLFDA837BC005D3614

PD: Ahi viene la respuesta
34  Foros Generales / Foro Libre / Re: Defendiendo a su Dueño, El Caballo Fiel en: 16 Agosto 2016, 04:59 am
Bueno  para gusto los colores hay gente que defiende la tauromaquia y otra que la critica lo cierto esto es que esto no se va a terminar en varios años y mientras siga habiendo una importante población que siga asistiendo a estos espectáculos lo mas probable es que  continúen, no se si es cultural o no pero  admito que me a mi gusta sera que porque he me he criado en un pueblo donde las rancherías abundan y estos eventos son de lo mas normal ademas que mucha gente se gana la vida con ello.  :silbar:
35  Programación / Programación C/C++ / Re: ¿Algun libro de GTK3? en: 23 Julio 2016, 20:57 pm
Te dejo el siguiente enlace https://ebooks-it.org/1590597931-ebook.htm no me hago responsables por los derechos de autor si algun moderador ve que infringí alguna regla pues que retire el enlace.

Saludos...
36  Programación / Programación C/C++ / Re: Problema con la función borrar en un arrays unidimensional [C++] en: 23 Julio 2016, 06:19 am
Jesusinfo  tienes que tener cuidado con la funcion borrar() esta tiene truco ya como ha dicho AlbertoBSD  tienes dos opciones o marcar que la casilla esta vacia o reacomodar las posciones del arreglo

Como te mecione en el post anterior yo prefiero utilizar struct porque son un poco mas flexibles y facilmente se le puede asignar un atributo que indique vacio u ocupado segun se necesite, bueno regresemos al problema para  saber la manera sencilla si una posicion esta vacia segun tu codigo es marcar la casilla con el numero -1 con este puede ser una marca para comprar si una casilla esta vacia  o no.

El otro problema que aparentemente podria ser una mejor opcion pero al mismo tiempo puedes ser un poco mas complicado es reacomodar las posiciones del arreglo.

Supongamos tu ingresas a N estudiantes digamos 5 cada uno con su valor que lo identifica

[1] [2] [3] [4] [5]

cada casilla obviamente esta asociado a N cantidad de calificaciones creo en este ejemplo son tambien 5


Bueno que pasa si el usuario decide eliminar al estudiante numero 3
Lo mas facil seria declararlo como vacio de esta forma

[1] [2] [-1] [4] [5]

Asi cuando imprimir a los estudiantes no existiria el numero 3, en ese momento al momento de marcarlo vacio estas dejando una posicion en desuso  tienes dos opciones al momento de agregar otro alumno el primer es recorrer todo el arreglo y econtrar una poscion vacia(marcada como -1) y anadir ahi al estudiante y la otra es anadir al final de la lista como se esta haciendo habitualmente ingnorando que estamos desperdiciando lugares y claramente memoria.


Por ultimo otra opcion que tenemos como dije mas arriba es reordenar el arreglo supongamos
tenemos esta lista originalmente

 
[1] [2] [3] [4] [5]
 
Eliminamos el tercero
[1] [2]  ? [4] [5]

Pero en vez de marcarlo como vacio con el numero -1 recorremos todo el arreglo haciendo esto

[1] [2] [4] [5]

Esto implica mover todas las casillas que se encuentra a la derecha una posicion anterior eso para un programa que tiene maximo 100 estudiantes no es nada pero imaginates si fueran cantidades mucho mas grandes y complejas la cosas ya no seria tan optima.

Entiendo que estas practicando y te animo ha que termines tu programa usando arreglos es una buena practica y te ayuda a pensar.
Pero seria bueno revisar vectores y  listas enlazada para que te des una idea que este problema se podria resolver de una manera mas simple no importando la cantidad de estudiantes.


Espero te sirva este choro que he escrito.
Saludos....




37  Programación / Programación C/C++ / Re: Problema con un Arrays unidimensional para almacenar n cantidad de notas [C++] en: 22 Julio 2016, 21:56 pm
Hola tienes varios problemas de entrada los nombres de las personas los estas manejando como enteros tienes dos opciones o manejarlos como string o un arreglo de char al ver que estas en C++ aconsejo los strings  otra cosa es que no estabas guardando correctamente las notas ya que las estabas  sobrescribiendo.

Al imprimir no recorrias correctamente los arreglos de notas y nombres de los estudiantes y por eso los datos no eran los correctos, bueno me di a la tarea de modificar tu programa y ya funciona pero tiene detalles.

Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void llenar (string  estudiantes[], int notas[]);
  6. void imprimir(string estudiantes[], int notas[]);
  7. int menu ();
  8.  
  9. //variables
  10. int num=0;
  11. int asignatura=5;
  12.  
  13. string estudiantes[100];
  14. int posicionesEstudiante=0;
  15.  
  16. int notas[100];
  17. int posicionNotas=0;
  18.  
  19. int main()
  20. {
  21.  
  22.    int opc;
  23.  
  24.    do
  25.    {
  26.        opc=menu();
  27.        switch (opc)
  28.        {
  29.        case 1:
  30.            llenar(estudiantes, notas);
  31.            break;
  32.        case 2:
  33.            imprimir(estudiantes, notas);
  34.            break;
  35.        case 3:
  36.            cout<<"\nADIOS"<<endl;
  37.            break;
  38.        }
  39.    }
  40.    while (opc !=3);
  41.    cin.get();
  42. }
  43.  
  44. void llenar (string estudiantes[], int notas [])
  45. {
  46.  
  47.    cout<<"Deme el numero de estudiante a insertar: "<<endl<<endl;
  48.    cin>>num;
  49.  
  50.    for(int i=0; i<=num-1; i++)
  51.    {
  52.        cout<<"\nDame el estudiante "<<i+1<<endl;
  53.        cin>>estudiantes[posicionesEstudiante];
  54.        for (int x=0; x<asignatura; x++)
  55.        {
  56.            cout<<"\nNota "<<x+1<<" del estudiante "<<i+1<<" :";
  57.            cin>>notas[posicionNotas];
  58.            posicionNotas++;
  59.  
  60.        }
  61.        posicionesEstudiante++;
  62.  
  63.    }
  64.  
  65. }
  66.  
  67. void imprimir (string estudiantes [], int notas [])
  68. {
  69.    int contador=0;
  70.    for(int i=0; i<=posicionesEstudiante-1; i++)
  71.    {
  72.        cout<<"\nESTUDIANTE "<<i+1<<endl<<endl;
  73.        cout<<estudiantes[i]<<endl<<endl;
  74.        for (int x=0; x<asignatura; x++)
  75.        {
  76.            cout<<notas[contador]<<endl;
  77.            contador++;
  78.        }
  79.  
  80.    }
  81.  
  82. }
  83.  
  84. int menu ()
  85. {
  86.    int opc;
  87.    cout<<"1.LLENAR\n2.IMPRIMIR\n3.SALIR"<<endl;
  88.    cin>>opc;
  89.    return opc;
  90. }
  91.  

Si quieres puedes reformular tu  programa y usar structs para poder tener una mejor abstraccion.
Ejemplo:
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. const int NUMERO_ASIGNTURAS=5;
  6.  
  7. struct Estudiante
  8. {
  9.    string nombre;
  10.    int asignaturas[NUMERO_ASIGNTURAS];
  11. };
  12.  
  13. int main(){
  14.  Estudiantes estudiantes[100];
  15.  
  16.  return 0;
  17. }
  18.  

Si sabes usar vector o listas enlazadas puedes sustuir los arreglos.
Si tienes dudas avisanos saludos...

38  Programación / Programación C/C++ / Re: Optimizar tamaño de estructura de Datos en: 22 Julio 2016, 20:46 pm
Si lo resuelves el problema estaría genial que publicaras como lo hiciste
Saludos...
39  Programación / Programación C/C++ / Re: Optimizar tamaño de estructura de Datos en: 22 Julio 2016, 19:30 pm
Creo que seria mejor un uint8_t ya que este vale 1 byte y el uint16_t  2 bytes

PD: Cual es el objetivo de optimizar el struct?
Saludos....
40  Programación / Java / Re: Hay forma de comprobar la pulsación de teclas en un determinado momento? en: 20 Julio 2016, 00:02 am
Personalmente para hacer juegos no me gusta mucho trabajar con las librerias estandar de java has probado con alguna de tercero que este enfocada a video juegos?

Bueno te recomiendo revisar el binding que hay de la libreria sfml
http://pdinklag.de/jsfml/

Tambien te dejo su wiki con ejemplos de uso
https://github.com/pdinklag/JSFML/wiki/Windows

Saludos.... :silbar:
Páginas: 1 2 3 [4] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ... 24
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines