Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Задача: Найти произведение ненулевых элементов матрицы.




Решение:

Для решения данной задачи нам потребуются переменные: матрица, состоящая, например, из целочисленных элементов; P – произведение элементов, отличных от 0; I, J – индексы массива; N, M – количество строк и столбцов в матрице. Входными данными являются N, M – их значения введем с клавиатуры; матрица – ввод матрицы оформим в виде процедуры, заполнение матрицы осуществим случайным образом, т.е. с помощью функции random (). Выходными данными будет являться значение переменной P (произведение). Чтобы проверить правильность выполнения программы, необходимо вывести матрицу на экран, для этого оформим процедуру вывода матрицы. Ход решения задачи:

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

введем значения N и M; Введем двумерный массив Паскаля, для этого обращаемся к процедуре vvod (a), где а – матрица; Напечатаем полученную матрицу, для этого обращаемся к процедуре print (a); Присвоим начальное значение переменной P =1; Будем последовательно перебирать все строки I от 1-й до N -й, в каждой строке будем перебирать все столбцы J от 1-го до M -го, для каждого элемента матрицы будем проверять условие: если a ij? 0, то произведение P будем домножать на элемент a ij (P = P * a ij); Выведем на экран значение произведения ненулевых элементов матрицы – P;

А теперь поговорим о процедурах.

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

Type

Matrix=array [1..10, 1..10] of integer;

..............................

procedure primer (a: matrix);

..............................

Вернемся теперь к нашим процедурам.

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

Тогда заголовок нашей процедуры будет выглядеть так:

Procedure vvod (var m: matrix);

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

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

Procedure print (m: matrix);

И вновь для реализации вложенных циклов внутри процедуры нам потребуются счетчики, пусть они называются так же – k и h. Алгоритм вывода матрицы на экран был описан выше, воспользуемся этим описанием.

Пример программы двумерного массива Паскаля

Program proizvedenie;

Type

Matrix=array [1..10, 1..10] of integer;

Var

A: matrix;

N, m, i, j: byte;

P: integer;

Procedure vvod (var m: matrix);

Var k, h: byte;

Begin

For i:=1 to n do {переменная n для процедуры является глобальной, а значит «известной»}

For j:=1 to m do {переменная m для процедуры является глобальной, а значит «известной»}

M[i,j]:= random(10);

End;

Procedure print (m: matrix);

Var k, h: byte;

Begin

For i:=1 to n do

Begin

For j:=1 to m do

Write (M[i, j]: 4);

Writeln;

end;

End;

Begin {начало основной программы}

Writeln (‘Введите размерность матрицы:’);

Readln(N, M);

Vvod(a);

 

Print(a);

P:=1;

For i:=1 to N do

For j:=1 to M do

If a[i, j]<>0 then p:=p*a[i, j];

Writeln (p);

End.

В программировании

[ править ] Функции

 

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

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

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

Имеется специальный тип рекурсии, называемый «хвостовой рекурсией». Интерпретаторы и компиляторы функциональных языков программирования, поддерживающие оптимизацию кода (исходного или исполняемого), автоматически преобразуют хвостовую рекурсию к итерации, благодаря чему обеспечивается выполнение алгоритмов с хвостовой рекурсией в ограниченном объёме памяти. Такие рекурсивные вычисления, даже если они формально бесконечны (например, когда с помощью рекурсии организуется работа командного интерпретатора, принимающего команды пользователя), никогда не приводят к исчерпанию памяти. Однако, далеко не всегда стандарты языков программирования чётко определяют, каким именно условиям должна удовлетворять рекурсивная функция, чтобы транслятор гарантированно преобразовал её в итерацию. Одно из редких исключений — язык Scheme (диалект языка Lisp), описание которого содержит все необходимые сведения.

 

 

Перебор с возвратом

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

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...