Форум программистов, компьютерный форум CyberForum.ru

При вычисление выдает nan - C++

Восстановить пароль Регистрация
 
Бедел
 Аватар для Бедел
232 / 28 / 4
Регистрация: 04.06.2010
Сообщений: 283
04.06.2013, 22:34     При вычисление выдает nan #1
Здравствуйте, дорогие форумчане.
Небольшая программка для вычисления полупериметра треугольника и т.д., реализованная через классы.
Полупериметр считает нормально, а вот при подсчете других формул выдает nan. Помогите разрешить проблему. Заранее спасибо.

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
41
42
43
44
45
46
47
#include <iostream>
#include <math.h>
#include <stdlib.h>
 
using namespace std;
 
class treug
{
    public:
    float p,r,R,S,a,b,c;
    float poluperimetr()
     {
         return ((a+b+c)/2);
     }
    float radiuso()
     {
        return ((a*b*c)/4*sqrt(p*(p-a)*(p-b)*(p-c)));
     }
    float radiusv()
     {
         return (sqrt((p*(p-a)*(p-b)*(p-c))/p));
     }
    float area()
     {
         return (sqrt(p*(p-a)*(p-b)*(p-c)));
     }
};
 
int main()
{
    setlocale(LC_ALL, "Russian");
    treug t;
    cout <<"Введите сторону а, b, c: ";
    cin >> t.a >> t.b >> t.c;
    cout << "Полупериметр равен = " << t.poluperimetr() << endl;
    cout <<"Введите сторону а, b, c: ";
    cin >> t.a >> t.b >> t.c;
    cout << "Радиус описанной окружности равен = " << t.radiuso() << endl;
    cout <<"Введите сторону а, b, c: ";
    cin >> t.a >> t.b >> t.c;
    cout << "Радиус вписанной окружности равен = " << t.radiusv() << endl;
    cout <<"Введите сторону а, b, c: ";
    cin >> t.a >> t.b >> t.c;
    cout << "Площадь равна = " << t.area() << endl;
    system("PAUSE");
    return 0;
}
Добавлено через 4 минуты
Подозреваю, что для других формул требуется ввод полупериметра, так как он используется при вычислениях. Я прав ? Просто когда реализовывал эту программу через функции, этой проблемы не было.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2013, 22:34     При вычисление выдает nan
Посмотрите здесь:

При запуске из среды программа работает, при запуске выполняемого файла выдает ошибку C++
nan C++
LU - разложение (выдает NaN) C++
C++ max [NaN, число] vs max [число, NaN]
При b=1 выдает ошибку C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
04.06.2013, 22:36     При вычисление выдает nan #2
Переменная p инициализирована нулём. Тогда и получается квадрат из 0/0
Бедел
 Аватар для Бедел
232 / 28 / 4
Регистрация: 04.06.2010
Сообщений: 283
04.06.2013, 22:39  [ТС]     При вычисление выдает nan #3
Цитата Сообщение от Olivеr Посмотреть сообщение
Переменная p инициализирована нулём. Тогда и получается квадрат из 0/0
Да, пока писал сюда сам уже понял, в чем проблема)) Спасибо большое.
Просто при реализацию этой программы через функции этого не требовалось. Можете объяснить почему ?
Вот реализация через функции:
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
41
42
43
#include <iostream.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
float poluperimetr(float a, float b, float c);
float radiuso(float a, float b, float c, float p);
float radiusv(float a, float b, float c, float p);
float area(float a, float b, float c, float p);
int main()
{
    setlocale(LC_ALL, "Russian");
    float p=0, R=0, r=0, S=0, a, b, c;
    cout <<"Введите сторону а, b, c: "; cin >> a >>b >>c;
    p=poluperimetr(a,b,c);
    cout << "Полупериметр равен = " << p << endl;
    cout <<"Введите сторону а, b, c: "; cin >> a >>b >>c;
    R=radiuso(a,b,c,p);
    cout << "Радиус описанной окружности равен = " << R << endl;
    cout <<"Введите сторону а, b, c: "; cin >> a >>b >>c;
    r=radiusv(a,b,c,p);
    cout << "Радиус вписанной окружности равен = " << r << endl;
    cout <<"Введите сторону а, b, c: "; cin >> a >>b >>c;
    S=area(a,b,c,p);
    cout << "Площадь равна = " << S << endl;
    system("PAUSE");
    return 0;
}
float poluperimetr(float a, float b, float c)
{
    return ((a+b+c)/2);
}
float radiuso(float a, float b, float c, float p)
{
    return ((a*b*c)/4*sqrt(p*(p-a)*(p-b)*(p-c)));
}
float radiusv (float a, float b, float c, float p)
{
    return (sqrt((p*(p-a)*(p-b)*(p-c))/p));
}
float area (float a, float b, float c, float p)
{
    return (sqrt(p*(p-a)*(p-b)*(p-c)));
}
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
04.06.2013, 22:42     При вычисление выдает nan #4
Вот через классы:
Кликните здесь для просмотра всего текста
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
41
42
43
44
45
#include <iostream>
#include <math.h>
#include <stdlib.h>
 
using namespace std;
 
class treug
{
    public:
        treug(float _a, float _b, float _c):
            a(_a), b(_b), c(_c)
        {
            p = (a+b+c)/2;
            R = ((a*b*c)/4*sqrt(p*(p-a)*(p-b)*(p-c)));
            r = (sqrt((p*(p-a)*(p-b)*(p-c))/p));
            S = (sqrt(p*(p-a)*(p-b)*(p-c)));
        }
    float p,r,R,S,a,b,c;
 
    float poluperimetr()
    { return p; }
 
    float radiuso()
    { return R; }
 
    float radiusv()
    { return r; }
 
    float area()
    { return S; }
};
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout <<"Введите сторону а, b, c: ";
    float a, b, c; cin >> a >> b >> c;
    treug t(a, b, c);
    cout << "Полупериметр равен = " << t.poluperimetr() << endl;
    cout << "Радиус описанной окружности равен = " << t.radiuso() << endl;
    cout << "Радиус вписанной окружности равен = " << t.radiusv() << endl;
    cout << "Площадь равна = " << t.area() << endl;
    system("PAUSE");
    return 0;
}

Цитата Сообщение от Бедел Посмотреть сообщение
Просто при реализацию этой программы через функции этого не требовалось. Можете объяснить почему ?
потому, что вот
C++
1
p=poluperimetr(a,b,c);
Бедел
 Аватар для Бедел
232 / 28 / 4
Регистрация: 04.06.2010
Сообщений: 283
04.06.2013, 22:47  [ТС]     При вычисление выдает nan #5
Цитата Сообщение от Olivеr Посмотреть сообщение
Вот через классы:
Кликните здесь для просмотра всего текста
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
41
42
43
44
45
#include <iostream>
#include <math.h>
#include <stdlib.h>
 
using namespace std;
 
class treug
{
    public:
        treug(float _a, float _b, float _c):
            a(_a), b(_b), c(_c)
        {
            p = (a+b+c)/2;
            R = ((a*b*c)/4*sqrt(p*(p-a)*(p-b)*(p-c)));
            r = (sqrt((p*(p-a)*(p-b)*(p-c))/p));
            S = (sqrt(p*(p-a)*(p-b)*(p-c)));
        }
    float p,r,R,S,a,b,c;
 
    float poluperimetr()
    { return p; }
 
    float radiuso()
    { return R; }
 
    float radiusv()
    { return r; }
 
    float area()
    { return S; }
};
 
int main()
{
    setlocale(LC_ALL, "Russian");
    cout <<"Введите сторону а, b, c: ";
    float a, b, c; cin >> a >> b >> c;
    treug t(a, b, c);
    cout << "Полупериметр равен = " << t.poluperimetr() << endl;
    cout << "Радиус описанной окружности равен = " << t.radiuso() << endl;
    cout << "Радиус вписанной окружности равен = " << t.radiusv() << endl;
    cout << "Площадь равна = " << t.area() << endl;
    system("PAUSE");
    return 0;
}


потому, что вот
C++
1
p=poluperimetr(a,b,c);
Спасибо, теперь точно всё понятно)
Yandex
Объявления
04.06.2013, 22:47     При вычисление выдает nan
Ответ Создать тему
Опции темы

Текущее время: 07:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru