Подготовка к ЕГЭ сына — школьника (по информатике)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

50 Comments

  1. insurgut

    Первое точно не так делается. Логика примерно такая:

    МаксЧисло = -999999999;
    Если ПервоеЧисло > МаксЧисло Тогда
    МаксЧисло = ПервоеЧисло;
    КонецЕсли;
    Если ВтороеЧисло > МаксЧисло Тогда
    МаксЧисло = ВтороеЧисло;
    КонецЕсли;
    Если ТретьеЧисло > МаксЧисло Тогда
    МаксЧисло = ТретьеЧисло;
    КонецЕсли;
    Если ЧетвертоеЧисло > МаксЧисло Тогда
    МаксЧисло = ЧетвертоеЧисло;
    КонецЕсли;
    Сообщить(«Максимум: » + МаксЧисло);

    Показать

    Но ЕГЭ штука такая, им не всегда подходит более простое решение.

    Reply ↓
  2. vasilev2015

    Да, я написал: не читайте, будем переделывать. За идею спасибо, хотел переделать как ниже, но Ваш вариант лучше.

    Если ПервоеЧисло > ВтороеЧисло Тогда

    Если ПервоеЧисло > ТретьеЧисло Тогда

    Иначе

    КонецЕсли

    Иначе

    Если ВтороеЧисло > ТретьеЧисло Тогда

    Иначе

    КонецЕсли

    КонецЕсли

    Reply ↓
  3. insurgut

    (2) поторопился, там даже от одного условия можно избавится:

    МаксЧисло = ПервоеЧисло;
    Если ВтороеЧисло > МаксЧисло Тогда
    МаксЧисло = ВтороеЧисло;
    КонецЕсли;
    Если ТретьеЧисло > МаксЧисло Тогда
    МаксЧисло = ТретьеЧисло;
    КонецЕсли;
    Если ЧетвертоеЧисло > МаксЧисло Тогда
    МаксЧисло = ЧетвертоеЧисло;
    КонецЕсли;
    Сообщить(«Максимум: » + МаксЧисло);

    Показать

    Но меня не отпускает ощущение, что скрыт какой-то подвох в задании. 🙂

    Reply ↓
  4. spacecraft

    (3)

    Но меня не отпускает ощущение, что скрыт какой-то подвох в задании. 🙂

    правильные ощущения. Условия: «Нахождение минимума и максимума …»

    (2)

    program min_max_of_four_numbers_without_arrays_or_cycles;
    var
    first_number, second_number, third_number, forth_number, min_number, max_number:real;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    readln(first_number, second_number, third_number, forth_number);
    
    if (first_number > second_number) then
    begin
    min_number := second_number;
    max_number := first_number;
    end
    else
    begin
    min_number := first_number;
    max_number := second_number;
    end;
    if (min_number > third_number) then
    min_number := third_number;
    if (min_number > forth_number) then
    min_number := forth_number;
    if (max_number < third_number) then
    max_number := third_number;
    if (max_number < forth_number) then
    max_number := forth_number;
    writeln(‘Max = ‘, max_number);
    writeln(‘Mix = ‘, min_number);
    
    end.

    Показать

    Reply ↓
  5. insurgut

    Задание 8 (на паскаль думаю сами интерпретируете):

    НачальноеЧисло = Формат(ТекущаяДата(), «ДФ=HHmmss»);
    ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);
    
    //генерация массива
    МассивЧисел = Новый Массив;
    РазмерМассива = 9;
    Сообщить(«Массив:»);
    Для Сч = 0 По РазмерМассива — 1 Цикл
    СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 235959);
    МассивЧисел.Добавить(СлучайноеЧисло);
    Сообщить(СлучайноеЧисло);
    КонецЦикла;
    
    //поиск максимальных
    ПервоеМакс = 0;
    ВтороеМакс = 0;
    Для Сч = 0 По РазмерМассива — 1 Цикл
    Если МассивЧисел[Сч] > ПервоеМакс Тогда
    ВтороеМакс = ПервоеМакс;
    ПервоеМакс = МассивЧисел[Сч];
    КонецЕсли;
    КонецЦикла;
    Сообщить(«Первое: » + ПервоеМакс);
    Сообщить(«Второе: » + ВтороеМакс);
    

    Показать

    Reply ↓
  6. insurgut

    (4) да как бы понятно, что на минимум нужно операций по аналогии добавить, я не об этом.

    Reply ↓
  7. Man4kin

    (5) Без использования массивов и циклов же ?

    Reply ↓
  8. insurgut

    (7) за однократный проход массива же?

    Reply ↓
  9. vasilev2015

    (5) Когда элемент МассивЧисел[Сч] сравниваем с ПервоеМакс и ВтороеМакс, то элемент может изменить ВтороеМакс или обе переменные, а здесь только одно условие.

    Reply ↓
  10. starik-2005

    (4) а зачем так много кода?

    var min_num, max_num, ent_num : double;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    
    readLn(ent_num);
    min_num := ent_num;
    max_num := ent_num;
    
    readLn(ent_num);
    min_num := min(ent_num, min_num) ;
    max_num := max(ent_num, max_num) ;
    
    readLn(ent_num);
    min_num := min(ent_num, min_num) ;
    max_num := max(ent_num, max_num) ;
    
    readLn(ent_num);
    min_num := min(ent_num, min_num) ;
    max_num := max(ent_num, max_num) ;
    
    writeln(‘Max = ‘, max_num);
    writeln(‘Mix = ‘, min_num);
    end.
    
    

    Показать

    Reply ↓
  11. vasilev2015

    (10) я между прочим, на публикацию вдохновился после вашей заметки о пузырке. : -)))

    Reply ↓
  12. insurgut

    (9) если честно, то ничего не понял 🙂 элемент массива не сравнивается со вторым максимальным, только с первым. Второе максимальное сравнивать ни с чем не нужно.

    Reply ↓
  13. spacecraft

    (10) Ваш код вообще не скомпилится. min() и max() находятся в отдельной библиотеке, которую не факт, что можно использовать на ЕГЭ.

    Reply ↓
  14. starik-2005

    (13) можно заменить на «if ent_num > max_num then max_num := ent_num;»

    var min_num, max_num, ent_num : double;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    
    readLn(ent_num);
    min_num := ent_num;
    max_num := ent_num;
    
    readLn(ent_num);
    if ent_num < min_num then min_num := ent_num;
    if ent_num > max_num then max_num := ent_num;
    
    readLn(ent_num);
    if ent_num < min_num then min_num := ent_num;
    if ent_num > max_num then max_num := ent_num;
    
    readLn(ent_num);
    if ent_num < min_num then min_num := ent_num;
    if ent_num > max_num then max_num := ent_num;
    
    writeln(‘Max = ‘, max_num);
    writeln(‘Mix = ‘, min_num);
    end.

    Показать

    Reply ↓
  15. spacecraft

    (14) и? Чем этот код лучше моего? Лишним if?

    Reply ↓
  16. starik-2005

    (15) отсутствием лишних переменных и читаемостью как минимум.

    Reply ↓
  17. spacecraft

    (16) спорное утверждение. Куча readLn внутри когда не способствуют лучшей читаемости этого кода.

    Reply ↓
  18. starik-2005

    (17) каждому свое. Веток ветвления у Вас тоже 6, если считать блок «else». Блоки зачем-то, которые совершенно не нужны. Лишние переменные — это всегда минус баллы на олимпиадах. Но ведь главное, чтобы работало, да? А вот проверяющим ЕГЭ читаемость будет важнее.

    Reply ↓
  19. sergathome
    Оказывается, из двоичной системы счисления очень удобно переводить в восьмеричную. Каждая триада переходит в одну цифру.

    Да, немногие помнют ужо линейку ДВК и славного её дитёныша БК-0010. Там оно изо всех щелей 😉

    Reply ↓
  20. starik-2005

    А вот по заветам Никлауса Вирта — процедурное программирование!

    procedure minmax(min, max, ent : double)
    begin
    readLn(ent);
    if ent > max them max := ent;
    if ent < min them min := ent;
    end;
    
    var min_num, max_num, ent_num : double;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    
    readLn(ent_num);
    min_num := ent_num;
    max_num := ent_num;
    
    minmax(min_num, max_num, ent_num);
    minmax(min_num, max_num, ent_num);
    minmax(min_num, max_num, ent_num);
    
    writeln(‘Max = ‘, max_num);
    writeln(‘Mix = ‘, min_num);
    end.

    Показать

    Reply ↓
  21. vasilev2015

    (12) из массива {2,1,5,4,3} нужно выбрать второй по-минимуму 2 или второй по-максимуму 4. Код из статьи мы проверяли.

    Reply ↓
  22. insurgut

    (21) и все равно не пойму сути вашего замечания — что не так то? Алгоритм находит второе максимальное число в массиве (доработать под второе минимальное сложности не составит). Или вас смущает вывод сообщения о первом максимальном? Закомментируем его, так и быть. Если не нравится генерация массива — так это для проверки работоспособности. Можно задать фиксированным массив, суть не поменяется.

    //генерация массива
    РазмерМассива = 5;
    МассивЧисел = Новый Массив;
    МассивЧисел.Добавить(2);
    МассивЧисел.Добавить(1);
    МассивЧисел.Добавить(5);
    МассивЧисел.Добавить(4);
    МассивЧисел.Добавить(3);
    
    //поиск второго максимального числа
    ПервоеМакс = 0;
    ВтороеМакс = 0;
    Для Сч = 0 По РазмерМассива — 1 Цикл
    Если МассивЧисел[Сч] > ПервоеМакс Тогда
    ВтороеМакс = ПервоеМакс;
    ПервоеМакс = МассивЧисел[Сч];
    КонецЕсли;
    КонецЦикла;
    Сообщить(«Второе: » + ВтороеМакс);

    Показать

    Reply ↓
  23. starik-2005

    Кстати, по поводу квадратного уравнения, то эту задачу вроде бы все должны были в школе еще решать:

    введите а, б, ц
    д = б * б — 4 * а * ц
    если д < 0 тогда Нет корней!
    корень1 = (-б + корень(д)) / (2 * а)
    если д > 0 тогда корень2 = (-б — корень(д)) / (2 * а)
    
    Reply ↓
  24. starik-2005

    Кстати, есть такой ресурс — codewars.com — там много интересных задачек.

    Reply ↓
  25. vadim1011985

    Тут на инфостарте есть статья по сортировке массивов там есть «Гномья сортировка» которая за один цикл (без вложенных) сортирует массив , поэтому поиск 2-го максимума или минимума можно построить на ней , тогда 1, 2-ой элемент будут 2-мя минимумами , а последний и предпоследний 2-мя максимумами

    4. Алгоритм «Гномья сортировка».

    Алгоритм так странно назван благодаря голландскому ученому Дику Груну.

    Гномья сортировка основана на технике, используемой обычным голландским садовым гномом (нидерл. tuinkabouter). Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил.

    Дик Грун

    Вот собственно и все описание алгоритма «Гномья сортировка». Что интересно, алгоритм не содержит вложенных циклов, а сортирует весь массив за один проход.

    Функция ГномьяСортировка(Знач Массив)
    
    i = 1;
    j = 2;
    
    Пока i < Массив.Количество() Цикл // Сравнение < — Сортировка по возрастанию, > — по убыванию
    
    Если Массив[i-1]
    i = j;
    j = j + 1;
    Иначе
    Замена = Массив[i];
    Массив[i] = Массив[i — 1];
    Массив[i — 1] = Замена;
    i = i — 1;
    Если i = 0 Тогда
    i = j;
    j = j + 1;
    КонецЕсли;
    КонецЕсли;
    КонецЦикла;
    
    Возврат Массив;
    КонецФункции

    Показать

    Ссылка на статью

    Reply ↓
  26. vasilev2015

    (22) Мы разошлись в понимании «второй максимальный» я себе представлял, что среди всего массива выбрать максимум, убрать его из рассмотрения, выбрать еще раз максимум — это будет ответ. А Вы представляете, что максимум должен быть локальным.Проверю еще раз условия задачи. В любом случае, спасибо.

    Reply ↓
  27. vasilev2015

    (24) у меня узкие интересы: нужно подготовить к ЕГЭ, но ресурс посмотрю.

    Reply ↓
  28. capitan

    Reply ↓
  29. starik-2005

    (28) 30 секунд, однако… Странные задачи.

    Reply ↓
  30. capitan

    (29)Это из серии загадок, на которые дети отвечают за пару секунд, а взрослые — за пару часов

    давайте сложнее

    Reply ↓
  31. Octopus

    (30) Вчера?

    Reply ↓
  32. herfis

    (25)

    сортирует весь массив за один проход

    Очень лукавая формулировка. Цикл-то один, но «одним проходом» это назвать никак нельзя.

    Reply ↓
  33. vasilev2015

    (30) Послезавтра ?

    Reply ↓
  34. capitan

    (31)

    (33)

    Гугл в помощь ) Я тоже не решил

    Reply ↓
  35. insurgut

    (26) все я понял, где собака зарыта 🙂

    Исправленный код:

    НачальноеЧисло = Формат(ТекущаяДата(), «ДФ=HHmmss»);
    ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);
    
    //генерация массива
    МассивЧисел = Новый Массив;
    РазмерМассива = 9;
    Сообщить(«Массив:»);
    Для Сч = 0 По РазмерМассива — 1 Цикл
    СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 235959);
    МассивЧисел.Добавить(СлучайноеЧисло);
    Сообщить(СлучайноеЧисло);
    КонецЦикла;
    
    //поиск максимальных
    ПервоеМакс = 0;
    ВтороеМакс = 0;
    Для Сч = 0 По РазмерМассива — 1 Цикл
    Если МассивЧисел[Сч] > ПервоеМакс Тогда
    ВтороеМакс = ПервоеМакс;
    ПервоеМакс = МассивЧисел[Сч];
    ИначеЕсли МассивЧисел[Сч] > ВтороеМакс Тогда
    ВтороеМакс = МассивЧисел[Сч];
    КонецЕсли;
    КонецЦикла;
    Сообщить(«Первое: » + ПервоеМакс);
    Сообщить(«Второе: » + ВтороеМакс);
    

    Показать

    Пример №1

    Пример №2
    Reply ↓
  36. insurgut

    (25) мы алгоритмы сортировок в институте изучали 🙂

    Reply ↓
  37. insurgut

    (33)

    Reply ↓
  38. herfis

    (25) Слыхал что когда нужно быстро на коленке сообразить хоть какую-то сортировку, то сортировка Шелла хороший кандидат. Типа золотой середины между более эффективными но более сложными алгоритмами и более медленными «учебными» алгоритмами.

    Reply ↓
  39. vasilev2015

    (35) да, у нас также получилось. Только мы не использовали, что числа неотрицательные, поэтому присваиваем не нули, а первые элементы.

    Reply ↓
  40. SlavaKron

    (30) В массиве дат, отсортированном по убыванию.

    Reply ↓
  41. insurgut

    (39) ну вместо 0 можно присвоит обоим переменным значение первого элемента массива, а сам цикл начать со второго элемента — результат будет тем же, а условий меньше. Ну и в самом цикле поиска в вашем примере на одно условие больше, можно обойтись всего двумя.

    Reply ↓
  42. herfis

    (30) В самолете?

    Reply ↓
  43. starik-2005

    (30) сначала думал, что в календаре, оказалось, что в словаре. Ну тоже неплохо…

    Reply ↓
  44. starik-2005

    (20) кстати, рекурсия — это не цикл!

    procedure minmax(i: integer; min, max, ent : double)
    begin
    if i < 4 then begin
    readLn(ent);
    if (ent > max) or not i then max := ent;
    if (ent < min) or not i then min := ent;
    minmax(i + 1, min_num, max_num, ent_num);
    end
    else begin
    writeln(‘Max = ‘, max);
    writeln(‘Mix = ‘, min);
    end;
    end;
    
    var min_num, max_num, ent_num : double;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    minmax(0, min_num, max_num, ent_num);
    end.

    Показать

    Reply ↓
  45. vadim1011985

    (2)

    По моему это самый простой и короткий способ искать мин и макс а вообще если есть встроенная функция max и min то тогда код получается еще короче т.е. сама функция не нужна

    Function Max (a,b)

    begin

    If a>b then

    return a

    else

    return b;

    end;

    Procedure FindMaxValue ()

    var maxValue,a,b,c,d:int;

    begin

    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);

    readln(a, b, c, d);

    maxValue = Max (Мax(a,b),Мax(с,d));

    end;

    Reply ↓
  46. starik-2005

    (45) в идеале что-то такое получается:

    var a,b,c,d : double;
    begin
    writeln(‘Последовательно введите четыре числа, которые необходимо сравнить’);
    readLn(a,b,c,d);
    writeLn(‘Max: ‘, max(max(a,b),max(c,d)));
    writeLn(‘Min: ‘, min(min(a,b),min(c,d)));
    end.
    
    Reply ↓
  47. roman77

    А почему такая дискриминация — только сыновья? У меня дочка в прошлом году готовилась к информатике и ИкТ, успешно сдала. Не буду поддерживать 🙂

    Reply ↓
  48. roman77

    (1) В контрольных заданиях всё подробно расписано. В последней задаче за простое решение (перебором) дают 2 балла, за сложное 4 балла. Все методисты и здравомыслящие люди советуют решать на 2 балла, ибо при сложном решении есть высокая вероятность накосячить и не получить ни одного бала.

    Reply ↓
  49. vasilev2015

    (47) Исправил в статье https://infostart.ru/public/983886/. Вместо «Отец, Сын» вставил «Родитель, Ребенок».

    Reply ↓
  50. addinaq

    (1)

    Попарное сравнение может

    Перем Первая,Вторая,Третья,Четвертая
    
    ?(Первая>Вторая,ИскомоеПервойПары=Первая,ИскомоеПервойПары=Вторая);
    ?(Третья>Четвертая,ИскомоеВторойПары=Третья,ИскомоеВторойПары=Четвертая);
    Максимум = ?(ИскомоеПервойПары>ИскомоеВторойПары,ИскомоеПервойПары,ИскомоеВторойПары);
    
    ?(Первая<Вторая,ИскомоеПервойПары=Первая,ИскомоеПервойПары=Вторая);
    ?(Третья<Четвертая,ИскомоеВторойПары=Третья,ИскомоеВторойПары=Четвертая);
    Минимум = ?(ИскомоеПервойПары<ИскомоеВторойПары,ИскомоеПервойПары,ИскомоеВторойПары);
    

    Показать

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *