Помощь - Поиск - Пользователи - Календарь
Полная версия: Определить попадание точки в заданный диапазон.
Форум «Всё о Паскале» > 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 (r);
    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 (r);
    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 (r);
  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,'  ','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 (r);
  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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.