Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






  • Как продвинуть сайт на первые места?
    Вы создали или только планируете создать свой сайт, но не знаете, как продвигать? Продвижение сайта – это не просто процесс, а целый комплекс мероприятий, направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
    Ускорение продвижения
    Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
    Начать продвижение сайта
  • Анализ программ.






     

    Программирование не всегда начинается с проектирования, часто необходимо понять существующую программу, например для того чтобы модифицировать. Поскольку методы анализа программ, разработанные для CF Pascal зависят только от определения box-функций, они могут быть применены для дополнительных типов данных, таких как INTEGER. Рассмотрим следующий фрагмент программы.

     

    BEGIN

    X: = 3;

    Y: = 5;

    {(Y > = 0 --> X, Y: = X+Y, 0) | (Y < 0 -->)}

    WHILE Y > 0

    DO

    BEGIN

    Y: = Y – 1;

    X: = X + 1

    END

    END

     

    Желаемая функция для оператора WHILE представлена комментарием:

    F = (Y > = 0 --> X, Y: = X+Y, 0) | (Y < 0 -->)

    Правило верификации для WHILE требует выполнения следующих трех условий:

    1. domain(F) = domain(WHILE Y > 0 DO BEGIN Y: = Y – 1; X: = X + 1 END)

    2. (Y < = 0 -> F) = (Y < = 0 ->)

    3. F = IF Y > 0 THEN BEGIN Y: = Y-1; X: = X + 1 END

    Область определения F все состояния, поэтому завершение требуется для всех значений Y. Если значение Y отрицательное или ноль, оператор WHILE пропускается, поэтому завершение гарантировано. Если значение Y положительное, оператор WHILE выполняется и Y уменьшается, и окончательное завершение гарантируется, поскольку значение Y приближается к нулю. Таким образом, первое условие удовлетворяется.

    Мы можем переписать левую сторону второго условия так что она будет идентичная правой части.

    Y < = 0 --> F

    = (Y < = 0 --> (Y > = 0 --> X, Y: = X+Y, 0) | (Y < = 0 --> (Y < 0 -->))

    = (Y < = 0 AND Y > = 0 --> X, Y: = X+Y, 0) | (Y < = 0 AND Y < 0 -->)

    = (Y = 0 --> X, Y: = X+Y, 0) | (Y < 0 -->)

    = (Y < = 0 -->)

     

    Наконец, рассмотрим правую часть третьего условия:

    IF Y > 0 THEN BEGIN Y: = Y-1; X: = X + 1 END ◦ F

    Функция, соответствующая оператору IF будет:

    IF Y > 0 THEN … = (Y > 0 -- > X, Y: = X + 1, Y - 1) | (Y < = 0 -->)

    тогда IF Y > 0 THEN … ◦ F будет

    (Y > 0 -- > X, Y: = X + 1, Y - 1) | (Y < = 0 -->) ◦

    (Y > = 0 --> X, Y: = X+Y, 0) | (Y < 0 -->)

    Здесь необходимо рассмотреть четыре случая соответствующих первому и второму условиям двух условных присваиваний. Обозначим эти случаи по номеру выбранного условия, например, случай 1-2 будет означать первое условие IF Y > 0 THEN … и второе условие F:

    Случай 1-1

    Часть Условие X Y
    IF … F Y > 0 Y – 1 > = 0 X + 1 X + 1 + Y - 1 Y – 1

     

    Условие упрощается до Y > = 1, тогда функция будет:

    (Y > = 1 --> X, Y: = X + Y, 0)

     

    Случай 1-2

    Часть Условие X Y
    IF … F Y > 0 Y – 1 < 0 X + 1   Y – 1

    Условие:

    Y > 0 AND Y – 1 < 0 = Y > 0 AND Y < 1

    не может быть удовлетворено, поэтому этот случай не произойдет.

     

    Случай 2-1

    Часть Условие X Y
    IF … F Y < = 0 Y > = 0   X + Y  

     

    Условие упрощается до Y = 0, тогда функция будет:

    (Y = 0 -->)

     

    Случай 2-2

    Часть Условие X Y
    IF … F Y < = 0 Y < 0    

    Условие:

    (Y < 0 -->)

    Собирая функцию из четырех частей вместе, получим:

    (Y > = 1 --> X, Y: = X + Y, 0) | (Y = 0 -->) | (Y < 0 -->)

    = (Y > 0 --> X, Y: = X + Y, 0) | (Y < = 0 -->)

    Таким образом, правая сторона третьего условия идентична F, что и требовалось доказать.

     

    Поскольку условия верификации оператора WHILE удовлетворены, F – функция вычисляемая оператором WHILE.

    Композиция F с первыми присваиваниями

    (X, Y: = 3, 5) ◦ F

    дает значение всего фрагмента программы:

    (5 > 0 --> X, Y: = 3 + 5, 0) | (5 < = 0 --> X, Y: = 3, 5) =

    (X, Y: = 8, 0)

     

    Желаемая функция для оператора WHILE не всегда дается как условное присваивание, часто желаемая функция должна быть получена из программы. В предыдущем примере было легко определить функцию для оператора WHILE, потому что оба оператора присваивания в ней были накапливающими операторами присваивания. В накапливающем присваивании значение переменной изменяется прибавлением или вычитанием фиксированного значения. Математическая концепция суммирования (повторяющегося сложения) – естественный выбор для описания повторяющиеся эффекты для X и Y. Поскольку цикл выполняется так долго, как Y > 0 и значение Y уменьшается на 1 в течение каждого выполнения, суммирование будет содержать Y элементов. На каждой итерации, поскольку X и Y изменяются на константу 1, это элемент для суммирования. Сумма добавляется к исходному значению X и вычитается из исходного значения Y. Таким образом функция для оператора WHILE будет:

    X, Y: = X + ,

    Эти значения могут быть упрощены:

     

    X + = X + (Y –1 + 1) = X + Y – 1 + 1 = X + Y

    = Y – 1(Y – 1 + 1) = Y – Y – 1 + 1 = 0

     

    то есть функция будет:

    (X, Y: = X+Y, 0)

    как и ранее.

     

    Этот метод может быть использован для определения функции другого оператора WHILE. Фрагмент на Паскале ниже эмулирует операторы DIV и MOD используя только сложение и вычитание. Его желаемая функция будет:

    f = (Numerator > = 0 AND Denominator > 0 -->

    Quotient, Remainder: =

    Numerator DIV Denominator, Numerator MOD Deniminator)

     

    Для данной функции фрагмента программы должна быть определена функция вычисляемая оператором WHILE для того, чтобы верифицировать, что фрагмент вычисляет f.

    Quotient: = 0;

    Reminder: = Numerator;

    WHILE Remider > = Denominator

    DO

    BEGIN

    Quotient: = Quotient + 1;

    Reminder: = Reminder - Denominator

    END

    Пусть значения Quotinet, Reminder и Denominator будут Q, R и D соответственно. Тест на завершение будет R ≥ D или R- D ≥ 0, цикл будет выполнен k раз, где:

    k = (R-D) / D = R/D –1

    Таким образом, Q и R изменяться до:

    Q +

    R -

    соответственно. Эти выражение сокращаются до:

    Q + = Q + 1 (R / D)

    R - = R – D(R/D)

    Функция для оператора WHILE следующая:

    (Reminder > = Denominator AND Denominator > 0 -->

    Remainder, Quotient: =

    Reminder – (Reminder DIV Denominator)*Denominator,

    Quotient + (Reminder DIV Denominator)) |

    (Reminder < Denominator -->)

    Верификация, что это функция оператора WHILE и фрагмент программы корректен для данной желаемой функции f, выполняются аналогично предыдущему примеру.

     

     

    Заключение.

     

    В этой главе были рассмотрены порядковые типы данных Паскаля. Операции, которые могут быть применены к каждому типу, обобщены в следующей таблице.

     

    Оператор Операция Функциональность
    NOT инверсия логический -> логический
    AND коньюнкция логический x логический
    OR дизъюнкция  
    = эквивалентность порядковый x порядковый -> логический
    < > неравенство  
    < меньше  
    < = меньше или равно  
    > больше  
    > = больше или равно  
    + унарный плюс целый -> целый
    - унарный минус  
    + бинарное сложение целый x целый -> целый
    - бинарное вычитание  
    * умножение  
    DIV целочисленное деление  
    MOD остаток от деления  

     

    Каждый порядковый тип используется по-своему. Переменные типа BOOLEAN могут быть использованы для хранения сложных условий для дальнейшего использования. Переменные типа INTEGER позволяют легко выполнять подсчет при условии, что выполняется ограничение [-MAXINT, MAXINT]. Перечислимые типы хороши, когда нужно зафиксировать небольшой набор значений, каждое со своим мнемоническим именем. Типы диапазоны позволяют программисту объявлять границы их значений, чтобы они проверялись автоматически.

    Методы анализа, использованные в CF Pascal, расширены до использования с порядковыми типами без изменений.






    © 2023 :: MyLektsii.ru :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.