/inch {72 mul} def
Начинаем новую линию и помещаем текущую точку на расстояние в дюйм от границ:
newpath
/ inch / inch rnoveto
К этому моменту линия состоит из одной точки с координатами (-72, 72). Добавим стороны с помощью оператора lineto. Этот оператор добавляет к пути отрезок, соединяющий текущую точку и точку, координаты которой находятся на стеке. Координаты конца отрезка становятся новыми координатами текущей точки.
Итак, добавим три стороны квадрата:
2 inch I inch lineto
2 inch 2 inch lineto
1 inch 2 inch lineto
Таблица 2 Команды для работы с графическими объектами
Описание команд | Примечание |
Сохранение и восстановление графического контекста | |
-gsave->- | Запись текущего графического контекста в стек графических контекстов |
-grestore-> | Восстановление текущего графического контекста из сохраненного командой gsave |
-save-> образ памяти метка | Сохранение текущего графического контекста в стеке и запись в стек операндов образа памяти |
образ памяти restor->- | |
Изменение системы координат | |
х у translated | Перенос начала координат |
a°rotate-> | Поворот координатных осей |
Sx Sy scale-> | Изменение масштаба осей координат |
Создание графического пути | |
-newpath-> | инициализация нового графического пути |
-closepath->- | Замыкание участка графического пути из текущей точки в начальную точку пути |
xymoveto->- . | Установка текущей точки без проведения линии ; |
-currenlpoint->x у | Определение координат текущей точки |
x у lineto->- | Добавление отрезка прямой линии |
Использование графического пути для вывода фигур | |
-stroke->- | Построение линии вдоль графического пути |
-fill-> | Закрашивание текущим цветом фигуры, ограниченной замкнутым графическим путем . |
-pathbbox-> | Определение координат прямоугольника, охватывающего текущий путь |
-clippath->- | Создание нового графического пути вокруг всех ъКтгъггоГг |
Получившуюся линию можно замкнуть кратчайшим отрезком. Это делается оператором closepath. Этот оператор особенно полезен при закраске фигур. Теперь полученную линию можно нарисовать оператором stroke. Оператор showpage закончит вывод страницы на печать:
Closepath
Stroke
showpage
Закраска фигур
Сначала создается путь, но вместо вызова оператора stroke вызывается оператор fill, который заполняет путь текущим цветом. Применение fill вместо stroke в приведенном примере даст закрашенный квадрат вместо контура.
Вставка текста
Вставка текста состоит из следующих основных шагов:
• Выбрать необходимый шрифт;
• Сделать текущей точку, в которую будет помещен левый нижний угол текста;
• Передать строку для печати оператору 'show'.
Оператор 'show' - это простейший оператор для вывода строки. Его аргументом является строка, которую он выводит текущим шрифтом. Вывод происходит, начиная с текущей точки, которая становится левой нижней точкой по отношению к тексту. После того как текст был выведен, текущей становятся точка соответствующая нижнему правому краю строки.
Ниже приведен текст программы для вывода графика функции f=sin(x)\2
% IPS-ADOBE-1.0
%%tTitle: график функции f~sin(x)\2
%%Creator: Иванова Анна
%%Pages: I
%%BoundingBox: 0 0 595 842
%%EndCojranents
/cm { 72.0 mul 2.54 div } def %перевод см в пункты /хО 21.0 2 div 5.0 sum -cm def ^координаты нижнего /ус 29,7 2 div 2.0 sum era def %левого угла графика
%%EndProlog
%%Page: I 1
gsave
xO yO translate ^сдвигаем начало координат к рамке
newpath
0 0 moveto %^воводим рамку размером' 10см х 4см
10 cm 0 rlineto
0 4 cm rlineto
~1О cm 0 rlineto -
closepath
.3 setliaewidth %толщина рамки 0.3 пункта
stroke %рисуем линию вдоль сторон рамки
newpath
0 8 1440 %заголовок цикла: оа? 0°до8
{
/a exch def %локальная переменная
а 144.0 div %стек: эо?о число в диапазоне 0...10см cm %с^ек: х координата лежит в диапазоне %0.Л0см
a sin
а 2 div 1.0 add
2- 0 mul - _ .
cm %стек: x у %координата у лежит в %интервале G...4 см
а 0 eg
{ moveto } %переходигг в первую точку % стек:х у
{ lineto } ifelse
} for % оператор цикла
1 setlinewidth'% график выводится жирной линией
stroke -% рисует линию вдоль прямой
grestore
showpage
%%Trailer
На рис. 4 приведен результат выполнения программы.
Рисунок 4 – Вид окна с результатами выполнения программы
4.6 Командный интерпретатор
Командный интерпретатор является одной из важнейших программ, обеспечивающих диалог пользователя с системой. Он запрашивает у пользователя команду и анализирует ее. Если команда является внутренней по отношению к командному интерпретатору, то он реализует ее своими средствами (например, команда смены директории - cd - реализуется функцией cd ()). Если же введенная команда не является внутренней, он запускает эту - команду на выполнение (функция execvp()), В случае некорректной команды, выводится сообщение об ошибке.
Все современные системы UNIX поставляются по крайней мере с тремя командными интерпретаторами: Bourne shell (/bin/sh), С shell (/bin/csh) и Коrn shell (/bin/ksh). Существует ещё несколько интерпретаторов, например Bourne-Again shell (bash), со сходными функциями.
В UNIX реализуется следующий сценарий работы в системе:
• При включении терминала активизируется процесс getty (M), который является сервером терминального доступа и запускает программу login(l), которая, в свою очередь, запрашивает у пользователя имя и пароль.
• Если пользователь зарегистрирован в системе и ввёл правильный пароль, login(l) запускает программу, указанную в последнем поле записи пользователя в файле /etc/passwd. В принципе это может быть любая программа, но в нашем случае - это командный интерпретатор shell.
• Shell выполняет соответствующий командный файл инициализации, и выдаёт на терминал пользователя приглашение. С этого момента пользователь может вводить команды.
• Shell считывает ввод пользователя, производит синтаксический анализ введённой строки, подстановку шаблонов и выполняет действие, предписанное пользователем (это может быть запуск программы, выполнение внутренней функции интерпретатора) или сообщает об ошибке, если программа или функция не найдены.
• По окончании работы пользователь завершает работу с интерпретатором, вводя команду exit, и выходит из системы.
Основной алгоритм программы, реализующей функции командного интерпретатора, представлен на рисунке 5. В ней осуществляется вывод на экран строка с - текущей директорией и приглашением командного интерпретатора, запрашивающим команду. После ввода пользователем команды, вызывается функция (translate), которая делит введенную команду на имя команды и ее аргументы, возвращая при этом константу в соответствии с именем команды. Потом с помощью оператора switch анализируется возвращенная константа и выполняются соответствующие действия.
Translate - функция разбора строки команды, введенной пользователем с клавиатуры, на имя команды и ее аргументы. Функции передается параметр ~ строка команды, возвращаемые значения - имя команды в переменной command, список аргументов в массиве р и константа, определяющая команду.
Алгоритм функции translate представлен на рисунке 6.
Sozd - функция, выполняющая запуск внешней команды. Функция создает дочерний поток, в котором выполняется команда, возвращает результат выполнения команды. В случае если команда не найдена, выдается сообщение об ошибке.
Алгоритм функции sozd представлен на рисунке 7.
F - функция выполняет действия аналогичные команде cat>1.txt. являющейся внешней, т.е, производит запись введённой информации в файл. Весь ввод с консоли направляется в файл 1 .txt. Для вызова функции следует нажать клавишу «f», для завершения записи в файл нажать сочетание клавиш «Ctrl+Z», Файл создается с именем l.txt в текущей директории.
Алгоритм функции F представлен на рисунке 8.
Рисунок 5. Основной алгоритм программы
Рисунок 6 Алгоритм функции translate
Рисунок 7. Алгоритм функции sozd
Рисунок 8. Алгоритм функции F
ПРИЛОЖЕНИЕ А
Федеральное Агентство по образованию РФ
Московский Государственный Технический Университет
«МАМИ»
Кафедра «автоматика и процессы управления»
Курсовая работа защищена с оценкой
(подпись преподавателя, дата)
КУРСОВАЯ РАБОТА
но дисциплине «Системное программное обеспечение»
Вариант №14
Тема: «Разработка командного интерпретатора»
Курсовая работа допущена к защите
(подпись преподавателя, дата)
Выполнила ст. группы 6УИ9