Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
13 Дек 2017, 04:16
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Среда. Вопрос 7  (Прочитано 24865 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн mixqn

  • Администратор
  • *****
  • Сообщений: 1346
  • РЕПУТАЦИЯ: 166
  • КПД: 12%
  • Who is John Galt?
  • Регистрация: 2012-08-15
  • Сайт: 3gmaster.net
  • Профессия: Программист 1С
Как правило по приезду из командировки менеджер проекта должен отчитаться перед бухгалтерией о потраченных средствах. У неопытного менеджера проектов на этом пути часто возникает множество проблем и данный этап становится для него испытанием чуть ли не большим, чем выполнение самого проекта. Для бывалых сотрудников этот этап является формальностью и с лёгкостью проходится. Но даже у самых опытных бывает, что возникают проблемы. Задачу, возникшую в одной из таких ситуаций вам и придётся решить.

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

Сергей Сергеевич знает, что спорить с бухгалтером бессмысленно — они практически никогда не ошибаются, но тем не менее он был уверен и в своей правоте… Значит ошибка возникла на этапе переписывания значений с отчета на листок бумаги. Осталось только найти несоответствие, но это не так просто, ведь слагаемых слишком много, да и бухгалтер переписывал их в странном, известном только ему одному порядке.

Предположим, что ошибка при переписывании состояла в том, что бухгалтер поменял в каком-то числе 2 рядом стоящие цифры. Ваша задача, зная список, написанный на листке бумаги бухгалтера и подотчётную сумму Сергея Сергеевича, сообщить о числе, в котором возможно была допущена ошибка.

Исходные данные

Далее N строк по одному неотрицательному целому числу (длина 10) — слагаемые. Отдельный реквизит содержит сумму, указанную в отчёте Сергея Сергеевича (неотрицательное целое число, длиной 10). Ни в каких числах не может быть ведущих нулей, кроме того, ведущие нули не могли появиться в результате ошибки.

Результат

В случае если по входным данным можно найти число, в котором могла произойти описка — вывести строку «Ошибка находится в строке N. Правильное значение: K.», где N — порядковый номер числа K, которое могло быть неправильно записано бухгалтером. Если такого числа нет, следует вывести «Ошибка не найдена.» Возможно, бухгалтер обсчитался, и сумма слагаемых совпадает с подотчётной, тогда следует вывести строку «Ошибка отсутствует.»

Решение следует выкладывать в виде внешней обработки версий 1с от 8.1 до 8.3.

Примеры

исходные данныерезультат
12
26
45
Сумма:119
Ошибка находится в строке 2. Правильное значение: 62.
12
26
45
Сумма:109
Ошибка не найдена.
1071
300
1800
2700
4950
Сумма:10821
Ошибка отсутствует.


Предыдущий вопрос Следующий вопрос

Последний раз редактировалось: MuI_I_Ika; 13 Мар 2013, 01:36


Оффлайн soft

  • *
  • Сообщений: 37
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-07-12
  • Сайт: 
  • Профессия: Программист 1С
Re: Среда. Вопрос 7
« Ответ #1: 13 Мар 2013, 05:55 »
ТК это викторина, то предполагается, что есть вопросы, и на них можно быстренько ответить.
Обработку писать лень. Не нашел тут выкладывания файликов непосредственно на форум.

Я словами алгоритм напишу :)
1 - Высчитываем разницу между 2-мя суммами.
2 - Если разница 2-значная, то перепутаны разряды единиц и десятков, если 3-значная, сотен и десятком и тд.
3 - Раскладываем все числа в массив как в младщих классах. Число[0]= число единиц. Число[1] =  число десятков. Или тупо преобразуем число в строку. Из строки сможем дергать символы так же по индексу.
4 - Обходим все числа, меняем нужные разряды, если получили разницу, такую же как в п. 1 - ошибка найдена.

Как то так. А писать обработки - это денег стоит :)

Оффлайн IrinaO

  • *
  • Сообщений: 39
  • РЕПУТАЦИЯ: 1
  • КПД: 3%
  • Регистрация: 2012-12-08
  • Сайт: 
  • Профессия: Ученик 1С
Re: Среда. Вопрос 7
« Ответ #2: 13 Мар 2013, 07:05 »
Внешняя обработка прилагается
Добавлено: 13 Мар 2013, 07:07

Извиняюсь, не поняла, прицепился файл или нет. На всякий случай выкладываю код модуля формы, на которой два реквизита - Строки и СуммаДОкумента и команда Поиск
&НаКлиенте
Процедура Поиск(Команда)
   НашлиОшибку=Ложь;
   Итог = Строки.Итог("Сумма");
   Если СуммаДокумента=Итог Тогда
      Сообщить("Ошибка отсутствует");
   Иначе
      Для Каждого Строка Из Строки Цикл
         НоваяСтрока=ПробуемНайтиОшибку(Строка.Сумма, Итог);
         Если НоваяСтрока<>0 Тогда
            Сообщить("Ошибка находится в строке " + (Строки.Индекс(Строка)+1) + ". Правильное значение:"+НоваяСтрока+".");
            НашлиОшибку=Истина;
            Прервать;
         КонецЕсли;
      КонецЦикла;
      Если Не НашлиОшибку Тогда
         Сообщить("Ошибка не найдена");
      КонецЕсли;
   КонецЕсли;
КонецПроцедуры

&НаКлиенте
Функция ПробуемНайтиОшибку(Сумма, Итог)
  ОбрСимвол=1;
  СуммаСтр= Формат(Сумма,"ЧГ=0");
  Длина = СтрДлина(СуммаСтр);
  Пока ОбрСимвол < Длина Цикл
      НоваяСтрока = Число(Лев(СуммаСтр,ОбрСимвол-1)+Сред(СуммаСтр,ОбрСимвол+1,1) + Сред(СуммаСтр,ОбрСимвол,1) + Прав(СуммаСтр, Длина-ОбрСимвол-1));
      Если СуммаДокумента=Итог-Сумма +НоваяСтрока Тогда
         Возврат НоваяСтрока;
      КонецЕсли;   
      ОбрСимвол=ОбрСимвол+1;
  КонецЦикла;
  Возврат 0;   
КонецФункции // ПробуемНайтиОшибку()

Оффлайн toxicoff

Re: Среда. Вопрос 7
« Ответ #3: 13 Мар 2013, 10:38 »
Извиняйте, слишком лень писать обработку.
Но решения кроме перебора (по строкам, а потом перемещения символов и проверки с общей суммой), имхо нету.

Думал о последовательном суммировании многомерного массива, как в школе, столбиком. Но это слишком трудоёмко)

Верю что есть красивое решение)

Оффлайн DarKySiK

  • *
  • Сообщений: 41
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-02-17
  • Сайт: 
  • Профессия: Программист 1С
Re: Среда. Вопрос 7
« Ответ #4: 13 Мар 2013, 11:30 »
Ссылка на обработку: http://yadi.sk/d/nYpvooLj3FReL.

Оффлайн nidom

  • **
  • Сообщений: 50
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2010-11-22
  • Сайт: 
  • Профессия: Программист 1С
Re: Среда. Вопрос 7
« Ответ #5: 13 Мар 2013, 11:31 »
А теперь допустим, что бухгалтеру отчитались не за 3-4 суммы, а за сотню? И ошибку-опечатку он сделал не одну - тогда как быть? Почему-то в условии задачи этого нет, но я постарался предусмотреть и такой случай. Ведь может быть ситуация вроде вот этой:
Числа: 1010, 354, 8846, 776
Сумма: 10977
В этой ситуации ошибка может быть в трех цифрах сразу... Или это я случайно наткнулся на такую комбинацию чисел? Хотя это напрямую связано с числами стоящими рядом в числовом ряду 0,1,2...9.

Добавлено: 13 Мар 2013, 11:35


Оффлайн serj1C

  • **
  • Сообщений: 53
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-12-09
  • Компания: Стройландия
  • Профессия: Программист 1С
Re: Среда. Вопрос 7
« Ответ #6: 13 Мар 2013, 11:45 »
Основания идея - есть закономерность. От перестановки соседних цифр в числе разность должна быть кратной 9.
Если разность поделить на 9, то мы узнаем разряд, в котором стоит искать ошибку.
Дальше дело техники- перевернуть цифры, отнять от оригинала и сравнить с разностью.

Плюс проверена работа на отрицательных числах. Такие тесты должны быть.

Процедура КнопкаВыполнитьНажатие(Кнопка)
Запрос = Новый Запрос("Выбрать 0 как Число Где Ложь");
Таблица = Запрос.Выполнить().Выгрузить();
Сумма = 0;
Для Сч = 1 По СтрЧислоСтрок(ИсходныеДанные) Цикл
Стр = СтрПолучитьСтроку(ИсходныеДанные, Сч);
Если Найти(Стр, "Сумма:") Тогда
Сумма = Число(СтрЗаменить(Стр, "Сумма:", ""));
Прервать;
Иначе
Таблица.Добавить().Число = Число(Стр);
КонецЕсли;
КонецЦикла;
ИтогРасчет = Таблица.Итог("Число");

Если ИтогРасчет=Сумма Тогда
Результат = "Ошибка отсутствует.";
Возврат;
КонецЕсли;

Разница = ИтогРасчет-Сумма;
Если Разница%9<>0 Тогда
Результат = "Ошибка не найдена.";
Возврат;
КонецЕсли;

Разряд = СтрДлина(Формат(?(Разница<0, -Разница, Разница)/9, "ЧГ=0")); // разряд, в котором надо искать ошибку
Минимум = Pow(10, Разряд);
Для Каждого Стр Из Таблица Цикл

Если ?(Стр.Число<0,-Стр.Число,Стр.Число) < Минимум Тогда
Продолжить;
КонецЕсли;
Строкой = Формат(Стр.Число, "ЧГ=0");
ОбратноеЧисло =
Сред(Строкой, 1, СтрДлина(Строкой)-Разряд-1)+
Сред(Строкой, СтрДлина(Строкой)-(Разряд-1), 1)+
Сред(Строкой, СтрДлина(Строкой)-(Разряд), 1)+
Сред(Строкой, СтрДлина(Строкой)+1-(Разряд-1), Разряд-1);
ОбратноеЧисло = Число(ОбратноеЧисло);

Если Разница = Стр.Число-ОбратноеЧисло Тогда
Результат = "Ошибка находится в строке "+(Таблица.Индекс(Стр)+1)+". Правильное значение: "+ОбратноеЧисло+".";
Возврат;
КонецЕсли;
КонецЦикла;

Результат = "Ошибка не найдена.";
Возврат;

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

Обработка на 8.2

Оффлайн Vit1501

  • ****
  • Сообщений: 360
  • РЕПУТАЦИЯ: 60
  • КПД: 17%
  • Регистрация: 2010-06-05
  • Сайт: 
  • Профессия: Программист 1С
Re: Среда. Вопрос 7
« Ответ #7: 13 Мар 2013, 11:52 »
примерно так

Оффлайн Spider244

  • *
  • Сообщений: 37
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-07-26
  • Сайт: 
  • Профессия: Программист 1С
Re: Среда. Вопрос 7
« Ответ #8: 13 Мар 2013, 12:08 »
Обработка во вложении.

Оффлайн evgeny.s

  • *
  • Сообщений: 38
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2011-01-07
  • Сайт: 
  • Профессия: Программист 8.1
Re: Среда. Вопрос 7
« Ответ #9: 13 Мар 2013, 12:19 »
как по мне, так таких бухов лучше екселем научить пользоваться, чем изобретать, неизвестно что..
вот такой вопрос: а числа, для проверки, кто будет вводить? тоже бухгалтер? так он со своего листочка введет, также не правильно, и все у него сойдется, и ни какая обработка не докажет...
вообщем спорная задача....


Теги:
 


* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
171 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
51 Сообщений
alex0402
49 Сообщений
andron81_81
38 Сообщений
AIFrame
37 Сообщений
MuI_I_Ika MuI_I_Ika
33 Сообщений
BuhRust
30 Сообщений
Golickoff Golickoff
28 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 207
  • Точка Скрытых: 0
  • Точка Пользователей: 3
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal