1

Тема: Некоректні прості обчислення

Треба створити программу, яка будет запитувати у користувача довижну сторін трикутника. Після цього программа повинна вивести на екран периметр трикутника, площу та кути, для яких потрібно розробити функциії.

З написанням программи, проблем не виявилось ніяких, АЛЕ при введені вхідних даних, наприклад, а=26, b=30, в=28; результатом будет: "-nan(ind)". Якщо друге значення, наприклад, a=10, b=14, c=2 - дурно-велике число.

Один й той самий результат виводить cos а,b,c.

Що треба змінити в цьому коді.

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

double SemiPerimeter(double a, double b, double c) {
    double sPerimeter = (a + b + c) / 2;
    return sPerimeter;
}

double Square(double SemiPerimeter, double a, double b, double c) {
    double Square_Geron = sqrt(SemiPerimeter*(SemiPerimeter - a)*(SemiPerimeter - b)*(SemiPerimeter - c));
    return Square_Geron;
}

double Angle(double a, double b, double c) {
    double Angle_CosA = cos((a*a - b*b + c*c) / 2*(b*c));
    double Angle_CosB = cos((a*a - b*b + c*c) / 2*(a*c));
    double Angle_CosC = cos((a*a - b*b + c*c) / 2*(a*b));
    return Angle_CosA;
    return Angle_CosB;
    return Angle_CosC;
}

main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);


    double Square_of_triangle, a, b, c;
    double CosA, CosB, CosC;

    printf("Введіть величину сторони a: ");
    scanf_s("%f", &a);
    printf("Введіть величину сторони b: ");
    scanf_s("%f", &b);
    printf("Введіть величину сторони c: ");
    scanf_s("%f", &c);


    Square_of_triangle = Square(a, b, c, SemiPerimeter(a, b, c));
    printf("\tПлоща трикутника за формулою Герона: %f\n\n", Square_of_triangle);


    CosA = Angle(a, b, c);
    printf("Кyт a дорівнює: %f\n", CosA);
    CosB = Angle(a, b, c);
    printf("Кyт a дорівнює: %f\n", CosB);
    CosC = Angle(a, b, c);
    printf("Кyт a дорівнює: %f\n", CosC);
}

ДЯКУЮ!

2 Востаннє редагувалося quez (01.10.2016 23:54:49)

Re: Некоректні прості обчислення

Один й той самий результат виводить cos а,b,c.

Того що return працює трохи не так, як ви написали в функції Angle

МАКЕ ЦКЯАІИЕ БЯЕАТ АБАІИ
Подякували: leofun011

3

Re: Некоректні прості обчислення

quez написав:

Один й той самий результат виводить cos а,b,c.

Того що return працює трохи не так, як ви написали в функції Angle

Добре з цим я сам можу впоратись.
А що робити з вихідними даннимі(формулой Герона), з return сам розберусь.Що можно зробити/замінити?

4 Востаннє редагувалося Betterthanyou (02.10.2016 00:24:09)

Re: Некоректні прості обчислення

Неправельний формат scanf функції, треба так
lf для double

    printf("Введіть величину сторони a: ");
    scanf("%lf", &a);
    printf("Введіть величину сторони b: ");
    scanf("%lf", &b);
    printf("Введіть величину сторони c: ");
    scanf("%lf", &c);
Подякували: laketych, leofun012

5 Востаннє редагувалося Betterthanyou (02.10.2016 00:31:28)

Re: Некоректні прості обчислення

Якщо ввести

а=26, b=30, в=28;

то рахуємо
SemiPerimeter = 26, a = 30, b =28, c = 42 - Відповідно до ваших параметрів

double Square(double SemiPerimeter, double a, double b, double c) - функція
Square(a, b, c, SemiPerimeter(a, b, c)) - виклик

sqrt(SemiPerimeter*(SemiPerimeter - a)*(SemiPerimeter - b)*(SemiPerimeter - c));
sqrt(26*(26-30)*(26-28)*(26-42))
sqrt(−3328)

корінь не може бути від'ємним от і -nan(ind)

(Зверніть увагу на виділене, і на попереднє повідомлення про формат)

Отак має бути

double Square(double a, double b, double c, double SemiPerimeter) {
    double Square_Geron = sqrt(SemiPerimeter*(SemiPerimeter - a)*(SemiPerimeter - b)*(SemiPerimeter - c));
    return Square_Geron;
}

тоді ви одержите 336

Подякували: laketych, leofun012

6 Востаннє редагувалося dm3s (13.10.2016 18:29:39)

Re: Некоректні прості обчислення

Мабуть потрібно  ще перевіряти  умову чи існує трикутник, - люба сторона трикутника повинна бути менше суми двох інших.

Подякували: koala1

7

Re: Некоректні прості обчислення

Можна це записати трохи простіше:

if ( (abs( b - c ) < a ) && ( a < b + c ) ) ...

Ну і функції надто анотовані, як на мене. Нема сенсу давати змінній, яку повертаємо, назву, що пояснює, що ми повертаємо - це має пояснювати назва функції:

double SemiPerimeter(double a, double b, double c) {
    return (a + b + c) / 2;
}

А в функцію Square (яка має зватися Area - площа фігури, на відміну від Square - майдан) не треба передавати параметром півпериметр - його треба обчислювати на місці, бо ще хтось щось не те передасть:

double Area(double SemiPerimeter, double a, double b, double c) {
    double sPerimeter = SemiPerimeter(a,b,c);
    return sqrt(sPerimeter*(sPerimeter - a)*(sPerimeter - b)*(sPerimeter - c));
}
Подякували: leofun011