Консультация № 189344
11.05.2016, 16:56
0.00 руб.
0 4 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Задание:
Написать функцию, которая меняет местами значения двух
переменных x и y.

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <windows.h>



using namespace std;

int change(int &x, int &y)// получение адреса
{
x = x + y;
y = x - y;
x = x - y;

return x, y;
}

int main()
{
setlocale(LC_ALL, "Russian");
int x, y;
cout << "Введите X: " << endl;
cin >> x;
cout << "Введите Y: " << endl;
cin >> y;
cout << "До обмена X: " << x << endl;
cout << "До обмена Y: " << y << endl;
change(x, y);
cout << "После обмена X: " << x << " После обмена Y: " << y << endl;
system("pause");
}



как сделать это через УКАЗАТЕЛИ?

Обсуждение

давно
Академик
20764
1861
11.05.2016, 17:10
общий
так вы и через ссылки сделали неверно.
void swap (double *x, double *y) {
double t = *x;
*x =*y;
*y = t;
}

Если нужна template function - это не намного сложнее.
давно
Посетитель
7438
7205
11.05.2016, 17:39
общий
11.05.2016, 19:16
Адресаты:
Во-первых, зачем double, в программе int ?
Во-вторых, через ссылки реализовано правильно, все там корректно
Мне, правда, больше нравится не с помощью +, -, а исключающего или
Единственно, возврат там лишний
void change(int &x, int &y)// получение адреса
{
x ^= y;
y ^= x;
x ^= y;
}
Через указатели:
void change(int *x, int *y)
{
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
Вызов:
change(&x, &y);
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Академик
20764
1861
11.05.2016, 21:47
общий
Адресаты:
а где сказано, что требуется int?
И вообще это трюкачество. Я сам этим грешу, но программы должны быть простыми и понятными. Тем более, что компиляторы C/C++ ОБЯЗАНЫ оптимизировать. По сути - додумывать за нас.
В данном случае сказано поменять - значит меняем и не пытаемся сэкономить 4 байта (2, 8,..) за счёт каких-либо вычислений. Тем более, что с арифметикой можно и нарваться. Если с целыми числами это скорее всего пройдёт даже если огрести по дороге переполнение, то с вещественными - точно будут сюрпризы.
давно
Посетитель
7438
7205
14.05.2016, 10:44
общий
это ответ
Здравствуйте, Посетитель - 399158!
Реализация через указатели:
Код:

void change(int *x, int *y)
{
*x = *x + *y;
*y = *x - *y;
*x = *x - *y;
}

Вызов:
Код:
change(&x, &y);


Обратите внимание, в исходной подпрограмме ошибка. Надо:
Код:

void change(int &x, int &y)// получение адреса
{
x = x + y;
y = x - y;
x = x - y;
}
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа