Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум ОА и П.doc
Скачиваний:
23
Добавлен:
29.08.2019
Размер:
13.34 Mб
Скачать

Решение:

1 шаг 3 шаг

Х У Z

2 шаг

  1. Перенесем верхушку пирамиды, состоящую из (n-1)-го диска, с первого стержня на второй, затем перенесем один диск с первого стержня на третий, а потом перенесем верхушку пирамиды, состоящую из (n-1)-го диска, со второго стержня на третий.

  2. Далее повторим алгоритм переноса, но уже для (n-1)-го диска, затем для (n-2)-го диска и так далее, пока не опустимся до одного диска.

Распишем алгоритм по шагам.

Положим:

  • Х – исходное состояние;

  • У – промежуточное состояние;

  • Z – конечное состояние. (см. рис. выше)

1 шаг – перенести (n-1) диск со стержня Х на стержень У, используя стержень Z как вспомогательный;

2 шаг – перенести один нижний диск со стержня Х на стержень Z;

3 шаг – перенести (n-1) диск со стержня У на стержень Z, используя свободный стержень Х.

  1. Таким образом имеем рекурсивный вызов процедуры:

Procedure Hanoi (n: word; x, y, z: char);

begin

if n=1

then writeln (‘Переложить’, x, ‘на’, z)

else

begin

hanoi (n-1, x, z, y); {1 шаг}

writeln (‘Переложить’, x, ‘на’, z); {2 шаг}

hanoi (n-1, x, z, y); {3 шаг}

end

end; {hanoi}

Задания для самостоятельного решения.

  1. Напишите рекурсивную процедуру для ввода с клавиатуры последовательности чисел (окончание ввода – 0) и вывода ее на экран в обратном порядке.

  2. Используя рекурсию написать программу перевода натурального числа из десятичной системы счисления в двоичную.

  3. Напишите программу с использованием рекурсии для поиска наименьшего элемента массива.

Лабораторная работа №20.

Тема: «Разработка программ создания, корректировки и просмотра типизированных файлов».

Цель работы: 1. Изучение файловых типов в языке Pascal

2. Получение навыков при обработке (корректировке. просмотре) типизированных файлов.

ЗАДАНИЕ 1

Прочитать из файла целые числа и вывести их на экран.

Решение:

Напишем фрагмент программы:

. . .

Assign (F1, ‘A: int. dat);

{связываем файловую переменную с файлом на диске}

Reset (F1); {открываем файл для чтения}

while not EOF (F1) do {пока не достигнут конец файла}

begin

read (F1, n); {считываем очередное число}

write (n, ‘ ‘); {выводим его на экран}

end;

close (F1); {закрываем файл}

. . . . . . .

ЗАДАНИЕ №2.

В файле dan.dat записаны целые числа(см. Задание №1). Вычислить сумму элементов файла и результат вместе с исходными данными записать в файл dan1.dat.

Вопросы для обсуждения.

  1. Сколько переменных нужно для решения данной задачи? Каких?

  2. Как определить конец файла?

  3. Как считывать элементы и файла dan1.dat?

  4. Как записать данные в файл dan1.dat?

Решение:

Program summa;

Var

F1,F2: file of integer:

{файловые переменные}

S, N: integer;

Begin

{С файловой переменной F1 связываем файл на диске}

assign (F1, ‘ dan.dat);

reset (F1); {открываем файл для чтения}

{С файловой переменной F2 связываем файл на диске}

assign (F2, ‘ dan1.dat);

write (F2);

{Открываем файл F2 для записи}

S:=0;

While not eof (F1) do

{проверка на конец файла F1}

begin

read (F1,N); {чтение элемента из файла F1}

write(F2,N); {запись элемента в файл F2}

S:=S+N; {накопление суммы}

end;

{Запись суммы элементов в конец файла F2}

write(F2, S);

write(‘Результат находится в файле dan1. dat’);

close(F1); {закрываем файл F1}

close(F2); {закрываем файл F2}

readln

end.