Esta función es correcta respecto de la especificación del problema swap.
Ahora, cuando hago \(prueba(x,x)\), según veo, no hace lo que debería hacer, es decir, no cumple el asegura de la especificación para la que supuestamente es correcta, (deja a \(x\) en \(0\)) .
Acá está el código así prueban:
#include <iostream>
using namespace std;
void prueba(int &x, int &y);
void prueba(int &x, int &y) {
x = x + y;
y = x - y;
x = x - y;
}
int main()
{
int i = 5;
prueba(i,i);
cout << i << endl;
cout << "Hello world!" << endl;
return 0;
}
hola agustín, paso a responderte,
e problema en esa función es la siguiente,
al hacer la llamada a la función prueba vos lo que vos estas haciendo es pasarle un solo argumento a la función, no esta mal, pero tendrías que fijarte que "prueba recibe valores por referencia", esto significa que la variable i, que creaste en la función main, ahora en tu función prueba tiene 1 dirección para 3 nombres (una en main, y otras 2 en prueba), una para &x, y otra para &y.
veamos un poco, si i en main vale 5 => x en prueba vale 5 e y en prueba vale 5
al hacer la instrucción x = x + y, estas diciendo que la variable x que tiene la misma dirección que y valga 10.
al hacer la sig instrucción, y = x - y, estas diciendo que la variable y tome la diferencia entre x e y, pero x e y valen lo mismo porque las 2 tienen la misma dirección de memoria, por lo tanto x = y = 0. Esto lo pedes solucionar creando 2 variables en la función main, o sacando los ampersam de las funciones
Buen espero haberte ayudado. Saludos, xDD
Aca te dejo mi codigo:
#include<iostream>
using namespace std;
void prueba(int &x, int &y);
int main()
{
int i = 5;
int j = 5;
cout << "i vale: " << i << endl;
cout << "j vale: " << j << endl;
prueba(i,j);
cout << "despues de prueba" << endl;
cout << "i vale: " << i << endl;
cout << "j vale: " << j << endl;
return 0;
}
void prueba(int &x, int &y)
{
x = x + y;
y = x - y;
x = x - y;
}
Gracias Julian, igual mi duda era más por el hecho de que ponele que a vos te dan la especificación, esa función y esa demostración que puse yo, ok?, así a secas, te dan todo eso, y si te crees que está bien demostrada la correctitud, uno debería creer que todo eso anda, entonces se va a un lenguaje, pongamosle c++, y la usa. Después, resulta que si probás, (agarrás el código que puse y lo corrés, pasa lo que dije al hacer prueba(x,x) ). Mi duda era si la falla, más allá de la forma en que yo uso la función, está en el poder de expresión de nuestra especificación, o qué, porque sino me da la impresión de que puedo tener cosas, más allá de este caso, en la que demuestro que todo anda, y dps la uso, y en alguna particularidad falla por algún detalle.
En fín, lo consultaré también a los profesores cuando vuelvan las clases 🙂
Saludos
ahh, ok, igual deberias ver, que para que haya swap deben participar 2 variables, lo aclara la especificacion, y vos en este caso llamaste a la funcion prueba con una sola.
Igual, pregunta a los docentes, y publica su respuesta asi tambien nos sacas de la duda
Perdón por la necromancia, pero también me surgió la duda a mí.
Yo me convencí de que el error está en los "yE2 == y@E1".
O sea. Si decís que, ponele, "//estado 1; x = 1; //estado 2; // vale (x@estado2 == x@estado1 + 1) ^ (y@estado2 == y@estado1)", la parte donde estás mintiendo es al final. Estás diciendo que no estás cambiando y, sin embargo eso no se corresponde con el código que escribís (y la prueba tiene sentido solo si se corresponde con el código que escribís) - x e y son dos nombres distintos para la misma cosa, entonces es falso que "y@estado2 == y@estado1". La confusión está en que en ningún momento se menciona a y explícitamente, sin embargo cambia. Es como imaginarse que haya, al final de cada estado, un \(\forall\ estado \in estados, x@estado == y@estado\), y ahí se vería clara la contradicción.
Firma
Por qué los poetas usan integrales?
Porque Riemann.