Циклы в 1с

цикл для каждого в обратном порядке

Я
   osuul

 

01.04.11 — 00:34

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

вот сам цикл; для Каждого Строка из ТабличноеПоле1.Строки цикл Если строка.Дата < НачалоГода(текущаяДата()) тогда ИндексСтроки = ТабличноеПоле1.Строки.индекс(строка); ТабличноеПоле1.Строки.Удалить(ИндексСтроки); КонецЕсли; КонецЦикла; так пропускает.. (

 
 

   Птица

 

1 — 01.04.11 — 00:37

Для сч = -количествострок+1по0цикл индексстроки = — сч //и далее по тексту конеццикла
   Armando

 

2 — 01.04.11 — 00:40

Или так МассивСтрокДляУдаления = Новый Массив; для Каждого Строка из ТабличноеПоле1.Строки цикл Если строка.Дата < НачалоГода(текущаяДата()) тогда МассивСтрокДляУдаления.Добавить(Строка); КонецЕсли; КонецЦикла; Для Каждого СтрокаДляУдаления Из МассивСтрокДляУдаления Цикл ТабличноеПоле1.Строки.Удалить(СтрокаДляУдаления); КонецЦикла;
   osuul

 

3 — 01.04.11 — 00:43

(1) (2) спасибо огромное!!! оба способа работают, 1-перебором в обратном порядке, второй выгрузкой в массив! я правильно понял?

   osuul

 

4 — 01.04.11 — 00:55

а можно еще вопрос, объясните пожалуйста, что за «СтрокаДляУдаления», я не понимаю откуда берется эта переменная..
Для Каждого СтрокаДляУдаления Из МассивСтрокДляУдаления Цикл ТабличноеПоле1.Строки.Удалить(СтрокаДляУдаления); КонецЦикла;
   Armando

 

5 — 01.04.11 — 00:59

(4) элемент массива

   zak555

 

6 — 01.04.11 — 01:03

(2) зачем два прохода ?

   osuul

 

7 — 01.04.11 — 01:11

(5) получаеться «СтрокаДляУдаления» будет работать в любом массиве? а почему ее нет в СП?

   zak555

 

8 — 01.04.11 — 01:14

(7) это переменная (!)

   zak555

 

9 — 01.04.11 — 01:23

v8: Как удалить элемент при обходе для каждого
v8: v8: Платформа 8.2: Подскажите как удалить строку из табличной части?

   osuul

 

10 — 01.04.11 — 01:54

(9) спасибо

 
 

   НП

 

11 — 01.04.11 — 02:22

i=Табл.Количество();while i>0 do
i=i-1;
enddo
   НП

 

12 — 01.04.11 — 02:25

i=Табл.Количество();while i>0 do
if (Условие удаления) then Табл[i-1].Удалить(); endif; i=i-1;enddo

 

Автоматизируйте рутинные операции с базами 1С через пакетный режим конфигуратора.

ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.

Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.

Рекурсия

 

Рекурсия представляет собой процесс определения чего-то с помощью самого себя. В приложении к программированию рекурсия — это процесс вызова функцией самой себя. Функцию, которая вызывает саму себя, называют рекурсивной.

Классическим примером рекурсии может служить функция factr(), которая вычисляет факториал целого числа. Факториалом числа N называют произведение всех целых чисел между 1 и N.. Например, факториал числа 3 (или, как говорят, "три факториал") вычисляется как 1x2x3, что равно 6. Ниже приведены как функция factr(), так и ее итеративный эквивалент.

 

// demoRecurcia.cpp : Defines the entry point for the console application.

//

// Демонстрация рекурсии.

 

#include "stdafx.h"

#include <conio.h>

#include <iostream>

using namespace std;

 

int factr(int n);

int fact(int n);

 

int main ()

{

// используем рекурсивный вариант

cout << "4 factorial equal " << factr(4) ;

cout << ‘\n’;

 

// используем итеративный вариант

cout << "4 factorial equal " << fact(4);

cout << ‘\n’ ;

 

getch();

return 0;

}

// Рекурсивный вариант.

int factr(int n)

{

int answer;

if(n==1) return(1);

answer = factr (n-1) *n;//Выполнить рекурсивный вызов factr()

return(answer) ;

}

// Итеративный вариант.

int fact(int n)

{

int answer;

answer = 1 ;

for(int t=1; t<=n; t++) answer = answer*(t);

return(answer);

}

 

 

Действие нерекурсивного варианта fact() вполне очевидно.

Он использует цикл, начинающийся с 1, в котором каждое следующее число умножается на последовательно увеличивающееся пpоизведение.

Действие рекурсивной функции factr( ) несколько сложнее. При вызове factr( ) с аргументом 1 функция возвращает 1; в противном случае она возвращает произведение factr(n-l)*n. Для вычисления этого выражения factr( ) вызывается с аргументом (n-1). Это происходит до тех пор, пока n не станет равным 1, и вызов функции приведет к возврату из нее. Например, когда вычисляется факториал 2, первый вызов factr( ) породит второй вызов с аргументом 1. Этот вызов вернет 1, которая умножится на 2 (первоначальное значение n). Переменная answer будет тогда равна 2. Вы можете ради любопытства включить в factr( ) предложения cout, которые покажут, на каком уровне находится вызов и каков промежуточный результат (переменная answer).

Когда функция вызывает саму себя, для новых локальных переменных и параметров выделяется память (обычно на системном стеке), и код функции выполняется с самого начала с использованием этих новых переменных. Рекурсивный вызов не создает новой копии функции; только ее аргументы будут новыми. При возврате из каждого рекурсивного вызова старые локальные переменные и параметры удаляются из стека, и выполнение продолжается с точки вызова функции изнутри функции. Можно сказать, что рекурсивные функции действуют подобно раздвижной подзорной трубе, сначала раскладываясь, а затем складываясь.

Имейте в виду, что большинство рекурсивных функций не уменьшают размер кода в заметной степени. Кроме того, рекурсивные варианты большинства алгоритмов выполняются несколько более медленно, чем их итеративные эквиваленты, из-за добавления издержек на дополнительные функциональные вызовы. Слишком много рекурсивных обращений к функции может вызвать переполнение стека. Из-за того, что параметры и локальные переменные функции размещаются на стеке, и каждый новый вызов создает новую копию этих переменных, стек может истощиться. Если это произойдет, то могут быть разрушены другие данные. Реально, однако, вряд ли вам придется столкнуться с такой ситуацией, если только рекурсивная функция не зациклится.

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

Составляя рекурсивную функцию, вы должны где-то в ней включить условное предложение, например, if, чтобы заставить функцию осуществить возврат без выполнения рекурсивного вызова. Если вы пренебрежете таким условным предложением, то вызвав однажды эту функцию, вы никогда из нее не вернетесь. Это, довольно распространенная ошибка. Разрабатывая программы с рекурсивными функциями, не стесняйтесь включать в них предложения cout, которые позволят вам наблюдать, что происходит в программе, и аварийно завершить выполнение, если вы обнаруживаете ошибку.

Ниже приведен другой пример рекурсивной функции, названной reverse(). Она выводит на экран строку задом наперед.

 

// demoRecurcia2.cpp : Defines the entry point for the console application.

//

// Вывод строки задом наперед посредством рекурсии.

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

 

void reverse(char *s);

 

int main()

{

char str[] = "this is a test";

reverse (str) ;

 

getch();

return 0;

}

// Вывод строки задом наперед,

void reverse(char *s)

{

if(*s) reverse(s+1);

else return;

 

cout << *s;

}

 

Результат программы:

 

 

 

Функция reverse() прежде всего проверяет, не передан ли ей указатель на завершающий ноль строки. Если нет, то reverse( ) вызывает себя с передачей в качестве аргумента указателя на следующий символ строки. Когда наконец будет найден завершающий ноль, вызовы начинают "раскручиваться", и символы появляются на экране в обратном порядке.

Еще одно замечание. Понятие рекурсии часто оказывается сложным для начинающих. Не отчаивайтесь, если этот материал показался вам слишком запутанным. С течением времени вы освоите и его.

 

 

Контрольные вопросы

1. Что такое функция? Как она объявляется?

2. Какой результат может возвращать функция?

3. Как функции передаются аргументы? Что такое передача аргумента по значению и по ссылке?

Чем эти способы отличаются и как реа­лизуются?

4. Каким образом функции в качестве значения передаются указатели?

5. Каким образом функции в качестве аргумента передаются массивы?

6. Что такое рекурсия, и в каких случаях она используется?

7. Что такое перегрузка функции? В каких случаях применяется пере­грузка?

8.

Что такое шаблоны функции? В каких случаях применяется шаблон функции?

9. Дан фрагмент программы:

 

int f(char &с, int *i);

// …

char ch = ‘x’ ;

int i = 10;

 

Покажите, как вызвать f() для операций над переменными ch и i.

10. Создайте void-функцию с именем round(), которая округляет значение своего аргумента типа double до ближайшего целого значения. Пусть round() использует параметр-ссылку и возвращает округленный результат через этот параметр. Продемонстрируйте вызов round() в программе. Для решения этой задачи вам понадобится функция modf() из стандартной библиотеки. Она имеет такой прототип:

 

double modf(double num, double *i);

 

Функция modf() разлагает num на целую и дробную части.

Она воз­вращает дробную часть и помещает целую часть в переменную, на которую указывает i. Функция требует заголовок <cmath>.

 


Date: 2015-11-15; view: 66; Нарушение авторских прав

Понравилась страница? Лайкни для друзей:

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

Для этого в 1С существует оператор «Перейти» .

Вот пример кода с его использованием:

Опишем вышеизложенные действия, допустим нам необходимо найти документ в котором в табличной части есть какой то конкретный товар, в данном случае будет иметь место цикл внутри цикла. Когда мы начнем перебирать строки и наткнемся на нужный нам товар мы должны прекратить дальнейший перебор строк и документов. Оператор «Прервать» завершщает только один из циклов, второй продолжит свою работу, поэтому здесь такой оператор нам не поможет. Выход: воспльзоваться оператором «Переход» указать имя метки и дальнейши код начать с опять таки метки. Возможно немного не понятно описал, но главное что это работает. Количество таких переходов и меток программно не ограничено, правда их использование иногда усложняет читаемость кода программы…

Удачного программирования.

Док=СоздатьОбъект(«Документ»);
ПокаДок.ПолучитьДокумент()=1Цикл
    Док.ВыбратьСтроки();
    ПокаДок.ПолучитьСтроку()=1Цикл
        ЕслиДок.Товар.Наименование=»Нужный нам товар»Тогда
            Перейти~а;//метка
        КонецЕсли;
    КонецЦикла;
Сообщить(«Мы нашли нужный нам документ»);
//Какието дальнейшие действия по программе

1С программирование

Добавить комментарий

Закрыть меню