Шаг 34.
Основы языка Haskell. Основные типы данных, операции, способы определения функций. Задачи для самостоятельного решения

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


   Замечание. Найдите ошибки, описки, неточности и прочие изъяны в приведенных задачах.

1. Операционная семантика выражений и функций

    1. Укажите ошибки в записи следующих выражений:

   (1) 1+(2+(3+4);   (5) 7 rem 4;
   (2) False - 4;    (6) (-2.1234+(3-4))/(4.213/4-0.213);
   (3) 10 && True;   (7) 4 `div` (3*2-6).
   (4) 10 10;

    2. Выполнив следующую последовательность выражений в командной строке, определите назначение системной переменной $$:

   Prelude> (220+3)-1
   ...
   Prelude> $$
   ...
   Prelude> 444 `div` $$

    3. Определите, какие из указанных ниже функций будут отмечены интерпретатором неверными (объясните причину этого):

   x1:: Integer; x1 = 14811
   x2:: Integer; x2 = -97531
   y1:: Double; y1 = 0.12345
   y2:: Double; y2 = -8765543.23
   z1:: Bool; z1 = True
   z2:: Bool; z2 = False
   ---------------------
   f1 = (x1-x2)/23
   f2 = x1 `div` x2
   f3 = x1+3.14-x2
   f4 = z1&&(y1>y2)||z2
   f5 = y2*x2-x1
   f6 = (y1+y2)>0&&(x1*x2)<0
   f7 = x2 `mod` 2 + y1

    4*. Определите назначение следующих функций:

   (а) xxx s = s>='0' && s<='7';
   (б) yyy s = s>='0' && s<='9';
   (в) zzz s = s>='A' && s<='F' || s>='a' && s<='f';

    5*. Напишите функцию, аргументом которой является символ и возвращает True, если аргумент - строчная или прописная буква латинского алфавита; в противном случае функция возвращает False.

2. Функции, содержащие условные выражения

    1*. Напишите программу для вычисления значения функции:

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

    3*. Напишите программу для вычисления значения функции:

    4*. Напишите программу для вычисления значения функции (x,y ∈ R):

    5*. Напишите функцию, возвращающую наибольшее из трёх чисел.

    6*. Напишите функцию, которая по заданным сторонам квадрата и прямоугольника определяет, какая из этих двух фигур (квадрат или прямоугольник) имеет большую площадь и периметр.

    7. Напишите функцию, определяющую по заданным вещественным числам x и y номер квадранта, в котором расположена точка A(x,y).

    8*. Напишите функцию, которая по знаку арифметической операции выводит её название. Например, "+" - сложение.

    9*. Напишите функцию, выводящую по номеру месяца его название.

    10. Напишите функцию, определяющую сумму цифр целого числа n<1000.

    11. Напишите функцию, подсчитывающую число рождения, которым называется сумма всех цифр указанной даты. Например, у человека, рождённого 20 декабря 1550 года, число рождения равно (2+0)+(1+2)+(1+5+5+0)=16.

    12*. Напишите функцию, которая возвращает по заданному числу месяца и по дню недели первого числа этого месяца день недели для заданного числа. Например, день недели первого числа месяца - пятница, тогда шестой день этого месяца - среда.

    13*. [1, с.144] Напишите функцию для вычисления дня Пасхи по формуле Гаусса. В n-й год от Рождества Христова западные церкви празднуют Пасху

   (22+d+e) марта или (d+e-9) апреля,
где: d=(19a+M) mod 30, e=(2b+4c+5d+N) mod 7,
     a=n mod 19, b=n mod 4, c=n mod 7;
     M=23, N=3 при n=17**; M=24, N=6 при n=20**;
     M=23, N=4 при n=18**; M=24, N=7 при n=21**.
     M=24, N=5 при n=19**;

    14**. Укажите назначение следующей функции:

   f210:: String -> Int -> String
   f210 wd d | indexOf week wd<0 
                    = "Incorrect day of week"
             | True = week !! ((d-1+indexOf week wd) `rem` 7)
     where indexOf lst x = innerIndexOf lst x 0
           innerIndexOf lst x n | n>=length lst = -1
                                | lst !! n==x   = n
                                | True          = innerIndexOf
                                                       lst x (n+1)
           week = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
   ----------------------------------------------------------
   -- Неудачные тестовые примеры:
   ------------------------------
   test =   f210 "Fri" 27=="Wed"
         && f210 "Mon" 22=="Mon"
         && f210 "Wed" 30=="Thu"

    15. Сравните приведенные ниже функции с точки зрения количества сравнений:

   min3 x y z = if x<=y 
                  then if x<=z then x else z
                  else if y<=z then y else z
   -----------------------------------------
   min3' x y z = if x<=y && x<=z
                   then x
                   else if y<=z then y else z

    16*.  Задача FizzBuzz (Имран Гари). Напишите функцию, которая печатает числа от 1 до 100, но вместо чисел, кратных трем, печатает "Fizz", вместо чисел, кратных пяти, - "Buzz", а если число кратно одновременно трём и пяти, то печатает "FizzBuzz".

3. Предикаты

    1. Напишите функцию, определяющую, принадлежит ли точка M(x,y) кругу с центром в точке (7.33,-21.1) и R=23.5, если x, y - заданные действительные числа.

    2. Напишите функцию, определяющую, принадлежит ли точка N(x,y,z) шару с центром в точке (1.5,200,-4.12) и R=72.8, если x, y, z - заданные действительные числа.

    3. Напишите функцию, определяющую, принадлежит ли точка M(x,y) окружности с центром в точке (-1.2,0.1) и R=7, если x, y - заданные действительные числа.

    4. Напишите функцию, определяющую, принадлежит ли точка N(x,y,z) сфере с центром в точке (-0.5,1,-1.99) и R=91.19, если x, y, z - заданные действительные числа.

    5. Напишите функцию, реализующую предикат, определяющий, образуют ли три заданных целых числа арифметическую прогрессию.

    6. Напишите функцию, определяющую, является ли заданное целое число чётным.

    7. Напишите функцию, определяющую, применялась ли для записи целого числа m<1000 только одна цифра.

    8. Напишите функцию, определяющую, входит ли цифра 7 в запись данного натурального числа n<100000.

    9. Напишите функцию, определяющую, представляет ли собой заданное четырёхзначное натуральное число палиндром.

    10*. Напишите функцию, определяющую, является ли заданное натуральное число простым числом.

    11*. Укажите назначение следующих функций:

   (1) seven:: Integer -> Bool
       seven r = if (r<0) || (r>10000)
                   then error "0<r<10000"
                   else (r `div` 1000)==7 ||
                        ((r `mod` 1000) `div` 100)==7 ||
                        (((r `mod` 1000) `mod` 100) `div` 10)==7 ||
                        (r `mod` 10)==7

   (2) pal:: Integer -> Bool
       pal m = if (m<1000) || (m>9999)  
                 then error "0<r<10000"
                 else (((m `div` 100)-((m `div` 1000)*10))*10)+
                      (m `div` 1000) == m `mod` 100      

(1)Гашков С.Б. Занимательная компьютерная арифметика: Быстрые алгоритмы операций с числами и многочленами. - М.: Книжный дом "ЛИБРОКОМ", 2012. - 224 с.

    Со следующего шага мы начнем рассматривать основные функции библиотеки Prelude.




Предыдущий шаг Содержание Следующий шаг