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

         

к решению задач, запомните следующее


Прежде чем вы приступите к решению задач, запомните следующее простое правило: каждое из перечисленных ниже слов должно завершаться соответствующим символом:

СловоЗавершающий символ
:;
.""
()

1.1. Определите слово с именем ДАР, которое при своем выполнении выдаст название какого-то подарка. Например, вы можете определить : ДАР ." подставку для книг " ;
Теперь определите слово с именем ДАРИТЕЛЬ, которое выводит на печать имя некоего лица, а затем слово с именем СПАСИБО, определение которого включает вновь созданные слова ДАР и ДАРИТЕЛЬ и выводит на печать сообщение, аналогичное следующему: Дорогая Маша. спасибо за подставку для книг, ок
1.2. Определите слово с именем МИНУС-ДЕСЯТЬ, которое выбирает некоторое число из стека, вычитает 10 и помещает полученный результат в стек. (Подсказка: вы можете использовать слово +) Не забудьте включить в определение стековую нотацию. 1.3. После того как вы введете слова при решении упр. 1.1, переопределите слово ДАРИТЕЛЬ так, чтобы можно было вывести на печать чье-то другое имя (не переопределяя слово СПАСИБО), выполните последнее снова. Сможете ли вы объяснить, почему слово СПАСИБО выводит на печать имя первого дарителя?


Про ошибки на сайте обязательно сообщите .


10.1. Введите несколько известных цитат в некоторый доступный блок, скажем в блок 228. Определите слово с именем ЗАМЕНА, которое берет из стека два значения в коде ASCII и заменяет все вхождения первого символа в блоке 228 на второй символ. Так следующее выражение заменит все литеры А литерами Е: 65 69 ЗАМЕНА
10.2. Определите слово с именем ПРОГНОЗ, которое будет выдавать на вашем терминале некоторый прогноз, например «Вы получите хорошие новости по почте>. Прогноз должен выбираться случайным образом из списка, включающего 16 (или менее) вариантов. Каждый прогноз может иметь длину до 64 символов.
10.3. а) Определите слово ДА/НЕТ?, которое можно использовать в прикладной программе, требующей утвердительного или отрицательного ответа пользователя. Определение должно ожидать нажатия одной клавиши, после которого послать в стек значение истина, если была нажата клавиша Y, и ложь при нажатии любой другой клавиши.
б) Иногда пользователь нажимает эту клавишу, работая в режиме нижнего регистра. Перепишите определение ДА/НЕТ? таким образом, чтобы оно воспринимало нажатие клавиши Y в обоих регистрах как «да».
в) Пользователь может по ошибке вместо клавиши Y (например, при записи файла на диск, над которым он проработал последние три часа) нажать другую клавишу. Перепишите определение ДА/НЕТ? таким образом, чтобы оно воспринимало символы, поступающие только при нажатии клавиш Y и N в верхнем и нижнем регистрах и не прекращало своего выполнения до тех пор, пока не получит сигналы от этих клавиш с записью в стек истины в случае Y и лжи в случае N. 10.4. Согласно восточной легенде Будда наделял всех людей, родившихся в определенном году, чертами, присущими одному из 12 животных. На этой основе построен циклический календарь. Цикл составляет 12 лет, по истечении которых он возобновляется. Например, считается, что 1900 год был «годом крысы». Внутри цикла годы, обозначенные названием животного, чередуются в следующем порядке: год крысы, год быка, год тигра, кролика, дракона, змеи, лошади, барана, обезьяны, петуха, собаки, свиньи.


11.1. Введите определяющее слово с именем ЗАГРУЗКА, которое будет определять слова, загружающие при своем исполнении некоторый блок. Например, выражение690 ЗАГРУЗКА КОРРЕСПОНДЕНЦИЯ
должно определить слово КОРРЕСПОНДЕНЦИЯ. В результате выполнения последнего должен быть загружен блок 600.
11.2. Определите слово с именем СИСТЕМА., создающее слова для вывода чисел в конкретных системах счисления. Например, выражение 16 СИСТЕМА. Н.
должно определить слово Н., которое выводило бы значение из вершины стека в шестнадцатиричной системе, но саму систему счисления (BASE) не меняло бы: DECIMAL 17 DUP Н. .<return> 11 17 ok
11.3. Определите слово с именем МНОГО, чтобы оно получало адрес некоторого слова, например CR или STAR, и создавало множественное число этого слова, в нашем случае CRS или STARS. Вы будете задавать адрес слова в единственном числе посредством апострофа. Например, фраза ' CR МНОГО CRS
определит слово CRS так же, как и выражение : CRS ?DUP IF 0 DO CR LOOP THEN ;
11.4. На французский язык слова DO и LOOP переводятся как TOURNE и RETOURNE соответственно. Определите TOURNE и RETOURNE как французские имена слов управления циклом, используя слова DO и LOOP, после чего проверьте их, написав цикл на французском языке.
11.5. Напишите слово с именем РАЗ, которое вызовет исполнение оставшихся во входном потоке символов до возврата каретки. Число исполнений задается числом, находящимся в вершине стека, например: 7 РАЗ 42 EMIT SPACE<return> * * * * * * * ok
11.6. В настоящей главе демонстрировался пример использования определяющего слова с именем ФОРМА. Чтобы задать конкретное изображение, нужно было ввести восемь чисел, каждое из которых представляло собой битовый шаблон отдельной строки. Придумайте более изящный способ задания описания рисунка, содержащего 8х8 элементов изображения. Можно, например, вместо шестнадцатиричных цифр задавать некоторую схему.
Теперь реализуйте то, что вы придумали (с привлечением существующего определения слова .РЯД). Проверьте свой способ формирования рисунка.


12.1. Для описания четырех полей в простой файловой системе мы применяли следующие определения: ( смещение) ( длина) CREATE фамилия 0 , 16 , CREATE имя 16 , 12 , CREATE работа 28 , 24 , CREATE телефон 52 , 12 ,
а затем добавили еще одно 64 CONSTANT /ЗАПИСЬ
чтобы определить длину всей записи. Изменяя длину поля с фамилией, мы должны также подправлять начальный адрес остальных трех полей, а также значение переменной /ЗАПИСЬ Найдите программный способ изменения этих значений. Определите синтаксис и напишите программу.
12.2 Используя язык базы данных, реализованной в простой файловой системе, определите новое слово «вызвать», которое осуществляло бы поиск имени и помещало в вершину стека ФИО и номер телефона, например: Вызвать Конни
Конни Чанг 555-9653 ok



2.1. В чем различие между DUP DUP и 2DUP? 2.2. Определите слово NIP (отщипнуть) для удаления второго элемента стека, т. е. ( a b -- b)
2.3. Определите слово TUCK (подобрать) для копирования, верхнего элемента стека и размещения копии в стеке третьим элементом, т. е. ( a b -- b a b)
2.4. Определите слово —ROT, которое размещало бы верхний элемент под вторым и третьим (в противоположность ROT), т. е. ( a b c -- c a b)
 2.5. Напишите предложение для перестановки четырех верхних элементов стека в обратном порядке, т. е.  ( 1 2 3 4 -- 4 3 2 1)
2.6. Напишите слово с именем 3DUP, которое будет дублировать три верхних элемента стека, например ( 1 2 3 -- 1 2 3 1 2 3)
Напишите определения для следующих выражений в инфиксной форме с учетом указанной стековой нотации:  2.7. a2 + ab + c ( c a b -- результат) a - b 2.8 ----- ( a b -- результат) a + b
2.9. Представьте себе, что вы программист, занимающийся учетом продукции на птицеферме Мерайи. Определите слово с именем УПАКОВКА, которое снимает со стека значение, равное числу яиц, снесенных в день подсчета на данной ферме. В результате его выполнения на печать выдается число коробок, требуемых для упаковки этих яиц, из расчета по 12 штук на коробку, а также число яиц, оставшихся неупакованными из-за того, что их недостаточно для заполнения еще одной коробки.
Про ошибки на сайте обязательно сообщите .


3.1. а) Введите ваши определения слов ДАР, ДАРИТЕЛЬ и СПАСИБО из упр. 1.1 и 1.3 в блок, после чего загрузите и исполните слово СПАСИБО,
б) с помощью редактора измените имя в определении ДАРИТЕЛЬ, после чего загрузите и исполните слово СПАСИБО снова. Что произойдет в этом случае?
3.2. Попытайтесь загрузить некоторые из наших математических определений из гл. 2 в какой-нибудь доступный блок, а затем загрузите его. Поэкспериментируйте.


5.1. Укажите различия между -1 и 1-.
5. 2 Переведите следующее алгебраическое выражение в форму определения Форта: -(ab)/c
при состоянии стека ( а b с --).
5.3. При состоянии стека (6 70 123 45 --)
напишите выражение, которое бы инициировало печать наибольшего из этих значений.
5.4. а) Определите слово 2ПОРЯДОК, которое из имеющихся в стеке двух чисел располагало бы в вершине большее, а оставшееся - под ним.
б) Определите слово ЗПОРЯДОК, которое располагало бы три заданных числа в стеке так, чтобы большее было в его вершине.
в) Вспомните определение ОБЪЕМ из гл. 4. Перепишите его, используя определение ЗПОРЯДОК, так, чтобы пользователь мог вводить измерения в любом порядке.
Практикум в масштабировании
5.5. Гистограмма - это графическое представление серии значений, каждая из которых выражена высотой или длиной некоторого отрезка. Определите слово с именем РИСУЙ - компонент вашей программы по созданию гистограмм По заданному значению в диапазоне от 0 до 100 слово РИСУЙ должно вывести на экран горизонтальную линию из звездочек, графически представляющую это заданное значение.
Трудность заключается в том, что на экране только 80 колонок Таким образом, значение 100 должно соответствовать 80 звездочкам, значение 50 - 40 звездочкам, значение 0 - 0 звездочкам и т. д. (Начинайте ваше определение с команды CR и используйте вариант слова STARS из упр. 4 7 )
5.6. В режиме калькулятора переведите указанные значения температур из одной шкалы в другую по формулам°C=(°F-32)/1.8; °F = (°C x 1.8) + 32; °K = °C + 273.
Выразите все аргументы и результаты целыми числами (в градусах):
а) 0°F в °С,
б) 212° F в °С;
в) -32° F в °С;
г) 16° С в °F,
д) 233° К в °С.
5.7. Определите слова для выполнения преобразований из упр. 5.3. Используйте следующие имена: F>C Р>K C>F C>K K>F K>C
Проверьте их выполнение с приведенными выше значениями.


В задачах с 6.1 и по 6. 6 вы должны создать определения нескольких слов, которые будут выводить шаблоны из звездочек. Это потребует применения циклов DO и BEGIN ... UNTIL. 6.1. Создайте слово с именем STARS, которое выводит п звездочек в одной строке, п задается в стеке. 6.2. Определите слово БРУСОК, которое выводит прямоугольник из звездочек. Ширина и высота (число строк) задаются в стеке в следующем порядке: ( ширина высота -- ).10 3 БРУСОК ********** ********** ********** ok
6.3. Создайте слово \STARS, которое выводит наклонные (ромбовидные) массивы из звездочек. Высота задается в стеке. Используйте цикл DO и для простоты примите ширину постоянной и равной 10 звездочкам. 3 \STARS ********** ********** ********** ok
6.4. Определите слово, которое выводит массивы из звездочек с наклоном в другую сторону, и назовите его /STARS. Высота должна задаваться в стеке, а ширину возьмите постоянной и равной 10 звездочкам. Используйте оператор DO. 6.5. Переопределите последнее слово с использованием оператора цикла BEGIN ... UNTIL.
6.6. Напишите определение с именем РОМБЫ, которое выводит заданное число ромбов, как показано в следующем примере: 6.7 В гл. 3 было введено слово THRU. Сможете ли вы написать определение этого слова с помощью вызова LOAD? Если хотите, расширьте функции слова так, чтобы при использовании его во время загрузки блока выводился бы номер последнего. 6.8. При рассмотрении слова LEAVE мы приводили пример, в котором вычислялись сложные проценты при норме процента 6% и начальном остатке 1000 дол. за 20 лет или же до тех пор, пока начальный остаток не удвоится, в зависимости от того, какое из событий наступит раньше. Перепишите это определение таким образом, чтобы значения начальной суммы и нормы процента находились в стеке и процесс вычисления завершился с помощью LEAVE как только сумма начального остатка удвоится. 6.9. Определите слово с именем **, которое вычисляло бы степень, например: 7 2 ** . 49 ok ( семь в квадрате ) 2 4 ** . 16 ок ( два в четвертой степени )
Для простоты показатель степени примите положительным, но убедитесь в том, что ** выполняется правильно, если показатель равен нулю (в результате должна получиться единица) или единице (в результате должно получиться само число).
2 РОМБЫ * *** ***** ******* ********* *********** ************* *************** ***************** ******************* ******************* ***************** *************** ************* *********** ********* ******* ***** *** * * *** ***** ******* ********* *********** ************* *************** ***************** ******************* ******************* ***************** *************** ************* *********** ********* ******* ***** *** *
<

Содержание раздела