Простые, но интересные задачки по программированию




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

80 Comments

  1. DoctorRoza

    Хорошие задачи .. )) .. а первая вообще из 10 класса средней школы!! 🙂

    Reply
  2. YVolohov

    Задачи понравились, +

    Кстати для первой:

    А = А + В;

    В = А — В;

    А = А — В;

    Reply
  3. YVolohov

    Для третьей задачи всего одна строка:

    B = 2 — A;

    Reply
  4. YVolohov

    Задача №5

    КоличествоЭлементов = Массив.Количество();

    СуммаЧиселМассива = 0;

    СуммаЧиселРяда = 0;

    Для Счетчик = 1 По КоличествоЭлементов Цикл

    СуммаЧиселМассива = СуммаЧиселМассива + Массив[Счетчик — 1];

    СуммаЧиселРяда = СуммаЧиселРяда + Счетчик;

    КонецЦикла;

    Сообщить(СуммаЧиселРяда — СуммаЧиселМассива);

    Reply
  5. kosilov
    ТекA=0;
    ТекB=0;
    КвоА = A.Количество();
    КвоВ = B.Количество();
    Для Сч = 1 По КвоА + КвоВ Цикл
    если ТекA<КвоА и (ТекB=КвоВ  ИЛИ A[ТекA]<B[ТекB]) тогда
    Сообщить(«A[» + ТекA + «]=» + A[ТекA]);
    ТекA = ТекA + 1;
    иначе
    Сообщить(«B[» + ТекB + «]=» + B[ТекB]);
    ТекB = ТекB + 1;
    КонецЕсли;
    КонецЦикла;
    
    

    Показать

    Reply
  6. Evg-Lylyk

    (4) Можно чуток попроще. Сумма чисел арифметической прогрессии равна (Начало+Конец) * (Количество / 2). Пример: 1-100; Сумма = (1+101) *(100/2) = 5050 т.к. пропущенное число только одно разница между суммой массива и полной прогрессией и будет то число.

    Reply
  7. Поручик

    >>> Прислал работодатель в качестве тестового задания.

    Надо было послать этого работодателя. На три буквы, например в лес.

    Reply
  8. awa

    Ну и для второй задачки ответ:

    Функция F(N)
    Результат = 1;
    Для Ин = 2 По N Цикл
    Результат = Результат * Pow(Ин, N — Ин + 1);
    КонецЦикла;
    Возврат Результат;
    КонецФункции // F(N)
    
    Reply
  9. Evg-Lylyk

    (8) неверно

    При N=4 правильно (1! = 1) * (2! =2) * (3! = 6) *(4! = 24) = 144

    У вас результат 1*(2#k8SjZc9Dxk3 = 8)*(3#k8SjZc9Dxk2=9)*(4#k8SjZc9Dxk1) = 288

    Reply
  10. awa

    (9) 1*2*6*24=288 (с) calc

    Или у нас калькуляторы разные? (в уме я считать не умею!)

    Reply
  11. Evg-Lylyk

    (10) Сорри моя ошибка все верно

    Reply
  12. Nefertary

    Задача 3:

    В=2#k8SjZc9DxkA

    Reply
  13. marat_n

    Я даже догадываюсь, что за работодатель 🙂

    Нормальный тест. Сразу отфильтровывают тех, кто подумать не может. Только присылать его как-то бессмысленно, ибо есть гугл и время не ограничено.

    Reply
  14. YAN

    Хорошая зарядка для ума, вот обработку даже захотелось сделать 🙂

    Reply
  15. Evg-Lylyk

    (13)

    Я даже догадываюсь, что за работодатель

    напиши пожалуйста в личку

    Свою задачу эти задачки решают. Я допустим взял на заметку.

    (12) Для A=0 B= 2

    А у вас 2#k8SjZc9Dxk0=1

    Reply
  16. ll13

    1). A=A+B; B=A-B; A=A-B

    2). Расчет факториала выносим в рекурсивную функцию(по условию задачи использование рекурсии не запрещено), а сами n! перемножаем в цикле.

    3). B = 2 — A

    Reply
  17. e.kogan

    (3) А вот и нет. B = 1+(A=0);

    Reply
  18. YVolohov

    Согласно условию задачи:

    если А = 0 тогда В = 2

    если А = 1 тогда В = 1

    если же считать по формуле в (17)

    если А = 0 тогда В = 1

    если А = 1 тогда В = 2

    Reply
  19. Evg-Lylyk

    (18) да не все правильно. В 1С Число(Истина) = 1; Число(Ложь) = 0 вот и результат

    Reply
  20. YVolohov

    (19) Действительно правильно. А я сначала не врубился.

    Reply
  21. ildarovich

    Задача 4

    ё = 0;
    Для Сч  = 1 По А.Количество() + В.Количество() Цикл
    ж = (Сч — 1 — ё) = В.Количество() ИЛИ ё < А.Количество() И А[ё] < В[Сч — 1 — ё];
    Сообщить(?(ж, «А[» + ё + «]=» + А[ё], «В[» + (Сч — 1 — ё) + «]=» + В[Сч — 1 — ё]));
    ё = ё + ж
    КонецЦикла
    
    Reply
  22. ll13

    (19),(20) Только вот зачем? Смотрите сами, зачем городить огород:

    1 — операция сравнения

    2 — неявное приведение типа (Булево->Число)

    3 — Сложение

    Ведь В зависит от А линейно => B = 2 — A более логично … 🙂

    Reply
  23. Evg-Lylyk

    (22) Да согласен сложнее. Зато тоже правильно и по другому.

    И возможно человек просто не прочитал «А может принимать значение 0 или 1» и написал просто замену

    Если (А = 0) Тогда
    B = 2;
    Иначе
    В = 1;
    КонецЕсли;

    для любых значений А

    Reply
  24. Jogeedae

    ❗ код может и ошибочный, но алгоритм мне нравицо 😀

    Задача 4:

    Для сч = 1 По ?(а>б,а,б) Цикл
    Асч = ?(сч>а,неопределено,А[сч]);
    Бсч = ?(сч>б,неопределено,Б[сч]);
    Сообщить(?(Асч>Бсч,Асч,Бсч));
    Сообщить(?(Асч<Бсч,Асч,Бсч));
    КонецЦикла;

    *точно ошибочный 🙂

    вот вроде бы правильное решение:

    счА = 0;
    счБ = 0;
    Пока НЕ (счА=а И счБ=б) Цикл
    Если (счА<а) И ((мА[счА] <= мБ[счБ-(счБ=б)]) ИЛИ (счБ=б)) Тогда
    Сообщить(мА[счА]);
    счА = счА + 1;
    КонецЕсли;
    Если (счБ<б) И ((мБ[счБ] <= мА[счА-(счА=а)]) ИЛИ (счА=а)) Тогда
    Сообщить(мБ[счБ]);
    счБ = счБ + 1;
    КонецЕсли;
    КонецЦикла;

    Показать

    Reply
  25. costy_admin

    // чА число А

    // чБ Число Б

    чА = (чА+чБ)-чА;

    чБ = (чА+чБ)-чБ;

    // НчА конечный результат число А

    // НчБ конечный результат числа Б

    при учете что числа положительные….

    Reply
  26. Jogeedae

    в (24) по сравнению с вариантом (21) итераций как будто меньше 😀

    Reply
  27. Креатив

    вероятно так заработает тоже, но по скорости уступит (24)

    счА = 0;
    счБ = 0;
    вра = ма[1];
    врб = мб[1];
    Пока 1=1 Цикл
    Если вра <  врб  Тогда
    Сообщить(вра);
    счА = счА + 1;
    Иначе
    Сообщить(врб);
    счБ = счБ + 1;
    КонецЕсли;
    Если счА>а  Тогда
    вра = мб[б];
    Иначе
    вра = ма[счА];
    КонецЕсли;
    Если счБ>б  Тогда
    врб = ма[а];
    Иначе
    врб = мб[счБ];
    КонецЕсли;
    Если (счБ>б) и (счА>а)  Тогда
    Прервать;
    КонецЕсли;
    КонецЦикла;
    

    Показать

    Reply
  28. salex10

    Для (25) 1-я задача, я так понимаю

    чА = (чА+чБ)-чА;

    чБ = (чА+чБ)-чБ;

    — в последнем варажении уже чА=чБ, поэтому чБ будет = чБ

    мое решение:

    А = А — Б

    Б = Б + А

    А = Б — А

    Reply
  29. salex10

    2-я задача — рекурсия скорее всего

    3-я: В = 2 — А

    4-я:

    счА = 1;

    счВ = 1;

    Для Сч = 1 По а + в Цикл

    Если счА > а Тогда

    Если счВ > в Тогда

    Прервать;

    Иначе

    Сообщить(В[счВ]);

    счВ = счВ + 1;

    Конецесли;

    ИначеЕсли А[счА] < B[счВ] Тогда

    Сообщить(А[счА]);

    счА = счА + 1;

    Иначе

    Сообщить(В[счВ]);

    счВ = счВ + 1;

    Конецесли;

    Конеццикла;

    Reply
  30. ildarovich

    Вот выпендрЁЖный вариант (21), если немного отступить от «буквы» задания

    ёж = 0;
    Для уж  = 0 По А.Количество() + В.Количество() — 1 Цикл
    що = (уж — ёж) = В.Количество() ИЛИ ёж < А.Количество() И А[ёж] < В[уж — ёж];
    Сообщить(?(що, «а» + ёж + «=» + А[ёж], «в» + (уж — ёж) + «=» + В[уж — ёж]));
    ёж = ёж + що
    КонецЦикла

    Можно еще сократить одну строку, если дважды вычислять «що».

    А по скорости было бы сравнить интересно…

    Reply
  31. Spitfire

    вторая задача легко пишется и без рекурсии:

    F_n = 1;
    n_fact = 1;
    i = 1;
    while i<=n do
    n_fact = n_fact * i;
    F_n = F_n * n_fact;
    i = i +1;
    end;
    Return F_n;
    

    Показать

    Reply
  32. Vasilina2009

    1. Решение: при b<>0

    a = a*b

    b=a/b

    a=a/b

    Reply
  33. Spitfire

    для первой задачи, если нужно поменять местами не числовые переменные (а произвольные двоичные данные), то можно написать так:

    a = a xor b;
    b = b xor a;
    a = a xor b;
    

    тут xor — оператор логического исключающего ИЛИ

    Reply
  34. Vashenko

    1. a=a*b=20; b=a/b=5; a=a/b=4

    2. F=1; Для K=1 По n Цикл F=F*(K)#k8SjZc9Dxk(n-K+1) КонецЦикла

    3. B=2-A

    4. Для Сч=1 По а+b Цикл

    ТекНомерА=0; ТекНомерB=0;

    Если А[ТекНомерА+Сч]>B[ТекНомерB+Сч] Тогда

    ТекНомерА=ТекНомерА+1; Сообщить(А[ТекНомерА]);

    Иначе

    ТекНомерB=ТекНомерB+1; Сообщить(B[ТекНомерB]);

    КонецЕсли

    Reply
  35. Vashenko

    1. a=a*b=20; b=a/b=5; a=a/b=4

    2. F=1; Для K=1 По n Цикл F=F*(K)#k8SjZc9Dxk(n-K+1) КонецЦикла

    3. B=2-A

    4. Для Сч=1 По а+b Цикл

    ТекНомерА=0; ТекНомерB=0;

    Если А[ТекНомерА+Сч]>B[ТекНомерB+Сч] Тогда

    ТекНомерА=ТекНомерА+1; Сообщить(А[ТекНомерА]);

    Иначе

    ТекНомерB=ТекНомерB+1; Сообщить(B[ТекНомерB]);

    КонецЕсли

    Reply
  36. Evg-Lylyk

    (31) Я решил аналогично

    РезультатФункции = 1; ФакториалДляПоследнегоСч = 1;
    Для Сч = 2 По Н Цикл
    ФакториалДляПоследнегоСч = ФакториалДляПоследнегоСч * Сч;
    РезультатФункции = РезультатФункции * ФакториалДляПоследнегоСч;
    КонецЦикла;
    

    (32) в решении

    A=A+B;….

    есть момент — переполнение (выход за границы типа) хотя в 1С это наверно не актуально ну в вашем решении этот момент более актуален

    (33) Правильно конечно, но в 1С нет XOR (вариант с XOR более универсален он обменяет значениями не только числа)

    Reply
  37. Evg-Lylyk

    (34), (35) неверно 4

    Вынести за цикл:

    ТекНомерА=0; ТекНомерB=0;

    Заменить

    Если А[ТекНомерА+Сч]>B[ТекНомерB+Сч] Тогда

    на

    Если А[ТекНомерА]<B[ТекНомерB] Тогда

    по возрастанию

    и еще учесть что массив А полностью меньше массива Б

    Reply
  38. chea06

    вероятно был у этого же работодателя, только решал эти задачи на месте на листке. И кстати в задании не сказано, что задачи надо решать методами 1С 🙂

    Reply
  39. vet7777

    в 3 задаче я не сразу заметил условие что «А может принимать значение 0 или 1»

    и решил ее при условии, что А может принимать любое значение — положительное, отрицательное или 0.

    а вы попробуйте! задача гораздо интереснее получается. 😎

    Reply
  40. Vashenko

    (37) спасибо за поправки. накалякал просто идеи без проверки 🙂

    Reply
  41. ll13

    (39) Это очень плохо, если Вы даже условие прочитать не можете правильно, что же дальше то будет, когда до реализации дойдёт 😮

    Я бы такого работника не взял 😀

    Reply
  42. vet7777

    я просто усложнил задачу…

    мне по барабану что ты там думаешь, я бы тебя тоже не взял 😎

    ты реши с тем условием, что я написал, потом пальцы кидай 😉

    Reply
  43. Necytij

    Задачки все десткие, но, честно говоря, над последней пришлось подумать минутку… 😳

    Reply
  44. e.kogan

    (41) Жизнь научила, что думать надо сразу универсально 🙂 иначе бы А было Булевым.

    Reply
  45. e.kogan

    На четвёртую задачку: не оттестированный, но вроде корректный вариант

    ТекущийЭлементА=0;
    ТекущийЭлементБ=0;
    КвоА=А.Количество();
    КвоБ=Б.Количество();
    ТекстВыполнить=»ТекущийЭлемент#=ТекущийЭлемент#+1;
    |Сообщить(«»число «»+#[ТекущийЭлемент#]+»» — «»+й+»» элемент упорядоченного массива, «»+ТекущийЭлемент#+»» элемент массива #»»)»;
    Для й=0 по КвоА + КвоБ Цикл
    ВыводимА=Не (ТекущийЭлементА>КвоА);
    ВыводимБ=Не (ТекущийЭлементБ>КвоБ);
    Если Не (ВыводимА или ВыводимБ) Тогда Прервать; КонецЕсли; //оба массива кончились
    Если ВыводимА и ВыводимБ Тогда
    ВыводимА=(А[ТекущийЭлементА]>Б[ТекущийЭлементБ]);
    КонецЕсли;
    Выполнить(СтрЗаменить(ТекстВыполнить,»#»,?(ВыводимА,»А»,»Б»)));
    КонецЦикла;

    Показать

    Reply
  46. ll13

    (44) В институте научили, что самое главное правильно понять и усвоить условия задачи.

    Если это сделано — то пол задачи решено 🙂

    Reply
  47. e.kogan

    (45) Однако при числовом реквизите А «защиту от дурака» лучше поставить 😉 мало ли что пользователь введёт? Или до того проверку влепить, или делать неявным приведением значения.

    Во всяком случае наши преподаватели обязательно попробуют ввести при проверке А=3 😎

    Reply
  48. o.nikolaev

    Я тоже их на месте решал. И работодатель известный 🙂 Что-то не верю в то что их прислали… 😉

    Reply
  49. breyn

    задача 3

    В=2-А

    Reply
  50. Kondrat

    Для первой задачки:

    не так изящно, но все же….

    а=Строка(а)+»*»+Строка(б);

    б=Число(Лев(а,Найти(а,»*»)-1));

    а=Число(Сред(а,Найти(а,»*»)+1));

    Reply
  51. Hitcher

    Задача 3. Решение для любого значения А 😀

    Попытка

    В = 1/А;

    В = 2;

    Исключение

    В = 1 ;

    КонецПопытки;

    Reply
  52. ll13

    (51) Ну ты дружок замутил … Попытка … Исключение … КонецПопытки

    Одна из самых медленных конструкций в 1С …

    Reply
  53. Поручик

    А куда нам торопиться?

    Reply
  54. vet7777

    а теперь решите в таком варианте:

    Написать функцию B=F(A) на встроенном языке 1С, при следующих условиях:

    1. если А=0, то B=2, иначе B=1

    2. полученное однострочное выражение, должно выполняться в табло 1С при различных значениях A

    3. не допускается использование условных операторов (например , ?(А = 0;2;1)), не допускается использование попыток/исключений (что в общем то в табло и не получится :).

    PS: мы в конторе уже напридумывали 3 варианта решения.

    Reply
  55. Dolly_EV

    (18)(19)(20) в (17) проверка УСЛОВИЯ (Истина/Ложь), что по условию задачи низзя 😉

    Reply
  56. Evg-Lylyk

    (55) По условии задачи нельзя использовать условных операторов например ?.

    В решении B = 1+(A=0); нет условных операторов.

    Reply
  57. maxis33

    Мне тоже такие присылали по почте. Довольно занятно было порешать, даже без особой цели устроиться к ним на работу:)

    Reply
  58. vodyanoy

    Да, работодатель известный. Года 3 назад у них в офисе я эти задачки решал на листочке. Странно, что они их до сих пор совсем не изменили.

    По поводу 2-й задачки. Тут кто-то рекурсию предлагал. Я тоже тогда рекурсию замутил. Меня, естественно, завернули с этой мыслью несуразной 😀 , т.к. циклов должно быть по условию всего ОДИН, а рекурсия это уже совсем не один. Не додумался тогда сходу, ну да ладно.

    Reply
  59. Mogidin

    1) # a=4 b=5

    a=a+b # a=9 b=5

    b=a-b # a=9 b=4

    a=a-b # a=5 b=4

    2) Результат=1; Элемент=1;

    Для Инд=1 По Н Цикл

    Элемент=Элемент*Инд;

    Результат=Результат*Элемент;

    КонецЦикла;

    # Результат = F(n)

    3) B=2-A

    4) Инд1=1; Инд2=1; Эл1=А[Инд1]; Эл2=В[Инд2];

    Для Инд=1 По а+в Цикл

    Если (Эл1<Эл2) И (Инд1<а) Тогда

    Сообщить(Эл1); Инд1=Инд1+1; Эл1=А[Инд1];

    Иначе

    Сообщить(Эл2); Инд2=Инд2+1; Эл2=В[Инд2];

    КонецЕсли;

    КонецЦикла;

    5) Контроль=0; Сумма=0;

    Для Инд=1 По Н Цикл

    Контроль=Контроль+Инд;

    Сумма=Сумма+А[Инд];

    КонецЦикла;

    Пропавший=Контроль-Сумма;

    *везде подразумевается индексация массивов с 1

    Reply
  60. romech

    1) подразумевается, что оба числа не равны нулю, в другом случае делается проверка и решение очевидно. Итак решение: b=b*a; a=b/a; b=b/a

    2)Значение = 1;

    Для н=1 по нн Цикл

    Значение = Значение * Значение * н;

    н = н + 1;

    КонецЦикла

    3)В = 2 — А

    4) и 5) думаю много похожих решений уже есть. А теперь почитаю, чего написали другие =)

    Reply
  61. Oleg_nsk

    Задача №5

    Сум = А.Количество();

    Для н = 0 По А.Количество()-1 Цикл

    Сум = Сум — А[н] + н;

    КонецЦикла;

    Сообщить(Сум);

    Reply
  62. Oleg_nsk

    Задача №4

    ИндА = 0;

    ИндБ = 0;

    Для н = 1 По (КолА + КолБ) Цикл

    Если (КолА = ИндА) и (КолБ = ИндБ) Тогда

    Прервать;

    ИначеЕсли (КолА = ИндА) и Не (КолБ = ИндБ) Тогда

    Сообщить(Б[ИндБ]);

    ИндБ = ИндБ+1;

    ИначеЕсли Не (КолА = ИндА) и (КолБ = ИндБ) Тогда

    Сообщить(А[ИндА]);

    ИндА = ИндА+1;

    ИначеЕсли А[ИндА] < Б[ИндБ] Тогда

    Сообщить(А[ИндА]);

    ИндА = ИндА+1;

    ИначеЕсли А[ИндА] > Б[ИндБ] Тогда

    Сообщить(Б[ИндБ]);

    ИндБ = ИндБ+1;

    ИначеЕсли А[ИндА] = Б[ИндБ] Тогда

    Сообщить(А[ИндА]);

    Сообщить(Б[ИндБ]);

    ИндА = ИндА+1;

    ИндБ = ИндБ+1;

    КонецЕсли;

    КонецЦикла;

    Reply
  63. rom-x

    1) а = а + (b — a)

    b = b — (b — a)

    2) Перем Факт, Рез, Знач;

    Рез = 1; Знач = 1;

    Для ин= 1 По Факт Цикл

    Знач = Знач*ин;

    Рез = Рез*Знач;

    КонецЦикла;

    3) B = (B + A) — A

    Reply
  64. JaneP

    (2) YVolohov,

    Другое решение:

    b=b-a

    a=a+b

    b=a-b

    Reply
  65. gangstar94

    Ответ на первую задачу из 10 класса :

    А=4;

    Б=5;

    Если А=4 тогда

    А=5 ;

    Иначе Сообщить(«Условие не выполнено») ;

    КонецЕсли ;

    Если Б=5 тогда

    Б=4

    Иначе Сообщить («Условие не выполнено») ;

    КонецЕсли ;

    АА=»А=»+А ;

    ББ=»Б=»+Б ;

    Сообщить (АА);

    Сообщить (ББ);

    Reply
  66. Evg-Lylyk

    (65)

    Задача 1.

    Объявлены две числовые переменные a и b. Необходимо сделать так, чтобы без объявления других переменных в результате работы алгоритма значения переменных поменялись местами. Например, если изначально a = 4, b = 5, то в результате алгоритма стало a = 5, b = 4. Применять можно только операции присваивания и арифметические операции с числами и значениями переменных.

    Решение:

    b=b-a

    a=a+b

    b=a-b

    Reply
  67. i_a
    В = Число((А = 0)+1)

    , для любого значения А.

    Спасибо автору данной публикации.

    Reply
  68. KapasMordorov

    http://www.forum.mista.ru/topic.php?id=368453&page=1

    Пост 6.

    Всё-таки надо было гуглить и тогда бы прочитал местный пост Поручика.

    Reply
  69. premierex

    (3) YVolohov, При А = 100, например, результат будет явно не верным.

    Reply
  70. premierex

    (22) ll13, см. мой предыдущий комментарий.

    Reply
  71. premierex

    (63) rom-x,

    2) Перем Факт, Рез, Знач;

    Рез = 1; Знач = 1;

    Для ин= 1 По Факт Цикл

    Знач = Знач*ин;

    Рез = Рез*Знач;

    КонецЦикла;



    Переменная Факт не инициализирована, 1С сразу выдаст сообщение об ошибке о невозможности приведения переменной Факт к типу «Число».

    Reply
  72. 20!8

    a,b = b,a

    Reply
  73. Jokemas

    (19)

    (24) Зачем так сложно? В форме рисуем числовое поле, (число1 же), вбиваем туда любое число и считаем факториал.

    Процедура КнопкаВыполнитьНажатие(Кнопка)

    Счетчик = 1;

    Факториал = 1;

    Пока Счетчик <= Число1 Цикл

    Факториал = Факториал * Счетчик;

    Счетчик = Счетчик + 1;

    КонецЦикла;

    Сообщить(Факториал);

    КонецПроцедуры

    Reply
  74. Jokemas

    (19)

    (24) Зачем так сложно? В форме рисуем числовое поле, (число1 же), вбиваем туда любое число и считаем факториал.

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Счетчик = 1;
    Факториал = 1;
    Пока Счетчик <= Число1 Цикл
    Факториал = Факториал * Счетчик;
    Счетчик = Счетчик + 1;
    КонецЦикла;
    
    Сообщить(Факториал);
    
    КонецПроцедуры
    

    Показать

    Reply
  75. spacecraft

    (75) и чему там получится 0! ?

    Reply
  76. Jokemas

    (76)

    единице, конечно =)

    Переменная счетчик = 1, переменная факториал = 1, 1*1 сколько будет? =)))). По определению факториал 0 = 1, поэтому переменные начинаются с 1, исключая возможность умножения на 0 =)

    Reply
  77. Jokemas

    (75)

    Так, ну отвечая на вопрос я описал только факториал, а само решение Задачи будет таким:

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    Счетчик = 1;
    Факториал = 1;
    Результат = 1;
    
    М = Новый Массив;
    
    Пока Счетчик <= Число1 Цикл
    
    Факториал = Факториал * Счетчик;
    М.Добавить(Факториал);
    Результат = Результат*М[Счетчик-1];
    Счетчик = Счетчик + 1;
    
    КонецЦикла;
    Сообщить(Факториал);
    Сообщить(Результат);
    
    КонецПроцедуры
    

    Показать

    Просто все эти факториалы фигачим в массив, который перемножаем.

    Reply
  78. Jokemas

    5 Задача

    Имеется НЕУПОРЯДОЧЕННЫЙ массив из n различных целых чисел от 0 до n (0,1,…,j-1,j+1,….,n). Необходимо за один цикл определить недостающее число j:

    Ну ок, нигде не написано, что нельзя его упорядочить…

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

    Показать

    Reply
  79. kostya_whiskas

    (79)

    n = М.Количество()+1;

    k = (n+1)*n/2;

    Для Сч = 0 По n-2 Цикл

    k = k — М[Сч];

    КонецЦикла;

    Сообщить(k);

    где (n+1)*n/2; — сумма всех чисел в массиве

    вычитанием элементов из этой суммы определяем недостающее число

    Reply
  80. wowkos

    Задача 3:

    B = 1 + 0#k8SjZc9DxkA

    Reply

Leave a Comment

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