
- •Информационная модель предметной области
- •Моделирование задач на эвм
- •Преобразование информации при решении задачи на эвм
- •Понятие о данных
- •Абстрактные структуры данных
- •Классификация структур данных
- •14101954
- •Абстракция
- •Лекция 6. Види та методи абстракції в програмуванні. Абстракция через параметризацию
- •Абстракция через спецификацию
- •Виды абстракций
- •Лекция 7. Процедурна абстракція. Специфікація процедурної абстракції. Процедурная абстракция
- •Спецификации
- •Спецификации процедурных абстракций
- •Реализация процедур
- •Более обобщенные процедуры
- •Создание процедурных абстракций
- •Заключение
- •Лекция 8. Абстракція даних Абстракции данных
- •Спецификации для абстракций данных
- •Реализация на языке clu
- •Замечания по поводу операций up и down
- •Использование абстракций данных
- •Лекция 9. Реалізація абстракції даних. Функція абстракції. Функція інваріант подання.
- •Функция абстракции
- •Инвариант представления
- •Сохранение инварианта представления
- •Изменяемые представления
- •Параметризованные абстракции данных
- •Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:
Будем искать решение нашей задачи в виде цикла, имеющего следующий вид:
5) СТРУКТУРА ЦИКЛА:
Подготовка цикла
Нет
Да
ВЫХОД
Компоненты цикла будем искать, исходя из стратегии задачи и условия истинности инварианта:
А) перед первым входом в цикл;
Б) после завершения очередного цикла;
В) после выхода из цикла.
Введем величину n– номер уже полученной частичной суммы. Частичную сумму обозначим переменнойS. Исходя из стратегии решения задачи (суммирование от начала последовательности) присвоимnзначение 0. Чтобы сохранить истинность инварианта необходимо переменнойSтакже присвоить значение 0.
6) ПОДГОТОВКА ЦИКЛА: n:=0;S:=0;
Условие продолжения цикла (обозначим B) найдем, принимая во внимание постусловиеQ.
7) УСЛОВИЕ ПРОДОЛЖЕНИЯ ЦИКЛА B:Sa.
Здесь S– параметр цикла (Величина, изменение которой влияет на значение условия цикла).
В соответствии со стратегией решения задачи (последовательное получение частичных сумм) и смыслом величины n(номер частичной суммы) будем продвигаться к цели, увеличивая значениеn.
8) МОДИФИКАТОР ЦИКЛА (Действие, меняющее значение параметра цикла): S:=S+1/(n+1).
Заметим, что в этот момент условие инварианта цикла Iнарушилось (величину частичной суммыSnмы увеличили, а значение номер частичной суммыSосталось прежним. Восстановим это соответствие, увеличив величинуn.
9) ТЕЛО ЦИКЛА (Действие, многократное выполнение которого позволит решить поставленную задачу): inc(n)..
Теперь инвариант цикла восстановлен и можно вернуться к заголовку цикла с целью проверить условие выхода из цикла.
Соберем наши элементы программы вместе. Получим программу:
10) ТЕКСТ ПРОГРАММЫ:
<< Подготовить a(например, ввести) >>
n:=0; S:=0;
while Sa do begin
S:=S+1/(n+1);
inc(i);
end;
Теперь докажем правильность этой программы (ее соответствие спецификации).
11) ЧАСТИЧНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Это следует из того, что мы выйдем из цикла только тогда, когда нарушится условие B, т.е.Sстанет большеa. Из условия истинности инварианта (он будет справедлив при выходе из цикла), учитывая стратегию решения задачи (последовательное получение всех частичных сумм) можно заключить, что это произойдет впервые (т. е. предыдущая частичная сумма еще была меньшеa). А это и есть требования постусловияQ– ч.т.д.
12) ПОЛНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Из теории рядов известно, что наш ряд расходится, т.е. последовательность частичных сумм стремится к бесконечности. Поэтому обязательно наступит такой момент, когда при некотором nнаша частичная сумма станет больше любого наперед заданного числаa, что означает нарушение условия продолжения цикла – ч.т.д.
Таким образом доказательство полной корректности цикла гарантирует, что цикл обязательно завершится, а доказательство частичной корректности показывает, что цикл завершится именно в состоянии Q. Итак, мы доказали, что наша программа решает поставленную задачу.
Задача 2. Найти количество значащих цифр в натуральном числе n.
P: Подготовить натуральное числоn.
Q:k= <Количество значащих цифр в числеn>.
СТРАТЕГИЯ РЕШЕНИЯ ЗАДАЧИ: Будем обрезать младшие цифры числа. Текущее обрезаемое число обозначим C, а количество уже отрезанных цифр будем хранить в переменнойk.
ИНВАРИАНТ ЦИКЛА I:
< Количество значащих цифр в числе n> = < Количество значащих цифр в числеC> + < количество уже отрезанных цифр, т.е.k>.
5) СТРУКТУРА ЦИКЛА:
Подготовка цикла
Нет
Да
ВЫХОД
ПОДГОТОВКА ЦИКЛА:
C:=n; { Начнем с исходного числа}
k:=0; { Из условия истинности инварианта}
УСЛОВИЕ ЦИКЛА: C<>0.
М
ОДИФИКАТОР ЦИКЛА:
C:=Cdiv10; { В соответствии со стратегией задачи }
9) ТЕЛО ЦИКЛА:
inc(i); { Из условия сохранения инварианта цикла }
ТЕКСТ ПРОГРАММЫ:
<< Подготовитьn (например, ввести)>>
C:=n; k:=0;
while C<>0 do begin
C:=C div 10;
inc(i);
end;
11) ЧАСТИЧНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Из условия выхода из цикла (C=0) следует, что в переменнойkучтены все значащие цифры числа – ч.т.д.
12) ПОЛНАЯ КОРРЕКТНОСТЬ ЦИКЛА: В качестве функции декремента цикла можно взять значение < Количество значащих цифр в числе C>. Эта величина неотрицательна и конечная. При каждом выполнении тела цикла она убывает на 1. Когда она становится равной нулю срабатывает условие выхода из цикла (C=0) и цикл завершается.
Из доказательства частичной корректности цикла следует, что он завершается именно в состоянии Q(Вkнаходится количество значащих цифр числа).
Задача 3. Найти сумму цифр натурального числа n.
P: Подготовить натуральное числоn.
Q:S= <Сумма цифр числаn>.
СТРАТЕГИЯ РЕШЕНИЯ ЗАДАЧИ: Будем обрезать число справа. Текущее обрезаемое число обозначим C, а сумму уже отрезанных цифр будем хранить в переменнойS.
ИНВАРИАНТ ЦИКЛА I:
< Сумма цифр числа n> = < Сумма цифр числаC> + < Сумма уже отрезанных цифр, т.е.S>.
СТРУКТУРА ЦИКЛА:
Подготовка цикла
Нет
Да
ВЫХОД
6) ПОДГОТОВКА ЦИКЛА:
C:=n; { Начнем с исходного числа}
S:=0; { Из условия истинности инварианта}
УСЛОВИЕ ЦИКЛА: C<>0.
ТЕЛО ЦИКЛА:
S:=S+Cmod10; { В соответствии со стратегией задачи }
МОДИФИКАТОР ЦИКЛА:
C:=Cdiv10; { Из условия сохранения инварианта цикла }
ТЕКСТ ПРОГРАММЫ:
<< Подготовитьn (например, ввести)>>
C:=n; S:=0;
while C<>0 do begin
S:=S+C mod 10;
C:=C div 10;
end;
11) ЧАСТИЧНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Из условия выхода из цикла (C=0) следует, что в переменнойSпросуммированы все цифры числа – ч.т.д.
12) ПОЛНАЯ КОРРЕКТНОСТЬ ЦИКЛА: В качестве функции декремента цикла можно взять значение < Количество значащих цифр в числе C>. Эта величина неотрицательна и конечная. При каждом выполнении тела цикла она убывает на 1. Когда она становится равной нулю срабатывает условие выхода из цикла (C=0) и цикл завершается.
Из доказательства частичной корректности цикла следует, что он завершается именно в состоянии Q(ВSнаходится сумма всех цифр числа).
Задача 4. Найти старшую цифру натурального числа n.
P: Подготовить натуральное числоn.
Q:k= <Старшая цифра числаn>.
СТРАТЕГИЯ РЕШЕНИЯ ЗАДАЧИ: Будем обрезать число справа, пока не доберемся до старшей цифры числа.Текущее обрезаемое число обозначим C. Очередную отрезанную цифру будем хранить в переменнойk.
ИНВАРИАНТ ЦИКЛА I:
< kесть старшая цифра числаn>ИЛИC<>0
5) СТРУКТУРА ЦИКЛА:
Подготовка цикла
Нет
Да
ВЫХОД
6) ПОДГОТОВКА ЦИКЛА:
C:=n; { Начнем с исходного числа}
7) УСЛОВИЕ ЦИКЛА: C<>0.
8) ТЕЛО ЦИКЛА:
k:=Cmod10; { В соответствии со стратегией задачи }
МОДИФИКАТОР ЦИКЛА:
C:=Cdiv10; { В соответствии со стратегией задачи }
ТЕКСТ ПРОГРАММЫ:
<< Подготовитьn (например, ввести)>>
C:=n;
while C<>0 do begin
k:=C mod 10;
C:=C div 10;
end;
11) ЧАСТИЧНАЯ КОРРЕКТНОСТЬ ЦИКЛА: Из условия выхода из цикла (C=0) и условия сохранения инварианта следует, что в переменнойkнаходится старшая цифра числа (один из операндов логической функцииИЛИ– ЛОЖЬ, тогда, чтобы инвариант остался истинным, необходимо, чтобы второй операнд стал истинным, т.е.k– старшая цифра числа) - ч.т.д.
12) ПОЛНАЯ КОРРЕКТНОСТЬ ЦИКЛА: В качестве функции декремента цикла можно взять значение < Количество значащих цифр в числе C>. Эта величина неотрицательна и конечная. При каждом выполнении тела цикла она убывает на 1. Когда она становится равной нулю срабатывает условие выхода из цикла (C=0) и цикл завершается.
Из доказательства частичной корректности цикла следует, что он завершается именно в состоянии Q(Вkнаходится старшая цифра числа).