Найти максимум произвольной функции одной переменной - C (СИ)
Формулировка задачи:
Написать функцию пользователя, позволяющую найти максимум произвольной функции одного переменного, аргумент которой задан массивом из «n» элементов вещественного типа. Кроме максимального значения анализируемой функции необходимо возвращать и значение аргумента, которое ему соответствует.
Решение задачи: «Найти максимум произвольной функции одной переменной»
textual
Листинг программы
#include <stdio.h>
//-----------------------------------------------------------------------------
size_t GetMax(double arr[], size_t size, double (*func)(double), double* value)
{
size_t maxIndex = 0;
double maxValue = func(arr[maxIndex]);
double currentValue;
size_t i;
for (i = 1; i < size; ++i)
{
currentValue = func(arr[i]);
if (currentValue > maxValue)
{
maxIndex = i;
maxValue = currentValue;
}
}
*value = maxValue;
return maxIndex;
}
//-----------------------------------------------------------------------------
double Sqr(double value)
{
return (value * value);
}
//-----------------------------------------------------------------------------
double Abs(double value)
{
return ((value < 0) ? -value : value);
}
//-----------------------------------------------------------------------------
double OneDivided(double value)
{
return (1 / value);
}
//-----------------------------------------------------------------------------
int main()
{
double arr[] = { 5.0, -6.0, 8.0, -9.0, 7.0, -1.0, 2.0 };
size_t size = sizeof(arr) / sizeof(arr[0]);
size_t index;
double value;
index = GetMax(arr, size, Sqr, &value);
printf("function Sqr: max[%d] = %f, value = %f\n", index, arr[index], value);
index = GetMax(arr, size, Abs, &value);
printf("function Abs: max[%d] = %f, value = %f\n", index, arr[index], value);
index = GetMax(arr, size, OneDivided, &value);
printf("function 1/*: max[%d] = %f, value = %f\n", index, arr[index], value);
return 0;
}
Объяснение кода листинга программы
- В функции
GetMaxищется максимум произвольной функцииfuncдля массиваarrдлинойsize. - Переменная
maxIndexинициализируется значением 0, а переменнаяmaxValue— значениемfunc(arr[maxIndex]). - В цикле перебираются все элементы массива, начиная со второго.
- Для каждого элемента вычисляется значение
currentValueс помощью функцииfunc. - Если
currentValueбольше текущего максимального значенияmaxValue, то обновляются значенияmaxIndexиmaxValue. - Результат функции
GetMax— максимальное значение функцииfuncи индекс этого значения в массивеarr. - В функции
mainопределён массивarrи его размерsize. - Вызывается функция
GetMaxс различными функциямиfuncи выводится результат на экран. - Функция
Sqrвозвращает квадрат числа. - Функция
Absвозвращает абсолютное значение числа. - Функция
OneDividedвозвращает число, полученное делением 1 на число. - Значение 13 не используется в коде.
- Значение 14 не используется в коде.
- Значение 15 не используется в коде.
- Значение 16 не используется в коде.
- Значение 17 не используется в коде.
- Значение 18 не используется в коде.
- Значение 19 не используется в коде.
- Значение 20 не используется в коде.