Задания Б для самостоятельной работы



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

1. Составить функцию перемножения двух матриц. Функцию должна содержать проверку возможности умножения матриц и выдавать код ошибки, равный -1, если умножение невозможно, иначе - 0. С помощью процедуры вычислить n-ую степень An квадратной матрицы A(m,m), m≤10.

2. Составить функцию, которая находит минимальный и максимальный элементы всей матрицы и переписывает все элементы, находящиеся между ними (при просмотре матрицы по строкам), в одномерный массив. Использовать составленную функцию для формирования из матрицы C(k,l), k≤12, l≤14, D, который упорядочить по возрастанию, если он не пуст, и выдать соответствующее сообщение в противном случае.

3. Составить функцию, которая находит в матрице первый и пятый положительные элементы при просмотре матрицы по строкам и переписывает все отрицательные элементы, находящиеся между ними, в одномерный массив. Использовать составленную функцию для получения OTR из матрицы V(l,m), l≤15, m≤18. Упорядочить полученный массив по убыванию, если он не пуст, и выдать сообщение в противном случае.

4. оставить функцию, которая формирует матрицу H(m,m-1) из матрицы F(m,m), m≤12, путем вычеркивания минимального элемента каждой строки матрицы. Умножить исходную матрицу на полученную. В основной программе с помощью составленной процедуры получить на основе матрицы A две новые матрицы B (без минимальных элементов) и C (результат умножения A на B).

5. Составить функцию, которая находит в матрице B строки, содержащие минимальный и максимальный элементы матрицы. Из найденных строк сформировать матрицу D, рассматривая их как столбцы новой матрицы. Умножить исходную матрицу на матрицу D. Использовать составленную функцию для получения из матрицы H(l,m), l≤9, m≤8, матриц P и Q.

6. Составить функцию, которая удаляет из матрицы строки, целиком состоящие из нулевых элементов, а затем определяет минимальный и максимальный по абсолютной величине элементы преобразованной матрицы. Использовать составленную функцию для матрицы B(l,m), l≤13, m≤14.

7. Составить функцию, которая определяет точки, расстояние между которыми максимально и минимально. Координаты точек заданы в массивах X(n), Y(n), n≤20. Использовать составленную функцию для массивов X1, Y1, вывести номера найденных точек, а также расстояние между ними.

8. Составить функцию, которая в матрице переставляет элементы каждой строки так, чтобы в начале строки располагались положительные элементы, а затем – неположительные. Для строк, содержащих положительные элементы, вычислить средние геометрические положительных элементов и занести их в массив G. Для строк, не содержащих положительных элементов, вычислить средние арифметические значения и занести их в массив A. (Перестановку элементов строк провести без использования алгоритма упорядочения за один цикл просмотра элементов строки). Использовать составленную функцию для матрицы W(m,n), m≤12, n≤15.

9. Составить функцию, которая в матрице обменивает местами строки, содержащие соответственно минимальный и максимальный элементы всей матрицы. Если обмен местами строк невозможен (максимальный и минимальный элементы расположены в одной строке), то поменять местами столбцы, содержащие найденные элементы. Если все элементы матрицы одинаковые, то никаких преобразований не делать и сформировать признак результата -1, иначе сформировать признак результата ноль. Использовать составленную функцию для матрицы T(m,n), m≤12, n≤15.

10. Составить функцию, которая первый отрицательный элемент каждой строки матрицы заменяет суммой положительных элементов строки. Если замена невозможна (нет отрицательных элементов в строке), то преобразований в строке не производить, а занести номер этой строки в массив NOM без пропусков. Использовать составленную функцию для матрицы Q(k,l), k≤14, l≤15.

11. Составить функцию, упорядочивающую строки матрицы по возрастанию сумм элементов строк. Использовать составленную функцию для матрицы E(k,m), k≤14, m≤12.

12. Составить функцию, которая в матрице находит строки (векторы) с наибольшей суммой и наибольшим произведением элементов. Сформировать массив (вектор), представляющий собой скалярное произведение найденных векторов (сумма по-парных произведений элементов двух массивов с одноименными индексами). Использовать составленную функцию для матрицы SP(k,n), k≤12, n≤15.

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

14. Составить функцию, которая последний положительный элемент каждой строки матрицы заменяет суммой остальных элементов строки. Если замена невозможна (нет положительных элементов в строке), то преобразований в строке не производить, а занести номер этой строки в массив NOM без пропусков. Использовать составленную функцию для матрицы Q(k,l), k≤14, l≤15.

15. Составить функцию, которая в каждой строке матрицы заменяет каждый нулевой элемент суммой элементов, стоящих между предыдущим и текущим нулевыми элементами. Первый нулевой элемент строки заменить суммой всех предшествующих элементов. Если нулевой элемент стоит на первом месте в строке, то оставить его без изменений. Использовать составленную функцию для матрицы W(m,n), m≤12, n≤15.

16. Составить функцию, которая в каждой строке матрицы заменяет каждый нулевой элемент максимальным элементом из стоящих между предыдущим и текущим нулевыми элементами. Первый нулевой элемент строки заменить максимальным из всех предшествующих элементов. Если нулевой элемент стоит на первом месте в строке, то оставить его без изменений. Использовать составленную функцию для матрицы W(m,n), m≤12, n≤15.

17. Составить функцию, которая в матрице во всех строках со второй по предпоследнюю находит максимальный и минимальный элементы. Максимальный элемент помещается на место первого элемента строки, а минимальный – на место последнего элемента строки. Во всех столбцах матрицы со второго по предпоследний найти сумму и произведение элементов, сумму поместить на первое место в столбце, а произведение – на последнее место. Элементам, стоящим в вершинах матрицы присвоить ноль. Использовать составленную функцию для матрицы B(l,m), l≤13, m≤14.

18. В квадратной матрице в каждой строке найти минимальный элемент, стоящий под главной диагональю (не включая главную диагональ), и максимальный элемент, стоящий над главной диагональю (включая главную диагональ). Из найденных элементов сформировать два вектора. Найти третий вектор, являющийся скалярным произведением первых двух векторов (сумма попарных произведений элементов двух массивов с одноименными индексами). Использовать составленную функцию для матрицы A(l,l), l≤14.

19. Составить функцию, которая находит в каждой строке матрицы минимальный элемент и проверяет, является ли найденный элемент максимальным в том столбце, где он расположен. Если это условие выполняется, то запомнить в матрице NOM(k,2) индексы найденных элементов. Использовать составленную функцию для матрицы S(l,m), l≤13, m≤11

20. Составить функцию упорядочения строк матрицы по возрастанию количества элементов строк, нацело делящихся на заданное число m. Использовать составленную функцию для матрицы Z(k,l), k≤12, l≤14.

21. Составить функцию, которая из двух целочисленных одномерных массивов, в каждом из которых все элементы разные, образует третий массив, в который переписывает элементы, которые присутствуют либо в первом, либо во втором массиве (объединение двух массивов). Использовать функцию для массивов E(l), l≤20, F(m), m≤30.

22. Составить функцию, которая из двух целочисленных одномерных массивов, в каждом из которых все элементы разные, образует третий массив, в который переписывает элементы, которые присутствуют одновременно в первом и во втором массивах (пересечение двух массивов). Использовать функцию для массивов E(l), l≤20, F(m), m≤30.

23. Составить функцию, которая из двух целочисленных одномерных массивов, в каждом из которых все элементы разные, образует третий массив, в который переписывает элементы первого массива, которых нет во втором массиве (дополнение второго массива до первого). Использовать функцию для массивов E(l), l≤20, F(m), m≤30.

24. Составить функцию, которая транспонирует исходную матрицу и умножает первую матрицу на транспонированную матрицу. В полученной матрице найти максимальный элемент верхней треугольной матрицы и минимальный элемент нижней треугольной матрицы. Использовать составленную функцию для матрицы H(l,n), l≤12, n≤14.

25. Составить функцию, которая в квадратной матрице в каждой строке матрицы среди элементов, стоящих над главной диагональю, находит максимальный элемент, а в каждом столбце среди элементов, стоящих под главной диагональю, находит минимальный элемент. (Элементы главной диагонали не рассматривать). Найденные элементы, расположенные в одноименных строке и столбце, поменять местами. Использовать составленную функцию для матрицы H(n,n), n≤15.

Рекурсивные функции

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

//нерекурсивный вариант функции вычисления суммы элементов массива

#include "stdafx.h"

#include "stdio.h"

#include "conio.h"

 

float sum(float a[],int n);

int _tmain(int argc, _TCHAR* argv[])

{ const int nn=20;

float a[nn],s;

int i,n;

printf("wwedite kol-wo elementow\n");

scanf("%d",&n);

printf("\nwwedite massiw\n");

for (i=0;i<n;i++)

scanf("%f",&a[i]);

s=sum(a,n);

printf("\nsum=%6.2f",s);

getch();

return 0;

}

 float sum(float a[],int n)

 {float s=0;

for(int i=0;i<n;i++)

s+=a[i];

return s;

}

 

Для построения рекурсивного варианта подпрограммы следует сформулировать рекурсивное утверждение и условие окончания рекурсии. В нашем случае рекурсивное утверждение будет заключаться в том, что сумма элементов массива из n элементов может быть вычислена как сумма (n-1)-го начальных элементов и последнего элемента, то есть Sn =Sn-1 + an (n>0). Условие окончания рекурсии S0 = a0. Рекурсивный вариант функции приведен ниже

// рекурсивный вариант функции вычисления суммы элементов массива

float sum(float a[],int n) //n – количество элементов массива

 { float s;

 if (n==1)

s=a[n-1];

else

s=a[n-1]+sum(a,n-1);

return s;

 }

 

Рекурсивное описание обычно является более компактным и выглядит более наглядно, если природа самого алгоритма рекурсивна. Однако надо принимать во внимание и то, как реализуется рекурсивный алгоритм в ЭВМ. Например, при n=4 (массив состоит из четырех элементов) производится первое обращение к функции со значениями параметров массива a и n=4. При этих значениях выполняется оператор s=a[3]+sum(a,3), затем обращение к функции со значениями a и 3, т.е. sum(a,3). Следом выполняется обращение к функции со значениями a и 2, т.е. sum(a,2). При выполнении этого обращения к функции производится еще одно обращение: sum(a,1). На последнем шаге при обращении к функции с этими параметрами будет выполнен оператор s=a[0]. Далее процесс развивается в обратном направлении, т.е. выполнится оператор S=a[1]+sum(a,1), что даст результат s=a[1]+a[0], затем выполнится оператор s=a[2]+sum(a,2) с результатом s=a[2]+a[1]+a[0]. На последнем шаге выполнится оператор s=a[3]+sum(a,3), дающий окончательный результат. Рассмотрев описанный процесс, можно придти к выводу, что рекурсивная подпрограмма требует больших затрат машинного времени и памяти. Это объясняется необходимостью выполнения повторных обращений к подпрограмме и необходимостью хранения (в стеке) фактических параметров при обращениях к подпрограмме.

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

 

 float pr1(float a, float b)

 {

 . . . . .

s=a+pr2(a,b);

 . . . . .

 }

 float pr2(float c, float d)

 {

. . . . .

s=d+pr1(c,d);

 . . . . .

 }

 

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

Далее приведен пример программы, в которой реализована косвенная рекурсия.

// косвенная рекурсия

#include "stdafx.h"

#include "stdio.h"

#include "conio.h"

 

 float f1(float a,int n);

 float f2(float a,int n);

 

int _tmain(int argc, _TCHAR* argv[])

{ int n;

float sum;

scanf(“%d”,&n);

sum=f1(2.0,n);

printf("sum=%6.1f",sum);

getch();

return 0;

 

}

float f1(float a,int n)

{ float s;

if (n==1) s=5;

else s=n+a+f2(2.0,n-1);

return s;

}

 float f2(float a,int n)

{ float s;

if (n==1) s=10;

else s=n+a+f1(1.0,n-1);

return s;

}

 


Дата добавления: 2018-10-27; просмотров: 228; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!