01 мая 2010

О проблемах современного образования

Сегодня я вспоминал юность... В те далёкие времена я весьма неплохо программировал на языке Pascal, как показала практика мастерство невозможно потерять... Ну так вот поступило задание написать программку для студентки 1 курса ОмГТУ, данная студентка учится на специальности с модным в данное время названием - "нанотехнологии". Самое смешное что задача которую она не знает как реализовывать решается максимум за 3 часа, достаточно включить мозг и подумать.
Задача такова:
Имеется множество точек на плоскости. Необходимо найти такую группу точек которая формировала бы квадрат с наибольшим периметром.

Данную задачу можно разделить на 3 части:
1. внесение координат
2. группировка координат
3. поиск группы удовлетворяющей условию задачи.



Как ни странно но самым интересным было реализовывать именно третью часть...
получился вот такой код:
function PKvadrata(x1,y1,x2,y2,x3,y3,x4,y4: integer):real;
  var a, b, c: real;
      quad: real;
      Perimetr: real;
  begin
    a:=sqrt(sqr(x2-x1)+sqr(y2-y1));
    b:=sqrt(sqr(x3-x1)+sqr(y3-y1));
    c:=sqrt(sqr(x4-x1)+sqr(y4-y1));

    if a=b then
    begin
      quad:=a*sqrt(2);
      if c=quad then perimetr:=a*4;
    end else
    if a=c then
    begin
      quad:=a*sqrt(2);
      if b=quad then perimetr:=a*4;
    end else
    if b=c then
    begin
      quad:=b*sqrt(2);
      if a=quad then perimetr:=b*4;
    end else perimetr:=0;
    result:=perimetr;
  end;
Данная функция используя формулу поиска длинны отрезка по его координатам определяет формируется ли с помощью заданных координат квадрат, и если формируется то вычисляет его периметр.

Вторая часть задачи тоже весьма интересна... В результате написания кода выяснилось что то что было бы спокойно обработано интерпретатором PHP не может быть откомпилировано в Pascal'e... в итоге получился код с монстрообразным условием:
for i1:=1 to n do begin
  for i2:=1 to n do begin
    for i3:=1 to n do begin
      for i4:=1 to n do begin
        if (i1<>i2) and (i1<>i3) and 
           (i1<>i4) and (i2<>i3) and 
           (i2<>i4) and (i3<>i4) then
        begin
          perimetr:=PKvadrata(massiv[i1].x,massiv[i1].y,
                              massiv[i2].x,massiv[i2].y,
                              massiv[i3].x,massiv[i3].y,
                              massiv[i4].x,massiv[i4].y,);
          if Perimetr>IPerimetr then
          begin
            IPerimetr:=Perimetr;
            Massiv2[1]:=Massiv[i1];
            Massiv2[1]:=Massiv[i2];
            Massiv2[2]:=Massiv[i3];
            Massiv2[3]:=Massiv[i4];
          end;
        end;
      end;
    end;
  end;
end;

Завтра я планирую реализовать ввод координат из внешнего файла... Почему не сегодня? да просто сегодня я хочу спать... 

Комментариев нет: