Массив Указателей На Функции. Создание Меню

  • Автор темы prettynetty
  • Дата начала
P

prettynetty

#1
С++
Постановка задачи:
Найти корень уравнения 0=(2*pow(sin(2*x),2)/3)-(3*pow(cos(2*x),2)/4) используя метод деления отрезка, метод хорд и метод Ньютона (касательных). Значение корня считать с погрешностью e=0.00001. Сделать оценку сходимости для каждого из указанных выше методов, т. е. определить количество итераций при вычислении корня указанными выше методами.
Дополнительные условия:
1. Вычисление корня уравнения каждым из указанных выше методов оформить в виде функции, в которой вычислить количество итераций (повторений цикла).
2. Для выбора метода вычисления корня уравнения использовать меню, разработанное с применением массива указателей на функции.

Проблема с 3-им пунктом меню.
C++:
#include<windows.h>
#include<math.h>
#include<iostream.h>
#include<conio.h>
void metod_del(float,float);
void metod_hord(float,float);
void metod_n(float,float);
float f(float);
int menu();
void(*masf[])(float,float)={metod_del,metod_hord,metod_n};
main()
{
SetConsoleOutputCP(1251);
float a=0, e=0.00001;
while(1)
(*masf[menu()])(a,e);
return 0;
}
int menu()
{
char n;
do
{
cout<<"1. Решение уравнения методом деления отрезка пополам;"<<endl;
cout<<"2. Решение уравнения методом хорд;"<<endl;
cout<<"3. Решение уравнения методом Ньютона;"<<endl;
cout<<"4. Выход из программы."<<endl;
cout<<endl;
cout<<"Сделайте выбор:"<<endl;
n=getche();
cout<<endl;
}
while(strchr("1234",n)==NULL);
if(n=='4') exit(0);
return n-49;
}
void metod_del(float a,float e)
{
float b,x;
int ni=0;
cout<<"Введите значение b:"<<endl;
cin>>b;
if(f(a)*f(b)>0) 
{
cout<<"Значение b введено неверно!"<<endl;
return;
}
do {
x=(a+b)/2;
ni++;
if(f(x)==0)
{
cout<<"x="<<x;
cout<<endl;
return;
}
if(f(a)*f(x)<0) b=x;
else a=x;
}
while(fabs(f(x))>e);
cout<<"x="<<x;
cout<<endl;
cout<<"Количество итераций равно "<<ni;
cout<<endl;
}
void metod_hord(float a,float e)
{
float b,x;
int ni=0;
cout<<"Введите значение b:"<<endl;
cin>>b;
if(f(a)*f(b)>0) 
{
cout<<"Значение b введено неверно!"<<endl;
return;
}
do
{
x=a-(b-a)*f(a)/(f(b)-f(a));
if(f(a)*f(x)<0) b=x;
else a=x;
ni++;
}
while(fabs(f(x))>e);
cout<<"x="<<x;
cout<<endl;
cout<<"Количество итераций равно "<<ni;
cout<<endl;
}
void metod_n(float a,float e)
{
float x;
int ni=0;
do
{
x=a-f(a)/((4*sin(4*a))/3+(3*sin(4*a))/2);
ni++;
a=x;
}
while(fabs(f(x))>e);
cout<<"x="<<x;
cout<<endl;
cout<<"Количество итераций равно "<<ni;
cout<<endl;
}
float f(float a)
{
float zn;
zn=2*pow(sin(2*a),2)/3-3*pow(cos(2*a),2)/4;
return zn;
}