Распечатка 1

Обучение Лиспу

Распечатка 1. Диалог между студентом и машинным учителем при построении функции rightp

Определите функцию rightp с тремя аргументами, сторона1, сторона2 и сторона3, представляющими длины трех сторон заданного треугольника, причем сторона3— наибольшая. Функция rightp проверяет, является ли этот треугольник прямоугольным, т. е. равна ли сумма квадратов сторона1 и сторона2 квадрату сторона3. Особенность функции rightp состоит в том, что измерения допускаются с 2%-ной точностью, т. е. она должна возвращать значение t, если сумма квадратов двух первых сторон лежит в пределах 2% отклонения от квадрата третьей стороны.

Например, (rightp 3 4 5,0l)=t, поскольку 32+42=25, что лежит в пределах отклонения в 2% от квадрата 5,01.

1. (defun rightp (сторона1 сторона2 сторона3) (cond))

Да, вы можете воспользоваться функцией cond в этом случае, однако есть намного более легкий способ проверки того, что сумма квадратов двух первых сторон лежит в пределах 2%-ного отклонения от квадрата третьей стороны. Поскольку нам потребуется лишь один тест, вы можете использовать здесь предикат.

2. (defun rightp (сторона1 сторона2 сторона3)
       (lessp (difference) <ЧИСЛO2>))

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

3. (defun rightp (сторона1 сторона2 сторона3)
         (lessp (abs (difference <ЧИСЛО3> <ЧИСЛO4>))
            <ЧИСЛO2>))

С чего вы хотите начать?

НАЖМИТЕ ЕСЛИ ХОТИТЕ

1

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

2

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

Ваш выбор: 1

4. (defun rightp (сторона1 сторона2 сторона3)
      (lessp (abs (difference (plus) <ЧИСЛO4>))
           <ЧИСЛO2>))

Неправильно. Для этого отрезка программы вам следует построить вспомогательную функцию, а не пытаться программировать впрямую. Наша функция rightp к настоящему времени имеет четыре уровня вложенности, а отношение, которое мы хотим запрограммировать, т. t. сумма квадратов двух чисел, было бы полезной вспомогательной функцией. Таким образом, попробуем запрограммировать сумму квадратов двух первых сторон с помощью некоторой вспомогательной функции.

5. (defun rightp (сторона1 сторона2 сторона3)
          (lessp (abs (difference (sumsq <АРГУМЕНТЫ>) <ЧИСЛO4>))
             <ЧИСЛO2>))

Что, по вашему мнению, должна бы делать вспомогательная функция sumsq?

НАЖМИТЕ ЕСЛИ ХОТИТЕ

1

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

2

Взять два аргумента функции — первую и вторую стороны. Вычислить сумму квадратов этих чисел.

3

Предоставить выбор учителю.

Ваш выбор: 1

Неправильно. Мы не хотели бы иметь вспомогательную функцию, которая всего лишь вычисляет сумму двух чисел. Вам следует построить вспомогательную функцию так, чтобы она не сводилась к суммированию.

Было бы правильнее определить sumsq таким образом, чтобы у нее было два аргумента (в данном случае (1) — первая сторона и [2] — вторая сторона) и чтобы вычислялась сумма квадратов этих чисел.

Ваш выбор: 2

6. (defun rightp (сторона1 сторона2 сторона3)
         (lessp (abs (difference (sumsq сторона1 сторона2 (times)))
             <ЧИСЛО2>))

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

7. (defun rightp (сторона1 сторона2 сторона3)
             (lessp (abs (difference (sumsq сторона1 сторона2) (square сторона 3))) (plus)))

Этого я не понимаю, Роб. Как вы собираетесь программировать вычисление 2% от квадрата третьей стороны?

[ОБЪЯСНИТЕ]

Хорошо, объясню, что я хотел. Вы можете либо прямо здесь закодировать, либо построить вспомогательную функцию вычисления 2% от квадрата третьей стороны. Чтобы было понятнее, построим вспомогательную функцию, которую назовем percentage (процент). Мы определим функцию percentage после того, как закончим программирование функции rightp.

Что, по-вашему, должна была бы делать вспомогательная функция percentage?

НАЖМИТЕ ЕСЛИ ХОТИТЕ

1

Чтобы было два аргумента, одна сотая от 2 и квадрат третьей стороны. Вычислить их произведение.

2

Чтобы было два аргумента — 2 и третья сторона. Вычислить заданный процент от квадрата второго аргумента.

3

Чтобы было два аргумента — 2 и квадрат третьей стороны. Вычислить заданный процент от второго аргумента.

4

Чтобы был один аргумент—квадрат третьей стороны. Вычислить 2 процента от се аргумента.

5

Выбор функции предоставить учителю.

Ваш выбор: 3

Очень хорошо.

8.   (defun rightp, (сторона1 сторона2 сторона3)
       (lessp (abs (difference (sumsq (сторона1 сторонa2)(square сторона3)))
                     (percentage 2(square сторона3))))

Хорошо. Мы завершили программирование функции rightp. Теперь запрограммируем вспомогательную функцию (функции), которую мы использовали, но еще не определили.

С чего бы вы хотели начать?

НАЖМИТЕ ЕСЛИ ХОТИТЕ

1

Определить вспомогательную функцию sumsq.

2

Определить вспомогательную функцию percentage.

Ваш выбор: 1

Определим вспомогательную функцию sumsq. У нес два аргумента, мы предлагаем обозначить их как (число1 число2), хотя их можно назвать как угодно. Функция sumsq должна вычислять сумму квадратов число1 и число 2.

9. (defun sumsq (s у)
     (plus (square s)(square у)))

Хорошо. Мы закончили программирование функции sumsq. Теперь запрограммируем вспомогательную функцию (функции), которую мы использовали, но еще не определили.
Определим вспомогательную функцию percentage. У нее два аргумента, мы предлагаем обозначить их (проц общий), хотя их можно назвать как угодно. Функция percentage должна вычислять проц процентов от общий.

10. (defun percentage (х у)
      <ПРОЦЕСС>

[ОБЪЯСНИТЕ]

Хорошо, объясню, что я хотел. Давайте разберемся, как записать вычисление х процентов от второго числа.

Как вы можете записать вычисление х процентов от второго числа?

НАЖМИТЕ ЕСЛИ ХОТИТЕ

1

Умножить второе число на одну сотую от х.

2

Умножить второе число на х.

3

Разделить второе число на 100.

4

Предоставить выбор учителю

Ваш выбор: 1
Хорошо.

11. (defun percentage (ху))
      (times <ЧИСЛО1> <ЧИСЛО2>))

С чего вы хотите начать?

НАЖМИТЕ ЕСЛИ ХОТИТЕ

1

Написать программу для вычисления одной сотой от первого числа.

2

Написать программу для получения второго числа.

Ваш выбор: 1

12. (defun percentage (ху))
       (times (quotient х 0,01) <ЧИСЛО2>))

Это неверное число. Как вы собираетесь определять одну сотую в языке Лисп?

13. (defun percentage (ху)) (times (quotient х 100) у))

Хорошо. Теперь мы закончили программирование функции percentage. Больше не осталось вспомогательных функций, нуждающихся в определении.