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

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

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

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

Процедура – независимая именованная часть программы, которую можно вызвать по имени для выполнения определенных действий. Структура процедуры повторяет структуру программы. Процедура не может выступать как операнд в выражении. Упоминание имени процедуры в тексте программы приводит к активизации процедуры и называется ее вызовом. Например, Read(F) читает с клавиатуры некоторое значение и присваивает его переменной F.

Функция - аналогична процедуре, но имеются два отличия: функция передает в точку вызова скалярное значение; имя функции может входить в выражение как операнд. Например, Sqr(x) – возведет в квадрат значения целого или вещественного х и возвратит в точку вызова вычисленное значение квадрата числа х.

Все процедуры и функции языка Паскаль делятся на две группы: встроенные (стандартные), пользовательские.

Процедуры и функции пользователя

Задаются в описательной части программы. Вызываются в основной части (в разделе операторов).

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

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

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

Формальные параметры – параметры, определенные в заголовке подпрограммы.

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

Описание процедуры в ТР.

Описание процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного, заключенного в круглые скобки, списка формальных параметров с указанием типа каждого параметра. Формальные параметры отделяются точкой с запятой (список однотипных параметров может быть перечислен через запятую). Например, procedure P1(a: real; b,c: real). Имя процедуры – идентификатор, уникальный в пределах программы. Тело процедуры представляет собой локальный блок, по структуре аналогичен программе.

Формат:

procedure <имя> (список формальных параметров);

Const ...;

Type ...;

Var...;

begin

<операторы>;

end;

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

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

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

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

Например: f(n, fn);

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

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

program primer1;

var i,c,Sum:integer;

procedure St(M:string);

begin

writeln('Ошибка:',M);

halt(1);

end;

begin

c:=0;

Sum:=0;

while c<10 do

begin

c:=c+1;

write('введите ',c,'-e число: ');

readln(i);

if i<0 then St('введено отрицательное число');

Sum:=Sum+i;

end;

writeln('Сумма чисел равна ',Sum);

end.

Описание процедуры. В данной процедуре пользователя использована переменная М типа string, в которой хранится текст сообщения о характере ошибки, вызвавшей прерывание программы. Для прерывания выполнения программы используется стандартная процедура Halt.

Описание программы. В начале программы обнуляются значения количества введенных чисел с и их сумма Sum. Потом выполняется цикл, пока номер очередного вводимого числа меньше 10. Сначала устанавливается номер очередного числа, затем на экран выводится приглашение «Введите 1-е (2-е и т.п.) число», считывается значение числа с клавиатуры в переменную i. Затем проверяется условие I<0.

Если условие выполняется, то вызывается процедура St, которой передается фактический параметр-значение «введено отрицательное число». Это значение присваивается формальному параметру М процедуры St. процедура выводит на экран сообщение «Ошибка: введено отрицательное число», после чего вызывает стандартную процедуру Halt,которая прерывает выполнения программы.

Если условие I<0 не выполняется, то значение суммы увеличивается на значение введенного числа I, и управление передается в заголовок цикла для проверки условия. После окончания цикла на экран выводится значение суммы.

Описание функции в ТР.

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

Формат:

function <имя> (список формальных параметров): <тип результата>;

Const ...;

Type ...;

Var...;

begin

<операторы>;

end;

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

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

Формат:

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

Пример 2.

program primer2;

var x,y:real;

function tan(c:real):real;

begin

tan:=sin(c)/cos(c);

end;

begin

read(x,y);

writeln('tg(x)= ',tan(x));

writeln('tg(y)= ',tan(y));

end.

Формальные и фактические параметры

Можно выделить два основных класса формальных параметров:

· Параметры-значения;

· Параметры-переменные.

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

procedure S1(M:real);

function S2(c: real; x:integer): real;

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

Пример3:

program primer3;

var A,B:real;

procedure Sum(x,y:real);

begin

x:=x*x;

y:=y*y;

writeln('Сумма квадратов=',x+y);

end;

begin

A:=1.5;

B:=3.4;

Sum(A,B);

end.

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

procedure S1(var M,N: integer; var Y: real);

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

Пример4:

program primer4;

var A,B:real;

SumAB,SubAB:real;

procedure Sum_Sub(x,y:real; var Sum,Sub:real);

begin

Sum:=x*x+y*y;

Sub:=x*x-y*y;

end;

begin

A:=1.5;

B:=3.4;

Sum_Sub(A,B,SumAB,SubAB);

writeln('Сумма квадратов =',SumAB);

writeln('Разность квадратов =',SubAB);

end.

Пример5. Найдите суммы элементов массивов A(5) и B(7).

program primer5;

type mas=array [1..100] of integer;

var sumA,sumB,y:integer;

a,b:mas;

procedure VVOD(n:byte; var x:mas);

var i:integer;

begin

writeln('Введите ',n,' чисел);

for i:=1 to n do read(x[i]);

end;

procedure Summa(n:byte; x:mas; var sum: integer);

var i,S:integer;

begin

S:=0;

for i:=1 to n do S:=S+x[i];

Sum:=S;

end;

begin

VVOD(5,a);

VVOD(7,b);

Summa(5,a,sumA);

Summa(7,b,sumB);

writeln('Sa= ',sumA);

writeln('Sb= ',sumB);

end.

Пример6. Вычислить суммы всех элементов матриц А(n,n), B(m,m).

program primer6;

uses crt;

var T: array [1..10,1..10] of integer;

n,m: byte;

s: integer;

procedure VV(l: byte);

var i,j: byte;

begin

writeln('Vvedite massiv ',l,'x',l);

for i:=1 to l do

for j:=1 to l do read(T[i,j]);

end;

procedure Summa(l: byte; var s: integer);

var i,j: byte;

begin

S:=0;

for i:=1 to l do

for j:=1 to l do S:=S+T[i,j];

writeln('S= ',S);

end;

begin

clrscr;

writeln(Введите n,m');

readln(n,m);

VV(n);

VV(m);

Summa(n,s);

Summa(m,s);

end.

3. Описание функции в Си/С++.

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

Всякая задача может быть разбита на подзадачи, каждую из которых можно либо непосредственно представить в виде кода, либо разбить на еще более мелкие подзадачи. Данный метод носит название пошагового уточнения (stepwise refinement). Функции в Cи/С++ служат для записи программного кода этих непосредственно решаемых подзадач. Такие функции используются другими функциями, и в конечном счете — функцией main () для решения исходной задачи, с которой, всегда начинает выполняться программа на языке C++. Функции в C++ решают самые разнообразные задачи программирования. Некоторые функции, например getch () и rand (), поставляются в библиотеках. Другие могут быть написаны программистом.

В C++ код, описывающий, что делает функция, называется определением функции (function definition). Формально это выглядит так:

заголовок_функции { инструкции }

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

Заголовок функции — это:

тип имя(список_объявлений_параметров)

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

Вызов функции

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

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

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

Например вызов функции ожидания нажатия произвольной клавиши на клавиатуре - функция getch(), объявление которой находится в библиотеке conio.h, можно произвести следующим образом

.... getch(); ....

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

.... int i=2; double dbl=sqrt(i); cout << sqrt(5); ....

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

.... cout << 2*sqrt(3)+1; float res=sqrt(sqrt(7)/2)+10; ....

Пример 9.

/* Программа для введеных с клавиатуры трех чисел предлагает выполнить след. действия: проверить на четность, вычислить сумму,вычислить сред. арифметическое нечетных чисел */

#include < iostream.h >

// прототипы функции

int IsEven(int);/* функция проверяет число на четность*/

int abcMultiple (int, int, int);/* функция вычисляет сумму трех чисел */

float ArithMean(int, int, int);/* функция вычисляет среднее арифметическое нечетных чисел*/

// описания функций

void OutputMenu()/* функция выводит на экран меню программы*/

{

cout << "1. Ввод чисел "<<endl<<"2. Проверка чисел на четность " <<endl<<"3. Вычислить произведение"<<endl<<"4. Вычислить среднее арифметическое нечетных чисел "<<endl;

cout << " Выберите пункт меню ";

return;

}

int InputNumber()/* функция ввода числа в заданном диапазоне */

{

int number = 0;

do

{

cout << " Введите целое число в диапозоне от 0 до 500: ";

cin >> number;

} while( number < 0 || number > 500);

return number;

}

void main()

{

int a = 0, b = 0, c = 0, /* объявление и инициализация переменных

целого типа для хранения чисел, введенных пользователем с клавиатуры*/

menuVal = 0; /* объявление и инициализация переменной целого

типа для хранения значения выбранного пункта меню */

do

{

OutputMenu(); /*вызов функции OutputMenu*/

cin >> menuVal;

switch (menuVal)

{

case 1: /* Метка соответствует задаче первого пункта меню */

a = InputNumber();

cout << " a = " << a;

b = InputNumber();

cout << " b = " << b;

c = InputNumber();

cout << " c = " << c;

break;

case 2: /* Метка соответствует задаче второго пункта меню */

if ( IsEven(a) ) cout << " а = " << a << " - четное";

if ( IsEven(b) ) cout << " b = " << b << " - четное";

if ( IsEven(c) ) cout << " c = " << c << " - четное";

break;

case 3: /* Метка соответствует задаче третьего пункта меню */

cout << " Произведение a*b*c = "

<< abcMultiple(a, b, c);

break;

case 4: /* Метка соответствует задаче четвертого пункта меню */

cout << " Среднее арифметическое нечетных чисел = "

<< ArithMean(a, b, c);

break;

default: /* В случае, если пользователь ввел значение вне диапозона 1-4 */

cout << "Будьте внимательней."

" Имеется всего 4 пункта меню :)";

}

cout << " Дальше? "

"0 - Нет, 1 - Да ";

cin >> menuVal;

}while(menuVal);

return;

}

// описания функций, прототипы функций объявлены выше

int IsEven(int val)

{

int valIsEven = val%2 ? 0 : 1;

return valIsEven;

}

int abcMultiple (int a, int b, int c)

{

return a*b*c;

}

float ArithMean(int val1, int val2, int val3)

{ int Sum = 0, count = 0;/* объявляем вспомогательные переменные

для вычисления среднего арифметического Sum/count */

if ( !IsEven(val1) )

{

count ++;

Sum += val1;

}

if ( !IsEven(val2) )

{

count ++;

Sum += val2;

}

if ( !IsEven(val3) )

{

count ++;

Sum += val3;

}

if ( count ) return float(Sum)/count;

else return 0;

}

Описание типов функций

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

1. Описать тип функции в ее определении:

char pun(ch, n) /* функция возвращает символ */int n;char ch; float raft(num) /* функция возвращает величину типа float */int num;

2. Описать тип функции также в вызывающей программе. Описание функции должно быть приведено наряду с описаниями переменных программы; необходимо только указать скобки (но не аргументы) для идентификации данного объекта как функции.

main( ){ char rch, pun( );float raft; }

Запомните! Если функция возвращает величину не типа int, указывайте тип функции там, где она определяется, и там, где она используется.

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

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

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

Аргументы по умолчанию

Формальному параметру функции может быть задан аргумент по умолчанию (default argument). Обычно это константа, которая часто встречается при вызове функции. Использование аргумента по умолчанию позволяет не писать его значение при каждом вызове. Следующая функция вычисления степени целого числа демонстрирует сказанное:

int sqr_or_power(int n, int k = 2) //k = 2 по умолчанию { if (k == 2) return (n * n) ; else return pow(n,k) ; }

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

sqr_or_power(i + 5); //вычислит (i + 5) * (i + 5) sqr_or_power (i + 5, 3); //вычислит (i + 5) в кубе

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

void foot (int i, int j = 7) ;//допустимо void foot (int i, int j = 2, int k) ; //недопустимо void foot (int i, int j = 3, int k = 7) ; //допустимо void foot (int i = 1, int j = 2, int k = 3); //допустимо void foot (int i=- 3, int j); //недопустимо

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

Прототипы функций

Язык C++ позволяет использовать прототипы функций. По сути, возвращаемый тип, идентификатор функции и типы параметров с обязательной точкой с запятой в конце составляют прототип функции. Прототип функции (function prototype) — это объявление функции, но не ее определение. Благодаря явному объявлению возвращаемого типа и списка типов аргументов, в C++ при обращении к функции возможны строгая проверка типов и неявные преобразования типов.

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

тип имя(список_объявлений_аргументов);

список_объявлений_ аргументов может быть пустым, содержать единственное объявление или несколько объявлений, разделенных запятыми. Если функция не имеет параметров, допускается использование ключевого слова void. В C++ функция с пустым списком параметров выглядит как имя_функции(). Такая информация позволяет компилятору отслеживать совместимость типов. Аргументы преобразуются к указанным в объявлении типам так же, как в случае присваивания.

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

int min(int, int) ;

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

int min(int x, int у);

В C++ используется эллипсический символ (ellipsis) (...) для обозначения списка аргументов, который не указан, но подразумевается. Функция printf () из стандартной библиотеки stdio.h имеет следующий прототип:

int printf(const char* cntrl_str, ...);

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

Пример 10. Программа, иллюстрирующая применение прототипов функций.

//Сложение трех целых — иллюстрация прототипов функций #include <iostream.h>int add3(int, int, int);double average(int);void main() {int score_l, score_2, score_3, sum;cout << "Enter three marks: ";cin >> score_l >> score_2 >> score_3;sum = add3(score_l, score_2, score_3);cout << "Sum= " << sum;cout << " Average= " << average(sum);sum = add3(1.5 * score_l, score_2, 0.5 * score_3);cout << "Weight sum= " << sum << ".";cout << "Weight average= " << average(sum) << "." << "n";}int add3(int a, int b, int с){ return (a + b + с); } double average(int s) { return (s / 3.0); }

Разбор программы

int add3(int, int, int) ; double average(int);

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

sum = add3(1.5 * score_l, score_2, 0.5 * score_3);

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

int add3(int a, int b, int с) { return (а + b + с) ; }

Это определение функции соответствует объявлению прототипа функции перед main ().

Так как список аргументов в прототипе функции может включать имена переменных,

int add3(int а, int b, int с) ;

тоже допустимо.

Варианты заданий:

1. Вычислить Имена функций подчиняются тем же ограничениям, что и имена переменных. - student2.ru , где S1 и k1 - сумма и количество положительных элементов массива X(8); S2 и k2 - сумма и количество положительных элементов массива Y(10).

2. Вычислить Имена функций подчиняются тем же ограничениям, что и имена переменных. - student2.ru , где S1 и k1 - сумма и количество положительных элементов массива X(10); S2 и k2 - сумма и количество отрицательных элементов массива Y(8).

3. Вычислить суммы элементов каждой строки матриц А(n,n), B(m,m).

4. Найти наибольшие элементы и их порядковые номера массивов X(10) и Y(7).

5. Вычислить суммы положительных элементов каждой строки матриц А(n,n), B(m,m).

6. Вычислить суммы отрицательных элементов каждого столбца матриц А(n,n), B(m,m).

7. Найти наименьшие элементы и их порядковые номера массивов А(5) и В(10).

8. Найти наименьшие элементы для матриц A(3,4) и B(4,5).

9. Вычислить Имена функций подчиняются тем же ограничениям, что и имена переменных. - student2.ru , где xmax и xmin – максимальный и минимальный элементы массива X(10), где ymax и ymin – максимальный и минимальный элементы массива Y(8). Максимальный и минимальный элементы массива вычислять в одной подпрограмме.

10. Преобразовать массивы X(12) и Y(10), расположив в них подряд только положительные элементы. Вместо остальных элементов записать нули.

11. Вычислить среднее арифметическое положительных элементов для массивов A(n1), A(n2), A(n3).

12. Подсчитать количество элементов матриц X(n1,m1) и Y(n2,m2), удовлетворяющих условиям 0 ≤ xij ≤ 1 и 0 ≤ yij ≤ 1.

13. Вычислить суммы элементов главных диагоналей матриц A(n,n) и B(m,m).

14. Вычислить Имена функций подчиняются тем же ограничениям, что и имена переменных. - student2.ru , где S1 - сумма положительных элементов массива X(8); S2 - сумма отрицательных элементов массива Y(10). Обе суммы вычислять в одной подпрограмме.

15. Вычислить суммы элементов, стоящих выше главных диагоналей матриц A(n,n) и B(m,m).

16. Вычислить произведения элементов побочных диагоналей мат­риц A(n,n) и B(m,m).

17. Вычислить Имена функций подчиняются тем же ограничениям, что и имена переменных. - student2.ru , где xi и yi заданы массивами. Все суммы вычислять в одной подпрограмме.

18. Найти минимальный элемент для каждой строки матриц A(n,n) и B(m,m).

19. Найти максимальный элемент для каждого столбца матриц A(n,n) и B(m,m).

20. Вычислить суммы элементов, стоящих ниже главных диагоналей матриц A(n,n) и B(m,m).

  1. Вычислить сумму: 1!+2!+3!+…+n!, используя процедуру вычисления факториала числа k!.
  2. Даны координаты двух отрезков (x1, y1), (x2,y2). Определить какой из Имена функций подчиняются тем же ограничениям, что и имена переменных. - student2.ru отрезков длиннее. Вычисление длины отрезка оформить подпрограммой. Длина отрезка вычисляется по формуле Имена функций подчиняются тем же ограничениям, что и имена переменных. - student2.ru .
  3. Найдите сумму элементов четных и сумму нечетных строк матриц A(n,n) и B(m,m).
  4. Найдите произведения элементов четных и нечетных столбцов мат­риц A(n,n) и B(m,m).
  5. Найдите средние значения элементов каждой строки матриц A(n,n) и B(m,m).
  6. Замените элементы главных диагоналей матриц A(n,n) и B(m,m) на 0 , а все остальные элементы матриц на 1.

27. Вычислить Имена функций подчиняются тем же ограничениям, что и имена переменных. - student2.ru , где k1 и k2 - количество четных элементов массивов X(n) и Y(m).

28. Вычислить Имена функций подчиняются тем же ограничениям, что и имена переменных. - student2.ru , где где S1 и k1 - сумма и количество нечетных элементов массива X(n); S2 и k2 - сумма и количество нечетных элементов массива Y(m).

Рекомендуемая литература:

1. И.Г.Семакин, А.П.Шестаков «Основы алгоритмизации и программирования»: учебник для студ. сред. проф. образования / М.: Издательский центр «Академия», 2008.

2. Васильев П.П. «Турбо Паскаль в примерах и задачах: Освой самостоятельно»: Учеб. пособие.-М.: Финансы и статистика, 2003.

3. Долгов А.И. Алгоритмизация прикладных задач/А.И.Долгов – М.: Флинта, 2011.-136с.

4. Кауфман В.Ш. Языки программирования. Концепции и принципы/ В.Ш Кауфман – М.:ДМК-Пресс, 2010.-464с.3. Браун С. Visual Basic 6/ Питер, 2005. –573с.

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

6. Основы алгоритмизации и программированияО. Л. Голицына, И. И. Попов, Издательство: Форум, 2008, 432 с.

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

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

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

Процедура – независимая именованная часть программы, которую можно вызвать по имени для выполнения определенных действий. Структура процедуры повторяет структуру программы. Процедура не может выступать как операнд в выражении. Упоминание имени процедуры в тексте программы приводит к активизации процедуры и называется ее вызовом. Например, Read(F) читает с клавиатуры некоторое значение и присваивает его переменной F.

Функция - аналогична процедуре, но имеются два отличия: функция передает в точку вызова скалярное значение; имя функции может входить в выражение как операнд. Например, Sqr(x) – возведет в квадрат значения целого или вещественного х и возвратит в точку вызова вычисленное значение квадрата числа х.

Все процедуры и функции языка Паскаль делятся на две группы: встроенные (стандартные), пользовательские.

Процедуры и функции пользователя

Задаются в описательной части программы. Вызываются в основной части (в разделе операторов).

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

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

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

Формальные параметры – параметры, определенные в заголовке подпрограммы.

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

Описание процедуры в ТР.

Описание процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного, заключенного в круглые скобки, списка формальных параметров с указанием типа каждого параметра. Формальные параметры отделяются точкой с запятой (список однотипных параметров может быть перечислен через запятую). Например, procedure P1(a: real; b,c: real). Имя процедуры – идентификатор, уникальный в пределах программы. Тело процедуры представляет собой локальный блок, по структуре аналогичен программе.

Формат:

procedure <имя> (список формальных параметров);

Const ...;

Type ...;

Var...;

begin

<операторы>;

end;

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

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

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

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

Например: f(n, fn);

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

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

program primer1;

var i,c,Sum:integer;

procedure St(M:string);

begin

writeln('Ошибка:',M);

halt(1);

end;

begin

c:=0;

Sum:=0;

while c<10 do

begin

c:=c+1;

write('введите ',c,'-e число: ');

readln(i);

if i<0 then St('введено отрицательное число');

Sum:=Sum+i;

end;

writeln('Сумма чисел равна ',Sum);

end.

Описание процедуры. В данной процедуре пользователя использована переменная М типа string, в которой хранится текст сообщения о характере ошибки, вызвавшей прерывание программы. Для прерывания выполнения программы используется стандартная процедура Halt.

Описание программы. В начале программы обнуляются значения количества введенных чисел с и их сумма Sum. Потом выполняется цикл, пока номер очередного вводимого числа меньше 10. Сначала устанавливается номер очередного числа, затем на экран выводится приглашение «Введите 1-е (2-е и т.п.) число», считывается значение числа с клавиатуры в переменную i. Затем проверяется условие I<0.

Если условие выполняется, то вызывается процедура St, которой передается фактический параметр-значение «введено отрицательное число». Это значение присваивается формальному параметру М процедуры St. процедура выводит на экран сообщение «Ошибка: введено отрицательное число», после чего вызывает стандартную процедуру Halt,которая прерывает выполнения программы.

Если условие I<0 не выполняется, то значение суммы увеличивается на значение введенного числа I, и управление передается в заголовок цикла для проверки условия. После окончания цикла на экран выводится значение суммы.

Описание функции в ТР.

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

Формат:

function <имя> (список формальных параметров): <тип результата>;

Const ...;

Type ...;

Var...;

begin

<операторы>;

end;

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

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

Формат:

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

Пример 2.

program primer2;

var x,y:real;

function tan(c:real):real;

begin

tan:=sin(c)/cos(c);

end;

begin

read(x,y);

writeln('tg(x)= ',tan(x));

writeln('tg(y)= ',tan(y));

end.

Формальные и фактические параметры

Можно выделить два основных класса формальных параметров:

· Параметры-значения;

· Параметры-переменные.

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

procedure S1(M:real);

function S2(c: real; x:integer): real;

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

Пример3:

program primer3;

var A,B:real;

procedure Sum(x,y:real);

begin

x:=x*x;

y:=y*y;

writeln('Сумма квадратов=',x+y);

end;

begin

A:=1.5;

B:=3.4;

Sum(A,B);

end.

Параметры-переменныеиспользуются для определения результатов выполнения процедуры и в списке форм

Наши рекомендации