Пишем код: как поменять местами значения переменных

Что делать, если третью переменную использовать нельзя.

Пишем код: как поменять местами значения переменных

Эта задача — мини-практика для тех, кто уже освоился в программировании и хочет попробовать свои силы в решении настоящих задач. 

Представьте такое: вы пишете код для брелока от управления охраной всего дома. Памяти в таких брелоках мало, каждый байт на вес золота. Ваша задача — поменять местами числовые значения в двух переменных:

  • Например, в переменной A хранится число 3, а в переменной B — число 5.
  • Нужно сделать так, чтобы в A оказалось 5, а в B — 3.

Как это сделать, если можно использовать только эти две переменные? Третью временную переменную использовать нельзя, чтобы не занимать лишнюю память.

Решение

Те, кто только начинают осваивать программирование, могут написать такой код:

A = B;

B = A;

Но мы с вами уже сразу видим, в чём здесь ошибка: как только мы напишем A = B, то мы потеряем значение переменной A. Дело в том, что после такого присваивания значение B будет лежать в обеих переменных, и значение A будет уже недоступно. Для проверки запустим код в браузере:

var a = 3;
var b = 5; 
console.log("До перестановки: a = " + a + ", b= " + b );
a = b;
b = a;
console.log("После перестановки: a = " + a + ", b= " + b );
Пишем код: как поменять местами значения переменных

Видно, что значение переменной A потерялось и у нас теперь два одинаковых значения B.

Наша задача — где-то хранить одновременно и A и B, чтобы можно было разложить их по нужным переменным. Проверим, сработает ли этот подход, если у нас всего две переменные.

Положим в переменную A сумму A и B:

A = A + B; // теперь у нас в A лежит сумма, а B по-прежнему хранит своё значение.

Теперь сделаем хитрость: положим в B начальное значение A. Получить его просто — достаточно из суммы, которая сейчас хранится в A, вычесть B:

B = A − B; // сейчас в B появилось старое значение A, которое мы получили вычитанием из общего результата.

Нам осталось вернуть старое значение B. Но раз у нас есть их сумма и уже готовое значение A, мы можем просто вычесть его из суммы и получить B:

A = A − B; // в A появилось старое значение B, которое мы получили из первоначальной суммы.

Проверим наш код в браузере:

var a = 3;
var b = 5; 
console.log("До перестановки: a = " + a + ", b= " + b );
a = a + b;  // теперь у нас в A лежит сумма, а B по-прежнему хранит своё значение
b = a - b; // сейчас в B появилось старое значение A, которое мы получили вычитанием из общего результата
a = a - b// в A появилось старое значение B, которое мы получили из первоначальной суммы
console.log("После перестановки: a = " + a + ", b= " + b );
Пишем код: как поменять местами значения переменных
Работает!

В следующий раз попробуем задачу посложнее, а пока попробуйте сделать то же самое, но не используя сложение и вычитание. И помните, что памяти в брелоке мало, другие переменные использовать нельзя.

Обложка:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Маша Климентьева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
А вы читали это?
Подключаем нейросеть к веб-камере
Подключаем нейросеть к веб-камере

Готовьтесь — искусственный интеллект уберёт вас из кадра.

medium
Создаём собственный таймер-напоминалку
Создаём собственный таймер-напоминалку

Таймеров и трекеров полно, но мы сделаем такой, какой нужен именно вам. Это легко.

medium
Делаем свой таймер на Python
Делаем свой таймер на Python

Код — проще, возможностей — больше.

easy
Простейший генератор текста на цепях Маркова
Простейший генератор текста на цепях Маркова

Выдаёт любой текст на любую тему.

medium
Matplotlib: полное руководство по визуализации данных
Matplotlib: полное руководство по визуализации данных

Разбираем построение графиков с примерами

hard
[1] + [2] – [3] = 9. Да как так-то?
[1] + [2] – [3] = 9. Да как так-то?

Объясняем, как работает JavaScript

medium
Что означает ошибка TypeError: int object is not iterable
Что означает ошибка TypeError: int object is not iterable

Это когда мы используем цикл for с числом

easy
Интеграл в математике: что это и как его понять
Интеграл в математике: что это и как его понять

(и в программировании)

medium
Фуллстек-проект: пишем серверную часть страницы авторизации на PHP
Фуллстек-проект: пишем серверную часть страницы авторизации на PHP

Самое сложное и интересное

hard
medium