Root /ArchiveAbout
()

Оператор присваивания

Оператор присваивания

На страницах Введение в Pascal и Проценты в банке мы рассмотрели простейшие программы, написанные на Паскале в среде PascalABC.Net. Там мы производили арифметические действия над числами, а потом выводили их с помощью оператора write(или writeln). Но мы не использовали очень часто встречающегося в программировании оператора – присваивания. Так что это такое – присваивание?

Рассмотрим некоторые переменные M и N, имеющие определенные значения, скажем, M = 12, N = 34. Под каждую из этих величин компьютер выделяет отдельный участок памяти, представляющий собой некоторое количество ячеек, или битов (1 ячейка = 1 бит). Несколько чисел (или другой тип данных) не могут храниться в одном и том же месте памяти по той же причине, по которой два литра воды нельзя вместить в одну литровую банку.

Очень часто возникает необходимость сделать так, чтобы значение переменной M, равное 12, было удалено, а вместо этого стало равно значению переменной N, то есть 34. Что делает компьютер? Он находит место памяти, куда «спрятано» значение величины N, копирует его (число 34), возвращается к месту хранения M (равному 12), удаляет его значение и вставляет новое, то есть 34. В результате M = 12 превратилось в M = 34.

Присваивание – это запись данных в участок памяти компьютера, отведенной для значения величины M, тех данных, которые хранятся в другом участке памяти компьютера, где записано значение величины N.

Присваивание записывается как M := N, означающее, что значение N переходит к M. Встает естественный вопрос: а что случилось с величиной N? Ничего, она просто как бы «поделилась» значением с переменной M, а сама не изменилась. Иногда новички в программировании думают, что переменные M и N меняются значениями, но это не так. Для иллюстрации этого явления рассмотрим задачу:

Задача. Дано числа: M = 12, N = 34. Поменять их значения местами.

Нам надо числу M присвоить 34, а числу N присвоить 12 (наоборот). Очень часто начинающие программисты пишут так:

begin
.......
  M := N; { в итоге M = 34, поскольку N = 34 }
  N := M; { в итоге N = 12, так как M = 12 }
.......
end.

В первой строчке кода M присваивается N, то есть M := 34. Во второй строчке N присваивается M, но последняя переменная уже не равна 12, так как изменила свое значение в предыдущей строке на 34. Поэтому обе переменные окажутся равными 34. Для демонстрации напишем полностью код, который Вы должны переписать в среду программирования PascalABC.Net:

var
  M, N: integer;

begin
  writeln('Введите числа M и N:');
  write(' M = ');
  readln(M); { <-- вводим 12 }
  write(' N = ');
  readln(N); { <-- вводим 34 }
  M := N; { <== M присваивается N, поэтому M = 34 }
  N := M; { <== N присваивается M, поэтому N = 34 }
  writeln('Результат:');
  writeln(' M = ', M, ' N = ', N);
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Запустите программу на выполнение; при запросе M введите 12, для N укажите 34 и нажмите Enter. Если всё сделано правильно, то Вы должны увидеть:

Введите числа M и N: M = 12 N = 34Результат: M = 34 N = 34

Как видно из последней строчки, это не то, что мы хотели – поменять значения M и N местами.

Чтобы добиться правильного результата, надо зафиксировать первоначальное значение переменной M, например, s := M ("запомнить" М, записав его значение в переменную s). В результате будем присваивать числу N не значение переменной M, которая уже изменилась, а использовать равную ей величину s:

begin
.......
  s := M  { <== запоминаем M, равное 12 }
  M := N; { M = 34, поскольку N = 34 }
  N := s; { N = 12, так как s = 12 }
.......
end.

В соответствии с последними изменениями, предыдущая программа примет вид:

var
  M, N, s: integer;

begin
  writeln('Введите числа M и N:');
  write(' M = ');
  readln(M); { <-- вводим 12 }
  write(' N = ');
  readln(N); { <-- вводим 34 }
  s := M; { <== запоминаем M, равное 12 }
  M := N; { M = 34, поскольку N = 34 }
  N := s; { N = 12, так как s = 12 }
  writeln('Результат:');
  writeln(' M = ', M, ' N = ', N);
  readln
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 Перепишите эту программу в PascalABC.Net и запустите (кнопка F9 на клавиатуре). Если ответ будет таким:

Введите числа M и N: M = 12 N = 34Результат: M = 34 N = 12

то программа работает правильно. Как видно из последней строчки, значения чисел M и N поменялись местами.