С Новым годом! Форум программистов, компьютерный форум, киберфорум
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/46: Рейтинг темы: голосов - 46, средняя оценка - 4.54
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
1

Как Насипов узнал, что в цикле максимальное значение счетчика цикла пересчитывается на каждой итерации?

04.09.2013, 21:05. Показов 8442. Ответов 84
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Курс ведет Гилев, но они вместе с Насиповым сейчас делают этот курс. Не суть.

В общем, процитирую близко к тексту.

1C
1
2
3
Для Индекс = 0 по Массив.Количество() - 1 Цикл
    А = Массив[Индекс];
КонецЦикла;
Т.к. 1С пересчитывает Массив.Количество() - 1 на каждой итерации, то оптимизировать можно так:

1C
1
2
3
4
Колво = Массив.Количество() - 1;
Для Индекс = 0 по КолвоЦикл
    А = Массив[Индекс];
КонецЦикла;
Я согласен, конечно, здесь. Я учил питон и знаю, что теоретически верхняя планка цикла может меняться, т.е. она пересчитывается. Другое дело, что дергать ее нельзя, иначе глюк поймаешь. Но она пересчитывается.

Так вот, я смотрю в доку, и не вижу этого там.

Так откуда он узнал-то? Методом тыка? Я помню, ошибался так с отбором из одного массива в другой на питоне. Дескать, если ты выдернул из массива, он же уменьшился - ай-яй-яй. А ты, дескать, сначала скопируй все нужное в другой массив, а потом примени метод - у тебя из двух массивов останется разница и т.п.

Но я работаю с документацией 1С, привыкаю к ней и хочу видеть, где написано, что верхняя граница цикла двигается.
4
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Блог
04.09.2013, 21:05
Ответы с готовыми решениями:

Как вернуть значение i из метода после каждой итерации в цикле
Всем привет. Давно не задавал умных вопросов // Тут без комментариев Но...

Как в цикле for (не выходя из цикла) перейти к следующей итерации?
как в цикле for не выходя их цикла, перейти ко следующей итерации, пропустив данную по...

Как проверять, нажата ли клавиша Esc, в каждой итерации цикла, и если нажата, то прервать выполнение цикла?
OwenGlendower, это обращение прежде всего к вам. Вызов функции, в которой происходит проверка...

Переменная, которая только что использовалась в цикле в качестве счётчика в следующем цикле не используется
Помогите, пожалуйста. Вот отрывок программы (программа целиком- в архиве): procedure...

84
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.09.2013, 21:31 2
Это видно на глаз. Просто нужно врубаться как работают циклы вообще.
Если в документации не написано, то, наверное, авторы документации посчитали, что это настолько очевидно, что не заслуживает внимания.

Если не полностью понимать механизм циклов, этого не видно.
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
04.09.2013, 21:33  [ТС] 3
Я не уверен, что я полностью его понимаю. Вот, например, для чего нужно двигать верхнюю границу значения итератора цикла?
Т.е. зачем такая возможность дана разработчику?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.09.2013, 21:45 4
дел
0
20 / 20 / 0
Регистрация: 29.08.2013
Сообщений: 57
04.09.2013, 21:48 5
Да и не двигается верхняя граница вроде. Проверить легко:
1C
1
2
3
4
5
6
7
8
9
    Массив = Новый Массив(5);
    Для Индекс = 0 по Массив.Количество() - 1 Цикл
        А = Массив[Индекс];
        Если Индекс = 2 Тогда
        
            Массив.Удалить(Индекс);  //удалим третий элемент массива, пущай пересчитывает
        
        КонецЕсли; 
    КонецЦикла;
и... вываливается с ошибкой.

Если сделать по другому:
1C
1
2
3
4
5
6
7
8
9
10
11
12
    Индекс = 0;
    Для каждого ЭлМас Из Массив Цикл
        
         А = Массив[Индекс];
         
         Если Индекс = 2 Тогда
              Массив.Удалить(Индекс);
         КонецЕсли; 
         
         Индекс = Индекс +1;
    
    КонецЦикла;
, то не вываливается
Но и тут тоже похоже ничего пересчитывается, просто при следующем сдвиге индекса система проверяет на наличие элемента в коллекции и если он есть исполняет тело цикла.
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
04.09.2013, 21:48  [ТС] 6
Он не двигает верхнюю границу. Я просто говорю, что ее можно двигать. Т.е. я сталкивался в своей жизни с таким. И знаю, что выражение вычисляется на каждой итерации. Это просто пример.

Зачем это сделано - я не знаю.
0
daslex
04.09.2013, 21:58
  #7

Не по теме:

тоже дел

0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
04.09.2013, 22:04  [ТС] 8
Цитата Сообщение от Kubus Посмотреть сообщение
Да и не двигается верхняя граница вроде. Проверить легко:
Граница двигается прекрасно. Попробовал. И добавить элементы, и удалить.
Вы запутались в индексах.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.09.2013, 22:14 9
Kubus, что за кривое удаление. Удалять надо с конца, а не сначала.
В любом случае в 1С удобный отладчик и если есть сомнения в чем-то, то отладчиком наглядно видно что происходит. Во встроенной справке, (может и в документации) часто встречаются неправильные тексты.

Добавлено через 9 минут
Цитата Сообщение от Kifsif Посмотреть сообщение
В общем, процитирую близко к тексту.
Код 1C
1
2
3
Для Индекс = 0 по Массив.Количество() - 1 Цикл
* * А = Массив[Индекс];
КонецЦикла;
Т.к. 1С пересчитывает Массив.Количество() - 1 на каждой итерации, то оптимизировать можно так:
Код 1C
1
2
3
4
Колво = Массив.Количество() - 1;
Для Индекс = 0 по КолвоЦикл
* * А = Массив[Индекс];
КонецЦикла;
Я согласен, конечно, здесь. Я учил питон и знаю, что теоретически верхняя планка цикла может меняться, т.е. она пересчитывается. Другое дело, что дергать ее нельзя, иначе глюк поймаешь. Но она пересчитывается.
Дело не в том, что верхняя планка может меняться, а в том, что, Массив.Количество() - это метод. Этот метод проходит по всему массиву, чтобы учесть каждый его элемент. Будет массив в 100.000.000 элементов, то каждый раз раз на итерации будет вызываться этот метод, а при вызове метода будет притормаживать. Чтобы не выполнять этот метод на каждой итерации приведен пример взятия результата из метода, сохранение его в переменную и использование этой переменной, а не метода как конечного значения.
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
04.09.2013, 22:26  [ТС] 10
Цитата Сообщение от daslex Посмотреть сообщение
KubusДело не в том, что верхняя планка может меняться
Дело как раз в этом. Метод тут с боку припеку получился. Вопрос был - где документировано, что верхняя граница счетчика движется.

Может, этот смысл скрыт в слове Выражение? Ну, там, выражение 1, выражение 2.
0
20 / 20 / 0
Регистрация: 29.08.2013
Сообщений: 57
04.09.2013, 22:28 11
Цитата Сообщение от daslex Посмотреть сообщение
Kubus, что за кривое удаление. Удалять надо с конца, а не сначала.
В данном случае неважно с какого конца удаляем. Я о том что при каждой итерации максимальное значение цикла не пересчитывается. Ладно, не нравится с удалением, тогда так:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Процедура ПроверкаМассива(Команда)
    Массив = Новый Массив(5);
    Для Индекс = 0 по Пересчет(Массив) Цикл
        А = Массив[Индекс];
    КонецЦикла;
 
КонецПроцедуры
 
 
Функция Пересчет(Массив)
 
    Возврат (Массив.Количество() - 1);
 
КонецФункции
Вход в функцию Пересчет() происходит один раз.
Переубедите...
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
04.09.2013, 22:30  [ТС] 12
Я на двух компах сижу. На одном у меня 1С, а на другом - интернет. Не могу я вам кинуть код.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.09.2013, 23:01 13
Цитата Сообщение от Kifsif Посмотреть сообщение
где документировано, что верхняя граница счетчика движется.
в примере ТС из вопроса граница не движется.
Курс ведет Гилев, но они вместе с Насиповым сейчас делают этот курс. Не суть.
В общем, процитирую близко к тексту.
Цитата Сообщение от Kifsif Посмотреть сообщение
Т.к. 1С пересчитывает Массив.Количество() - 1 на каждой итерации, то оптимизировать можно так:
речи про то,
Цитата Сообщение от Kifsif Посмотреть сообщение
что теоретически верхняя планка цикла может меняться
нет.

Добавлено через 4 минуты
Исходный вопрос:
Цитата Сообщение от Kifsif Посмотреть сообщение
Как Насипов узнал, что в цикле максимальное значение счетчика цикла пересчитывается на каждой итерации?
не является тем вопросом, по которому пошло обсуждение.
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
04.09.2013, 23:04  [ТС] 14
Граница может двигаться, что тут обсуждать.
Если ветка об этом, то я пас.
Вопрос был в том - где документировано, что она движется.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.09.2013, 23:05 15
Слова:
максимальное значение счетчика цикла пересчитывается на каждой итерации?
Обозначают только то, что на каждой итерации цикла выполняется метод (если удобно, то функция), которая выполняет подсчет элементов. К функциям можно прибавлять, убавлять, значения, их можно делить, умножать и изымаваться над ними как душе угодно. Чтобы ее не выполнять каждый раз на каждой итерации... я уже сказал.
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
04.09.2013, 23:09  [ТС] 16
Это понятно. Вы мне скажите, что означает слово "Выражение" в синтакс-помощнике для цикла.
Если Выражение означает - вычисляемое выражение, то это ответ на вопрос.
Но я бы хотел прочитать это в документации.
0
20 / 20 / 0
Регистрация: 29.08.2013
Сообщений: 57
04.09.2013, 23:20 17
Цитата Сообщение от daslex Посмотреть сообщение
Обозначают только то, что на каждой итерации цикла выполняется метод
Сам по себе метод не вызывается, что тогда его вызывает на каждом шаге цикла, откуда такая уверенность? Я вот утверждаю (возможно ошибочно) что нет никакого вызова метода подсчета элементов, кроме как при первом определении верхней границы счетчика. Следовательно в конкретном примере Евгений Гилёв неправ и второй вариант цикла не оптимальней первого.
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,245
04.09.2013, 23:22  [ТС] 18
Верь Гилеву.
0
20 / 20 / 0
Регистрация: 29.08.2013
Сообщений: 57
04.09.2013, 23:25 19
А как же быть с забросом камней в стоячее болото?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
04.09.2013, 23:43 20
Для <Имяпеременной> = <Выражение 1> По <Выражение 2>
В цикле под выражением понимается не вычисляемое значение как таковое.

По-русски это звучит так: "Выразить нечто как что-то".
Выразить переменную Счетчик как 1 (Для Счетчик = 1)
Выразить переменную как результат функции (По Счетчик=Массив.Количество())
Выразить переменную как переменную (По счетчик = счетчик2)
Выразить переменную как какое-то определенное значение (По счетчик = 100);
и т.п.

Добавлено через 7 минут
Цитата Сообщение от Kubus Посмотреть сообщение
Сам по себе метод не вызывается, что тогда его вызывает на каждом шаге цикла, откуда такая уверенность?
оттуда, что проверка идет на результат работы функции. Вы же результат никуда не сохраняете, откуда циклу его брать. Чтобы взять, надо снова выполнить функцию. А циклу в обязательном порядке нужно знать конечное значение.

он и не вызывается. Вы его вызываете, причем на каждую итерацию цикла.
0
04.09.2013, 23:43
cpp_developer
Эксперт
20123 / 5690 / 417
Регистрация: 09.04.2010
Сообщений: 12,546
Блог
04.09.2013, 23:43
Помогаю со студенческими работами здесь

Как вывести значение функции на каждой итерации?
помогите...как вывести значение функции на каждой итерации?..число итераций выводит, а таблицу со...

Вывод значения на каждой итерации цикла
Есть код: $url = htmlspecialchars($_POST); $result = mysql_query('SELECT column_name FROM...

AJAX вывод на каждой итерации цикла
Есть такой вот код: &lt;?php include('config.php'); $query = mysql_query(&quot;SELECT title FROM...

Поиск среднего арифметического на каждой итерации цикла
Задача состоит в том, чтобы находить среднее арифметическое значение на каждом шаге цикла....

Вывод результата при каждой итерации цикла
Получилось так, но возможно ли сделать через for? /*#include &lt;iostream&gt; using namespace std; ...

Будет ли происходить обращение к БД на каждой итерации цикла
foreach (var fa in Get()) { } Вот сам по себе цикл, где Get() - медот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru