Шрифт:
Пример 13. Найти площади двух кругов (с общим центром) и кольца между ними. Даны радиусы R1 и R2, причем R1 > R2. Как и ранее сперва напишем слово для целочисленных чисел. Если не совсем понятно почему не написать сразу универсальный вариант для вещественных данных, то поясняю: отладка в этом случае наиболее проста для сложных слов и для начинающих программистов, так как все данные на стеке видны сразу после их ввода, то удается проверить и понять работу кода вводя команду за командой. Этого преимущества лишены операторы для работы с вещественными числами. После написания слова с целыми аргументами не сложно перевести его код для работы с вещественными и получить результат того же типа.
: B13 ( R1 R2 -> S1 S2 S3) \ S1=Pi*R1^2 S2= Pi*R2^2 S3=S1-S2
SWAP DUP * 314 * \ R1 R2 -> R2 (Pi*R1^2)=S1
SWAP DUP * 314 * \ R2 S1 -> S1 (Pi*R2^2)=S2
2DUP – \ S1 S2 -> S1 S2 (S1-S2)=S3
;
Запустим наше слово на примере двух кругов с радиусами 25 и 15 соответственно.
25 15 B13
Ok ( 196250 70650 125600 )
Выше приведен вариант кода с целочисленными аргументами, причем все 3 площади больше в 100 раз из-за того, что мы приняли Пи равным 314. Перепишем пример для случая вещественных аргументов.
: B13 ( R1 R2 -> S1 S2 S3) \ S1=Pi*R1^2 S2= Pi*R2^2 S3=S1-S2
FSWAP FDUP F* 314E-2 F* \ R1 R2 -> R2 (Pi*R1^2)=S1
FSWAP FDUP F* 314E-2 F* \ R2 (Pi*R1^2)=S1 -> (Pi*R1^2)=S1 (Pi*R2^2)=S2
FOVER FOVER F- \ S1 S2 -> S1 S2 (S1-S2)=S3
;
Тестирование примера 13:
25E-1 15E-1 B13 F. F. F.
12.560000 7.0650000 19.625000 Ok
S1 = 19,625 = 3.14*2.5^2; S2 = 7,065 = 3.14*1.5^2; S3=S1-S2=12,56=19,625-7,065. Тестирование прошло успешно. Не забываем про обратный порядок печати со стека. Написанное слово работает правильно, соответственно стековой нотации. Если вам необходим другой порядок вывода, то можете самостоятельно скорректировать слово, добавив код после вызова «B13» и до вывода «F. F. F.».
Пример 14. Определить радиус окружности и площадь круга, через ее длину. Сразу составим программку для вещественного аргумента, ибо целочисленное огрубление будет давать неприемлемый по качеству результат для малых значений длины окружности.
: B14 ( L -> R S ) \ R=L/(2*Pi) S=Pi*R^2
628e-2 F/ \ L -> R=L/6.28 где 6,28=2*Pi=D
FDUP FDUP F* 314e-2 F* \ R -> R Pi*R^2
;
Посчитаем R и S для L=25,37
2537E-2 B14 F. F.
51.244976 4.0398089 Ok
R=25.37/6.28= 4,0398 и S=3,14* 4,0398^2= 51,244. Тест прошел успешно.
Пример 15. Зная площадь круга, вычислить его диаметр и длину.
: B15 ( S -> D L ) \ D=Квадратный_Корень(4*S/Pi) L=Pi*D
4E F* \ S -> 4*S
314E-2 F/ \ 4*S -> 4*S/Pi
FSQRT \ 4*S/Pi -> Квадратный_Корень(4*S/Pi)=D
FDUP 314E-2 F* \ D -> D D*Pi=L
;
Посчитаем диаметр и длину круга площадью равной 12,345.
12345E-3 B15 F. F.
12.452036 3.9656166 Ok
Квадратный корень из (12,345*4/3.14) равно 3,965616, а 3,965616*3,14=12,4520, то ест ь ИСТИНА. Пример довольно простой и нет других причин писать код для целочисленного варианта аргументов. В случае необходимости несложно самостоятельно решить эту задачу.
Пример 16. Вычислим расстояние между двумя точками на числовой оси, зная координаты.
: B16 ( X1 X2 -> |X1-X2| )
– ABS \ X1 X2 -> |X1-X2|
;
Для вещественных аргументов.
: B16 ( X1 X2 -> |X1-X2| )
F- FABS \ X1 X2 -> |X1-X2|
;
31E-1 -12E1 B16 F.
123.10000 Ok \ |3.1-(-120)|=123.1
Пример 17. По трем координатам на числовой оси (X1, X2, X3) вычислить следующие расстояния: |x1-x3|, |x2-x3| и их сумму. Сперва для целых чисел.
: B17 ( X1 X2 X3 -> |x1-x3| |x2-x3| {|x1-x3|+|x2-x3|} )
SWAP OVER \ X1 X2 X3 -> X1 X3 X2 X3
– ABS \ X1 X3 X2 X3 -> X1 X3 |X2-X3|
ROT ROT – ABS SWAP \ X1 X3 |X2-X3| -> | X1-X3| |X2-X3|
2DUP + \ | X1-X3| |X2-X3|-> | X1-X3| |X2-X3| (| X1-X3|+|X2-X3|)
;
Для вещественных.
: B17 ( X1 X2 X3 -> |x1-x3| |x2-x3| {|x1-x3|+|x2-x3|} )
FSWAP FOVER \ X1 X2 X3 -> X1 X3 X2 X3
F- FABS \ X1 X3 X2 X3 -> X1 X3 |X2-X3|
FROT FROT F– FABS FSWAP \ X1 X3 |X2-X3| -> | X1-X3| |X2-X3|
FOVER FOVER F+ \ | X1-X3| |X2-X3|-> | X1-X3| |X2-X3| (| X1-X3|+|X2-X3|)
;
Тест на координатах
–1E1 1E-1 3E2 B17 F. F. F.
609.90000 299.90000 310.00000 Ok