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

Тема в разделе "C/C++/C#", создана пользователем prettynetty, 6 мар 2012.

  1. prettynetty

    prettynetty Гость

    С++
    Постановка задачи:
    Найти корень уравнения 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;
    }
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    В С/С++ индексация массивов с нуля начинается.
     
  3. prettynetty

    prettynetty Гость

    что то я не пойму где это применить....
     
Загрузка...

Поделиться этой страницей