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

Процедуры

Структура процедуры имеет следующий вид:

Procedure <имя процедуры>{(формальные параметры : их тип)}; {Var   (локальные переменные)} begin   . . . end;

Процедура вызывается по имени:

  <имя процедуры> {(фактические параметры)};

Процедура может быть с параметрами, а может быть без параметров.

Процедура-это поименованный составной оператор, где имя задается служебным словом Procedure.

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

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

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

Локальными переменными называются переменные, описанные внутри процедуры (функции) и используемые только внутри процедуры (функции).

Формальными параметрами называются переменные описанные в заголовке программы и используемые только внутри процедуры (функции).

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

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

Рассмотрим пример: необходимо создать 3 массива случайных чисел, создать массив суммы всех элементов и организовать вывод всех массивов в виде таблицы.

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

var a1: array [1..10] of integer;

a2: array [1..10] of integer;

a3: array [1..10] of integer;

Asum: array [1..10] of integer;

i: integer;

begin

for i:= 1 to 10 do begin

a1[i]:=random(10);

a2[i]:=random(10);

a3[i]:=random(10);

end;

writeln ('1 massiv');

writeln ('_____________________');

writeln ('| i | a[i] |');

for i:=0 to 9 do

writeln ('| ',i:3, ' | ', a1[i]:4, ' |');

writeln('______________________');

writeln ('2 massiv');

writeln ('_____________________');

writeln ('| i | a[i] |');

for i:=0 to 9 do

writeln ('| ',i:3, ' | ', a2[i]:4, ' |');

writeln('______________________');

writeln ('3 massiv');

writeln ('_____________________');

writeln ('| i | a[i] |');

for i:=0 to 9 do

writeln ('| ',i:3, ' | ', a3[i]:4, ' |');

writeln('______________________');

for i:= 1 to 10 do Asum[i]:=a1[i]+a2[i]+a3[i];

writeln('summarnii massiv');

writeln ('_____________________');

writeln ('| i | a[i] |');

for i:=0 to 9 do

writeln ('| ',i:3, ' | ', Asum[i]:4, ' |');

writeln('______________________');

readln();

end.

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

Блок-схема для этой программы:

var a1: array [1..10] of integer;

a2: array [1..10] of integer;

a3: array [1..10] of integer;

Asum: array [1..10] of integer;

i: integer;

procedure print (var x: array of integer); {название процедуры и формальный элемент, на который будет ссылаться основная программа}

var i:integer; {локальная переменная, которая используется только в процедуре}

begin

writeln ('_____________________');

writeln ('| i | a[i] |');

for i:=0 to 9 do

writeln ('| ',i:3, ' | ', x[i]:4, ' |');

writeln('______________________');

end;

begin

for i:= 1 to 10 do begin

a1[i]:=random(10);

a2[i]:=random(10);

a3[i]:=random(10);

end;

writeln ('1 massiv'); print(a1); {вызов процедуры}

writeln ('2 massiv'); print(a2);

writeln ('3 massiv'); print(a3);

for i:= 1 to 10 do Asum[i]:=a1[i]+a2[i]+a3[i];

writeln('summarnii massiv'); print(Asum);

readln();

end.

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

ФУНКЦИИ

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

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

  • присвоить переменной

  • использовать в выражении

  • передать в качестве параметра в процедуру или функцию.

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

Структура функции имеет следующий вид:

Function <имя функции>{(формальные параметры : их тип)}: <тип функции>; {Var   (локальные переменные)} begin   . . .

<имя функции>: =<выражение> end;

Где:

Тип функции – простой порядковый тип, исключение - тип string. Если тип не стандартный, то его надо предварительно описать в разделе Type программы.

<имя функции>: =<выражение> - оператор, который осуществляет механизм возврата значения.

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

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

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

Код будет выглядеть следующим образом:

var a:array[1..100] of integer;

i,n:integer;

sum:longint;

function fact(x:integer):longint; {название процедуры, описание формальных переменных и тип, который примет функция}

var i,f:integer; {описание локальных переменных}

begin

f:=1;

for i:=1 to x do

f:=f*i;

fact:=f; {присвоение значения, которое примет функция}

end;

begin

sum:=0;

writeln('Vvedite 4islo elementov');

readln(n);

for i:=1 to n do

begin writeln('vvedite ', i, '-oe 4islo');

readln(a[i]);

end;

for i :=1 to n do sum:=sum+fact(a[i]); {вызов функции из основной программы}

write('factorial summi 4isel ');

for i := 1 to n do

write(a[i], ' ' );

writeln(' raven ', sum);

readln;

end.

Модуль CRT

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

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

Процедура TEXTCOLOR(цвет)- устанавливает цвет для выводимых символов.

Процедура TEXTBACKGROUND(цвет)- устанавливает цвет фона на который выводятся символы.

Процедура GOTOXY(X,Y)- выводит курсор в требуемое положение на экране

X – горизонтальная координата;

Y - вертикальная координата.

Процедура WINDOW(x1,y1,x2,y2) – устанавливает границы активного окна для вывода данных.

x1,y1 – координаты верхнего левого угла окна;

x2,y2 - координаты нижнего правого угла окна.

Процедура CLRSCR – очищает экран или активное окно.

Пример:

Вывести 10 значений y=sin(x) начав с х=0 с шагом dx= 0.15 в таблице в центре экрана.

Переменные:

y- функция тип real;

x – аргумент тип real;

dx – шаг аргумента тип real;

i,kn- параметры цикла тип integer.

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

uses crt; используем модуль СRT

var x,dx,y:real; описываем переменные, которые будут использованы

i,kn:integer;

begin

clrscr; используем функцию для очистки экрана

writeln('vv.kn,x,dx');

readln(kn,x,dx);

gotoxy(33,6); используем эту процедуру для вывода курсора на экран в центре

writeln('--------------');

gotoxy(33,7);

writeln('| x | y |');

gotoxy(33,8);

writeln('--------------');

for i:=1 to kn do

begin

y:=sin(x);

gotoxy(33,i+);writeln('|',x:4:2,'|',y:7:4,'|');

x:=x+dx; табулируем функцию

end;

gotoxy(33,i+);

writeln('--------------');

readln;

end.

Примечание: рисунок

Модуль GRAPH

Графические возможности языка Турбо-Паскаля реализованы с помощью ряда графических подпрограмм (их более 50), содержащихся в модуле Graph (файл GRAPH.TPU). Кроме того, существует ряд графических драйверов, обеспечивающих работу программы с тем или иным видеоадаптером. Для реализации графических драйверов (BGI-файлов) выделяется некоторый небольшой набор базовых графических операций и именно эти операции “привязываются” к конкретному драйверу устройства. Для каждого драйвера обеспечивается стандартный интерфейс, а все остальные операции реализуются библиотечными подпрограмммами на основе набора базовых операций. Таким образом удается обеспечить почти полную независимость программ от типа установленного видеоадаптера.

Для работы в графическом режиме программа должна выполнить его инициализацию. Инициализация графического режима выполняется с помощью вызова библиотечной процедуры InitGraph(var GraphDriver, GraphMode :integer; PathToDriver : string), которая отыскивает на диске указанный в вызове драйвер, загружает его в память и подготавливает экран к работе в графическом режиме.