Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE \* MERGEFORMAT2
МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Пензенская государственная технологическая академия»
(ПГТА)
Кафедра «Прикладная информатика»
Контрольная работа
по дисциплине «Информатика и программирование»
Выполнил: студент гр.
Проверил: Долгушева Л.Н.
Пенза 2013 год
Отчет о выполнении лабораторной работы 8,9
РАЗРАБОТКА PASCAL-ПРОГРАММ С ИНТЕРФЕЙСОМ ТИПА
«МЕНЮ»
Цель работы: Освоение методов проектирования Pascal-программ с интерфейсом типа «меню».
Задание на лабораторную работу: Разработать программу, обеспечивающую работу пользователя в диалоговом режиме с возможностью выбора функций с помощью одноуровневого меню заданного типа.
Блок схема программы:
Описание программы:
1. Выводит сообщения о назначении программы.
2. Ввод данных происходит в режиме диалога.
3. Все функции программы реализованы в модуле UNIT.
4. Головной модуль программы использует процедуры из модулей типа UNIT.
5. Выводит запросы на ввод исходных данных.
6. Производит контроль исходных данных и коррекцию ошибочно введенных значений переменных.
7. Выводит результаты на экран.
Законченная программа будет иметь вид:
unit m_unit;
interface
type
m_rec = ^my_record;
my_record = record
Num :Integer;
FIO :string;
OKL :real;
Prc :real;
Next :m_rec;
end;
procedure menu ; {Процедура вывода меню}
procedure init_s ; {Процедура производит при старте заполнение начальных параметров}
procedure new_s ; {Процедура добавления сотрудника в список}
procedure view_s ; {Процедура просмотра списка сотрудников}
procedure del_s ; {Процедура удаления сотрудника из списка}
procedure clear_s; {Процедура очищает список}
var
Head:m_rec; {Указатель на начало списка}
implementation
uses crt,graph;
procedure init_s; {Процедура производит при старте заполнение начальных параметров}
begin
Head:=NIL; {Список изначально пуст}
end;
procedure menu;
var
ch:Char;
begin
Init_s;
repeat
textcolor(11);
TextBackground(1);
clrscr;
writeln('Добавить Просмотр Удалить ESC-Выход');
textcolor(12);
gotoxy(1,1);
Write('Д');
gotoxy(10,1);
Write('П');
gotoxy(19,1);
Write('У');
gotoxy(1,2);
textcolor(11);
ch :=ReadKey;
if (ch=#27) then exit;
case ch of
'Д':new_s ;
'П':view_s ;
'У':del_s ;
'д':new_s ;
'п':view_s ;
'у':del_s ;
'l':new_s ;
'g':view_s ;
'e':del_s ;
'L':new_s ;
'G':view_s ;
'E':del_s ;
end;
until ch = #27;
end;
{*****************************************************************}
procedure new_s; {Процедура добавления посетителя в список}
var
tmp,ends:m_rec;
begin
clrscr;
textcolor(10); {зел цвет}
if Head = Nil then
begin
new(head);
head^.next := NIL;
tmp := head;
end
else
begin
tmp := Head;
while (tmp^.Next<>NIL) do
begin
tmp := tmp^.Next;
end;
ends:=tmp;
new(tmp);
ends^.next := tmp;
tmp^.Next := NIL;
end;
{Заполним поля структуры}
{ Num :Integer;
FIO :string;
WORK :string;
OKL :real;
Perc :real;}
write('Номер комнаты');
readln(tmp^.Num);
write('фио');
readln(tmp^.FIO);
write('Количество суток:');
readln(tmp^.OKL);
write('Цена суток');
readln(tmp^.Prc);
{Для автотестов}
{ tmp^.Num :=1;
tmp^.FIO := 'asdasd';
tmp^.OKL :=123;
tmp^.Prc :=1;}
textcolor(14);
writeln('Добавлена запись');
textcolor(10);
{Шапка}
writeln('|----|---------------------------|-------|-----|--------|');
textcolor(10);
write('||');textcolor(13);write(' N ');
textcolor(10);
write('||');textcolor(13);write('ФИО сотрудника ');
textcolor(10);
write('||');textcolor(13);write('Суток');
textcolor(10);
write('||');textcolor(13);write('Цена');
textcolor(10);
write('||');textcolor(13);write('Итого');
textcolor(10);
writeln('||');
{Вывод текущей записи}
writeln('|------|-------------------------|------------|-------|---------|');
textcolor(10);
write('||');textcolor(15);write(tmp^.num:4);
textcolor(10);
write('||');textcolor(15);write(tmp^.FIO:20);
textcolor(10);
write('||');textcolor(15);write(tmp^.OKL:8:2);
textcolor(10);
write('||');textcolor(15);write(tmp^.Prc:5:2);
textcolor(10);
write('||');textcolor(15);write(tmp^.OKL*tmp^.Prc:8:2);
textcolor(10);
writeln('||');
{подвал}
writeln('|-------|-----------------------------|------------|-------|----------|');
textcolor(11);
write('Для продолжения нажмите любую клавишу');
readkey;
end;
{*****************************************************************}
{*****************************************************************}
{*****************************************************************}
procedure view_s; {Процедура просмотра списка сотрудников}
var
tmp:m_rec;
begin
clrscr;
textcolor(10);
{Шапка}
writeln('|------|-------------------------------|-----------|-----|-------|');
textcolor(10);
write('||');textcolor(13);write(' N ');
textcolor(10);
write('||');textcolor(13);write('ФИО сотрудника');
textcolor(10);
write('||');textcolor(13);write('Суток');
textcolor(10);
write('||');textcolor(13);write('Цена');
textcolor(10);
write('||');textcolor(13);write('Итого');
textcolor(10);
writeln('||');
tmp :=head;
while (tmp<> NIL) do
begin
{вывод текущей записи}
writeln('|-----|---------------------------|----------|-------|---------|');
textcolor(10);
write('||');textcolor(15);write(tmp^.num:4);
textcolor(10);
write('||');textcolor(15);write(tmp^.FIO:20);
textcolor(10);
write('||');textcolor(15);write(tmp^.OKL:8:2);
textcolor(10);
write('||');textcolor(15);write(tmp^.Prc:5:2);
textcolor(10);
write('||');textcolor(15);write(tmp^.OKL*tmp^.Prc:8:2);
textcolor(10);
writeln('||');
tmp := tmp^.next;
end;
{подвал}
writeln('|------|------------------------------|-----------|------|-----------|');
textcolor(11);
write('Для продолжения нажмите любую клавишу');
readkey;
end;
{*****************************************************************}
{*****************************************************************}
{*****************************************************************}
procedure del_s; {Процедура удаления из списка}
var
t1,t2:m_rec;
num:integer;
begin
clrscr;
textcolor(10);
write('Номер комнаты');
textcolor(13);
readln(num);
textcolor(10);
t1:=head;
t2:=head;
while(t1<>nil) do
begin
if t1^.num = num then
begin
if t1 = head then
begin
if t1^.Next = NIL then
begin
dispose(head);
head := NIL;
break;
end
else
begin
head := t1^.next;
dispose(t1);
end
end
else
begin
if t1^.next <> NIL then
begin
t2^.Next:=t1^.next;
dispose(t1);
t1:=t2;
end
else
begin
t2^.next:=Nil;
dispose(t1);
t1:=t2;
end;
end;
end;
t2:=t1;
if t1<> NIL then
begin
t1:=t1^.next;
end;
end;
write('Для продолжения нажмите любую клавишу');
readkey;
end;
{*****************************************************************}
{*****************************************************************}
{*****************************************************************}
procedure clear_s; {Процедура очищает список}
var
tmp:m_rec;
begin
tmp:=Head;
while (tmp<>NIL) do
begin
Head:=tmp^.next;
dispose(tmp);
tmp:=Head;
end;
head := NIL;
end;
end.
Ответы на контрольные вопросы:
1. Каково назначение модуля UNIT?
Модуль типа UNIT в Turbo Pascal - это отдельно хранимая и независимо компилируемая программная единица, в отличие от подпрограмм, которые, являясь структурным элементом Pascal-программы, не могут существовать вне ее.
2. Какова структура модуля UNIT?
В соответствии с вышеизложенным модуль типа UNIT имеет следующую структуру:
Unit {служебное слово} Unit_Name {имя модуля};
Interface { начало интерфейсной части }
Описание объектов, видимых из других программных модулей:
Const ...... (определение констант)
Type ...... (определение типов переменных)
Var ...... (определение переменных)
Procedure ...... (только заголовки процедур)
Function ...... (только заголовки функций)
Implementation { начало части реализации }
Описание объектов, скрытых от других программных модулей
Const ........... (определение констант)
.........................
Procedure ...... (полные описания процедур и
Function ..... функций, включая процедуры
и функции из интерфейсной секции)
Begin
Операторы инициализации переменных
перед использованием модуля UNIT_NAME
End;
End. { Окончание модуля }
3. Каковы структура и назначение части Interface?
Интерфейсная часть начинается с ключевого словаInterface (интерфейс, сочленение, соединение) и содержит обращение к другим модулям и объявления (описания) глобальных объектов т. е. меток, констант, типов, переменных, и заголовков процедур и функций которые доступны основной программе и другим модулям (т. е. видимые из вне).
4. Каковы структура и назначение части Implementation?
Раздел реализации начинается с ключевого словаImplementation(выполнение) и содержит описание локальных для модуля объектов т. е. меток, констант, типов, переменных которые не доступны основной программе и другим модулям (т. е. не видимые из вне) и полное описание процедур и функций. При этом в заголовке подпрограмм список формальных параметров м.б. опущен, но если он приводится то должен точно соответствовать описанию в интерфейсной части.
5. Для чего нужен раздел инициализации переменных?
Этот раздел используется для открытия файлов.
6. Какое расширение имеет модуль UNIT (исходный модуль)?
Имя модуля выбирается по общим правилам и должно совпадать с именем дискового файла содержащего исходный текст модуля. Расширение в имени модуля (.pas) не указывается оно задается по умолчанию.
7. Какое расширение имеет откомпилированный модуль типа UNIT?
Модуль компилируется точно таким же образом, как и обычные программы, но так как модуль не является непосредственно выполняемой единицей, то в результате его компиляции образуется дисковый файл с расширением .TPU (Turbo Pascal Unit ), а не с расширением .EXE. При компиляции модуля имя файла (NAME.TPU) берется из имени файла с исходным текстом модуля (NAME.PAS).
8. Может ли модуль UNIT выполняться самостоятельно?
В отличие от программы, рассматриваемая единица не может запускаться для выполнения самостоятельно, она может участвовать в выполнении программы или при построении другого модуля.
9. Каковы правила обращения к модулю UNIT?
Чтобы основная программа могла воспользоваться константами, перемен-ными, процедурами и другими объектами, описанными в интерфейсной секции используемого модуля, необходимо указать в программе имя нужного TPU-файла.
Выводы о проделанной лабораторной работе: Входе выполнения работы были освоены методы проектирования Pascal-программ с интерфейсом типа «меню».
Отчет
о выполнении лабораторной работы 13
РАЗРАБОТКА PASCAL-ПРОГРАММ СОРТИРОВКИ ДАННЫХ
Цель работы: Освоение методов проектирования Pascal-программ сортировки данных.
Задание на лабораторную работу:
Разработать и отладить программу сортировки массива данных. Струк-туру данных взять из лабораторной работы №8.
Блок схема программы:
Описание программы:
1.Выводит сообщения о назначении программы;
2. Ввод данных происходит в режиме диалога;
3. Производит контроль вводимых числовых данных и коррекцию ошибочно введенных данных;
4. Выводит запросы на ввод исходных данных;
5. Выводит результаты на экран.
Законченная программа будет иметь вид:
unit m_unit;
interface
const
NN=5;
type
my_record = record
Num :Integer;
FIO :string;
OKL :real;
Prc :real;
end;
procedure menu ; {Процедура вывода меню}
procedure init_s ; {Процедура производит при старте заполнение начальных параметров}
procedure new_s ; {Процедура добавления в массив}
procedure view_s ; {ЏаПроцедура просмотра массив}
procedure sort_s;
var
arr:array[1..NN] of my_record;
CNT:integer;
implementation
uses crt,graph;
procedure init_s; {Процедура производит при старте заполнение начальных параметров}
begin
CNT:=0;
end;
procedure menu;
var
ch:Char;
begin
Init_s;
repeat
textcolor(11);
TextBackground(1);
clrscr;
writeln('Добавить Просмотр Сортировка ESC-Выход');
textcolor(12);
gotoxy(1,1);
Write('Д');
gotoxy(10,1);
Write('П');
gotoxy(19,1);
Write('С');
gotoxy(1,2);
textcolor(11);
ch :=ReadKey;
if (ch=#27) then exit;
case ch of
'Д':new_s ;
'П':view_s ;
'С':sort_s ;
'д':new_s ;
'п':view_s ;
'с':sort_s ;
'l':new_s ;
'g':view_s ;
'c':sort_s ;
'L':new_s ;
'G':view_s ;
'C':sort_s ;
end;
until ch = #27;
end;
{************************************************************}
procedure new_s; {Процедура добавления посетителя в массив}
var
i:integer;
isUse:boolean;
begin
clrscr;
textcolor(10); {зел цвет}
if CNT < NN then
begin
inc(cnt);
repeat
write('Номер комнаты [1..9]:');
readln(arr[CNT].Num);
isUse:=false;
for i:=1 to CNT-1 do
begin
if Arr[i].Num = arr[CNT].Num then
begin
isUse:=true;
writeln('Номер ',arr[CNT].Num, 'занят');
end;
end;
until ((arr[CNT].Num >0) and (arr[CNT].Num<10) and IsUse = False);
write('ФИО');
readln(arr[CNT].FIO);
write('Количество суток:');
readln(arr[CNT].OKL);
write('Цена суток:');
readln(arr[CNT].Prc);
textcolor(14);
writeln('Добавлена запись:');
textcolor(10);
{Шапка}
writeln('|------|------------------------|---------|-----|--------|');
textcolor(10);
write('||');textcolor(13);write(' N ');
textcolor(10);
write('||');textcolor(13);write('ФИО сотрудника');
textcolor(10);
write('||');textcolor(13);write('Суток');
textcolor(10);
write('||');textcolor(13);write('Цена');
textcolor(10);
write('||');textcolor(13);write('Итого');
textcolor(10);
writeln('||');
{Вывод текущей записи}
writeln('|-------|---------------------------|----------|-------|---------|');
textcolor(10);
write('||');textcolor(15);write(arr[CNT].num:4);
textcolor(10);
write('||');textcolor(15);write(arr[CNT].FIO:20);
textcolor(10);
write('||');textcolor(15);write(arr[CNT].OKL:8:2);
textcolor(10);
write('||');textcolor(15);write(arr[CNT].Prc:5:2);
textcolor(10);
write('||');textcolor(15);write(arr[CNT].OKL*arr[CNT].Prc:8:2);
textcolor(10);
writeln('||');
{Подвал}
writeln('|------|--------------------------------|----------|-------|----------|');
textcolor(11);
end
else
begin
writeln(Нельзя добавить! Достигнут максимум')
end;
write('Для продолжения нажмите любую клавишу');
readkey;
end;
{************************************************************}
{************************************************************}
{************************************************************}
procedure view_s; {Процедура просмотра списка сотрудников}
var
i:integer;
begin
clrscr;
textcolor(10);
{Шапка}
writeln('|-----|--------------------------------|---------|-----|--------|');
textcolor(10);
write('||');textcolor(13);write(' N ');
textcolor(10);
write('||');textcolor(13);write('ФИО сотрудника');
textcolor(10);
write('||');textcolor(13);write('Суток');
textcolor(10);
write('||');textcolor(13);write('Цена');
textcolor(10);
write('||');textcolor(13);write('Итого');
textcolor(10);
writeln('||');
for i:=1 to CNT do
begin
{Вывод текущей записи}
writeln('|------|-------------------------------|-----------|------|-----------|');
textcolor(10);
write('||');textcolor(15);write(arr[i].num:4);
textcolor(10);
write('||');textcolor(15);write(arr[i].FIO:20);
textcolor(10);
write('||');textcolor(15);write(arr[i].OKL:8:2);
textcolor(10);
write('||');textcolor(15);write(arr[i].Prc:5:2);
textcolor(10);
write('||');textcolor(15);write(arr[i].OKL*arr[CNT].Prc:8:2);
textcolor(10);
writeln('||');
end;
{Подвал}
writeln('|------|-----------------------------|----------|------|-----------|');
textcolor(11);
write('Для продолжения нажмите любую клавишу');
readkey;
end;
{************************************************************}
{************************************************************}
{************************************************************}
procedure sort_s;
var
B:array[1..9] of integer;
A:Array[1..NN] of my_record;
i,j,k:integer;
Max:integer;
Min:integer;
begin
if CNT >1 then
begin
for i:=1 to 9 do
begin
B[i]:=0;
end;
Max:=Arr[1].Num;
Min:=Arr[1].Num;
for i:=1 to CNT do
begin
if Arr[i].Num>Max then Max:=Arr[i].Num;
if Arr[i].Num<Min then Min:=Arr[i].Num;
end;
for i:=1 to CNT do
begin
j:=Arr[i].Num-Min+1;
B[j]:=B[j]+1;
end;
i:=0;
for j:=1 to 9 do
begin
if B[j]<>0 then
begin
for k:=1 to B[j] do
begin
i:=i+1;
A[i].NUM:=j+Min-1;
end;
end;
end;
for i:=1 to CNT do
begin
for j:=1 to CNT do
begin
if A[i].Num = Arr[j].Num then
begin
A[i].FIO := Arr[j].FIO;
A[i].OKL := Arr[j].OKL;
A[i].Prc := Arr[j].Prc;
end;
end;
end;
for i:=1 to CNT do
begin
Arr[i].Num := A[i].Num;
Arr[i].FIO := A[i].FIO;
Arr[i].OKL := A[i].OKL;
Arr[i].Prc := A[i].Prc;
end;
end;
textcolor(11);
write('Отсортировано. Для продолжения нажмите любую клавишу');
readkey;
end;
end.
Контрольные вопросы:
1. В чем суть алгоритма сортировки выбором?
Вначале отыскивается запись с наименьшим значением ключа и она помещается на первое место. Эта запись исключается из дальнейшего анализа. Затем отыскивается запись с наименьшим значением ключа в оставшейся части массива, помещается на второе место и исключается из дальнейшего анализа и т.д.
2. В чем суть алгоритма сортировки обменом?
Выполняется последовательный анализ массива данных: если два соседних элемента (ключа) не удовлетворяют условию (1), то они меняются местами; если в процессе такого анализа выполнена хотя бы одна перестановка, процесс сравнения повторяется с начала массива, иначе алгоритм заканчивает работу.
3. В чем суть алгоритма сортировки вставками?
Массив рассматривается состоящим из двух частей: отсортированной части и неотсортированной части.
На первом шаге отсортированная часть содержит первый по порядку
элемент (запись) массива, неотсортированная - остальные. Шаг в данном
случае - это последовательность операций по добавлению (вставке) одного элемента (первого из неотсортированной части) в то место отсортированной части, которое после этого будет удовлетворять условию (1).
На втором шаге первый элемент из неотсортированной части сравнивается поочередно с элементами отсортированной части и устанавливается на место, удовлетворяющее условию (1); при этом может потребоваться сдвиг всех расположенных ниже места вставки элементов на одну позицию вниз; после этого отсортированная часть содержит два элемента и т.д.
4. В чем суть алгоритма цифровой сортировки?
Этот метод еще называется сортировкой "вычерпыванием". Он удобен для сортировки целых чисел (ключей), имеющих сравнительно небольшой диапазон.
Пусть даны N целых чисел в массиве А, принадлежащих диапазону от Amin до Amax включительно.
Каждому числу Ai поставим в соответствие j-й элемент массива L; при этом индекс элемента определяется по формуле
j= Ai - Amin + 1.
Необходимо, чтобы массив L имел длину не менее K = Amax-A min+1.
5. Для каких данных можно применять цифровую сортировку?
Он удобен для сортировки целых чисел (ключей), имеющих сравнительно небольшой диапазон.
6. В чем суть алгоритма сортировки подсчетом?
Идея алгоритма заключается в том, чтобы попарно сравнить значения всех ключей массива К и при этом для каждого ключа Ki подсчитать количество меньших его ключей Ci. Затем каждый i-й элемент (запись) исходного массива К устанавливается на место, номер которого равен Ci+1 в массиве А.
7. В чем суть алгоритма сортировки слияние?
Этот алгоритм применим для внешней и внутренней сортировки. Рассмотрим вариант для внешней сортировки.
Даны два файла A и B, содержащие упорядоченные по возрастанию целые числа, длины файлов различны. Требуется сформировать файл С, содержащий данные из файлов А и В в порядке возрастания.
Основные шаги алгоритма:
1) прочитать по одному элементу из файлов А и В;
2) сравнить прочитанные элементы, меньшее записать в файл С;
3) прочитать следующий элемент из того файла, элемент которого был записан в С, и повторить п. 2;
4) если один из файлов закончился, то остаток второго добавить к сформированной части файла С.
Выводы о проделанной лабораторной работе: В ходе выполнения работы я освоил методы проектирования Pascal-программ с помощью сортировки данных.
Отчет
о выполнении лабораторной работы 14
РАЗРАБОТКА PASCAL-ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ ГРАФИЧЕСКИХ ПРОЦЕДУР И ФУНКЦИЙ
Цель работы: Освоение методов проектирования Pascal-программ с использованием графических процедур и функций.
Задание на лабораторную работу:
Разработать с использованием процедур и функций из стандартного мо-дуля Graph программу, обеспечивающую вывод графика заданной функции, осей координат и поясняющего текста.
Блок схема программы:
Описание программы:
1. Выводит сообщения о назначении программы;
2. Ввод данных производится в режиме диалога;
( при этом можно использовать текстовый режим);
3. Происходит обработка ошибок при вводе данных и инициализация графического режима;
4. Выводит результаты в графической форме с использованием трех цветов для оформления фона и элементов чертежа;
5. Выводит надписи над графиком: " График функции Y = ...";
6. Выводит начальных и конечных значений аргумента и функции около осей координат (Xн, Xк, Yн, Yк).
Законченная программа будет иметь вид:
unit m_unit;
interface
procedure draw_s ;
procedure show_s ;
var
cnt: Integer;
Xmin,Xmax:real;
a,b,c:real;
implementation
uses crt,graph;
function InitGraf:Integer; {Функция инициализирует графический режим}
var
CodeError:Integer; {0 Нет ошибок. Или код ошибки}
gd,gm:integer; {Драйвер и режим}
begin
CodeError:= 0; {Первичная инициализация, предпологается что все пройдет без ошибок}
gd:=detect;
InitGraph(gd,gm,'d:\BP\BGI\');
If GraphResult <> grOk then
begin
CodeError :=GraphResult; { Возвращается код ошибки }
end
else
begin
CodeError := 0; { Возвращается 0, ошибок нет }
end;
InitGraf:=CodeError;
end;
{***************************************************************}
{***************************************************************}
{***************************************************************}
procedure draw_s; {Процедура вывода диаграммы на экран}
begin
clrscr;
if InitGraf = 0 then
begin
Show_s;
CloseGraph;
end
else
begin
textcolor(12);
writeln('Ошибка инициализации видеодрайвера');
readkey;
end;
end;
{***************************************************************}
{***************************************************************}
{***************************************************************}
function f(x:real):real;
begin
if cos(b*x) = 0 then f:=0
else f:=a*(sin(b*x)/cos(b*x))-c;
end;
procedure show_s; {Процедура прорисовки диаграммы}
var
Ht : integer; {Высота экрана}
Wt : integer; {Ширина экрана}
deltax:real;
i : integer;
ZmY: real ; {Масштаб по Y}
ZmX: real ; {Масштаб по X}
x0,y0:integer;
X,Y:real;
MM:Real; {макс}
MMM:Real; {мин}
MinusY:integer;
s:string;
begin
Wt:=GetMaxX;
Ht:=GetMaxY;
MinusY:=50;
deltax:=(Xmax-Xmin)/cnt;
X:=Xmin;
MM:=F(x);
MMM:=F(x);
while X<Xmax do
begin
if F(x) > MM then MM:=F(X);
if F(x) < MMM then MMM:=F(X);
X:=X+deltax;
end;
ZmY:=(Ht-2*MinusY)/ABS(MM-MMM);
ZmX:=Wt/(2*(Xmax-Xmin));
X:=Xmin;
X0:=Trunc(wt/2)+trunc(X*ZmX);
Y0:=Ht-MinusY-trunc(F(X)*ZmY);
MoveTo(X0,Y0-MinusY);
SetTextStyle(1, HorizDir, 1);
MoveTo(X0,Y0);
for i:=1 to CNT do
begin
X:=X+deltax;
X0:=Trunc(wt/2)+trunc(X*ZmX);
Y0:=Ht-2*MinusY-trunc(F(X)*ZmY);
if F(X)<>0 THEN lineto(X0,Y0)
else
begin
X:=X+deltax;
X0:=Trunc(wt/2)+trunc(X*ZmX);
Y0:=Ht-2*MinusY-trunc(F(X)*ZmY);
MoveTo(X0,Y0);
end;
end;
{Рисуем оси}
X:=0;
X0:=Trunc(wt/2)+trunc(X*ZmX);
Y0:=Ht-2*MinusY;
MoveTo(X0+10,Y0+10);
outtext('0');
MoveTo(X0,Y0);
lineto(X0,Ht);
MoveTo(X0,Y0);
lineto(X0,2*MinusY);
outtext('Y');
MoveTo(X0,Y0);
lineto(0,Y0);
MoveTo(X0,Y0);
lineto(Wt,Y0);
MoveTo(Wt-50,Y0-30);
outtext('X');
X0:=Trunc(wt/4);
Y0:=MinusY;
moveto(X0,Y0);
SetTextStyle(5, HorizDir, 1);
outtext('Function Y=a*tg(b*x)-c;');
readkey;
end;
end.
Контрольные вопросы:
1. Какие процедуры используются для инициализации графического режима?
В настоящее время более 50 стандартных графических процедур и функ-ций содержится в стандартном модуле Graph.tpu. Чтобы воспользоваться возможностями модуля GRAPH.tpu, необходимо иметь компьютер, осна-щенный видеоадаптером. В состав модуля Graph входит ряд программ-драйверов для наиболее распространенных видеоадаптеров: CGA, MCGA, EGA, VGA, SVGA, Hercules, AT&T, 3270 PC. Эти драйверы хранятся в файлах с расширением .BGI (Borland Graphic Interface). Для множества символов имеются файлы описаний с расширением .CHR.
2. Какова структура графической Pascal-программы?
Любая программа Turbo Pascal, использующая графические процедуры и функции из модуля Graph, имеет следующую типовую структуру:
Program prog_graph;
uses Graph, Crt, ...... ;
var grDriv, grMod : integer;
код графического режима
код видеографического устройства
.....................
{ Процедуры и функции }
function F(var x : real) : real
begin
..........
end;
.....................
begin
...............................
Write ('Введите XN, XK :'); { Ввод исходных данных }
Readln (Xn, Xk); { в текстовом режиме }
Write ('Введите количество точек графика : ');
Readln(N);
{ Вычисление Yn и Yk и шага изменения аргумента h }
...............................
{--------------- Инициализация графического режима ------------}
grDriv := Detect;
InitGraph(grDriv, grMod, 'D:\TP\BGI');
{ путь к графическому драйверу}
{--------- Проверка успешного завершения инициализации --------}
if GraphResult <> GrOK then
begin
writeln(' Ошибка !!!');
{... обработка кода ошибки .....}
delay(1000);
exit
end;
{---------------- Основная часть программы --------------------}
XNE:=...; { Задание области вывода графика; }
YNE:=...; {можно вводить с клавиатуры или задавать}
Xke:=...; {в программе }
Yke:=...;
Mx:=...; { Расчет масштабов }
My:=...;
........... { Установка цветов, типов линий и др.}
x:=xn; { Переход в начало графика }
x:=x+h;
while x < xk do
begin
85
y:=F(x);
...
... { Черчение отрезка прямой от предыдущей точки к }
... { точке (x, y)}
x:=x+h
end;
.......... { Черчение осей координат }
.......... { Вывод текста }
repeat
until KeyPressed;
{---------------- Завершение графического режима --------------}
CloseGraph
end.
3. В чем суть алгоритма построения графика функции?
Суть заключается в получении графика требуемой функции.
4. Как задается код графического режима и код графического устройства?
Задание графического режима и кода графического устройства имеет следующую типовую структуру:
Program prog_graph;
uses Graph, Crt, ...... ;
var grDriv, grMod : integer;
код графического режима
код видеографического устройства
5. Какие графические процедуры и функции относятся к управляющим?
InitGraph
CloseGraph
GraphResult
GraphErrorMsg
6. Какие графические процедуры и функции используются для формирования экрана, окна, страницы?
ClearDevice
SetViewPort
ClearViewPort
SetVisualPage
SetActivePage
GetMaxX
GetMaxY
7. Какие графические процедуры и функции используются для работы с точечными изображениями?
PutPixel
GetPixel
GetX
GetY
8. Какие графические процедуры и функции используются для работы с графическими примитивами типа "линия"?
Line
LineTo
LineRel
MoveTo
SetLineStyle
9. Какие графические процедуры и функции используются для работы с дугами, фигурами, штриховкой?
Arc
Circle
Rectangle
Bar
Bar3d
DrawPoly
FillPoly
SetFillStyle
SetFillPattern
FloodFill
Pieslice
Ellipse
10. Какие графические процедуры и функции используются для работы с цветом и палитрой?
SetBkColor
SetColor
11. Какие графические процедуры и функции используются для работы с текстом?
OutText
OutTextXY
SetTextStyle
SetUserCharSize
InstallUserFont
12. В чем суть алгоритма поиска экстремумов нелинейных функций?
Чтобы график заданной функции входил в предоставленное для его изображения окно, необходимо точно рассчитать масштабы Мx и Мy. Точность масштаба по оси Y (Мy) зависит от того, насколько точно будет произведен расчет граничных значений (экстремумов) функции Yфmin и Yфmax в заданном диапазоне (Хн ..Хк).
Выводы о проделанной лабораторной работе: В ходе выполнения работы я освоил методы проектирования Pascal-программ с использованием графических процедур и функций.