ЛАБОРАТОРНАЯ РАБОТА №6 Тема: Разработка, отладка и испытание циклических алгоритмов и программ с известным числом повторений с внутренними ветвлениями

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

Программное обеспечение: TURBO PASCAL 7.1

Оснащение:персональный компьютер, практикум

Время проведения: 2 уч. часа

 

Литература:

1. Немнюгин С.А. Turbo Pascal. Практикум. 2-е изд. СПб.: Питер, 2007. С. 86-112.

2. Немнюгин С. , Перколаб Л. Изучаем Turbo Pascal. СПб.: Питер, 2008. С. 106-134.

3. Павловская Т.А. Паскаль. Программирование на языке высокого уровня. Учебник для вузов. СПб.: Питер, 2008. С. 58-64.

ВОПРОСЫ ВХОДНОГО КОНТРОЛЯ:

1. Приведите классификацию типов данных языка Паскаль.

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

3. Опишите способы описания массивов.

4. Опишите структуру условного оператора, приведите пример.

СОДЕРЖАНИЕ РАБОТЫ: Написать алгоритм, составить блок-схему и отладить программу.

Вариант Задание
№1, 11 Задан массив из N элементов. Определить среднее арифметическое наибольшего и наименьшего элементов.
№2, 12 Задан массив из M элементов. Определить максимальный элемент.
№3, 13 Задан массив из M элементов. Определить минимальный элемент.
№4, 14 Задан массив из N элементов. Определить минимальный положительный элемент.
№5, 15 Задан массив из N элементов. Определить сумму всех элементов кратных 3.
№6, 16 Задан массив из N элементов. Определить сумму всех положительных элементов.
№7, 17 Задан массив из N элементов. Определить суму элементов кратных 4.
№8, 18 Задан массив из M элементов. Определить сумму положительных элементов кратных 5.
№9, 19 Задан массив из M элементов. Определить сумму отрицательных элементов кратных 6.
№10, 20 Задан массив из N элементов. Определить сумму квадратов наибольшего и наименьшего элементов.

ВОПРОСЫ ВЫХОДНОГО КОНТРОЛЯ:

1. Опишите способы описания массивов.

2. Приведите пример доступа к определенному элементу многомерного массива.

ДОМАШНЕЕ ЗАДАНИЕ

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


ЛАБОРАТОРНАЯ РАБОТА №7 Тема: Разработка, отладка и испытание алгоритмов и программ с использованием процедур и функций

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

Программное обеспечение: TURBO PASCAL 7.1

Оснащение:персональный компьютер, практикум

Время проведения: 2 уч. часа

 

Литература:

  1. Немнюгин С.А. Turbo Pascal. Практикум. 2-е изд. СПб.: Питер, 2007. С. 113-123.
  2. Немнюгин С. , Перколаб Л. Изучаем Turbo Pascal. СПб.: Питер, 2008. С. 136-157.
  3. Павловская Т.А. Паскаль. Программирование на языке высокого уровня. Учебник для вузов. СПб.: Питер, 2008. С. 90-104.

ВОПРОСЫ ВХОДНОГО КОНТРОЛЯ:

1. Дайте понятие локальным переменным, их время жизни.

2. Сформулируйте определение локальной переменной, время ее жизни.

3. Опишите структуру программы и подпрограммы.

КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Подпрограмма процедура

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

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

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

Procedure имя ( формальные параметры );

раздел описаний

Begin

раздел операторов

End;

и помещается в разделе описаний основной программы (глобальном блоке). Здесь имя - имя процедуры. Раздел описаний, как и в основной программе, включает разделы Label, Const, Type, Var и раздел процедур и функций.

 

Формальные параметры представляют собой список переменных с указанием их типа. Эти переменные не описываются в разделе описаний процедуры. Допускается использование процедур без формальных параметров.

 

Формальные параметры могут быть трех видов:

1) параметры-значения (входные параметры);

2) параметры-переменные (выходные параметры);

3) параметры процедурного типа.

 

Описание входных параметров имеет вид:

список переменных 1: тип 1; список переменных 2: тип 2;…

Описание выходных параметров соответственно:

Var список переменных 1: тип 1; Var список переменных 2: тип 2; ...

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

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

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

 

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

 

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

Пример.

Составить программу для вычисления суммы квадратов натуральных чисел от 1 до n и оформить ее в виде процедуры.

Procedure Lux (N:Integer; Var Sum:Integer);

Var i:Integer;

Begin

Sum:=0;

For i:=1 To N Do Sum:=Sum + Sqr(i);

End;

Вызов процедуры в основной программе имеет вид

Lux ( 10,s );

Здесь s - переменная типа Integer.

 

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

Пример.

Перемножить две квадратные матрицы A и B. Результат занести в матрицу C. В основной программе описывается тип

Type Mat = Array [1..5, 1..5] Of Real;

и заголовок процедуры тогда может иметь вид

Procedure Umn (A,B:Mat; Var C:Mat);

 

Подпрограмма-функция

Подпрограмма-функция аналогична процедуре, но имеет следующие отличия.

1. Заголовок функции имеет вид

Function имя ( формальные параметры ): тип функции;

2. Функция имеет только один результат выполнения.

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

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

внутри выражения по ее имени с указанием фактических параметров.

Пример.

Оформить предыдущую задачу в виде функции:

Function Lux (N:Integer): Integer;

Var s,i: Integer;

Begin

S:=0;

For i:=1 To N Do S:=S + Sqr(i);

Lux:=S;

End;

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

W:=Lux (10);

Здесь W - переменная типа Integer.

 

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

 

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

 

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

Список параметров может и вовсе отсутствовать:

procedure proc1;

function func1: boolean;

В этом случае подпрограмма не получает никаких переменных "извне".

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

Если же параметры имеются, то каждый из них описывается по следующему шаблону:

[<способ_подстановки>]<имя_параметра>:<тип>;

Если способ подстановки и тип нескольких параметров совпадают, описание этих параметров можно объединить:

[<способ_подстановки>]<имя1>,...,<имяN>: <тип>;

Пример.

function func2(a,b:byte; var x,y,z:real; const c:char);

В заголовке подпрограммы можно указывать только простые (не составные) типы данных. Следовательно, попытка записать

procedure proc2(a: array[1..100]of char);

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

type arr = array[1..100] of char;

procedure proc2(a: arr);

function func2(var x: string): arr;

Возвращаемые значения

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

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

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

Пример.

function min(a,b: integer): integer;

begin if a>b

then min:= b

else min:= a

end;

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

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

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

<имя_подпрограммы>(<список_аргументов>)

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

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

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

Пример.

c:= min(a,a*2);

if min(z, min(x,y))= 0 then...;

 

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

Пример.

err(res,'Привет!');

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

 

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

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

 

СОДЕРЖАНИЕ РАБОТЫ: Написать алгоритм, составить блок-схему и отладить программу по вычислению бесконечной суммы с точностью 0,001, используя подпрограмму-функцию и подпрограмму-процедуру.

Вариант Задание Вариант Задание
№1, 11 №6, 16
№2, 12 №7, 17
№3, 13 №8, 18
№4, 14 №9, 19
№5, 15 №10, 20

ВОПРОСЫ ВЫХОДНОГО КОНТРОЛЯ:

1. Сформулируйте определение процедуры и функции.

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

3. Сформулируйте определение глобальной переменной.

4. Приведите пример использования локальных переменных.

5. Перечислите допустимые параметры, которые используются в Турбо Паскале.

ДОМАШНЕЕ ЗАДАНИЕ

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