C/C++: Resolución al problema que planteó Ricardo I

En los comentario de «¿Quién me mandará a mi meterme en estas cosas?!?!«, Ricardo Varela planteó dos problemas.


El primero fue:


/*Y adicionalmente, porque tu horizonte mental se amplia si eres capaz de entender lo que hace esto:*/


char *dp = &dest[0], *sp = &src[0];

while(*sp != ‘’)

*dp++ = *sp++;

*dp = ‘’;


/*Jejeje, pues que sepa Ricardo, que lo entiendo y sino que me corrija a la explicación que daré ahora.*/


El segundo problema fue:


«como podemos intercambiar el valor de dos enteros sin usar una variable intermedia?»


/*A este segundo de momento no tengo solución, por eso he numerado este post, en cuanto la tenga publicaré «Resolución al problema que Ricardo planteó II» */


Pues aquí está la resolución al primer problema:


Este fragmento de código copia el contenido de la variable src a la variable dest, para ello debemos de tenerlas declaradas:


char src[11] = «HelloWorld!», dest[11];


Creamos dos punteros de tipo Char que apunten al primer carácter de cada variable:


char *dp = &dest[0], *sp = &src[0];


Con el siguiente bucle, mientras el carácter de *sp sea diferente de «» (el final de una cadena) el siguiente de dest será igual al siguiente de src.


while (*sp != «»)
*dp++ = *sp++;


Y por último terminamos la cadena:


*dp = «»;


Seguramente mi explicación no haya sido la correcta, ya que llevo poquito tiempo con C. Si me he equivocado en algo avisadme.


Y pronto tendréis respuesta al segundo problema.

3 thoughts on “C/C++: Resolución al problema que planteó Ricardo I

  1. Para el segundo problema yo si tengo la respuesta.

    int a, b;
    a = 1;
    b = 2;

    /* Para intercabiar los valores sin una variable intermedia haremos lo siguiente */

    a = a + b;
    b = a – b;
    a = a – b;

    /*Asi ya tenemos los valores cambiados*/

  2. Muy bueno! Dani. Ahora mi pregunta es la siguiente, yo no he usado ni Fortran ni Pascal, eso no se puede hacer en estos lenguajes? Porque yo creo que tanto en VB y C# si que se puede.

    Saludos

  3. estais hechos unos crases! }:D

    Eugenio, tu explicacion de la copia del array esta mas o menos bien, con un detalle: en realidad la copia funciona porque lo que estas haciendo es iterar todas las posiciones de la memoria, byte a byte, y copiandolas en la otra (porque la memoria de un array es contigua e incrementar un puntero lo que hace es darte la siguiente direccion de memoria), hasta que encuentras un fin de cadena… Esto es asi porque las cadenas son de char, 1 byte por posicion… sabrias como hacerlo para una cadena unicode, suponiendo que fuera similar?

    Y Dani, no es exactamente la solucion que tenia en mente, pero tu tambien lo has clavado… Esto funciona por matematicas simples of course
    x = x+y;
    y = (x+y)-y = x
    x = (x+y)-x = y

    Si es que las mates valen para todo, que te lo digo yo… pero lo que pasa es que yo estaba pensando en algo mas bien como esto:
    x = x ^ y;
    y = x ^ y;
    x = x ^ y;

    Que es algo muy sencillo con los bitwise operators de C (que se usan tambien para hacer divisiones, multiplicaciones y modulos de potencias de 2, por ejemplo… sabrias como?) y que no se como se hace en otros lenguajes… pero por cierto, lo mismo puedes hacer en Java y C++

Responder a dani Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *