Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011_12 Комп.Науки_2сем.doc
Скачиваний:
4
Добавлен:
13.09.2019
Размер:
476.67 Кб
Скачать

19.9.Задача о Ханойских башнях

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

  • перемещать можно только один диск;

  • на диске меньшего диаметра нельзя помещать диск большего диаметра.

Трудолюбивые буддийские монахи день и ночь переносят диски со стержня на стержень. Легенда утверждает, что когда монахи закончат свою работу, наступит конец света. Для решения задачи с 64 дисками потребуется (264 – 1) перемещений. Поэтому конец света по легенде произойдет по истечении более 5 миллиардов веков, если считать, что один диск перемещается за одну секунду. Задачу и легенду для неё придумал в 1883 г. французский математик Э. Люка.

program Towers;

{Перемещение с А на С, В - промежуточный}

var N : integer; {число дисков}

procedure Move(n:byte; A, C, B : char);

begin

if n=1 then writeln(A,’->’, C)

else begin

Move(n-1, A, B, C);

writeln(A,’->’, C);

Move(n-1, B, C, A)

end

end;

begin

write(’Число дисков=’); readln(N);

Move(N, ’A’, ’C’, ’B’)

end.

20.Указатели

20.1.Указательные типы

Указателем называется переменная указательного типа, в которой хранится адрес некоторого объекта (например, переменной). Говорят, что указатель указывает или ссылается на другую переменную.

Указатель занимает в памяти 4 байта.

Нулевой указатель – это указатель, который не ссылается ни на какой объект.

Для его обозначения служит константа Nil.

В языке Pascal различают два вида указателей:

  1. бестиповые указатели, которые могут содержать адреса переменных любого типа. Они объявляются через стандартный указательный тип pointer, например: var p:pointer;

  2. типизированные указатели, которые могут указывать на переменные только определенного типа; этот тип называется базовым типом для этих указателей. Далее будем рассматривать только типизированные указатели.

Описание типизированного указателя

  • С предварительным описанием пользовательского указательного типа type TPint = ^integer; //Указательный тип для ссылки на значения типа integer var pint : TPint; //Типизированный указатель типа TPint

  • Без описания имени типа var pint:^integer; //Типизированный указатель безымянного типа на значения типа integer

20.2.Операции с указателями

1. Взятие адреса @ имя_переменной

var x:integer; r:real;

p:^integer; //Типизированный указатель на значения типа integer

… p:=@x; //Указатель хранит адрес переменной x

p:=@r; //Это присваивание некорректно из-за несовпадения типов

2. Разыменование имя_переменной^

Разыменованный указатель p^ – это объект (место в памяти), на который указывает указатель.

Например, к переменной x можно обратиться либо непосредственно, либо через указатель p на x:

p:=@x;

x:=1; write(x,’ ’,p^); //Получим 1 1

p^:=2; write(x,’ ’,p^); //Получим 2 2

Замечание. Операции @ и ^ взаимообратны:

@(p^)=p и (@x)^=x

3. Сравнение на равенство =, сравнение на неравенство <>

Сравниваемые указатели должны быть одного и того же типа.

Операции сравнения проверяют, ссылаются ли два указателя на один и тот же адрес памяти.

if p1=p2 then …

if p1<>p2 then …

Замечание. Запрещены любые арифметические операции с указателями, их ввод-вывод и сравнение на больше-меньше.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]