IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Помогите плз решить задачу на множество, Два множества на плоскости и треугольник...
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Доброго времени суток всем...
Честно скажу - с програмированием не сложилось еще с начала обучения... Но сессию сдавать надо. Поэтому очень прошу помочь !help.gif

Вот такое условие:

Цитата
Даны два множества точек на плоскости. Из первого множества выбрать три различные точки так, чтобы треугольник с вершинами в этих точках содержал(строго внутри себя) равное количество точек первого и второго множеств.


Путем поиска в интернете было найдено следуещее решение:

uses Crt;
 
type point = record
     x, y : integer;
     end;
 
const MaxArraySize = 10; {Max. array points}
 
var
 ar1, ar2 : array [1..MaxArraySize] of point;
 ar1size, ar2size : integer; {inputed array sizes}
 i, j, k, g, n1, n2 : integer;
 F : Text;
 
{---------------------------------------------------}
procedure ExitProg;
begin
    Writeln('Input error');
    ReadKey;
    Halt;
end;
 
{---------------------------------------------------}
{Fill array by hand, return number of entered points}
{---------------------------------------------------}
function FromKeyb(var mas:array of point; max:integer):integer;
var i,n : integer;
begin
     Writeln('Enter points number (3<x<', max, ')');
     Readln(n);
     if (n < 3) then
     begin
          Writeln('Minimum 3 points need!.');
          ExitProg;
     end;
     if (n > max) then
     begin
          Writeln('Too many points!.');
          ExitProg;
     end;
 
     for i := 0 to n-1 do
     begin
         Write('point #', i+1, ' ');
         Readln(mas[i].x, mas[i].y);
     end;
     FromKeyb := n; {return entered points number}
end;
 
{-----------------------------------------------------}
{Fill array from file, return number of entered points}
{-----------------------------------------------------}
function FromFile(var mas:array of point; fname:string; max:integer):integer;
var i : integer;
    F : text;
 begin
      Assign(F, fname);
      Reset(F);
      {read points}
      i := 0;
      while ((not Eof(F)) and (i < max)) do
      begin
           Readln(F, mas[i].x, mas[i].y);
           i := i+1;
      end;
      Close(F);
 
      if (i < 3) then
      begin
           Writeln('File: ', fname, ' Minimum 3 points need!.');
           ExitProg;
      end;
      Writeln('File: ', fname, ' Readed ', i, ' points.');
      FromFile := i; {return entered points number}
 end;
 
{---------------------------------}
{Is the point strongly in triangle}
{---------------------------------}
function InTriangle(a,b,c,p:point):boolean;
  function pr(t1,t2:point):boolean;
  begin
       pr:=((p.x-t1.x)*(t2.y-t1.y))>((t2.x-t1.x)*(p.y-t1.y));
  end;
begin
     if (pr(a,b)=pr(b,c)) and (pr(a,b)=pr(c,a))
     then
     begin
          if ((a.x=p.x) or (b.x=p.x) or (c.x=p.x)) and
             ((a.y=p.y) or (b.y=p.y) or (c.y=p.y))
          then InTriangle := False
          else InTriangle := True
     end
     else InTriangle := False;
end;
 
begin
 ClrScr;
 Writeln('Input no more ', MaxArraySize, ' points from:');
 Writeln('(1) keyboard');
 Writeln('(2) files in1.txt and in2.txt');
 
 case ReadKey of
 '1': begin
           ClrScr;
           Writeln('Input (x y) coordinats pair for 1st array.');
           ar1size := FromKeyb(ar1, MaxArraySize);
           Writeln('Input (x y) coordinats pair for 2nd array.');
           ar2size := FromKeyb(ar2, MaxArraySize);
      end;
 '2': begin
           ClrScr;
           ar1size := FromFile(ar1, 'c:\in1.txt', MaxArraySize);
           ar2size := FromFile(ar2, 'c:\in2.txt', MaxArraySize);
      end;
 else
    ExitProg;
 end;
 
 Assign(F, 'c:\out.txt');
 Rewrite(F);
 for i:=1 to ar1size do
     for j:=i+1 to ar1size do
         for k:=j+1 to ar1size do
         begin
             n1:=0; n2:=0;
             for g:=1 to ar1size do {points in triangle from array1}
             begin
                           {Write( '(',ar1[i].x,',',ar1[i].y,')',
                                   ' (',ar1[j].x,',',ar1[j].y,')',
                                   ' (',ar1[k].x,',',ar1[k].y,')',
                                   ' ',ar1[g].x,',',ar1[g].y);
                           if (InTriangle(ar1[i],ar1[j],ar1[k],ar1[g]) = True)
                           then Writeln('  true') else Writeln;}
 
                  if (InTriangle(ar1[i],ar1[j],ar1[k],ar1[g]) = True)
                  then n1:=n1+1;
             end;
             for g:=1 to ar2size do {points in triangle from array2}
             begin
                           {Write( '(',ar1[i].x,',',ar1[i].y,')',
                                   ' (',ar1[j].x,',',ar1[j].y,')',
                                   ' (',ar1[k].x,',',ar1[k].y,')',
                                   ' ',ar2[g].x,',',ar2[g].y);
                           if (InTriangle(ar1[i],ar1[j],ar1[k],ar2[g]) = True)
                           then Writeln('  true') else Writeln;}
 
                  if (InTriangle(ar1[i],ar1[j],ar1[k],ar2[g]) = True)
                  then n2:=n2+1;
             end;
             if ((n1=n2) and (n1<>0)) then
             begin
                  Writeln('Triangle: (',ar1[i].x,',',ar1[i].y,')',
                                   ' (',ar1[j].x,',',ar1[j].y,')',
                                   ' (',ar1[k].x,',',ar1[k].y,')');
                  Writeln(F,'Triangle: (',ar1[i].x,',',ar1[i].y,')',
                                   ' (',ar1[j].x,',',ar1[j].y,')',
                                   ' (',ar1[k].x,',',ar1[k].y,')');
                  Writeln(n1,' points strongly in triangle from both arrays.');
                  Writeln(F,n1,' points strongly in triangle from both arrays.');                  Close(F);
                  ReadKey;
                  Halt;
             end;
         end;
 Writeln('Solution not found');
 Writeln(F,'Solution not found');
 Close(F);
 ReadKey;
end.


Но, как мне кажется, это решение не соответствует условию... Вообщем разьясните, плз, если ошибаюсь или представьте свое решение. Буду очень признателен!

Сообщение отредактировано: kpaqp4er -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Во-первых, прочти Правила и убери картинку (да еще и анимированную) из подписи.

Во-вторых, я мог бы сделать две вещи: либо помочь тебе исправить/доделать твое собственное решение, либо, если хочешь, сделать набросок своего. Чье-то постороннее решение, чтобы ты свалил свою курсовую, у меня нет ни малейшего желания даже смотреть. Либо разбирайся с ним сам, либо давай помогу сделать с нуля.
Вот так.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата(Lapp @ 13.05.2009 23:01) *

Во-первых, прочти Правила и убери картинку (да еще и анимированную) из подписи.

Сорри за подпись, исправил.

Цитата(Lapp @ 13.05.2009 23:01) *

Во-вторых, я мог бы сделать две вещи: либо помочь тебе исправить/доделать твое собственное решение, либо, если хочешь, сделать набросок своего. Чье-то постороннее решение, чтобы ты свалил свою курсовую, у меня нет ни малейшего желания даже смотреть. Либо разбирайся с ним сам, либо давай помогу сделать с нуля.
Вот так.

Помощь "с нуля" меня вполне устроит, я бы даже сказал, что это более подходящий вариант. Я выложил найденное решение, чтобы оно возможно помогло (натолкнуло на мысль)...
Спасибо за оперативный ответ!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(kpaqp4er @ 14.05.2009 0:24) *
выложил найденное решение, чтобы оно возможно помогло (натолкнуло на мысль)...
Этого добра пока хватает, слава Богу..

Цитата(kpaqp4er @ 13.05.2009 23:22) *
Даны два множества точек на плоскости. Из первого множества выбрать три различные точки так, чтобы треугольник с вершинами в этих точках содержал(строго внутри себя) равное количество точек первого и второго множеств.
Как заданы точки - в файле?

Вообще, условие не очень четкое. Например, я легко выбираю треугольник, который не содержит совсем точек - получается, что ноль тех и ноль этих - поровну! Может также быть случай, когда возможно сделать по одной точке и по две.. Так что хорошо бы это уточнить. Может, там еще есть условие типа максимальности? Можешь уточнить у препа или еще где-то?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата(Lapp @ 13.05.2009 23:45) *


Как заданы точки - в файле?

Вообще, условие не очень четкое. Например, я легко выбираю треугольник, который не содержит совсем точек - получается, что ноль тех и ноль этих - поровну! Может также быть случай, когда возможно сделать по одной точке и по две.. Так что хорошо бы это уточнить. Может, там еще есть условие типа максимальности? Можешь уточнить у препа или еще где-то?


Условие препод давал с книжицы, я ее скачал, если надо вот она Прикрепленный файл  programming_praktikum.pdf ( 1.16 мегабайт ) Кол-во скачиваний: 7105
А. В. Панюков, Т. А. Панюкова
"Практикум по программированию" Учебное пособие для студентов специальностей «Статистика» и «Математические методы в экономике»
Мое задание находится на 65й странице, 31й вариант.

Больше никаких условий не давал, но я думаю подойдут все варианты, кроме треугольника содержащего 0 точек.

Сообщение отредактировано: kpaqp4er -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(kpaqp4er @ 14.05.2009 1:05) *
я думаю подойдут все варианты, кроме треугольника содержащего 0 точек.
Если эти два множества разнесены в пространстве, то никакого другого решения, кроме того нулевого, не будет совсем. Так что, если оно тебя не устраивает... sad.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата(Lapp @ 14.05.2009 0:17) *

Если эти два множества разнесены в пространстве, то никакого другого решения, кроме того нулевого, не будет совсем. Так что, если оно тебя не устраивает... sad.gif

В этом случае согласен good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(kpaqp4er @ 14.05.2009 1:24) *
В этом случае согласен good.gif
Ок yes2.gif
А в остальных случаях тебя устраивает любое решение - так?

Ну, собственно, чего там писать-то.. Полный перебор тебя, надеюсь, устроит? Кстати, какой порядок количества точек?

Общая схема простейшая. Проходим по всем тройкам точек первого множества и считаем, сколько точек того и другого множества попало унутро. Я ничего не забыл?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата(Lapp @ 14.05.2009 0:35) *

Ок yes2.gif
А в остальных случаях тебя устраивает любое решение - так?

Ну, собственно, чего там писать-то.. Полный перебор тебя, надеюсь, устроит? Кстати, какой порядок количества точек?

Общая схема простейшая. Проходим по всем тройкам точек первого множества и считаем, сколько точек того и другого множества попало унутро. Я ничего не забыл?

Если, чтото и забыл, то я уж точно не подскажу blink.gif Со всем согласен, так как сам до этого и не додумал бы smile.gif

Сообщение отредактировано: kpaqp4er -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Извиняюсь, пришлось немного отвлечься..
Цитата(kpaqp4er @ 14.05.2009 1:54) *
Со всем согласен,
Ну и отлично. Вот тогда набросочек:
const
  m=100; {maximum set size}

type
  tCoord= integer;
  tPoint= record
    x,y: tCoord
  end;

function ASide(p1,p2,q1,q2: tPoint): boolean;
begin
  {
    checking if the line p1,p2 crosses the interval q1,q2
  }
end;

var
  a,b: array[1..m]of tPoint;
  i,j,k,n,Na,Nb,Ia,Ib: integer;

begin
  {
    data input here
  }
  for i:=1 to Na do
    for j:=1 to Na do if i<>j then
      for k:=1 to Na do if (k<>i)and(k<>j) then begin
        Ia:=0;
        Ib:=0;
        for n:=1 to Na do if (n<>i)and(n<>j)and(n<>k) then if (
          ASide(a[i],a[j],a[k],a[n]) and
          ASide(a[k],a[i],a[j],a[n]) and
          ASide(a[j],a[k],a[i],a[n])
        ) then Inc(Ia);
        for n:=1 to Nb do if (n<>i)and(n<>j)and(n<>k) then if (
          ASide(a[i],a[j],a[k],b[n]) and
          ASide(a[k],a[i],a[j],b[n]) and
          ASide(a[j],a[k],a[i],b[n])
        ) then Inc(Ib);
        if Ia=Ib then begin
          {
            results output here
          }
          Halt
        end
      end
end.

Посмотри его, что непонятно - спрашивай.
Логика типа готова, а завтра сделаем геометрию.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


крафчег, чего молчишь?
Без твоих твоих ответов, показывающих, что ты успеваешь разобраться, продолжения не жди.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата(Lapp @ 14.05.2009 20:05) *

крафчег, чего молчишь?
Без твоих твоих ответов, показывающих, что ты успеваешь разобраться, продолжения не жди.

Спасибо за помощь. Сорри, что оперативно не ответил, учеба, домашние дела...
Так по програме понятно в общих чертах... Не совсем понятно как, что и как задавать в функции ASide. Как организовать проверку? Какое условие должно выполнятся?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(kpaqp4er @ 14.05.2009 21:33) *
Не совсем понятно как, что и как задавать в функции ASide.
Это другой вопрос, рн впереди. Тебе понятна логика программы? Все циклы, условия.. Это очень важно. Это тот случай, когда ты можешь "сложить" то, что у тебя не сложилось раньше с программированием.

Цитата(kpaqp4er @ 14.05.2009 21:33) *
Как организовать проверку? Какое условие должно выполнятся?
Это ты про ASide? Ну, подумай, если хочешь. Я могу дать тебе время, не спойлить решение. Это все чистая геометрия. С привлечением графического изображения функций (линейных).


Добавлено через 2 мин.
Результатом функции ASide должен быть ответ на вопрос: лежат ли q1 и q2 по одну сторону от прямой, проходящей через p1 и p2.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14





Группа: Пользователи
Сообщений: 7
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Цитата(Lapp @ 14.05.2009 20:45) *

Это другой вопрос, рн впереди. Тебе понятна логика программы? Все циклы, условия.. Это очень важно. Это тот случай, когда ты можешь "сложить" то, что у тебя не сложилось раньше с программированием.

Это ты про ASide? Ну, подумай, если хочешь. Я могу дать тебе время, не спойлить решение. Это все чистая геометрия. С привлечением графического изображения функций (линейных).
Добавлено через 2 мин.
Результатом функции ASide должен быть ответ на вопрос: лежат ли q1 и q2 по одну сторону от прямой, проходящей через p1 и p2.

Что должно быть в результате я впринципе понял... структура програмы понятна в общих чертах, так как не все из синтаксиса в Паскале мне сейчас понятно, я бы хотел вернуться к этому вопросу чуть позже, если конечно потом сможешь уделить внимание...
Сейчас просто срочное задание, надо 1.gif wacko.gif Апачь и SQL запустить и набросать базу на завтра.
Я отпишу в теме с коментами по представленому тексту, как только с этим справлюсь, а ты уж как сможеш ответиш...
Спасибо за понимание !zdarov.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Синтаксис Паскаля прост и естественен)).
Ты попробуй написать математические выражения для того, что должна делать ASide. Если у тя с математикой все ничего - должно получиться. Если нет - я помогу. Там единственная сложность - как обойти крайние случаи, когда прямые (p1,p2) параллельны осям.
Успехов.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 15.04.2025 21:41
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name