субота, 25 листопада 2017 р.

11 клас. С++

C  + +           Л Е К Ц І Я   3
ОПЕРАТОРЫ ЦИКЛА

Язык Си имеет три конструкции, реализующие операторы цикла: for, while, do-while.

1. ОПЕРАТОР for

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

Синтаксис:
   for (<выражение инициализации>; <условное выражение>; <выражение цикла>)
                <тело оператора>;

Параметры цикла for, заключенные в скобки, должны разделяться точкой с запятой (позиционный параметр), которая делит в свою очередь пространство внутри скобок на три сектора.
Тело  оператора  for  выполняется  нуль и более раз до тех пор, пока условное выражение <условное выражение> не станет  ложным.
Выражения инициализации <выражение инициализации> и цикла <выражение цикла> могут быть использованы для инициализации и модификации величин во время выполнения оператора for.
Первым шагом при выполнении оператора for является вычисление выражения инициализации, если оно имеется. Далее вычисление продолжается в зависимости от значения условного выражения:
1. Если условное выражение истинно (не равно нулю), то выполняется тело оператора.  Потом вычисляется  выражение  цикла (если оно есть). Процесс повторяется снова с вычислением условного выражения.
2.  Если условное выражение опущено, то его значение принимается за истину и процесс выполнения продолжается, как описано выше. В этом случае оператор for может завершиться только при выполнении в теле оператора операторов break, goto, return.
3. Если условное выражение ложно, то выполнение оператора for заканчивается и управление передается следующему оператору в программе.
Оператор for может завершиться  при  выполнении  операторов break, goto, return в теле оператора. В некоторых случаях использование оператора запятая (,) позволит вводить составные выражения в оператор цикла for.
                
Пример 1. Вычислить сумму чисел от 1 до 100.

for (s=0,i=1;i<=100;i++)
  s = s + i;

Выражение инициализации обнуляет переменную суммы s и присваивает 1 переменной i. Операторы, записанные через запятую, выполняются последовательно. Выражение цикла прибавляет 1 к переменной i, а в теле цикла происходит суммирование переменных s и i. Цикл завершает свою работу когда переменная i достигнет значения 101. То есть последним числом, которое будет прибавлено к переменной s, будет 100. В конце работы оператора for переменная s будет содержать число 5050 – сумму натуральных чисел от 1 до 100.

Пример 2. Тело цикла, которое не выполняется

for (s=0,i=1;i<1;i++)
  s = s + i;

Если в предыдущей программе заменить условное выражение на i < 1, то тело цикла никогда не выполнится. После инициализации s = 0, i = 1 будет проверено условное выражение i < 1. И поскольку оно ложно, то управление программой перейдет на следующий за for оператор.

Пример 3. Для заданного натурального n вычислить сумму S=1/1 + 1/2 + 1/3 + … + 1/n
Сумму будем вычислять в переменной s, имеющей тип double. Каждое слагаемое имеет вид  1/i. На языке Си это выражение можно записать как 1.0 / i . В качестве числительного следует писать 1.0, а не 1, так как результат деления должен быть действительным. В цикле последовательно прибавляем к нулю все слагаемые 1.0 / i  для i от 1 до n.

#include <stdio.h>
int i,n;
double s;
void main(void)
{
  scanf("%d",&n);
  s = 0;
  for(i=1;i<=n;i++)
    s += 1.0 / i ;
  printf("%lf\n",s);
}

Упражнение 1. Ввести 10 цілих чисел. Знайти суму та кількість додатніх чисел.
Упражнение 2. Ввести n цілих чисел. Знайти середнє арифметичне парних чисел.


2. ОПЕРАТОР while

В конструкции while вычисляется выражение. Если его значение отлично от нуля (истинно), то выполняется тело оператора и выражение вычисляется снова. Этот цикл продолжается до тех пор, пока значение выражения не станет нулем, после чего выполнение программы продолжается с места после тела оператора.
 Синтаксис:
    while (<выражение>) <тело оператора>;

Пример 1. Вычислить сумму чисел от 1 до 100.

#include <stdio.h>
int s, i;
void main(void)
{
  s = 0; i = 100;
  while(i > 0)
  {
    s = s + i;
    i--;
  }
  printf("%d\n",s);
}

Изначально значение суммы s положили равным нулю. В переменной i содержится очередное слагаемое, которое будет прибавляться к сумме s. Первым таким слагаемым будет i = 100. Пока выражение, заключенное в круглые скобки цикла while будет истинным, совершается тело цикла. В теле цикла к сумме s прибавляется слагаемое i и это слагаемое уменьшается на 1. Цикл закончит свое выполнение, когда слагаемое i станет равным нулю и не будет выполняться условие i > 0.

Операторы можно разделять запятой (‘,’), тогда они будут выполняться последовательно. Если два оператора в теле цикла while объединить в последовательное выполнение, то можно не брать в фигурные скобки тело цикла:

#include <stdio.h>
int s, i;
void main(void)
{
  s = 0; i = 100;
  while(i > 0)
    s += i, i--;
  printf("%d\n",s);
}

Виконати Пример 3, Упражнение 1 та Упражнение 2.

1.3. ОПЕРАТОР do-while

Оператор цикла do-while проверяет условие окончания в конце, после каждого прохода через тело цикла; тело цикла всегда выполняется по крайней мере один раз. Сначала выполняется тело оператора, затем вычисляется выражение. Если оно истинно, то тело оператора выполняется снова и т.д. Если выражение становится ложным, цикл заканчивается.
Синтаксис:
do <тело оператора> while (<выражение>);
               
Тело оператора do выполняется один или несколько раз до тех пор, пока выражение <выражение>  станет  ложным  (равным  нулю). Вначале  выполняется <тело оператора>, затем вычисляется <выражение>. Если выражение ложно, то оператор do  завершается и управление передается следующему оператору в программе.  Если  выражение  истинно  (не равно нулю), то тело оператора выполняется снова и снова проверяется выражение. Выполнение  тела оператора  продолжается  до  тех  пор,  пока  выражение не станет ложным.
               
Пример 1. Вычислить сумму чисел от 1 до 100.

#include <stdio.h>
int s, i;
void main(void)
{
  s = 0; i = 100;
  do {
    s = s + i;
    i--;
  } while (i > 0);
  printf("%d\n",s);
}

В переменной s накапливается сумма, переменная i принимает все значения от 100 до 1. В теле цикла происходит прибавление значения i к сумме s и уменьшение i на 1. Цикл повторяется пока выражение (i > 0) истинно. Как только значение переменной i станет равным 0, цикл завершается и управление передается следующей команде.

Виконати Пример 3, Упражнение 1 та Упражнение 2.


2. МНОГОКРАТНЫЙ ВВОД – ВЫВОД

Различают однократный ввод (single input) и многократный ввод (multiple input). Однократный ввод характеризуется данными для одного теста. Если на вход подаются данные для нескольких тестов, то говорят о многократном вводе. Рассмотри два примера.

Пример 1. На вход подаются два числа a и b. Найти их сумму.
Для решения задачи достаточно ввести два числа, найти их сумму и вывести результат.

Пример 2. На вход подаются несколько строк. Первая строка содержит количество тестов n. Каждая из следующих n строк содержит два числа a и b. Для каждого теста найти сумму двух чисел и вывести ее в отдельной строке.
Читаем в переменную n количество тестов. Далее в цикле для каждой входной строки вводим слагаемые a и b, находим их сумму и выводим на экран.

#include <stdio.h>
int i, a, b, n;
void main(void)
{
  scanf("%d",&n);
  for(i = 0; i < n; i++)
  {
    scanf("%d %d",&a,&b);
    printf("%d\n",a + b);
  }
}

Цикл можно организовать и при помощи конструкции while. В таком случае вводить дополнительную переменную i нет необходимости:

#include <stdio.h>
int a, b, n;
void main(void)
{
  scanf("%d",&n);
  while(n--)
  {
    scanf("%d %d",&a,&b);
    printf("%d\n",a + b);
  }
}

Цикл while будет продолжаться до тех пор, пока выражение n-- будет оставаться истинным. А это будет выполняться до тех пор, пока n не станет равным 0.

Самостійно написати цю програму для циклу do-while.

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

Функция scanf не только вводит данные, но и возвращает целочисленное значение, равное количеству прочитанных аргументов. То есть если записать выражение
i = scanf("%d %d",&a,&b);
и ввести два числа a и b, то переменная i примет значение 2. Это свойство функции очень удобно использовать при чтении данных до конца файла. Дело в том, что если программа прочитает все данные и дойдет до конца файла, то при следующем вызове функции scanf она вернет значение, равное -1.
#include <stdio.h>
int a, b;
void main(void)
{
  while(scanf("%d %d",&a,&b) == 2)
    printf("%d\n",a + b);
}

В цикле while читаем два числа a и b. Пока вводятся два числа, scanf возвращает 2 и выполняется тело цикла (печать суммы чисел). Кодга дойдем до конца файла, функция scanf не сможет прочитать следующие два числа и вернет -1. Выполнение цикла закончится.

Напоминание! При чтении данных с консоли ввести символ “конец файла” можно, нажав комбинацию клавиш ^Z.

Пример 2. На вход подаются несколько строк. Каждая строка содержит два неотрицательных целых числа a и b. Для каждой строки вывести сумму двух чисел, находящихся в ней. Последняя строка содержит два нуля и не обрабатывается.
Пример отличается от предыдущего тем, что окончание работы цикла следует произвести не по достижению конца файла, а при прочтении значений a = 0, b = 0.

#include <stdio.h>
int a, b;
void main(void)
{
  while(scanf("%d %d", &a, &b), a + b)
    printf("%d\n", a + b);
}

Условное выражение цикла while состоит из двух частей: функции scanf и выражения a + b. Цикл продолжается до тех пор, пока оба выражения остаются истинными. Очевидно, что функция scanf всегда будет возвращать 2 (поскольку до конца файла при обработке данных в этой задаче мы не дойдем), а значение a + b будет оставаться истинным пока оба значения a и b не станут равными 0 (по условию a и b целые неотрицательные).

Напоминание! Арифметическое выражение является истинным, если оно не равно 0.

Упражнение 3. [Вычислить сумму всех нечетных чисел из интервала [a, b]. Например, сумма нечетных чисел из интервала [3, 9] равна 3 + 5 + 7 + 9 = 24.
Вход. Первая строка содержит количество тестов T є N. Каждый тест состоит из двух чисел a  и b (дійсні числа).
Выход. Для каждого теста вывести его номер и сумму всех нечетных чисел из интервала [a, b].
Пример входа
Пример выхода
2
Nomber 1 - Sum 9
1   5
Nomber 2 - Sum 15
3   7



3. ФОРМАТИРОВАННЫЙ ВВОД-ВЫВОД

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

тип
формат
int
%<n>d
float
%<n>.<m>f
double
%<n>.<m>lf

Здесь <n> и <m> – некоторые целые неотрицательные числа. Значение переменной выводится в <n> позициях. При выводе значения действительного типа после десятичной запятой выводится <m> знаков, десятичная точка занимает одну позицию. Если <n> больше чем количество цифр в выводимом значении, то перед числом выводятся пробелы. Если <n> меньше чем количество цифр в выводимом значении, то значение выводится с таким количеством цифр, которое оно содержит.

переменная
формат вывода
выводимое значение
int a = 456
%1d
456
int a = 456
%3d
456
int a = 456
%5d
  456
float s = 34.1223
%3.2f
34.12
float s = 34.1223
%7.3f
 34.122
float s = 34.1223
%8.4f
 34.1223
float s = 34.1223
%9.4f
  34.1223
double d = 1.123456789
%5.3lf
1.123
double d = 1.123456789
%7.5lf
1.12346
double d = 1.123456789
%12.9lf
 1.123456789
double d = 1.123456789
%15.11lf
  1.12345678900

Если <m> = 0, то действительное число при выводе округляется до целого значения.

Пример 3. Вывести таблицу умножения 9*9. Каждое число в таблице должно занимать две позиции, между числами в одной строке должен находиться один пробел.
Приведенный пример показывает, как можно форматировать табличный вывод. Используя двойной цикл, построчно выводим требуемую таблицу.

for(i = 1; i < 10; i++)
{
  for(j = 1; j < 10; j++)
    printf("%2d ", i*j);
  printf("\n");
}

Пример 4. На вход подается квадратная матрица размером n * n (n < 10), каждый элемент которой представляет собой цифру. Первая строка задает n, следующие строки описывают матрицу. Необходимо найти сумму всех чисел матрицы.
Пример входа
Пример выхода
3
1 1 1
2 2 2
3 3 3
18

Для чтения однозначных чисел следует воспользоваться форматом “%1d”:

#include <stdio.h>
int s, a, n, i, j;
void  main(void)
{
  s=0;
  scanf("%d",&n);
  for(i = 0; i < n; i++)
    for(j = 0; j < n; j++)
    {
      scanf("%1d ", &a);
      s += a;
    }
  printf("%d\n", s);
}

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


Тема 3. Підпрограми-функції

Процедури-функції
1. Задається функція так:
Function <ім'я функції>(<список формальних параметрів>):<тип результату>;

2. У тілі функції обов'язково повинен бути оператор присвоєння виду:
<ім'я функції>:=<вираз>

3. Результат виконання функції потрібно присвоїти відповідній змінній.

Параметрце змінна, яка використовується для обчислення значення функції. Відмінність параметру від звичайної змінної полягає в тому, що він описується не в розділі опису змінних, а в заголовку функції. Конкретне значення параметр отримує під час роботи програми при викликанні функції з основної програми.
Список формальних параметрів використовується для передачі даних в підпрограму – функцію. Після імені змінної чи групи імен змінних йде двокрапка і записується тип цих змінних.
Тип результатуце тип значення, яке функція повертає у викликаючу її програму.
В розділі операторів знаходиться хоча б один оператор, який присвоює імені функції деякий вираз.

Приклад: Порахувати суму двох чисел.
Program Dem_fun;
Var x1,x2,x:Real;
Function Fsum(a,b:Real):Real;
Begin
  Fsum:=a+b
End;
Begin
  Write (‘вв.2 числа’)
  Read(x1, x2);
  X:=Fsum(x1,x2);
  Write (x1,’+’,x2,’=’,x)
End.
Виклик функції користувача здійснюється аналогічно тому, як і виклик будь-якої функції   X:=Fsum(x1,x2).

Задача: по заданих дійсних значеннях x і y обчислити u=max(x+y,x*y), v=max(0.5,u).

Програма розв'язку цієї задачі з використанням функції:

Program Max3;
Var x,y,u,v:real;
Function Max(r1,r2:real):real;
Begin
 If r1>r2 then max:=r1 else max:=r2
End;
Begin
 Read(x,y);
 U:=Max(x+y,x*y);
 V:=Max(0.5,u);
 Writeln(u,v)
End.

Приклад. Скласти програму з використанням функцій та процедур з параметрами: порахувати суму елементів матриць a,b,c розміру 3´4, що містить дійсні елементи.

program PR2;
const m =3; n = 4;
type matr= array[1..3,1..4] of real;
var  a,b,c:matr; s1,s2,s3:real;

procedure Vvid(var d:matr);
var i, j: integer;
 begin
           for i: = 1 to 3 do
             for j: = 1 to 4 do
                 read(d[i, j]);
 end;

function SUM(d:matr):real;
var s:real;
begin s: =0;
    for i: = 1 to 3 do      
        for j: = 1 to 4 do
            s: = s + d[i, j];
    sum:=s;
 end;

begin  
      Vvid(a);  s1:=SUM(a); writeln (‘s1=’, s1);
      Vvid(b);  s2:=SUM(b); writeln (‘s2=’, s2);
      Vvid(c);  s3:=SUM(c); writeln (‘s3=’, s3);
end.

Підручник : ст. 206(Виклик з однієї процедури іншої),ст. 209, 211-212(функції), ст. 217=219(рекурсія).

Д./з. 1
1. Ввести вектори a,b,c з n дійсних елементів. Всі елементи, які належать проміжку [-5,5], замінити на максимальний елемент відповідного вектора. Вивести утворені вектори.Використати процедури.
2. Ввести ціле число x. Обчислити u = min(x,x2), v = min(0.2,u), використовуючи функції.
3. Ввести дійсні числа a,b,c. Якщо трикутник з такими сторонами існує, то знайти його площу (задати дві функції: для визначеня існування трикутника та знаходження площі). Підказка на ст.212.


Д./з. 2 (Використовуючи функції)
1. Порахувати середнє арифметичне додатніх елементів кожного з векторів a,b,c, які складаються з n дійсних елементів.
2. Порахувати кількість елементів, що належать проміжку [-6,6] кожного з векторів a,b,c, які складаються з n дійсних елементів. Також знайти максимальний елемент кожного з цих векторів.



субота, 11 листопада 2017 р.

Тема 1. Підпрограми. Процедури без параметрів

Підпрограми
Часто, працюючи над програмою, програміст помічає, що деяка послідовність команд, зустрічається в різних частинах програми декілька разів. Можна запобігти дублюванню коду в програмі. Для цього потрібно оформити команди, які зустрічаються декілька разів як підпрограму і замінити команди, оформлені як підпрограма командою виклику підпрограми.
Важливим принципом програмування є принцип модульності. В модульній програмі окремі її частини, призначені для розвязування часткових задач, організовані в підпрограми.
Підпрограмою називається самостійний фрагмент програми, який має ім’я та оформлений певним чином.
Модульний принцип організації програм має дві великі переваги :
1.             один і той же фрагмент можна використовувати багаторазово в різних програмах, не набираючи текст наново;
2.             програми краще писати невеликими частинами.
В мові Паскаль модульність забезпечується використанням підпрограм – процедур, підпрограм – функцій і модулів.

По структурі процедура і функція аналогічні самій програмі: є заголовок, може бути присутній один із розділів опису, який передбачений в основній програмі, і тіло процедури, яке являє собою сукупність операторів, закріплених в операторні дужки begin-end, а в кінці ставиться крапка з комою.
Як видно із синтаксичних діаграм, розрізняють процедури з параметром і без параметрів (це ті, де відсутній список формальних параметрів). Виклик процедури здійснюється шляхом вказування імені процедури і списку фактичних параметрів.

Процедури без параметрів
Процедура вводиться у використання (визначається) за допомогою опису процедури в розділі процедур і функцій програми:<заголовок процедури>;<блок>;
Заголовок процедури починається із службового слова procedure, містить ім’я процедури.
Для активізації процедури (тобто для виконання фрагменту програми, оголошеного процедурою) в потрібному місці програми служить оператор процедури:
<ім'я процедури>;
Різні особливості опису процедур і способи їх використання будемо розглядати на прикладі такої задачі.
Задача: по заданих дійсних значеннях x і y обчислити u=max(x+y,x*y), v=max(0.5,u).
запишемо цю програму в такому вигляді:
program MAX2;
var x, y, u, v, a, b, s: real;
begin read (x, y);
a: = x + y; b: = x*y;
if a > b then s: = a else s: = b;
u: = s;
a: = 0.5; b: = u;
if a > b then s: = a else s: = b;
v: = s;
writeln (‘u=’, u, ‘v=’, v)
end.
Тут  два умовні оператори співпадають. Щоб не записувати цей оператор два рази, оголосимо його процедурою з ім’ям MAXPR:
program MAX3;
var x, y, u, v, a, b, s: real;
procedure MAXPR;
begin if a > b then s: = a else s: = b end;
begin read (x, y);
a: = x + y; b: = x*y;
MAXPR;
u: = s;
a: = 0.5; b: = u;
MAXPR;
v: = s;
writeln (‘u=’, u, ‘v=’, v)
end.

Приклад. Скласти програму з використанням процедур без параметрів: порахувати суму елементів матриці розміру 3´4, що містить дійсні елементи.

program PR2;
const m =3; n = 4;
var  i, j: integer;a:array[1..3,1..4] of real; s:real;

procedure Vvid;
 begin
           for i: = 1 to 3 do
             for j: = 1 to 4 do
                 read(a[i, j]);
 end;

procedure SUM;
 begin s: =0;
    for i: = 1 to 3 do      
        for j: = 1 to 4 do
           s: = s + a[i, j];
 end;

begin  
               Vvid;
      SUM;
      writeln (‘s=’, s);
end.

Підручник : ст. 201-203.
Д./з.
1. Ввести ціле число x. Обчислити u = min(x,x2), v = min(0.2,u).
2. Порахувати суму і кількість додатніх елементів кожного з трьох векторів, які складаються з n дійсних елементів.


Тема 2. Процедури з параметрами

Процедури з параметрами
Задача: по заданих дійсних значеннях x і y обчислити u=max(x+y,x*y), v=max(0.5,u).
Програма розв'язку цієї задачі з використанням процедур з параметрами:

Program Max3;
Var x,y,u,v:real;
Procedure Max(r1,r2:real;var res:real);
Begin
 If r1>r2 then res:=r1 else res:=r2
End;
Begin
 Read(x,y);
 Max(x+y,x*y,u);
 Max(0.5,u,v);
 Writeln(u,v)
End.
r1, r2 – формальні параметри процедури, бо вони представляють не якісь конкретні значення, а значення “взагалі”. При кожному зверненні до процедури її формальні параметри конкретизуються.
Оскільки формальні параметри мають тип real, то фактичним параметром може бути будь-який арифметичний вираз.
Встановлюється відповідність між формальними і фактичними параметрами.
r1, r2 називаються параметрами-значеннями, оскільки кожний з них у тілі процедури набуває значення, яке йому задають під час звертання за допомогою відповідного фактичного параметра.
Формальний параметр res відрізняється від r1, r2. Це не значення, а змінна.
Щоб відрізнити параметр-змінну від параметра-значення, перед ним в списку формальних параметрів записується службове слово var. Для параметра-змінної фактичним параметром може бути тільки змінна!

Принцип локалізації: імена, що вводяться в будь-якій процедурі, мають силу тільки в цій процедурі.
Формальні параметри. Ці змінні існують тільки на час виконання тіла процедури, а після виходу з процедури вони припиняють своє існування.
Глобальні ідентифікатори в тілі процедури мають той самий зміст, що і до моменту входу в процедуру.
Локальні ідентифікатори. Це ідентифікатори, що не є формальними парметрами, але описані в тілі процедури і діють тільки в процедурі.


Об’єкти, які описані в самій процедурі, називаються локальними по відношенню до самої програми і можуть використовуватись тільки в тій процедурі, в якій вони описані. Крім локальних об’єктів (зокрема змінних та типів, констант) в процедурі і функції можуть використовуватися об’єкти, які описані в основній програмі і їх називають глобальними.
Виклик процедури здійснюється шляхом вказування імені процедури і списку фактичних параметрів.
Формальні параметри в процедурах і функціях розрізняють 2-х видів: параметри значення і параметри змінні. Параметри значення–це ті формальні параметри, зміна значень яких не впливає на зміну відповідних фактичних параметрів.
 При виклику процедури чи функції слід пам’ятати:
1)кількість фактичних параметрів повинна співпадати з кількістю формальних параметрів і типи відповідних параметрівтеж повинні співпадати;
2)значення всіх фактичних параметрів передаються відповідно формальним параметрам.
Параметрами-змінними називаються ті формальні параметри, які після виконання процедури передають свої значення відповідно фактичним параметрам (тобто вони їх змінюють). При описі параметри-змінні відрізняють від параметрів-значень, вказавши перед ними службове слово var.
При виклику процедури слід пам’ятати, що на місці фактичного параметра, коли відповідний формальний параметр описаний, як параметр–значення, може стояти вираз того самого типу (зокрема змінна або константа).
В випадку, коли формальний параметр описаний як параметр–змінна, то відповідний фактичний параметр повинен бути тільки змінною(бо вона здатна набувати нового значення).

Приклад. Скласти програму з використанням процедур без параметрів: порахувати суму елементів матриць a,b,c розміру 3´4, що містить дійсні елементи.

program PR2;
const m =3; n = 4;
type matr= array[1..3,1..4] of real;
var  a,b,c:matr; s1,s2,s3:real;

procedure Vvid(var d:matr);
var i, j: integer;
 begin
           for i: = 1 to 3 do
             for j: = 1 to 4 do
                 read(d[i, j]);
 end;

procedure SUM(d:matr; var s:real);
begin s: =0;
    for i: = 1 to 3 do      
        for j: = 1 to 4 do
            s: = s + a[i, j];
 end;

begin  
      Vvid(a);  SUM(a,s1); writeln (‘s1=’, s1);
      Vvid(b);  SUM(b,s2); writeln (‘s2=’, s2);
      Vvid(c);  SUM(c,s3); writeln (‘s3=’, s3);
end.

Підручник : ст. 204
Д./з. (використовуючи процедури з параметрами)
1. Ввести ціле число x. Обчислити u = min(x,x2), v = min(0.2,u).
2. Порахувати суму і кількість додатніх елементів кожного з векторів a,b,c, які складаються з n дійсних елементів.
3. Порахувати кількість елементів, що належать проміжку [-6,6] кожного з векторів a,b,c, які складаються з n дійсних елементів. Також знайти максимальний елемент кожного з цих векторів.