Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
#1

Рекурсивная функция/аварийное завершение программы - C++

03.05.2015, 02:14. Просмотров 466. Ответов 6
Метки нет (Все метки)

Всем привет.
Задание такое: есть вырожение
A * x + B * sqrt(x ^ 3) - C * exp(-x / 50) - D = 0
Нужно найти такое х, с погрешность 1e-7 или больше, при котором это вырожение верно. Значения переменных A, B, C, D даны в файле data.txt.

Содержимое файла data.txt:
2
0.59912051 0.64030348 263.33721367 387.92069617
15.68387514 1.26222280 695.23706506 698.72384731
Первое значение 2 - это количество случаев, для которых надо найти х, а следующие строчки содержат значениями A, B, C и D для каждого случая соответственно.

х надо искать через бинарный поиск, соответственно сделал через рекурсию, вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//Binary Search
 
#include <iostream>
#include <cmath>
#include <iomanip>
#include <fstream>
using namespace std;
 
double binSearch(double **arr, int Begin, int End, int i)
{
    double x, index;
    x = index = (Begin + End) / 2;
 
    if((arr[i][0] * x + arr[i][1] * sqrt(pow(x, 3)) - arr[i][2] * exp((-x) / 50) - arr[i][3]) != 0)
        x > 0 ? binSearch(arr, Begin, index, i) : binSearch(arr, index, End, i);
    else return x;
}
 
int main()
{
    int N;
    ifstream fin("data.txt");
    fin >> N;
    double **data = new double*[N];
    for(int i = 0; i < N; i++)
    {
        data[i] = new double[4];
        for(int j = 0; j < 4; j++)
            fin >> data[i][j];
    }
 
    for(int i = 0; i < N; i++)
        cout << setprecision(20) << binSearch(data, 0, 100, i) << " ";
 
    for(int i = 0; i < N; i++)
        delete[] data[i];
    delete[] data;
 
    return 0;
}
А теперь проблема:
Программа, при запуске, завершается аварийно. Не могу понять, в чем ошибка.

Буду рад любой помощи.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2015, 02:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсивная функция/аварийное завершение программы (C++):

Аварийное завершение программы - C++
Программа завершается аварийно, но в файл записывает требуемую информацию. Укажите косяки. В проекте использую многобайтовую...

Аварийное завершение программы - C++
#include &quot;B.h&quot; #include &quot;D1.h&quot; #include &quot;D2.h&quot; #include &lt;iostream&gt; #include &lt;typeinfo&gt; using namespace std; class B ...

Аварийное завершение работы программы - C++
1)программа работает правильно но когда нажимаю ентер (после этого она должна завершить работу) выбивает Run-Time Check Failure #2 - Stack...

Ошибка. Аварийное завершение программы. - C++
Товарищи,есть функция.. cor find(cor start) { cor buf=start; cor pv=NULL; char adr; int et,kol,S; double x; ...

Аварийное завершение программы, ошибка в функции вывода. - C++
Здравствуйте все. Пишу программу для сложения, вычитания матриц. Использую перегрузку операторов. При выводе результатов возникает ошибка и...

Abnormal program termination (аварийное завершение программы) - C++
Из за чего программа может выдать abnormal program termination (аварийное завершение программы), программа должна открывать файл...и...

6
Enno
267 / 170 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
03.05.2015, 05:07 #2
Переполнение стека. Переменные x и index в рекурсивной функции стабилизируются в значениях 0 и 0, т.е. контекст функции перестаёт изменяться и она уходит в бесконечную рекурсию. Соответственно при каждом вызове занимая часть стека.
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
03.05.2015, 12:56  [ТС] #3
Enno, Тоесть, функция не находит такого х, при котором вырожение верно?
0
Enno
267 / 170 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
03.05.2015, 14:22 #4
x > 0
Это выражение будет всегда истинным, ибо (Begin + End) / 2 всегда > 0. Не стоит задавать координаты целыми, если у тебя не сеточная функция. Задай их тоже double, может и найдёшь решение.

Добавлено через 2 минуты
Кстати, ты ищешь точное решение, а этот метод для приближённого. Надо тебе было задать точность и сравнивать результат с точностью.

Добавлено через 4 минуты
Вот два результата для точности 0.0001
73.5953688621521
41.899174451828003
Они должны были получиться?
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
03.05.2015, 14:47  [ТС] #5
Enno, моя функция была не совсем верная. Я ее переделал
C++
1
2
3
4
5
6
7
8
9
10
double binSearch(double **arr, double Begin, double End, int i)
{
    double x = (Begin + End) / 2, index;
 
    index = arr[i][0] * x + arr[i][1] * sqrt(pow(x, 3)) - arr[i][2] * exp((-x) / 50) - arr[i][3];
 
    if((int)round(index * 10000000) / 10000000 != 0)
        round((index * 10000000) / 10000000) > 0 ? binSearch(arr, Begin, x, i) : binSearch(arr, x, End, i);
    else return x;
}
Вот теперь она вроде как верная, но программа опять же работает не верно, при выполнение, да выходе я получаю nan и nan

Можите скинуть код, с помощью которого вы получили такие значения, ибо они именно такие и должны быть?
0
Enno
267 / 170 / 38
Регистрация: 25.08.2014
Сообщений: 1,088
Записей в блоге: 1
03.05.2015, 15:18 #6
C++
1
2
3
4
5
6
7
8
9
10
#define EPSILON 0.0001
double binSearch(double **arr, double Begin, double End, int i)
{
    double x, index;
    x = index = (Begin + End) / 2;
    double y = (arr[i][0] * x + arr[i][1] * sqrt(pow(x, 3)) - arr[i][2] * exp((-x) / 50) - arr[i][3]);
    if(abs(y) > EPSILON)
        x = y > 0 ? binSearch(arr, Begin, index, i) : binSearch(arr, index, End, i);
    return x; 
}
1
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
03.05.2015, 15:21  [ТС] #7
Enno, Уже сам решил, но спасибо за альтернативное решение
0
03.05.2015, 15:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2015, 15:21
Привет! Вот еще темы с ответами:

Аварийное завершение программы (Прата, глава 12, string1) - C++
Доброго времени суток. Не могу понять, из-за чего происходит аварийное завершение программы. VS 2015 string1.h // string1.h --...

Аварийное завершение программы (Process terminated with status -1073741510) - C++
Всем доброго времени суток. У меня следующая проблема. Вот код(из учебника, не мой): #include &lt;iostream&gt; #include &lt;cstring&gt; ...

Аварийное завершение программы при использовании метода merge для list - C++
Подскажите пожалуйста почему в строке 10 получаю аварийное завершение ? int _tmain(int argc, _TCHAR* argv) { list&lt;int&gt; l(10); ...

Аварийное завершение... почему? - C++
Код рабочий, но если элементов больше 4, тогда программа аварийно завершает работу, почему? #include &lt;iostream&gt; using namespace std; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru