Помощь - Поиск - Пользователи - Календарь
Полная версия: Определить попадание точки в заданный диапазон.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Eduard
uses crt;
var a,b,r,x,y,N,z:real;
begin
clrscr;
Write ('Vvedite kol-vo probnyh tochek ');
readln(N);
writeln('Vvedite radius okuzhnosti');
readln ®;
writeln ('Vvedite krainuyuy x pryam.');
readln(a);
writeln ('Vvedite krainuyuy y pryam.');
readln(b);
z:=1;
while z<=N DO
BEGIN
z:=z+1;
Writeln ('Vvedite x i y');
readln(x,y);
END;
writeln;
repeat
begin
z:=z+1;
if (x<0) and (x>(-a)) and (y<0) and (sqrt(sqr(x)+sqr(y))<=r) then
writeln (x:2:2,' ',y:2:2,' ','Popapla')
else
if (x>0) and (x<a) and (y>0) and (sqrt(sqr(x)+sqr(y))>=r) then
writeln (x:2:2,' ',y:2:2,' ','Ne popala')
else writeln (x:2:2,' ',y:2:2,' ','Ne popala');
end;
UNTIL z=N;
readkey;
end.

Второй цикл выполняется только для одной пары x и y. Что неправильно?
Lapp
Цитата(Eduard @ 15.04.2011 7:35) *

uses crt;
var a,b,r,x,y,N,z:real;
begin
clrscr;
Write ('Vvedite kol-vo probnyh tochek ');
readln(N);
writeln('Vvedite radius okuzhnosti');
readln ®;
writeln ('Vvedite krainuyuy x pryam.');
readln(a);
writeln ('Vvedite krainuyuy y pryam.');
readln(b);
z:=1;
while z<=N DO
BEGIN
z:=z+1;
Writeln ('Vvedite x i y');
readln(x,y);
END;
writeln;
repeat
begin
z:=z+1;
if (x<0) and (x>(-a)) and (y<0) and (sqrt(sqr(x)+sqr(y))<=r) then
writeln (x:2:2,' ',y:2:2,' ','Popapla')
else
if (x>0) and (x<a) and (y>0) and (sqrt(sqr(x)+sqr(y))>=r) then
writeln (x:2:2,' ',y:2:2,' ','Ne popala')
else writeln (x:2:2,' ',y:2:2,' ','Ne popala');
end;
UNTIL z=N;
readkey;
end.

Второй цикл выполняется только для одной пары x и y. Что неправильно?

Вставь
z:= 0;
перед repeat

Добавлено через 3 мин.
Постой, постой... А где у тебя вообще массив?.. Ты вводишь x и y и сразу (при вводе сдедующей точки) затираешь их. Заведи массив точек. Ну, или выполняй проверку прямо при вводе (тогда не нужен второй цикл, все делай в одном).
Eduard
Мне надо, чтобы обязательно было два цикла: while и repeat. А массивы мы еще не проходили.
Lapp
Цитата(Eduard @ 15.04.2011 8:32) *
Мне надо, чтобы обязательно было два цикла: while и repeat. А массивы мы еще не проходили.

ммм.. Я так подозреваю, что вы и файлы не проходили. Да?
Тогда - к Господу Богу. Я не волшебник. Я не умею ходить двумя ногами в одной штанине )). Без массивов (или файлов) в двух циклах эта задача (в том виде, как ты ее представил, то есть с произвольным N) не решается. Баста.

hint: пройди массивы сам ))
Eduard
У меня через час пара начнется. Это нереально пройти. Помогите, пожалуйста, очень надо сдать эту программу.
Lapp
Цитата(Eduard @ 15.04.2011 8:46) *
Помогите, пожалуйста, очень надо сдать эту программу.

Я же сказал: без массивов не решается.
Дашь миллион баксов? Все равно не решу.
НЕ РЕШАЕТСЯ
Eduard
Хотя бы с массивами, пожалуйста. Я не очень понимаю Паскаль над программой 3 дня сидел, с циклами разбирался.
Lapp
Цитата(Eduard @ 15.04.2011 8:51) *
Хотя бы с массивами, пожалуйста. Я не очень понимаю Паскаль над программой 3 дня сидел, с циклами разбирался.
Хорошо, если сам делал - помогу. С массивами, конечно )). Я вставлю массивы.

Но у тебя там что-то странное.. Что такое a и b? и зачем r? Дай полное условие, желательно с рисунком.
Eduard
Изображение
Программа должна определять попадает ли точка в закрашенную область, результатаы вывести в вдие таблицы. Она в ней должна быть возможность выполняться много раз, не перезапускаясь, это я вообще не понял. Обязательно должны быть условный оператор, цикл с предусловием и постусловием.
Lapp
Вот, я вставил массивы (x и y)
параметр цикла заменил на целую переменную (i)
также, подправил границы циклов

Но у тебя там с логикой швах. Неясно, зачем весь этот наворот:
      if (x[i]>0) and (x[i]<a) and (y[i]>0) and (sqrt(sqr(x[i])+sqr(y[i]))>=r) then
writeln (x[i]:2 :2,' ',y[i]:2 :2,' ','Ne popala')
else writeln (x[i]:2 :2,' ',y[i]:2 :2,' ','Ne popala');
- если в обоих случаях выводится одно и то же.. blink.gif
const
m = 100;
var
a,b,r,N: real;
i: integer;
x,y: array [1..m] of real;
begin
Write ('Vvedite kol-vo probnyh tochek (ne boljshe ',m,'): ');
readln(N);
writeln('Vvedite radius okuzhnosti');
readln ®;
writeln ('Vvedite krainuyuy x pryam.');
readln(a);
writeln ('Vvedite krainuyuy y pryam.');
readln(b);
i:= 0;
while i<N DO BEGIN
i:= i+1;
Writeln ('Vvedite x i y');
readln(x[i],y[i]);
END;
writeln;
i:= 0;
repeat
i:= i+1;
if (x[i]<0) and (x[i]>-a) and (y[i]<0) and (sqrt(sqr(x[i])+sqr(y[i]))<=r) then
writeln (x[i]:2 :2,' ',y[i]:2 :2,' ','Popapla')
else
if (x[i]>0) and (x[i]<a) and (y[i]>0) and (sqrt(sqr(x[i])+sqr(y[i]))>=r) then
writeln (x[i]:2 :2,' ',y[i]2.gif 2,' ','Ne popala')
else writeln (x[i]:2 :2,' ',y[i]:2 :2,' ','Ne popala');
UNTIL i=N;
readln;
end.


Добавлено через 2 мин.
Цитата(Eduard @ 15.04.2011 9:06) *
в ней должна быть возможность выполняться много раз, не перезапускаясь, это я вообще не понял
Ааа... ну, так бы и сказал!! млин..
тогда, конечно, массивы не нужны..

ты бы лучше пришел сюда РАНЬШЕ, тогда, когда тебе было что-то НЕПОНЯТНО, и спросил бы.. а не за час до сдачи..
Eduard
Огромное вам спасибо!
Lapp
Цитата(Eduard @ 15.04.2011 9:12) *
Огромное вам спасибо!

Пожалуйста, конечно, но это не то, что тебе надо..
Lapp
Вот тебе решение:
uses CRT;

var
a,b,r,x,y,z: real;
c: char;
begin
writeln('Vvedite radius okuzhnosti');
readln ®;
writeln ('Vvedite krainuyuy x pryam.');
readln(a);
writeln ('Vvedite krainuyuy y pryam.');
readln(b);
repeat
Write ('Vvedite x i y: ');
readln(x,y);
z:= sqrt(sqr(x)+sqr(y));
if
(-a<=x) and (x<=0) and (-b<=y) and (y<=0) and (z<=r)
or
(0<=x) and (x<=a) and (0<=y) and (y<=b) and (z>=r)
then
writeln (x:2:2,' ',y:2:2,' ','Popapla')
else
writeln (x:2:2,' ',y:2:2,' ','Ne popala');
write('Prodolzhitj? (y/n) ');
c:= #0;
while not (c in ['Y','N']) do c:= UpCase(ReadKey);
WriteLn
UNTIL c='N';
WriteLn('Good bye!')
end.

Разберись с ним. И приходи сюда раньше, чем за час до сдачи. Тогда будет толк yes2.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.