Помощь - Поиск - Пользователи - Календарь
Полная версия: Pascal > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
Буду
Задача наверное покажется лёгкой-лёгкой, кому-то, но я что-то вот никак.
Исходная задача:
1. по данным коэффициентам уравнения прямой линии на плоскости (Ах+Ву+С=0) должен вычисляться угол, образуемый этой прямой с положительным направлением оси оХ (полагается, что А<>0, В<>0).
2. доработать программу так, чтобы выполнялась проверка на допустимость вводимых данных, а так же учитывался случай В=0, при А<>0 и определялось, проходит ли заданная коэффициентами уравнения прямая через начало координат.

Формулу нашла для вычисления угла -tg(a/b), вот только если решать дальше, без с, то ничего хорошего не выходит.

Помогите, пожалуйста, кто чем может....
crazymaster
а угол вычислять в пределах от 0 до 2pi , или от -pi до pi ?
Буду
Условия не стоит такого, вообще-то, но мне думается 0 до 2pi.. Хотя опять же, там же прямая и плоскость, а не прямая и окружность..
crazymaster
если от 0 до 360 то вот такие условия нужно задать:
если A>0 , B>=0, то угол arctg(B/A)+pi/2
если A<0, B>=0 то угол pi/2-arctg(B/A)
если A<0, B<0то угол pi/2+arctg(B/A)
если А>0, B<0 то 3pi/2-arct(y/x)
если x=0, y<>0 то 0 или 2(pi)n


т.е A и B определяют вектор перпендикулярный данной прямой
Буду
Вот в том то и дело, что условий много. А от нас требуют, чтоб решили всё в одно условие.
Я когда первую часть сдала, сказали, что верно:
read(a,b,c):
writeln('rad=',-1*(a/b));
но - там с не учитывается вообще т.е. по умолчанию 0, а во второй части уже нужно проверку С делать. Там получится, прям.проходит через нач. коорд., если с=0, а угол в любом случае равен 90 градусов, если в=0 (во всех случаях а<>0), вот только не могу придумать как в одно условие записать это всё...может это вообще не верно..
crazymaster
Цитата(Буду @ 1.10.2008, 13:25) *

Я когда первую часть сдала, сказали, что верно:
read(a,b,c):
writeln('rad=',-1*(a/b));

writeln('rad=',-1*(a/b)); - но это же не угол между прямой и осью 0x ?


в одно условие что то я не соображу как(

Цитата(Буду @ 1.10.2008, 13:25) *

Там получится, прям.проходит через нач. коорд., если с=0,

ну верно, если c=0, то проходит через начало координат
Тролль
Ну вообще-то угол между прямой и положительным направлением оси Ох находится между 0 и pi.
crazymaster
ой ..точно, куда меня понесло)))))
тогда pi/2+arctg(B/A) - формула для угла
Буду
Цитата
тогда pi/2+arctg(B/A) - формула для угла


а как же С?..
Как тогда условие поставить?
Тролль
С не влияет на угол наклона.
Буду
Тогда нужно поставить условия:
b=0 and c=0 or b<>0 and c=0 - при этом будет считаться угол и будет написано, что прямая прох.через нач.координат.
А в else будет просто рассчёт угла...так?
creer
При С=0 прямая проходит через начало координат.
При A=0 и B<>0 прямая параллельна оси Ox.
При A<>0 и B=0 прямая перпендикулярна оси Ox.
Буду
А по условию всегда не равно 0...
Чёт я теперь вообще запуталась..
creer
Код
readln(a, b, c);
if (a<>0) or (b<>0) then
begin
  if a=0 then
    writeln(0)
  else
    writeln(pi/2+arctan(b/a));
  if c=0 then
    writeln('Прямая пересекает начало координат');
end;

Если a=0 и c<>0, то прямая не пересекает Ox, а если a=0 и с=0, то лежит на Ox.
Буду
Код
if (b=0) and (c=0) or (b<>0) and (c=0) then
begin
Writeln('Pryamaya prohodit cherez nachalo koordinat');
writeln('ugol raven ');
writeln('Rad=',pi/2+arctan(b/a));
writeln('Gr=',(((pi/2+arctan(b/a)))/180));
end
else
begin
writeln('ugol raven ');
writeln('Rad=',pi/2+arctan(b/a));
writeln('Gr=',(((pi/2+arctan(b/a)))/180));
end;

Проверьте, пожалуйста?.. а то как-то там совсем даже не получается, что при b=0 угол равен 90 градусам..
creer
Цитата
if (b=0) and (c=0) or (b<>0) and (c=0) then

Вот здесь точно лишнее условие. Проще написать "if c=0 then"
b в любом случае либо равно 0, либо не равно 0.
И есть одна ошибочка при переводе в градусы. Нужно поделить на pi и умножить на 180.
writeln('Gr=',(((pi/2+arctan(b/a)))/pi*180));
Тогда получится 90 градусов smile.gif
Можно даже написать, скажем writeln('Gr=',(((pi/2+arctan(b/a)))/pi*180):5:5);
Тогда будет точно видно что это 90 градусов smile.gif
Буду
Ваааааа!!!!!!!! СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Правда у этой задачи есть ещё запутанное продолжение..можно спросить?..
creer
Спросить конечно можно wink.gif
Буду
=)
Далее по условию задачи нужно полученную программу модифицировать так, "чтоб автоматически осуществлялись многократные решения задачи при изменении одного из исходных данных в заданном диапазоне. Шаг изменения аргумента должен быть высчитан так, чтобы число повторений цикла лежало в диапазоне от 15 до 20 (исходная переменная, значение которой должно изменяться, определяется студентом самостоятельно).
Результаты выводить в виде таблицы:
аргумент х0 |Длина |Площадь|Комментарий
1.0 |12.89 |345.77 |точка на окружности
1.2 |17.90 |785.42 |точка вне окружности
... |... |... |...


Что-т не пойму с какой стороны её начать решать о_О Вроде бы как через while..
creer
Да, нужно сделать примерно так:
db:= 0; //Начало диапазона
de:= 10; //Конец диапазона
cv:= db; //Текущее значение
while (cv<=de) do
begin
//Сюда вставить Ваш исходный код из 15-го сообщения, который считает для одной точки.
//Только вместо одного параметра, например b, написать cv.
//Т.е. writeln('Rad=',pi/2+arctan(cv/a));

cv:=cv + (de-db)/20; //Следующий шаг
end;
Буду
Забавно..._)) Но получилось)))))
Спасибо большущее..и не знаю, чтобы делала без вас
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.