|
Придумать простой алгоритм | ☑ | ||
---|---|---|---|---|
0
Legj
09.01.13
✎
16:41
|
Коллеги, помогите придумать красивый алгоритм.
Задача простая: нужно, чтобы пользователь вводил данные в диалог вввода строки до тех пор, пока не введет что-нибудь либо пока не откажется от ввода. Не могу придумать как обойтись без дублирования кода: получается либо ВвестиСтроку нужно два раза написать, либо два раза проверить на пустую строку. Например, вот такая какашка: Если НЕ ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда Возврат; КонецЕсли; Пока ПустаяСтрока(НомерЗаказа) Цикл Предупреждение("Необходимо указать номер!"); Если НЕ ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда Возврат; КонецЕсли; КонецЦикла; |
|||
1
Legj
09.01.13
✎
16:44
|
либо определять первое вхождение в цикл – то же уродство
|
|||
2
Мимо Проходил
09.01.13
✎
16:46
|
А сначала сделать пустой?
И предупреждение после проверки? |
|||
3
Мимо Проходил
09.01.13
✎
16:47
|
+(2) Бесконечный цикл. Прервать по условию, иначе предупреждение
|
|||
4
Fragster
гуру
09.01.13
✎
16:48
|
Пока Не ВвестиСтроку(НомерЗаказа, "Номер накладной") ИЛИ ПустаяСтрока(НомерЗаказа) Цикл; КонецЦикла;
|
|||
5
Fragster
гуру
09.01.13
✎
16:49
|
Пока Не ВвестиСтроку(НомерЗаказа, "Номер накладной") ИЛИ ПустаяСтрока(НомерЗаказа) Цикл; КонецЦикла; Если ПустаяСтрока(НомерЗаказа) Тогда Возврат КонецЕсли;
|
|||
6
Fragster
гуру
09.01.13
✎
16:49
|
вообще фиговая задача
|
|||
7
Fragster
гуру
09.01.13
✎
16:49
|
Пока Не ВвестиСтроку(НомерЗаказа, "Номер накладной") И ПустаяСтрока(НомерЗаказа) Цикл; КонецЦикла; Если ПустаяСтрока(НомерЗаказа) Тогда Возврат КонецЕсли;
|
|||
8
acsent
09.01.13
✎
16:50
|
галка номерзаказа и строка
|
|||
9
pessok
09.01.13
✎
16:50
|
(3) ++
|
|||
10
acsent
09.01.13
✎
16:51
|
(7) а где отказ?
|
|||
11
Tymoha
09.01.13
✎
16:52
|
Пока ПустаяСтрока(НомерЗаказа) Цикл
ВвестиСтроку(НомерЗаказа); КонецЦикла; |
|||
12
КонецЦикла
09.01.13
✎
16:52
|
У чувака некислый стаж
|
|||
13
Fragster
гуру
09.01.13
✎
16:52
|
(10) какой отказ?
|
|||
14
Tymoha
09.01.13
✎
16:54
|
+(11) точнее, учитывая что пользователь может отказаться
Пока ПустаяСтрока(НомерЗаказа) Цикл Если НЕ ВвестиСтроку(НомерЗаказа)Тогда Прервать; КонецЕсли; КонецЦикла; |
|||
15
Tymoha
09.01.13
✎
16:56
|
хотя, задача дурная - да ... что значит пока не введет или пока не откажется?
|
|||
16
Reset
09.01.13
✎
16:57
|
(14)
Пока ПустаяСтрока(НомерЗаказа) И ВвестиСтроку(НомерЗаказа) Цикл КонецЦикла; |
|||
17
Reset
09.01.13
✎
16:58
|
хотя (14) лучше в плане (15) - можно добавить флаг отказал ся или таки что-то ввел
|
|||
18
Нуф-Нуф
09.01.13
✎
16:59
|
копрокодеры детектед
|
|||
19
Reset
09.01.13
✎
17:00
|
(18) Дай покопрокодить в первый рабочий день
|
|||
20
Tymoha
09.01.13
✎
17:01
|
(19) ))))
|
|||
21
Нуф-Нуф
09.01.13
✎
17:01
|
вы еще динамическим обновлением воспользуйтесь
|
|||
22
Legj
09.01.13
✎
17:07
|
(2, 3) Строка и так сначала пустая. Предупреждение после проверки в моем примере кода ничего не меняет.
Бесконечный цикл – да, это идея. Уже лучше получится, но всё-таки не то. |
|||
23
Legj
09.01.13
✎
17:08
|
(10) тонко, очень, оценил.
|
|||
24
Legj
09.01.13
✎
17:12
|
+(23) нет, не то, я подумал это ответ на (0) never mind
|
|||
25
Мимо Проходил
09.01.13
✎
17:16
|
(22) Кроме первого прохода ничего не меняет.
|
|||
26
Legj
09.01.13
✎
17:24
|
Пока вот такой вариант. Существенно элегантней, но не то. Слишком заумный, логически сложный алгоритм получился для такой простой задачи. Без подробного комментария читателю кода будет очень сложно въехать, что имел в виду писатель:
НомерЗаказа = ""; Пока Истина Цикл Если НЕ ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда Возврат; ИначеЕсли ПустаяСтрока(НомерЗаказа) Тогда Предупреждение("Необходимо указать номер!"); Иначе Прервать; КонецЕсли; КонецЦикла; |
|||
27
Reset
09.01.13
✎
17:24
|
(22) В смысле "не то"?
еще версия НомерЗаказа=""; Пока ВвестиСтроку(НомерЗаказа) И ПустаяСтрока(НомерЗаказа) Цикл КонецЦикла; |
|||
28
Legj
09.01.13
✎
17:26
|
(27) А как выглядит решение целиком ? Если начать его додумывать, и пробовать, то окажется, что не так всё просто. Иначе бы я тему не создал.
|
|||
29
Reset
09.01.13
✎
17:27
|
(28) Оно там целиком. Про необходимость вывода предупреждения в (0) не было
|
|||
30
Фокусник
09.01.13
✎
17:33
|
рекурсию уже предлагали? :)
|
|||
31
Legj
09.01.13
✎
17:34
|
(29) Предупреждение не обязательно. Но и без того ваше решение не рабочее. Что будет, если пользователь нажмет "Отмену"? Исполнение кода продолжится дальше, а нужно, чтобы прервалось (Возврат).
|
|||
32
acsent
09.01.13
✎
17:35
|
зачем делать через ввести строку? А если ошибется и нужно поправить?
|
|||
33
Reset
09.01.13
✎
17:36
|
(31) Про это в (0) ни слова!
тех задание в (0): "вводил данные в диалог вввода строки до тех пор, пока не введет что-нибудь либо пока не откажется от ввода" |
|||
34
Волесвет
09.01.13
✎
17:36
|
кхм... в снежке вроде проверка на заполненность поля или нет?))
|
|||
35
Reset
09.01.13
✎
17:36
|
(31) Так что не бросайся "решение не рабочее".
|
|||
36
Reset
09.01.13
✎
17:39
|
Вот еще вброс:
(возможно, тебе "как читателю будеть въехать легче" (lol)) ~ВводимНомер: Пока ВВестиСтроку(НомерЗаказа) цикл; КонецЦикла; Если ПустаяСтрока(НомерЗаказа) goto ~ВводимНомер; КонецЕсли; |
|||
37
Reset
09.01.13
✎
17:40
|
(36) не читать, прогнал :(
вот что значит нет опыта в таком стиле |
|||
38
Reset
09.01.13
✎
17:43
|
(31) Тогда в (14) Замени "прервать" на "возврат"
|
|||
39
Legj
09.01.13
✎
17:59
|
(30) Красиво, да. Но очень академично. В 1с как-то принято рекурсию использовать только тогда, когда это действительно единственное решение (деревья с условно бесконечным уровнем вложенности). Т.к. язык беден, нет вложенных функций. А вынос подобных алгоритмов в полновесную функцию сильно утяжеляет код.
|
|||
40
Мимо Проходил
09.01.13
✎
18:00
|
(39) Вам шашечки? Или ехать?
|
|||
41
Fragster
гуру
09.01.13
✎
18:01
|
(40) если ввести пустую строку ~1500 раз - 1ска молча упадет
|
|||
42
Legj
09.01.13
✎
18:01
|
(33), (38) Да, предупреждение таки подразумевается, что нужно.
|
|||
43
Мимо Проходил
09.01.13
✎
18:03
|
(41) Если шашечки - то, что надо. Красиво. Но не функционально. :))
|
|||
44
Legj
09.01.13
✎
18:03
|
(41) Так вот почему вас больше часа не было в теме.
|
|||
45
Fragster
гуру
09.01.13
✎
18:04
|
(44) нет, я работал
|
|||
46
Reset
09.01.13
✎
18:04
|
(42) Имхо:
По моему, нужно быть сильным идиотом, если видеть перед собой окно с предложением ввода, которое не исчезает, если ничего не вводить и не понимать что от тебя требуют |
|||
47
Legj
09.01.13
✎
18:07
|
(46) Юзабилити такого решения – это другой вопрос. Но если хочется сделать именно с предупреждением, существует ли простой алгоритм, без рекурсии, без бесконечного цикла? Я вот не смог придумать, как голову не ломал, вот и полез на мисту. Возможно, таки не решаемая задача.
|
|||
48
Fragster
гуру
09.01.13
✎
18:08
|
(47) бесконечный процесс не может быть без бесконечного цикла
|
|||
49
Reset
09.01.13
✎
18:11
|
доработал (26):
НомерЗаказа = ""; СчетчикТерпения=1500; Пока Истина Цикл Если Не ВвестиСтроку(НомерЗаказа, "Номер накладной") Тогда Возврат; КонецЕсли; Если Не ПустаяСтрока(НомерЗаказа) Тогда Прервать; КонецЕсли; Предупреждение("Необходимо указать номер!"); СчетчикТерпения=СчетчикТерпения-1; Если СчетчикТерпения=0 тогда Сообщить("Задолбал(а) ты меня"); Возврат; КонецЕсли; КонецЦикла; |
|||
50
Fragster
гуру
09.01.13
✎
18:13
|
(49) почему не "Для" а "пока истина"?
|
|||
51
Reset
09.01.13
✎
18:13
|
(50) Не сообразил.
см (19) |
|||
52
Legj
09.01.13
✎
18:13
|
(35) И не кипятитесь вы так. Я резковато оценил ваш код не намерено.
|
|||
53
Reset
09.01.13
✎
18:15
|
(52) я не кипятюсь. Я пытаюсь, как могу, развлекаться.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |