Обмен значений переменных в Pascal
С клавиатуры вводятся два числа, каждое из которых присваивается своей переменной. После этого программа должна сама выполнять обмен значений переменных, то есть первой присваивать значение второй, а второй — значение первой; в конце выводить значения измененных переменных на экран.
Пример выполнения программы
3 45 x = 3, y = 45 x = 45, y = 3
Проблема обмена значений двух переменных заключается в том, что мы не можем непосредственно присвоить первой переменной значение второй, а потом второй — значение первой. Программа ниже содержит логическую ошибку:
var x, y: integer; begin readln(x); readln(y); writeln('x = ', x, ', y = ', y); x := y; y := x; writeln('x = ', x, ', y = ', y); end.
Дело в том, что когда выполняется выражение x := y, значение переменной x теряется. Теперь и переменная x, и переменная y связаны с одним и тем же значением. Тем, которое было изначально присвоено y. Поэтому когда выполняется следующее выражение (y := x), значение переменной y по-сути не меняется. Если выполнить программу выше и ввести числа 5 и 19, то получится такой результат:
5 19 x = 5, y = 19 x = 19, y = 19
Отсюда мы приходим к мысли, что необходима третья переменная. В нее мы будем сохранять значение первой переменной, и делать это перед тем, как оно будет утрачено. Вспомогательные переменные, предназначенные для временного хранения значений, принято называть буферными.
Алгоритм обмена значений двух переменных сводится к следующему:
- В буферной переменной сохраняется значение первой переменной.
- Первой переменной присваивается значение второй.
- Второй переменной присваивается значение буферной переменной, это значение равно исходному значению первой переменной.
Если b — это буферная переменная, тогда правильная программа на языке Паскаль может выглядеть так:
var x, y, b: integer; begin readln(x); readln(y); writeln('x = ', x, ', y = ', y); b := x; x := y; y := b; writeln('x = ', x, ', y = ', y); end.
Существует второй вариант решения данной задачи — арифметический. Этот способ позволяет избежать ввода в программу третьей переменной:
- Находим сумму значений обоих переменных и присваиваем ее первой переменной. Несмотря на то, что значение первой переменной теряется, оно учтено в сумме.
- Если из суммы вычесть значение второй переменной, то получим значение первой. Присвоим это значение второй переменной. Теперь мы теряем значение второй переменной. Однако оно учтено в сумме, которая присвоена первой переменной.
- Вычтем из суммы исходное значение первой переменной, которое теперь присвоено второй. Тем самым получим исходное значение второй переменной, которое присвоим первой.
var x, y: integer; begin readln(x); readln(y); writeln('x = ', x, ', y = ', y); x := x + y; {Теперь в X хранится сумма.} y := x - y; {Из суммы вычитают значение второй переменной. В результате получают исходное значение первой. Его присваивают переменной Y. Значение переменной Y изменилось.} x := x - y; {В Y хранится значение первой переменной. Его вычитают из суммы, которая хранится в X. В результате получают исходное значение второй переменной. Его присваивают переменной X.} writeln('x = ', x, ', y = ', y); end.