Ayuda!!

Iniciado por Xenomorfo77, 8 Octubre 2013, 15:47 PM

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

Xenomorfo77

Buenas tengo que hacer un programa que le de la vuelta a un array pasandolo como argumento a una funcion. Lo tengo hecho y me sale el resultado bien pero creo k tiene fallos.¿Alguien puede echarle un vistazo? Gracias
Código (cpp) [Seleccionar]
#include <stdio.h>

#define POSITIONS 25

void create(int *pointer);
void print(int *pointer);
void turn(int *pointer);

int main()
{
    int numeros[POSITIONS];
    create(numeros);
    print(numeros);
    turn(numeros);
    print(numeros);


    return 0;
}

void create(int *pointer)
{
    int i;
    for(i=0;i<POSITIONS;i++)
    {
        *pointer++=i+10;
    }
}

void print(int *pointer)
{
    int i;
    for(i=0;i<POSITIONS;i++)
    {
        printf("%d\n",*pointer++);
    }

}

void turn(int *pointer)
{
    int i;
    int temp;
    for(i=0;i<POSITIONS;i++)
    {
        temp = *pointer;
        *pointer++ = *pointer+POSITIONS-i-1;
        *pointer = temp;
    }
   
}

ivancea96

Cumple su función.

¿Qué fallos crees que tiene?

eferion


*pointer++=i+10;

*pointer++ = *pointer+POSITIONS-i-1;


Vale que funcione pero, realmente es necesario tener código así?? Te ahorras una o dos líneas de código... realmente merece la pena?? La primera línea todavía... pero la segunda...

Tu piensa lo que te puede llegar a costar entender esto cuando vuelvas al código un par de meses después.

Xenomorfo77

#3
Cita de: eferion en  8 Octubre 2013, 16:08 PM

*pointer++=i+10;

*pointer++ = *pointer+POSITIONS-i-1;


Vale que funcione pero, realmente es necesario tener código así?? Te ahorras una o dos líneas de código... realmente merece la pena?? La primera línea todavía... pero la segunda...

Tu piensa lo que te puede llegar a costar entender esto cuando vuelvas al código un par de meses después.

¿Como lo harias tu? Gracias.




Cita de: ivancea96 en  8 Octubre 2013, 15:54 PM
Cumple su función.

¿Qué fallos crees que tiene?

La cosa es que lo he hecho pero nose ni como xD no me ha quedao claro lo que hago en turn()




Código (cpp) [Seleccionar]

for(i=0;i<POSITIONS;i++)
{
        temp = *pointer;
        *pointer++ = *pointer+POSITIONS-i-1;
        *pointer = temp;
}


1.- Guardo en temp el valor que haya en la direccion de memoria a la que apunta pointer.
2.- Al valor que haya en pointer le meto lo que haya en la ultima y despues se incrementa la posicion.
3.- Ahora a que posicion del array apunta pointer en esta linea?  En la primera ejecucion del for -> ¿0 o 1?

ivancea96

El metodo es bastante absurdo, pero bueno, funciona -.-'

Si os fijais, en "turn()", *pointer y temp van a ser siempre iguales a 10. Lo qhe haces es ir moviendo el 10 hacia adelante, mientras vas colocando en la posicion 'i', lo que hay en '25-i'.

eferion

Cita de: Xenomorfo77 en  8 Octubre 2013, 16:16 PM
¿Como lo harias tu? Gracias.

Simplifica las instrucciones. Al final el código tiene algunas líneas más, pero éstas son más claras.


// v1
*pointer++ = *pointer+POSITIONS-i-1;

//v2.1
*pointer = *pointer+POSITIONS-i-1;
pointer++;

//v2.2
*pointer += POSITIONS-i-1;
pointer++;


El mayor problema, aparte de dificultar la legibilidad del código, que presenta el concatenar operaciones es que es bastante sencillo meter la pata...


// v1
int a = a+b++;

// v2, decides poner un preincremento de b porque has leido que es mejor
int a = a+++b;

// es lo mismo?? respuesta: no
// en que se traduce a+++b?? respuesta: en (a++) + b


ivancea96

Cita de: eferion en  8 Octubre 2013, 17:00 PM

//v2.2
*pointer += POSITIONS-i-1;
pointer++;

Eso es erróneo. Así estás sumandole a esa casilla, la otra casilla. Sumando y asignando.

rir3760

Cita de: Xenomorfo77 en  8 Octubre 2013, 15:47 PMtengo que hacer un programa que le de la vuelta a un array pasandolo como argumento a una funcion.
Para invertir el array solo necesitas de un auxiliar y dos punteros (uno ya lo tienes, el parámetro de la función):
void turn(int *p)
{
   int *q;
   int aux;

   for (q = p + POSITIONS - 1; p < q; p++, q--){
      aux = *p;
      *p = *q;
      *q = aux;
   }
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

eferion

Cita de: ivancea96 en  8 Octubre 2013, 17:27 PM
Eso es erróneo. Así estás sumandole a esa casilla, la otra casilla. Sumando y asignando.

???

Esto:

*pointer++ = *pointer+POSITIONS-i-1;

Es equivalente a esto:

*pointer = *pointer+POSITIONS-i-1;
pointer++;


Y esto a su vez es equivalente a esto:

*pointer += POSITIONS-i-1;
pointer++;


¿ Dónde está el problema entonces ?

Yo te lo digo. El problema es escribir ese tipo de líneas, que generan confusión. Y aquí tienes la prueba.

rir3760

Cita de: Xenomorfo77 en  8 Octubre 2013, 16:16 PM
Código (cpp) [Seleccionar]
*pointer++ = *pointer+POSITIONS-i-1;

...

2.- Al valor que haya en pointer le meto lo que haya en la ultima y despues se incrementa la posicion.
Esa sentencia tiene dos problemas importantes.

El primero es aplicar indirección y solo entonces sumar "POSITIONS-i-1", la sentencia termina procesada de esta forma:
Código (cpp) [Seleccionar]
*pointer++ = (*pointer) + POSITIONS - i - 1;
Cuando debería ser:
Código (cpp) [Seleccionar]
*pointer++ = *(pointer + POSITIONS - i - 1);

El otro se debe al uso del operador "++" y las dos instancias del objeto "pointer" en la expresión:
Código (cpp) [Seleccionar]
*pointer++ = *(pointer + POSITIONS - i - 1);
   (1)  (2)    (3)

Es un problema porque los lenguajes C y C++ no definen el orden de evaluación de los operandos de una expresión. Dependiendo del orden en que estos se evalúen y el momento en que se aplique el efecto lateral del operador "++" se pueden obtener diferentes resultados.

Lo mejor aquí es seguir la recomendación de eferion evitando expresiones excesivamente complicadas.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language