Программирование на языке Паскаль Модули. Необходимость в использовании
Программирование на языке Паскаль Модули
Необходимость в использовании модулей, или, другими словами, в модульном программировании, возникла в первую очередь из-за трудностей, связанных с огромными объемами программ, их сложностью и потребностью в коллективной работе. Модули значительно расширяют возможности языка. По определению модуль считается отдельной программой, его структура аналогична структуре программы - он представляет собой набор констант, типов данных, переменных, процедур и функций.
Модули предназначены для разбиения текста программы на несколько файлов. В модулях описываются переменные, константы, типы, классы, процедуры и функции. Для того чтобы эти объекты можно было использовать в вызывающем модуле (которым может быть и основная программа), следует указать имя файла модуля (без расширения .pas) в разделе uses вызывающего модуля. Файл модуля должен находиться либо в том же каталоге, что и основная программа, либо в подкаталоге Units системного каталога программы Pascal ABC.
Модуль в Pascal ABC представляет собой файл со следующим содержанием: unit имя модуля; раздел подключения модулей раздел описаний раздел инициализации раздел финализации end. Первая строка обязательна и называется заголовком модуля.
Раздел подключения модулей начинается со служебного слова uses, за которым следует список имен модулей, перечисляемых через запятую. Раздел описаний может включать разделы описания переменных, констант, типов, процедур и функций, которые следуют друг за другом в произвольном порядке.
Раздел инициализации состоит из служебного слова initialization, после которого следуют операторы, разделяемые символом "точка с запятой". Операторы из раздела инициализации модуля выполняются до начала основной программы. Раздел финализации состоит из служебного слова finalization, после которого следуют операторы, разделяемые символом "точка с запятой". Операторы из раздела финализации модуля выполняются после окончания основной программы.
Раздел финализации может отсутствовать, либо оба раздела инициализации и финализации могут отсутствовать. Раздел инициализации может также начинаться со служебного слова begin, в этом случае раздел финализации отсутствует.
В качестве объектов в модуле можно использовать процедуры и функции. Для этого в интерфейсной части модуля необходимо описать заголовки подпрограмм и видимые переменные, а в части реализации должны быть полные описания подпрограмм. Чтобы иметь возможность использовать интерфейсные объекты модуля в своей программе, нужно указать имя соответствующего tpu -файла после служебного слова uses (или список имен модулей, перечисленных через запятую): Uses Unit 1, Unit2, Unit3; В языке PascalABC есть одиннадцать стандартных модулей: System, Crt, GraphABC и др. Из них только модуль System подключается автоматически к любой программе.
Краткая характеристика модулей: модуль System включает все стандартные процедуры и функции языка Pascal и встроенные процедуры и функции языка Pascal. Подключается к любой программе автоматически, не требуя объявления; модуль Crt обеспечивает управление текстовым режимом работы экрана (перемещение курсора в любую позицию экрана, изменение цвета символов, фона и др.); модуль Graph обеспечивает управление графическим режимом работы экрана (позволяет создавать и выводить на экран графические изображения и текстовые надписи);
Модуль CRT предназначен для работы с текстовым окном. Он написан для совместимости с Turbo Pascal. В качестве текстового используется графическое окно модуля GraphABC, при этом запрещено изменение размеров окна и ввод/вывод осуществляется непосредственно в текстовом окне. В результате вывода может осуществляться скроллирование текстового экрана. Подключается командой Uses CRT; Модуль CRT
Экранная система координат (0,0) (x,y) X Y x y
Константы и переменные модуля CRT const Black=0; Blue=1; Green=2; Cyan=3; Red=4; Magenta=5; Brown=6; LightGray=7; DarkGray=8; LightBlue=9; LightGreen=10; LightCyan=11; LightRed=12; LightMagenta=13; Yellow=14; White=15; Цветовые константы. Используются для задания цвета символов и цвета фона в процедурах TextColor и TextBackGround и при присваивании переменной TextAttr.
var TextAttr: byte; Задает цвет символов и цвет фона одновременно. Первые 4 бита отводятся под цвет фона, последние 4 бита - под цвет символов. Например, присваивание TextAttr:=16*Yellow+Red задает красный цвет символов на желтом фоне. {программа «Работа с текстом»}
Процедуры Read() и ReadLn() Несмотря на простоту и удобство, стандартные процедуры read() и readln() не обеспечивают всех потребностей, возникающих при работе с клавиатурой. Их важнейший недостаток в том, что вместе с приемом символов они выполняют их отображение на экран (так называемое “эхо на монитор”). В большинстве случаев это либо не нужно, либо недопустимо. Кроме того, они рассчитаны только на ввод относительно небольшого подмножества символов (буквы, цифры, знаки препинания) и частичного использования специальных клавиш (например, Backspace для отмены только что введенного символа). Эти процедуры не могут распознать нажатие функциональных или редактирующих клавиш и их сочетаний с управляющими клавишами Ctrl, Alt, Shift. В силу указанных причин процедуры read и readln редко используются в серьезных программах. {программа «ReadLn»}
Функция ReadKey:char; Более универсальным средством взаимодействия с клавиатурой является стандартная функция readKey из модуля Crt. Функция вызывается без параметров, возвращает значение символьного типа и работает следующим образом. Организуется задержка выполнения с ожиданием нажатия клавиши. После того, как нажатие произведено, функция завершает работу, возвращая код нажатой клавиши. Полученное значение можно использовать далее в программе.
Функция ReadKey:char; Функция readKey не отображает введенный символ на экран, благодаря чему она широко используется для организации управления в различных диалоговых программах. В дополнение к этому readKey позволяет отслеживать нажатие более широкого множества клавиш, опознавая функциональные и редактирующие клавиши и их сочетания с управляющими клавишами Ctrl, Alt, Shift. {программа «ReadKey_1»}
Функция ReadKey:char; Если говорить более подробно, функция readKey исходит из того, что все множество клавиш и их сочетаний с управляющими клавишами разбито на два подмножества, которые обычно называют основным и расширенным наборами. В основной набор входят клавиши букв, цифр, разделителей и знаков препинания, их комбинации с клавишей Shift (или, что то же самое, при включенном переключателе CapsLock), а также клавиши Tab, BackSpace, Enter и Esc. Если нажата одна из перечисленных клавиш, то readKey возвратит обычный ASCII-код соответствующего символа.
Функция ReadKey:char; В расширенном наборе содержатся некоторые (не все) клавиши из основного набора в комбинации с клавишами Ctrl и Alt, а также функциональные и редактирующие клавиши. Если нажимается одна из клавиш расширенного набора, то функция readKey возвращает символ с кодом 0 (его представление в программе – chr(0) или #0). В этом случае повторное обращение к readKey вернет код клавиши из расширенного набора. {программа «ReadKey_2,3,4»}
Для графического вывода в PascalABC используется модуль GraphABC. Модуль GraphABC содержит константы, типы, процедуры, функции и классы для рисования в графическом окне. Для использования процедур и функций модуля GraphABC в разделе uses указываем имя этого модуля: Program qq; uses GraphABC;
Экранная система координат (0,0) (x,y) X Y x y
Управление цветом Модуль GraphABC содержит константы и функции для работы с цветами. Тип ColorType, описывающий цвет, определен следующим образом: type ColorType=integer; Стандартные цвета задаются символическими константами: clBlack – черный clPurple – фиолетовый clWhite – белый clMaroon – темно-красный clRed – красный clNavy – темно-синий clGreen – зеленый clBrown – коричневый clBlue – синий clSkyBlue – голубой clYellow – желтый clCream – кремовый clAqua – бирюзовый clOlive – оливковый clFuchsia – сиреневый clTeal – сине-зеленый clGray – темно-серый clLime – ярко-зеленый clMoneyGreen – цвет зеленых денег clLtGray – светло-серый clDkGray – темно-серый clMedGray – серый clSilver – серебряный
Для работы с цветами используются следующие функции: function RGB(r,g,b: integer): ColorType; Возвращает целое значение, являющееся кодом цвета, который содержит красную, зеленую и синюю составляющие с интенсивностями r, g и b соответственно (r, g и b – целые в диапазоне от 0 до 255, причем, 0 соответствует минимальной интенсивности, 255 – максимальной).
Цветовая система RGB
Графические примитивы procedure SetPixel(x,y,color: integer); Закрашивает один пиксел с координатами (x,y) цветом color. function GetPixel(x,y): integer; Возвращает текущее значение цвета для пиксела с координатами (x,y).
Графические примитивы procedure MoveTo(x,y: integer); Передвигает невидимое перо к точке с координатами (x,y); эта функция работает в паре с функцией LineTo(x,y). procedure LineTo(x,y: integer); Рисует отрезок от текущего положения пера до точки (x,y); координаты пера при этом также становятся равными (x,y). procedure Line(x1,y1,x2,y2: integer); Рисует отрезок с началом в точке (x1,y1) и концом в точке (x2,y2).
Построение графиков функций Задача: построить график функции y = 3 sin(x) на интервале от 0 до 2π. Анализ: максимальное значение ymax = 3 при x = π/2 минимальное значение ymin = -3 при x = 3π/2 Проблема: функция задана в математической системе координат, строить надо на экране, указывая координаты в пикселях.
Преобразование координат (x,y) X Y x y Математическая система координат Экранная система координат (пиксели) (xэ,yэ) xэ yэ (0,0) (0,0) a b k – масштаб (длина изображения единичного отрезка на экране) xэ = a + kx yэ = b - ky
Пример: построить график функции
При работе с графикой используются три основных инструмента: перо; кисть; шрифт.
Графические примитивы procedure Circle(x,y,r: integer); Рисует окружность с центром в точке (x,y) и радиусом r. procedure Ellipse(x1,y1,x2,y2: integer); Рисует эллипс, заданный своим описанным прямоугольником с координатами противоположных вершин (x1,y1) и (x2,y2). procedure Rectangle(x1,y1,x2,y2: integer); Рисует прямоугольник, заданный координатами противоположных вершин (x1,y1) и (x2,y2). procedure RoundRect(x1,y1,x2,y2,w,h: integer); Рисует прямоугольник со скругленными краями; (x1,y1) и (x2,y2) задают пару противоположных вершин, а w и h – ширину и высоту эллипса, используемого для скругления краев.
Фигуры с заливкой Pen (1, 0, 0, 255); Brush (1, 255, 255, 0); Rectangle (x1, y1, x2, y2); Pen (1, 255, 0, 0); Brush (1, 0, 255, 0); Ellipse (x1, y1, x2, y2); Brush (1, 100, 200, 255); Fill (x, y);
Текст TextColor (0, 0, 255); Brush (1, 255, 255, 0); Font (20, 30, 600); MoveTo (x, y); writeln ('Привет!'); Привет! (x, y) размер 10 пикселей угол поворота насыщенность: 400 – нормальный 600 – жирный 30о
Пример (200, 50) (100, 100) (300, 200) program qq; begin Pen(2, 255, 0, 255); Brush(1, 0, 0, 255); Rectangle(100, 100, 300, 200); MoveTo(100, 100); LineTo(200, 50); LineTo(300, 100); Brush(1, 255, 255, 0); Fill(200, 75); Pen(2, 255, 255, 255); Brush(1, 0, 255, 0); Ellipse(150, 100, 250, 200); end.
Задания "4": "Лягушка" "5": "Корона"
Штриховка (x1, y1) (x2, y2) N линий (N=5) h Rectangle (x1, y1, x2, y2); Line( x1+h, y1, x1+h, y2); Line( x1+2*h, y1, x1+2*h, y2); Line( x1+3*h, y1, x1+3*h, y2); ... h := (x2 – x1) / (N + 1); Rectangle (x1, y1, x2, y2); x := x1 + h; for i:=1 to N do begin Line( round(x), y1, round(x), y2); x := x + h; end; var x, h: real; x округление до ближайшего целого x
Как менять цвет? (x1, y1) (x2, y2) Brush ( 1, c, c, c ); Fill ( ???, ??? ); серый: R = G = B Шаг изменения c: x (x-1, y1+1) var c, hc: integer; hc := 255 div (N + 1); c := 0; for i:=1 to N+1 do begin Line (round(x), y1, round(x), y2); Brush (1, c, c, c); Fill (round(x)-1, y1+1); x := x + h; c := c + hc; end;
Штриховка (x1, y1) (x2, y2) (x3, y2) a h (x3+a, y1) Line( x1+h, y1, x1+h-a, y2); Line( x1+2*h, y1, x1+2*h-a, y2); Line( x1+3*h, y1, x1+3*h-a, y2); ... h := (x3 – x2) / (N + 1); a := x2 – x1; x := x1 + h; for i:=1 to N do begin Line( round(x), y1, round(x-a), y2); x := x + h; end; x x-a
Штриховка (x1, y1) (x2, y2) hx hy y x y Line( x1, y1+hy, x1+hx, y1+hy) ; Line( x1, y1+2*hy, x1+2*hx, y1+2*hy); Line( x1, y1+3*hy, x1+3*hx, y1+3*hy); ... hx := (x2 – x1) / (N + 1); hy := (y2 – y1) / (N + 1); x := x1 + hx; y := y1 + hy; for i:=1 to N do begin Line( x1, round(y), round(x), round(y)); x := x + hx; y := y + hy; end;
Задания "4": Ввести с клавиатуры число линий штриховки и построить фигуру, залив все области разным цветом. "5": Ввести с клавиатуры число окружностей и построить фигуру, залив все области разным цветом.
Программирование на языке Паскаль Тема 8. Графики функций
Как соединить точки? Алгоритм: Если первая точка перейти в точку (xэ,yэ) иначе отрезок в точку (xэ,yэ) Программа: начальное значение выбор варианта действий логическая переменная var first: boolean; ... begin ... first := True; while x <= xmax do begin ... if first then begin MoveTo(xe, ye); first := False; end else LineTo(xe, ye); ... end; end.
Задания "4": Построить график функции y = x2 на интервале [-3,3]. "5": Построить график функции (эллипс)
Программирование на языке Паскаль Тема 9. Процедуры
Процедуры Задача: Построить фигуру: Особенность: Три похожие фигуры. общее: размеры, угол поворота отличия: координаты, цвет
Процедуры Процедура – это вспомогательный алгоритм, который предназначен для выполнения некоторых действий. Применение: выполнение одинаковых действий в разных местах программы разбивка программы (или другой процедуры) на подзадачи для лучшего восприятия
Процедуры Порядок разработки: выделить одинаковые или похожие действия (три фигуры) найти в них общее (размеры, форма, угол поворота) и отличия (координаты, цвет) отличия записать в виде неизвестных переменных, они будут параметрами процедуры (x+100, y) (x, y-60) procedure Tr( x, y, r, g, b: integer); begin MoveTo(x, y); LineTo(x, y-60); LineTo(x+100, y); LineTo(x, y); Brush(1, r, g, b); Fill(x+20, y-20); end; заголовок тело процедуры координаты цвет параметры
Программа program qq; begin Pen(1, 255, 0, 255); Tr(100, 100, 0, 0, 255); Tr(200, 100, 0, 255, 0); Tr(200, 160, 255, 0, 0); end. (100,100) 100 60 процедура фактические параметры вызовы процедуры procedure Tr( x, y, r, g, b: integer); begin ... end; формальные параметры
Процедуры Особенности: все процедуры расположены выше основной программы в заголовке процедуры перечисляются формальные параметры, они обозначаются именами, поскольку могут меняться при вызове процедуры в скобках указывают фактические параметры (числа или арифметические выражения) в том же порядке procedure Tr( x, y, r, g, b: integer); Tr (200, 100, 0, 255, 0); x y r g b
Процедуры Особенности: для каждого формального параметра после двоеточия указывают его тип если однотипные параметры стоят рядом, их перечисляют через запятую внутри процедуры параметры используются так же, как и переменные procedure A (x: real; y: integer; z: real); procedure A (x, z: real; y, k, l: integer);
Процедуры Особенности: в процедуре можно объявлять дополнительные локальные переменные, остальные процедуры не имеют к ним доступа program qq; procedure A(x, y: integer); var a, b: real; begin a := (x + y)/6; ... end; begin ... end. локальные переменные
Параметры-переменные Задача: составить процедуру, которая меняет местами значения двух переменных. Особенности: надо, чтобы изменения, сделанные в процедуре, стали известны вызывающей программе program qq; var x, y: integer; begin x := 1; y := 2; Exchange ( x, y ); writeln ( ’x = ’, x, ’ y = ’, y ); end; procedure Exchange ( a, b: integer ); var c: integer; begin c := a; a := b; b := c; end; эта процедура работает с копиями параметров x = 1 y = 2
Параметры-переменные Применение: таким образом процедура (и функция) может возвращать несколько значений, Запрещенные варианты вызова Exchange ( 2, 3 ); { числа } Exchange ( x+z, y+2 ); { выражения } procedure Exchange ( a, b: integer ); var c: integer; begin c := a; a := b; b := c; end; var параметры могут изменяться
Задания "4": Используя процедуры, построить фигуру. "5": Используя процедуры, построить фигуру.
moduli_crt_i_graph.ppt
- Количество слайдов: 53