Шаг 17.
Примеры линейных программ (первое "лирическое" отступление)

    На этом шаге мы немного "отдохнем" от теории, составляя несколько простых линейных программ.

    Задача 1. Даны две целые переменные a, b. Составить программу обмена значениями этих переменных.
Решение. Введем дополнительную переменную t и выполним следующие присваивания: t:=a; a:=b; b:=t;. Попытка обойтись без дополнительной переменной, написав: a:=b; b:=а; не приведет к цели (безвозвратно утрачивается значение переменной a):

Program Obm;
Var
   a, b, t:Integer;
Begin
   Write('Задайте два целых числа: ');
   ReadLn(a,b);
   WriteLn('Значения переменных до обмена.');
   WriteLn('a=',a,' b=',b);
   {Произведем обмен значений переменных.}
   t:=a;
   a:=b;
   b:=t;
   WriteLn('Значения переменных после обмена.');
   WriteLn('a=',a,' b=',b);
End. 
Текст этой программы можно взять здесь.

    Задача 2. Даны две целые переменные a, b. Составить программу обмена значениями этих переменных не используя дополнительных переменных и предполагая, что значениями целых переменных могут быть произвольные целые числа.
Решение.Существует несколько способов сделать это:

    а) a:=a+b; {В переменной a будет значение a+b, а значение b не изменится}
        b:=a-b; {В переменной b будет a, а значение a не изменится}
        a:=a-b; {В переменной b будет a, а в переменной a будет b}

Program Obm1;
Var
   a, b:Integer;
Begin
   Write('Задайте два целых числа: ');
   ReadLn(a,b);
   WriteLn('Значения переменных до обмена.');
   WriteLn('a=',a,' b=',b);
   {Произведем обмен значений переменных.}
   a:=a+b;
   b:=a-b;
   a:=a-b;
   WriteLn('Значения переменных после обмена.');
   WriteLn('a=',a,' b=',b);
End. 
Текст этой программы можно взять здесь.


Для всех ли значений (целых, вещественных) будет всегда "работать" такой вариант обмена? Если нет, то для каких значений переменных этот алгоритм не будет приводить к результату?
Ответ вы можете посмотреть здесь.



    б) можно использовать логическую операцию XOR (исключающее ИЛИ) (смотри таблицы 1 и 3 шага 14). Эта операция над двумя переменными в компьютере реализуется как побитовая операция над двоичным представлением чисел. Поэтому, в частности:

A XOR A = 0, A XOR B = B XOR A, A XOR 0 = A.

    Таким образом, решение может выглядеть так:
a:= a XOR b; {В переменной a a Xor b, а значение b не изменилось}
b:= a XOR b; {Значение a не изменилось, а значение b стало равно:}
                      {(a Xor b) Xor b = a Xor (b Xor b) = a Xor 0 = a}
a:= a XOR b; {Значение b не изменилось, а значение a стало равно:}
                      {(a Xor b) Xor a = b Xor (a Xor a) = b Xor 0 = b}

Program Obm2;
Var
   a, b:Integer;
Begin
   Write('Задайте два целых числа: ');
   ReadLn(a,b);
   WriteLn('Значения переменных до обмена.');
   WriteLn('a=',a,' b=',b);
   {Произведем обмен значений переменных.}
   a:=a xor b;
   b:=a xor b;
   a:=a xor b;
   WriteLn('Значения переменных после обмена.');
   WriteLn('a=',a,' b=',b);
End. 
Текст этой программы можно взять здесь.

    Надеемся, что вы получили представление о том, как создаются линейные программы. Следующий шаг будет посвящен созданию разветвляющихся программ.


Предыдущий шаг Содержание Следующий шаг