Обмен двух переменных
Обмен значений двух переменных — частая задача в программировании, например при сортировке. Начнём в main, без функции. Сначала всё кажется простым:
int a = 3;
int b = 8;
a = b;
b = a;
std::cout << a << " " << b << std::endl;Это выводит:
8 8Инструкция a = b; затёрла исходное значение a, то есть 3, и оно потерялось. Это как поменять местами напитки в двух полных стаканах: нужен третий, пустой. В программе такой стакан — вспомогательная переменная, в которую сначала записывают исходное значение a:
int a = 3;
int b = 8;
int temp = a;
a = b;
b = temp;
std::cout << a << " " << b << std::endl;Это выводит:
8 3Функция делает это так же, но ей нужно изменить обе переменные вызывающего кода. Поэтому оба параметра — ссылки. Если бы один из них не был ссылкой, функция изменила бы только свою копию, и обмен бы не получился. В стандартной библиотеке есть и готовая функция обмена, std::swap(a, b) (из библиотеки <utility>). Теперь вы знаете, как она устроена внутри.
Ссылки умеют и другое: через них функция может отдать несколько результатов, тогда как return отдаёт только одно значение. Эта функция делит конфеты между детьми и сохраняет в двух ссылках, сколько получает каждый ребёнок и сколько конфет остаётся:
#include <iostream>
void share(int candies, int children, int& each, int& leftOver) {
each = candies / children;
leftOver = candies % children;
}
int main() {
int each = 0;
int leftOver = 0;
share(17, 5, each, leftOver);
std::cout << "Каждому ребёнку: " << each << ", осталось: " << leftOver << std::endl;
return 0;
}Это выводит:
Каждому ребёнку: 3, осталось: 2Первые два параметра функция только читает, поэтому это обычные параметры, и в них можно передавать числа. В последние два она записывает, поэтому это ссылки, и в них нужно передавать переменные.
Задание
- 1
На месте первого комментария напишите функцию
swapValues, которая принимает две ссылки наintи меняет их значения местами. - 2
В
main, на месте комментария между двумя строками вывода, вызовитеswapValuesи передайте ей переменныеfirstиsecond. Программа выведет3 8, а затем8 3. - 3
Под
swapValuesнапишите функциюsortPair, которая тоже принимает две ссылки наint. Если в первом параметре число больше, чем во втором, она вызываетswapValues, чтобы поменять их местами. Так в первом параметре всегда оказывается меньшее число. Ссылки можно передавать дальше:swapValuesвнутриsortPairменяет переменные изmain. На месте последнего комментария вызовитеsortPair(x, y). Последняя строка вывода тогда будет4 9.