Мегаобучалка Главная | О нас | Обратная связь


Конструкции if-then-else и case



2015-12-13 434 Обсуждений (0)
Конструкции if-then-else и case 0.00 из 5.00 0 оценок




Haskell, как и большинство других языков программирования, поддерживает условную конструкцию if-then-else.

 

doubleSmallNumber x = if x > 100 then x else x * 2

 

Отличие его от аналогов во многих других языках программирования состоит в том, что часть else в Haskell является обязательной, поскольку в Haskell каждое выражение и функция должны вернуть какой-нибудь результат. Еще одна особенность оператора if в Haskell состоит в том, что он рассматривается как выражение. Выражением называется кусок кода, который возвращает результат. Так как else является обязательным, оператор if всегда возвращает некоторое значение, потому и является выражением. Если необходимо прибавить 1 к каждому числу, которое возвращается предыдущей функцией, можно записать так:

 

doubleSmallNumber' x = (if x > 100 then x else x * 2) + 1

 

Если опустить скобки, единица прибавлялась бы только к числам, которые не превышают 100.

Haskell также поддерживает конструкцию case. Предположим, необходимо создать функцию, которая возвращает 1 при аргументе 0, 5 при аргументе 1, 2 при аргументе 2 и -1 при всех других аргументах. Используя case, можно записать ее следующим образом:

 

f x = case x of 0 -> 1 1 -> 5 2 -> 2 _ -> -1

 

Отступы здесь очень важны. Haskell для структуризации кода использует систему, которая называется layout (Python использует аналогичную систему). Эта система позволяет писать код без использования скобок и точек с запятыми, как этого требуют языки C, Java и многие другие. Она включает следующие правила:

● каждый оператор начинается с новой строки;

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

Например, представленную выше функцию doubleSmallNumber можно переписать так:

 

doubleSmallNumber x = if x > 100 then x else x * 2

 

Некоторые программисты предпочитают не использовать такой стиль написания кода и писать фигурные скобки и точки с запятыми в явном виде. Это вполне приемлемо. Приведенный выше код с конструкцией case и следующий совершенно аналогичны:

 

f x = case x of { 0 -> 1 ; 1 -> 5 ; 2 -> 2 ; _ -> 1 }

 

При явном использовании скобок и разделителей появляется свобода в структурировании кода.

Кусочное определение функций

Функции также могут быть определены кусочно. Это означает, что можно написать одну версию функции для определенных параметров, а затем другую ее версию для других параметров. Например, функцию f можно определить так:

 

f 0 = 1 f 1 = 5 f 2 = 2 f _ = -1

 

Здесь важен порядок описания версий. Если переместить последнюю строку в начало, она будет соответствовать каждому аргументу, и функция f будет возвращать значение -1 вне зависимости от аргумента (большинство компиляторов предупреждают о таких последствиях). Если же вообще не включить последнюю строчку в файл, то при вызове функции f с любыми параметрами (кроме 0, 1 и 2) будет генерироваться ошибка (большинство компиляторов также предупреждают и о таких последствиях). В данном примере используется знак подчеркивания, поскольку в вычислениях значение аргумента не участвует, т.е. этот знак соответствует мнимой переменной. Если результат зависит от аргумента, то вместо знака подчеркивания следует использовать некоторую определенную переменную (например, x).

Содержание отчета

1. Титульный лист с указанием названия лабораторной работы.

2. Цель работы.

3. Номер варианта.

4. Задание.

5. Исходный код разработанных функций.

6. Результаты тестирования разработанных функций.

Варианты заданий

Во всех вариантах в третьем задании создать три варианта функции: с использованием конструкции if-then-else, с использованием конструкции case и с использованием кусочного определения функции (для разделения версий функции можно добавлять к ее имени апострофы).

Функции по всем трем заданиям можно описать в одном файле (имя выбрать произвольным).

Вариант 1

1. Определить функцию isRectangular, принимающую в качестве аргументов три числа — длины сторон треугольника — и проверяющую, является ли этот треугольник прямоугольным.

2. Определить функцию toDegrees, принимающую в качестве параметра величину угла в радианах и конвертирующую ее в градусы.

3.

Вариант 2

1. Определить функцию isTriangle, принимающую в качестве аргументов три числа и проверяющую, возможно ли построить невырожденный треугольник с такими длинами сторон. Функция возвращает True, если это возможно, и False в противном случае.

2. Определить функцию toRadians, принимающую в качестве параметра величину угла в градусах и конвертирующую ее в радианы.

3.

Вариант 3

1. Определить функцию isSortedAcs, принимающую в качестве аргументов три числа и возвращающую True, если они отсортированы по возрастанию, и False в противном случае.

2. Определить функцию isDivisor, принимающую в качестве аргументов два целых числа и возвращающую True, если первое число является делителем второго, и False в противном случае.

3.

Вариант 4

1. Определить функцию isSortedDesc, принимающую в качестве аргументов три числа и возвращающую True, если они отсортированы по убыванию, и False в противном случае.

2. Определить функцию isMultiple, принимающую в качестве аргументов два целых числа и возвращающую True, если первое число является кратным второго, и False в противном случае.

3.

Вариант 5

1. Определить функцию circumference, принимающую в качестве аргумента радиус окружности и возвращающую ее длину.

2. Определить функцию maxOfThree, принимающую в качестве аргументов три числа и возвращающую максимальное из них.

3.

Вариант 6

1. Определить функцию areaOfDisk, принимающую в качестве аргумента радиус круга и возвращающую его площадь.

2. Определить функцию minOfThree, принимающую в качестве аргументов три числа и возвращающую минимальное из них.

3.

Контрольные вопросы

1. Какими командами GHCi выполняется загрузка файла и повторная загрузка последнего файла?

2. Формат определения функций.

3. Композиция функций.

4. Особенности конструкции if-then-else.

5. Формат конструкции case.

6. Система структуризации кода Haskell.

7. Кусочное определение функций.

Лабораторная работа №3.
Списки и кортежи. Типы и классы типов

Цели работы.

Изучение основ работы со списками и кортежами в Haskell. Изучение базовых функций для работы со списками и кортежами. Знакомство с основными типами данных и классами типов.



2015-12-13 434 Обсуждений (0)
Конструкции if-then-else и case 0.00 из 5.00 0 оценок









Обсуждение в статье: Конструкции if-then-else и case

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...



©2015-2020 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (434)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)