Использование имени процедуры в качестве параметра другой процедуры - C (СИ) (71691)
Формулировка задачи:
Составить программу по заданному условию. Первая часть условия является заданием на разработку процедур для любой функции f1, f2. Условие второй части задания предполагает обязательное использование разработанной процедуры. В качестве исходного данного в большинстве заданий используется квадратная матрица А.
Для двух массивов В и С одинаковой длины составить процедуру, формирующую массив Т, по длине совпадающий с исходными, каждый элемент которого Тк равен сумме Вi и Сi в случае, если f2(Ci)>f1(Bi)>0. Если массив Т по длине получается меньше исходных, то он дополняется нулями.
Используя в качестве f1 синус, а в качестве f2 косинус, сформировать матрицу Е из А по правилу: первая строка матрицы Е формируется с помощью процедуры из двух первых столбцов матрицы А, вторая строка – из следующей пары столбцов и т.д.
Решение задачи: «Использование имени процедуры в качестве параметра другой процедуры»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
void foo (B, C, T, len, f1, f2)
int * B, * C, * T;
int (*f1) (int), (*f2) (int);
const size_t i len;
{
uint64_t i = 0, j = 0;
memset(T, 0, len * sizeof(int));
for (; i < len; i++) {
register int t = f1(B[i]);
if (t > 0 && f2(C[i]) > t)
T[j++] = C[i] + B[i];
}
}
Объяснение кода листинга программы
В данном коде:
- Объявлены функции
foo,f1иf2. - В функции
fooиспользуются параметрыB,C,T,len,f1иf2. - В функции
fooопределены две переменные типаuint64_t-iиj, которые используются для итерации по массивуT. - В функции
fooпроисходит инициализация массиваTнулями при помощи функцииmemset. - В функции
fooпроисходит цикл по массивуB, в котором вызывается функцияf1для каждого элемента массиваB. - Результат работы функции
f1сохраняется в переменнойt. - Если
tбольше нуля и результат работы функцииf2для соответствующего элемента массиваCбольшеt, то значение этого элемента массиваCдобавляется к значению соответствующего элемента массиваBи записывается в массивT. - После каждой итерации значение переменной
jувеличивается на единицу. - В конце цикла значение переменной
iсравнивается сlen, и если они не равны, то происходит выход из цикла. - Значение переменной
jвыравнивается сlenпри помощи операции остатка от деления. - Результатом работы функции
fooявляется массивT, содержащий результаты сложения элементов массивовBиCс учетом условий, заданных функциямиf1иf2.