Назад
Список дополнительных задач
Задачи из этого списка даются в качестве индивидуальных заданий.
- S-выражение.
Прочитайте из стандартного ввода (например, при помощи
s <- getContents
или последовательных вызовов c <- getChar
) S-выражение и вычислите его
значение по правилам языка LISP. Ограничьтесь арифметическими операциями.
$ ./eval
(+ 1 (* 2 3))
7
- Вычисление значения выражения.
Прочитайте из стандартного ввода (например, при помощи
s <- getContents
или последовательных вызовов c <- getChar
) арифметическое выражение в
инфиксной форме и вычислите его значение.
$ ./eval
2 + 2 * 2
6
$ ./eval
(2 + 2) * 2
8
- Системы счисления — 1.
Прочитайте число, записанное в некоторой системе счисления, и основание этой системы и вычислите
значение числа (в десятичной системе).
- Системы счисления — 2.
Прочитайте число, записанное в десятичной системе счисления, и основание некоторой системы и переведите
число в эту систему.
- Палиндром.
Прочитайте строку и выясните, является ли она палиндромом (читается одинаково слева направо и справа налево
без учёта пробелов и знаков препинания). Пример: «Он дивен, палиндром, и ни морд, ни лап не видно».
- Компоненты связности.
Неориентированный граф задан в виде списка рёбер (список пар
[(Integer, Integer)]
).
Подсчитайте количество компонент связности в этом графе.
- Алгоритм Дейсктры.
Ориентированный взвешенный граф задан в виде списка рёбер (список пар
[(Integer, Integer, Integer)]
.
Подсчитайте длины кратчайших путей от заданной вершины до
всех остальных вершин.
- Имя пользователя.
Прочитайте с клавиатуры логин любого пользователя и напечатайте его имя, прочитав и разобрав файл
/etc/passwd
.
Используйте import IO
.
Пример чтения строки с клавиатуры: do putStr "Login: " ; hFlush stdout ; login <- getLine ;
Пример открытия файла и чтения строки из файла: do f <- openFile "/etc/passwd" ReadMode ; s <- hGetLine f ;
Проверка на конец файла: do iseof <- hIsEOF f
.
$ ./finger
Login: fenster
Alexander Fenster
- Треугольник Паскаля.
Напечатайте первые несколько строк треугольника Паскаля:
$ ./pascal
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1