Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2008, 13:22   #11
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вот поправил программу. Нужно в функции передать параметры, писать можно покороче и не хватает одного условия.
Код:
program iii5;
Uses Crt;
Const
R:longint=21;
a:longint=29;
b:longint=35;
Ge:longint=-35;
Go:longint=-34;
Me:longint=34;
Mo:longint=-11;
Var
X,Y,xe,xo,yo,xp,yp:real;

Function ProverkaA (X,Y,xe,xo,yo:real):boolean;
begin
if (Y>0) and (X>0) then
begin
if (Sqr(X-xe)/Sqr(a)+Sqr(Y)/Sqr(b)<=1) and (Sqr(X-xo)+Sqr(Y-yo)>=Sqr(R))
then ProverkaA:=true
else ProverkaA:=false;
end;
end;

Function ProverkaB (X,Y,xe,xo,yo,xp,yp:real):boolean;
begin
if (Y<0) and (X>0) then
begin
if (Sqr(X-xe)/Sqr(a)+Sqr(Y)/Sqr(b)<=1) and (Sqr(X-xo)+Sqr(Y-yo)>=Sqr(R)) and ((X-xp)/(-xp)>=Y/yp)
then ProverkaB:=true
else ProverkaB:=false;
end;
end;

begin
ClrScr;
Writeln('Введите координату X');
Readln(X);
Writeln('Введите координату Y');
Readln(Y);
xe:=(Sqrt(Sqr(a)*Sqr(b)-Sqr(Me)*Sqr(a))/b);
xo:=Go+R;
yo:=Mo+(Sqrt(Sqr(-2*Mo)-4*(Sqr(xo)+Sqr(Mo)-Sqr(R))))/2;
xp:=xe;
yp:=xp*sin(1)/Cos(1);
if ProverkaA(X,Y,xe,xo,yo) and  not ProverkaB(X,Y,xe,xo,yo,xp,yp) then
Writeln('Точка принадлежит области A');
if not ProverkaA(X,Y,xe,xo,yo) and ProverkaB(X,Y,xe,xo,yo,xp,yp) then
Writeln('Точка принадлежит области B');
if not ProverkaA(X,Y,xe,xo,yo) and not ProverkaB(X,Y,xe,xo,yo,xp,yp) then
Writeln('Точка не принадлежит ни одной из областей');
if ProverkaA(X,Y,xe,xo,yo) and  ProverkaB(X,Y,xe,xo,yo,xp,yp) then
Writeln('???? Точка принадлежит ????');
Repeat Until KeyPressed
end.
puporev вне форума Ответить с цитированием
Старый 07.09.2008, 18:50   #12
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Puporev
Спасибо. Можно и покороче, убрать вообще все функции, объявить 2 переменные типа boolean, и по ним делать проверку.
Цитата:
if ProverkaA(X,Y,xe,xo,yo) and ProverkaB(X,Y,xe,xo,yo,xp,yp) then
Writeln('???? Точка принадлежит ????');
Сразу оба значения не могут быть True, либо Y>0, либо Y<0, третьего там нету, так что этот кусок кода можно выбросить.
или типа выдать сообщение (ошибка, этого быть не должно).
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Старый 07.09.2008, 18:57   #13
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Я ведь не знаю суть задачи, поэтому и написал. Просто какое-то сообщение должно быть, а то вводишь числа и смотришь на пустой экран.
puporev вне форума Ответить с цитированием
Старый 07.09.2008, 19:46   #14
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Я убрал все функции из программы, и сделал попроще.
Цитата:
program iii;
Uses Crt;
Const
R:longint=21;
a:longint=29;
b:longint=35;
Ge:longint=-35;
Go:longint=-34;
Me:longint=34;
Mo:longint=-11;
label nach,quit;
Var
X,Y,xe,xo,yo,xp,yp:real;
p1,p2:boolean;
c:char;
begin
nach:
ClrScr;
Writeln('Введите координату X');
Readln(X);
Writeln('Введите координату Y');
Readln(Y);
xe:=(Sqrt(Sqr(a)*Sqr(b)-Sqr(Me)*Sqr(a))/b);
xo:=Go+R;
yo:=Mo+(Sqrt(Sqr(-2*Mo)-4*(Sqr(xo)+Sqr(Mo)-Sqr(R))))/2;
xp:=xe;
yp:=xp*sin(1)/Cos(1);
if (Y>0) and (X>0) then
begin
if (Sqr(X-xe)/Sqr(a)+Sqr(Y)/Sqr(b)<=1) and (Sqr(X-xo)+Sqr(Y-yo)>=Sqr(R))
then p1:=true
else p1:=false;
end;
if (Y<0) and (X>0) then
begin
if (Sqr(X-xe)/Sqr(a)+Sqr(Y)/Sqr(b)<=1) and (Sqr(X-xo)+Sqr(Y-yo)>=Sqr(R)) and ((X-xp)/(-xp)>=Y/yp)
then p2:=true
else p2:=false;
end;
if p1 and not p2 then
Writeln('Точка принадлежит области A');
if not p1 and p2 then
Writeln('Точка принадлежит области B');
if not p1 and not p2 then
Writeln('Точка не принадлежит ни одной области');
Writeln('Нажмите Q для выхода, или любую клавишу чтобы продолжить');
c:=Readkey;
if ((c=#113) or (c=#81)) then
goto quit
else goto nach;
quit:
end.
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 07.09.2008 в 20:21. Причина: Подправил код программы
rainbow вне форума Ответить с цитированием
Старый 07.09.2008, 20:38   #15
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Тогда переделай конец так:
Код:
Writeln('Точка не принадлежит ни одной области');
Writeln('Нажмите любую клавишу  для выхода, или P, чтобы продолжить');
if keypressed then exit
else
read(c);
if ((c='P') or (c='p')) then
goto nach;
end.
Метку quit убери.
puporev вне форума Ответить с цитированием
Старый 08.09.2008, 13:35   #16
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Цитата:
Сообщение от puporev Посмотреть сообщение
Тогда переделай конец так:
Код:
Writeln('Точка не принадлежит ни одной области');
Writeln('Нажмите любую клавишу  для выхода, или P, чтобы продолжить');
if keypressed then exit
else
read(c);
if ((c='P') or (c='p')) then
goto nach;
end.
Метку quit убери.
Не, мне так не нужно, но метку quit можно и убрать, тогда получиться следующее:
Код:
Writeln('Точка не принадлежит ни одной области');
Writeln('Нажмите Q для выхода, или любую клавишу чтобы продолжить');
c:=Readkey;
if ((c=#113) or (c=#81)) then exit
else goto nach;
end.
Кстати можно через циклы (типа repeat until) сделать так, чтобы метки вообще были не нужны и можно было их убрать, их нежелательно использовать, так как у Паскаля есть достаточное количество операторов, чтобы программа шла по порядку, не перепрыгивая, так легче её отлаживать.
Код:
begin
repeat
ClrScr;
.........
Writeln('Точка не принадлежит ни одной области');
Writeln('Нажмите Q для выхода, или любую клавишу чтобы продолжить');
c:=Readkey;
until ((c=#113) or (c=#81));
end.
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 09.09.2008 в 08:11.
rainbow вне форума Ответить с цитированием
Старый 10.09.2008, 13:54   #17
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Теперь такая проблема:
Есть уравнение типа Sqr(x-x0)+Sqr(y-y0)=Sqr(R),
x0,y0,R - заранее определенные константы.
Как сделать так, чтобы программа возвращала y, если задать ей x?
или обязательно надо выразить y из уравнения?
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 10.09.2008 в 13:58.
rainbow вне форума Ответить с цитированием
Старый 10.09.2008, 14:09   #18
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Так решите уравнение относительно У.
y:=sqrt(Sqr(R)-Sqr(x-x0))+y0; при условии, что x-x0<=R.
puporev вне форума Ответить с цитированием
Старый 10.09.2008, 21:10   #19
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

А вот у меня как раз x-xo>R, если задать так, то вылазит ошибка, типа invalid floating operation.
Видимо она вылазит из за того, что программа пытается извлечь корень из отрицательного числа.
Ужас, как я устал от тупизны...
rainbow вне форума Ответить с цитированием
Старый 10.09.2008, 21:32   #20
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
программа пытается извлечь корень из отрицательного числа.
Правильно мыслишь, поэтому и будет решение только при условии, которое я написал. В противном случае решений нет, а что ты задумал, нам не ведомо.
puporev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите разобраться Tanuska___:) БД в Delphi 1 04.09.2008 14:56
Помогите разобраться! Holodok Помощь студентам 12 02.05.2008 18:13
помогите разобраться!) Юliana Помощь студентам 1 30.01.2008 01:16
помогите разобраться с Rss Hallo HTML и CSS 0 24.11.2006 18:44