- •Задания II уровня
- •Задания I уровня
- •Задания II уровня
- •Задания I уровня
- •Задания II уровня
- •Задания I уровня
- •Задания II уровня
- •Задания I уровня
- •Задания II уровня
- •Лабораторная работа
- •Лабораторная работа
- •Задания
- •Лабораторная работа
- •Описание процедур начинается со строки:
- •Задания I уровень
- •Задания II уровень:
- •Задания
- •Лабораторная работа
- •Задания
- •II уровень
- •Задания I уровень
- •Задания II уровень
- •Петров л.Л 9 9 9 Барановичи
- •Лабораторная работа
- •Задания I уровень
- •II уровень
- •Самостоятельная работа
- •Литература
Задания I уровень
Ввести и проверить работу программы:
var a,b,m:real;
procedure b(x, y: integer; var h: );
begin
if x > 0 then h:= y
else h:= y*y; (**)
end;
begin
read(a,b);
b(a,b,m);
writeln(m);
end.
Что делает данная программа?
2. Написать процедуру ввода последовательных целых чисел в массив из n элементов: |
2 a). Изменить процедуру ввода так, чтобы числа были записаны в обратном порядке: |
procedure pryam_poradok; var i:integer; begin for i:=1 to n do a[i]:=i; end; |
Procedure obratn_poradok; var i:integer; begin for i:=n downto 1 do a[n-i+1]:=i; end; |
3. Написать процедуру vivod, обеспечивающую вывод чисел из массива, состоящего из n элементов.
4. Проверить работу программы с использованием процедур pryam_poradok и obratn_poradok.
5. Написать процедуру сортировки SORT массива из n целых чисел.
6. Написать программу сортировки массива из n целых чисел, причем числа в массив вводятся с помощью процедуры random(10). Ввод (vvod), вывод (vivod) и сортировку элементов (sort) записать процедурами. Главная программа будет примерно следующей:
var a: array[1..100] of integer;
… procedure …..
…
end;
…
begin {основная программа}
n:=100;
vvod; {ввод исходного массива}
vivod; {его вывод}
sort; {сортировка}
writeln; {пустая строка}
vivod; {вывод результатов работы}
end.
Задания II уровень:
Написать процедуру сортировки swap(a,b)– обмен значениями двух переменных.
Написать процедуру сортиров
ки SORT1 для n элементов массива, используя процедуру swap(a,b).
Используя эту процедуру, изменить программу 5 пункта I уровня.
Дополнить основную программу процедурой нахочсуммы элементов массива.
Написать процедуру поиска максимального элемента одномерного массива, содержащего не более N вещественных чисел и дополнить основную программу этой процедурой.
САМОСТОЯТЕЛЬНАЯ РАБОТА
Дано четное число n>2; проверить для этого числа гипотезу Гольдбаха. Эта гипотеза (не опровергнутая и полностью не доказанная) заключается в том, что каждое четное n, большее двух, представляется в виде суммы двух простых чисел. (Определить процедуру, позволяющую распознавать простые числа).
Составить подпрограмму, которая печатает все натуральные числа, меньшие N, являющиеся палиндромами. Число называется палиндромом, если оно читается одинаково, как слева направо, так и справа налево (например, 383, 33) Число N в подпрограмму передать как параметр.
КОНТРОЛЬНЫЕ ВОПРОСЫ:
В каких случаях целесообразно использование подпрограмм?
Для чего предназначены процедуры?
Что включает в себя заголовок процедуры?
Чем отличаются формальные и фактические параметры?
Почему следующее описание процедуры недопустимо?
Procedure S(A : array[1..10] of real);
В чем заключается разница между процедурой и функцией?
ЛАБОРАТОРНАЯ РАБОТА
Тема: АЛГОРИТМ ПОИСКА МЕТОДОМ ДИХОТОМИИ
ЦЕЛЬ: Учащиеся должны освоить алгоритмы поиска элемента с заданными свойствами в упорядоченной последовательности данных.
ПО: PASCAL
ТЕОРИЯ:
Идею этого метода иллюстрирует следующий стишок:
-Несчастный случай! Ваш слуга убит!
Он надвое разрезан, мистер Смит!
-Ну, что ж! Тогда любезность окажите,
Ту половину, где ключи, пришлите.
( Шарыгин И.Ф. Математический винегрет,
-М., 1991, стр.21)
Задача - найти заданный элемент в наборе данных. Такая задача называется задачей поиска. Если элементы последовательности упорядочены по какому-либо признаку, то можно воспользоваться методом дихотомии.
Дихотомический поиск, иначе двоичный поиск (бинарный поиск)– это способ нахождения значения величины, которая является ответом задачи, или, зная которую, можно вычислить ответ задачи.
Поиск ведется как бы «подбором».
Из условий задачи определяются левая (L) и правая (R) граница диапазона, внутри которого заведомо находится искомое значение. Далее определяется переменная, равная середине диапазона (M), вычисляется значение целевой функции F в этой переменной, сравнивается с тем ответом (Otv), который должен быть. В зависимости от результатов сравнения (в какой из половин диапазона находится искомое значение) либо правая, либо левая граница рассматриваемого диапазона заменяются на M.
Процесс продолжается, пока не будет найдено значение M с заданной точностью E.
Можно высказанную идею выразить следующей процедурой:
Интал |
Pascal |
(примечание) |
Повторять Пока abs(r-l)>e m:=(l+r)/2 Если f(m)< otv То l:=m Иначе r:=m Конец_Если Завершить |
Procedure Dichotom; begin while abs(r-l)>e do begin m:=(l+r)/2 if f(m)< otv then l:=m else r:=m;
end; end; |
I –параметр цикла, е–точность вычисления
(*) |
ПОСЛЕДОВАТЕЛЬНОСТЬ ВЫПОЛНЕНИЯ ЗАДАНИЯ:
1. Изучить необходимые сведения (см. выше).
2. Изучить задания. Для каждого– разработать и ввести программу в память ЭВМ.
3. Отладить программу с помощью отладчика TP
4. Выполнить программу.
5. Выполнить остальные пункты задания.
6. Оформить отчет, защитить и сдать его преподавателю.
ЗАДАНИЯ I УРОВНЯ:
Дана программа поиска задуманного компьютером числа в интервале от 1 до 100.
-
Паскаль
Комментарии
var s,c:longint;
begin
RANDOMIZE;
S:=RANDOM(100)+1;
READLN(c);
while C<>S do begin
IF C>S THEN WRITELN('Ваше число больше')
ELSE WRITELN('Ваше число меньше');
readln(c);
end;
writeln('задумано число=',c);
end.
s–задуманное число;
c–попытка отгадать;
Компьютер «задумывает» случайное число в интервале от 1 до 100.
Ввод предполагаемого ответа.
Пока не угадали, повторяем:
уточняется: введенное число больше или меньше задуманного?
Ввод нового предполагаемого ответа;
Вывод задуманного числа
Ввести ее в память компьютера и «поиграть» с ней. За какое число попыток Вы находите ответ?
Изменить программу так, чтобы она находила задуманное компьютером число в интервале от 1 до 1000. Сколько операций сравнения выполнится для получения ответа?
Изменить программу так, чтобы она считала и выводила на экран число попыток (ввести новую переменную).
Изменить программу так, чтобы она прерывала выполнение программы, если число попыток больше 7 (для интервала от 1 до 100) и 10 (для интервала от 1 до 1000). (If popitok>7 then Exit;). Дополнительно выводить сообщение: «Число не угадано за … количество попыток». Можно проверить исполнение алгоритма в режиме пошагового просмотра.
Составьте программу определения задуманного человеком числа от 1 до 1000 с помощью 10 вопросов. Вопрос имеет вид: «Верно ли, что задуманное число больше K?» Ответы человека –«Д» (да) либо «Н» (нет). Применить идею деления интервала пополам (см.(*)). Проверить исполнение алгоритма в режиме пошагового просмотра.
Примечание: операция деления нацело числа а на число b – «div» (a div b).
ЗАДАНИЯ II УРОВНЯ:
Дана программа вычисления √2 методом Герона, используя вспомогательную функцию geron. (Метод Герона –это метод последовательных приближений).
-
Паскаль
Комментарии
{$N+}
function geron(x:real): extended;
const e=1.0e-20;
var y,z: real;
begin
y:=1.0; z:=0;
while abs(z-y)>=e do begin
z:=y;
y:=(y+x/y)/2;
end;
geron:=y;
end;
begin
writeln('geron(2.0)=',geron(2.0));
writeln('Sqrt(2.0)= ',sqrt(2.0));
end.
Идея:
задаются число x, из которого требуется извлечь квадратный корень (например, x=2) и точность вычисления e. Выбирается произвольное начальное значение y (у нас y=1).
Строится последовательность
yn+1 =(yn +x/yn)/2.
Вычисления прекращаются, когда |yn+1 –yn|<e)
z–предыдущее значение у
Вывод ответа и сравнение с тем, что получается с помощью функции SQRT()
(**)
Примечание: Директива компилятора {$N+} использована для реализации операций с плавающей запятой типа extended;
Измените программу так, чтобы она вычисляла квадратный корень из произвольного положительного числа. Как проверить правильность вычислений?
Найдите формулу и измените программу (**) с учетом этой формулы.
Вычислить корень функции х2 -2 методом деления отрезка пополам на интервале от 1 до 2.
Уточнить с точностью до 10-6 корень на интервале от -2 до -1 для уравнения х3-3х-0,4=0.
Составьте полностью и реализуйте программу, фрагмент которой (*) представлен выше, для переменных типа Real.
Составьте полностью и реализуйте программу, фрагмент которой (*) представлен выше, для переменных типа Integer.
Даны два массива a и b из m и n различных целых чисел, упорядоченных по возрастанию. Известно, что в этих массивах есть элемент, значение которого совпадает с заданным значением d. В каком из массивов элемент с таким значением имеет меньший номер.
САМОСТОЯТЕЛЬНАЯ РАБОТА (на усмотрение преподавателя)
Составить задачу на дихотомический поиск и решить ее.
КОНТРОЛЬНЫЕ ВОПРОСЫ:
В каких случаях применяется дихотомический поиск?
Что является условием окончания двоичного поиска?
Сколько операций сравнения и присваиваний производится при поиске задуманного числа в упорядоченном массиве из n элементов?
Оценка–10, если выполнены все задания и есть развернутые ответы на вопросы, иначе – в соответствии с количеством выполненных заданий и есть ответы на вопросы.
ЛАБОРАТОРНАЯ РАБОТА
ТЕМА: ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ РЕКУРСИВНЫХ ПОДПРОГРАММ.
ЦЕЛЬ: Изучить работу с рекурсивными подпрограммами на языке программирования Паскаль. Получить практические навыки работы с рекурсивными процедурами и функциями.
ПО: Turbo Pascal-7.0.
(Замечание для преподавателей: Так как рекурсия обычно плохо понимается, то программы рассмотрены подробно.)
КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ:
Алгоритм, использующий в качестве вспомогательного самого себя, является рекурсивным алгоритмом. Иначе: способность функции обращаться к себе самой называется рекурсией.
Глубина рекурсии – это ее максимальная вложенность, т.е. наибольшее число подпрограмм, завершение которых не произошло.
Записать рекурсивный алгоритм на Паскале можно при помощи рекурсивной процедуры либо функции.
В подпрограммах встречаются два вида рекурсии: прямая и косвенная. В случае прямой рекурсии подпрограмма вызывает саму себя непосредственно. В случае косвенной рекурсии одна подпрограмма (А) вызывает другую (В), которая, в свою очередь, сама или через другие подпрограммы обращается опять к первой (А). В последнем случае все процедуры в цепочке –рекурсивные.
В данной работе рассматривается только прямая рекурсия.
В чем преимущество рекурсии? Задача сводится к более простой либо за счет уменьшения количества параметров либо за счет уменьшения самого параметра. Обязательное требование: в описании рекурсивной подпрограммы должен быть предусмотрен выход из нее, иначе программа зациклится.
При написании рекурсивной программы велика вероятность ошибки. Некоторые правила предосторожности указаны ниже (см. замечание к первой программе).
Какое описание (рекурсивное или нерекурсивное) лучше? В общем случае в литературе отвечают так: рекурсивное описание обычно короче и нагляднее, а нерекурсивное – длиннее и труднее понимаемое. Но на вычисление рекурсивной функции затрачивается больше машинного времени, хотя и не всегда (за счет повторных обращений к процедуре либо функции) и памяти машины (за счет дублирования локализованных в процедуре переменных).
Хотя в литературе встречается и такое мнение, что рекурсия– сердце Паскаля. Сравнивайте способы и методы вычисления и делайте выводы сами.
ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ:
Изучить необходимые сведения, указанные выше.
В заданиях I уровня дается задача и одновременно поясняется действие рекурсии. Для сравнения приводятся программы, выполняющие действия с помощью рекурсии и итерационным способом. Рекомендуется сравнить время выполнения и того и другого способа. Примеры учебные, поясняющие действие и порядок оформления рекурсивной подпрограммы.
Попробуйте просчитывать в каждой программе количество рекурсивных вызовов (глубину рекурсии).
Оформить отчет по лабораторной работе. Отчет по лабораторной работе должен содержать постановку задачи, краткое описание идеи либо алгоритм, а также программу решения задачи.
