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

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

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

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

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

  • Например, в переменной 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

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

easy
Что общего у игральных кубиков и нормального распределения

Чем больше кубиков — тем идеальнее график

medium
Что означает ошибка TypeError: Object prototype may only be an Object or null

Иногда нужно добавить «ничего», чтобы всё сработало

easy
Подключаем к сайту орфокорректор. Орфонейрокорректор!

Пишите как угодно — нейронка никому не расскажет.

hard
Что означает ошибка TypeError: Reduce of empty array with no initial value

Когда хочется что-то сделать с массивом, а он и так пустой

easy
Ваш собственный телеграм-секретарь: делаем вместе

Пошаговая инструкция для тех, кому нужен секретарь.

easy
Как сгенерировать нейросетью любые картинки

А также каким будет Half-Life 3

medium
medium
[anycomment]
Exit mobile version