Re: Доброго вечора, допоможіть з лабараторною
У вас три точки завжди на одній прямій.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Доброго вечора, допоможіть з лабараторною
Для відправлення відповіді ви повинні увійти або зареєструватися
У вас три точки завжди на одній прямій.
Візьмемо ось таку зону: 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);
}
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
Перечитайте завдання: y=х/2 - це лінія, що обмежує область, у якій лежать точки, а не їхнє ГМТ. Ба більше, якщо точки на одній прямій, то там прямо вказано, що це треба виявляти, а нащо виявляти те, що задане умовою?
Перечитайте завдання: 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;
}
Я вище викладав графіки. Подивіться краще.
ось цитата автора
На площині задані обмежена лініями 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 у графіку. Виправіть у графіку будь ласка
Зламали студента на простій задачі в дві дії
PeSePol, там написано "обмежена". Ви розумієте значення цього слова? І ваш прямокутник зовсім не схожий на область, обмежену цими лініями.
koala, я розумію значення цього слова, а також я розумію, що функція y = x/2, або y = x^5 і т.д. це не більше, не меньше, не множина, не пошук шляху, а точне визначення прямої залежності y від х, і = значить =.
Чудово, але ця функція визначає не область, а лінію, якою ця область обмежена. В чому проблема це зрозуміти?
Чудово, але ця функція визначає не область, а лінію, якою ця область обмежена. В чому проблема це зрозуміти?
лінія, якою область область обмежується, складається з точок. У точки, згідно умов, є 2 координати, одна з яких є половиною іншої ( а не меньше половини іншої), і повинна бути 0-ю або від'ємною. Також є умова, згідно якої обмежувальна лінія знаходиться на відстані суми квадратів, яка має дорівнювати 9, тобто (-2,683 , -1,3415).
Для прикладу візьмемо RPG, де ландшафт це площина, а область мобів це обмежений лініями сектор цієї площини, за яку моб не має права вийти, і наведіть приклад, щоб сектор мобів розтягувався та здувався, як куля.
Пряма (у загальному випадку з рівнянням 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.
Тут сказано, що точки лежить в ОБЛАСТІ, обмеженій рівнянням кола, рівнянням прямої і - з якогось дива - нерівністю півплощини (швидше за все, десь в умові помилка, але автор не хоче прояснити це місце, тож маємо те, що маємо). Тобто для точок області виконуватимуться саме нерівності, а не лише рівняння; рівняння виконуватимуться лише для КОРДОНІВ області. До речі, також в умові не сказано, чи відносяться кордони до області. Що незрозумілого?
Зачекаємо, може автор скине скрін завдання лабораторної, або напише так, як було написано там.
koala дякую що витратили свій час на дискусію
Для відправлення відповіді ви повинні увійти або зареєструватися