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

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

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

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

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

  • Например, в переменной 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
Крутой веб-проект: симуляция нормального распределения на JavaScript
Крутой веб-проект: симуляция нормального распределения на JavaScript

Физика, статистика и математика в одном мощном проекте

medium
Что означает ошибка ValueError: invalid literal for int() with base 10
Что означает ошибка ValueError: invalid literal for int() with base 10

Что будет, если попытаться преобразовать в число то, что похоже на число, но им не является

easy
Пишем свой генератор паролей
Пишем свой генератор паролей

Готовый код с уникальным алгоритмом шифрования. Возьми и сделай.

medium
Поднимаем свой сайт на хостинге с нуля за 5 минут
Поднимаем свой сайт на хостинге с нуля за 5 минут

Объясняем в картинках, как это сделать

easy
Как сделать собственную программу-тудушку за 10 минут
Как сделать собственную программу-тудушку за 10 минут

Пошаговое руководство.

medium
Блокировщик соцсетей, который спасёт вашу продуктивность
Блокировщик соцсетей, который спасёт вашу продуктивность

И поднимет осознанность.

easy
medium