Главная страница

Паскаль лекции. Лекции Паскаль. Программа на языке машинных команд (ее называют объектной). Краткое знакомство


Скачать 1.24 Mb.
НазваниеПрограмма на языке машинных команд (ее называют объектной). Краткое знакомство
АнкорПаскаль лекции
Дата14.01.2020
Размер1.24 Mb.
Формат файлаpdf
Имя файлаЛекции Паскаль.pdf
ТипПрограмма
#104006
страница5 из 7
1   2   3   4   5   6   7
1, если n=1 или n=2
Ф(n-1) + Ф(n-2), если n>2
Задача 4. Найти сумму первых N членов арифметической
(
геометрической) прогрессии.
II.
Задачи, из постановки которых можно извлечь рекурсию
В формулировках некоторых задач рекурсия не присутствует в явном виде, но их можно свети к рекурсивным.
Пример 1. Сложение двух чисел. Пусть надо сложить два целых числа a и b, а можно только прибавлять или вычитать 1. Тогда: если b=0, то a+b=a если b>0, то a+b=(a+1)+(b-1) если b<0, то a+b=(a-1)+(b-1)
Это есть рекурсивное определение операций сложения двух чисел.
Function Sum(a, b : integer) : integer; begin if b=0 Then Sum:=a else if b>0 Then Sum:=Sum(a+1, b-1) else Sum:=Sum(a-1, b+1); end;
Ф(n)=
=
PDF created with pdfFactory Pro trial version www.pdffactory.com

68
Пример 2. Найти НОД двух натуральных чисел.(2 способ)
Имеются два натуральных числа a и b.
Если a=b, то НОД(a,b)=a.
Если a>b, то НОД(a,b)=НОД(a-b,b).
Если aFunction NOD(a,b : integer) : integer; begin if a=b Then NOD:=a else if a>b Then NOD:=NOD(a-b,b) else NOD:=NOD(a,b-a) ; end; a b
Примечание
123 36
Так как a>b, a:=a-b
87 36 a:=a-b
51 36 a:=a-b
15 36
Так как b>a, b:=b-a
15 21 b:=b-a
15 6 a:=a-b
9 6 a:=a-b
3 6 b:=b-a
3 3
Так как a=b, НОД:=a
Пример 3. Перевести натуральное число из десятичной системы счисления в двоичную.
Function Rec(n: integer); begin if n>1 Then Rec(n div 2);
Write(n Mod 2); end;
III.
Задачи, которые можно решить как частный случай обобщенной
PDF created with pdfFactory Pro trial version www.pdffactory.com

69
Если нельзя извлечь рекурсию из постановки задачи, то можно расширить задачу, обобщить ее (например, введя дополнительный параметр). Удачное обобщение может помочь увидеть рекурсию.
После этого возвращаемся к частному случаю и решаем исходную задачу.
Пример 1 Определить, является ли заданное натуральное число простым.
Данную задачу можно обобщить, например, так: определить, верно ли, что заданное натуральное число N не делится ни на одно число, большее или равное М (2MN), но меньше N.
Соответствующая функция должна принимать значение «истина» в двух случаях:
 если M=N;
 если N не делится на М и функция принимает значение
«
истина» для чисел М+1 и N.
Function Simple(m,n : integer): boolean; begin if m=n Then Simple:=True else Simple:=(n Mod m <> 0) And Simple(m+1,n); end;
IV.
Задачи, в которых можно использовать характеристику или свойство функции
Пример 1. Для заданного натурального числа N

1 определить натуральное число a, для которого выполняется неравенство :
2
а-1
 N < 2
a a(N) = 1 , если N=1 a(N)=a(N div 2) + 1, если N>1
Рассмотрим пример. Пусть N=34.
2
a-1
34<2
a
, прибавим 1 и переходим к 34 div 2 2
a-1
17<2
a
+1 2
a-1
 8<2
a
+1 2
a-1
 4<2
a
+1 2
a-1
 2<2
a
+1 2
a-1
 1<2
a
; получим а=1
PDF created with pdfFactory Pro trial version www.pdffactory.com

70
А теперь возвращаемся назад, к последней единице прибавляем все предыдущие. Таким образом, получается 6.
Function A(N : integer) : integer; begin if N=1 then a:=1 else a:=a (N div 2) +1; end;
§19.
Графика
В графическом режиме экран рассматривается как последовательность точек (пикселов), из которых строится изображение.
Количество пикселов в строке и количество строк на экране характеризуют его разрешающую способность.
640
х480 - в строке 640 пикселов , а строк всего 480.
Пиксел определяют : координаты X, Y и цвет. Х
(0,0) (640,0)
(0,480) (640,480)
Для работы в графическом режиме разработана библиотека
GRAPH, содержащая множество графических процедур и набор драйверов.
Драйвер находится в файле с расширением .BGI
Для того, чтобы в программе можно было использовать процедуры модуля GRAPH, его надо подключить к программе, использовав раздел описаний модулей:
USES GRAPH;
С момента подключения модуля GRAPH программисту доступны все находящиеся в ней подпрограммы.
PDF created with pdfFactory Pro trial version www.pdffactory.com

71
В первую очередь вызывается процедура InitGraph, которая устанавливает один из возможных графических режимов.
Формат процедуры :
InitGraph( Driver, Mode,’c:\tp7\bgi’);
В программе нужно описать переменные Driver и Mode : var Driver, Mode : integer;
В разделе операторов, перед тем как написать первый графический оператор, следует выполнить :
Driver:=Detect; InitGraph(Driver, Mode,’c:\tp7\bgi’);
Перед окончанием программы следует закрыть видеорежим с помощью процедуры CloseGraph.
Установка цвета и стиля заполнения
SetColor(< константа определяющая цвет>:word); - установка цвета графического изображения.
SetBkColor(<
константа определяющая цвет фона>:word); - установка цвета фона;
SetFillStyle(<
константа стиля заполнения>:word; <константа цвета заполнения>:word); - установка способа закраски.
Таблица цветов
Константа
Цвет
Имя
Значение
Black
0
Черный
Blue
1
Синий
Green
2
Зеленый
Cyan
3
Бирюзовый
Red
4 красный
Magenta
5 малиновый
Brown
6 коричневый
LightGray
7 светло-серый
DarkGray
8 темно-серый
LightBlue
9 ярко-голубой
PDF created with pdfFactory Pro trial version www.pdffactory.com

72
LightGreen
10 ярко-зеленый
LightCyan
11 ярко-бирюзовый
LightRed
12 ярко-красный
LightMagenta
13 ярко-малиновый
Yellow
14 желтый
White
15 белый
Таблица констант для стандартных стилей заполнения.
Константа
Стиль заполнения
Имя
Значение
EmptyFill
0 заполнение цветом фона
SolidFill
1 заполнение текущим цветом
LineFill
2
Заполнение символами ---
LtslashFill
3 заполнение символами // нормальной толщ.
SlashFill
4 заполнение символами // удвоенной толщ.
BkslashFill
5 заполнение символами \\ удвоенной толщ.
LtbkSlashFill
6 заполнение символами \\ нормальной толщ.
HatchFill
7 заполнение вертикально- горизонтальной штриховкой тонкими линиями
XhatchFill
8 заполнение штриховкой крест- накрест по диагонали «редкими» тонкими линиями
InterLeaveFil
9 заполнение штриховкой крест- накрест по диагонали «частыми» тонкими линиями
WideDotFill
10 заполнение «редкими» точками
CloseDotFill
11 заполнение «частыми» точками
PDF created with pdfFactory Pro trial version www.pdffactory.com

73
Процедуры создания графических примитивов
1.
Текущий указатель.
При построении изображения иногда надо указать точку начала вывода. В текстовом режимах эту точку указывает курсор, который присутствует на экране (его можно убрать). В графическом режимах видимого курсора нет, но есть невидимый текущий указатель. Для перемещения текущего указателя по экрану дисплея служит процедура MoveTo(x,y) - перемешает указатель в точку с координатами (x,y).
MoveRel(dx, dy) - перемещает указатель на dx точек по горизонтали и dy точек по вертикали от предыдущей позиции.
Примеры
1.
MoveTo(200,100);
MoveRel(5,10); {
указатель переместится в точку (205,110)}
Чтобы определить максимальное значение координат X Y для установленного видеорежима, используют функции
GetMaxX : integer; максимум по Х
GetMaxy : integer; максимум по Y
Установить указатель в центр экрана.
var Xcentr, Ycentr : integer; begin
Xcentr:=GetMaxX div 2;
Ycentr:=GetMaxy div 2;
MoveTo(Xcentr, Ycentr);
2.
Вывод точки
PutPixel(x,y : integer; <
цвет точки>); где x,y координаты точки.
PDF created with pdfFactory Pro trial version www.pdffactory.com

74 3.
Вывод отрезка
Line(x1,y1,x2,y2);
(x1,y1) - координаты начала отрезка
(x2,y2) - координаты конца отрезка
!!!
Обратите внимание на то, что в процедуре не задается цвет. В этом и аналогичных случаях цвет определяется процедурой SetColor().
LineTo(x,y) - строит отрезок из точки текущего положения указателя в точку с координатами (x,y).
LineRel(dx,dy) - строит отрезок из точки текущего положения указателя в точку с координатами (x+dx, y+dy)
4.
Построение прямоугольника
Rectangle(x1,y1,x2,y2:integer);
Bar(x1,y1,x2,y2:integer) - рисует прямоугольник и закрашивает его цветом и стилем, определенным в процедуре SetFillStyle().
5.
Построение дуг, окружностей, эллипсов.
Circle(x,y,<
радиус> : word); - окружность указанного радиуса
Ellipse(x,y:integer; <
нач_угол>,<кон_угол> :word; xR,yR : word) - построение эллиптических дуг.
X,Y - координаты центра, xR, yR - длина горизонтальной и вертикальной полуосей в пикселах.
Угол отсчитывается против часовой стрелки и указывается в градусах. Дуга эллипса вычерчивается от заданного начального угла до конечного угла. Если значение начального угла 0, а конечного 360 - будет построен полный эллипс.
6.
Построение закрашенного эллипса:
FillEllipse(x,y:integer; xR,yR);
X,Y - координаты центра,
PDF created with pdfFactory Pro trial version www.pdffactory.com

75 xR, yR - длина горизонтальной и вертикальной полуосей в пикселах.
Стиль заполнения области внутри эллипса устанавливается процедурой SetFillStyle(), а самого эллипса - SetColor().
7.
Заполнение внутренней или внешней области замкнутой фигуры.
FloodFill(x,y:integer; <
цвет границы области>);
Стиль задан SetFillStyle()
X,Y - координаты точки внутри (или вне) замкнутой области.
Задача. Построить в центре экрана синий прямоугольник, закрасив его линиями вида \\ темно-серого цвета. Фон экрана сделать белым.
Program graph1; uses Graph; var Driver, Mode : integer; begin
Driver:=Detect; {
инициализация графического}
InitGraph(Driver, Mode,’’) { режима}
SetBkColor(15); { установка цвета фона - белый}
SetColor(1); {
установка текущего цвета - синего}
Cleardevice; {
очистка экрана установленным цветом фона}
SetFillStyle(5,8); {
установка стиля заполнения}
Rectangle(290,290, GetMaxX-290, GetMaxy-290); {
прямоугольник}
FloodFill(301,230,1); {
заполнение прямоугольника выбранным стилем}
ReadLn;
CloseGraph; end.
Задача 2. Построить график y=sinx по оси y в диапазоне -100,100 y=100*sinx, 0Program sinus; uses crt, graph; var gt, gr : integer; xm,ym,i : integer;
PDF created with pdfFactory Pro trial version www.pdffactory.com

76
dx,x1,y1,x2,y2:real; begin gt:=detect; initgraph(gt,gr,’’); xm:=getmaxx div 2; ym:=getmaxy div 2; setcolor(3); line(0,ym-100,0,yn+100); line(0,ym.getmaxx,ym); {
построение осей} outtextxy(100,ym+50,’pi’); {
вывод текста рядом с осями} moveto(0,ym); dx:=oi/100; x1:=0; setcolor(5); while x1<=200 do begin y1:=100*sin(x1*dx); x2:=x1+dx; y2:=100*sin(x2*dx); line(round(x1),ym+round(y1),round(x2), ym+round(y2)); x1:=x2; y1:=y2 end; readln; closegraph; end.
PDF created with pdfFactory Pro trial version www.pdffactory.com

77
Материалы для дополнительного чтения.
§20.
Файловый тип данных
В задачах, которые мы рассматривали, данные поступали с клавиатуры, а результаты выводились на экран дисплея. Поэтому ни исходные данные, ни результаты не сохранялись. Приходилось заново вводить данные всякий раз, когда запускали программу. А если их очень много ? Тогда удобно оформить исходные данные и результаты в виде файлов, которые можно хранить на диске точно так же, как и программы.
Файл - это область памяти на внешнем носителе, в которой хранится некоторая информация. В языке Паскаль файл представляет собой последовательность элементов одного типа. Мы будем работать только с файлами последовательного доступа. В таких файлах, чтобы получить доступ к элементу, необходимо последовательно просмотреть все предыдущие.
Объявление файловой переменной в разделе описания переменных имеет вид : var <
имя файла>: File of <тип элементов>;
Например: var Ft : File of integer;
M : File of char;
Type File_integer=File of integer
File_char=File of char;
Var F1: File_integer;
F2: File_char;
Так как в описании указывается тип элементов, такие файлы называются типизированными. Все элементы файла пронумерованы начиная с нуля.
С каждым файлом связан так называемый файловый указатель. Это неявно описанная переменная, которая указывает на некоторый элемент файла.
(0)
(1)
(
к)
(
к+1)
 файловый указатель
PDF created with pdfFactory Pro trial version www.pdffactory.com

78
Все операции производятся с элементом, который определен файловым указателем.
Связь переменной файлового типа с файлом на диске.
Процедура Assign(<имя файловой пер-ой>,’<имяфайла на диске>’);
Например:
Assign(F1,’A:INT.DAT’);
После установления такого соответствия все операции, выполняемые над переменной F1, будут выполнятся над файлом, хранящимся на диске А и имеющим имя INT.DAT
Файл в каждый момент времени может находиться в одном из двух состояний: либо он открыт только для записи, либо только для чтения.
Чтение из файла.
Под чтением из файла понимается пересылка данных из внешнего файла, находящегося на диске, в оперативную память.
Для чтения из файла необходимо открыть для чтения посредством процедуры
Reset(<
имя файловой переменной>);
Собственно чтение данных из файла выполняется процедурой
Read(<
имя файловой переменной>,<имя переменной>);
Переменная должна иметь тот же тип, что и компоненты файла. Отметим, что если оператор ввода имеет вид Read(<имя переменной>), то данные вводятся с клавиатурой, а если Read(<имя файловой переменной>,<имя переменной>); то данные вводятся из файла, хранящегося на диске.
Закрытие файла
После того как данные из файла прочитаны, его необходимо закрыть посредством процедуры
Close(< имя файловой переменной>)
Общая схема чтения данных из файла, таким образом, следующая:
Reset(<
имя файловой переменной>);
PDF created with pdfFactory Pro trial version www.pdffactory.com

79
Read(<
имя файловой переменной>,<имя переменной>);
Close(<
имя файловой переменной>);
Признак конца файла
Так как число элементов файла не известно заранее, необходимо уметь определять, что файл кончился. Для этого используется логическая функция
Eof(<
имя файловой переменной>) (Eof - End Of File). Она принимает истинное значение (Тrue), если достигнут конец файла, и ложное (False) - в противном случае.
Пример Прочитаем из файла целые числа и выведем их на экран:
Assign(F1,’A:INT.DAT’);
Reset(F1);
While Not Eof(F1) do begin read(f1,n); { считываем очередное число из файла} write(n,’ ‘); { выводим его на экран} end;
Close(F1);
Запись в файл
Под записью в файл понимается вывод результатов программы из оперативной памяти ЭВМ в файл на диске.
Для записи в файл необходимо открыть файл для записи посредством процедуры
Rewrite(<
Имя файловой переменной >);
Собственно запись данных в файл выполняется процедурой :
Write(<
имя файловой переменной>,<значение>);
Общая схема записи данных в файл, таким образом, следующая:
Rewrite(<>);
Write(<
имя файловой переменной>,<значение>);
PDF created with pdfFactory Pro trial version www.pdffactory.com

80
Close(<
имя файловой переменной>);
Прямой доступ к элементам файла
Несмотря на то, что в стандартном Паскале имеются лишь файлы последовательного доступа, Турбо Паскаль содержит процедуры и функции для более эффективной работы с файлами. В частности, имеется возможность осуществлять прямой доступ к элементам файла.
Установка указателя.
Процедура
Seek(<
имя файловой переменной>,N) устанавливает файловый указатель на N-й элемент. Например, Seek(F1,3). (на 4 элемент)
Определение номера элемента
Функция
FilePos(<
имя файловой переменной>) возвращает номер элемента, на который «смотрит» файловый указатель.
Определение количества элементов в файле
Функция
FileSize(<
имя файловой переменной>) возвращает количество элементов в файле.
Удаление и переименование файлов
Erase(<
имя файловой переменной
>)
процедура удаления файла.
Rename(<
имя файловой переменной
>,’<
новое имя на диске
>’)
переименование файла.
Пример : В файле DAT1.DAT записаны целые числа. Вычислить сумму элементов файла и результат вместе с исходными данными записать в файл
DAN2.DAT
Program WW;
Var f1,f2 : file of integer; s, n : integer; begin
Assign(f1,’DAT1.DAT’);
Reset(F1);
Assign(f2,’DAT2.DAT’);
Rewrite(f2); s:=0;
While Not Eof(f1) do { проверка на конец файла} begin
PDF created with pdfFactory Pro trial version www.pdffactory.com

81 read(f1,n); {
чтение элемента из файла F1} write(f2,n); { запись элемента в файл F2} s:=s+n; end; write(f2,s); {
запись суммы элементов в конец файла F2} write(‘
Результат находится в файле DAT2.DAT’);
Close(f1);
Close(f2); end.
§21.
Текстовые файлы
Текстовые файлы состоят из символьных строк. Строки могут иметь различную длину, и в конце каждой строки стоит признак конца строки. Для описания текстовых файлов используется служебное слово Text:
Var A: Text;
Для обработки текстовых файлов используются те же процедуры и функции, что и для обработки обычных типизированных файлов. Для связывания файловой переменной с файлом на диске употребляется процедура Assign. Текстовые файлы могут быть открыть для чтения процедурой Reset или для записи процедурой Rewrite.
Для чтения данных применяется процедура Read. Если необходимо после чтения данных перейти на следующую строку, то используется процедура
Readln.
Если необходимо просто перейти к следующей строке, то можно использовать процедуру Readln(<имя файловой переменной текстового файла>); которая устанавливает файловый указатель на первый элемент следующей строки.
1   2   3   4   5   6   7


написать администратору сайта