Опубликован: 08.04.2009 | Доступ: свободный | Студентов: 485 / 0 | Длительность: 17:26:00
Специальности: Программист
Лекция 1:

Переменные, выражения, присваивания

Ключевые слова: значение, значение переменной, целое число, оператор присваивания, константа, оператор выбора, вычитание, цикла, натуральное число, Произведение, операции, остаток, деление, mod, умножение, матрица, присваивание, инвариант, делитель, алгоритм Евклида, четность, алгоритм, рациональное число, числитель, сложение, square, R-квадрат, алгебра, Write, запись, неравенство, вещественное число, координаты, радиус, объединение, x-высота, программа, диапазон, функция, периодичность, коэффициенты, array, integer, массив, компонент, эквивалентность, максимум, сортировка, поле, прямоугольник, композиция, симметрия, длина, перестановка, схема Горнера, вычисленное значение, многочлен, арифметическая операция, команда, индукция, альтернатива, индекс, Паскаль, AND, Pascal, boolean, симметричность, пересечение, кратность, минимум, память, расстояние, поиск, отрезок, сумма элементов массива, игра, таблица, индуктивная функция, SUM, индуктивная функция, значение функции, индуктивное расширение, индуктивное расширение функции, индуктивное Расширение функции

1.1. Задачи без массивов

1.1.1. Даны две целые переменные a, b. Составить фрагмент программы, после исполнения которого значения переменных поменялись бы местами (новое значение a равно старому значению b и наоборот).

Решение. Введем дополнительную целую переменную t.

t := a; 
a := b; 
b := t;

Попытка обойтись без дополнительной переменной, написав

a := b; 
b := a;

не приводит к цели (безвозвратно утрачивается начальное значение переменной a ).

1.1.2. Решить предыдущую задачу, не используя дополнительных переменных (и предполагая, что значениями целых переменных могут быть произвольные целые числа).

Решение.Начальные значения a и b обозначим a0, b0.

a := a + b; {a = a0 +  b0, b = b0} 
b := a - b; {a = a0 + b0, b = a0} 
a := a - b; {a = b0, b = a0}

1.1.3. Дано целое число а и натуральное (целое неотрицательное) число n. Вычислить a^n. Другими словами, необходимо составить программу, при исполнении которой значения переменных а и n не меняются, а значение некоторой другой переменной (например, b ) становится равным a^n. (При этом разрешается использовать и другие переменные.)

Решение. Введем целую переменную k, которая меняется от 0 до n, причем поддерживается такое свойство: b = a^k ).

k := 0; b := 1; 
{b = a в степени k} 
while k <> n do begin 
| k := k + 1; 
| b := b * a; 
end;

Другое решение той же задачи:

k := n; b := 1; 
{a в степени n = b * (a в степени k)} 
while k <> 0 do begin 
| k := k - 1; 
| b := b * a; 
end;

1.1.4.Решить предыдущую задачу, если требуется, чтобы число действий (выполняемых операторов присваивания) было порядка log n (то есть не превосходило бы C log n для некоторой константы C ; log n - это степень, в которую нужно возвести 2, чтобы получить n ).

Решение. Внесем некоторые изменения во второе из предложенных решений предыдущей задачи:

k := n; b := 1; c:=a; 
{a в степени n = b * (c в степени k)} 
while k <> 0 do begin 
| if k mod 2 = 0 then begin 
| | k:= k div 2; 
| | c:= c*c; 
| end else begin 
| | k := k - 1; 
| | b := b * c; 
| end; 
end;

Каждый второй раз (не реже) будет выполняться первый вариант оператора выбора (если k нечетно, то после вычитания единицы становится четным), так что за два цикла величина k уменьшается по крайней мере вдвое.

1.1.5.Даны натуральные числа а, b. Вычислить произведение a\cdot b, используя в программе лишь операции +, -, =, <>.

Решение.

k := 0; c := 0; 
{инвариант: c = a * k} 
while k <> b do begin 
| k := k + 1; 
| c := c + a; 
end; 
{c = a * k и k = b, следовательно, c = a * b}

1.1.6. Даны натуральные числа а и b. Вычислить их сумму а+b. Использовать операторы присваивания лишь вида

\begin{align*}
  \langle\text{переменная1}\rangle&\mathbin{\texttt{:=}}\langle\text{переменная2}\rangle, \\
  \langle\text{переменная}\rangle &\mathbin{\texttt{:=}}\langle\text{число}\rangle,       \\
  \langle\text{переменная1}\rangle &\mathbin{\texttt{:=}}\langle\text{переменная2}\rangle + 1.
\end{align*}
\end{problem}

Решение.

... 
 {инвариант: c = a + k} 
  ...