Исправьте код с указателями на функции - C (СИ)
Формулировка задачи:
Исправте, пожалуйста, код в С, где я допустил ошибку???
#include <iostream>
#include <cmath>
using namespace std;
typedef double (*pfun)(double);
double fun_sin(double x)
{
double sum=sin(x);
return sum;
}
double fun_cos(double x)
{
double sum=cos(x);
return sum;
}
double fun_tan(double x)
{
double sum=tan(x);
return sum;
}
double search (double, double, double, int);
int main ()
{
double x, E;
printf("Enter Е: "); // printf("Menu:\n");
scanf("%f", &E); // scanf("%d", &sel);
int action;
printf("Change function:\n1.y=sin(x).\n2.y=cos(x).\n3.y=tan(x).\n");
scanf("%d", &action);
double a, b;
printf("Enter a "); // левая граница...
scanf("%d", &a);
printf("Enter b ");
scanf("%d", &b);
x=search (a, b, E, action-1);
printf("Result: ", &x, "\n");
return 0;
}
double search (double a, double b, double E, int i)
{
pfun fun[]={&fun_sin, &fun_cos, &fun_tan};
if (fabs(a-b)<=E)
return (a+b)/2;
if (fun[i](a)<fun[i](b)){
if (fun[i]((a+b)/2)>0)
return search (a, (a+b)/2, E, i);
else return search ((a+b)/2, b, E, i);
}
else if (fun[i]((a+b)/2)>0)
return search ((a+b)/2, b, E, i);
else return search (a, (a+b)/2, E, i);
}Решение задачи: «Исправьте код с указателями на функции»
textual
Листинг программы
#include <stdio.h>
#include <math.h>
typedef double (*pfunc)(double);
double func_sin(double x)
{
double sum=sin(x);
return sum;
}
double func_cos(double x)
{
double sum=cos(x);
return sum;
}
double func_tan(double x)
{
double sum=tan(x);
return sum;
}
double search (double, double, double, int);
int main ()
{
double x, E;
printf("Enter Е: ");
scanf("%lf",&E);
int action;
printf("Choose function:\n1.y=sin(x).\n2.y=cos(x).\n3.y=tan(x).\n");
scanf("%d",&action);
double a, b;
printf("Enter a: ");
scanf("%lf",&a);
printf("Enter b:");
scanf("%lf",&b);
x=search (a, b, E, action-1);
printf("Result is %lf\n",x);
return 0;
}
double search (double a, double b, double E, int i)
{
pfunc func[]={func_sin, func_cos, func_tan};
if (fabs(a-b)<=E)
return (a+b)/2;
if (func[i](a)<func[i](b)){
if (func[i]((a+b)/2)>0)
return search (a, (a+b)/2, E, i);
else return search ((a+b)/2, b, E, i);
}
else if (func[i]((a+b)/2)>0)
return search ((a+b)/2, b, E, i);
else return search (a, (a+b)/2, E, i);
}
Объяснение кода листинга программы
- Программа находит функцию из заданного набора (sin, cos, tan) с помощью которой будет осуществляться поиск минимума или максимума в заданном диапазоне [a, b] с шагом E.
- Ввод начинается с выбора действия (ввод функции), затем ввод аргументов для функции (a, b) и шаг E.
- Затем происходит вызов функции search, которая осуществляет поиск минимума или максимума в заданном диапазоне с помощью выбранной функции и заданного шага E.
- Результатом работы программы является найденное значение x, которое выводится на экран.