Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2012, 00:03   #1
prettynetty
Пользователь
 
Регистрация: 03.03.2012
Сообщений: 11
По умолчанию Массив указателей на функции. Создание меню

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

Проблема с 3-им пунктом меню.
Код:
#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;
}
prettynetty вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатель на массив указателей на массив char'ов... SrgGld Общие вопросы C/C++ 0 19.11.2010 23:35
Массив указателей askar Общие вопросы C/C++ 5 07.09.2010 23:11
массив указателей в С ++ серг Помощь студентам 1 14.12.2009 18:49
Создание массива указателей Fataller Помощь студентам 4 14.09.2009 09:55