Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Решение кубических уравнений на С++ (http://forum.oszone.net/showthread.php?t=136334)

XEN_STRANGER 30-03-2009 20:51 1079365

Решение кубических уравнений на С++
 
Само объяснение есть, вот - http://cubic-solver.info/ Тока я чёт не собиру всё это в кучу, может кто поможет составить последовательность действий.

Вот как я думаю:

1. берём уравнение a*x^3 + b*x^2 + c*x + d = 0
2. заменяем х на у, да так чтоб x = y - (b / 3*a),
3. приводим к более простому (каноническом) виду: y^3 + p*y + q = 0,
4. вводим р= -(b^2 / 3*a^2) + c/a и вводим q= (2*b / 27*a^3) - (b*c / 3*a^2) + b/a
5. с помошью формулы Кардано находим у, только я не пойму формулу (я только в 8-ом классе) kardano.png, напишите плиз, мне её в виде кода!
6. теперь если q^2/4 + p^3/27 > 0 , то кубическое уравнение имеет три различных корня: один из них действительный, два других - сопряженные комплексные;
если q^2/4 + p^3/27 = 0, то все три корня действительные, два из них равны
если q^2/4 + p^3/27 < 0, то все три корня действительные и различные.

чё-то я запутался...

А можно было приведя к каноническому виду найти значения p и q, а затем найти "y", используя дискриминант (D = -4p3 - 27q2) только как находится "y" дальше, уже с найденным дискриминантом? (также как x1 и x2 в квадратных уравнениях)

Обязательно ознакомьтесь с материалом на странице http://cubic-solver.info/

XEN_STRANGER 30-03-2009 21:15 1079398

crashtuak,
Цитата:

Цитата crashtuak
Вот Тригонометрическая Формула Виета, первый раз вижу, но она сравнительно легкая, и почти идеально подходит для реализации на С++: http://ru.wikipedia.org/wiki/%D0%A2%...B5%D1%82%D0%B0 »

Ты наверное школу уже закончил, может в универе учишься, может в классе 11-ом, тоесть тригонометрию уже изучаешь, а я пока ещё "не дорос" и не знаю например что такое арккосинус и следовательно перевести это дело в код не могу. Остаётся одна надежда - твоя помошь, прошу помоги...

P.S. Ты ведь фанат Half-Life 2 да? Если так, то да поможет тебе великий Фримен...

Admiral 31-03-2009 03:31 1079683

Арккосинус
Цитата:

Цитата XEN_STRANGER
арккосинус ... в код »

acos(x)
Вот пример программы
Код:

#include <stdio.h>
#include <math.h>

int main(int argc,char *argv[])
{
        float x;
                for (x=-1;x<=1;x=x+0.01)
                        printf("%f %f\n",x,acos(x));
        return 0;
}

Главное помнить что аргумент функции арккосинус acos() может быть от -1 до 1 включительно, то есть те значения которые может принимать сам косинус.

XEN_STRANGER 31-03-2009 08:38 1079728

Admiral, сдесь ты находил арккосинус от х, а я нахожу от (R/ sqrt(Q^3)), но эт не важно... Я что-то не пойму это цикл, конечный ответ, который будет использоваться дальше в вычислениях, тот, который равен арккосинусу от х или от моего (R/ sqrt(Q^3)) - это последнее решение цикла (сомневаюсь)? Что, все последующие вычисления программы надо вставлять внутрь тела цикла?

Admiral, посмотри на формулу с нахождением арккосинуса по этой ссылкеи скажи правильно ли я её перевёл:

(кстати что это за зачёркнутый кружок, его можно взять за любую обычную переменную, например U, может это перечисляемая переменная, кажется тип enum ?)

Код:

#include <stdio.h>
#include <math.h>

int main(int argc,char *argv[])
{
      float x;
      x= (R/ sqrt(Q^3));
     
      for (x=-1;x<=1;x=x+0.01)
                      cout << x << " = acos of x";
      return 0;
}

Пожалуйсто, зайдите СЮДА
Пожалуйсто, переведите в код формулы, а там мне почти всё ещё не известно: тригонометрические косинусы (мы изучали пока только геометрические), непонятное слово Arch, ch, sign, sh, переменная "а" под углом корня.
Вобщем очень прошу, зайдите на ту страничку в "Вики" и попробуйте перевести те формулы в код. :sorry:

XEN_STRANGER 31-03-2009 13:20 1079968

Admiral, crashtuak, Всё вобщем я прогу написал, только при компиляции кода:
Отрывок кода:

Код:

//----------Кубические уравнения-----------------------------------------------------------------------

int x3yravn ()
{
    cout << "-----NEXT-------------------------------------------------------" << endl;
    double a, b, c, x;
    double error;

    cout << "Ввод уравнения: " << endl;
    cout << endl << "(a=) ";
    cin >> a;
    cout << "(b=) ";
    cin >> b;
    cout << "(c=) ";
    cin >> c;

error = GetX3yravn (x, a, b, c);

    if (!error)
        {
                backer ();
        }

    else
        {
                cout << endl << "Ошибка! а=0 или b=0, уравнение не кубическое" << endl;
        }
        char response;
        cin >> response;
        return 0;
}


// Функция нахождения корней кубического уравнения

double GetX3yravn (double *x,double a,double b,double c)
{
    double value = 0;
    if ((a == 0) || (b == 0))
        value = 1;
    else
    {
        double q, r, q3, r2;
        value = 0;
        q=(a*a-3.*b)/9.;
        r=(a*(2.*a*a-9.*b)+27.*c)/54.;
        r2=r*r;
        q3=q*q*q;
        if(r2<q3)
        {
            double t=acos(r/sqrt(q3));
            a/=3.;
            q=-2.*sqrt(q);
                    x[0]=q*cos(t/3.)-a;
            x[1]=q*cos((t+M_2PI)/3.)-a;
            x[2]=q*cos((t-M_2PI)/3.)-a;
                  cout << "=====РЕЗУЛЬТАТ==================================================";
            cout << endl << "Найдено три корня, x1 = " << x[0] << ", x2 = " << x[1] << ", x3 = " << x[2] << endl;
                  cout << "================================================================" << endl;
      }
      else
      {
                    double aa,bb;
                    if(r<=0.) r=-r;
                    aa=-pow(r+sqrt(r2-q3),1./3.); 
                    if(aa!=0.) bb=q/aa;
                    else bb=0.;
                    a/=3.; q=aa+bb; r=aa-bb;
                    x[0]=q-a;
                    x[1]=(-0.5)*q-a;
                        x[2]=(sqrt(3.)*0.5)*fabs(r);
              if(x[2]==0.)
              {
                cout << "=====РЕЗУЛЬТАТ==================================================";
                cout << "Найдено два корня, x2 = " << x[1] << ", x3 = " << x[2] << endl;
                cout << "================================================================" << endl;
              }
               
                    cout << "=====РЕЗУЛЬТАТ==================================================";
                cout << "Найден один корень, x = " << x[0] << endl;
                                cout << "================================================================" << endl;
        }
                value = 0;
    }
    return value;
}

//-------END-------------------------------------------------------------------------------------

Появляется ошибка: error C2664: 'GetX3yravn' : cannot convert parameter 1 from 'double' to 'double *'
There is no context in which this conversion is possible

Как это исправить?

Drongo 31-03-2009 13:33 1079984

Код:

...
double GetX3yravn (double *x, double a, double b, double c) // чего 'x' указател? Когда в обявлении это обычный 'double'
...


XEN_STRANGER 31-03-2009 13:48 1079992

Drongo, А... ясно, спасибо, посмотри плиз на код, он вообще верный, в плане решения уравнений?

Drongo, сейчас проверял и нифига, прога запускается, но после ввода a, b, и c вылетает...
Что исправить надо?

Drongo 31-03-2009 14:33 1080035

Цитата:

Цитата XEN_STRANGER
сейчас проверял и нифига, прога запускается, но после ввода a, b, и c вылетает... Что исправить надо? »

А ты скинь код, который ты проверял, чтобы воспроизвести ошибку и посмотреть ей в "лицо". ;)

Код:

error = GetX3yravn (x, a, b, c);  // Поставь точку остановки выполнения тут, и посмотри, будет ли вылетать или нет

XEN_STRANGER 31-03-2009 15:25 1080082

Drongo,
Цитата:

Цитата Drongo
Поставь точку остановки выполнения тут, и посмотри, будет ли вылетать или нет »

Как ? Покажи

Тоесть дальше всё выключить?

Drongo 31-03-2009 16:04 1080122

Выдели в редакторе строку или поставь курсор на нужную стоку и нажми F5

XEN_STRANGER 31-03-2009 16:10 1080129

Drongo, Жёлтая стрелка указала на x[0]=q-a;

И что теперь, что с этим делать?

Drongo 31-03-2009 16:36 1080160

XEN_STRANGER, Давай весь код, посмотрим целиком.

XEN_STRANGER 31-03-2009 17:54 1080260

Drongo, От он:

Код:

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <cmath>
#include <math.h>
#define M_PI (3.141592653589793)
#define M_2PI (2.*M_PI)

using namespace std;

// Подключение поддержки кирилицы

typedef struct _CONSOLE_FONT_INFOEX
{
  ULONG cbSize;
  DWORD nFont;
  COORD dwFontSize;
  UINT  FontFamily;
  UINT  FontWeight;
  WCHAR FaceName[LF_FACESIZE];
}
CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;

typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);    // прототип недокументированый функции для XP

typedef BOOL (WINAPI *SETCURRENTCONSOLEFONTEX)(HANDLE,BOOL, PCONSOLE_FONT_INFOEX);  // для vista
SETCURRENTCONSOLEFONTEX SetCurrentConsoleFontEx  ;
SETCONSOLEFONT SetConsoleFont;

// END

unsigned int GetFib (unsigned int position);
int physic ();
int gorenie ();
int nagrev ();
int math ();
int x2yravn ();
double GetX2yravn (double a, double b, double c, double *x1, double *x2);
int x3yravn ();
double GetX3yravn (double *x,double a,double b,double c);
int fibmain ();
int backer ();


// -------------------------Главное меню---------------------------------------------------------------------

int main ()
{

// Тоже для поддержки кирилицы

  OSVERSIONINFOEX osvi;
  CONSOLE_FONT_INFOEX cfon;
  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
  GetVersionEx((OSVERSIONINFO *) &osvi) ;  // получение версии windows
  HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");    // функции
  if (osvi.dwMajorVersion<6)
  {   
        SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");  // берем  адрес функции
        if (!SetConsoleFont) {cout<<"error\n" ; exit(1);}  //  если ошибка
        SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),10);  // устанавливаем 10 шрифт..
        //эксперементально установил что в обычной XP  это Lucida  Console 14.

  } 
  else
  {
        SetCurrentConsoleFontEx =(SETCURRENTCONSOLEFONTEX) GetProcAddress(hmod, "SetCurrentConsoleFontEx");  // берем  адрес  функции
        if (!SetCurrentConsoleFontEx) {cout<<"error\n" ; exit(1);}  //  если ошибка
        ZeroMemory(&cfon, sizeof(CONSOLE_FONT_INFOEX));
        cfon.cbSize=sizeof(CONSOLE_FONT_INFOEX);
        //cfon.nFont=10;
        cfon.FontFamily=54;  //  Lucida  Console
        if (!SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), false, &cfon)) cout<<"error";
  }

  SetConsoleOutputCP(1251) ;  // устанавливаем кодировку вывода
 
// END


        unsigned short int choise;

        cout << "-----START_Makros_2.0-------------------------------------------" << endl << endl;
        cout << "Выберите пункт, введя число\n\n";
        cout << "1-Физика      2-Математика";
        cout << endl;
        cout << "\nПункт - ";
        cin >> choise;
        cout  << endl;
        if (choise == 1)
        {
                physic ();
        }
        if (choise == 2)
        {
        math (); 
    }
        if ((choise != 1) && (choise != 2))
        {
            cout << "<Ошибка! Введите коректное число!>" << endl << endl << endl;
                return main ();
        }

        return 0;
}

// -------------END-------------------------------------------------------------------------------------






//---------------Раздел физика--------------------------------------------------------------------------

int physic ()

        unsigned short int choiseP;
        cout << "-----NEXT-------------------------------------------------------" << endl;
    cout << "Раздел физики" << endl;
        cout << "Выбор формулы:\n\n";
        cout << "1-Нагревание    2-Горение";
        cout << endl;
        cout << "\nФормула - ";
    cin >> choiseP;
        cout  << endl << endl;
        if (choiseP == 1)
        {
        nagrev ();
        }
        if (choiseP == 2)
        {
                gorenie ();
        }

    if ((choiseP != 1) && (choiseP != 2))
        {
            cout << endl << "<Ошибка! Введите коректное число!>";
                return physic ();
        }

        return 0;

}

//--------------------------------------------------------------------------------------------------------------






//----------------------Функция нагревания----------------------------------------------------------------------

int nagrev ()
{
        const int N_zolot=130, N_rtyt=140, N_svinecc=140, N_olovo=230, N_serebro=250, N_med=400, N_ccink=400, N_latyn=400,
                      N_zhelezo=460, N_stal=500, N_chugyn=540, N_graphit=750, N_labsteklo=840, N_kirpich=880, N_alumini=920,
                          N_maslopodsol=1700, N_led=2100, N_kerosin=2100, N_efir=2350, N_derevodyb=2400, N_spirt=2500, N_voda=4200;

        unsigned short int choise1;
    cout << "-----NEXT-------------------------------------------------------" << endl;
        cout << "Вычисление энергии нагревания вещества" << endl << endl;
        cout << "Выбор вещества:\n\n";
        cout << "1-Золото      2-Ртуть      3-Свинец      4-Олово        5-Серебро";
        cout << endl << "6-Медь        7-Цинк      8-Латунь      9-Железо      10-Сталь";
        cout << endl << "11-Чюгун      12-Графит    13-Лаб стекло  14-Кирпич      15-Алюминий";
        cout << endl << "16-Масло      17-Лёд      18-Керосин    19-Эфир        20-Дерево (Дуб)";
        cout << endl << "21-Спирт      22-Вода";
        cout << endl << "\nВещество - ";
        cin >> choise1;

        switch (choise1)
        {
        case 1:
                {
            cout << "Хорошо, введите массу золота";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_zolot;
        cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг золота выделилось " << Q << " Дж энергии" << endl;
                cout << "================================================================";
                }

                break;
       
        case 2:
                {
                cout << "Хорошо, введите массу ртути";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_rtyt;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг ртути выделилось " << Q << " Дж энергии" << endl;
                cout << "================================================================";
                }

                break;

    case 3:
                {
                cout << "Хорошо, введите массу свинца";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_svinecc;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг свинца выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 4:
                {
                cout << "Хорошо, введите массу олова";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_olovo;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг олова выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 5:
                {
                cout << "Хорошо, введите массу серебра";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_serebro;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг серебра выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;
       
        case 6:
                {
                cout << "Хорошо, введите массу меди";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_med;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг меди выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 7:
                {
                cout << "Хорошо, введите массу цинка";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_ccink;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг цинка выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 8:
                {
                cout << "Хорошо, введите массу латуни";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_latyn;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг латуни выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 9:
                {
                cout << "Хорошо, введите массу железа";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_zhelezo;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг железа выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

    case 10:
                {
                cout << "Хорошо, введите массу стали";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_stal;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг стали выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 11:
                {
                cout << "Хорошо, введите массу чугуна";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_chugyn;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг чугуна выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 12:
                {
                cout << "Хорошо, введите массу графита";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_graphit;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг графита выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 13:
                {
                cout << "Хорошо, введите массу лабораторного стекла";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_labsteklo;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг лаб стекла выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 14:
                {
                cout << "Хорошо, введите массу кирпича";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_kirpich;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг кирпича выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 15:
                {
                cout << "Хорошо, введите массу алюминия";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_alumini;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг алюминия выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 16:
                {
                cout << "Хорошо, введите массу масла подсолнечного";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_maslopodsol;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг масла выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 17:
                {
                cout << "Хорошо, введите массу льда";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_led;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг льда выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 18:
                {
                cout << "Хорошо, введите массу керосина";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_kerosin;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг керосина выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 19:
                {
                cout << "Хорошо, введите массу эфира";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_efir;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг эфира выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 20:
                {
                cout << "Хорошо, введите массу древесины (Дуб)";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_derevodyb;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг древесины выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 21:
                {
                cout << "Хорошо, введите массу спирта";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_spirt;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг спирта выделилось" << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 22:
                {
                cout << "Хорошо, введите массу воды";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                long Q = mass * N_voda;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При нагревании " << mass << " кг воды выделилось " << Q << " Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        default:
                {
                cout << endl << "<Ошибка! Введите коректное число!>" << endl << endl;
                return nagrev ();
                }
        }
   
        backer ();
       
}

//----------------END-------------------------------------------------------------------------






//----------------Функция горения-------------------------------------------------------------

int gorenie ()
{
    const double S_poroh=0.38, S_torph=1.4, S_kamugol=2.7,
                        S_spirt=2.7, S_drovugol=3.4, S_gas=4.4,
                            S_neft=4.4, S_benzin=4.6, S_kerosin=4.6;

        const unsigned int S_drova=1, S_antracit=3, S_vodorod=12;

        unsigned short int choise2;
    cout << "-----NEXT-------------------------------------------------------" << endl;
        cout << "Вычисление энергии от сгоревшего топлива" << endl << endl;
        cout << "Выбор топлива:\n\n";
        cout << "1-Порох      2-Дрова      3-Торф      4-Каменный уголь      5-Спирт";
        cout << endl << "6-Антрацит    7-Др уголь    8-Газ        9-Нефть                10-Бензин"; 
        cout << endl << "11-Керосин    12-Водород";
        cout << endl;
        cout << "\nТопливо - ";
    cin >> choise2;
        switch (choise2)
        {
        case 1:
                {
                cout << "Хорошо, введите массу пороха";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                double Q = mass * S_poroh;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг пороха выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 2:
                {
        cout << "Хорошо, введите массу дров";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                unsigned int Q = mass * S_drova;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг дров выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 3:
                {
        cout << "Хорошо, введите массу торфа";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                double Q = mass * S_torph;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг торфа выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 4:
                {
        cout << "Хорошо, введите массу каменного угля";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                double Q = mass * S_kamugol;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг угля выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 5:
                {
        cout << "Хорошо, введите массу спирта";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                double Q = mass * S_spirt;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании  " << mass << " кг спирта " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 6:
                {
        cout << "Хорошо, введите массу антрацита";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                unsigned int Q = mass * S_antracit;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг антрацита выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 7:
                {
        cout << "Хорошо, введите массу древесного угля";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                double Q = mass * S_drovugol;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг др угля выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 8:
                {
        cout << "Хорошо, введите массу газа";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                double Q = mass * S_gas;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг газа выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 9:
                {
        cout << "Хорошо, введите массу нефти";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                double Q = mass * S_neft;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг нефти выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 10:
                {
        cout << "Хорошо, введите массу бензина";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                double Q = mass * S_benzin;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг бензина выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 11:
                {
        cout << "Хорошо, введите массу керосина";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                double Q = mass * S_kerosin;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг керосина выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        case 12:
                {
        cout << "Хорошо, введите массу водорода";
                int mass;
                cout << endl;
                cout << "Масса - ";
                cin >> mass;
                unsigned int Q = mass * S_vodorod;
                cout << endl << "=====РЕЗУЛЬТАТ==================================================";
                cout << endl << "При сгорании " << mass << " кг водорода выделилось " << Q << " * 10000000 Дж энергии"<< endl;
                cout << "================================================================";
                }

                break;

        default:
                {
        cout << endl << "<Ошибка! Введите коректное число!>" << endl << endl;
                return gorenie ();
                }
    }
       
        backer ();

}

//----------END-----------------------------------------------------------------------------------





//---------------Раздел математика----------------------------------------------------------------

int math ()

        unsigned short int choiseM;
        cout << "-----NEXT-------------------------------------------------------" << endl;
    cout << "Раздел математики" << endl;
        cout << "Выбор пункта:\n\n";
        cout << "1-Квадратные уравнения    2-Кубические уравнения    3-Ряд Фибоначи";
        cout << endl;
        cout << "\nПункт - ";
    cin >> choiseM;
        cout  << endl << endl;
        if (choiseM == 1)
        {
                x2yravn ();
        }
        if (choiseM == 2)
        {
        x3yravn ();
        }
        if (choiseM == 3)
        {
                fibmain ();
        }

    if ((choiseM != 1) && (choiseM != 2) && (choiseM != 3))
        {
            cout << endl << "<Ошибка! Введите коректное число!>" << endl << endl;
                return math ();
        }

        return 0;

}

//-----------END---------------------------------------------------------------------------------------





//----------Кубические уравнения-----------------------------------------------------------------------

int x3yravn ()
{
    cout << "-----NEXT-------------------------------------------------------" << endl;
        double a, b, c, *x;
        double error;

    cout << "Ввод уравнения: " << endl;
        cout << endl << "(a=) ";
        cin >> a;
        cout << "(b=) ";
        cin >> b;
        cout << "(c=) ";
        cin >> c;

    error = GetX3yravn (x, a, b, c);

    if (!error)
        {
                backer ();
        }

    else
        {
                cout << endl << "Ошибка! а=0 или b=0, уравнение не кубическое" << endl;
                x3yravn ();
        }
        char response;
        cin >> response;
        return 0;
}


// Функция нахождения корней кубического уравнения

double GetX3yravn (double *x,double a,double b,double c)
{
    double value = 0;
        if ((a == 0) || (b == 0))
                value = 1;
        else
        {
                double q, r, q3, r2;
        value = 0;
        q=(a*a-3.*b)/9.;
        r=(a*(2.*a*a-9.*b)+27.*c)/54.;
        r2=r*r;
        q3=q*q*q;
        if(r2<q3)
                {
                    double t=acos(r/sqrt(q3));
                a/=3.;
                    q=-2.*sqrt(q);
                    x[0]=q*cos(t/3.)-a;
                    x[1]=q*cos((t+M_2PI)/3.)-a;
                    x[2]=q*cos((t-M_2PI)/3.)-a;
            cout << "=====РЕЗУЛЬТАТ==================================================";
                    cout << endl << "Найдено три корня, x1 = " << x[0] << ", x2 = " << x[1] << ", x3 = " << x[2] << endl;
                    cout << "================================================================" << endl;
                }
        else
                {
                    double aa,bb;
                    if(r<=0.) r=-r;
                    aa=-pow(r+sqrt(r2-q3),1./3.); 
                    if(aa!=0.) bb=q/aa;
                    else bb=0.;
                    a/=3.; q=aa+bb; r=aa-bb;
                    x[0]=q-a;
                    x[1]=(-0.5)*q-a;
                    x[2]=(sqrt(3.)*0.5)*fabs(r);
                    if(x[2]==0.)
                        {
                cout << "=====РЕЗУЛЬТАТ==================================================";
                              cout << "Найдено два корня, x2 = " << x[1] << ", x3 = " << x[2] << endl;
                cout << "================================================================" << endl;
                        }
               
                    cout << "=====РЕЗУЛЬТАТ==================================================";
                    cout << "Найден один корень, x = " << x[0] << endl;
            cout << "================================================================" << endl;
                }
        value = 0;
        }
    return value;
}

//-------END-------------------------------------------------------------------------------------








//----------Квадратные уравнения-----------------------------------------------------------------

int x2yravn ()
{
        double a, b, c, x1, x2;
        double error;
        cout << "-----NEXT-------------------------------------------------------" << endl;
        cout << "Ввод уравнения: " << endl;
        cout << endl << "(a=) ";
        cin >> a;
        cout << "(b=) ";
        cin >> b;
        cout << "(c=) ";
        cin >> c;


    error = GetX2yravn (a, b, c, &x1, &x2);
        if (!error)
        {
                backer ();
        }

    else
        {
                cout << endl << "Ошибка! а=0, уравнение не квадратное" << endl;
                x2yravn ();
        }
        char response;
        cin >> response;
        return 0;

}


// Функция нахождения корней квадратного уравнения

double GetX2yravn (double a, double b, double c, double *px1, double *px2)
{
        double value = 0;
        if (a == 0)
                value = 1;
        else
        {
                double D;
            D = b*b - 4*a*c;
                cout << endl << "Дискриминант равен " << D << endl;
                if (D < 0)
                {
                        cout << "=====РЕЗУЛЬТАТ==================================================";
                        cout << endl << "Корней не найдено, дискриминант меньше ноля" << endl;
                        cout << "================================================================" << endl;
                }
                if (D == 0)
                {
                        *px1 = -b / (2*a);
                        cout << "=====РЕЗУЛЬТАТ==================================================";
                        cout << endl << "Найден один корень, x = " << *px1 << endl;
                        cout << "================================================================" << endl;
                }
                if (D > 0)
                {
                        *px1 = (-b + sqrt(D)) / (2*a);
                        *px2 = (-b - sqrt(D)) / (2*a);
                        cout << "=====РЕЗУЛЬТАТ==================================================";
                        cout << endl << "Найдено два корня, x1 = " << *px1 << ", x2 = " << *px2 << endl;
                        cout << "================================================================" << endl;
                }
                value = 0;
        }
        return value;
}

//-------END---------------------------------------------------------------------------








//---------Ряд Фибоначи---------------------------------------------------------------------------

int fibmain ()
{
       
        unsigned int answer, position;
    cout << "-----NEXT-------------------------------------------------------" << endl;
        cout << "Ряд Фибоначи" << endl;
        cout << "Выбор позиции числа в ряду? ";
        cout << "\nПозиция - ";
        cin >> position;
        cout << endl;

        answer = GetFib(position);
        cout << "=====РЕЗУЛЬТАТ==================================================";
        cout << endl << answer << " является " << position << " числом ряда Фибоначи! " << endl;
    cout << "================================================================";

    backer ();
    return 0;

       
}


// Функция определения числа

unsigned int GetFib (unsigned int n)
{
        unsigned int minusTwo=1, minusOne=1, answer=2;

        if (n < 3)
                return 1;
        for (n-=3; n!=0; n--)
        {
                minusTwo = minusOne;
                minusOne = answer;
                answer = minusOne + minusTwo;
        }
        return 0;
}

//----END--------------------------------------------------------------------------------------------




//----Функция возврата------------------------------------------------------------------------------

int backer ()
{
        unsigned short int back;
        cout << endl << endl<< "Вернуться в главное меню? (Да - 1, Нет - 2)";
        cin >> back;
        cout << endl << endl;
        switch (back)
        {
        case 1:
                {
                  cout << "-----END---------------------------------------------------------";
                  cout << endl << endl << endl << endl << endl << endl << endl;
                  return main();
                }
                break;

        case 2:
                {
          cout << endl << "Можете закрыть программу.";
                      char response;
          cin >> response;
                }
            break;
        default:
                {
              cout << endl << "<Ошибка! Введите коректное число!>" << endl << endl;
                  return backer ();
                }
        }
}

//-------END-----------------------------------------------------------------------------------------


Drongo 31-03-2009 19:43 1080350

А чего, для кубических уравнений, ввод только для трёх значений, а функция принимает 4 параметра? По моему кубическое уравнение: Ах^3 + Bx^2 + Cx + D = 0 четыре, а у тебя три...
Код:

    cout <<Rus("Ввод уравнения: ") << endl;
        cout << endl <<Rus("(a=) ");
        cin >> a;
        cout <<Rus("(b=) ");
        cin >> b;
        cout <<Rus("(c=) ");
        cin >> c;


XEN_STRANGER 31-03-2009 21:50 1080481

Drongo, а вот сюда посмотри тут так: http://www.tdoc.ru/c/cpp-sources/alg...iya-page2.html посмотри обе страницы

Admiral 01-04-2009 04:21 1080743

XEN_STRANGER, здесь я получаю значения арккосинуса от х значения последнего от -1 до 1 идущие с шагом 0.01.
Этот зачёркнутый кружок - греческая буква φ (Фи), означает угол. Да можно обозначить любой переменной, главное что б было понятно.

crashtuak 02-04-2009 14:19 1081902

Цитата:

Цитата XEN_STRANGER
Ты наверное школу уже закончил, может в универе учишься, может в классе 11-ом, тоесть тригонометрию уже изучаешь, а я пока ещё "не дорос" и не знаю например что такое арккосинус и следовательно перевести это дело в код не могу. Остаётся одна надежда - твоя помошь, прошу помоги... »

Школу не закончил (10 класс), но про арккосинусы и арксинусы знаю, но вот что такое arch & sign я и представить не могу, но главное чтоб в С++ была такая функция:). А Тригонометрическая формула Виета хороша тем, что она не зависит от типа решений уравнений (существуют уравнения с одним целым решением и двумя иррациональными, и уравнения с тремя иррациональными решениями, ну и так далее), ну и вроде бы, на данную формулу и кода надо мало:). Я бы попробовал сделать данный код, но каникулы кончились, надо уроки учить :(. За компом сижу максимум чтоб погоду посмотреть и время узнать :(.

Цитата:

Цитата XEN_STRANGER
P.S. Ты ведь фанат Half-Life 2 да? Если так, то да поможет тебе великий Фримен »

от нехватки времени и Фримен не поможет, а Half-Life 2 просто супер игра :)

Цитата:

Цитата XEN_STRANGER
Drongo, а вот сюда посмотри тут так: http://www.tdoc.ru/c/cpp-sources/alg...iya-page2.html посмотри обе страницы »

вот это вообще супер, только скомпилировать и юзать.


Время: 08:27.

Время: 08:27.
© OSzone.net 2001-