Введение в программирование на языке Pascal


Введение в программирование на языке Pascal

 

РАБОТА С величина. ВВОДА-ВЫВОДА
Выражениях. ЛИНЕЙНЫЕ АЛГОРИТМЫ

величины

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

Итак, с понятием величины связаны следующие характеристики (атрибуты):

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

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

Тип выражения определяется типами входящих в него величин, а также выполняемыми операциями.В языке Pascal тип величины задают заранее, потому что все переменные, используемые в программе, должны быть объявлены в разделе описания с указанием их типа.

Различают переменные следующих простых типов: целые (Integer, Byte, ShortInt, Word, LongInt), действительны (Real, Comp, Double, Single, Extended), логический (Boolean), символьный (Char), перечисляет, диапазонный.

Вообще, иерархия типов в языке Pascal следующая:

 

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

Описание переменной: имя переменной (идентификатор): тип;

Пример описания:

Var D, C, N: Integer;

LogPer: Boolean;

A, B: Real;

K: Char;

Тип переменной определяет диапазон допустимых значений, принятых величинами этого типа; набор операций, допустимых над данной величиной и объем памяти, отводит под эту переменную.

типы величин

цели типа

integer 2 -32768..32767 +, -, /, *, Div, Mod,> =, <=, =, <> <>
byte 1 0..255 +, -, /, *, Div, Mod,> =, <=, =, <> <>
word 2 0..65535 +, -, /, *, Div, Mod,> =, <=, =, <> <>
shortint 1 -128..127 +, -, /, *, Div, Mod,> =, <=, =, <> <>
longint 4 -2147483648..2147483647 +, -, /, *, Div, Mod,> =, <=, =, <> <>

Действительные типы

real 6 2,910 -39 — 1,710 38 +, -, /, *> =, <=, =, <> <>
single 4 1,510 -45 — 3,410 38 +, -, /, *> =, <=, =, <> <>
double 8 510 -324 — 1,710 308 +, -, /, *> =, <=, =, <> <>
extended 10 3,410 -4932 — 1,110 4932 +, -, /, *> =, <=, =, <> <>

логический тип

Boolean 1 true, false Not, And, Or, Xor,> =, <=, =, <> <>

символьный тип

char 1 все символы кода ASCII +,> =, <=, =, <> <>

Ввод-вывод данных   

Обмен информацией с ЭВМ предполагает использование определенных средств ввода-вывода. В ЭВМ основным средством ввода является клавиатура, вывода — дисплея. Процедура, в режиме диалога с клавиатуры присваивает значение для переменной величины, называется процедурой ввода.

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

Read (список переменных)

Например,

Var

A: Real; B: Integer; C: Char;

Begin

Read (A, B, C)

End.

Читается: «Ввести действительную А, целую В и символьную С».

Как только в программе встречается вызов процедуры Read, ЭВМ прекращает выполнение этой программы и ждет, пока пользователь введет с клавиатуры соответствующие значения, которые по очереди будут присваиваться переменным, перечисленным в списке ввода. Значение данных, вводимых одновременно отображаются на экране дисплея. После нажатия клавиши enter, когда все переменные примут свои значения из входного набора данных, определенного пользователем, выполнение программы продолжается с оператора, следующего за Read.

В списке в ведение значение разделяются между собой пробелом.Присваивание значений из входного потока выполняется слева направо в соответствии с порядком следования переменных в процедуре Read. Процедура ReadLn похожа на Read. Разница лишь в том, что ReadLn реагирует на конец строки, и в случае его обнаружения происходит сразу переход к следующей строке.

Примеры ввода данных с помощью процедуры ReadLn:

ReadLn (A, B, C)

ReadLn (X);

ReadLn (LogPer)

Процедура, выводит содержимое переменных на экран, называется процедурой вывода на экран.

В Pascal эта команда выглядит следующим образом

Write (список констант и / или переменной, разделенной коме)

Например Write ( ‘Исходное значение:’, C).

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

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

Примеры вывода данных:

Write (A, B, C)

WriteLn ( ‘Корнем уравнения является «, X);

WriteLn (LogPer)

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

Процедура заключения с форматом для целого типа имеет вид:

WriteLn (A: N, B: M, C: L)

Здесь N, M, L — выражение целого типа, задающие ширину поля вывода значений.

При заключении вещественных значений оператор Write (R) без указания формата выводит вещественное R в поле шириной 18 символов в форме с плавающей запятой в нормализованном виде. Для десятичного представления значения R применяется оператор с форматами вида WriteLn (R: N: M). В десятичной записи числа R выводится M (0  M  24) знаков после запятой, всего выводится N знаков.

примеры:

WriteLn (N 4)

WriteLn (K: 10: 5, S: 7: 3);

Общая структура программы на Pascal такова:

Program имя программы; {Заголовок}

Const Константа1 = значение; {Объявление констант} {раздел описаний}

Константа2 = значение;

Константа = значение;

Type …; {Объявление типов}

Var Список зминних1 Тип; {Описание переменных}

Список зминних2 Тип;

Список переменных: Тип;

Label Список меток;

Function …

Procedure …

Begin

{Раздел операторов}

End.

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

переменная = выражение;

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

Примеры присваивания:

X = (Y + Z) / (2 + Z * 10) — 1/3;

LogPer = (A> B) And (C <= D);

В Pascal есть операции целочисленного деления и нахождения остатка от деления.При выполнении ц илочисленого деления (операция DIV) остаток от деления отбрасывается.

Например, 15 div 3 = 5; 18 div 5 = 3; 123 div 10 = 12, 7 div 10 = 0.

С помощью операции MOD можно найти остаток от деления одного целого числа на другое.

Например, 15 mod 3 = 0; 18 mod 5 = 3; 123 mod 10 = 3, 7 mod 10 = 7.

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

Порядок действий при вычислении значения выражения:
1) вычисляются значения в скобках;
2) вычисляются значения функций;
3) выполняется унарные операции (унарный минус — изменение знака)
4) выполняются операции умножения и деления (в том числе целочисленного деления и нахождения остатка от деления)
5) выполняются операции сложения и вычитания.

 

Встроенные математические функции языка Pascal

Математическая запись Запись на Pascal Назначение

cos x cos (x) Косинус x радиан

sin x sin (x) Синус x радиан

e x exp (x) Значение e в степени x

[X] trunc (x) Целая часть числа x

| x | abs (x) Модуль числа x

x 2 sqr (x) Квадрат числа x

sqrt (x) Квадратный корень из x

{X} frac (x) Дробная часть x

arctg x arctan (x) Арктангенс числа x

ln x ln (x) Натуральный логарифм x

Pi Число π

Возведение в степень (кроме возведения в квадрат и возведения в степень числа e) отсутствует.Для подъема в произвольный степень можно воспользоваться очевидным равенством: x y = e y ln x.Для преподнесет ения числа в натуральную степень можно написать собственную функцию.Например,

{Функция возведения числа X в натуральную степень N}

Function Stepen (X: Real; N: Integer): Real;

Var I: Integer; St: Real;

Begin

St: = 1;

For I = 1 To N Do St = St * X;

Stepen = St;

End;

Другой способ получить натуральное значение z = x y, где x, y — натуральные, это сделать так: Z = Round (Exp (Y * Ln (X))).

Примечание. Интересной им является задача получения степени любого целого числа (за исключением нуля), если основание степени — неотрицательное целое, без использования развилки.Одно из возможных решений: (-1) * Ord (Odd (Y)) * Exp (Y * Ln (X)) + Ord (Odd (Y + 1)) * Exp (Y * Ln (X)). Здесь Ord (K) — функция, возвращает порядковый номер величины K в том или ином порядковом типе (в примере использовано свойство, порядковый номер False равен 0, а порядковый номер True — 1).

Примеры записи математических выражений:

Математическая запись Запись на Pascal

  1. x 2 — 7 x + 6 Sqr (x) — 7 * x + 6
  2. (Abs (x) — Abs (y)) / (1 + Abs (x * y))
  3. Ln (Abs ((y — Sqrt (Abs (x))) * (x — y / (z + Sqr (x) / 4))))

логические операции

Логический операнд — это конструкция соответствующего языка программирования, задает правило для вычисления одного из двух возможных значений: True или False.

Чаще всего логические выражения используется ют в операторах присваивания или для записи того или иного условия.Составными частями логических вира зев могут быть: логические значения (True, False); логические переменные; отношения.

Например, 1) Y = True; 2) Z = False; 3) LogPer = A> B; 4) Log1 = (A = B) And (C <= D).

Как видно из примеров, отношение — это два выражения, разделенных между собой знаком операции отношения (>, <=, <>, <=,> =).Отношение является простейшей конструкцией логического выражения. Оно вычисляет результат True, если выполняется заданное соотношение, и False — в противном случае.

Примечание. Несмотря на то, что операции отношения =, <>> =, <= определены для вещественных типов, реально они в большинстве случаев корректно не работают в силу того, что множество действительных величин, представляемых в памяти ЭВМ, дискретно.Поэтому их надо, если это возможно, избегать. В том случае, когда все-таки для настоящих возникает необходимость вычисления указанных отношений, разумно проверять действительные величины не в равенство, а на близость расположения друг к другу, то есть заменять отношение вида A = B отношениями вида | AB | <E, где E — достаточно малое по абсолютной величине число (в общем случае — так называемое машинное ипсилон).

В языке Pascal операции отношения определены для величин любого порядкового типа (целые, символьный, логический, перечислимый, диапазон).Операции отно шение могут быть выполнены также над срочным выражениями.Сравнение двух строк выполняется посимвольно слева направо в соответствии с их лексикографической упорядоченности в таблице кодов ASCII. Эта упорядоченность предполагает, что «1» < «2», «a» < «b», «B» < «C» и т.д. Как только в процессе попарных сравнений символов с одинаковой порядковой позицией оказывается больше по коду ASCII символ, данный процесс прекращается, и считается, что строка с этим символом соответственно больше другой строки. Если строки и имеют разную длину и их символы совпадают до последнего знака, то считается, что более короткая строка меньше.

Логическое выражение — это логический операнд или последовательность логических операндов, разделенных между собой знаками логических операций (NOT, AND, OR, XOR).

Порядок действий при вычислении значения логического выражения:
1) вычисляются значения в скобках;
2) вычисляются значения функций;
3) выполняется унарные операции (операция NOT)
4) выполняется операция AND;
5) выполняются операции OR, XOR;
6) выполняются операции отношений.

Действия выполняются слева направо с учетом их старшинства. Желаемая последовательность операций обеспечивается путем размещения скобок в соответствующих местах вира за.

При реализации некоторых программ удобно использовать функции, которые имеют логическое значение. Обычно они используются для того, чтобы на некоторое вопрос получить ответ «ДА» или «НЕТ».

Например, следующая функция возвращает True, если ее аргумент — простое число, и False — в противном случае:

Function Simple (Pr: Integer): Boolean;

Var I: Integer; LogPer: Boolean;

Begin I = 2; {Счетчик}

Repeat

LogPer = (Pr Mod I = 0); {Логическая переменная, принимающая значение TRUE, если число Pr составное}

I = I + 1

Until (I> Pr Div 2 + 1) Or (LogPer)

{Цикл завершаем в том случае, когда счетчик становится больше половины данного числа или обнаруживаем, что число составное}

Simple = Not LogPer

{Значение функции равно TRUE, если число простое, и FALSE — в противном случае}

End;

Рассмотрим примеры задач, где алгоритм решения является линейным.

Задание 1. Скорость первого автомобиля v 1 км / ч, второго — v 2 км / ч, расстояние между ними s км.Какое расстояние будет между ними через t ч, если автомобили движутся в разные стороны?

Согласно условию задачи искомое расстояние s 1 = s + (v 1 + v 2) t (если автомобили изначально двигались в противоположные стороны) или s 2 = | (v 1 + v 2) ts | (если автомобили изначально двигались навстречу друг другу).

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

Program Car;

Var V1, V2, T, S, S1, S2: Real;

Begin

Write ( ‘Введите скорости автомобилей, расстояние между ними и время движения:’);

ReadLn (V1, V2, S, T);

S1 = S + (V1 + V2) * T;

S2 = Abs ((V1 + V2) * T — S);

WriteLn ( ‘Расстояние будет равна’, S1: 7: 4, «км или», S2: 7: 4, «км»)

End.

Заметим, что идентификатор должен начинаться с латинской буквы, кроме латинских букв может содержать цифры, знак подчеркивания (_).

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

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

Задача 2. Записать логичным й выражение, принимающее значение TRUE, если точка лежит внутри заштрихованной области, иначе — FALSE.

Прежде всего обращаем внимание на то, что эту сложную фигуру целесообразно разбить на несколько более простых: треугольник, лежащий в I и IV координатных четвертях и треугольник, лежащий во II и III четвертях.Таким образом, точка может попасть внутрь одной из этих фигур, или на линию, их ограничивающую. Количество видно шень, описывающих некоторую область, обычно совпадает с количеством линий, эту область ограничивающих.Чтобы точка попала внутрь области, необходима истинность каждого из видно шень, поэтому над ними выполняется операция AND. Так вся область была разбита на части, поэтому между отношениями, описывающих каждую из них, используется операция OR.

Учитывая приведенные здесь рассуждения и записав уравнения всех ограничивающих фигуру линий, получаем искомый логическое выражение:

(X> = 0) And (Y> = 1.5 * X — 1) And (Y <= X) OR (X <= 0) And (Y> = -1.5 * X — 1) And (Y <= -X )

Задача 3. Вычислить значение вира зу

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

Program Expression;

Var X, Z: Real;

Begin

Write ( ‘Введите значение переменной X:’); ReadLn (X);

Z = 6 * ln (sqrt (exp (x + 1) + 2 * exp (x) * cos (x))) /

ln (x — exp (x + 3) * sin (x)) + abs (cos (x) / xp (sin (x)))

WriteLn ( ‘Значение выражения:’, Z: 12: 6)

End.

Условный оператор
Полной и неполной развилка
ОПЕРАТОР ВЫБОРА

оператор IF

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

IF <логическое выражение> THEN серия1 ELSE серия2;

Если логическое выражение, выступает как условие, принимает значение False, то выполняются операторы, расположенные после else (серия2), если True, — операторы, следующие за then.При записи в логического выражения следует избегать знака = (равно) для действительных переменных, так как они представляются неточно, а потому может не состояться совпадений значений выражений, стоящих слева и справа от знака равенства.Для устранения указанного недостатка стоит требовать выполнения условия с заданной точностью, то есть вместо отношения X = Y рекомендуется, например,

Abs (X — Y) <1E-8.

Поскольку развилка может быть неполной, то возможна и неполная форма записи условного оператора:

IF <логическое выражение> THEN серия;

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

Задание 1. Даны действительные числа x, y.Если x и y отрицательные, то каждое значение заменить модулем; если отрицательное только одно из них, то оба значения увеличить на 0,5; если оба значения положительные и ни одно из них не принадлежит отрезку [0,5; 2,0], то оба значения уменьшить в 10 раз в других случаях x и y оставить без изменения.

Разработаем алгоритм решения задачи, после чего напишем программу.

Алгоритм запишем словесно:

1) ввести значение x, y;

2) если x <0 и y <0, найти их модули и перейти к п. 5, иначе перейти к следующему пункту;

3) если x <0 или y <0, увеличить каждую величину на 0,5 и перейти к п. 5,

иначе перейти к следующему пункту;

4) если нет x, ни y не принадлежат отрезке [0,5; 2,0], уменьшить их в 10 раз

5) вывести значения x и y;

6) конец.

 

Program Usl;

Var X, Y: Real;

Begin

Write ( ‘Введите два действительных числа’); ReadLn (X, Y)

If (X <0) AND (Y <0) THEN

Begin

X = ABS (X);

Y = ABS (Y)

End

ELSE

IF (X <0) OR (Y <0) THEN

Begin

X = X + 0.5;

Y = Y + 0.5

End

ELSE

IF NOT (((X> = 0.5) AND (X <= 2))

OR ((Y> = 0.5) AND (Y <= 2)))

THEN

Begin

X = X / 10,

Y = Y / 10

End;

WriteLn ( ‘Результат:’); WriteLn ( ‘X =’, X: 10: 6) WriteLn ( ‘Y =’, Y: 10: 6)

END.

Задача 2. Дано действительное число a.Вычислить f (a), если

 

Program Usl1;

Var A, F: Real;

Begin

WriteLn ( ‘Введите действительное число:’); ReadLn (A);

IF A <= 0 THEN

F = 0

ELSE

IF A <= 1 THEN

F = Sqr (A) — A

ELSE

F = Sqr (A) — SIN (Pi * Sqr (A))

WriteLn ( ‘Значение функции F (x) при x =’, A: 10: 6, ‘равно’, F: 10: 6)

END.

оператор CASE

Кроме условного оператора как управляющая структура достаточно часто используется оператор выбора CASE. Эта структура позволяет переходить на одну из отраслей в зависимости от значения заданного выражения (селектора выбора).Ее особенность заключается в том, что выбор решения здесь осуществляется независимо от истинности или ложности условия, а есть вычислительным.Оператор выбора позволяет заменить оператор и развилки (в силу этого его еще называют оператором множественного ветвления).

В конструкции CASE вычисляется выражение K и выбирается отрасль, значение метки которой совпадает со значением K. После выполнения выбранной области происходит выход из конструкции CASE. Если в последовательности форуме метки со значением, равным K, то управление передается внешнему оператору, следующего за конструкцией CASE (в случае отсутствия альтернативы ELSE; если она есть, то выполняется следующий за ней оператор, а уже потом управление передается внешнему оператору).

Запись оператора выбора

CASE K OF

A1: серия 1;

A2: серия 2;

AN: серия N

ELSE серия N + 1

END;

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

Выражение K здесь может быть любого порядкового типа (напомним, что к таким типам относятся все целые типы, Boolean, Char, перечислимый тип, диапазонный тип, основанный на каждом из указанных выше типов).

Задание 1. В старояпонском календаре был принят двенадцатилетний цикл.Годы внутри цикла носили названия животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, петуха, собаки и свиньи. Написать программу, позволяющую ввести номер года и печатает его название по старояпонском календарю.Справка: в 1996 г.. — год крысы — начало очередного цикла.

Поскольку цикл является двенадцатилетним, поставим название года в соответствие остатка от деления номера этого года на 12.

Program Goroskop;

Var Year: Integer;

Begin

Write ( ‘Введите год’); ReadLn (Year)

CASE Year MOD 12 OF

0: WriteLn ( ‘Год Обезьяны’);

1: WriteLn ( ‘Год Петуха’);

2: WriteLn ( ‘Год Собаки’);

3: WriteLn ( ‘Год Свиньи’);

4: WriteLn ( ‘Год Крысы’);

5: WriteLn ( ‘Год Коровы’);

6: WriteLn ( ‘Год Тигра’);

7: WriteLn ( ‘Год Зайца’);

8: WriteLn ( ‘Год Дракона’);

9: WriteLn ( ‘Год Змеи’);

10: WriteLn ( ‘Год Лошади’);

11: WriteLn ( ‘Год Овцы’)

END;

END.

Задача 2. Найти наибольшее из двух действительных чисел, используя оператор выбора.

Program Maximum;

Var Max, X, Y: Real;

Begin

Write ( ‘Введите два неравных числа:’);

ReadLn (X, Y)

Case X> Y Of

TRUE: Max = X;

FALSE: Max = Y

End;

WriteLn ( ‘Максимальное из двух является «, Max: 12: 6)

End.

Задача 3. Превратить символ, если он строчной русской буквой, в заглавную букву.

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

Program UpCase;

Var C: Char;

Begin

Write ( ‘Введите символ:’);

ReadLn (C)

Case C Of

‘А’ .. ‘п’: C = Chr (Ord (C) — 32)

«Р ‘..’ я ‘: C = Chr (Ord (C) — 80)

End;

WriteLn (C)

End.

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

 

ОПЕРАТОРЫ ЦИКЛА
ЗАДАЧИ целочисленных АРИФМЕТИКИ

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

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

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

Различают циклы с известным числом повторений (цикл с параметром) и итерационные (с пред- и постусловием).

Цикл с параметром (FOR)

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

Если в цикле изменяется простая переменная, то она является параметром цикла; если в цикле изменяется переменная с индексом, то индекс этой переменной является параметром цикла.

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

Структура цикла, организованного с помощью этого оператора, имеет вид:

For I = A To B Do Begin <операторы> End;

или

For I = A DownTo B Do Begin <операторы> End;

Здесь I — параметр, меняется в цикле; A, B — выражение порядкового типа, обозначающие начальное, конечное значение параметра цикла.Шаг изменения номера параметра цикла равен 1, если в заголовке цикла стоит To (т.е. реально следующее значение параметра цикла вычисляется с помощью функции succ) и 1 — при DownTo (вычисления производится с помощью функции pred).

Читать  Язык программирования - Pascal Информатика для учеников 8 классов

Порядок выполнения цикла с шагом 1 следующий: вычисляются значения начального и конечного значений параметра цикла; параметр если I принимает начальное значение; если I меньше или равно конечному значению, выполняется тело цикла; значение параметра цикла увеличивается, т.е. I = succ (I) проверяется условие I <= B (для отрицательного шага условие I> = B) и при его выполнении цикл повторяется.Выход из цикла осуществляется, если I> B (I <B для H = 1), и выполняется оператор, следующий за оператором цикла.Если A> B (или A <B для H = 1), то цикл не выполняется ни разу.

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

Задание 1. Дано натуральное n, действительное x.вычислить

Разработаем алгоритм решения задачи:

1) ввести данные — количество составляющих n и число x;

2) присвоить переменной, в которой будем хранить степени sin x, значение 1; S: = 0;

3) присвоить параметру цикла значение 1;

4) если значение параметра цикла меньше n, перейти к следующему пункту, иначе к п. 9;

5) вычислить очередной степень sin x;

6) добавить вычисленное значение к сумме;

7) увеличить параметр цикла на 1;

8) перейти к п.4;

9) вывести на печать сумму S;

10) конец.

{Программа вычисления суммы степеней sin x}

Program Summa;

Var S, X, Pr: Real; N, I: Integer;

Begin

Write ( ‘Введите число составляющих и x:’); ReadLn (N, X);

Pr = 1; {В этой переменной хранятся последовательные степени sin x}

S: = 0;

For I = 1 To N Do

Begin

Pr = Pr * Sin (X); {Очередной степень Sin (x)}

S = S + Pr

End;

WriteLn ( ‘Сумма равна’, S: 7: 4)

End.

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

Примечание. Как видно из рассказа, приведенного выше, область применения цикла с параметром в языке Pascal значительно ограничена и ограничения связаны с шагом изменения параметра цикла, с типом параметра цикла, его начального и конечного значения.В некоторых языках, например, в Basic, таких ограничений не существует.

По сравнению с циклом с параметром итерационные циклы являются универсальными. Для организации итерационных циклов используются операторы цикла с п ередумовою while и цикла с постусловием repeat..until.

Циклы WHILE, REPEAT

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

Соответствующие структуры циклов:

while B Do Begin <операторы> End;

 

Repeat <операторы> Until C;

Здесь B, C — логические выражения.

Для оператора цикла с предусловием проверяется значение логического выражения, если оно имеет значение True, то операторы, входящие в цикл, выполняются, в противном случае осуществляется выполнение оператора, следующего за циклом.

Цикл с постусловием выполняется хотя бы один раз.Затем проверяется значение логического выражения, если оно False, т и операторы, входящие в цикл, выполняются, в противном случае осуществляется выход из цикла.

Входить в цикл можно только через его начало, то есть нельзя входить внутрь цикла с помощью управляющего оператора, так как в этом случае параметр цикла не определен.

Задача 2. Найти наименьший номер члена последовательности, для которого выполняется условие | a na n -1 | <e, где a n = arctg a n -1 +1, a 1 = 0.Вывести на экран этот номер и все элементы a i (i = 1, 2, …, n).

Поскольку по ходу решения задачи необходимо знать a n и a n -1, будем запоминать их соответственно в переменных ANew и AOld.

Program Posled;

Var Eps, AOld, ANew: Real; N: Integer;

Begin

Write ( ‘Введите число Epsilon’); ReadLn (Eps)

AOld: = 0; ANew = ArcTan (AOld) + 1;

N = 2;

WriteLn (AOld: 8: 5); WriteLn (ANew: 8: 5);

While Abs (ANew — AOld)> = Eps Do

Begin

AOld = ANew;

ANew = ArcTan (AOld) + 1;

WriteLn (ANew: 8: 5);

N = N + 1

End;

WriteLn ( ‘Искомый номер «, N)

End.

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

Задача 3. На интервале [2; n] найти натуральное число с максимальной суммой делителей.

Предлагаемое задача может быть отнесена к классу «задачи целочисленной арифметики», где аргументы, результаты и промежуточные величины относятся к целому типу.Стоит заметить, что в такого рода задачах довольно часто используются операции DIV и MOD; наиболее типичной п идзадачею является определение количества цифр в записи числа.

Алгоритм решения задачи:

1) ввести число n;

2) переменной для хранения максимальной суммы делителей присвоить

значение 1 (это сумма делителей числа 1);

3) запомнить число с максимальной суммой делителей;

4) параметра цикла I присвоить значение 2;

5) если I больше n, перейти к п. 13, иначе — к следующему пункту;

6) переменной для хранения очередной суммы делителей присвоить значение 0;

7) параметра цикла K присвоить значение 1;

8) если K больше I / 2, перейти к п. 11, иначе — к следующему пункту;

9) если I делится на K без остатка, добавить K к текущей суммы делителей;

10) увеличить K на 1 и перейти к п. 8;

11) сравнить текущую сумму делителей с максимальной, если максимальная меньше,

запомнить новое значение и число, соответствующее этой сумме;

12) увеличить I на 1 и перейти к п. 5,

13) вывести число с максимальной суммой делителей и эту сумму;

14) конец.

Program Sum_Del;

Var N, I, Sum_Max, Sum, K, Ch: Integer;

Begin

Write ( ‘Введите число N:’); ReadLn (N)

Sum_Max: = 1; {Максимальная сумма делителей}

Ch: = 1; {Число с максимальной суммой делителей}

For I = 2 To N Do {Это цикл по количеству чисел}

Begin

Sum: = 0;

For K = 1 To I Div 2 + 1 Do {В этом цикле находим сумму делителей}

If I Mod K = 0 Then {Если I нацело делится на K, то K — делитель I}

Sum = Sum + K;

Sum = Sum + I;

If Sum> Sum_Max Then Begin Sum_Max = Sum; Ch = I End;

End;

WriteLn ( ‘Максимальную сумму делителей’, Sum_Max, «имеет число ‘, Ch)

End.

Задача 4. Дано натуральное число n.Получить все простые делители этого числа.

{Программа отыскания простых делителей данного числа}

Program Pr_Del;

Var N, I, Vsp: Integer;

Log_Per, Priznak: Boolean;

Begin

Write ( ‘Введите натуральное число:’);

ReadLn (N)

Priznak = True; {Признак того, не является ли введенное число простым}

{Пока параметр цикла не превысил квадратного корня из данного числа,

продолжаем поиск простых делителей}

For I = 2 To Round (Sqrt (N)) Do

If N Mod I = 0 Then

Begin

Priznak = False; {Введенное число не является простым}

Log_Per = False; {Логическое переменное, принимающий значение True,

если нашлись делители I, отличные от 1 и I}

Vsp: = 2;

Repeat

If (I Mod Vsp = 0) And (I <> Vsp) Then Log_Per = True;

Vsp = Vsp + 1

Until (Vsp> I Div 2 + 1) Or Log_Per;

If Not (Log_Per) Then WriteLn (I) {Если число I простой, печатаем его}

End;

If Priznak Then WriteLn (N)

End.

Одномерные и двумерные МАССИВЫ (ТАБЛИЦЫ)

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

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

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

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

Пример: числовая последовательность четных натуральных чисел 2, 4, 6, …, N представляет собой линейный массив, элементы которого можно обозначить А [1] = 2, а [2] = 4, А [3] = 6 .. ., а [К] = 2 * (К + 1), где К — номер элемента, а 2, 4, 6, …, N — значение.Индекс (порядковый номер элемента) записывается в квадратных скобках после имени массива.

Например, A [7] — седьмой элемент массива А; D [6] — шестой элемент массива D.

Для размещения массива в памяти ЭВМ отводится поле памяти, размер которого определяется типом, длиной и количеством компонент массива. В языке Pascal эта информация задается в разделе описаний. Массив описывается так:

имя массива: Array [начальное значение индексу..кинцеве значение индекса] Of базовый тип;

Например,

Var B: Array [1..5] Of Real, R: Array [1..34] Of Char;

— описывается массив В, состоящий из 5 элементов и символьный массив R, состоящий из 34 элементов.Для массива В будет выделен 5 * 6 = 30 байт памяти, для массива R — 1 * 34 = 34 байта памяти.

Базовый тип элементов массива может быть любым, за исключением файлового.

Заполнить массив можно следующим образом:

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

Задание 1. Заполнить одномерный массив элементами, отвечающими следующему соотношению:

a 1 = 1; a 2 = 1; a i = a i -2 + a i 1 (i = 3, 4, …, n).

Read (N) {Ввод количества элементов}

A [1]: = 1;

A [2]: = 1;

FOR I = 3 TO N DO

A [I] = A [I — 1] + A [I — 2];

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

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

Program Create;

Type Mas = Array [1..100] Of Integer;

Var A: Mas; I, J, N: Byte; Log: Boolean;

Begin

Write ( »); ReadLn (N)

randomize; A [1] = -32768 + random (65535)

For I = 2 To N Do

Begin

Log = True;

Repeat

A [i]: = -32768 + random (65535) J: = 1;

While Log and (j <= i — 1) Do

begin Log = a [i] <> a [j]; j = j + 1 End

Until Log

End;

For i: = 1 to N Do Write (a [i]: 7); writeln

End.

2) ввод значений элементов массива с клавиатуры используется обычно тогда, когда между элементами не наблюдается никакой зависимости.Например, последовательность чисел 1, 2, 5, 6, -111, 0 может быть введена в память следующим образом:

Program Vvod;

Var N, I: Integer;

A: Array [1..20] Of Integer;

Begin

Write ( ‘Введите количество элементов массива’); ReadLn (N)

FOR I = 1 TO N DO

Begin

Write ( ‘Введите A [‘, I, ‘]’); ReadLn (A [I])

End.

Над элементами массивами чаще всего выполняются такие действия, как

а) поиск значений;

б) сортировка элементов в порядке возрастания или убывания;

в) подсчет элементов в массиве, удовлетворяющих заданному условию.

Cуму элементов массива можно подсчитать по формуле S = S + A [I] первоначально задав S = 0.Количество элементов массива можно подсчитать по формуле К = К + 1, первоначально задав К = 0.Произведение элементов массива можно подсчитать по формуле P = P * A [I], первоначально задав P = 1.

Задача 3. Дано линейный массив целых чисел. Подсчитать, сколько в нем различных чисел.

{Подсчет количества различных чисел в линейном массиве.

ИДЕЯ РЕШЕНИЕ: заводим вспомогательный массив, элементами

которого являются логические величины (False — если элемент

уже встречался ранее, True — иначе)}

Program Razlichnye_Elementy;

Var I, N, K, Kol: Integer;

A: Array [1..50] Of Integer;

Lo: Array [1..50] Of Boolean;

Begin

Write ( ‘Введите количество элементов массива:’); ReadLn (N)

FOR I = 1 TO N DO

Begin

Write ( ‘A [‘, I, ‘] =’); ReadLn (A [I])

Lo [I] = True; {Заполняем вспомогательный массив значениями True}

End;

Kol = 0; {Переменная, в которой будет храниться количество различных чисел}

FOR I = 1 TO N DO

IF Lo [I] THEN

Begin

Kol = Kol + 1;

FOR K = I TO N DO

{В вспомогательный массив заносим значение False,

если число уже встречалось ранее или совпадает с текущим элементом A [I]}

Lo [K] = (A [K] <> A [I]) And Lo [K];

End;

WriteLn ( ‘Количество различных цифр:’, Kol)

END.

тест: N = 10; элементы массива — 1, 2, 2, 2, 1, 1, 0, 34, 3, 3.Ответ: 6.

Задача 4. Дано линейный массив. Упорядочить его элементы в порядке возрастания.

{Сортировка массива выбором (в порядке возрастания).

Идея решения: пусть часть массива (по K-й элемент включительно)

отсортирована. Нужно найти в не самом отсортированной части массива

минимальный элемент и поменять местами с (K + 1) -м}

Program Sortirovka;

Var N, I, J, K, Pr: Integer; A: Array [1..30] Of Integer;

Begin

Write ( ‘Введите количество элементов:’); ReadLn (N)

For I = 1 To N Do

Begin

Write ( ‘Введите A [‘, I, ‘]’); Readln (A [I])

End;

WriteLn;

For I = 1 To N — 1 Do

Begin

K = I;

For J = I + 1 To N Do If A [J] <= A [K] Then K = J;

Pr = A [I]; A [I] = A [K]; A [K] = Pr;

End;

For I = 1 To N Do Write (A [I], »);

End.

тест: N = 10; элементы массива — 1, 2, 2, 2, 1, 1, 0, 34, 3, 3.

Ответ: 1, -1, 0, 1, 2, 2, 2, 3, 3, 34.

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

Type Massiv = Array [1..10] Of Real;

Var A, B: Massiv; C, D: Array [1..10] Of Real; E: Array [1..10] Of Real;

типы переменных A, B эквивалентны, и поэтому данные переменные совместимы по присваиванию; тип переменных C, D также тот же, и поэтому данные переменные также совместимы по присваиванию.Но тип переменных C, D не эквивалентен типам переменных A, B, E, поэтому, например, A и D не совместимы по присваиванию.Эти особенности необходимо учитывать при работе с массивами.

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

Например, данные о планетах Солнечной системы представлены следующей таблицей:

Планета Расст. к Солнцу Отн. Объем Отн. масса
Меркурий 57.9 0.06 0.05
Венера 108.2 0.92 0.81
земля 149.6 1.00 1.00
Марс 227.9 0.15 0.11
Юпитер 978.3 1345.00 318.40
Сатурн 1429.3 767.00 95.20

Их можно занести в память компьютера, используя понятие двумерного массива. Положение элемента в массиве определяется двумя индексами. Они показывают номер строки и номер столбца. Индексы разделяются ком й.Например: A [7, 6], D [56, 47].

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

Program Vvod2;

Var I, J: Integer;

A: Array [1..20, 1..20] Of Integer;

Begin

FOR I = 1 TO 3 DO

FOR J = 1 TO 2 DO A [I, J] = 456 + I

End.

элементы массива примут значения A [1, 1] = 457; A [1, 2] = 457; A [2, 1] = 458; A [2, 2] = 458; A [3, 1] = 459; A [3, 2] = 459.

При описании массива задается требуемый объем памяти под двумерный массив, указываются имя массива и в квадратных скобках диапазоны изменения индексов.

При выполнении инженерных и математических расчетов часто используются переменные более чем с двумя индексами. При решении задач на ЭВМ такие переменные представляются как компоненты соответственно мае и-, чотиримирних массивов и т.д.

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

Задача 5. Заполнить матрицу порядка n по следующему образцу:

1 2 3 n-2 n-1 n
2 1 2 n-3 n-2 n-1
3 2 1 n-4 n-3 n-2
n-1 n-2 n-3 2 1 2
n n-1 n-2 3 2 1

Program Massiv12;

Var I, J, K, N: Integer; A: Array [1..10, 1..10] Of Integer;

Begin

Write ( ‘Введите порядок матрицы:’); ReadLn (N)

For I = 1 To N Do

For J = I To N Do

Begin

A [I, J] = J — I + 1; A [J, I] = A [I, J];

End;

For I = 1 To N Do

Begin

WriteLn;

For J = 1 To N Do Write (A [I, J]: 4);

End

End.

Задача 6. Данная целочисленных квадратная матрица.Найти в каждой строке наибольший элемент и поменять его местами с элементом главной диагонали.

Program Obmen;

Var N, I, J, Max, Ind, Vsp: Integer; A: Array [1..15, 1..15] Of Integer;

Begin

WRITE ( ‘Введите количество элементов в массиве:’); READLN (N)

FOR I = 1 TO N DO

FOR J = 1 TO N DO

Begin

WRITE ( ‘A [‘, I, ‘,’, J, ‘]’); READLN (A [I, J])

End;

FOR I = 1 TO N DO

Begin

Max = A [I, 1]; Ind: = 1;

FOR J = 2 TO N DO

IF A [I, J]> Max THEN

Begin

Max = A [I, J]; Ind = J

End;

Vsp = A [I, I]; A [I, I] = A [I, Ind]; A [I, Ind] = Vsp

End;

FOR I = 1 TO N DO

Begin

WriteLn;

FOR J = 1 TO N Do Write (A [I, J]: 3);

End; WriteLn

End.

 

подпрограмм

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

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

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

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

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

При работе с подпрограммами важны понятия формальных и фактических параметров.Формальные параметры — это идентификаторы входных данных для подпрограммы.Если формальные параметры получают конкретные значения, то они называются фактическими.Формальные параметры могут получить конкретные значения только в той программе, где производится обращение к данному модулю-подпрограмме. Тип и порядок записи фактических параметров должны быть такими же, как и формальных параметров.В противном случае результат работы программы будет непредсказуемым. Из этого следует, что фактические параметры используются при обращении к подпрограмме с основной, а формальные параметры — только в самом модуле.

процедуры

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

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

1) каждая подпрограмма имеет свое имя и список формальных параметров;

2) процедура из основной программы вызывается командой вызова, по форме ничем не отличается от вызова команды исполнителя. Результат присваивается одной или нескольким переменным, которые находятся в списке формальных параметров. Но результатом могут быть, конечно, не только значения переменных, но какое либо действие, выполненное ЭВМ.

Пример 1. Используем алгоритм нахождения наибольшего общего делителя двух натуральных чисел в качестве вспомогательного при решении задачи: составить программу вычитания дробей (a, b, c, d — натуральные числа).Результат представить в виде обычного несократимой дроби.

Подпрограмма.

1) Ввести натуральные числа M, N.

2) Если M = N, перейти к п. 5, иначе к следующему пункту.

3) Если M> N, то M = MN, иначе N = NM.

4) На п. 2.

5) Передать значение M в основную программу.

6) Конец подпрограммы.

Основная программа.

1) Ввести значения A, B, C, D.

2) E = A * D — B * C.

3) F = B * D.

4) Если E = 0, вывести значение E и перейти к п. 9, иначе перейти к следующему пункту.

5) M = | E |, N = F, перейти к подпрограмме вычисления НОД.

6) G = M.

7) E и F нацело разделить на G.

8) Вывести значения E и F на печать.

9) Конец программы.

Program Sub;

Var A, B, C, D, G, E, F: Integer;

Procedure Nod (M, N: Integer; Var K: Integer);

Begin

While M <> N Do

If M> N Then M = M — N Else N = N — M;

K = M

End;

Begin

Write ( ‘Введите числительные и знаменатели дробей:’);

ReadLn (A, B, C, D);

E = A * D — B * C;

F = B * D;

If E = 0 Then WriteLn (E)

Else

Begin

Nod (Abs (E), F, G)

E = E Div G;

F = F Div G;

WriteLn ( ‘Ответ:’, E, ‘/’, F)

End

End.

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

Вызов процедуры осуществляется следующим образом:

<Идентификатор (имя) процедуры> (<список фактических параметров>);

Например,

Nod (Abs (E), F, G)

По способу передачи фактических значений в подпрограмму в Turbo Pascal 7.0 выделяют параметра переменной, параметра значения, параметра константы и массивы открытого типа, строки открытого типа, параметра процедуры, параметров-функции.

функции

Функция (в отличие от процедуры) всегда возвращает единственное значение.

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

Function Nod (M, N: Integer): Integer;

Begin

While M <> N Do

If M> N Then M = M — N Else N = N — M;

Nod = M

End;

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

Вызов функции будет следующим:

G = Nod (Abs (E), F);

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

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

Пример 2. Дано натуральное число n.Переставить местами первую и последнюю цифры этого числа.

Program Integ;

Var N: Integer;

Begin

Write ( ‘Введите натуральное число:’);

ReadLn (N)

If Impossible (N)

Then WriteLn ( ‘Невозможно переставить цифры, возникнет переполнение’)

Else Begin

Change (N)

WriteLn ( ‘Ответ:’, N)

End;

End.

Можно заметить, что необходимо детализировать логическую функцию Impossible, что диагностирует, возможна ли перестановка, и процедуру Change, что эту перестановку (в случае, если она возможна) выполняет.

Function Impossible (N: Integer): Boolean;

Begin

If Number (N) <5

Then Impossible = False

Else Impossible = (N Mod 10> 3) Or

(N Mod 10 = 3) And

(N Mod 10000 Div 10 * 10 + N Div 10000> MaxInt Mod 10000)

End;

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

Читать  СВОБОДНАЯ кроссплатформенное СИСТЕМА визуального программирования LAZARUS

Function Number (N: Integer): Integer;

Var Vsp: Integer;

Begin

Vsp: = 0;

While N> 0 Do

Begin

Vsp = Vsp + 1; N = N Div 10

End;

Number = Vsp

End;

Наконец, последняя процедура.

Procedure Change (Var N: Integer);

Var Kol, P, S, R: Integer;

Begin

Kol = Number (N);

P = N Mod 10, {Последняя цифра}

If Kol> 1 Then

S = N Div Round (Exp ((Kol — 1) * Ln (10)))

Else S = 0; {Первая цифра}

R = N Mod Round (Exp ((Kol — 1) * Ln (10))) Div 10;

N = P * Round (Exp ((Kol — 1) * Ln (10))) + R * 10 + S

End;

Возможны также подпрограммы, которые вызывают сами себя. Они называются рекурсивными.Создание таких подпрограмм является хорошим приемом программирования, но не всегда целесообразно из-за чрезмерной расход памяти ЭВМ.

Пример 3. Найти максимальную цифру в записи данного натурального числа.

Program MaxDigit;

Type NaturLong = 1 .. (High (LongInt))

Digit = 0..9;

Var A: LongInt;

Function Maximum (N: LongInt): Digit;

Begin

If N <10

Then Maximum = N

Else If N Mod 10> Maximum (N Div 10)

Then Maximum = N mod 10

Else Maximum = Maximum (N Div 10)

End;

Begin

Write ( ‘Введите натуральное число:’);

ReadLn (A);

WriteLn ( ‘Максимальная цифра равна’, Maximum (A))

End.

При создании функции Maximum было использовано следующее соображение: если число состоит из одной цифры, то она максимальной, иначе если последняя цифра не является максимальной, то ее следует искать среди других цифр числа.При написании рекурсивного алгоритма следует позаботиться о граничное условие, когда цепочка рекурсивных вызовов обрывается и начинается ее обратное «раскрутки». В нашем примере это условие N <10.

Более подробно о рекурсии говорится в следующей статье .

рекурсия

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

Например, следующее определение двоичного кода является рекурсивным:

<Двоичный код> :: = <двоичная цифра> | <Двоичный код> <двоичная цифра>

<Двоичная цифра> :: = 0 | 1

Здесь для описания понятия были использованы, так называемые, металингвистический формулы Бекуса-Наура (речь БНФ) знак «:: =» обозначает «по определению есть», знак «|» — «или».

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

Приведем другие примеры рекурсивных определений.

Пример 1. Классический пример, без которого не обходятся ни в одной рассказы о рекурсии, — определение факториала. С одной стороны, факториал определяется так: n!= 1 * 2 * 3 * … * n.С другой стороны, Граничным условием в этом случае является n <= 1.

Пример 2. Определим функцию K (n), которая возвращает количество цифр в заданном натуральном числе n:

Задания. По аналогии определите функцию S (n), что вычисляет сумму цифр заданного натурального числа.

Пример 3. Функция C (m, n), где 0 <= m <= n, для вычисления биномиального коэффициента по следующей формуле является рекурсивной.

Ниже будут приведены программные реализации всех этих (и не только) примеров.

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

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

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

Begin Begin Begin

P; операторы; операторы;

операторы; P P;

End; End; операторы

End;

 

рекурсивный подъем рекурсивный спуск и рекурсивный спуск, и рекурсивный подъем

 

Здесь P — рекурсивная подпрограмма.Как видно из рисунка, действия могут выполняться либо на одном из этапов рекурсивного обращения, либо на обоих сразу. Способ организации действий диктуется логикой разрабатываемого алгоритма.

Реализуем приведенные выше рекурсивные определения в виде функций и процедур на языке Pascal и в виде функций на языке C.

Пример 1.

{Функция на Pascal}

Function Factorial (N: integer): Extended;

Begin

If N <= 1

Then Factorial = 1

Else Factorial = Factorial (N-1) * N

End;

{Процедура на Pascal}

Procedure Factorial (N: integer; Var F: Extended)

Begin

If N <= 1

Then F = 1

Else Begin Factorial (N-1, F); F = F * N End

End;

Пример 2.

{Функция на Pascal}

Function K (N: Longint): Byte;

Begin

If N <10

Then K = 1

Else K = K (N div 10) +1

End;

{Процедура на Pascal}

Procedure K (N: Longint; Var Kol: Byte)

Begin

If N <10

Then Kol = 1

Else Begin K (N Div 10 Kol) Kol = Kol + 1 End;

End;

Пример 3.

{Функция на Pascal}

function C (m, n: Byte): Longint;

Begin

 

If (m = 0) or (m = n)

Then C = 1

Else C = C (m, n-1) + C (m-1, n-1)

End;

{Процедура на Pascal}

Procedure C (m, n: Byte; Var R: Longint)

Var R1, R2: Longint;

Begin

If (m = 0) or (m = n)

Then R = 1

Else Begin

C (m, n-1, R1)

C (m-1, n-1, R2)

R = R1 + R2

End;

End;

Пример 4. Вычислить сумму элементов линейного массива.

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

— 1 —

Введение в программирование на языке Pascal

{Программа на языке Pascal}

Program Rec2;

Type LinMas = Array [1..100] Of Integer;

Var A: LinMas;

I, N: Byte;

{Рекурсивная функция}

Function Summa (N: Byte; A: LinMas): Integer;

Begin

If N = 0 Then Summa: = 0 Else Summa = A [N] + Summa (N — 1, A)

End;

{Основная программа}

Begin

Write ( ‘Количество элементов массива? ‘); ReadLn (N) Randomize;

For I = 1 To N Do

Begin

A [I] = -10 + Random (21) Write (A [I]: 4)

End;

WriteLn; WriteLn ( ‘Сумма’, Summa (N, A))

End.

— 1 —

 

Введение в программирование на языке Pascal

Пример 5. Определить, есть ли заданная строка палиндромом, то есть читается одинаково слева направо и справа налево.

Идея решения состоит в просмотре строки одновременно слева направо и справа налево и сравнении соответствующих символов. Если в какой-то момент символы не совпадают, делается вывод о том, что строка не является палиндромом, если же удается достичь середины строки и при этом все соответствующие символы совпали, то строка является палиндромом. Граничное условие — строка является палиндромом, если она пустая или состоит из одного символа.

{Программа на языке Pascal}

Program Palindrom;

{Рекурсивная функция}

Function Pal (S: String): Boolean;

Begin

If Length (S) <= 1

Then Pal = True

Else Pal = (S [1] = S [Length (S)]) and Pal (Copy (S, 2, Length (S) — 2));

End;

Var S: String;

{Основная программа}

Begin

Write ( ‘Введите строку:’); ReadLn (S)

If Pal (S) Then WriteLn ( ‘Строка является палиндромом’)

Else WriteLn ( ‘Строка не является палиндромом’)

End.

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

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

СОЗДАНИЕ БИБЛИОТЕК подпрограммы в TURBO PASCAL

Стандартный язык Pascal не имеет располагает средствами разработки и поддержки библиотек программиста (в отличие, скажем, от языка Fortran и других языков программирования высокого уровня), которые компилируются отдельно и в дальнейшем могут быть использованы как самим разработчиком, так и другими. Если программист имеет достаточно большие наработки, и те или иные подпрограммы могут быть использованы при написании новых приложений, то приходятся эти подпрограммы целиком включать в новый текст.

В Turbo Pascal это ограничение преодолевается за счет, во-первых, введение внешних процедур, во-вторых, разработки и использования модулей. В настоящей публикации на примерах рассмотрим работу с теми и другими программными единицами.

Начнем с внешних подпрограмм.

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

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

  1. Дано натуральное число n.Найти сумму первой и последней цифры этого числа.
  2. Дано натуральное число n.Переставить местами первую и последнюю цифры этого числа.
  3. Дано натуральное число n.Дописать к нему цифру k в конец и в начало (если это возможно, то есть результат не выйдет за диапазон допустимых значений), или сообщить о невозможности выполнения операции.
  4. Найти наибольшую цифру в записи данного натурального числа.
  5. Дано натуральное число n.Переставить его цифры так, чтобы образовалось максимальное число, записанное теми же цифрами.

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

Вот возможный вариант такой функции:

Function Digits (N: LongInt): Byte;

Var Kol: Byte;

Begin

Kol = 0;

While N <> 0 Do Begin Kol = Kol + 1; N = N Div 10 End;

Digits = Kol

End;

Сохраним этот текст в файле с расширением .inc (это расширение внешних подпрограмм в Turbo Pascal), например, digits.inc.

Еще требуется возведения натурального числа в натуральную степень.

Function Power (A, N: LongInt): LongInt; {Файл power.inc}

Var I, St: LongInt;

Begin

St: = 1;

For I = 1 To N Do St = St * A;

Power = St

End;

Попробуем использовать функции при решении задачи номер один.

Program Example1;

Var N, S: LongInt;

{$ I digits.inc} {подключаем внешнюю функцию digits.inc, что возвращает количество цифр в записи числа}

{$ I power.inc} {внешняя функция, выполняющая возведение числа A в степень N}

Begin

Write ( ‘Введите натуральное число:’);

ReadLn (N)

{Для определения последней цифры числа N берем остаток от деления этого числа на 10, а для определения первой делим N на 10 в степени на единицу меньше, чем количество цифр в записи числа (нумерация разрядов начинается с 0)}

S = N Mod 10 + N Div Power (10 Digits (N) — 1);

WriteLn ( ‘Искомая сумма:’, S)

End.

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

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

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

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

Модуль имеет следующую структуру:

Unit <имя модуля>; {Заголовок модуля}

Interface

{Интерфейсная часть}

Implementation

{Раздел реализации}

Begin

{Раздел инициализации модуля}

End.

После служебного слова Unit записывается имя модуля (для удобства дальнейших действий) должно совпадать с именем файла, содержащего данный модуль. Поэтому (как принято в MS DOS) имя не должно содержать более 8 символов.

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

В разделе Implementation реализуются все подпрограммы, которые были ранее объявлены. Кроме того, здесь могут содержаться свои константы, переменные, типы, подпрограммы и т.д., которые носят вспомогательный характер и используются для написания основных подпрограмм. В отличие от ресурсов, объявленных в разделе Interface, все, что дополнительно объявляется в Implementation, уже не будет доступно при подключении модуля. При написании основных подпрограмм достаточно указать их имя (т.е. не нужно полностью переписывать весь заголовок), а затем записать тело подпрограммы.

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

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

Задания. Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над обыкновенными дробями вида P / Q (P — целое, Q — натуральное): 1) сложение; 2) вычитания; 3) умножение; 4) распределение; 5) сокращение дроби; 6) сведения дроби в степень N (N — натуральное) 7) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).

Дробь представить следующим типу:

Type Frac = Record

P: Integer;

Q: 1 ..High (LongInt)

End;

Используя этот модуль, решить задачи:

  1. Дан массив A — массив обыкновенных дробей.Найти сумму всех дробей, ответ представить в виде несократимой дроби. Вычислить среднее арифметическое всех дробей, ответ представить в виде несократимой дроби.
  2. Дан массив A — массив обыкновенных дробей.Отсортировать его в порядке возрастания.

Unit Droby;

Interface

Type

Natur = 1 ..High (LongInt)

Frac = Record

P: LongInt; {Числитель дроби}

Q: Natur {знаменатель дроби}

End;

Procedure Sokr (Var A: Frac)

Procedure Summa (A, B: Frac; Var C: Frac)

Procedure Raznost (A, B: Frac; Var C: Frac)

Procedure Proizvedenie (A, B: Frac; Var C: Frac)

Procedure Chastnoe (A, B: Frac; Var C: Frac)

Procedure Stepen (A: Frac; N: Natur; Var C: Frac)

Function Menshe (A, B: Frac): Boolean;

Function Bolshe (A, B: Frac): Boolean;

Function Ravno (A, B: Frac): Boolean;

Function MensheRavno (A, B: Frac): Boolean;

Function BolsheRavno (A, B: Frac): Boolean;

Function NeRavno (A, B: Frac): Boolean;

{Раздел реализации модуля}

Implementation

{Наибольший общий делитель двух чисел — вспомогательная функция, ранее не объявлена}

Function NodEvklid (A, B: Natur): Natur;

Begin

While A <> B Do

If A> B Then

If A Mod B <> 0 Then A = A Mod B Else A = B

Else

If B Mod A <> 0 Then B = B Mod A Else B = A;

NodEvklid = A

End;

Procedure Sokr; {Сокращение дроби}

Var M, N: Natur;

Begin

If AP <> 0 Then

Begin

If AP <0 Then M = Abs (AP)

Else M = AP; {Сочетание типов, так как AP — LongInt}

N = NodEvklid (M, AQ) AP = AP Div N; AQ = AQ Div N

End

End;

Procedure Summa; {Сумма дробей}

Begin

{Знаменатель дроби} CQ = (AQ * BQ) Div NodEvklid (AQ, BQ)

{Числитель дроби} CP = AP * CQ Div AQ + BP * CQ Div BQ;

Sokr (C)

End;

Procedure Raznost; {Разница дробей}

Begin

{Знаменатель дроби} CQ = (AQ * BQ) Div NodEvklid (AQ, BQ)

{Числитель дроби} CP = AP * CQ Div AQ — BP * CQ Div BQ;

Sokr (C)

End;

Procedure Proizvedenie;

Begin

{Знаменатель дроби} CQ = AQ * BQ;

{Числитель дроби} CP = AP * BP;

Sokr (C)

End;

Procedure Chastnoe;

Begin

{Знаменатель дроби} CQ = AQ * BP;

{Числитель дроби} CP = AP * BQ;

Sokr (C)

End;

Procedure Stepen; {Степень}

Var I: Natur;

Begin

CQ: = 1; CP: = 1; Sokr (A);

For I = 1 To N Do Proizvedenie (A, C, C)

End;

Function Menshe;

Begin Menshe = AP * BQ <AQ * BP End;

Function Bolshe;

Begin Bolshe = AP * BQ> AQ * BP End;

Function Ravno;

Begin Ravno = AP * BQ = AQ * BP End;

Function BolsheRavno;

Begin BolsheRavno = Bolshe (A, B) Or Ravno (A, B) End;

Function MensheRavno;

Begin MensheRavno = Menshe (A, B) Or Ravno (A, B) End;

Function NeRavno;

Begin NeRavno = Not Ravno (A, B) End;

{Раздел инициализации модуля}

Begin

End.

Дадим некоторые рекомендации по разработке модулей:

1) спроектировать модуль, т.е. выделить основные и вспомогательные подпрограммы, другие ресурсы;

2) каждую подпрограмму целесообразно наладить отдельно, после чего «вклеить» в текст модуля.

Сохраним текст разработанной программы в файле DROBY.PAS и Откомпилируем наш модуль. Для этого можно воспользоваться внешним компилятором, поставляющих вместе с Turbo Pascal. Команда будет выглядеть так: TPC DROBY.PAS. Если в тексте нет синтаксических ошибок, получим файл DROBY.TPU, иначе будет соответствующее сообщение с указанием строки, содержащей ошибку. Другой способ компиляции модуля — в среде программирования Turbo Pascal выбрать в пункте меню Run подпункты Make или Build (при этом должна быть включена компиляция на диск).

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

Для примера решим задачу суммирования массива дробей.

Program Sum;

Uses Droby;

Var A: Array [1..100] Of Frac;

I, N: Integer;

S: Frac;

Begin

Write ( ‘Введите количество элементов массива:’);

ReadLn (N)

SP: = 0; SQ: = 1; {Сначала сумма равна нулю}

For I = 1 To N Do {Вводим и подытожим дроби}

Begin

Write ( ‘Введите числитель «, I,’ й дроби: ‘); ReadLn (A [I].P)

Write ( ‘Введите знаменатель «, I,’ й дроби: ‘); ReadLn (A [I].Q)

Summa (A [I], S, S);

End;

WriteLn ( ‘Ответ:’, SP, ‘/’, SQ)

End.

Вторая задача предлагаем решить читателю самостоятельно.

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

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

Еще несколько слов о видимости объектов модуля. Если в программе, использующей модуль, является идентификаторы, совпадающие с точностью до символа с идентификаторами модуля, то они «перекрывают» соответствующие ресурсы модуля. Однако, даже в такой ситуации доступ к этим ресурсам модуля может быть получен следующим образом: <имя модуля>. <Имя ресурса>.

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

  1. Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над комплексными числами: 1) сложение; 2) вычитания; 3) умножение; 4) распределение; 5) вычисления модуля комплексного числа; 6) сведения комплексного числа в степень n (n — натуральное).

Комплексное число представить следующим типом:

Type Complex = Record

R, M: Real; {Действительная и мнимая часть числа}

End;

Используя этот модуль, решить задачи:

  1. Дан массив A — массив комплексных чисел.Получить массив C, элементами которого будут модули сумм рядом стоящих комплексных чисел.
  2. Дан массив A [M] — массив комплексных чисел.Получить матрицу B [N, M], каждая строка которой получается возведением в степень, равную номеру этой строки, соответствующие элементов данного массива A.

 

  1. Реализовать в виде модуля набор подпрограмм для выполнения следующих операций с квадратными матрицами: 1) сложение двух матриц; 2) умножение одной матрицы на другую; 3) нахождение транспонированной матрицы; 4) вычисления определителя матрицы.

Матрицу описать следующим образом:

Const NMax = 10;

Type Matrica = Array [1 ..NMax, 1 ..Nmax] Of Real;

Используя этот модуль, решить следующие задачи:

  1. Решить систему линейных уравнений N-го порядка (2 <= N <= 10) методом Крамера.
  2. Задано массив величин типа Matrica. Отсортировать этот массив в порядке возрастания значений определителей матриц.

 

III. Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над векторами на плоскости: 1) сложение; 2) вычитания; 3) скалярное умножение векторов; 4) умножение вектора на число; 5) длина вектора.

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

Type Vector = Record X, Y: Real End;

Используя этот модуль, решить задачи:

  1. Дан массив A — массив векторов.Отсортировать его в порядке убывания длин векторов.
  2. С помощью датчика случайных чисел сгенерировать 2 N целых чисел.N пара этих чисел задают N точек координатной плоскости.Вывести номера тройки точек, которые являются координатами вершин треугольника с наибольшим углом.

 

  1. Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над натуральными числами в P -ичний системе счисления (2 <= P <= 9): 1) сложение; 2) вычитания; 3) умножение; 4) распределение; 5) перевод из десятичной системы счисления в P -ичну; 6) перевод из P -ичнои системы счисления в десятичную; 7) логическая функция проверки правильности записи числа в P -ичний системе счисления; 8) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).

P -ичне число представить следующим типом:

Type Chislo = Array [1..64] Of 0..8;

Используя этот модуль, решить задачи:

  1. Свести число в степень (основание и показатель степени записаны в P -ичний системе счисления).Ответ выдать в P -ичний и десятичной системах счисления.
  2. Дан массив A — массив чисел, записанных в P -ичний системе счисления.Отсортировать его в порядке убывания. Ответ выдать в P -ичний и десятичной системах счисления.

 

  1. Реализовать в виде модуля набор подпрограмм для выполнения следующих операций над натуральными числами в шестнадцатеричной системе счисления: 1) сложение; 2) вычитания; 3) умножение; 4) распределение; 5) перевод из двоичной системы счисления в шестнадцатилетнюю; 6) перевод с шестнадцатилетней системы счисления в десятичную; 7) функция проверки правильности записи числа в шестнадцатеричной системе счисления; 8) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).

Используя этот модуль, решить задачи:

  1. Свести число в степень (основание и показатель степени записаны в шестнадцатеричной системе счисления).Ответ выдать в шестнадцатеричной и десятичной системах счисления.
  2. Дан массив A — массив чисел, записанных в шестнадцатеричной системе счисления.Отсортировать его в порядке убывания. Ответ выдать в шестнадцатеричной и десятичной системах счисления.

 

  1. Определим граф как набор точек, некоторые из которых соединены отрезками, пи дграф — граф, подмножество данного графа.Реализовать в виде модуля набор подпрограмм, определяющих: 1) число точек в графе; 2) число отрезков в графе; 3) число изолированных подграфов в графе (подграфов, не соединенные отрезками) 4) диаметр графа — длину максимальной незамкнутой линии в графе (длина каждого звена — единица) 5) граф — объединение двух графов; 6) подграф — пересечение двух графов; 7) подграф — дополнение данного графа до полного (графа с тем же количеством вершин, что и в заданном, и с линиями между любыми двумя вершинами) 8) число отрезков, выходящих из каждой вершины графа; 9) при запуске должны инициализироваться переменные: Full_Graph — полный граф с числом вершин NumberOfVertix, Null_Graph — граф без отрезков с числом вершин NumberOfVertix.

Граф представить как объект

Const NumberOfVertix = 50;

Type Graph = Array [1 ..NumberOfVertix, 1 ..NumberOfVertix] Of Boolean;

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

 

VII. Реализовать в виде модуля набор подпрограмм для работы с длинными целыми числами (числами, выходящими за диапазон допустимых значений любого целого типа): 1) сложение; 2) вычитания; 3) умножение; 4) нахождения частицы и остатка от деления одного числа на другое; 5) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше).

Длинное число представить следующим типом:

Type Tsifra = 0..9; Chislo = Array [1..1000] Of Tsifra;

Используя этот модуль, решить задачи:

  1. Свести число в степень (основание и показатель степени — длинные числа).
  2. Дан массив длинных чисел. Упорядочить этот массив в порядке убывания.

 

VIII. Реализовать в виде модуля набор подпрограмм для выполнения операций с многочленами от одной переменной (первый многочлен степени m, второй — степени n): 1) сложение; 2) вычитания; 3) умножение; 4) распределение с остатком; 5) операции отношения (равно, не равно); 6) сведения в натуральную степень k одного из многочленов; 7) вычисления производной от многочлена; 8) вычисление значения в точке x 0.

Многочлен представить следующим типу:

Type Mnogochlen = Array [1..500] Of Integer;

Используя этот модуль, решить задачи:

  1. Найти наибольший общий делитель многочленов P (x) и Q (x).
  2. Вычислить: P s (x) -Q r (x) (s, r — натуральные).

 

IX *. Реализовать в виде модуля набор подпрограмм для работы с длинными вещественными числами (числами, выходящими за диапазон допустимых значений любого действительных типа или не представленных в памяти ЭВМ): 1) сложение; 2) вычитания; 3) умножение; 4) нахождение частного от деления одного числа на другое с заданным количеством знаков после запятой; 5) функции, реализующие операции отношения (равно, не равно, больше или равно, меньше или равно, больше, меньше); 6) тригонометрические функции, где аргументом и значениями являются длинные действительные числа (указание: использовать разложение соответствующей функции в ряд).

Читать  Методические указания к выполнению лабораторных работ Информатика

Долгое действительное число представить следующим типом:

Type Tsifra = 0..9; Chislo = Array [1..1000] Of Tsifra;

LongReal = Record

Znak: 0..1; {0 — «плюс», 1 — «минус»}

Ts, Dr: Chislo {целая и дробная части}

End;

Используя этот модуль, решить задачи:

  1. Свести число в степень (основание — длинное действительное, показатель степени — длинное целое число).
  2. Дан массив длинных действительных чисел. Упорядочить этот массив в порядке возрастания.

 

СРОЧНЫЙ ТИП ДАННЫХ В ЯЗЫКЕ PASCAL

Далее познакомимся с типом данных, относится к числу структурированных. Это срочный тип данных (строка). Строка — это последовательность символов. Каждый символ занимает 1 байт памяти (код ASCII). Количество символов в строке называется ее длиной.Длина строки может находиться в диапазоне от 0 до 255. Срочные величины могут быть константами и переменными. Особенностью строки в Turbo Pascal является то, что с ней можно работать как с массивом символов, с одной стороны, и как с единым объектом, — с другой. За счет этого обработка строк достаточно гибка и удобна. Срочная константа является последовательность символов, заключенная в апострофы.Например: «это срочная константа ‘,’ 272 ‘. Срочная переменная описывается в разделе описания переменных следующим образом:

Var <идентификатор>: string [<максимальная длина строки>];

Например:

Var Name: string [20].

Параметр длины может и не указываться в описании. В таком случае имеется в виду, что он равен максимальной величине — 255. Например: Var slovo: string.

Срочная переменная занимает в памяти на 1 байт больше, чем указанная в описании длина. Дело в том, что один (нулевой) байт содержит значение текущей длины строки. Если срочной переменной не присвоено никакого значения, то ее текущая длина равна нулю. По мере заполнения строки символами ее текущая длина возрастает, но она не должна превышать максимальной по описанию величины.

Символы внутри строки индексируются (нумеруются) от единицы. Каждый отдельный символ идентифицируется именем строки с индексом, заключенным в квадратные скобки. Например: N [5], S [i], slovo [k + l]. Индекс может быть положительной константой, переменной, вира зом целого типа.Значение индекса не должно выходить за пределы описания.

Тип string и стандартный тип char совместимы. Строки и символы могут употребляться в тех же вира зап.

Срочные выражения строятся из срочных констант, переменных, функций и знаков операций.Над строковыми данными допустимы операции сцепления и операции отношения.

Операция сцепления (конкатенации) (+) применяется для соединения нескольких строк в одну результирующую строку.Сцеплять можно как строковые константы, так и переменные.

Пример: «Мама ‘+’ мыла ‘+’ раму». В результате получится строка: «Мама мыла раму». Длина результирующей строки не должна превышать 255.

Операции отношения =, <,>, <=,> =, <>. Позволяют сделать сравнение двух строк, в результате чего получается логическое значение (true или false). Опер ция отношения имеет приоритет более низкий, чем операция сцепления.Сравнение строк производится слева направо до первого несовпадающих символа, и та строка считается больше, в которой первый несовпадающих символ имеет больший номер в таблице символьного кодирования. Если строки имеют различную длину, но в общей части символы совпадают, считается, что более короткая строка меньше, чем больше долга. Строки равны, если они полностью совпадают по длине и содержат те же символы.

пример:

выражение Результат

«True1 ‘<‘ True2 ‘True

«Mother ‘>’ MOTHER ‘True

«Мама ‘<>’ Мама ‘True

«Cat ‘=’ Cat ‘True

Функция Copy (S, Pozition, N) выделяет из строки S подстроку длиной N символов, начиная с позиции Pozition.Здесь N и Pozition — целочисленные выражения.

пример:

Значение S Выражение Результат

«Мама мыла раму» Copy (S, 6, 4) ‘мыла’

«Маша ела кашу» Copy (S, 1, 8) «Маша ела»

Функция Concat (S1, S2, …, SN) выполняет сцепление (конкатенацию) строк S1, S2, …, SN в одну строку.

пример:

выражение Результат

Concat ( ‘Маша «,» ела «,» кашу «)» Маша ела кашу »

Функция Length (S) — определяет текущую длину строки S. Результат — значение целого типа.

пример:

Значение S Выражение Результат

«Test-5 ‘Length (S) 6

«(A + B) * C ‘Length (S) 7

Функция Pos (S1, S2) — обнаруживает первое появление в строке S2 подстроки S1. Результат — целое число, равное номеру позиции, где находится первый символ подстроки S1. Если в S2 подстроки S1 не обнаружено, то результат равен 0.

пример:

Значение S2 Выражение Результат

«Abcdef ‘Pos (‘ cd ‘, S2) 3

«Abcdcdef» Pos ( ‘cd’, S2) 3

«Abcdef ‘Pos (‘ k ‘, S2) 0

Процедура Delete (S, Poz, N) — удаление N символов из строки S, начиная с позиции Poz.

пример:

Исходное значение S Оператор Конечное значение S

«Abcdefg ‘Delete (S, 3, 2)’ abefg»

«Abcdefg ‘Delete (S, 2, 6)’ a ‘

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

Процедура Insert (S1, S2, Poz) — вставка строки S1 в строку S2, начиная с позиции Poz.

пример:

Исходное значение S2 Оператор Конечное значение S2

«ЭВМ РС ‘Insert (‘ IBM-«, S2, 5) ‘ЭВМ IBM-PC »

‘Рис. 2 ‘Insert (‘ N ‘, S2, 6)’ Рис.N 2 »

ГРАФИКА на Паскале

модуль gRAPH

Система координат в графическом режиме не соответствует системе координат текстового режима (80×25). Графический экран дисплея состоит из точек, которые можно зажигать определенным цветом или тушить, в результате чего на экране образуется некоторое изображение. точки называются пикселями. Расположение точек определяется их координатами. Возможно задание различных графических режимов (размеры экрана) для каждого из адаптеров-электронной платы.

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

Настройка процедур на роботу с конкретным адаптером достигается с помощью подключения нужного графического драйвера. Драйвер — это специальная программа, которая осуществляет управление теми или иными техническими средствами компьютера.
Графический драйвер управляет дисплейным адаптером в графическом режиме.
Графические драйверы разработаны фирмой Borland для всех типов адаптеров.Они находятся на диске в виде файла с расширением BGI (от англ.Borland Graphics Interface — графический интерфейс фирмы Borland).
Н-р: CGA.BGI, EGAVGA.BGI — драйвер для адаптеров EGA и VGA.
Для каждого из адаптеров возможно задание различных графических режимов (размеры экрана).

Для VGA адаптера размеры экрана в зависимости от режима экрана могут быть следующие: 640×200, 640×350, 640×480.

Рассмотрим экран, который имеет 640 точек в горизонтальном направлении (X) и 480 в вертикальном (Y). Качан отсчета точек есть в левом верхнем углу экрана.

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

Нужные файлы: Turbo. tpl, Graph.tpu, Egavga.bgi.

Работа программы начинается с инициализации (установки) графического режима процедурой InitGraph и завершается процедурой CloseGraph

Рассмотрим и проанализируем программу: (раздаточный материал).

USES Graph
VAR
GraphDriver: integer; {Переменная, задает тип адаптера}
GraphMode: integer; {Переменная, задает режим работы адаптера (экрана)}
BEGIN
{Автоматическое определение типа адаптера}
GraphDriver = Detect;
{Автоматический выбор лучшего режима экрана (640 х 480)}
InitGraph (GraphDriver, GraphMode, «C: TP7 ‘);
{ ‘C: TP7 «- может иметь вид’ ‘, если драйверы в активном каталоге}
if GraphResult <> 0 then
begin
writeln ( ‘Ошибка графики’);
Halt; {Стоп}
End;
{GraphResult — ф-я, возвращает код последней выполненной графической операции}
{Приобретает значение (-14) — 0, если 0-ошибки нет}
{Текст программы}

Setbkcolor (0);
Setfillstyle (1, cyan) Bar (0,0,639,479)
Setcolor (black)
Rectangle (50,100,550,300)
CloseGraph
{Цвет фона}
{Закрашен прямоугольник}
{Цвет будущего изображения}
{Прямоугольник}
{Закрытие графического режима.}

End.

Начинается программа с вызова процедуры InitGraph, которая автоматически обнаруживает аппаратные средства и загружает соответствующий графический драйвер помещен в Tp7. Если в процессе загрузки прошла ошибка, то на экране появляется сообщение об ошибке.
CloseGraph — в процессе своего выполнения эта процедура очищает память которая была задействована под драйверы, шрифты и промежуточные данные и восстанавливает той режим адаптера, который был до инициализации графического режима.
Рассмотрим процедуры модуля Graph предназначены для графических построений. Все процедуры, которые мы будем изучать для удобства пользования раздел имо на несколько групп.

  1. Стандартные прoцедуры и функции модуля Graph для работы с цветами.

SetBkColor (цвет) — задание цвета фона;

SetColor (цвет) — задание цвета будущего изображения

SetFillStyle (стиль заполнения, цвет) — задание способа заполнения замкнутой области:
стиль заполнения

0 — цветом фона
1 — сплошное цветом изображения
2 — горизонтальными линиями
3 — наклонными линиями
4 — наклонными толстыми линиями
5 — наклонными обратным толстыми линиями
6 — наклонными обратным линиями
7 — прямоугольной горизонтальной штриховкой
8 — косой штриховкой
9 — косой перекрывая штриховкой
10 — редкими точками
11 — плотное заполнение точками

цвет

0 — черный
1 — синий
2 — зеленый
3 — голубой
4 — красный
5 — фиолетовый
6 — коричневый
7 — светло-серый
8 — темно-серый
9 — ярко-синий
10 — ярко-зеленый
11 — ярко-голубой
12 — ярко-красный
13 — ярко-фиолетовый
14 — желтый
15 — белый

Функции и процедуры для работы с графикой

FloodFill (x, y, цвет границы) — заполнение замкнутой области с внутренней точкой (x, y)
Пример: SetColor (2)
Circle (320,220,100)
SetFillStyle (1,6)
FloodFill (320,220, 2);

CleaDevice — процедура, которая очищает экран окрашивая его цветом фона

GetDеvice — функция, которая возвращает максимально допустимые номера цвета для заданного режима

Существует ошибочное утверждение, что нельзя контуры изображения рисовать черным цветом, его просто не видно!

Чтобы этого недостатка избежать в программе или не используют процедуру
SetBkColor (цвет), а закрашивают весь экран дисплея прямоугольником нужного цвета, или используют SetBkColor (Black), с параметром
Black, а потом рисуют прямоугольник на весь экран нужного цвета.

Пример программы, демонстрирующий возможные цвета (раздаточный материал):

USES Graph;
VAR
GD: integer; {Тип адаптера}
GM: integer; {Режим экрана}
BEGIN
GD = Detect; {Автоматическое определение типа адаптера}
InitGraph (GD, GM, »); {Автоматический выбор режима экрана}
if GraphResult <> 0 then Halt; {GraphResult — возвращает код последней}
выполненной гафичнои операции}
For i = 0 to GetMaxColor do
Begin
SetBkColor (i)
ClearDevice;
Readln;
End;
CloseGraph;

END.

 

В языке TURBO Pascal имеется значительное количество графических процедур и функций. Нам понадобятся только некоторые из них. Для того, чтобы компилятор «узнавал» их названия, мы должны после заголовка программы разместить строку следующего вида:

uses Graph;

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

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

Самая программа может иметь вид:

Пример 1.

PROGRAM Primer_1;

uses Graph;

var Gd, Gm: Integer;

BEGIN

Gd = VGA; {Графический адаптер — VGA}

Gm = VGAHi; {Графический режим VGAHi (640×480)}

InitGraph (Gd, Gm, ‘.. \ bgi’); {Включить графический режим}

If GraphResult = grOk

then {Если режим включился успешно}

{Нарисовать отрезок прямой}

Line (0,0,639,479) ReadLn

END.

 

Мы видим, что в процедуры InitGraph параметры. В качестве первых двух фактических параметров должны стоять имена целых (integer) переменных. Не будем вдаваться в подробности, почему это так; вместо этого выясним их назначения.

 

Первый параметр является кодом графического адаптера (т.е. электронной схемы, управляющей выводом информации на экран). (Дело в том, что на IBM-совместимых компьютерах применяется ряд стандартных графических адаптеров, носящих названия CGA, EGA, VGA.) По нашей программе можно догадаться, что в используемые нами компьютерах используется адаптер VGA, и компилятор сам «узнает» слово VGA и заменит его на нужное целое число (на самом деле равное 9, но мы этого можем и не запоминать). Каждый графический адаптер позволяет использовать несколько графических режимов, отличающихся количеством цветов и разрешающей способностью (в дальнейшем мы узнаем, что это такое). И второй из параметров именно предназначен для того, чтобы указать, какой из графических режимов следует включить. Пока мы ограничимся только одним графическим режимом VGAHi. Третий параметр является строкой, содержащей путь к файлу, называется EGAVGA.BGI. В этом файле содержится драйвер (такая специальная программа), необходимый для работы с адаптерами EGA и VGA. И, как легко увидеть из нашего примера, файл этот находится в подкаталоге TPBGI. Все вышеизложенное необходимо знать каждому грамотному пользователю IBM-совместимых компьютеров. Однако в нашей лабораторной работе достаточно использовать конструкцию, использованную в первом примере, для включения графического режима. (И не страшно, если в ней не все понятно.)Для того, чтобы мы могли что-нибудь нарисовать на экране, нам нужно уметь задавать положение на экране того, что мы рисуем. Для этого с экраном связывается система координат следующего вида:

(0,0) X

+ И-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-И->

|

|

|

Y |

 

Каждая точка на экране на самом деле представляет собой очень маленький прямоугольник (и поскольку это не совсем точка, то иногда используют специальный термин — «пи Ксел»).Количество точек (п Икселе в), помещаются на экране по вертикали и горизонтали, называют разрешающей способностью.Разрешающая способность экрана в режиме VGAHi — 640×480. Это означает, что по горизонтали на экране умещается 640 точек, а по вертикали — 480.

Точка в левом верхнем углу экрана имеет координаты (0,0). Координата X любой точки экрана лежит в пределах от 0 до 639, а координата Y — в пределах от 0 до 479.

Как Вы уже догадались, процедура Line (x1, y1, x2, y2) рисует на экране прямую, соединяющую точки (x1, y1) и (x2, y2).

Пример 2. Изобразить на экране прямоугольный треугольник с вершинами (320, 10), (120,210), (520,210).

 

PROGRAM Primer_2;

uses Graph;

var Gd, Gm: Integer;

BEGIN

Gd = VGA; Gm = VGAHi; InitGraph (Gd, Gm, ‘.. \ bgi’);

If GraphResult = grOk

then begin

Line (120,210,520,210) {Горизонтальный отрезок}

Line (120,210,320,10) {Левый катет}

Line (320,10,520,210) {Правый катет}

ReadLn

end;

END.

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

Black = 0-черный

DarkGray = 8 темно-серый

Blue = 1-синий

LightBlue = 9 голубо

Green = 2-зеленый

LightGreen = 10- светло-зеленый

Cyan = 3 цвета морской волны

LightCyan = 11-светло—циановий

Red = 4 красный

LightRed = 12 розовый

Magenta = 5-сиреневый

LightMagenta = 13-светлосиреневый

Brown = 6-коричневый

Yellow = 14-желтый

LightGray = 7 светло-серый

White = 15-белый

 

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

Пример 3.

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

 

PROGRAM Primer_3;

uses Graph;

var Gd, Gm: Integer;

BEGIN

Gd = VGA; Gm = VGAHi; InitGraph (Gd, Gm, ‘.. \ bgi’);

If GraphResult = grOk

then begin

SetColor (LightMagenta) {Цвета — светло—бузковий}

Line (120,210,520,210) {Горизонтальный отрезок}

SetColor (LightCyan) {Цвета — светло—циановий}

Line (120,210,320,10) {Левый катет}

Set Color (Green) {Цвета — зеленый}

Line (320,10,520,210) {Правый катет}

ReadLn

end

END.

пример 4

Разноцветные лучи.

PROGRAM Primer_4;

uses Graph;

const Center = 320;

Center = 240;

Radius = 200;

var Gd, Gm: Integer;

i: Integer;

dx, dy: Integer;

BEGIN

Gd = VGA; Gm = VGAHi; InitGraph (Gd, Gm, ‘.. \ bgi’);

If GraphResult = grOk

then begin

For i = 0 to 160 do

begin

dx = Round (Radius * sin (i * pi / 80));

dy = Round (Radius * cos (i * pi / 80));

SetColor (i MOD 16);

Line (Center, Center, Center + dx, Center + dy)

end;

ReadLn

end

END.

пример 5

 

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

 

PROGRAM Primer_5;

uses Graph;

const Center = 320;

Center = 240;

var Gd, Gm: Integer;

i: Integer;

BEGIN

Gd = VGA; Gm = VGAHi; InitGraph (Gd, Gm, ‘.. \ bgi’);

If GraphResult = grOk

then begin

For i = 0 to 23 do

Circle (Center, Center, i * 10);

ReadLn

end

END.

пример 6

 

Разноцветные концентрические окружности. Для окраски замкнутой области используется процедура FloodFill, три целочисленных параметры которой задают начальную точку окраски и код цветов ограничивающая область линии. Цвета, которым будет производиться окраски, ничего общего не имеет с цветами, задающие процедурой SetColor. Цвета окраски задается вторым параметром процедуры SetFillStyle. Первый параметр этой процедуры (задающий узор для окраски) сначала будем задавать равным единице (что соответствует сплошной закрашиванию).

 

PROGRAM Primer_6;

uses Graph;

const CX = 320;

CY = 240;

var Gd, Gm: Integer;

i: Integer;

BEGIN

Gd = VGA; Gm = VGAHi; InitGraph (Gd, Gm, ‘.. \ bgi’);

If GraphResult = grOk

then begin

For i = 0 to 23 do

Circle (CX, CY, i * 10);

For i = 0 to 23 do

begin

SetFillStyle (1, i MOD 16);

{Закрашивать к границе белого цвета}

FloodFill (CX, CY + i * 10-5, White)

end;

Readln

end

END.

Пример 7.

 

PROGRAM Primer_7;

uses Graph;

var grDriver: Integer;

grMode: Integer;

i, x, y: Integer;

{И-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-И-}

PROCEDURE Rect (x, y, x1, y1: Integer);

{Рисует прямоугольник, у которого левый нижний угол}

{Имеет координаты (x, y), а правый верхний — (x1, y1)}

BEGIN

Line (x, y, x, y1) {Левая сторона}

Line (x1, y, x1, y1) {Правая сторона}

Line (x, y1, x1, y1) {Верхняя сторона}

Line (x, y, x1, y) {Нижняя сторона}

END;

{—}

BEGIN

GrDriver = VGA; GrMode = VGAHi;

InitGraph (grDriver, grMode, ‘.. \ bgi’);

If GraphResult = grOk

then begin

For i: = 1 to 15 do

begin

x = i * 30; y = i * 25; SetColor (i)

Rect (x, y, x + 50, y + 60)

end;

ReadLn

end

END.

Рисование прямоугольников — часто встречающаяся проблема, и поэтому неудивительно, что существует стандартная процедура, работает так же, как и созданная нами ниже процедура Rect. Она называется Rectangle.

Пример 8.

 

Для рисования «заполненных» прямоугольников используется процедура Bar. Так же, как и для процедуры Rectangle, мы должны указать четыре числа — координаты двух противоположных углов прямоугольника. (Для процедуры Bar цвета задается не с помощью SetColor, а с помощью SetFillStyle!).

 

PROGRAM Primer_8;

uses Graph;

const Step = 35;

var grDriver: Integer;

grMode: Integer;

i, x, y: Integer;

{И-и-и-и-и-и-и-и-и-и-и-и-и-и-И-}

PROCEDURE Square (x, y: Integer);

{Рисует цветастый квадрат, центр которого}

{Имеет координаты (x, y)}

var i, d: Integer;

BEGIN

For i = 15 downto 0 do

begin

SetFillStyle (SolidFill, i) d = i * 3 + 2;

Bar (xd, yd, x + d, y + d)

end

END;

{-И-}

BEGIN

GrDriver = VGA; grMode = VGAHi;

InitGraph (grDriver, grMode, ‘.. \ bgi’);

If GraphResult = grOk

then begin

For i = 0 to 10 do

{На «побочной» диагонали — 11 точек}

begin

x = 50 + i * Step; y = 50 + (10-i) * Step;

SetColor (i) Square (x, y)

end;

ReadLn

end

END.

 

При рисовании сложных изображений, содержащих много отрезков, возникает довольно противная проблема — вычислять координаты всех точек. Если использовать процедуру LineRel, то достаточно указывать смещения по обеим координатам относительно текущей точки. Для относительного перемещения без рисования используется процедура MoveRel для задания начальных значений координат текущей точки используется процедура MoveTo

Пример 9.

Квадратная спираль.

PROGRAM Primer_9;

uses Graph;

const Center = 320;

Center = 240;

d = 12;

var grDriver: Integer;

grMode: Integer;

i, L: Integer;

{И-и-и-и-и-и-и-и-и-и-и-и-и-и-И-}

PROCEDURE Vitok (L, d: Integer);

{Начиная от текущей точки, рисует виток спирали}

{Из четырех отрезков длины, увеличивается}

{L — длина первого отрезка}

{D — увеличение длины для каждого из следующих отрезков}

BEGIN

LineRel (L, 0); {Сдвинуться вправо}

LineRel (0 — (L + d)); {Сдвинуться вверх}

LineRel (- (L + 2 * d), 0); {Сдвинуться влево}

LineRel (0, L + 3 * d) {Сдвинуться вниз}

END;

{-И-}

BEGIN

grDriver = VGA; grMode = VGAHi;

InitGraph (grDriver, grMode, ‘.. \ bgi’);

If GraphResult = grOk

then begin

{Сделать текущей точкой центр экрана}

MoveTo (Center, Center)

L: = 1; {Начальная длина отрезка}

For i: = 1 to 10 do {10 витков спирали}

begin Vitok (L, d) L = L + 4 * d end;

ReadLn

end

END.

Пример 10. Небольшой городок.

 

PROGRAM Domiki;

uses Graph;

var grDriver: Integer;

grMode: Integer;

i, j: Integer;

{И-и-и-и-и-и-и-и-и-и-и-и-и-и-и}

PROCEDURE Domik (x, y: Integer);

{Рисует домик, у которого левый нижний угол}

{Имеет координаты (x, y)}

const dx = 60; {Ширина фасада}

dy = 40; {Высота фасада}

dx2 = dx DIV 2;

dy2 = dy DIV 2;

wx = 16; {Ширина окна}

wy = 22; {Высота окна}

wx2 = wx DIV 2;

wy2 = wy DIV 2;

BEGIN

Rectangle (x, y, x + dx, y-dy) MoveTo (x, y-dy)

Linerel (dx2, -dx2) {Левый скат крыши}

Linerel (dx2, dx2) {Левый скат крыши}

Rectangle (x + dx2-wx2, y-dy2-wy2, x + dx2 + wx2, y-dy2 + wy2) {Окно}

MoveTo (x + dx2, y-dy2) {Центр фасада (и окна)}

LineRel (0, wy2) {Вертикальная часть рамы окна}

MoveTo (x + dx2-wx2, y-dy2) {Центр левой части рамы окна}

LineRel (wx, 0); {Горизонтальная часть рамы окна}

SetFillStyle (SolidFill, Red)

FloodFill (x + 1, y-1, White)

SetFillStyle (SolidFill, Blue)

FloodFill (x + dx2, y-dy-1, White)

END;

{-И-}

BEGIN

grDriver = VGA; grMode = VGAHi;

InitGraph (grDriver, grMode, ‘.. \ bgi’);

If GraphResult = grOk

then begin

For i: = 1 to 6 do

For j = 1 to 5 do

Domik (i * 80, j * 80);

ReadLn

end

END.

Если Вас интересуют другие графические процедуры или функции, то Вам следует обратиться к системе «помощи» (Help). Для этого в меню Help выберите пункт Standard units. Среди всего прочего Вы увидите список названий стандартных модулей (неважно, что вы не знаете, что это такое). Если установить курсор на слово Graph (этого можно достичь и с помощью клавиши Tab) и нажать Enter, то на экране появится общая информация о модуле Graph. Для продолжения нам предлагается два выбора:

Go to GRAPH.TPU Functions and Procedures

Go to GRAPH.TPU Constants and Types

Если выбрать пункт «Перейти к констант и типов GRAPH.TPU», то Вы сможете добраться до такой полезной информации, как названия графических режимов и их разрешение, названия цветов, названия стилей окраски и т.п. В случае, если Вам захочется там что-нибудь поискать, приведем перевод названий некоторых пунктов соответствующего меню:

Color Constants Цветовые константы

Fill Pattern Constants Константы для образцов окраски

Graphics Drivers Графические драйверы

Graphics Modes for Each Driver Графические режимы для каждого драйвера

Выбрав же пункт «На процедур и функций GRAPH.TPU», мы увидим внушительный список названий графических процедур и функций. Если поместить курсор на название процедуры, понравилась Вам, (или функции), и нажать «перевод строки», то Вы увидите краткое описание этой процедуры (функции), и в конце — предложение посмотреть пример. (Если, скажем, Вы читаете информацию о процедуре Ellipse, то в самом конце Вы увидите слова

Sample Code:

Ellipse.PAS

Если установить курсор на слова Ellipse.PAS и нажать «перевод строки», то на экране Вы увидите текст программы, иллюстрирующий применение этой процедуры). Эта информация может пригодиться даже тем, кто не знает ни одного английского слова — Вы увидите, сколько в процедуры параметров и которые в этих параметров типа; Вы можете обычным образом (клавишами управления курсором при нажатой клавише Shift) отметить текст примера, скопировать в пустое окно и запустить.

Пример 11 (Е. В. Баранова, РГПУ им.А. И. Герцена).

Изобразить график функцииљ0 y = cos (x). При изображении графика функции необходимо иметь ввиду, что начало графических координат находится в левом верхнем углу экрана и что графические координаты принимают целые неотрицательные значения в диапазоне (0, maxx) и (0, maxy). Значение maxx и maxy для каждого режима можно определить, используя соответствующие функции. Таким образом, для получения «хорошего» графика необходимо выполнить поворот и масштабирование. Пусть, xmax — максимальное значение по оси x; ymax — максимальное значение по оси y; (X0, y0) — графические координаты центра — точки (0,0); (Xg, yg) — графические координаты точки (x, y) mx — масштаб по оси x, то есть величина Abs ((xg-x0) / x) my — масштаб по оси y, то есть величина Abs ((yg-y0) / y). Графические координаты точки (x, y): xg = x0 + mx * x; yg = y0-my * f (x).

 

PROGRAM Primer_11;

Uses Graph;

var x, y, a, b, h: Real;

x0, y0, xg, yg, xmax, ymax, mx, my, grd, grm, c: Integer;

Читать  Методы работы с ОС Linux на базе инсталляционной сборки Borsch

BEGIN

WriteLn ( ‘Введите координаты центра:’); ReadLn (x0, y0)

WriteLn ( ‘Введите масштаб по x и y:’); ReadLn (mx, my)

WriteLn ( ‘Введите область задания функции по x и шаг:’);

ReadLn (a, b, h) WriteLn ( ‘Введите цвета изображения:’);

ReadLn (c) grd: = 0; grm: = 0; InitGraph (grd, grm, »);

c = getcolor; xmax = getmaxx; ymax = getmaxy;

Line (10 y0, xmax-10, y0) {Вот OX}

Line (x0,10, x0, ymax-10); {Вот OY}

x = a;

While x <= b do

begin

xg = x0 + Trunc (mx * x) yg = y0-Trunc (my * f (x));

If (xg> = 0) AND (xg <= xmax) AND (yg> = 0) AND (yg <= ymax)

then putpixel (xg, yg, c)

x = x + h

end;

ReadLn;

closegraph

END.

Пример 12 (Е. В. Баранова, РГПУ им.А. И. Герцена).

 

Изобразить движение шарика по синусоиде.

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

PROGRAM Primer_12;

{Программа движения шарика со следом по синусоиде}

uses Graph;

var p1, p2: Pointer;

{P1 — указатель на образ «следа»,

p2 — указатель на образ шарики}

grm, grd, x, y, x1, y1: Integer;

size, c: Word;

BEGIN

grd: = 0; InitGraph (grd, grm, «D: \ Tp \ Bgi ‘);

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

определением подходящего драйвера}

c = GetColor; {C — цвета изображения}

x1 = 0; y1 = 90; {X1, y1 — начальные координаты шарика}

PutPixel (0, y1 + 5, c) {Изображение «следа»}

size = ImageSize (0,0,10,10) GetMem (p1, size);

{Size — количество байтов для изображения квадрата 11×11}

GetImage (0, y1,10, y1 + 10 p1 ^)

{P1 указывает на область памяти с изображением следа}

SetFillStyle (11 c) {Устанавливается тип и цвет окраски}

Circle (x1 + 5, y1 + 5,5) {Окружность с центром в (x1, y1)}

FloodFill (x1 + 5, y1 + 5, c) {Закраска окружности}

GetMem (p2, size); GetImage (x1, y1, x1 + 10 y1 + 10 p2 ^)

{P2 указывает на область памяти с изображением шарика}

For x = 1 to 300 do

begin

y = Trunc (40 * sin (0.1 * x) + 90);

{X, y — графические координаты нового положения шарики}

PutImage (x1, y1, p1 ^ 0) {На месте шарики изображается следует}

PutImage (x, y, p2 ^ 0) {Шарик изображается на новом месте}

x1 = x; y1 = y {Запоминаются новые координаты шарика}

end;

ReadLn; Closegraph

END.

Пример 13 (Е. В. Баранова, РГПУ им.А. И. Герцена).

 

Управление движением объекта.

Направление движения определяется нажатой клавишей (стрелки влево, вправо, вверх, вниз). Шаг перемещения вводится. Реализация движения характеризуется тем, что на каждом шагу запоминающийся образ области экрана, куда помещается курсор, затем при смещении курсора изображение восстанавливается.

 

PROGRAM Primer_13;

{Программа управления движением курсора.

Курсор — прямоугольный объект, движущийся вверх, вниз, вправо, влево при нажатии соответствующих стрелок.     Выход при нажатии клавиши ESC}

uses Crt, Graph;

{Модуль Crt необходим для использования Readkey}

PROCEDURE BadKey;

{Процедура формирует звук при нажатии неправильной клавиши}

BEGIN

Sound (500) Delay (100) Sound (400)

Delay (200) Nosound

END;

var p, pc: Pointer;

{Pc — указатель на образ курсора,

p — указатель на образ изображения «под» курсором}

grm, grd, curx, cury, curx0, cury0, lx, ly, hx, hy: integer;

size, c: word; ch: char;

{Grd, grm — переменные для номеров графических драйверов и режима curx, cury — координаты текущего положения курсора curx0, cury0 — переменные для запоминания координат курсора lx, ly — ширина и длина курсора прямоугольного вида hx, hy — шаги движения курсора по горизонтали и вертикали}

BEGIN

WriteLn ( ‘Введите размеры курсора и шаги движения’);

ReadLn (lx, ly, hx, hy)

{Установка значения системной переменной для обеспечения

совместимости работы модулей Crt и Graph}

DirectVideo = FALSE;

grd: = 0; InitGraph (grd, grm, «D: \ Tp \ Bgi ‘);

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

определением подходящего драйвера}

c = GetColor; {C — цвета изображения}

size = ImageSize (0,0, lx, ly)

{Size — количество байтов для изображения курсора}

GetMem (pc, size); GetMem (p, size);

{Выделяются области для хранения образа курсора,

и образа изображения под курсором}

SetFillStyle (1, c) {Устанавливается тип и цвет окраски курсора}

GetImage (0,0, lx, ly, p ^)

{P указывает на область памяти, где хранится изображение,

которое будет «закрыто» курсором}

curx: = 0; cury: = 0;

Bar (0,0, lx, ly) GetImage (0,0, lx, ly, pc ^)

{Pc указывает на область памяти с изображением курсора}

SetColor (6) SetFillStyle (1,2)

Bar3d (150,150,200,30,10, TRUE);

{Параллелограмм, на фоне которой происходит движение}

Repeat {Цикл по вводу символа}

ch = ReadKey; {Ввод очередного символа}

If Ord (ch) = 0

then {Нажатие управляющая клавиша}

begin

ch = ReadKey;

curx0 = curx; cury0 = cury;

{В переменных curx, cury запоминаются координаты курсора}

Case Ord (ch) of

77: If curx <getmaxx-hx

then curx = curx + hx; {Шаг вправо}

75: If curx> hx

then curx = curx-hx; {Шаг влево}

72: If cury> hy

then cury = cury-hy; {Шаг вверх}

80: If cury <getmaxy-hy

then cury = cury + hy {Шаг вниз}

else BadKey {Нажатие «неправильная» клавиша}

end;

If (curx <> curx0) OR (cury <> cury0)

then begin

PutImage (curx0, cury0, p ^ 0)

{Восстановить изображение, которое было «закры-

то «курсором}

GetImage (curx, cury, curx + lx, cury + ly, p ^)

{Запомнить то изображение, которое будет «зак-

Рита «курсором}

PutImage (curx, cury, pc ^ 0)

{Установить курсор в новое положение}

end

end

else BadKey

until Ord (ch) = 27;

CloseGraph

END.

построение диаграмм

Пусть имеется последовательность положительных действительных чисел a 1, a 2, …, a n, обозначающий результаты каких-либо измерений (например, высоты вершин гор над уровнем моря, площади государств, средние оценки учеников класса и т.д.).Нужно построить визуализированное представление этой последовательности с целью сравнения полученных результатов. В таких случаях используют диаграммы.

  1. круговые диаграммы

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

Для построения круговой диаграммы необходимо просуммировать все элементы последовательности, после чего найти отношения каждого из элементов к полученной сумме (так будет вычислено, какую часть круга нужно поставить в соответствие данной величине, — то есть рассчитываются доли круга, приходящихся на данную величину, если весь круг принять равным 1). Все эти расчеты можно представить формулами .Затем эти относительные величины переводятся в градусы: , После чего можно приступать к построению диаграммы.

Алгоритм в этом случае будет следующим:

  1. вычислить сумму элементов последовательности;
  2. найти величину сектора, отвечает каждой величине;
  3. построить все секторы в графическом режиме (в результате должен получиться полный круг). Желательно каждый сектор строить своими цветами, или использовать разное штриховки, если сектора одноцветные.

Программа построения круговой диаграммы по этому алгоритму представлена ​​ниже:

{Круговая диаграмма (с) А.П. Шестаков, 2001}

program Kr_D;

Uses Graph;

Var a, S: Real; I: Byte; G, M: Integer;

Xc, Yc, R: Integer; {Координаты центра круга и его радиус}

F: Text; {Файл содержит данные для построения диаграммы}

Alpha: Integer; {Угол, соответствующий очередной величине}

SAngle: Integer; Stroka: String;

Begin

Assign (F, ‘1.dat’); Reset (F)

S: = 0; {Сумма элементов последовательности}

While Not Eof (F) Do

begin Readln (F, a) S = S + a end;

reset (f); G = detect; M = 0;

initgraph (G, M, »); Xc = GetMax Div 2, Yc = GetMax Div 2,

R = 100; SAngle: = 0; i: = 1;

While Not Eof (f) Do begin

Readln (F, a) Alpha = round (A / S * 360) {Вычисление угла}

setcolor (i mod 16 + 1); setfillstyle (1, i mod 16 + 1);

{Построение сектора, соответствует величине}

sector (Xc, Yc, SAngle, SAngle + Alpha, R, R);

SAngle = SAngle + Alpha; i = i + 1;

{Укажем, которому цветам какая величина соответствует}

bar (Xc + 200, Yc-250 + (i-1) * 20 Xc + 220, Yc-250 + (i-1) * 20 + 15);

str (a: 8: 2, stroka)

outtextxy (Xc + 230, Yc — 250 + 5 + (i — 1) * 20 stroka) end;

readln; close (F) closegraph End.

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

  1. столбчатые диаграммы

Для построения диаграммы выделим на экране прямоугольную область с координатами соответственно верхнего левого угла (Xlv, Ylv) и правого нижнего (Xpn, Ypn). Высота столбца диаграммы, соответствующей максимальному элементу последовательности, будет совпадать с высотой прямоугольника. Ширина столбца будет зависеть от количества элементов последовательности: чем больше компонент, тем меньшей будет ширина. Таким образом, для построения диаграммы нужно определить количество компонентов последовательности и максимальный элемент последовательности. Высота v i очередного столбца диаграммы на экране будет определяться формулой где xmax — максимальный элемент последовательности, x i — очередной элемент последовательности.

Алгоритм построения диаграммы следующий:

  1. определить количество элементов последовательности и ее максимальный элемент;
  2. в соответствии с указанной формулы построить столбце диаграммы. Их ширина на экране может быть рассчитана по формуле где n — количество элементов последовательности.

Программа построения столбчатой ​​диаграммы по этому алгоритму представлена ​​ниже:

{Столбчатая диаграмма (с) А.П. Шестаков, 2001}

program Stol_D;

Uses Graph;

Var a, xmax: Real; I, n: Byte; G, M: Integer;

F: Text; {Файл содержит данные для построения диаграммы}

Stroka: String;

Xlv, Ylv, Xpn, Ypn: Integer; {Координаты окна вывода диаграммы}

Begin

Assign (F, ‘1.dat’); Reset (F)

if not eof (f) then begin readln (f, xmax) n = 1 end else n = 0;

While Not Eof (F) Do

begin Readln (F, a) if a> xmax then xmax = a; n = n + 1 end;

reset (f); G = detect; M = 0;

initgraph (G, M, »); Xlv: = 50; Ylv: = 50; Xpn = GetMaxX-100; Ypn = GetMaxY-50;

i = 0; {Номер столбца}

While Not Eof (f) Do

begin

Readln (F, a)

setcolor (i mod 16 + 1); setfillstyle (1, i mod 16 + 1);

{Очередной столбец}

bar (round (Xlv + i * (Xpn-Xlv) / n), Ypn,

round (Xlv + (i + 1) * (Xpn-Xlv) / n), round (Ypn- (Ypn-Ylv) / xmax * a));

i = i + 1;

{Укажем, которому цветам какая величина соответствует}

bar (getMaxx-70, 50+ (i-1) * 20 getMaxx-50, 50+ (i-1) * 20 + 15);

str (a: 8: 2, stroka)

outtextxy (getMaxx-40, 50+ (i-1) * 20 + 8, stroka)

end;

readln; close (F) closegraph

End.

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

 

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

  1. линейные диаграммы

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

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

{Линейная диаграмма (с) А.П. Шестаков, 2001}

program Stol_D;

Uses Graph;

Var a, xmax: Real; I, n: Byte; G, M: Integer;

F: Text; {Файл содержит данные для построения диаграммы}

Stroka: String; Yn, Yk: Integer;

Xlv, Ylv, Xpn, Ypn: Integer; {Координаты окна вывода диаграммы}

Begin

Assign (F, ‘1.dat’); Reset (F)

if not eof (f) then begin readln (f, xmax) n = 1 end else n = 0;

While Not Eof (F) Do

begin Readln (F, a) if a> xmax then xmax = a; n = n + 1 end;

reset (f); G = detect; M = 0;

initgraph (G, M, »); Xlv: = 50; Ylv: = 50; Xpn = GetMaxX-100; Ypn = GetMaxY-50;

line (xlv, ylv, xlv, ypn) line (xlv, ypn, xpn, ypn)

i = 0; {Номер точки}

readln (f, a)

Yn = round (Ypn- (Ypn-Ylv) / xmax * a)

str (a: 5: 1, stroka)

outtextxy (round (Xlv + i * (Xpn-Xlv) / n) -20, Ypn + 20 stroka)

While Not Eof (f) Do

begin

setcolor (i mod 16 + 1); setfillstyle (1, i mod 16 + 1);

{Укажем, которому цветам какая величина соответствует}

Readln (F, a)

Yk = round (Ypn- (Ypn-Ylv) / xmax * a)

{Очередная линия}

line (round (Xlv + i * (Xpn-Xlv) / n), Yn,

round (Xlv + (i + 1) * (Xpn-Xlv) / n), Yk)

i = i + 1;

str (a: 5: 1, stroka)

outtextxy (round (Xlv + i * (Xpn-Xlv) / n) -20, Ypn + 20 stroka)

Yn = Yk; {Запоминаем положение очередной точки}

end;

readln; close (F) closegraph

End.

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

 

Все представленные здесь программы могут быть объединены в одну программу с общим меню, где пользователю предоставляется возможность

МОДУЛИ, ЗАПИСИ И ФАЙЛЫ.

модули

Модуль — это автономно компилируемая программная единица, включающая в себя различные компоненты раздела описаний (типы, константы, переменные, процедуры и функции) и, возможно, некоторые выполнялись операторы,, что инициирует части. В модулях Turbo PASCAL явно выделяется некоторая «видимая» интерфейсная часть, в которой сконцентрированы описания глобальных типов, констант и переменных, а также приводятся заголовки глобальных процедур и функций. Появление объектов в интерфейсной части делает их доступными для других модулей и основной программы. Тела процедур и функций располагаются в выполняет части, что, модуля может быть скрыта от пользователя. Модули представляют собой прекрасный инструмент для разработки библиотек прикладных программ и мощное средство модельного программирования. Важные особенности модуля заключается в том, что компилятор Turbo PASCAL размещает их программный код в отдельном сегменте. Модуль имеет следующую структуру:

UNIT <имя>;

INTERFACE

<Интерфейсная часть>

IMPLEMENTATION

<Выполняет часть, что,>

BEGIN

<Инициирующая часть>

END.

Здесь UNIT — зарезервированное слово, начинает заголовок

модуля

<Имена> — имена модуля (должно совпадать с именем файла, в

который помещен модуль)

IMPLEMENTATION — зарезервированное слово (выполнение), начинает выполняет часть, что; BEGIN — зарезервированное слово, начинает инициирующую часть (часть модуля BEGIN <инициирующая часть> необязательна) END — зарезервированное слово, признак конца модуля.

Заголовок модуля состоит из зарезервированного слова UNIT и следующего за ним имени модуля. Для правильной работы Turbo PASCAL и возможности подключения средств, облегчающих разработку крупных программ, это имя должно совпадать с именем файла, в который помещается исходный текст модуля. Имя модуля служит для его связи с другими модулями и основной программой. Эти связи устанавливается специальным приложением USES <список модулей>. Здесь USES — зарезервированное слово; <Список модулей> — список модулей, с которыми устанавливается связь, элементами списка являются имена модулей, отделяемые друг от друга запятыми. Если объявление USES используется, то оно должно открывать раздел описаний основной программы. Модули могут использовать другие модули. Предложение USES в модулях может следовать либо сразу за зарезервированным словом INTERFACE, либо сразу за словом IMPLEMENTATION. Интерфейсная часть открывается зарезервированным словом INTERFACE. В этой части содержатся объявления всех глобальных объектов модуля (типов, констант, переменных и подпрограмм), которые должны стать доступными основной программе и (или) другим модулям. При объявлении глобальных подпрограмм в интерфейсной части указывается только их заголовок. Объявления подпрограмм в интерфейсной части автоматически сопровождается их компиляцией с использованием дальней модели памяти. Таким образом, обеспечивается доступ к подпрограммам из основной программы и других модулей. Порядок появления различных разделов объявлений и их количество может быть произвольным. Части, выполняет начинается зарезервированным словом IMPLEMEN- TATION и содержит описания подпрограмм, объявленных в интерфейсной части. В ней могут объявляться локальные для модуля объекты — вспомогательные типы, константы, переменные и блоки, а также метки, если они используются в инициирующей части. Описания подпрограммы, объявленной в интерфейсной части модуля, в выполняет части, что должен предшествовать заголовок, в котором можно опускать список формальных переменных (и тип результата для функции), так как они уже описаны в интерфейсной части. Но если заголовок программы приводится в полном виде, то есть, со списком формальных параметров, то он должен совпадать с заголовком, объявленным в интерфейсной части. Инициирующие части завершает модуль. Она может отсутствовать вместе с начинающим ее словом BEGIN или быть пустой — тогда за BEGIN сразу надо признак конца модуля (слово END и следующая за ним точка). В инициирующей части размещаются выполняют операторы, что, содержащих некоторый фрагмент программы. Эти операторы выполняются до передачи управления основной программе и обычно используются для подготовки ее работы. Например, в них могут инициироваться переменные, открываться нужные файлы, могут устанавливаться связи с другими ПК по коммуникационным каналам и т.п. Не рекомендуется делать инициирующую часть пустой, лучше ее опустить: пустая часть содержит пустой оператор, которому будет передано управление при запуске программы.

В среде Turbo PASCAL имеются средства, управляющие способом компиляции модулей и облегчающие разработку крупных программных проектов. В частности, определены три режима компиляции: COMPILE, MAKE и BUILD. Режимы отличаются только способами связей компилируемого модуля и основной программы с другими модулями, объявленными в приложении USES. При компиляции модуля или основной программы в режиме COMPILE компилируется только файл, находящийся в активном окне. По умолчанию предполагается, что используемые модули уже откомпилированы и результаты помещены в одноименные файлы с расширением.TPU; файл с расширением.TPU (от английского Turbo Pаscal Unit) создается в результате компиляции модуля. В режиме МАКЕ компилятор проверяет наличие TPU-файлов для каждого объявленного модуля. Если какой-либо из файлов не обнаружен, то система пытается отыскать одноименный файл с расширением.PAS, то есть файл с исходным текстом модуля. Если PAS-файл найден, то происходит его компиляция. Кроме того, в этом режиме система следит за возможными изменениями исходного текста любого используемого модуля. Если в PAS-файл (исходный текст модуля) внесены какие-либо изменения, то независимо от того, есть ли уже в каталоге соответствующий или TPU-файл нет, система осуществляет его компиляцию перед компиляцией основной программы. Если изменения внесены в интерфейсную часть модуля, то будут перекомпилированы также и все другие модули, обращаются к нему. Режим МАКЕ существенно облегчает процесс разработки крупных программ с множеством модулей. В режиме BUILD существующие TPU-файлы игнорируются, и система пытается отыскать и компилировать соответствующий PAS-файл для каждого объявленного в предложении USES модуля. После компиляции в режиме BUILD программист может быть уверен в том, что учтены все сделанные им изменения в каждом из модулей.

Подключение модуля к основной программе и их возможная компиляция осуществляется в порядке их объявления в предложении USES. При переходе к очередному модуля система предварительно отыскивает все модули, на которые он ссылается. Ссылка модулей друг на друга могут образовывать древовидную структуру любой сложности, однако запрещается явное или косвенное обращение модуля к самому себе. Дело в том, что Turbo PASCAL позволяет ссылки на частично откомпилированные модули, что примерно соответствует опережающем описания подпрограммы. Если интерфейсные части любых двух модулей независимы, Turbo PASCAL сможет идентифицировать все глобальные идентификаторы в каждом из модулей, после чего откомпилирует тела модулей обычным способом.

модуль программы

— 1 —

 

Введение в программирование на языке Pascal

unit kurp1;

interface

const n = 5,

type matr = array [1..n, 1..n] of real;

vect = array [1..n] of real;

procedure form (var a: matr)

procedure vivod (var a: matr)

function max (c: vect): real;

procedure pr (a: matr; var c: vect)

implementation

procedure vivod (var a: matr)

var i, j: integer;

begin

for i: = 1 to n do

begin

for j = 1 to n do

write (a [i, j]: 6: 2)

writeln;

end;

writeln;

end;

procedure form (var a: matr)

var i, j: integer;

begin

randomize;

for i: = 1 to n do

for j = 1 to n do

a [i, j] = random * 2-1;

end;

function max (c: vect): real;

var i: integer;

m: real;

begin

m = — 2;

for i: = 1 to n do

if c [i]> m then m = c [i];

max = m

end;

procedure pr (a: matr; var c: vect)

var i, j: integer;

begin

c [i]: = 1;

for i: = 1 to n do

begin

for j = 1 to n do

c [i] = a [j, i] * c [i];

writeln ( ‘Произведение «, i,’ — го столбца = ‘, c [i]: 6: 4);

end;

writeln;

end;

end.

— 1 —

 

Введение в программирование на языке Pascal

 

Основная программа

— 1 —

 

Введение в программирование на языке Pascal

program kursovik;

uses crt, kurp1;

var a: matr;

c: vect;

begin

clrscr;

window (45,2,75,7)

writeln ( ‘Курсовая работа по информатике’);

writeln ( ‘Факультет АЭС группа А-92 »);

writeln ( ‘студента: Грязина Дмитрия’);

window (1,1,80,25)

writeln ( ‘вариант 21’);

window (10,8,80,20)

writeln ( ‘Разработанный модуль содержит следующие программы:’);

writeln ( ‘1.Процедуру формирования элементов матрицы в интервале от 1.0 до 1.0.’);

writeln ( ‘2.Процедуру заключения матрицы на экран.’);

writeln ( ‘3.Процедуру определения произведения каждого столбца матрицы.’);

writeln ( ‘4.Функцию определения максимального произвелдения.’);

window (1,1,80,25)

gotoxy (10,24)

writeln ( ‘Для продолжения нажмите пробел’);

clrscr;

form (a)

writeln ( ‘Сложившаяся матрица’);

vivod (a)

pr (a, c)

writeln ( ‘Максимальный произведение =’, max (c): 6: 4);

readln;

end.

— 1 —

 

Введение в программирование на языке Pascal

результаты работы

Сложившаяся матрица

-0.68 0.22 0.58 -0.62-0.14

0.25 -0.11 -0.90 0.41 -0.57

0.24 -0.69 -0.84 0.28 0.71

-0.46 -0.26 0.16 0.49 -0.73

0.60 0.17 0.28 -0.77 -0.61

Произведение 1-го столбца = 0.0112

Произведение 2-го столбца = -0.0007

Произведение 3-го столбца = 0.0187

Произведение 4-го столбца = 0.0264

Произведение 5-го столбца = 0.0243

Максимальный произведение = 0.0264

записи

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

Структура обьявления типа записи такова:

<Имя типа> = RECORD <пс. полей> END

Здесь <имя типа> — правельный индификатор;

RECORD, END — зарезервированные слова (запись, конец)

<Сп. полей> — список полей; представляют собой последовательность

разделов записи, между которыми ставится точка с запросом.

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

type

birthday = record

day, month: byte;

year: word:

end;

var

a, b: Birthday;

. . . . . . . .

В этом примере тип Birthday есть запись с полями DAY, MONTH, и YEAR; переменные А и В содержат записи типа Birthday.

Как в массиве, значения переменных типа записи можно присваивать другим переменным того же типа, например:

a = b;

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

a.day = 27; b.year = 1991;

Чтобы упростить доступ к полям записи, используется оператор присоединения WITH:

WITH <переменная> DO <оператор>

Здесь WITH, DO — ключевые слова (с, делать)

<Переменная> — имя переменной типа запись, за которым,

возможно, надо список вложенных полей;

<Переменная> — любой оператор Турбо Паскаля.

Например:

with c.bd do month = 9;

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

. файлы

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

Программирование доступа к файлу в языке Turbo Pascal начинается с описания файловой переменной (переменной файлового типа). Это описание строится с помощью служебного слова file, после которого (после служебного слова of) может быть указан тип отдельных элементов файла, например:

var

F: file of integer;

При необходимости можно отдельно определить некоторый файловый тип, которым в дальнейшем пользоваться при описании файловых переменных:

type

RecordFile = file of record

А, В: real;

end;

var

Fl, F2: RecordFile;

Очень важно различать собственно файл (область памяти на магнитном носителе с некоторой информацией) и переменную файлового типа в некоторой Turbo Pascal- программе. Считается, что файловая переменная является представителем некоторого дискового файла в программе. Для того, чтобы реализовать доступ к файлу па магнитном диске, программа должна связать его с файловой переменной. Для этого необходимо сопоставить переменную с именем файла. Это имя представляется в виде строки, содержащей полное имя файла и, быть может, цепочку объемлющих каталогов и обозначение дисковода. Такая строка называется маршрута (или пути) к файлу и формируется по общим правилам MS-DOS.

Связывание маршрута и файлов переменной производится стандартной процедурой Assign, передаваемых два параметра: имя переменной файлового типа и строка с именем (маршрутом) дискового файла, например:

Assign (F, ‘с: \ books \ book4 \ test3 .раз’);

Кроме маршрута, во втором параметре может быть указано условное (символическое) обозначение некоторого «псевдофайла» MS-DOS, то есть файла, связанного с конкретным физическим устройством. Допускаются имена, в основном совпадающие с принятыми в MS-DOS обозначениями ( ‘con’ — консоль, то есть экран дисплея и / или клавиатура, ‘lpti «или» prn «- печатающее устройство и т.д.).

Читать  Java истории языка, Обзор Основных возможностей, задачи и решения

До тех пор, пока файловая переменная не связана с каким-либо дисковым файлом, никакие операции с ней в программе невозможны, Заметим, что можно связать файловую переменную с еще не существующим дисковым файлом. Это может быть оправдано для случая последующего создания Turbo Pascal-программой файла с данным именем с помощью некоторой системной процедуры.

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

Rename (var f; nevname: string);

Erase (var f)

Основным параметром этих процедур является файловая переменная (она может идентифицировать файл любого типа, и к ней должна была быть ранее применена процедура Assign), а процедуре Rename дополнительно передается новое имя файла. Действие указанных процедур основывается на соответствующих DOS-функциях и функционально эквивалентно командам ren и del командного процессора.

Открытие и закрытие файлов

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

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

var

F: file of integer;

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

С каждой переменной файлового типа также связано понятие текущего указателя файла. Текущий указатель можно понимать как скрытую переменную (то есть переменную, неявно описанную вместе с файловой

переменной), обозначающий ( «указывает» на) некоторый конкретный элемент файла. Таким образом, можно графически так представить интерпретацию файла, связанного с переменной F: 0 1 2 N

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

Заметим, что тот же внешний файл в различных Turbo Pascal-программах (или даже в разных частях одной и той же программы) может интерпретироваться по-разному, например, как последовательность целых чисел, или как последовательность символов, или как последовательность некоторых записей, и т.д. Эта возможность очень важна и часто используется в работе с файлами сложной структуры. Например, в процессе работы с внутренним представлением файлов баз данных (в частности, DBF-файлами) может понадобиться интерпретировать файл по-разному в зависимости от того, какую его компонент (заголовок или содержательную часть) мы обрабатываем.

Нужно также отметить, что все операции с файлами в языке Turbo Pascal реализованы с использованием базовых средств операционной системы; в частности, понятие текущего указателя файла поддержано в MS-DOS. Однако все перемещения по файлу (как явное управление указателем, так и сдвиги при обменах) выполняются в терминах байтов. Таким образом, все аспекты, связанные с типизацией содержимого файлов, представляют собой системную надстройку языка Turbo Pascal.

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

Обычные типизированные файлы открываются с помощью одной из двух системных процедур — Reset или Rewrite, единственным параметром которых в данном случае является файловая переменная. Обе эти процедуры открывают файл для обмена. Разница между ними заключается в начальных действиях с файлом.

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

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

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

Кроме закрывающей процедуры close, в системе Turbo Pascal также дополнительная процедура Flush (ее параметр — файловая переменная). Flush используется для завершения обменов с файлом без его закрытия. Обмены с файлами всегда реализуются через некоторый буфер в оперативной памяти, поэтому в процессе записи на файл последние записываемые элементы могут еще находиться ( «застрять») в буфере. Процедура Flush вызывает принудительное сброс этих элементов в файл. Эта процедура имеет смысл в том случае, если с файлом проводились операции записи, и используется редко, так как процедура close делает такие же действия.

Основная программа

— 1 —

 

Введение в программирование на языке Pascal

program part2;

uses crt;

type table = record

n: integer;

inn: string [12];

Name: string [20];

Sng: integer;

Nop: integer;

Uop: integer;

Skop: integer;

End;

Var

f: file of table;

x: table;

begin

clrscr;

window (45,2,75,7)

textcolor (5);

writeln ( ‘Курсовая работа по информатике’);

writeln ( ‘Факультет АЭС группа А-92 »);

writeln ( ‘студента: Грязина Д.’);

window (1, 1, 80, 25);

gotoxy (30, 5)

writeln ( ‘Часть 2’);

window (10, 8, 80, 20);

writeln ( ‘В файле table.txt содержатся справочные сведения’);

writeln ( ‘о предприятиях-задолжниками по уплате налогов’);

writeln;

writeln ( ‘Задача’);

writeln ( ‘Выдавать полные сведения о предприятиях, не’);

writeln ( ‘насчитывали налоги в отчетный период.’);

window (1, 1, 80, 25);

gotoxy (10, 24)

textcolor (4 + blink)

writeln ( ‘Для продолжения нажмите Enter’);

readln;

textcolor (10);

clrscr;

assign (f, table.txt)

reset (f);

writeln ( ‘Cведения о предприятиях, которые не начисляли’);

writeln ( ‘налоги в отчетный период’);

writeln ( ‘+ и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и +’);

writeln ( ‘№ ИНН Наименование 1 2 3 4’);

writeln ( ‘-и — + — и-и-и-и-и + и-и-и-и-и-и-и-и + и-и + и-и + и-и + и-И-‘);

while not Eof (f) do

begin

read (f, x)

with x do

if Nop = 0 then

begin

writeln ( » № 3 », Inn: 12 », Name: 20 », Sng: 4, », Nop: 4, », Uop: 4, »);

writeln (Skop: 4, »);

end;

end;

writeln ( ‘+ и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и-и и-и-и-и-и-и-и-и-и-и-и-и-+ ‘);

writeln;

writeln ( ‘1- Сведения на начало года’);

writeln ( ‘2 — начислен налогов в отчетный период’);

writeln ( ‘3 — Уплачено налогов в отчетный прериод’);

writeln ( ‘4 — Сведения на конец отчетного преиод’);

writeln;

readln;

end.

 

— 1 —

Введение в программирование на языке Pascal

СРЕДСТВА среды программирования для отладки программ

Среда Borland Pascal имеет несколько встроенных инструментальных средств отладки программ. С некоторыми из них мы уже познакомились. Механизм пошагового выполнения программы, вызываемый функциональной клавишей F7, и его варианты: пошаговое выполнение без входа в процедуры, вызываемое клавишей F8, и исполнение в заданной строки (клавиша F4) позволяют проверить, соответствует ли последовательность выполнения команд Вашим требованиям к алгоритму.

Эффективность отладки возрастает при совместном использовании различных инструментальных средств среды программирования. Для использования средств отладки должны быть включены опции компилятора: Debug information, Local symbols и Symbol information (меню Options / Compiler). Если опции установлены, в файл включается специальная информация, что допускает применение средств отладки. В отлаженной программе эта информация не требуется, поэтому при компиляции программы как готового продукта опции отладки рекомендуется отключить. Из меню Debug можно вызвать три окна: Output, Watch и Call stack, которые как объекты интерфейса подобные окна с текстом программы. Они имеют порядковый номер, их размеры и положение изменяются так же, как размеры и положение любых текстовых окон. Они приводятся в списке окон меню Windows, могут активизироваться из этого меню. Каждое из этих окон закрывается клавишами Alt + F3. Отличие от текстовых окон в том, что мы не можем выполнять в них свободный запись.

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

Окно стека Окно отладки

Просмотр и изменение переменной

Добавить контрольные точки

Контрольные точки Окно регистров Окно программы

пользовательский экран

Добавить в окно отладки

стоит запомнить комбинацию клавиш Alt + F5 для его быстрого вызова. Если нужно одновременно наблюдать на экране текст программы и результаты ее работы в текстовом режиме, можно открыть окно Output — окно, в которое будут выводиться результаты выполнения программы. Размер окна Output можно отрегулировать клавишами перемещения курсора после нажатия Control + F5 или мышью, как описано ранее.

Окно отладки программ Watch может быть открыто пунктом меню Watch или Add watch. В каждой строке окна может быть задано некоторая переменная или выражение. В процессе выполнения программы текущее значение заданной переменной или выражения выводится в это окно. Установление с использованием окна Watch обычно сочетаются с пошаговым наладкой, когда можно проверить не только последовательность выполнения команд, но и значения величин, приводящие к такой последовательности выполнения. Для создания окна Watch нет необходимости вызывать пункт меню Watch. Можно просто нажать клавиши Control + F7 — и Вы получите окно Add Watch, в котором надо ввести имя переменной для вывода в окно отладки. В строке для набора имени будет подсвечено то имя, на котором стоял текстовый курсор в момент нажатия клавиш Control + F7. Если Вы нажмете Enter, в окно Watch добавится набранная в окне Add Watch переменная или выражение, если начнете набор другого имени, это имя исчезнет без дополнительных действий для удаления. Если сразу после открытия окна Add Watch нажать стрелку курсора вправо, то в окно ввода начинают вводиться символы из текста программы, следующие за курсором.

Когда окно Watch активно, в нижней строке появляются указания на наиболее актуальные действия, которые можно сделать в данном состоянии. Подсказка напоминает Вам, что пошаговое отладки проводится по нажатию клавиш F7 или F8, предлагает нажать Insert для добавления новой переменной в окно, Delete для удаления записи, Enter для редактирования записи, на которой стоит курсор окна отладки.

Загрузим, например, программу определения наибольшего общего делителя. Откроем окно Output для диалога в процессе выполнения программы. Откроем окно Watch и поместим в него все три переменные наши программы: Common, First и Second. При пошаговом отладке программы по клавише F7 мы увидим, что к выполнению программы переменные не определены. По мере ввода цифр переменные First и Second получают введенные значения. В начале цикла получает значение и переменная Common, что меняется при каждом прохождении цикла. Вы также увидите, что строка

if (First mod Common) = 0 then begin WriteLn ( ‘HCVl =’, Common) Break end

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

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

Контрольная точка — это логическое условие, исчисляемый каждый раз при выполнении заданной строки программы. Если выполняются условия прерывания, программа останавливается в контрольной точке. Далее мы можем вводить другие контрольные точки или применять пошаговую отладку с просмотром в окне Watch.

Чтобы добавить контрольную точку в программу, надо ввести имя файла, номер строки, в которой производится проверка, логическое условие, по достижению которого происходит остановка программы, и число проходов заданной строки, в которых данная логическая условие не просчитывается. Если логическое условие не задано, остановка возникает по достижению данной строки. Число проходов данной строки без анализа по умолчанию устанавливается равным 0, то есть анализ проводится, начиная с первого прохода. Допустим, в программе определения наибольшего общего делителя Common.pas мы хотим проверить отношения, возникающие при кратности переменных Second и Common. Тогда в окне Add Breakpoint в поле Condition мы вводим условие прерывания программы Second mod Common = 0. В поле FileName автоматически вносится имя файла, активного окна, а в поле Line number — номер строки, в которой находится курсор. В строку Pass count записывается число 0, потому что мы хотим остановить программу уже при первом выполнении условия прерывания.

Все введенные в программу точки прерывания можно просмотреть и отредактировать в окне Breakpoints

Окно, открывается при выборе пункта меню Evaluate / Modify, также окно Watch, позволяет просмотреть значение любой переменной или выражения, но при этом можно изменить значение переменной. Окно Evaluate / Modify может быть вызвано, если выполнение программы остановлено через механизм точки прерываний или при пошаговом отладке, и должно быть закрыто для продолжения работы программы. Это окно удобно использовать как «калькулятор». Для выполнения вспомогательных вычислений достаточно ввести соответствующее выражение в поле Expression и прочитать результат в поле Result.

БОЛЬШИЕ ПРОЕКТЫ
ДЛЯ самостоятельной РЕАЛИЗАЦИИ

  1. Волчий остров (Ван Тассел Д. Стиль, разработка, эффективность, отладка и испытание программ.М .: Мир, 1981.)

Волчий остров размером 20 * 20 заселен дикими кроликами, волками и волчицами.Есть по несколько представителей каждого вида. Кролики довольно глупы: в каждый момент времени они с одинаковой вероятностью 1/9 передвигаются в один из восьми соседних квадратов (за исключением участков, ограниченных береговой линией) или просто сидят неподвижно. Каждый кролик с вероятностью 0.2 превращается в двух кроликов. Каждая волчица передвигается случайным образом, пока в одном из соседних восьми квадратов не окажется ли кролик, за которым она охотится. Если волчица и кролик оказываются в одном квадрате, волчица съедает кролика и получает одно «очко». В противном случае она теряет 0.1 «очка». Волки и волчицы с нулевым количеством очков умирают.

В начальный момент времени все волки и волчицы имеют 1 очко. Волк ведет себя подобно волчицы до тех пор, пока в соседних квадратах не исчезнут все кролики; тогда если волчица находится в одном из восьми близлежащих квадратов, волк гонится за ней. Если волк и волчица окажутся в одном квадрате и там нет кролика, которого нужно съесть, они производят потомство случайной пола.

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

  1. Задача об инфекциях стригущего лишая (Ван Тассел Д. Стиль, разработка, эффективность, отладка и испытание программ.М .: Мир, 1981.)

Промоделируйте процесс распространения инфекции стригущего лишая по участку кожи размером n * n (n — нечетное) клеток.Предполагается, что исходной зараженной клеткой кожи является центральная. В каждый интервал времени поражена инфекцией клетка может с вероятностью 0,5 заразить любую из соседних здоровых клеток. По истечении шести единиц времени зараженная клетка становится невосприимчивой к инфекции, возникший иммунитет действует в течение следующих четырех единиц времени, а затем клетка оказывается здоровой. В ходе моделирования описанного процесса выдавать текущее состояние моделируемого участка кожи в каждом интервале времени, отмечая зараженные, невосприимчивые к инфекции и здоровые клетки.

  1. Построение с помощью циркуля и линейки

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

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

Программа должна содержать 10-15 стандартных задач на построение школьного курса геометрии, предлагать их для решения и контролировать процесс построения и полученное решение.

  1. морской бой

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

  1. программа, что обучающих-контролируемых, «Сложение и вычитание отрицательных чисел»

Составить программу, учит учащихся 6 класса сложению и вычитанию отрицательных чисел (см. Учебник «Математика 6» Нурк или Виленкина), а также, что предлагает серию, задач различной сложности для закрепления навыков действий над такими числами.

  1. «Математика» (итальянская игра) (Б. А. Кордемский.Математическая смекалка. СПб .: «Манускрипт», 1994. — 496 с.)

Есть набор из 52 карточек, на которых записаны числа от 1 до 13, причем карточки с каждым из этих чисел встречаются четырежды. Разработать программу, позволяющую имитировать декабря человека с компьютером. Есть квадратное поле с 25 клетками. Программа случайным образом вытягивает какую-либо из имеющихся карточек и выдает записанное на ней число. Каждый игрок заносит это число в одну из клеток квадрата. Так продолжается до тех пор, пока не будут заполнены все клетки квадрата.

По окончании игры заполнения соответствующего квадрата оценивается определенным количеством очков. Цель игры — разместить числа в клетках так, чтобы набрать наибольшее количество очков в соответствии с данной таблице:

 

 

комбинации чисел В ряде или столбце по диагонали
За 2 одинаковые числа 10 очков 20 очков
За 2 пары одинаковых цифр 20 очков 30 очков
За 3 одинаковые числа 40 очков 50 очка
За 3 одинаковые числа и два других одинаковых числа 80 очка 90 очка
За 4 одинаковые числа 160 очка 170 очка
За 5 последовательных чисел, но не обязательно по порядку расположенных 50 очка 60 очка
По три раза по 1 и два раза по 13 100 очков 110 очка
По числа 1, 13, 12, 11 и 10, но не обязательно по порядку расположенных 150 очка 160 очка
За 4 единицы 200 очка 210 очка

Разработать для компьютера наиболее оптимальную стратегию заполнения квадрата.

  1. Заполнение готовых форм с помощью информации из базы данных

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

  1. карточные игры

Составить программу, раздает игральные карты заданному количеству игроков (одним из игроков есть человек, других играет компьютер) и моделирует игру «в дурака». Компьютерная программа играет случайным образом, без анализа уже вышедших карт. Количество игроков не превышает шести.

  1. «Нолики-нолики-крестики-нолики»

Составить программу, позволяющую играть на бесконечном поле в «крестики-нолики»:
а) * игроку с компьютером;
б) двум игрокам.
Если как игрок выступает компьютер, программа делает первый ход. Делая очередной ход, программа анализирует ситуацию, рассчитывая возможные ходы противника вперед на 1-2 хода, и в результате проведенного анализа поступает наиболее оптимально.

  1. «Быки и коровы»

Составить программу, позволяющую играть в «Быки и коровы»:
а) игроку с компьютером;
б) двум игрокам.

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

Например, если задумано число 3275 и названо число 1234, получаем в названном числе одного «быка» и одну «корову». Очевидно, что число отгадано в том случае, если имеем 4 «быка».

  1. «Числовые головоломки»

Составить программу,:
1) предлагает игроку числовые головоломки типа ОДИН + ОДИН = МНОГО из некоторого набора таких головоломок (до 30);
2) позволяет решить головоломку;
3) контролирует правильность решения.

  1. «Графики»

Составить программу, которая предлагает пользователю некоторый список функций для построения графиков (например, y = ax 2 + bx + c, y = a sin x + b и т.д. — до 25 наименований).После выбора соответствующей функции, задачи коэффициентов и отрезка, на котором выполняется построение, программа строит указанный график. Затем значения коэффициентов и положения графика можно менять (например, с помощью клавиш управления курсором), после чего график перестраивается и записывается обновленное уравнение соответствующей кривой.

  1. Игра «Два лисы и 20 кур»

На поле указанной формы (см. Рисунок ниже) находятся два лисы и 20 кур. Куры могут перемещаться на один шаг вверх, влево или вправо, но не назад и не по диагонали. Лисы также могут перемещаться только на один шаг, но также и вверх — как вниз, влево и вправо. Лиса может съесть курицу — как в игре в шашки: если в горизонтальном или вертикальном направлении с курицей на один шаг нужно свободное поле, то лиса перепрыгивает через курицу и берет ее. Лисы всегда обязаны есть и, когда у них есть выбор — они обязаны осуществлять наиболее длинное поедание. Если два приема пищи имеют одинаковую длину, осуществляется один из них — на выбор лисы.

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

Исходное положение кур и лис изображен на рисунке.

Лисы выигрывают, если им удается съесть 12 кур, потому что тогда оставшиеся кур, недостаточно, чтобы занять 9 верхних полей.

  1. Программа «Игры со спичками»

Составить программу,
1) предлагает игроку головоломки со спичками из некоторого набора таких головоломок (до 30 штук)
2) позволяет решить головоломку, передвигая спички;
3) контролирует правильность решения.

  1. Графика в Turbo Pascal

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

  1. Игра в слова

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

Тематикой игры могут быть на выбор города, животные, растения и т.д. Тематику из предложенных компьютером (не меньше 5) выбирает человек. Для игры компьютер использует собственную базу данных (для каждой тематики свою), который хранится в виде текстового файла. Если названное человеком слово отсутствует в базе, уточняется, правильно оно названо, и в случае правильности заносится в базу, иначе уточняется. Правила игры: называется слово, и другой игрок должен предложить другое, начинающееся с той буквы, на которую кончается названо.

  1. ребусы

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

[Всего голосов: 3    Средний: 5/5]