Программирование графических задач без графики и с графикой

Урок 1. Введение

Cкрипты на данном сайте, в том числе и векторно-графического анализа, связаны с графикой и завязаны или на систему "Вектор",  или на PNG-графику, которые должны присутствовать на ПК пользователя, что не всегда возможно (не инсталлирована системы "Вектор", нет связи с Интернет и т.д.). Однако  можно программировать без этих систем и без графики или программировать с псевдографикой HTML (в виде светящей точки или луча).
Для освоения программирования  (необходимого фактора и создания скриптов с графикой) можно начинать с "чистого" программирования.
Все элементы формализации задачи остаются:
1) Анализ -   формулировка задачи (чаще на условия максимума или минимума) в векторной форме.
2) Синтез - решение  задачи.
3) Оценка - вывод полученных результатов.
Нет изобразительных моментов - изображения входных данных, графика ЦФ и изображения результатов решения, однако все это есть в этих же задачах, помещенных на данном сайте. Потому на уроке или дома, зайдя на сайт, вы можете оперативно посмотреть и такой вариант. Кроме того, выполняя задачу без графике, вам все равно придется ее представить - нарисовать на бумаге ее условие, показать результат.  После того, как у вас появится необходимость создать свою программу, вы найдете недостающие программы, чтобы работать графикой, тем более, это возможно в CorelDraw или Еxell  на уровне макросов, где язык VBA немного посложней, однако у вас будет навык и, главное, готовые блоки, можно вставить в тела макросов.

Самые простые и доступные языки: Visual Basic Script  (VBS),  Visual Basic Application (VBA), JavaScript (JS).
VBS и JS  работают с файлами с расширениями: .vbs и .js  и файлах с расширением .html в Интернет (Internet Explorer). VBA используется, как простое и удобное средство программирования в Word, Excel, AutoCAD и СorelDraw и, в каждом случае, расширение фалов там свое или файлы, вообще, встроены в проект текущего основного файла и вызываются через макросы.
Все эти три языка, как правило, автоматически устанавливаются на машине при установке Window 2000 и выше.  И поэтому, создав файлы, например,  *.vbs, *.js, *.html  и,  щелкнув по тому или другому, вы автоматически запустите программу. При наличии команды  вывода на печать (в каждом случае свои опреаторы), вы получите результаты расчета на экране дисплея. В случае ошибки, в этом же окне указывается строка, в которой произошла ошибка.


Итак программирование графических задач в чистом виде - без графики

Содержание

Пример 1. Сложить два числа.
Пример 2. Найти минимальное число из набора заданных в массиве
Домашнее задание 1:  создать файлы всех 6 примеров с соответствующим расширением  и запустить их в классе или на своих ПК.
Домашнее задание 2: По аналогии (пример 1) написать на разных языках программы расчета объема посылки, у которой полуобхват - 72 см, длину выбрать в промежутке от 36 до 72 см.
Пример 3. Определить  расстояние от точки  до прямой.
Самостоятельное упражнение: найти  минимум суммы растояний от двух точек до прямой.
Пример 4. Задача о движении пешехода по скошенному и не скошенному лугу
Пример 5.  Найти коэффициент a прямой y=ax, наилучшим образом  проходящей от  заданных точек  (30,40), (50,30), (80,50).
Пример 6. Найти компромисс между двумя городами, желающих построить завод на заданной трассе.
Пример 7. Найти минимальные трудозатраты по пяти путям данного сетевого графа.
Пример 8.1. Найти мin/max ЦФ в задаче линейного программирования.
Пример 8.2.  При заданных ограничениях найти  максимальный объем посылки.

Справка по языкам


 Пример 1. Сложить два числа

Программу с выводом сообщений написать на VBS, JS  и HTML (язык JS)

1) На VBS
<Test.vbs>
' Сложить два числа

 a = 20
 b = 30
 S = a + b
 MsgBox "S = " & S' вывод значения на экран дисплея


2) На  JS

<Test.js>
var a =20;
var b =30;
var S = a + b
WScript.Echo("S= " + S );  // WScript - это готовый "встроенный" объект


3) На  HTML

<SCRIPT LANGUAGE="JavaScript">

var a =20;
var b =30;
var S = a + b
alert("Сумма = "  + S) // вывод значения на экран дисплея

</SCRIPT>

Домашнее задание 1:  создать файлы всех 3 примеров с соответствующим расширением  и запустить их в классе или на своих домашних  ПК.
Домашнее задание 2: По аналогии написать программы на разных языках расчета объема посылки, у которой полуобхват - 72 см, длину выбрать в промежутке от 36 до 72 см.


Урок 2. Алгоритмизация и оптимизация

Лекция 2.
 

Пример 2. Найти минимальное число из набора заданных

Формализация
Дано: - набор чисел
Помещаем числа в массив S
Решение: перебрать (организовать цикл), сравнить (оператор сравнения), выбрать (присвоить мин или макс в соответствующую переменную).
Результат - вывести  на печать..

1) На VBS
<Test2.vbs>
' Перебрать сравнить и выбрать мин. число из заданных
S = Array(70,50,80,60,10,20,5,70,90,35)
Smin=10000

For n=0 To 9 Step 1
'  if (s(n) < Smin) Then
'   Smin = S(n)
'  End if
if s(n) < Smin Then Smin = S(n)
Next
VBSmsg "минимальное число = "  & Smin



1) На JS
<Test2.js>
// Перебрать сравнить и выбрать мин. число из заданных
var S = Array(70,50,80,60,10,20,5,70,90,35) // массив чисел
var Smin=10000    // наперед большее число
for (n=0; n < 9; n++) {              // организация цикла от 0 до 9 с шагом 1
 if (S[n] < Smin) Smin = S[n] // сравнить и выбрать (занести в регистр)
}
WScript.Echo("Smin= " + Smin );

3) На  HTML

<Test2.html>

<SCRIPT LANGUAGE="JavaScript">

// Перебрать сравнить и выбрать мин. число из заданных
var S = Array(70,50,80,60,10,20,5,70,90,35) // массив чисел
var Smin=10000    //наперед заданное большее число
for (n=0; n < 9; n++) {   // организация цикла от 0 до 9 с шагом 1
 if (S[n] < Smin) Smin = S[n] // сравнить и выбрать - положить в регистр
}
alert("минимальное число = "  + Smin) // вывод значения на экран дисплея
</SCRIPT>



Таким образом, наиболее удобно работать с файлами  HTML  на JS,  тем более в дальнейшем  использовать графику PNG, растровые картинки и системы  «Вектор»


4. Задача на максимум числа в Inrernet Explorer  (с псевдографикой)

В Inrernet Explorer с отображением графики с помощью световых точек и лучей
(возможности HTML).
Мистерия. Найти максимальное число с псевдографикой HTML.
Особенность данного скрпта в том, что он не завязан на GD-графику, работу с которой обеспечивает сервер,  и может быть реализован пользователь на своем ПК.
Для этого надо скопировать текст (Вид -> В виде HTML) в какую-либо директорию, например, как файл с именем Mist_max.html.
Также сохранить картинку (щелкнуть правой кнопкой по картинке -> сохранить)
с именем и расширением Max1.jpg. Потом щекнуть по имени сохраненного файла, и сценарий должен запуститься в Internet Explorer сам.
В этом скрипте  задача решена чисто на GD - графике.
В этом скрипте задача решена с использованием  GD - графики и псевдографики HTML.



Домашнее задание 3:
Написать программу расчета координат точек на прямой в зависмости от параметра t по формуле:
 x = (1-t)*x1 + t*x2
 y = (1-t)*y1 + t*y2
    0 <= t <= 1  - условие для точек внутри отрезка.
Например, найти середину отрезка, отстоящую на треть от начала, 0.1 и т.д.


Урок 3. Оптимизация

Лекция 3.

Пример 3. Определить  расстояние от точки  до прямой

Задание выполнить в программах на трех языках VBS, JS  и HTML
Формализация
Дано: - коррдинаты точки p3  и точек p1, p2 начала и конца отрезка
Условие
s =  |p3-p| -> min
p = (1-t)*p1 + t*p2 - перебираемая точка на прямой р1-р2
Решение: перебрать, сравнить, выбрать минимальное расстояние s.

1) На VBS

Определить  расстояние от точки р3(7,10) до прямой р1(1,1)-р2(4,7)

 x1 = 1
 y1 = 1
 x2 = 15
 y2 = 4
 x3 = 7
 y3 = 10
 smin=10000

For t=0  To 1  Step 0.1
 x = (1-t)*x1 + t*x2
 y = (1-t)*y1 + t*y2
 dlina = sqr((x3-x)*(x3-x)+(y3-y)*(y3-y))
 if (dlina < smin) Then
  smin = dlina
  xmin = x
  ymin = y
 End if
Next
MsgBox "минимальное число = "  & Smin
MsgBox " x = "  & x
MsgBox " y = "  & y


2) На JS

// Определить минимальное расстояние от точки р3(7,10) до прямой р1(1,1)-р2(4,7)

var x1 = 1
var y1 = 1
var x2 = 15
var y2 = 4
var x3 = 7
var y3 = 10
var smin=10000

for ( var t=0; t <= 1 ; t+=0.1 ) {
 var x = (1.-t)*x1 + t*x2
 var y = (1.-t)*y1 + t*y2
 dlina = Math.sqrt((x3-x)*(x3-x)+(y3-y)*(y3-y))
 if (dlina < smin) {
  smin = dlina
  xmin = x
  ymin = y
 }
}
 
WScript.Echo("smin= " + smin )
WScript.Echo("xmin = " + x )
WScript.Echo("ymin = " + y )



 

3) В Inrernet Explorer  в HTML (на языке JS)

<SCRIPT LANGUAGE="JavaScript">

// Определить минимальное расстояние от точки р3(7,10) до прямой р1(1,1)-р2(4,7)

var x1 = 1;
var y1 = 1;
var x2 = 15;
var y2 = 4;
var x3 = 7;
var y3 = 10;
var smin=10000;

for ( var t=0; t <= 1 ; t+=0.1 ) {
 var x = (1-t)*x1 + t*x2;
 var y = (1-t)*y1 + t*y2;
 dlina = Math.sqrt((x3-x)*(x3-x)+(y3-y)*(y3-y));
 if (dlina < smin) {
  smin = dlina;
  xmin = x
  ymin = y
 }
}
 
alert("smin= " + smin );
alert("x= " + x );
alert("y= " + y );

</SCRIPT>


4. Задача в Inrernet Explorer  в HTML (с псевдографикой)

В Inrernet Explorer с отображением  некоторой графики с помощью световых
точек и лучей  (возможности HTML)
Мистерия. Указать минимум и максимум целевой функции (ЦФ) в зажет минимум рассояния от точки до прямой.
Особенность данного скрпта в том, что он не завязан на GD-графику, работу с которой обеспечивает сервер,  и может быть реализован пользователь на своем ПК.
Для этого надо скопировать текст (Вид -> В виде HTML) в какую-либо директорию, например, как файл с именем Mist_point.html.
Также сохранить картинку (щелкнуть правой кнопкой по картинке -> сохранить)
с именем и расширением Point_prim.jpg. Потом щекнуть по имени сохраненного файла
Mist_point.jpg, и сценарий должен запуститься в Internet Explorer сам.
В этом скрипте  задача решена чисто на GD - графике.
В этом скрипте задача решена с использованием  GD - графики и псевдографики HTML.

Самостоятельное упражнение:

Задача Герона: найти  минимум суммы растояний от двух точек до прямой

1) Написать алгоритм решения задачи
2) Написать и отладить программы по данной задаче на VBS, JS и HTML.

Урок 4. Оптимизационные задачи связанные со скоростью

Лекция 4.
 
Скрипт 5.  Задача о движении пешехода по скошенному и не скошенному лугу.
Мистерия. Движение путника по скошенному и нескошенному лугу.
 


Пример 4. Задача о движении пешехода по скошенному и не скошенному лугу

Формализация
Дано: начальная и конечные точки движения, граница меду скошенным и нескошенным лугам и скорости движения v1 и v2.
Условие оптимизации - время стремится к минимуму
t = t1 + t2 = s1/v1 + s2/v2  ->  min
Решение: перебрать, сравнить и выбрать.
p = (1-t)*p11 + t*p12 - перебираемая точка на прямой р11-р12
s1= |p1-p| - длина пути по скошенному  лугу
s2=|p2-p| - - длина пути по нескошенному  лугу

На JS

var Ax=29; var Ay=30; var Bx=271; var By = 269;
var x11=29; var y11=150; var x12=271; var y12 = 150;

var x1 = Ax;  var y1 = Ay;  var x2 = Bx;  var y2 = By;  var v1 = 10;  var v2 = 6;
 
// Оптимизация - перебрать, сравнить и выбрать.
var tmin=10000; var xmin; var ymin;
for ( var u = 0; u <= 1.01 ; u+=1/8 ) {
 var x = (1-u)*x11 + u*x12;
 var y = y11;
 var s1 = Math.sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
 var s2 = Math.sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y));
 var t = s1/v1 + s2/v2;
 if (t < tmin) {
  xmin = x
  ymin = y
  tmin = t;
 }
  }

WScript.Echo(" vmax =  "  + rzn(tmin));  // вывод на печать с функцией округления rzn();
WScript.Echo( " x =  "  + rzn(xmin)  + "   b =  "  + rzn(ymin));

function rzn ( vv ) {  // функция округления
   return ( Math.round ( vv * 100 ) ) / 100 ;
}


На VBS

x11=29
y11=150
x12=271
y12 = 150

x1 = 29
y1 = 30
x2 = 271
y2 = 269
v1 = 10
v2 = 6
 
' Оптимизация

tmin=10000
For u = 0 To 1.01 Step 1/8
 x = (1-u)*x11 + u*x12
 y = y11
 s1 = sqr((x1-x)*(x1-x)+(y1-y)*(y1-y))
 s2 = sqr((x2-x)*(x2-x)+(y2-y)*(y2-y))
 t = s1/v1 + s2/v2
 if t < tmin Then
  xmin = x
  ymin = y
  tmin = t
 End IF
  Next

MsgBox "tmin = "  & tmin    ' минимальное время
MsgBox  " x =  "  & xmin  & "   y =  "  & ymin


На JS

var Ax=29; var Ay=30; var Bx=271; var By = 269;
var x11=29; var y11=150; var x12=271; var y12 = 150;

var x1 = Ax;
var y1 = Ay;
var x2 = Bx;
var y2 = By;
var v1 = 10;
var v2 = 6;
 
// Оптимизация. Отрисовать ЦФ

var tmin=10000; var xmin; var ymin;
for ( var u = 0; u <= 1.01 ; u+=1/8 ) {
 var x = (1-u)*x11 + u*x12;
 var y = y11;
 var s1 = Math.sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
 var s2 = Math.sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y));
 var t = s1/v1 + s2/v2;
 if (t < tmin) {
  xmin = x
  ymin = y
  tmin = t;
 }
  }

WScript.Echo(" tmin =  "  + rzn(tmin));  // вывод на печать с функцией округления rzn();
WScript.Echo( " x =  "  + rzn(xmin)  + "   b =  "  + rzn(ymin));

function rzn ( vv ) {  // функция округления
   return ( Math.round ( vv * 100 ) ) / 100 ;
}


На HTML

<SCRIPT LANGUAGE="JavaScript">

var Ax=29; var Ay=30; var Bx=271; var By = 269;
var x11=29; var y11=150; var x12=271; var y12 = 150;

var x1 = Ax;
var y1 = Ay;
var x2 = Bx;
var y2 = By;
var v1 = 10;
var v2 = 6;
 
// Оптимизация. Отрисовать ЦФ

var tmin=10000; var xmin; var ymin;
for ( var u = 0; u <= 1.01 ; u+=1/8 ) {
 var x = (1-u)*x11 + u*x12;
 var y = y11;
 var s1 = Math.sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
 var s2 = Math.sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y));
 var t = s1/v1 + s2/v2;
 if (t < tmin) {
  xmin = x
  ymin = y
  tmin = t;
 }
  }

alert(" tmin =  "  + rzn(tmin));  // вывод на печать с функцией округления rzn();
alert( " x =  "  + rzn(xmin)  + "   b =  "  + rzn(ymin));

function rzn ( vv ) {  // функция округления
   return ( Math.round ( vv * 100 ) ) / 100 ;
}
</SCRIPT>



Скрипт 6.  Задача Бернулли. Найти линию наискорейшего спуска.
Скрипт 7.  Задача о расхождении судов.
Мистерия. Задача о расхождении судов.
Скрипт 8.  Энергосберегающее движение судна.
Мистерия. Оптимальное движениие судна (часть пути по течению).
 


Урок 5. Статистические методы. Метод наименьших квадратов

Лекция 5

Найти коэффицент a прямой y=ax, наилучшим образом (с меньшим отклонением) проходящей от трех заданных точек
Мистерия. Через заданные в диалоге 5 точек, провести наилучшую прямую y=ax
Мистерия. Провести наилучшую прямую y=ax (псевдографика HTML



 

Пример 5.  Найти коэффициент a прямой y=ax, наилучшим образом  проходящей от  заданных точек  (30,40), (50,30), (80,50)

Формализация
Дано: три точки (их координаты), полученные в экмперименте, записаны в массивах xi и yi/
Условие оптимизации: сумма отклонений (в квадрате)  стремится  к минимуму.
Решение: перебрать (коэффициент а), сравнить (получаемые суммы отклонений) и выбрать наименьшую сумму, которой будет получен соответствующий коэффициент а прямой: y=ax.
Требуется: написать программы решения задачи  на VBS, JS и HTML

На VBS

' Метод наименьших квадратов найти коэффицент a прямой y=ax, наилучшим
'образом (с меньшим отклонением) проходящей от трех заданных точек

xi = Array(30,50,80)    ' массив абсцис задаваемых точек
yi = Array(40,30,50)    ' массив ординат задаваемых точек
Dmin=1000000000        ' наперед заданное большее число для ЦФ отклонений
' a_opt     ' искомый оптитмальный коэффициент а

 For a = 0.1 To 3.14/2 Step 3.14/18
' вычисляем сумму отклонений
  D = ((yi(0)-a*xi(0))*(yi(0)-a*xi(0))+ _
     (yi(1)-a*xi(1))*(yi(1)-a*xi(1))+ _
          (yi(2)-a*xi(2))*(yi(2)-a*xi(2)))
' Сравнить и выбрать
  If ( D < Dmin) Then
             Dmin = D
   a_opt = a
  End If
 Next
MsgBox "a_opt = "  & a_opt     ' искомое оптимальное значение коэффициента а
MsgBox "Dmin =  "  & Dmin     ' искомое оптимальное значение коэффициента а


На JS

// Метод наименьших квадратов найти коэффицент a прямой y=ax, наилучшим

//образом (с меньшим отклонением) проходящей от трех заданных точек

var xi = Array(30,50,80)    // массив абсцис задаваемых точек
var yi = Array(40,30,50)    // массив ординат задаваемых точек
var Dmin=1000000000        // наперед заданное большее число для ЦФ отклонений
var a_opt;     // искомый оптитмальный коэффициент а

 for ( var a = 0.1; a <= Math.PI/2; a+= Math.PI/18 ) {
// вычисляем сумму отклонений
  var D = ((yi[0]-a*xi[0])*(yi[0]-a*xi[0])*1+
     (yi[1]-a*xi[1])*(yi[1]-a*xi[1])*1+
          (yi[2]-a*xi[2])*(yi[2]-a*xi[2]))
// Сравнить и выбрать
  if ( D < Dmin) {
             Dmin = D
   a_opt = a
  }
 }
WScript.Echo("a_opt = " + a_opt );  // искомое оптимальное значение коэффициента а
WScript.Echo("Dmin = " + Dmin );    // минимальная сумма отклонений


На HTML

<SCRIPT LANGUAGE="JavaScript">

// Метод наименьших квадратов найти коэффицент a прямой y=ax, наилучшим
//образом (с меньшим отклонением) проходящей от трех заданных точек

var xi = Array(30,50,80)    // массив абсцис задаваемых точек
var yi = Array(40,30,50)    // массив ординат задаваемых точек
var Dmin=1000000000        // наперед заданное большее число для ЦФ отклонений
var a_opt;     // искомый оптитмальный коэффициент а

 for ( var a = 0.1; a <= Math.PI/2; a+= Math.PI/18 ) {
// вычисляем сумму отклонений
  var D = ((yi[0]-a*xi[0])*(yi[0]-a*xi[0])*1+
     (yi[1]-a*xi[1])*(yi[1]-a*xi[1])*1+
          (yi[2]-a*xi[2])*(yi[2]-a*xi[2]))
// Сравнить и выбрать
  if ( D < Dmin) {
             Dmin = D
   a_opt = a
  }
 }
alert("a_opt = "  + a_opt)          // минимальная сумма отклонений
alert("Dmin = "  + Dmin)          // минимальная сумма отклонений

</SCRIPT>



Скрипт. Найти лучшую парямую y= ax с применением Png -графики и псевдографики HTML.

Скрипт. Найти лучшую парямую y= ax только на псевдографике HTML.

Скрипт. Найти лучшую парямую y= ax+b с применение Png-графики.

Скрипт 10. Определить рост человека в зависимости от возраста.
Скрипт 11. Определить коэффициенты экстрополирования роста человека от возраста.
Скрипт 12. Определить коэффициенты экстрополирования фондоотдачи в условиях производства.
Скрипт 13. Вычисление технико-экономических показателей динамики производства (более полный расчет на странице зарегистрированных пользователей).


Урок 6. МНОГОКРИТЕРИАЛЬНЫЕ ЗАДАЧИ

Лекция 6.

Скрипт 14.  Парето-оптимальное моделирование*. При различных условиях от 2-х городов построить завод в заданной области ограничений.
Мистерия.  Определить положения точек на трассе, отвечающим частным условиям  на  минимум и общий компромисс.
Мистерия. Определить зону Парето при разных условиях оптимизации.
Скрипт 15. 4-критериальная задача.
Скрипт 16.  Двухкритериальная задача: 1. Определить зону Парето при максимуме прибыли и минимуме расходов. 2. Определить минимум расходов при заданной прибыли (скрипт на стр. зарегистрированных пользователей).
Скрипт 17. Зона Парето в 3-критериальной задаче о трех городах: девять условий на мин/мах и компромисс.
Скрипт 18. Оптимизация местоположения космических станций и пункта заправки  при различных условиях.



 

Пример 6. Найти компромисс между двумя городами, желающих построить завод на заданной трассе.

Формализация
Дано:  точки (их координаты)  положения городов и трассы
Условие оптимизации: сумма отклонений (в квадрате)  частных целевых функций стремится  к минимуму.
Решение: перебрать (квадраты  отклонений ), сравнить (получаемые суммы отклонений) и выбрать наименьшее, которое и укажет в каком месте должен быть построен компромиссный вариант завода - т.е. найти равные расстояния.
Требуется: написать программы решения задачи  на VBS, JS и HTML


На VBS

' Определить точку компромисса для двух городов A и В,
' желающих построить завод на трассе CD
    x1 = 4
    y1 = 1
    x2 = 9
    y2 = 2
    x11 = 1
    y11 = 2
    x12 = 10
    y12 = 7
    smin=10000  ' заведомо большее число
      for u = 0 To 1.0  Step 1/15
 x = (1.-u)*x11 + u*x12
 y = (1.-u)*y11 + u*y12
  s1 = sqr((x-x1)*(x-x1)+(y-y1)*(y-y1))
  s2 = sqr((x-x2)*(x-x2)+(y-y2)*(y-y2))
  s =  sqr((s1-s2)*(s1-s2)) ' расстояние в квадрате между двумя ЧЦФ -> 0
  If (s < smin) Then
   smin=s
   cx = x
   cy = y
  End If
Next

MsgBox " Минимум ЦФ компромисса =  "  & smin  ' вывод на печать;
MsgBox " в точке: x  =  "  & cx  & "  y  =  "  & cy


На JS

    var x1 = 4;   var y1 = 1;
    var x2 = 9;   var y2 = 2;
    var x11 = 1;  var y11 = 2;
    var x12 = 10; var y12 = 7;
var smin=10000;  // заведомо большее число
for ( var u = 0; u <= 1.0 ; u+=1/15 ) {
 var x = (1.-u)*x11 + u*x12;
 var y = (1.-u)*y11 + u*y12;
var s1=Math.sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)) ;
var s2=Math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2)) ;
var s = Math.sqrt((s1-s2)*(s1-s2)) ;
  if (s < smin) {
   smin=s ;
   cx = x;
   cy = y;
  }
}

WScript.Echo(" Минимум ЦФ компромисса =  "  + smin);  // вывод на печать;
WScript.Echo( " в точке: x  =  "  + cx  + "  y  =  "  + cy);


На HTML

<SCRIPT LANGUAGE="JavaScript">
// Определить точку компромисса для двух городов A и В,
// желающих построить завод на трассе CD
    var x1 = 4;   var y1 = 1;
    var x2 = 9;   var y2 = 2;
    var x11 = 1;  var y11 = 2;
    var x12 = 10; var y12 = 7;
var smin=10000;  // заведомо большее число
for ( var u = 0; u <= 1.0 ; u+=1/15 ) {
 var x = (1.-u)*x11 + u*x12;
 var y = (1.-u)*y11 + u*y12;
var s1=Math.sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)) ;
var s2=Math.sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2)) ;
var s = Math.sqrt((s1-s2)*(s1-s2)) ;
  if (s < smin) {
   smin=s ;
   cx = x;
   cy = y;
  }
}

alert(" Минимум ЦФ компромисса =  "  + smin);  // вывод на печать;
alert( " в точке: x  =  "  + cx  + "  y  =  "  + cy);
</SCRIPT>


Урок 7. Сетевые методы моделирования инженерных задач

Лекция 7.

Скрипт 19.  Графы, сетевой график и сетевое планирование.
Скрипт 19_2. Метод Богданова-Белмана безусловной оптимизации на простом примере и сложном (оптимальный путь не показывается).


 Пример 7. Найти минимальные трудозатраты по пяти путям данного сетевого графа

Формализация
Даны трудозатраты (см. массивы в скрипте)  по  путям, имеющих 4 или пять узлов.
Условие оптимизации: трудозатраты стремятся к минимуму.
Решение: перебрать, сравнить и выбрать возможные пути и выбрать инз них по минимальным трудозатратам.
Требуется: написать программы решения задачи  на VBS, JS и HTML
 

На vbs

' трудозотрады в сетевом графе определены в пяти путях (массивах)

s1 = Array(20,11,10,27,0)  ' массив трудозатрат на 1-м пути
s2 = Array(20,4,18,30,0)   ' массив трудозатрат на 2-м пути
s3 = Array(24,2,18,30,0)   ' массив трудозатрат на 3-м пути
s4 = Array(5,23,1,30,0)    ' массив трудозатрат на 4-м пути
s5 = Array(5,23,18,5,30)   ' массив трудозатрат на 5-м пути

summa = Array(0,0,0,0,0,0)  ' объявили, что summa - это массив из 5 членов

' суммирование трудозотрат по каждому пути
summa(1) = s1(0) + s1(1) + s1(2) + s1(3)
summa(2) = s2(0) + s2(1) + s2(2) + s2(3)
summa(3) = s3(0) + s3(1) + s3(2) + s3(3)
summa(4) = s4(0) + s4(1) + s4(2) + s4(3)
summa(5) = s5(0) + s5(1) + s5(2) + s5(3) + s5(4)

' Найти критическитй путь, в котором тружозатраты наименьшие
Smin = 100000 ' на входе задаем заведомо ниабольшее число

' перебрать, сравнить и выбрать
for i=1 To 5 Step 1
 If (summa(i) < Smin) Then
  Smin = summa(i)
  imin = i
 End If
Next

MsgBox "минимальное затраты = "  & Smin
MsgBox " на пути  =  "  & imin


На JS

// трудозотрады в сетевом графе определены в пяти путях (массивах)

var s1 = [20,11,10,27,0]  // массив трудозатрат на 1-м пути
var s2 = [20,4,18,30,0]   // массив трудозатрат на 2-м пути
var s3 = [24,2,18,30,0]   // массив трудозатрат на 3-м пути
var s4 = [5,23,1,30,0]    // массив трудозатрат на 4-м пути
var s5 = [5,23,18,5,30]   // массив трудозатрат на 5-м пути

var summa = new Array(5)  // объявили, что summa - это массив из 5 членов

// суммирование трудозотрат по каждому пути
summa[1] = s1[0] + s1[1] + s1[2] + s1[3]
summa[2] = s2[0] + s2[1] + s2[2] + s2[3]
summa[3] = s3[0] + s3[1] + s3[2] + s3[3]
summa[4] = s4[0] + s4[1] + s4[2] + s4[3]
summa[5] = s5[0] + s5[1] + s5[2] + s5[3] + s5[4]

// Найти критическитй путь, в котором тружозатраты наименьшие
Smin = 100000 // на входе задаем заведомо ниабольшее число

// перебрать, сравнить и выбрать
for ( i=1; i < 6; i++) {
 if (summa[i] < Smin) {
  Smin = summa[i]
  imin = i
 }
}

WScript.Echo(" Минимальные затраты =  "  + Smin);  // вывод на печать;
WScript.Echo( " на пути  =  "  + imin);


На HTML

<SCRIPT LANGUAGE="JavaScript">

// трудозотрады в сетевом графе определены в пяти путях (массивах)

var s1 = [20,11,10,27,0]  // массив трудозатрат на 1-м пути
var s2 = [20,4,18,30,0]   // массив трудозатрат на 2-м пути
var s3 = [24,2,18,30,0]   // массив трудозатрат на 3-м пути
var s4 = [5,23,1,30,0]    // массив трудозатрат на 4-м пути
var s5 = [5,23,18,5,30]   // массив трудозатрат на 5-м пути

var summa = new Array(5)  // объявили, что summa - это массив из 5 членов

// суммирование трудозотрат по каждому пути
summa[1] = s1[0] + s1[1] + s1[2] + s1[3]
summa[2] = s2[0] + s2[1] + s2[2] + s2[3]
summa[3] = s3[0] + s3[1] + s3[2] + s3[3]
summa[4] = s4[0] + s4[1] + s4[2] + s4[3]
summa[5] = s5[0] + s5[1] + s5[2] + s5[3] + s5[4]

// Найти критическитй путь, в котором тружозатраты наименьшие
Smin = 100000 // на входе задаем заведомо ниабольшее число

// перебрать, сравнить и выбрать
for ( i=1; i < 6; i++) {
 if (summa[i] < Smin) {
  Smin = summa[i]
  imin = i
 }
}
alert(" Минимальные затраты =  "  + Smin);  // вывод на печать;
alert( " на пути  =  "  + imin);
</SCRIPT>


Урок 8. Задачи линейного и нелинейного программирования

Лекция 8.

Скрипт 20. Линейное программирование: при заданных ограничениях, найти маx/мin ЦФ.
Мистерия 20.1. Определить min/max ЦФ, задать область ограничений.
Мистерия 20.2. Автоматически "Изобразить" область ограничений, в диалоге задать точки максимума/минимума ЦФ или точки всего контура ограничений и "Вычислить...".
Мистерия 20.3. Второй вариант (функция ограничений может быть вырождена в линию, параллельную координатной оси).
Мистерия 20.4. Определить min/max ЦФ, задать область ограничений (графика  средствами HTML).
Определение min/max ЦФ через макрос (в Exell) (текст макроса).
Решение в CorelDraw (макрос здесь).


Пример 8.1. Найти мin/max ЦФ в задаче линейного программирования

F = x + y -> Max
при ограничениях (приведены к уравнению прямой в отрезках: x/a+y/b=1)
  x/30  +  y/20 > 1
  x/15  +  y/40 > 1
  x/40  +  y/5  > 1
  x/100  +  y/80  < 1
  x/80  +  y/95  < 1
Задачу решить на VBS, JS, HTML

На VBS

' Задача линейного программирования. Найти мin/max ЦФ: F = x + y -> Max
' Ограничения приведены к уравнению прямой в отрезках: x/a+y/b=1

 a1 =  30
      b1 =  20
      a2 =  15
      b2 =  40
      a3 =  40
      b3 =  5
      a4 =  100
      b4 =  80
 a5 =  80
      b5 =  95

' Ищем точки пересечения области ограничений (через вспомогтальную функцию)

PerOtrxyS a1,0, 0,b1, a2,0, 0,b2,Kc1x,Kc1y
PerOtrxyS a1,0, 0,b1, a3,0, 0,b3,Kc2x,Kc2y
PerOtrxyS a4,0, 0,b4, a5,0, 0,b5,Kc3x,Kc3y

' В точках области ограничений (при x,y > 0 - их три) ищем значения ЦФ F=x+y
F1 = Kc1x+Kc1y
F2 = Kc2x+Kc2y
F3 = Kc3x+Kc3y
' перебираем, сравниваем и выбираем максимум ЦФ
Fmax = 0
if (F1 > Fmax ) Then Fmax = F1
if (F2 > Fmax ) Then Fmax = F2
if (F3 > Fmax ) Then Fmax = F3
' перебираем, сравниваем и выбираем минимум ЦФ
Fmin =1000
if (F1 < Fmin ) Then Fmin = F1
if (F2 < Fmin ) Then Fmin = F2
if (F3 < Fmin ) Then Fmin = F3

MsgBox " Fmax = " & Fmax
MsgBox " Fmin = " & Fmin

Function PerOtrxyS(x1, y1, x2, y2, x3, y3, x4, y4, x, y)
s11 = y4 - y3
s12 = x3 - x4
s13 = (x3 * y3 - x3 * y4) * 1 + (y3 * x4 - y3 * x3)
s = (-s11 * x1 - s12 * y1 - s13) / (s11 * (x2 - x1) + s12 * (y2 - y1))
x = (1 - s) * x1 * 1 + s * x2 * 1
y = (1 - s) * y1 * 1 + s * y2 * 1

End Function


На JS

// Задача линейного программирования. Найти мin/max линейной задачи

// Уравнения ЦФ и ограничений приведены к уравнению прямой в отрезках: x/a+y/b=1
// отсюда задаем величины отсекаемых отрезков

 var a1 =  30; var b1 =  20;
 var a2 =  15; var b2 =  40;
 var a3 =  40; b3 =  5;
 var a4 =  100; b4 =  80;
 var a5 =  80; var b5 =  95;
 var a = 100; b = 100;
// Ищем точки пересечения области ограничений (через вспомогтальную функцию)
Kc1=PerOtrxyS (a1,0,0, 0,b1,0, a2,0,0, 0,b2,0 )
Kc2=PerOtrxyS (a1,0,0, 0,b1,0, a3,0,0, 0,b3,0 )
Kc3=PerOtrxyS (a4,0,0, 0,b4,0, a5,0,0, 0,b5,0 )
// В точках области ограничений (при x,y > 0 - их три) ищем значения ЦФ F=x+y
var F1 = Kc1.x+Kc1.y
var F2 = Kc2.x+Kc2.y
var F3 = Kc3.x+Kc3.y
// перебираем, сравниваем и выбираем максимум ЦФ
Fmax = 0
if (F1 > Fmax ) Fmax = F1
if (F2 > Fmax ) Fmax = F2
if (F3 > Fmax ) Fmax = F3
// перебираем, сравниваем и выбираем минимум ЦФ
Fmin =1000
if (F1 < Fmin ) Fmin = F1
if (F2 < Fmin ) Fmin = F2
if (F3 < Fmin ) Fmin = F3
WScript.Echo(" Fmax = " + Fmax)
WScript.Echo(" Fmin = " + Fmin)
 
 

function PerOtrxyS (x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4 ) {

 var s11=y4-y3;
 var s12=x3-x4;
 var s13=(x3*y3-x3*y4)*1 + (y3*x4-y3*x3);
 var s=(-s11*x1-s12*y1-s13)/(s11*(x2-x1)*1 + s12*(y2-y1));
 var x=(1.-s)*x1*1 + s*x2*1;
 var y=(1.-s)*y1*1 + s*y2*1;
 var Delit3 =(x2-x1);
 var z;
 if (Delit3 == 0. ) {
  Delit3 =(y2-y1);
  z=z1*1 + (z2-z1)*(y-y1)/Delit3;
  }
  else {
  Delit3 =(x2-x1);
  z=z1*1 + (z2-z1)*(x-x1)/Delit3;
  }
 var Delit4 =(x3-x);
  if ( x3 == x ) {
  Delit4 =(y3-y);
      z = z*1 + (z3-z)*(y4-y)/Delit4;
  }
  else {
  z = z*1 + (z3-z)*(x4-x)/Delit4;
  }
 var p99 = {};
 p99.x = x; p99.y = y; p99.z = z;
 return ( p99 );
}



 

На HTML
<SCRIPT LANGUAGE="JavaScript">

// Задача линейного программирования. Найти мin/max линейной задачи

// Уравнения ЦФ и ограничений приведены к уравнению прямой в отрезках: x/a+y/b=1
// отсюда задаем величины отсекаемых отрезков

 var a1 =  30; var b1 =  20;
 var a2 =  15; var b2 =  40;
 var a3 =  40; b3 =  5;
 var a4 =  100; b4 =  80;
 var a5 =  80; var b5 =  95;
 var a = 100; b = 100;
// Ищем точки пересечения области ограничений (через вспомогтальную функцию)
Kc1=PerOtrxyS (a1,0,0, 0,b1,0, a2,0,0, 0,b2,0 )
Kc2=PerOtrxyS (a1,0,0, 0,b1,0, a3,0,0, 0,b3,0 )
Kc3=PerOtrxyS (a4,0,0, 0,b4,0, a5,0,0, 0,b5,0 )
// В точках области ограничений (при x,y > 0 - их три) ищем значения ЦФ F=x+y
var F1 = Kc1.x+Kc1.y
var F2 = Kc2.x+Kc2.y
var F3 = Kc3.x+Kc3.y
// перебираем, сравниваем и выбираем максимум ЦФ
Fmax = 0
if (F1 > Fmax ) Fmax = F1
if (F2 > Fmax ) Fmax = F2
if (F3 > Fmax ) Fmax = F3
alert (" Fmax = " + Fmax)
// перебираем, сравниваем и выбираем минимум ЦФ
Fmin =1000
if (F1 < Fmin ) Fmin = F1
if (F2 < Fmin ) Fmin = F2
if (F3 < Fmin ) Fmin = F3
alert (" Fmin = " + Fmin)
 
 

function PerOtrxyS (x1,y1,z1, x2,y2,z2, x3,y3,z3, x4,y4,z4 ) {

 var s11=y4-y3;
 var s12=x3-x4;
 var s13=(x3*y3-x3*y4)*1 + (y3*x4-y3*x3);
 var s=(-s11*x1-s12*y1-s13)/(s11*(x2-x1)*1 + s12*(y2-y1));
 var x=(1.-s)*x1*1 + s*x2*1;
 var y=(1.-s)*y1*1 + s*y2*1;
 var Delit3 =(x2-x1);
 var z;
 if (Delit3 == 0. ) {
  Delit3 =(y2-y1);
  z=z1*1 + (z2-z1)*(y-y1)/Delit3;
  }
  else {
  Delit3 =(x2-x1);
  z=z1*1 + (z2-z1)*(x-x1)/Delit3;
  }
 var Delit4 =(x3-x);
  if ( x3 == x ) {
  Delit4 =(y3-y);
      z = z*1 + (z3-z)*(y4-y)/Delit4;
  }
  else {
  z = z*1 + (z3-z)*(x4-x)/Delit4;
  }
 var p99 = {};
 p99.x = x; p99.y = y; p99.z = z;
 return ( p99 );
}
</SCRIPT>
 


Задача нелинейного программирования - о посылке

Скрипт 22.  Задача о посылке: при заданных ограничениях найти ее  максимальный объем.
Мистерия. Указать максимум ЦФ и соответствующие размеры посылки.
 
 

Пример 8.2.  При заданных ограничениях найти  максимальный объем посылки ( может быть и судовой док).

Формализация
Дано:   ограничения на обхват и длину посылки
a, b > 36;  c > 72.
Условие оптимизации: Найти  максимума объема
V = a*b*c -> max
Область ограничений  - отсекаемая плоскость x/a+y/b+z/c < 1, на которой и нужно перебрать точки, которые дадут множества решений, из которых выбрать наилучшее.
Требуется: написать программы решения задачи  на VBS, JS и HTML
 

На VBS

' Задача о посылке на .vbs
' Дано
x1 = 72
y1 = 0
z1 = 0 ' точки отсекаемой плоскости ограничений  на оси x
x2 = 0
y2 = 36
z2 = 0  ' точки отсекаемой плоскости ограничений  на оси y
x3 = 0
y3 = 0
z3 = 36  ' точки отсекаемой плоскости ограничений  на оси z
vmax = 0

For v=0 To 1.02  Step 1/21   ' перебрать
  x91=(1-v)*x1+v*x3
  y91=(1-v)*y1+v*y3
  z91=(1-v)*z1+v*z3
  x92=(1-v)*x2+v*x3
  y92=(1-v)*y2+v*y3
  z92=(1-v)*z2+v*z3

 For u=0 To 1.01 Step 1/21  ' внутренний цикл
  x=(1-u)*x91+u*x92
  y=(1-u)*y91+u*y92
  z=(1-u)*z91+u*z92
  Vp=x*y*z
  If (Vp > vmax) Then  ' сравнить и выбрать
                   vmax = Vp
    ctxv = x
    ctyv = y
    ctzv = z
  End If
 Next
   Next
MsgBox "Vmax = "  & vmax
MsgBox "a = "  & ctxv  &   "   b = "  & ctyv & "  c = "  & ctzv


На JS

var x1 = 72; var y1 = 0; var z1 = 0; // точки отсекаемой плоскости ограничений  на оси x
var x2 = 0; var y2 = 36; var z2 = 0; // точки отсекаемой плоскости ограничений  на оси y
var x3 = 0; var y3 = 0; var z3 = 36; // точки отсекаемой плоскости ограничений  на оси z
var vmax = 0;
for ( var v=0; v <= 1.02 ; v+=1/21 ) {  // перебрать
  var x91=(1-v)*x1+v*x3 ;
  var y91=(1-v)*y1+v*y3 ;
  var z91=(1-v)*z1+v*z3 ;
  var x92=(1-v)*x2+v*x3 ;
  var y92=(1-v)*y2+v*y3 ;
  var z92=(1-v)*z2+v*z3 ;

 for ( var u=0; u <= 1.01 ; u+=1/21 ) {
  var x=(1-u)*x91+u*x92 ;
  var y=(1-u)*y91+u*y92 ;
  var z=(1-u)*z91+u*z92 ;
  var Vp=x*y*z ;
  if (Vp > vmax) {  // сравнить и выбрать
                   vmax = Vp; var ctxv = x; var ctyv = y; var ctzv = z;
  }
   }
}

WScript.Echo(" vmax =  "  + rzn(vmax));  // вывод на печать с функцией округления rzn();
WScript.Echo( " a =  "  + rzn(ctxv)  + "   b =  "  + rzn(ctyv)  + "   c =  "  + rzn(ctzv));

function rzn ( vv ) {  // функция округления
   return ( Math.round ( vv * 100 ) ) / 100 ;
}


На HTML

<SCRIPT LANGUAGE="JavaScript">

var x1 = 72; var y1 = 0; var z1 = 0; // точки отсекаемой плоскости ограничений  на оси x
var x2 = 0; var y2 = 36; var z2 = 0; // точки отсекаемой плоскости ограничений  на оси y
var x3 = 0; var y3 = 0; var z3 = 36; // точки отсекаемой плоскости ограничений  на оси z
var vmax = 0;
for ( var v=0; v <= 1.02 ; v+=1/21 ) {  // перебрать
  var x91=(1-v)*x1+v*x3 ;
  var y91=(1-v)*y1+v*y3 ;
  var z91=(1-v)*z1+v*z3 ;
  var x92=(1-v)*x2+v*x3 ;
  var y92=(1-v)*y2+v*y3 ;
  var z92=(1-v)*z2+v*z3 ;

 for ( var u=0; u <= 1.01 ; u+=1/21 ) {
  var x=(1-u)*x91+u*x92 ;
  var y=(1-u)*y91+u*y92 ;
  var z=(1-u)*z91+u*z92 ;
  var Vp=x*y*z ;
  if (Vp > vmax) {  // сравнить и выбрать
                   vmax = Vp; var ctxv = x; var ctyv = y; var ctzv = z;
  }
   }
}
alert ( " vmax =  "  + rzn(vmax) );  // вывод на печать с функцией округления rzn()
alert ( " a =  "  + rzn(ctxv)  + "   b =  "  + rzn(ctyv)  + "   c =  "  + rzn(ctzv)   );

function rzn ( vv ) {  // функция округления
   return ( Math.round ( vv * 100 ) ) / 100 ;
}

</SCRIPT>
 

Пример 8.3. Кубатура шара: найти  куб равный шару

Листинг сохранить в файле *. js  затем в системе Вектор  открыть (Open ) его
или вызвать название МК  командой Макрокоманда

Листинг
VbsMsg ("Кубатура шара куб равный шару")
R = 1
//a = R   // 0.80599
Pi = Math.PI  // 3.1415926535
// вычисляем объем шара
v3 = 4*Math.PI*R*R*R/3
// VBSMsg (" Объем шара = " + v3)
// Вычислем сторону куба, равного по объему равному шару
a3 = Math.exp(Math.log(v3)/3)
//VBSMsg (" сторона куба = " + a3)
a = a3
v3n = a3*a3*a3

// вычислим объем гиперкуба равного гипершару радиусом R
v4 = Math.PI*Math.PI*R*R*R*R/2
// "Вычислем сторону гиперкуба, равного по объему равному гипершару"
a4 = Math.exp(Math.log(v4)/4);
// ПРоверка объем гиперкуба, равного по объему равному гипершару
v4n = a4*a4*a4*a4;

v5 = 8*Math.PI*Math.PI*R*R*R*R*R/15
a5 = Math.exp(Math.log(v5)/5);
v5n = a5*a5*a5*a5*a5;

VBSMsg (" Куб равный по объему шару " + "\n"
+ " Радиус шара  = " + rz(R) + "\n"
+ " Объем шара   = " + rz(v3) + "\n"
+ " Cторона куба = " + rz(a3) + "\n"
+ " Объем куба   = " + rz(v3n)+ "\n"
+ " Куб E4 равный по объему шару Е4 " + "\n"
+ " Радиус гипершара     = " + rz(R) + "\n"
+ " Объем гипершара Е4   = " + rz(v4) + "\n"
+ " Cторона гиперкуба Е4 = " + rz(a4) + "\n"
+ " Объем гиперкуба E4   = " + rz(v4n)+ "\n"
+ " Куб E5 равный по объему шару Е5 " + "\n"
+ " Радиус гипершара Е5  = " + rz(R) + "\n"
+ " Объем гипершара Е5   = " + rz(v5) + "\n"
+ " Cторона гиперкуба Е5 = " + rz(a5) + "\n"
+ " Объем гиперкуба E5   = " + rz(v5n) );

function rz ( vv ) {
return ( Math.round ( vv * 10 ) ) / 10 ;
}
 

Самостоятельно. Написать МК решения обратной задачи: Найти объем  сферы (гиперсферы) 
по заданному объему куба (гиперкуба)



Обзорная лекция

Справка по языкам:

Visual Basic Script
Этот самоучитель по JavaScript
Справочник по JavaScript
Учебник JS
Основы языка программирования  Visual Basic for Applications
Учимся писать скрипты

Задачи (тексты МК), написанные на VBS, для решения их в системе "Вектор"

Пример 1. Построить тругольник и найти середины сторон
Пример 2. Задать синусоиду и организовать цикл ее вращения
Пример 3. Муар -треугольник в треугольнике
Пример 4. Перебрать точки на прямой и соединенить их с третьей
Пример 5. Перебрать точки в параллелограмме (квадрате) р1-р4
Пример 6. Алгоритмизация  по методу случайных чисел
Пример 7. Из набора чисел s1, s2, s3...sn найти минимальное
Пример 8. Задача Герона. Найти точку  на прямой, расстояние от двух заданных было наименьшим
Пример 9. Оптимизация движения пешехода по скошенному и не скошенному лугу
Пример 10.  Оптимизация движения судна по течению (ветру) и без него
Пример 11. Определить, на каком наикратчайшем расстоянии пройдут два судна
Пример 12. Статанализ. Метод наименьших квадратов
Пример 13. Определить рост человека
Пример 14. Многокритериальные задачи и определение зоны Парето
Пример 15. Движение по методу случайных чисел - найти минимум расхода топлива
Пример 16. Богданов-Белман - метод безусловной оптитмизации
Пример 17. На графе найти критический путь трудозатрат из пяти возможных путей
Пример 18. Линейное программирование
Пример 19. Задача о посылке: найти ее максимальный объем
Пример 20. Комбинаторика. Ло-Шу - поиск чисел магического квадрата
Пример 21. поиск чисел магического квадрата (МК) через циклы