21

Re: Доброго вечора, допоможіть з лабараторною

У вас три точки завжди на одній прямій.

22

Re: Доброго вечора, допоможіть з лабараторною

Візьмемо ось таку зону: https://www.desmos.com/calculator/f8jc6ohgs5 (перетин усіх трьох областей).

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

bool inputValid(const char *name, float *out_x, float *out_y) {
    printf("Введіть координату %s:", name);
    float x, y;
    int read = scanf("%f %f", &x, &y);
    if(read!=2) {
        printf("Введіть два числа через пробіл!\n");
        return false;
    }
    if(x*x+y*y>9.0 || y>x/2.0 || y>0.0) {
        printf("Точка за межами області!\n");
        return false;
    }
    *out_x = x;
    *out_y = y;
    return true;
}

int main() {
    float x1,y1,x2,y2,x3,y3;
    if(!inputValid("A",&x1,&y1) || !inputValid("B",&x3,&y3) || !inputValid("C",&x3,&y3))
        return 1;
    float a = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
    float b = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
    float c = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
    float p = (a + b + c) / 2;
    float s = sqrt(p * (p - a) * (p - b) * (p - c));
    if(s<=1e-10) {
        printf("Точки на одній прямій!\n");
        return 1;
    }
    printf("S = %f, P = %f\n", s, 2*p);
}

23 Востаннє редагувалося PeSePol (20.09.2023 18:47:40)

Re: Доброго вечора, допоможіть з лабараторною

koala, додайте також що і х≤0, та yвираховується автоматично, згідно з умовами завдання y=0,5*х, а у вашому прикладі обидві координати вводяться вручну і друга не залежить від першої.
а також можна замінити умову х*х+y*y<=9 на х>=-2,68 && x <= 0, тому що (-2,68)*(-2,68)+(-1,34)*(-1,34)=8,978 а (-2,69)*(-2,69)+(-1,345)*(-1,345)=9,045125

24

Re: Доброго вечора, допоможіть з лабараторною

Перечитайте завдання: y=х/2  - це лінія, що обмежує область, у якій лежать точки, а не їхнє ГМТ. Ба більше, якщо точки на одній прямій, то там прямо вказано, що це треба виявляти, а нащо виявляти те, що задане умовою?

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

25

Re: Доброго вечора, допоможіть з лабараторною

koala написав:

Перечитайте завдання: y=х/2  - це лінія, що обмежує область, у якій лежать точки, а не їхнє ГМТ. Ба більше, якщо точки на одній прямій, то там прямо вказано, що це треба виявляти, а нащо виявляти те, що задане умовою?

тоді ще простіше. Треба перевіряти по х діапазон -2,68...2,68, а по y-1,34...0, а не займатися перевіркою суми квадратів, і при введенні значень вказувати діапазон.

І тоді виходить щось таке

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

int main()
{
    setlocale(LC_CTYPE, "ukr");

    float x1, x2, x3, y1, y2, y3;

    printf("ЛІМІТИ Х -2,68...2,68 \n");
    printf("ЛІМІТИ Y -1.34...0.0 \n");

    printf("Введіть координату А:x ");
    scanf_s("%f", &x1);
    if (x1 < -2.681 || x1 > 2.681)
    {
        printf("точка поза зоною\n");
        return 0;
    }
    printf("Введіть координату А:y ");
    scanf_s("%f", &y1);
    if (y1 < -1.341 || y1 > 0.1)
    {
        printf("точка поза зоною\n");
        return 0;
    }
    printf("А( %f , %f)\n",x1,y1);

    printf("Введіть координату B:x ");
    scanf_s("%f", &x2);
    if (x2 < -2.681 || x2 > 2.681)
    {
        printf("точка поза зоною\n");
        return 0;
    }
    printf("Введіть координату B:y ");
    scanf_s("%f", &y2);
    if (y2 < -1.341 || y2 > 0.1)
    {
        printf("точка поза зоною\n");
        return 0;
    }
    printf("B( %f , %f)\n", x2, y2);

    printf("Введіть координату C:x ");
    scanf_s("%f", &x3); 
    if (x3 < -2.681 || x3 > 2.681)
    {
        printf("точка поза зоною\n");
        return 0;
    }
    printf("Введіть координату C:y ");
    scanf_s("%f", &y3);
    if (y3 < -1.341 || y3 > 0.1)
    {
        printf("точка поза зоною\n");
        return 0;
    }
    printf("C( %f , %f)\n", x3, y3);

    float a, b, c, p, S, P;

    a = sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1) * (y2 - y1)));
    b = sqrt(((x3 - x2) * (x3 - x2)) + ((y3 - y2) * (y3 - y2)));
    c = sqrt(((x1 - x3) * (x1 - x3)) + ((y1 - y3) * (y1 - y3)));
    printf("a = %f, b = %f, c = %f\n", a, b, c);

    p = (a + b + c) * 0.5;
    printf("p = %f\n", p);

    S = sqrt(p * (p - a) * (p - b) * (p - c));

    if (S <= 1e-10)
    {
        printf("точки на одній прямій\n"); 
        return 0;
    }
    P = a + b + c;

    printf("S = %f, P = %f\n", S, P);
    return 0;     
}

26

Re: Доброго вечора, допоможіть з лабараторною

Я вище викладав графіки. Подивіться краще.

27 Востаннє редагувалося PeSePol (20.09.2023 22:35:46)

Re: Доброго вечора, допоможіть з лабараторною

ось цитата автора

fruktsashamaks написав:

На площині задані обмежена лініями x^2 +y^2=9, y = x/2, y <=0 область R і точки A (x1, y1), B (x2, y2), C (x3, y3). Розробити програму, яка обчислює периметр і площу трикутника ABC, якщо точки A,B,C належать області R і не лежать на одній прямій, інакше видати відповідне повідомлення.

y = x/2

ось ваш Y y ≤ х/2 у графіку. Виправіть у графіку будь ласка

28

Re: Доброго вечора, допоможіть з лабараторною

Зламали студента на простій задачі в дві дії

29

Re: Доброго вечора, допоможіть з лабараторною

PeSePol, там написано "обмежена". Ви розумієте значення цього слова? І ваш прямокутник зовсім не схожий на область, обмежену цими лініями.

30

Re: Доброго вечора, допоможіть з лабараторною

koala, я розумію значення цього слова, а також я розумію, що функція y = x/2, або y = x^5 і т.д. це не більше, не меньше, не множина, не пошук шляху, а точне визначення прямої залежності y від х, і = значить =.

31

Re: Доброго вечора, допоможіть з лабараторною

Чудово, але ця функція визначає не область, а лінію, якою ця область обмежена. В чому проблема це зрозуміти?

32

Re: Доброго вечора, допоможіть з лабараторною

koala написав:

Чудово, але ця функція визначає не область, а лінію, якою ця область обмежена. В чому проблема це зрозуміти?

лінія, якою область область обмежується, складається з точок. У точки, згідно умов, є 2 координати, одна з яких є половиною іншої ( а не меньше половини іншої), і повинна бути 0-ю або від'ємною. Також є умова, згідно якої обмежувальна лінія знаходиться на відстані суми квадратів, яка має дорівнювати 9, тобто (-2,683 , -1,3415).

Для прикладу візьмемо RPG, де ландшафт  це площина, а область мобів це обмежений лініями сектор цієї площини, за яку моб не має права вийти, і наведіть приклад, щоб сектор мобів розтягувався та здувався, як куля.

33

Re: Доброго вечора, допоможіть з лабараторною

Пряма (у загальному випадку з рівнянням f(x,y)=ax+by+c=0, a^2+b^2>0) ділить площину на 2 півплощини. Для всіх точок на прямій виконується згадане рівняння; для однієї півплощини буде виконуватися f(x,y)>0, для іншої - f(x,y)<0, і це виконується для будь-яких ліній, заданих неперервною функцією. Для кола: f(x,y)=x^2+y^2-r^2=0; точки всередині обмеженого колом круга даватимуть f(x,y)<0, ззовні - f(x,y)>0.
Тут сказано, що точки лежить в ОБЛАСТІ, обмеженій рівнянням кола, рівнянням прямої і - з якогось дива - нерівністю півплощини (швидше за все, десь в умові помилка, але автор не хоче прояснити це місце, тож маємо те, що маємо). Тобто для точок області виконуватимуться саме нерівності, а не лише рівняння; рівняння виконуватимуться лише для КОРДОНІВ області. До речі, також в умові не сказано, чи відносяться кордони до області. Що незрозумілого?

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

34

Re: Доброго вечора, допоможіть з лабараторною

Зачекаємо, може автор скине скрін завдання лабораторної, або напише так, як було написано там.
koala дякую що витратили свій час на дискусію  *DRINK*