Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Требования по оформлению контрольной работы




Задания для контрольной работы

End.

Begin

While

Begin

Begin

End.

Begin

End.

Begin

End.

Begin

Begin

Repeat

Begin

End.

End

Begin

Begin

Begin

Begin

Begin

Begin

Косвенная рекурсия

Begin

Пример

Вычисление факториала числа

Обоснование выбора способа реализации.

Обратим внимание на то, что вычислить факториал числа N можно следующим образом:

N! =N*(N-1)!=N*(N-1)*(N-2)! И так далее

То есть для вычисления факториала числа N требуется вычислить факториал числа (N-1), для вычисления факториала (N-1) необходимо вычислить факториал числа (N-2) и так далее. Заметим, что вычисление факториала числа сводится к вычислению факториала числа, на единицу меньше самого числа.

Реализуем такой алгоритм с использованием механизма рекурсии.

Так как подпрограмма будет производить вычисление значения, то реализовывать ее будем в виде функции.

 

function Fact (n:byte):integer;

if n=0 then Fact:=1

else Fact:=n*Fact(n-1);

end;

Здесь имени функции сразу присваивается результат вычисления.

При вызове функции Fact(n-1) согласно оператору Fact:=n*Fact(n-1), где т – параметр функции, вместо n подставляется параметр (n-1) и, следовательно, вычисляется строка n*(n-1)*Fact((n-1)-1) и так далее.

Рекурсивное обращение к функции Fact будет продолжаться до тех пор, пока n не станет равным 0

 

Домашнее задание

Реализовать с помощью рекурсивной подпрограммы возведение числа в натуральную степень.

Подсказка. Заметим, что Xn = X* Xn-1

 

Описанный выше механизм часто называют прямой рекурсией.

Существует еще один рекурсивный механизм – косвенная рекурсия

 

Механизм применяется для реализации следующей ситуации

Первая подпрограмма вызывает вторую, еще не описанную.

Продемонстрируем ситуацию на примере.

Program Kosv_Rec;

…..

procedure A(var x:real);

….

B(z);

….

end;

procedure B (var y:real);

….

A(z);

end;

 

Здесь процедура А обращается в процедуру В и наоборот. Какую процедуру первой мы бы ни описали, в любом случае будет ошибка – обращение к еще не описанной процедуре.

 

Для того, чтобы избежать такой ситуации, используется предварительное описание подпрограмм.

Предварительное описание состоит из заголовка подпрограммы и директивы (указания компилятору) предварительного описания подпрограммы FORWARD.

Позже подпрограмма описывается без повторения списка параметров и типа возвращаемого результата.

Правильная реализация вышеприведенного примера будет выглядеть следующим образом:

Program Kosv_Rec;

…..

procedure B (var y:real); Forward;

procedure A(var x:real);

….

B(z);

….

end;

procedure B;

….

A(z);

end;

 

 

Тема 2.6 Организация ввода-вывода данных. Работа с файлами

 

В Паскале понятие файла употребляется в двух смыслах:

• как поименованная информация на внешнем устройстве (внешний файл);

• как переменная файлового типа в Паскаль-программе (внутренний файл).

В программе между этими объектами устанавливается связь. Вследствие этого все, что происходит в процессе выполнения программы с внутренним файлом, дублируется во внешнем файле. С элементами файла можно выполнять только две операции: читать из файла и записывать в файл.

Файловый тип переменной — это структурированный тип, представляющий собой совокупность однотипных элементов, количество которых заранее (до исполнения программы) не определено.

Структура описания файловой переменной:

Var <имя переменной>: F i l e Of <тип элемента>;

где <тип элемента> может быть любым, кроме файлового.

Например:

Var Fi: File Of Integer;

Fr: File Of Real;

Fc: File Of Char;

Файл можно представить как последовательную цепочку элементов (эл.), пронумерованных от 0, заканчивающуюся специальным кодом, называемым маркером конца (<м. к.>):

Эл.0 Эл.1 Эл.N м.к

 

Количество элементов, хранящихся в данный момент в файле, называется его текущей длиной. Существует специальная ячейка памяти, которая хранит адрес элемента файла, предназначенного для текущей обработки (записи или чтения). Этот адрес называется указателем или окном файла.

Для того чтобы начать запись в файл, его следует открыть для записи. Это обеспечивает процедура Rewrite (FV); где FV — имя файловой переменной. При этом указатель устанавливается на начало файла. Если в файле есть информация, то она исчезает. Схематически выполнение процедуры Rewrite можно представить так:

До:

Эл.0 Эл.1 Эл.N м.к

Rewrite (FV)

После:

м.к  

 

Стрелка внизу отмечает позицию указателя.

Запись в файл осуществляется процедурой Write (FV, V); где v – переменная того же типа, что и файл FV. Запись происходит туда, где установлено окно (указатель). Сначала записывается значение, затем указатель смещается в следующую позицию. Если новый элемент вносится в конец файла, то сдвигается маркер конца. Схема выполнения оператора:

до:

Эл.0 Эл.1 Эл.N м.к

 

Write (FV, V)

 

После:

Эл.0 Эл.1 Эл.N V м.к

 

 

Пример. В файловую переменную Fx занести 20 вещественных чисел, последовательно вводимых с клавиатуры.

Var Fx: File Of Real;

X: Real; I: Byte;

Rewrite(Fx);

For I:=l To 20 Do

Write ('?'); ReadLn(X);

Write(Fx,X)

 

Для чтения элементов файла с его начала следует открыть файл для чтения. Это делает процедура Reset (FV). В результате указатель устанавливается на начало файла. При этом вся информация в файле сохраняется. Схема выполнения процедуры:

до:

Эл.0 Эл.1 Эл.N м.к

 

Reset (FV)

После:

Эл.0 Эл.1 Эл.N м.к

 

Чтение из файла осуществляется процедурой Read (FV, v); где v — переменная того же типа, что и файл FV. Значение текущего элемента файла записывается в переменную v; указатель смещается

к следующему элементу.

До:

  V
Эл.0 Эл.1 Эл.К Эл.К+1 Эл.N м.к  
                 

Read (FV, v)

  V
Эл.0 Эл.1 Эл.К Эл.К+1 Эл.N м.к Эл.К
                 

 

Доступ к элементам файла может быть последовательным или прямым. В стандартном Паскале реализован только последовательный доступ.

Принцип последовательного доступа: для того чтобы прочитать п-ю запись файла, сначала нужно прочитать все предыдущие записи с 1-й по (п-1)-ю.

Пример. В переменной х получить 10-й элемент вещественного файла Fx.

Var Fx: File Of Real;

X: Real;

Begin

Reset(Fx);

For I:=l To 10 Do Read(Fx,X)

End.

 

Функция Eof (FV) проверяет маркер конца файла (end of file). Это логическая функция, которая получает значение true, если указатель установлен на маркер конца, в противном случае false.

Пример. Просуммировать все числа из файла Fx, описанного в предыдущем примере.

Reset(Fx);

Sx:=0;

While Not Eof (Fx) Do

Read(Fx,X);

Sx:=Sx+X;

End;

 

To же самое с помощью цикла Repeat можно делать следующим образом:

Read(Fx,X);

Sx:=Sx+X

Until Eof(Fx);

 

Во втором варианте возможна ошибка чтения, если файл Fx пустой. Первый вариант от такой ошибки застрахован, поэтому он более предпочтителен.

Внешние файлы. ВТурбо Паскале все внешние устройства (дисплей, клавиатура, принтер, диски и т.д.) трактуются как логические устройства с файловой структурой организации данных. Все немагнитные внешние устройства однофайловые. Иначе говоря, с каждым из них связан один файл со стандартным именем, предназначенный для обмена с внутренней памятью ЭВМ текстовой (символьной) информацией.

Стандартные имена логических устройств определяются операционной системой, в среде которой работает Паскаль. В системе MS DOS определены следующие имена:

CON (консоль) — логическое устройство, связанное при вводе с клавиатурой, при выводе — с экраном;

PRN (принтер) — логическое имя файла, связанного с устройством печати;

AUX — логическое имя коммуникационного канала, который используется для связи ПК с другими машинами;

INPUT — логическое имя стандартного устройства ввода, связанного с клавиатурой; при этом вводимые с клавиатуры символы отражаются на экране дисплея;

OUTPUT — логическое имя стандартного устройства вывода на экран.

Магнитный диск (МД) — многофайловое устройство. На нем хранятся как стандартные (системные) файлы, так и файлы, создаваемые пользователем. На магнитном диске могут создаваться файлы любых типов. Файлы на МД используются как в режиме чтения, так и в режиме записи.

Список файлов на диске хранится в директории (каталоге) диска. Каталог вызывается на экран системной командой DIR. В полной форме каталог содержит идентификаторы файлов, объем занимаемой памяти, дату и время создания файла. Идентификатор файла состоит из имени и типа файла:

<имя файла>.<тип файла>

Имя содержит от 1 до 8 латинских букв и (или) цифр; тип — необязательный элемент (от 0 до 3 символов), указывающий на характер информации, хранимой в файле.

Например:

PROGRAM.PAS — в файле текст программы на Паскале;

NUMBER.DAT — файл числовых данных;

NAMES.тхт — текстовый файл.

Для организации связи между файловой переменной и внешним файлом в Турбо Паскале используется процедура назначения:

Assign (<имя файловой переменной>,

<идентификатор внешнего файла>);

 

Здесь <идентификатор внешнего файла> — строковая величина (константа или переменная). Например:

Assign(Fi,'Number.dat');

 

После выполнения процедур Assign и Rewrite создается новый внешний файл, имя которого заносится в директорию.

Если файл открывается для чтения (Assign и Reset), то в указанном каталоге уже должен содержаться указанный внешний файл. В противном случае будет обнаружена ошибка.

Работа с файлом в программе завершается его закрытием с помощью процедуры Close (<имя файловой переменной>)

Например:

Close(Fi)

 

Итак, Для создания и заполнения файла требуется следующая последовательность действий:

1. Описать файловую переменную.

2. Описать переменную того же типа, что и файл.

3. Произвести назначение (Assign).

4. Открыть файл для записи (Rewrite).

5. Записать в файл данные (Write).

6. Закрыть файл (Close).

 

Пример. Создать файл, содержащий среднесуточные температуры за некоторое количество дней. При этом необязательно предварительно указывать количество чисел во вводимой информации.

Можно договориться о каком-то условном значении, которое будет признаком конца ввода. Пусть, например, признаком конца ввода будет число 9999.

Program Task1;

Var Ft: File Of Real; T: Real;

Assign(Ft,’Temp.dat’); Rewrite(Ft);

Writeln(‘Вводите данные. Признак конца -9999’);

Readln (T);

While T<>9999 Do

Write(Ft,T); Write (‘?’); Readln(T)

End;

Writeln (‘Ввод данных закончен!’);

Close(Ft)

В результате работы этой программы на диске будет создан файл с именем Temp. dat, в котором сохранится введенная информация. Для последовательного чтения данных из файла требуется выполнить следующие действия:

1. Описать файловую переменную.

2. Описать переменную того же типа.

3. Выполнить назначение (Assign).

4. Открыть файл для чтения (Reset).

5. В цикле читать из файла (Read).

6. Закрыть файл (close).

Пример. Определить среднюю температуру для значений, хранящихся в файле Temp.dat.

Program Task2;

Var Ft: File Of Real;

T,St: Real; N: Integer;

Begin Assign(Ft,'Temp.dat');

Reset(Ft);

St:=0;

While Not Eof (Ft) Do

Read(Ft,T);

St:=St+T

End;

N:=FileSize(Ft);

St:=St/N;

WriteLn('Средняя температура 3a',N:3,

'суток равна',St:7:2,'гр-в');

Close(Ft)

В этой программе использована функция определения размера файла:

FileSize(<имя файловой переменной>);

Ее результат — целое число, равное текущей длине файла.

Замечание: согласно стандарту Паскаля в файл, открытый оператором Rewrite, можно только записывать информацию, а файл, открытый оператором Reset, можно использовать только для чтения. В Турбо Паскале допускается запись (Write) в файл, открытый для чтения (Reset). Это создает определенные удобства для модификации файлов.

Текстовые файлы. Текстовый файл — наиболее часто употребляемая разновидность файлов. Как уже отмечалось раньше, немагнитные внешние устройства (логические) работают только с текстовыми файлами. Файлы, содержащие тексты программ на Паскале и других языках программирования, являются текстовыми. Различная документация, информация, передаваемая по каналам электронной связи, — все это текстовые файлы.

В программе файловая переменная текстового типа описывается следующим образом:

Var <идентификатор>:text;

Текстовый файл представляет собой символьную последовательность, разделенную на строки. Каждая строка заканчивается специальным кодом — маркером конца строки (м.к.с). Весь файл заканчивается маркером конца файла (м.к.ф.). Схематически это выглядит так:

S1 S2 Sk1 м.к.с   S1 S2 Sk2 м.к.с   м.к.ф

 

Каждый символ представлен во внутреннем коде (ASCII) и занимает 1 байт. Текстовый файл отличается от символьного не только делением на строки. В текстовой файл можно записать и из него прочитать информацию любого типа. Если эта информация несимвольная, то в процессе чтения или записи происходит ее преобразование из символьной формы во внутреннюю и обратно.

Текстовый файл можно создать или преобразовать с помощью текстового редактора. Его можно просмотреть на экране дисплея или распечатать на принтере.

В программах на Паскале для работы с текстовыми файлами наряду с процедурами Read и Write употребляются процедуры Readln и Writeln.

Readln(FV,<список ввода>)

Эта процедура читает строку из файла с именем FV, помещая прочитанное в переменные из списка ввода.

Writeln(FV,<список вывода>)

Процедура записывает в файл FV значения из списка вывода, после чего выставляет маркер конца строки.

Для обнаружения конца строки в текстовом файле используется Функция Eoln(FV)

(End of line — конец строки). Это логическая функция, которая принимает значение true, если указатель файла достиг маркера конца строки и false — в противном случае.

Употребление операторов Read и Readln без указания имени файловой переменной обозначает чтение из стандартного файла input (ввод с клавиатуры). Употребление операторов Write и Writeln без имени файловой переменной обозначает запись в стандартный файл Output (вывод на экран). В таком варианте этими операторами мы уже многократно пользовались. Считается, что файлы input и Output всегда открываются соответственно для чтения и записи при работе любой программы.

При вводе с клавиатуры маркер конца строки обнаруживается при нажатии на клавишу Enter.

Процедура Readln может использоваться без списка ввода. В этом случае происходит пропуск текущей строки в читаемом файле.

Употребление процедуры Writeln без списка вывода обозначает вывод пустой строки (в файле выставляется маркер конца строки).

При записи в текстовый файл в списке вывода могут присутствовать форматы. Действия форматов мы уже рассматривали при обсуждении вывода данных на экран. Точно так же форматы работают

и при выводе в текстовые файлы, связанные с любыми другими устройствами.

Пример. Пусть файл с именем Note.txt содержит некоторый текст. Требуется подсчитать количество строк в этом тексте.

Var Note: Text; К: Integer;

Begin Assign(Note,’Note.txt’);

Reset(Note);

K:=0;

While Not Eof (Note) Do

Readln(Note); K:=K+1

End;

Writeln(‘Количество строк равно’, К);

Close(Note)

Используемый здесь оператор ReadLn(Note) «пролистывает» строки из текстового файла Note, не занося их в какую-либо переменную.

Пример. В текстовом файле Note.txt определить длину самой большой строки.

Var Note: Text;

Мах,К: Integer; С: Char;

Assign(Note,’Note.txt’);

Reset(Note);

Max:=0;

While Not Eof(Note) Do

K:=0;

Not Eoln(Note) Do

Read(Note,С); K:=K+1

End;

If K>Max Then Max:=K;

Readln(Note)

End;

Writeln('Наибольшая строка имеет', Max,'знаков');

Close(Note)

Здесь каждая строчка прочитывается посимвольно, при этом в переменной K работает счетчик числа символов в строке. В переменной Мах отбирается наибольшее значение счетчика.

 

Тема 2.7 Библиотеки подпрограмм

 

Модуль (UNIT) в Турбо Паскале – это особым образом оформленная библиотека подпрограмм. Модуль в отличие от программы не может быть запущен на выполнение самостоятельно, он может только участвовать в построении программ и других модулей.

Модули позволяют создавать личные библиотеки процедур и функций и строить программы практически любого размера.

Модуль в Турбо Паскале представляет собой отдельно хранимую и независимо компилируемую программную единицу.

В общем случае модуль – это совокупность программных ресурсов, предназначенных для использования другими программами. Под программными ресурсами понимаются любые элементы языка Турбо Паскаль: константы, типы, переменные, подпрограммы. Модуль сам по себе не является выполняемой программой, его элементы используются другими программными единицами.

Все программные элементы модуля можно разбить на две части:

– программные элементы, предназначенные для использования другими программами или модулями, такие элементы называют видимыми вне модуля;

– программные элементы, необходимые только для работы самого модуля, их называют невидимыми или скрытыми.

В соответствии с этим модуль, кроме заголовка, содержит две основные части, называемые интерфейсом и реализацией.

В общем случае модуль имеет следующую структуру:

unit <имя модуля>; {заголовок модуля}
interface
{ описание видимых программных элементов модуля }
{ описание скрытых программных элементов модуля }
begin
{ операторы инициализации элементов модуля }
end.

В частном случае модуль может не содержать части реализации и части инициализации, тогда структура модуля будет такой:

unit <имя модуля>; {заголовок модуля}
interface
{ описание видимых программных элементов модуля }
implementation

end.

Использование в модулях процедур и функций имеет свои особенности. Заголовок подпрограммы содержит все сведения, необходимые для ее вызова: имя, перечень и тип параметров, тип результата для функций, эта информация должна быть доступна для других программ и модулей. С другой стороны, текст подпрограммы, реализующий ее алгоритм, другими программами и модулями не может быть использован. Поэтому заголовок процедур и функций помещают в интерфейсную часть модуля, а текст – в часть реализации.

Интерфейсная часть модуля содержит только видимые (доступные для других программ и модулей) заголовки процедур и функций (без служебного слова forward). Полный текст процедуры или функции помещают в часть реализации, причем заголовок может не содержать список формальных параметров.

Исходный текст модуля должен быть откомпилирован с помощью директивы Make подменю Compile и записан на диск. Результатом компиляции модуля является файл с расширением TPU (Turbo Pascal Unit). Основное имя модуля берется из заголовка модуля.

Для подключения модуля к программе необходимо указать его имя в разделе описания модулей, например:

uses CRT, Graph;

В том случае, если имена переменных в интерфейсной части модуля и в программе, использующей этот модуль, совпадают, обращение будет происходить к переменной, описанной в программе. Для обращения к переменной, описанной в модуле, необходимо применить составное имя, состоящее из имени модуля и имени переменной, разделенных точкой.

Например, пусть имеется модуль, в котором описана переменная К:

unit M;
interface
var K: Integer;
implementation
..................
end.

Пусть программа, использующая этот модуль, также содержит переменную К:

Program P;
uses M;
var K: Char;
begin
..................
end.

Для того, чтобы в программе P иметь доступ к переменной K из модуля M, необходимо задать составное имя M.K.

Использование составных имен применяется не только к именам переменных, а ко всем именам, описанным в интерфейсной части модуля.

Рекурсивное использование модулей запрещено.

Если в модуле имеется раздел инициализации, то операторы из этого раздела будут выполнены перед началом выполнения программы, в которой используется этот модуль.

 

Тема 2.8 Графика

 

Начиная с четвертой версии Турбо Паскаля для IBM PC появилась мощная графическая библиотека, организованная в модуль Graph. Для его подключения в начале программы необходимо написать строку:

Uses Graph;

Графические режимы экрана. Для вывода графических изображений необходимо перевести экран в один из графических режимов. В графическом режиме можно из программы управлять состоянием каждого пиксела (точечного элемента) экрана.

Графические режимы отличаются:

• размером графической сетки (M x N, где М — число точек по горизонтали, N — число точек по вертикали);

• цветностью (число воспроизводимых на экране цветов). Допустимые режимы зависят от типа монитора и соответствующего графического драйвера, используемого на компьютере.

Для установки графического режима экрана существуют соответствующие процедуры. В модуле Graph процедура установки графического режима экрана имеет следующий заголовок:

Procedure InitGraph(Var Driver,Mode: Integer; Path: String);

Здесь целая переменная Driver определяет тип графического драйвера; целая переменная Mode задает режим работы графического драйвера; Path — выражение типа String, содержащее маршрут поиска файла графического драйвера.

Пример программы, инициализирующей графический режим VGAHi для работы с драйвером VGA (монитор типа VGA).

Uses Graph;

Var Driver,Mode: Integer;

Begin

Driver: = VGA;{драйвер}

Mode: = VGAHi;(режим работы}

InitGraph(Driver,Mode,'C:\TP\BGI');

Здесь указывается, что файл egavga.bgi с драйвером для VGA-монитора находится в каталоге C:\TP\BGI. Режим VGAHi соответствует графической сетке 640 х 480 с палитрой из 16 цветов.

Возможно также автоматическое определение типа драйвера и установка режима. Этот прием позволяет программе работать с разными типами мониторов, не внося изменений в текст:

Driver:=Detect;

InitGraph(Driver,Mode,'C:\TP\BGI');

При этом автоматически устанавливается режим с наибольшей разрешающей способностью и цветностью. После окончания работы в графическом режиме следует вернуться в текстовый режим экрана.

В модуле Graph процедура возвращения в текстовый режим имеет заголовок:

Procedure CloseGraph;

Цвет фона и цвет рисунка. На цветном мониторе можно менять окраску экрана. Установленная окраска экрана называется цветом фона. Рисунок на этом фоне наносится с помощью разнообразных линий: прямых, окружностей, прямоугольников, ломаных и т.д. Цвета этих линий также могут меняться.

Заголовок процедуры установки цвета фона:

Procedure SetBkColor(Color: Word);

Здесь Color — выражение целого типа, определяющее номер цвета фона.

Заголовок процедуры установки цвета линий:

Procedure SetColor(Color: Word);

Заметим, что если в качестве номера цвета линии указывается 0, то это всегда совпадает с цветом фона (невидимая линия).

Если необходимо очистить графический экран (стереть рисунок), то для этого используется процедура очистки экрана.

Заголовок процедуры очистки экрана:

Procedure ClearDevice;

В результате выполнения этой процедуры экран заполняется установленным цветом фона.

Графические координаты. Положение каждого пикселя графической сетки однозначно определяется указанием его координат. Графические оси координат расположены на экране так, как показано на рисунке.

Горизонтальная ось X направлена слева направо, вертикальная ось Y — сверху вниз. На рисунке указаны предельные графические координаты, соответствующие режиму VGAHi.

Можно определить максимальные координаты по осям, соответствующие данному драйверу. Это делается с помощью двух целочисленных функций:

Function GetMaxX;

Function GetMaxY;

Графическое окно. Область вывода изображения может быть ограничена любым прямоугольником в пределах экрана. Такая область называется графическим окном. Существует процедура, устанавливающая положение графического окна на экране.

Заголовок процедуры назначения графического окна:

Procedure SetViewPort(X1,Y1,X2,Y2: Integer; Clip: Boolean);

Здесь (X1, Y1) — координаты левого верхнего угла окна; (Х2, Y2) — координаты правого нижнего угла окна; Clip — ограничитель фигур; если Clip=True, то все построения производятся только в пределах окна, в противном случае они могут выходить за его пределы.

После установки окна координаты точек внутри него отсчитываются от верхнего левого угла.

Существует понятие графического курсора (по аналогии с символьным курсором). Но в отличие от символьного курсора графический курсор на экране не виден. Графический курсор указывает на текущую позицию на экране. При входе в графический режим координаты текущей позиции равны (0, 0).

Процедура назначения координат графического курсора:

Procedure MoveTo(X,Y: Integer);

Здесь X, Y — устанавливаемые координаты курсора. Координаты указываются относительно левого верхнего угла окна или, если окно не установлено, экрана.

Процедура поставить точку — основная процедура получения изображения, поскольку любой рисунок складывается из точек. Состояние светящейся точки определяется координатами точки на экране и цветом точки.

Заголовок процедуры выставления точки на графическом экране:

Procedure PutPixel(X,Y: Integer; Color: Word);

Здесь X, Y — координаты точки, Color — цвет точки.

Пример. Программа устанавливает по центру экрана графическое окно размером 100х100, заливает его желтым фоном и заполняет синими точками, расположенными через 4 позиции.

Uses Graph;

Var Driver,Mode: Integer;

X,Y,Xl,Yl,X2,Y2,Xc,Yc: Integer;

Begin

{Инициализация графического режима}

Driver:=Detect;

InitGraph(Driver, Mode,'C:\TP\BGI');

{Определение координат центра экрана}

Хс:=GetMaxX Div 2;

Yc:=GetMaxY Div 2;

{Определение координат графического окна}

X1:=Хс-50

Yl:=Yc-50

Х2:=Хс+50

Y2:=Yc+50

{Установка графического окна}

SetViewPort(Xl,Yl,X2,Y2,True);

{Установка цвета фона и очистка экрана}

SetBkColor(Yellow);

ClearDevice;

{Расстановка точек в окне)

For X:=l То 25 Do

For Y:=l To 25 Do

PutPixel(4*X,4*Y,Blue);

{Задержка изображения на экране до нажатия <ENTER>}

ReadLn;

{Выход из графического режима в символьный}

CloseGraph;

End.

 

Графические примитивы. Хотя любое изображение можно построить из точек, но программировать получение сложного рисунка или чертежа, используя только процедуру поставить точку, было бы слишком неудобно и громоздко. В любом графическом пакете существуют процедуры рисования основных геометрических фигур: прямых линий, окружностей, эллипсов, прямоугольников и т. п. Такие фигуры называют графическими примитивами.

Рассмотрим несколько основных процедур рисования графических примитивов, имеющихся в модуле Graph.

Линия с заданными координатами концов (X1, Y1) и (Х2, Y2):

Procedure Line(X1,Y1,X2,Y2: Integer);

Линия от текущей точки до точки с координатами X, Y:

Procedure LineTo(X,Y: Integer);

Линия от текущей точки до точки с заданными приращениями координат DX, DY:

Procedure LineRel(DX,DY: Integer);

Прямоугольник с заданными координатами верхнего левого угла (X1, Y1) и нижнего правого угла (Х2, Y2):

Procedure Rectangle(XI,Y1,X2,Y2: Integer);

Окружность с центром в точке (X, Y) и радиусом R— в пикселях:

Procedure Circle(X,Y: Integer; R: Word);

Дуга окружности с центром в точке (X, Y), радиусом R, начальным углом BegA и конечным углом EndA. Углы измеряются в градусах против часовой стрелки от направления оси X.

Procedure Arc(X,Y: Integer; BegA,EndA,R: Word);

Эллипсная дуга с центром в точке X, Y с начальным и конечным углами BegA и EndA, горизонтальным радиусом RX и вертикальным радиусом RY:

Procedure Ellipse(X,Y: Integer; BegA,EndA,RX,RY: Word);

Пример. Составим программу, рисующую голову робота.

 

Рисунок содержит два прямоугольника, две окружности, две дуги, эллипс, три прямые линии и две красные точки. Заранее определяются все координаты и размеры элементов рисунка.

Uses Graph;

Var Driver,Mode: Integer;

Begin

{Инициализация графического режима}

Driver:=Detect;

InitGraph(Driver, Mode,'C:\TP\BGI');

SetColor(White);{белый цвет рисунка}

SetBkColor(Black);{черный цвет фона)

Rectangle(100,100,300,300);{голова}

Circle(150,170,30);(левый глаз}

Circle(250,170,30);{правый глаз}

Arc(150,170,45,135,40);{левая бровь}

Arc(250,170,45,135,40);{правая бровь}

Ellipse(200,250,0,359,10,20);{нос}

Rectangle(130,280,270,290);{рот}

MoveTo(100,300);{установка вниз влево}

LineTo(50,350);{три}

LineTo(350,350);{линии}

LineTo(300,300);{шеи}

PutPixel(150,170,Red);{левый зрачок}

PutPixel(250,170,Red);{правый зрачок}

ReadLn;{задержка}

CloseGraph;(выход из графики}

End.

В приведенном примере все линии рисуются сплошными и стандартной толщины. Модуль Graph позволяет управлять стилем линии (сплошная, пунктирная, точечная и т.п.) и толщиной. Для этого существует процедура SetLineStile.

Закраски и заполнения. Среди графических примитивов существуют закрашенные области. Цвет закраски определяется процедурой SetColor. Кроме того, можно управлять рисунком закраски (типом заполнения). Это может быть сплошная закраска, заполнение редкими точками, крестиками, штрихами и т.п.

Процедура определения типа заполнения (Fill) и цвета заполнения (Color) имеет следующий заголовок:

Procedure SetFillStyle(Fill,Color: Word);

Заполненная прямоугольная область с заданными координатами углов:

Procedure Bar(XI,Y1,X2,Y2: Integer);

Обведенный линией (SetLineColor, SetLineStyle) и закрашенный (SetFillStyle) эллипс:

Procedure FillEllips(X,Y,RX,RY: Integer);

Обведенный линией и закрашенный эллипсный сектор:

Procedure Sector(X,Y: Integer;

BegA,EndA,RX,RY: Word);

Обведенный линией и закрашенный сектор окружности:

Procedure PieSlice(X,Y:Integer;

BegA,EndA: Word);

Наконец, можно закрасить любую область, ограниченную замкнутой линией. Для этого нужно указать какую-нибудь точку внутри этой области (X, Y) и цвет граничной линии (Border). Соответствующая процедура выглядит следующим образом:

Procedure FloodFill(X,Y: Integer; Border: Word);

Модуль Graph позволяет выводить на графический экран тексты. Procedure OutTextXY(X,Y: Integer; Txt: String);

Например, чтобы вывести под нашим рисунком строку «ЭТО РОБОТ», следует в программу добавить оператор OutTextXY(195,400,'ЭТО РОБОТ').

 

 

Список рекомендуемой литературы:

1.Голицына О. Л., Попов И. И. Основы алгоритмизации и программирования. 2008г.

2.Колдаев В.Д, Основы алгоритмизации и программирования. Москва ИД «ФОРУМ»-ИНФРА-М 2009 г.

3.Семакин И.Г., Шестаков А.П. Основы программирования. М.: ИД «Академия», 2008г.

ВОПРОСЫ ДЛЯ САМОКОНТРОЛЯ К РАЗДЕЛУ 2:

1. Что такое величина?

2. Какие величины называют аргументами? результатами? промежуточными величинами?

3. Каковы атрибуты величины?

4. Какие величины называют постоянными? переменными? Приведите примеры.

5. Какие простые типы величин существуют в языке Pascal?

6. Что определяет тип величины?

7. Расскажите о простых типах данных и их атрибутах.

8. Как осуществляется ввод данных в языке Pascal? Приведите примеры.

9. Как осуществляется вывод данных в языке Pascal? Приведите примеры.

10. Какова общая структура программы в языке Pascal?

11. Расскажите об операторе присваивания и совместимости типов.

12. Что такое формат вывода?

13. Расскажите о правилах вычисления алгебраического выражения. Приведите примеры.

14. Расскажите о правилах вычисления логического выражения. Приведите примеры.

15. Расскажите о логических операциях. Приведите примеры.

16. Приведите примеры задач, имеющих линейный алгоритм решения.

17. Когда возникает необходимость в организации развилки?

18. Какая развилка называется полной? неполной?

19. Выражение какого типа может выступать в качестве условия при организации развилки? Какие значения принимают такие выражения?

20. Могут ли в полной развилке не выполниться операторы ни по одной из ветвей? выполниться по обеим ветвям?

21. В каком случае целесообразно использовать оператор выбора?

22. Какого типа может быть выражение, являющееся селектором выбора? Приведите примеры.

23. Что такое массив?

24. Почему массив является структурированным типом данных?

25. Что такое размерность массива? Существуют ли ограничения на размерность массива?

26. Какого типа могут быть элементы массива?

27. Какого типа могут быть индексы элементов массива?

28. Какие простые типы данных относятся к порядковым?

29. Какими способами может быть заполнен массив?

30. Как определить минимальный объём памяти, отводимой под массив?

31. Какие действия выполняют обычно над элементами массива?

32. Может ли массив быть элементом массива?

33. В каком случае массивы совместны по присваиванию?

34. Можно ли выполнять обход двумерного массива, организовав внешний цикл по столбцам, а внутренний — по строкам?

35. Используются ли вложенные циклы, если совершается обход только главной диагонали квадратной матрицы?

36. Как можно объявить величину строкового типа?

37. К каким типам данных относятся строки?

38. Какова максимально возможная длина строки?

39. С величиной какого типа данных совместим по присваиванию отдельный символ строки?

40. Расскажите об операциях, которые можно выполнять над строковыми величинами.

41. Расскажите о функциях, определенных для величин строкового типа.

42. Расскажите о процедурах, определенных для величин строкового типа.

43. Как осуществляется доступ к отдельному символу строки?

44. Почему значение отношения 'Мама'<>'мама' равно TRUE?

45. Какая функция (процедура) является аналогом операции сцепления (+) при работе со строками?

46. Каков будет результат выполнения операции сцепления, если длина результирующей строки превысит значение 255?

47. Какие алгоритмы называют вспомогательными?

48. Какое количество вспомогательных алгоритмов может присутствовать в основном алгоритме?

49. Можно ли вспомогательные алгоритмы, написанные для решения данной задачи, использовать при решении других задач, где их применение было бы целесообразно?

50. Какие параметры называют формальными? фактическими?

51. Какое соответствие должно соблюдаться между формальными и фактическими параметрами?

52. Может ли фактических параметров процедуры (функции) быть больше, чем формальных? А меньше?

53. Существуют ли подпрограммы без параметров?

54. Существуют ли ограничения на число параметров подпрограмм? Если нет, то чем же всё-таки ограничивается это количество в Turbo Pascal?

55. В каком разделе объявляются и реализуются подпрограммы в Turbo Pascal?

56. Какие виды формальных параметров существуют? Чем они отличаются друг от друга?

57. В чём состоит отличие процедур и функций?

58. В каких случаях целесообразно использовать функции?

59. Почему, если в функции используются параметры-переменные, необходимо преобразовать её в процедуру?

60. Какого типа может быть значение функции?

61. Расскажите о методе последовательной детализации при разработке программ.

62. Какие подпрограммы называют рекурсивными?

63. Что такое граничное условие при организации рекурсивной подпрограммы?

64. Чем отличается тип "запись" от других структурированных типов?

65. Могут ли поля записи быть одного и того же типа?

66. Как обратиться к отдельному полю записи?

67. Что такое "оператор присоединения"? В каких целях он используется?

68. Что такое "запись с вариантами"?

69. Как определить объем памяти под статическую запись? запись с вариантами?

70. Как заполнить массив записей?

71. Что такое множество?

72. Почему множество является структурированным типом данных?

73. Как хранится множество в памяти ЭВМ? Какой максимальный объем оперативной памяти может быть отведен под хранение одного множества?

74. Какие операции можно выполнять над множествами?

75. Как добавить элемент в множество?

76. Как исключить элемент из множества?

77. Как вывести элементы множества? Как подсчитать количество элементов в множестве?

78. Как может быть использована операция вхождения?

79. В чем заключается метод пошаговой детализации?

80. Перечислите правила структурного программирования.

81. Нарисуйте схему программы модульной структуры?

82. Каковы характерные особенности организации модуля в языке Паскаль?

83. Какую структуру имеет модуль в языке Паскаль?

84. В каких случаях можно отсутствовать раздел IMPLEMENTATION?

85. Какое расширение имеет имя файла с исходным текстом модуля?

86. Охарактеризуйте три режима компиляции модулей и основной программы.

87. Для чего предназначена интерфейсная часть модуля?

88. Можно ли в программе переопределить объекты, объявленные в интерфейсной части модуля?

89. Как получить доступ к "закрытому" объекту, значение которого вычисляется в модуле, но не используется в программе?

 


 

 

К выполнению контрольной работы рекомендуется приступить после изучения теоретического материала в соответ­ствии с программой и после проработки вопросов для самокон­троля. Литература для изучения указана к каждой теме данного пособия.

Контрольная работа выполняется по варианту, которой зависит от шифра студента (номер личного дела). Вариант определяется по последней цифре шифра.

Контрольная работа представлена в двадцати вариантах.

Выполнение заданий контрольной работы следует начинать с полной записи условия.

Контрольная работа выполняется компьютерным набором (поля 2см по всем сторонам, шрифт № 14, тип Times New Roman, интервал полуторный).

Блок - схемы вы­полняются с соблюдением требований ГОСТов и ЕСКД либо с помощью соответствующего программного обеспечения.

Тексты программ должны соответствовать правилам оформления [с. 45 В.Д. Колдаев «Основы алгоритмизации и программирования»].

В конце выполненной контрольной работы обязательно приводится список литературы, дата и подпись учащегося.

 




Поделиться с друзьями:


Дата добавления: 2014-10-17; Просмотров: 668; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.441 сек.