Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Определить попадание точки в заданный диапазон.

Автор: Eduard 15.04.2011 10: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. Что неправильно?

Автор: Lapp 15.04.2011 11:27

Цитата(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 15.04.2011 11:32

Мне надо, чтобы обязательно было два цикла: while и repeat. А массивы мы еще не проходили.

Автор: Lapp 15.04.2011 11:45

Цитата(Eduard @ 15.04.2011 8:32) *
Мне надо, чтобы обязательно было два цикла: while и repeat. А массивы мы еще не проходили.

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

hint: пройди массивы сам ))

Автор: Eduard 15.04.2011 11:46

У меня через час пара начнется. Это нереально пройти. Помогите, пожалуйста, очень надо сдать эту программу.

Автор: Lapp 15.04.2011 11:49

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

Я же сказал: без массивов не решается.
Дашь миллион баксов? Все равно не решу.
НЕ РЕШАЕТСЯ

Автор: Eduard 15.04.2011 11:51

Хотя бы с массивами, пожалуйста. Я не очень понимаю Паскаль над программой 3 дня сидел, с циклами разбирался.

Автор: Lapp 15.04.2011 11:58

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

Но у тебя там что-то странное.. Что такое a и b? и зачем r? Дай полное условие, желательно с рисунком.

Автор: Eduard 15.04.2011 12:06

http://pikucha.ru/i4MnU
Программа должна определять попадает ли точка в закрашенную область, результатаы вывести в вдие таблицы. Она в ней должна быть возможность выполняться много раз, не перезапускаясь, это я вообще не понял. Обязательно должны быть условный оператор, цикл с предусловием и постусловием.

Автор: Lapp 15.04.2011 12:09

Вот, я вставил массивы (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 15.04.2011 12:12

Огромное вам спасибо!

Автор: Lapp 15.04.2011 12:13

Цитата(Eduard @ 15.04.2011 9:12) *
Огромное вам спасибо!

Пожалуйста, конечно, но это не то, что тебе надо..

Автор: Lapp 15.04.2011 12:34

Вот тебе решение:

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