Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
25
Добавлен:
07.02.2016
Размер:
282.62 Кб
Скачать

Var I,k:integer;

f:file of zap;

s:zap;

sumzal, sumfakt,sumnadl,sumned:real;

nadlk,nedk,rezk:integer;

nadls,neds,rezs:real;

begin

clrscr;

gotoxy(25,5);

writeln('Таблиця 2. Відоміість інвентарізації');

for i:=1 to 80 do

write('_');

writeln;

writeln('|шифр | залишок | фактично | надлишок | недостача |');

writeln('| |кіль- | сума | кіль- | сума |кіль- | сума | кіль- | сума |');

writeln('| |кість | |кість | |кість | | кість | |');

for i:=1 to 80 do

write('_');

assign(f,'tab.dat');

k:=12;

reset(f);

sumzal:=0; sumfakt:=0; sumnadl:=0; sumned:=0;

while not eof (f) do

begin

read(f,s);

gotoxy(1,k); write('|',s.shifr);

gotoxy(7,k); write('|',s.zalk:5);

gotoxy(15,k); write('|',s.zals:8:2);

gotoxy(25,k); write('|',s.faktk:5);

gotoxy(33,k); write('|',s.fakts:8:2);

rezk:=s.faktk-s.zalk;

rezs:=s.fakts-s.zals;

if rezk>0 then begin nadlk:=rezk;nedk:=0 end

else begin nedk:=abs(rezk); nadlk:=0; end;

if rezs>0 then begin nadls:=rezs;neds:=0; end

else begin neds:=abs(rezs);nadls:=0; end;

gotoxy(43,k); write('|',nadlk:5);

gotoxy(51,k); write('|', nadls:8:2);

gotoxy(61,k); write('|',nedk:5 );

gotoxy(70,k); write('|',neds:8:2,'|');

writeln;

k:=k+1;

sumzal:=sumzal+s.zals;

sumfakt:=sumfakt+s.fakts;

sumnadl:=sumnadl+nadls;

sumned:=sumned+neds;

end;

write('|Всього');

gotoxy(15,k); write('|',sumzal:9:2,'|');

gotoxy(33,k); write('|',sumfakt:9:2,'|');

gotoxy(51,k); write('|',sumnadl:9:2,'|');

gotoxy(70,k); write('|',sumned:9:2,'|');

readln;

end.

Модуль Crt має три процедури, які використовуються для управління звуком:

  • процедура Sound(hz:word); – запускає джерело звуку (динамік) з частотою hz герц;

  • процедура Nosound; – Вимикає динамік;

  • процедура Delay (ms:word); Задає затримку виконання програми в ms мілісекунд.

За допомогою цих процедур можна за допомогою програми відтворювати звукові ефекти. Для спрощення роботи наводимо таблицю частот відповідно до нот та октав. Довжина ноти показують в процедурі Delay. Так, якщо цілу ноту позначимо як 16 мілісекунд, то половинна нота буде звучати 8 мілісекунд і так далі.

Таблиця 7.4. Значення частот для процедури Sound(частота);

нота

велика октава

мала октава

перша октава

друга октава

до

131

262

524

1047

ре

147

294

588

1175

мі

165

330

659

1319

фа

175

349

699

1396

соль

196

392

785

1568

ля

220

440

880

1760

сі

247

494

988

1975

Ось, наприклад, програма, яка програє куплет української народної пісні «Ой у полі нивка»

Ой у полі нивка, кругом материнка,

Там дівчина жито жала, сама чорнобривка.

uses crt;

begin

sound(988); delay(2000); nosound;

sound(785); delay(2000); nosound;

sound(988); delay(2000); nosound;

sound(1175); delay(2000); nosound;

sound(880); delay(4000); nosound;

sound(880); delay(2000); nosound;

sound(588); delay(2000); nosound;

sound(988); delay(2000); nosound;

sound(785); delay(2000); nosound;

sound(988); delay(2000); nosound;

sound(1175); delay(2000); nosound;

sound(880); delay(4000); nosound;

sound(880); delay(2000); nosound;

sound(588); delay(2000); nosound;

sound(785); delay(2000); nosound;

sound(988); delay(2000); nosound;

sound(785); delay(2000); nosound;

sound(699); delay(2000); nosound;

sound(659); delay(2000); nosound;

sound(699); delay(2000); nosound;

sound(588); delay(2000); nosound;

sound(699); delay(2000); nosound;

sound(785); delay(2000); nosound;

sound(988); delay(2000); nosound;

sound(785); delay(2000); nosound;

sound(699); delay(2000); nosound;

sound(659); delay(4000); nosound;

sound(588); delay(4000); nosound;

end.

Використання модуля GRAPH.

Для роботи в графічному режимі використовується модуль Graph. Він містить константи, змінні та підпрограми, які використовуються для побудови графічних зображень.

В графічному режимі мінімальним об’єктом виведення є піксел – від англійського picel, який є об’єднанням слів «малюнок» (picture) та «елемент» (element). Розміри піксела визначаються допуском екрану (640х480, 800х600, 1024х768, 1280х1024 і т. д.). Навіть у випадку самого грубого допуску екрану зображення в графічному режимі формується за допомогою 64 000 графічних елементів.

Turbo Pascal забезпечує роботу з такими відеоадаптерами: CGA, MCGA,EGA, VGA, HERCULES, AT&T 400, 3270 PC, IBM-8514. Роботою відеоадаптера керує спеціальна програма, яка має назву Драйвер. Драйвер зберігається в окремому файлі на диску, має виконуючий код та необхідні для роботи дані. Признак файлу з драйвером – розширення імені файлу .bgi. Ім’я файлу з драйвером відповідає типу відеоадаптера комп’ютера. Більшість відеоадаптерів можуть працювати в декількох графічних режимах. Вони різняться допуском екрану та набором доступних кольорів.

Таблиця 7.4. Основні характеристики відеоадаптерів.

Назва відеоадаптеру

Графічний режим

Розмір екрану в пікселах

Кількість кольорів

Кількість відеосторінок

CGA

CGAC3=3 CGAHI=4

320x200 640x200

4 2

1 1

EGA

EGAL0=0 EGAHI=1

640x200 640x350

16 16

4 2

VGA

VGAL0=0 VGAMED=1 VGAHI=2

640x200 640x350 640x480

16 16 16

4 2 1

HERCULES

HERCMONOHI=0

720x348

2

IBM8514

IBM8514LO=0 IBM8514HI=1

640x480 640x768

256 256

1 1

Перед початком роботи в графічному режимі треба визначити, який відеоадаптер буде використовуватися. Це можна зробити, явно вказавши програмі тип відеоадаптера чи дати можливість програмі самостійно визначити значення відповідного параметру. Для цього вводять змінну типу integer (gd:integer;). Приводимо в наступній таблиці значення, які може приймати ця змінна.

Таблиця 7.5. Значення кодів драйверів графічних пристроїв.

Ім’я драйвера відеоадаптера

Значення

DETECT

0

CGA

1

MCGA

2

EGA

3

EGA64

4

EGAMONO

5

HERCMONO

7

ATT400

8

VGA

9

IBM8514

6

CURRENTDRIVER

-128

PC3270

10

Значення detect використовується для автоматичного розпізнавання відеоадаптера. Таким чином в програмі першим оператором повинен бути оператор gd:= значення;, наприклад, gd:= detect; Для більшості сучасних відеоадаптерів можна використовувати драйвер egavga.bgi ( або більш сучасний svga.bgi)

Далі треба визначити графічний режим. Для цього задають ще одну змінну (dm:integer;). Деякі значення цієї змінної приведені в таблиці 2.

Перехід до графічного режиму виконується за допомогою процедури:

InitGraph(gd, gm, ‘c:\tp\bgi’);

В апострофах вказаний шлях до драйверу. Частіше всі драйвери скомпоновані у директорії BGI. Якщо драйвер знаходиться в активному каталозі, то цей шлях остається порожнім. Щоб зображення на екрані не було зразу закрите, треба використовувати оператор Readln;.

Завершення роботи графічного режиму відбувається за допомогою процедури CloseGraph;.

Крім того існують процедури RestoreCrtMode та SetGraphMode, за якими можна виконувати переключення між текстовим та графічним режимами, коли графічний режим ще не закритий.

При налагодженні програми має сенс перевіряти наявність помилки у переході до графічного режиму. Код помилки заноситься до функції GrafResult. В наступній таблиці 6 приведені коди помилок:

Таблиця 7.6. Коди помилок, які вертає функція GrafResult.

Ім’я помилки

Значення

Призначення

grOk

0

Успішне виконання

grNoInitGraph

-1

Не встановлений графічний режим

grNotDetected

-2

Графічний режим не передбачений

grFileNotFound

-3

Нема драйвера пристрою

grInvalidDriver

-4

Помилки у драйвері

grNoLoadMem

-5

Нема пам’яті для загрузки драйвера

grNoScanMem

-6

Нема пам’яті для сканування

grNoFloodMem

-7

Нема пам’яті для зафарбування

grFontNotFound

-8

Не знайдено файл з шрифтом

grNoFontMem

-9

Нема пам’яті для загрузки шрифту

grInvalidMode

-10

Недопустимий режим для вибраного драйверу

grError

-11

Помилка графічної системи

grIOerror

-12

Помилка введення-виведення графічної системи

grInvalidFont

-13

Помилка у файлі з шрифтом

grInvalidFontNum

-14

Невірний номер шрифту

Тому в програмі можна передбачити таку частину:

InitGraph(gd, gm, ‘c:\tp\bgi’);

if grafresult<> 0 then

begin

writeln(‘помилка графічного режиму ’,graphresult);

readln;

end;

Будь-яке зображення формується з достатньо простих геометричних фігур (точки, відрізки прямої, кола і т.д.). Для того, щоб запрограмувати графічне виведення, треба задавати координати графічних об’єктів. Графічні координати задають положення точки на екрані дисплея. Точкою відліку є верхній лівий кут екрану (0,0). Значення координати х відлічуються зліва направо, а значення координати y - зверху вниз. Максимальне допустиме значення координат залежить від вибраного графічного режиму. Графічні координати приймають тільки цілі значення.

Для побудови різних графічних зображень користуються набором основних елементів: точки, лінії, відрізки, коло, еліпс і т.д. Для їх побудови модуль Graph містить цілий набір процедур.

Таблиця 7.7. Процедури побудови геометричних фігур.

Ім’я процедури

Призначення процедури

PutPixel(x, y:integer; pixel: word);

Замальовує піксел з заданими координатами x, y в колір pixel.

Line(x1, y1, x2,y2:integer);

Побудова лінії. x1, y1, x2,y2 - координати точок, між якими будується лінія.

LineRel(dx, dy:integer);

Проводиться лінія з поточної позиції в точку, яку здвинули відносно вихідної позиції на величини dx, dy.

LineTo(x, y:integer);

Проводиться лінія з поточної позиції в точку з заданими координатами x, y.

MoveRel(dx, dy:integer);

Переміщує покажчик координат на задану відстань dx, dy по відношенню до його попереднього положення (точка на екрані не висвітлюється).

MoveTo(x, y:integer);

Переміщує покажчик координат в точку з координатами x, y(точка на екрані не висвітлюється).

Bar(x1, y1, x2,y2:integer);

Побудова зафарбованого прямокутника. x1, y1, x2,y2 - координати лівого верхнього та правого нижнього кутів прямокутника.

Bar3D(x1, y1, x2,y2:integer; Dept: word; Top: Boolean);

Побудова паралелепіпеда. x1, y1, x2,y2 - координати лівого верхнього та правого нижнього кутів передньої грані. Dept - ширина бокової грані( вимірюється по горизонталі). Top - ознака включення верхньої грані (якщо true - верхня грань буде накреслена, якщо false, то вона не відображується).

DrawPoly(NumPoints: integer; var PolyPoints);

Побудова контуру багатокутника. NumPoints - кількість вершин багатокутника, PolyPoints - змінна без типу, яка має NumPoints +1 пар координат вершин багатокутника (координати повинні бути цілого типу, вони перелічуються в той же послідовності, як вони ідуть по контуру, причому перша вершина повинна повторитися в кінці переліку).

FillPoly(NumPoints: integer; var PolyPoints);

Побудова зафарбованого багатокутника. NumPoints - кількість вершин багатокутника, PolyPoints - змінна без типу, яка має NumPoints +1 пар координат вершин багатокутника (координати повинні бути цілого типу, вони перелічуються в той же послідовності, як вони ідуть по контуру, причому перша вершина повинна повторитися в кінці переліку).

FloodFill (x, y: integer; border: word);

Зафарбовує область, яка обмежена безперервною лінією, поточним орнаментом та кольором заповнення. Якщо лінія має розрив, заданим орнаментом зафарбовується весь екран. x, y - координати будь-якої точки всередині області, яка зафарбовується, border - колір лінії, до якої виконується фарбування.

Rectangle(x1, y1, x2,y2:integer);

Будує контур прямокутника. x1, y1, x2,y2 - координати лівого верхнього та правого нижнього кутів прямокутника.

Arc(x,y:integer; stangle, endangle, Radius:word);

Побудова дуги кола. x,y - координати центру дуги; stangle, endangle -кути від початкової та конечної точки дуги, які виміряються проти часової стрілки від горизонтальної осі, що направлена зліва направо; Radius - радіус дуги.

Circle(x, y, :integer; r: word);

Побудова кола. x, y - координати центру, r - радіус кола.

Sector(x, y, :integer; stangle, endangle: word; xr, yr: word);

Будує сектор еліпса, зафарбований поточним орнаментом та кольором заповнення. x, y - координати центру сектора еліпса, stangle, endangle -кути від початкової та конечної точки дуги, які виміряються проти часової стрілки від горизонтальної осі, що направлена зліва направо; xr, yr- горизонтальна та вертикальна напівосі еліпсу.

FillEllipse(x, y, :integer; xr, yr: word);

Побудова еліпса, зафарбованого поточним орнаментом та кольором заповнення. x, y - координати центру, xr, yr- горизонтальна та вертикальна напівосі еліпсу.

Ellipse(x, y, :integer; stangle, endangle: word; xr, yr: word);

Побудова дуги еліпса. x, y - координати центру, stangle, endangle -кути від початкової та конечної точки дуги, які виміряються проти часової стрілки від горизонтальної осі, що направлена зліва направо; xr, yr- горизонтальна та вертикальна напівосі еліпсу.

Ось приклад програми, де будуються декілька фігур:

uses graph, crt;

var

gd, gm, x,y : Integer;

begin

gd:=detect;

initgraph(gd,gm,'c:\tp\bgi');

x:=350; y:=150;

putpixel(x,y,white);

line(10,10,150,150);

rectangle(200,150,250,400);

Bar(15,200,100,250);

readln;

closegraph;

end.

Всі побудови будуть виконані на чорному екрані білим. Зверніть увагу на різницю виконання двох операторів: rectangle(200,150,250,400); будує контур прямокутника, а Bar(15,200,100,250); будує прямокутник, зафарбований білим кольором.

Звісно, для графічних побудов треба мати такі процедури, які дають змогу будувати кольорові зображення. Такі процедури містяться в модулі Graph.

Методика роботи з кольоровими зображення така. Треба спочатку встановити, яким кольором будуть зображені лінії та яким малюнком будуть зафарбовані фігури. І тільки після цього можна будувати зображення.

Таблиця 7.8. Процедури Graph, які встановлюють колір ліній та стиль малюнку.

Ім’я процедури

Призначення.

SetBkColor(Color: word);

Встановлює колір екрану

SetColor(Color: word);

Встановлює поточний колір, яким будуть зображені контури фігур та тексти.

SetLineStyle(LineStyle: word;; Pattern:Word Th:Word);

Задає постійні параметри лінії: LineStyle - стиль лінії, Pattern -шаблон лінії, Th - товщина лінії.

SetFillStyle(Pattern:Word; Color: word);

Задає стандартний орнамент та колір заповнення фігури. Color- колір, Pattern - стандартний параметр.

SetTextStyle(Font: word; Direction: word; CharSize:word);

Встановлює поточні тип шрифту (Font), напрямок тексту (Direction), розміри символів (CharSize).

Коди типів ліній для процедури SetLineStyle(стиль, шаблон, товщина), GetLineStyle:

1. стиль

  • Solidln =0 -суцільна ____________________

  • Dotteedln =1 пунктирна ... ...... ...... .... .

  • Centerln =2 -штрих-пунктирна –·–· –· –· –·

  • Dashedln =3 -штрихова - - - - - - - - - - - - -

  • Userbitln=4 -задається користувачем

  1. шаблон (Pattern) – задається тільки в тому випадку, якщо стиль Userbitln

  2. товщина :

  • 1=NormWidth нормальна

  • 3=ThickWidth-товста

Константи орнамента заповнення для процедур SetFillStyle та GetFillStyle:

EmptyFill = 0 –заповнення кольором вону

SolidFill = 1 однородне заповнення

LineFill = 2 çзаповнення --------

SlashFill = 3 заповнення ////////

LtSlashFill = 4 заповнення /////

BkslashFill = 5 заповнення \\\\\

LtbkSlashFill = 6 заповнення \\\\\\\\\

HatchFill = 7 заповнення ++++++++++

XhatchFill = 8 заповнення xxxxxxxxxx

InterleaveFill = 9 заповнення косою кліткою

WideDotFill =10 заповнення рідкими точками

CloseDotFill =11 заповнення частими точками

UserFill =12 заповнення визначається користувачем

Таблиця 7.9. Процедури управління екраном, вікном, сторінкою.

ClearDevice;

очищає графічний екран та підготовляє його для графічного виведення.

Setviewport(x1,y1,x2,y2, clip);

Встановлює розміри вікна для виведення графічної інформації. x1,y1,x2,y2 - координати лівого верхнього та правого нижнього кутів вікна, clip - обмеження фігур, логічна величина: ClipOn - всі побудови проводяться тільки в межах вікна, Clipoff частини фігур можуть виходити за межі вікна.

clearviewport;

очищає графічне вікно виведення

setvisualpage(page);

Встановлює номер активної графічної сторінки, яка відображається на екрані. Номера починаються з 0.

setactivepage(page);

Активізує графічну сторінку (в яку можна записувати інформацію). Номера починаються з 0.

Зверніть увагу, що перед використанням процедур побудови фігур та заповнення замкненої області треба виконати процедури з таблиць 8 та 9.

Приклад 7.3. Побудова графіка функції y=0.5x2.

Важливою задачею є побудова графіків функцій. Для цього потрібно знати, в якому діапазоні знаходяться значення функцій, які будуються. Від цього залежить, який буде масштаб кожної осі координат.

uses graph,crt;

var

a,t, gd, gm, i : Integer;

Соседние файлы в папке конспект лекцій 1 паск