Problema con los punteros C++

Iniciado por 98Fran, 25 Agosto 2019, 16:47 PM

0 Miembros y 1 Visitante están viendo este tema.

K-YreX

Te pongo un caso más útil para que veas cómo se podrían usar los punteros a funciones. Imagina que vas a hacer un programa que ordene un array y quieres dar la posibilidad de ordenarlo ascendente y descendentemente. La primera opción que le vendría a cualquiera a la cabeza es esta:
Código (cpp) [Seleccionar]

void ordenarAscendente(int *numeros, int size){
    for(size_t i = 1; i < size; ++i)
        for(size_t j = 0; j < size-i; ++j)
            if(numeros[j] > numeros[j+1]){
                numeros[j] += numeros[j+1];
                numeros[j+1] = numeros[j] - numeros[j+1];
                numeros[j] -= numeros[j+1];
            }
}

void ordenarDescendente(int *numeros, int size){
    for(size_t i = 1; i < size; ++i)
        for(size_t j = 0; j < size-i; ++j)
            if(numeros[j] < numeros[j+1]){
                numeros[j] += numeros[j+1];
                numeros[j+1] = numeros[j] - numeros[j+1];
                numeros[j] -= numeros[j+1];
            }
}

Tenemos dos funciones que si ves siguen el mismo tipo de ordenamiento (un bubblesort muy simple :xD) pero una de forma ascendente y otra de forma descendente. Tampoco es demasiado trabajo pero imagina que queremos ordenar un array de 50 formas distintas, tendríamos que hacer 50 funciones iguales cambiando únicamente la condición de ordenamiento. Entonces podríamos hacer algo así:
Código (cpp) [Seleccionar]

bool mayor(int a, int b){
    return a > b;
}

bool menor(int a, int b){
    return a < b;
}

void ordenar(int *numeros, int size, bool (*orden)(int,int)){
    for(size_t i = 1; i < size; ++i)
        for(size_t j = 0; j < size-i; ++j)
            if(!orden(numeros[j], numeros[j+1])){
                numeros[j] += numeros[j+1];
                numeros[j+1] = numeros[j] - numeros[j+1];
                numeros[j] -= numeros[j+1];
            }
}

Y esto mismo lo podríamos hacer con otros tipos de ordenamiento. Es decir, hacemos una simple función que determine el tipo de orden a seguir y reutilizamos la función que tiene el algoritmo de ordenamiento.
Luego ya si nos venimos arriba le ponemos unos <template> a ese programa y ya podemos ordenar cualquier tipo de dato (primitivos/objetos) que tengan claro está los operadores que usemos sobrecargados (en este caso < y >). Tampoco quiero adelantarte contenidos, ya lo verás más adelante pero para que veas que conocer los recursos disponibles ayuda a ahorrar muchas líneas de código al programador.

PD: Ahí te he dejado también como curiosidad cómo intercambiar el valor de dos variables sin usar ninguna variable auxiliar.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

98Fran

#21
Hay algunas nomenclaturas que no entiendo como size_t, es de la libreria iostream?, yo de normal le pondría:
Código (cpp) [Seleccionar]
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
       //Aqui el ordenamineto burbuja
       }
}


O lo de ayer tambien con el sizeof, lo unico que se me ocurre es que sean clases por lo poco que he visto java, puede ser?.

PD: Estoy viendo las pilas y ya tengo la primera duda xD. No creo que sea un post tan largo como este pero estaría bien si le echas un vistazo  :xD :xD :xD.

MAFUS

size_t y sizeof son muy básicos: google te los encuentra enseguida. Los buscadores también son una buena herramienta.

Pero te lo respondo aquí:
size_t es un typedef de un entero largo sin signo. Depende de la plataforma.
sizeof es un operador que devuelve los bytes de un tipo o de un objeto.