Cum se configurează smartphone-uri și PC-uri. Portal informativ

Pentru fiecare ordine inversă 1s. Bucle folosind expresia booleană

Descriere:

Operatorul de ciclu For este destinat repetarii ciclice a operatorilor situati in interiorul constructiei Cycle - EndCycle.

Înainte de începerea buclei, valoarea expresiei 1 este atribuită variabilei VariableName . Valoarea VariableName este incrementată automat la fiecare iterație a buclei. Valoarea de creștere a contorului de fiecare dată când bucla este executată este 1.

Bucla este executată atâta timp cât valoarea variabilei VariableName este mai mică sau egală cu valoarea Expression 2 . Condiția de execuție a buclei este întotdeauna verificată la început, înainte ca bucla să fie executată.

Sintaxă:

Parametri:

Nume_variabilă Identificator al variabilei (contor de bucle) a cărei valoare este incrementată automat cu 1 de fiecare dată când bucla se repetă. Așa-numitul numărător de cicluri.Expresia 1 Expresie numerică care specifică valoarea inițială atribuită contorului de bucle la prima iterație a buclei.Prin Legătura de sintaxă pentru parametrul Expresia 2.Expresia 2 Valoarea maximă a contorului buclei. Când variabila VariableName devine mai mare decât expresia 2, execuția instrucțiunii For loop se oprește.Loop Instrucțiunile care urmează cuvântului cheie Loop sunt executate atâta timp cât valoarea variabilei VariableName este mai mică sau egală cu valoarea Expression 2 .

Ciclu pentru toată lumea

Descriere:

Instrucțiunea For each loop este pentru trecerea în buclă prin colecții de valori. Fiecare iterație a buclei returnează un nou element al colecției. Parcurgerea continuă până când toate elementele colecției au fost iterate.

Sintaxă:

Parametri:

Nume_variabilă_1 Variabila căreia i se atribuie valoarea următorului element al colecției de fiecare dată când se repetă bucla.Din linkul Sintaxă pentru parametrul variable_name_2.variable_name_2 Variabila sau expresia care reprezintă colecția. Elementele acestei colecții vor fi alocate parametrului variable_name_1.Loop Instrucțiunile care urmează cuvântului cheie Loop sunt executate pentru fiecare element al colecției.// Declarații O instrucțiune de executat sau o secvență de astfel de instrucțiuni.Abort Vă permite să anulați bucla în orice moment. După executarea acestei instrucțiuni, controlul este transferat instrucțiunii care urmează cuvântului cheie End of Loop.Continuare Transferă imediat controlul la începutul buclei, unde sunt evaluate și verificate condițiile de execuție a buclei. Declarațiile care îl urmează în corpul buclei nu sunt executate la această iterație a traversării.EndLoop Un cuvânt cheie care încheie structura unei instrucțiuni bucle.

La revedere

Descriere:

Instrucțiunea în buclă while este destinată repetarea ciclică a instrucțiunilor care se află în interiorul structurii Buclă - Bucle de sfârșit. Bucla este executată în timp ce expresia logică este Adevărat. Condiția de execuție a buclei este întotdeauna verificată mai întâi, înainte ca bucla să fie executată.

Sintaxă:

Parametri:

expresie booleană Expresie booleană.Loop Instrucțiunile care urmează cuvântului cheie Loop sunt executate atâta timp cât rezultatul expresiei logice este Adevărat. // Declarații O instrucțiune de executat sau o secvență de astfel de instrucțiuni.Abort Vă permite să anulați bucla în orice moment. După executarea acestei instrucțiuni, controlul este transferat instrucțiunii care urmează cuvântului cheie End of Loop.Continuare Transferă imediat controlul la începutul buclei, unde sunt evaluate și verificate condițiile de execuție a buclei. Declarațiile care îl urmează în corpul buclei nu sunt executate la această iterație a traversării.EndLoop Un cuvânt cheie care încheie structura unei instrucțiuni bucle.
12 decembrie 2014 la 13:13

Care ciclu este mai rapid? Testarea 1C

  • Performanta ridicata ,
  • programare anormală,
  • Programare

Programez 1C de câțiva ani, apoi a venit gândul - „De ce să nu urmezi un fel de curs de formare, deodată apar niște lacune în cunoștințe pe care nici nu le bănuiam înainte”? Făcut repede și foarte bine. Stau, ascult cursul, ajung la operatorii ciclici și apoi al doilea gând (da, nu îmi apar des) - "Care ciclu este mai rapid?" Ar trebui să verificăm.
Așa că am găsit cinci moduri cum puteți organiza ciclul folosind 1C.

Primul tip de ciclu, să-l numim condiționat "ForPo" arata asa:

Pentru n = 0 după numărul de iterații Bucla SomeAction(); EndCycle;
A doua vedere "Pentru fiecare":

Pentru fiecare elementColecție din colecție, buclă SomeAction(); EndCycle;
Al treilea "Pa":

la revedere n<>NumberIterations Loop SomeAction(); n = n + 1; EndCycle;
Apoi mi-am amintit de tineretul asamblator - ciclul "Dacă":

~LoopStart: Dacă n<>NumberIterations Apoi SomeAction(); n = n + 1; Jump ~StartCycle; EndIf;
Și, în sfârșit "Recursie"

Procedură RecursiveLoop(n, Number ofIterations) SomeAction(); Dacă n<>Numărul de iterații, apoi bucla recursiva (n+1, numărul de iterații); EndIf; EndProcedure
Desigur, nu este în întregime corect să atribui recursiunea ciclurilor, dar cu toate acestea, cu ajutorul acestuia, puteți obține rezultate similare. Voi face imediat o rezervare că recursiunea nu a participat la teste ulterioare. În primul rând, toate testele au fost efectuate la 1.000.000 de iterații, iar recursiunea scade deja la 2.000. În al doilea rând, viteza recursiunii este de zece ori mai mică decât viteza altor bucle.

Ultima retragere. Una dintre condiții a fost executarea oricăror acțiuni din ciclu. În primul rând, bucla goală este rar folosită. În al doilea rând, bucla „For Each” este utilizată pentru o colecție, ceea ce înseamnă că restul buclelor trebuie să funcționeze cu colecția, astfel încât testarea să aibă loc în aceleași condiții.

Ei bine, atunci hai să mergem. Corpul buclei a fost citit dintr-o matrice pre-populată.


sau, atunci când utilizați o buclă „ForEach”.

TestValue Receiver = elem;
Testarea a fost efectuată pe platforma 8.3.5.1231 pentru trei tipuri de interfață (Aplicație obișnuită, Aplicație gestionată și Taxi).
Numerele sunt timpul în milisecunde obținut cu ajutorul funcției CurrentUniversalDateInMilliseconds(), pe care l-am sunat înainte de buclă și după ce s-a terminat. Numerele sunt fracționale pentru că am folosit media aritmetică a cinci măsurători. De ce nu am folosit Benchmarking? Nu am avut scopul de a măsura viteza fiecărei linii de cod, ci doar viteza ciclurilor cu același rezultat al muncii.

S-ar părea că asta e tot, dar - pentru a testa așa testați!
Rezultat pentru platforma 8.2.19.106
În medie, platforma 8.2 este cu 25% mai rapidă decât 8.3. Nu mă așteptam puțin la o asemenea diferență și am decis să o testez pe o altă mașină. Nu voi da rezultatele, le puteți genera singur folosind această configurație. Pot spune doar că acolo 8.2 a fost cu 20 la sută mai rapid.

De ce? Nu știu, dezasamblarea nucleului nu făcea parte din planurile mele, dar m-am uitat în continuare la măsurarea performanței. S-a dovedit că operațiunile ciclice în sine în 8.3 sunt ceva mai rapide decât în ​​8.2. Dar pe linie
TestValue Receiver = TestArray.Get(n);
adică, atunci când citiți un articol de colecție într-o variabilă, există o performanță semnificativă.

În cele din urmă:
De ce toate astea? Pentru mine, am tras câteva concluzii:

1. Dacă este posibil să utilizați o buclă specializată - „Pentru fiecare”, atunci este mai bine să o utilizați. Apropo, de la sine funcționează mai mult decât alte bucle, dar viteza de acces la un element de colecție este mult mai mare.
2. Dacă știți în avans numărul de iterații - utilizați „Pentru”. „La revedere” va funcționa mai lent.
3. Dacă utilizați bucla „If”, alți programatori evident nu vă vor înțelege.

Atenţie! La sfârșitul articolului este un link către un tutorial video.
Dacă nu ați mai întâlnit programare înainte, atunci necesitatea de a utiliza un ciclu într-un program 1C probabil nu este complet clară. În acest articol, voi vorbi despre instrucțiunile buclei, precum și despre scopul lor principal.

Dar mai întâi, pentru claritate, câteva explicații despre expresiile folosite în articol:
Repetare este o repetare.
Paranteze operator sunt cuvinte rezervate, care se scriu întotdeauna în perechi, un operator de deschidere și un operator de închidere. De exemplu: Function - EndFunction, If - EndIf, For - EndCycle etc.
Corpul buclei- codul programului situat în interiorul parantezelor operatorului buclei.
Ciclu este o construcție care repetă execuția liniilor situate în corpul buclei, numărul de repetări depinde de rezultatul condițiilor de la începutul buclei.

Dacă acest operator nu ar exista, atunci codul din interiorul buclei ar trebui scris de câte ori avem nevoie de iterații. Imaginați-vă dacă există 100 de linii într-un document și trebuie să le sortați și, să zicem, să schimbați valoarea și dacă, în același timp, numărul lor se schimbă periodic, de exemplu. se adauga si se elimina. Nu ar fi ușor.
Bucla vă permite să simplificați sarcina de a executa linii repetate de cod.
În programul 1C 8.1, există trei construcții de buclă:
„For.. To.. Loop” - repetă numărul de bucle de la valoarea inițială a contorului până la valoarea finală specificată, adăugând 1 la variabila contor la fiecare iterație. Folosit atunci când este cunoscut numărul de iterații.

Ciclul 1C Pentru

Pentru Counter = 1 By 3 Loop // Loop body End Loop;

Ciclul 1C Pa

„While... Loop” - este executat în timp ce valoarea calculată este True. Poate fi folosit în cazurile în care variabilele pentru calcularea expresiei sunt modificate în corpul buclei, sau dacă colecția este iterată și are o metodă corespunzătoare care returnează un boolean, care este apelat la începutul buclei.

While Selection.Next() Loop //Body of Loop EndCycle;

Ciclul 1C Pentru fiecare

„For Each...From...Loop” parcurge colecția de la primul până la ultimul element. Scrierea într-o variabilă (în exemplu: CurrentElement ) a valorii elementului.

Pentru fiecare element curent din bucla ArrayElements // buclă de sfârșit de corp;

Ciclul invers 1C

Există, de asemenea, o buclă inversă care poate fi folosită pentru a parcurge colecțiile în ordine inversă, de ex. de jos în sus (de la capăt). Această metodă poate fi necesară dacă trebuie să ștergeți elemente ale colecției

Number of Items = Matrice de articole Cantitate(); Pentru ReverseIndex = 1 După numărul de articole Loop CurrentItem = Matrice de articole[Numărul de articole - ReverseIndex]; EndCycle;

Operatorii de continuare și de anulare sunt tratați în videoclip, linkul de mai jos.

Algoritmii multor programe implică adesea repetarea ciclică a anumitor acțiuni. 1C în acest caz nu face excepție. Ciclurile în 1C vă permit să:

  • Iterați peste elementele directorului;
  • Completați zonele de aspect;
  • Efectuați anumite acțiuni cu o selecție de documente;
  • Si multe altele.

Tipuri de bucle

În 1C, se obișnuiește să se distingă trei tipuri de cicluri în funcție de setul de cuvinte incluse în construcție:

  1. Pentru fiecare „Variabilă” din „Colectare de valori”;
  2. Pentru „Variable” = „Începe. valoarea „Conform” Kon. Sens";
  3. În timp ce „Expresie”.

Să le luăm în considerare mai detaliat.

Pentru fiecare dintre

Acest crawler este potrivit pentru colecții de valori (selectare documente sau articole de referință, stoc). Execuția va continua până când ultimul element al colecției a fost parcurs. Linia trebuie să conțină:

  • O variabilă care specifică elementul curent al colecției;
  • Definirea unei colecții de valori.

Cea mai frecventă eroare în acest caz este prezentată în Fig. 1

Cel mai adesea, apare atunci când un programator nu înțelege pe deplin diferența dintre un obiect (document, director) și o colecție (selectare) de valori obținute folosind operatorul Select().

Pentru până la

În acest caz, parametrii trecuți șirului sunt:

  1. Numele variabilei este un iterator;
  2. Valoarea inițială a variabilei;
  3. Valoarea finală a variabilei.

Repetarea blocului de instrucțiuni incluse în corpul buclei va fi efectuată până când variabila egalează sau depășește pentru prima dată valoarea finală. În acest caz, iteratorul va crește cu 1 la fiecare pas. Valorile sunt comparate înainte de a fi efectuat următorul pas.

Această construcție este foarte des folosită la ocolirea părților tabulare.

Când utilizați acest crawler, este important să faceți distincția între numărul de rânduri din secțiunea tabelară și indexul unui singur rând luat. În primul caz, valoarea inițială va fi egală cu 1, valoarea finală putând fi obținută folosind operatorul Cantitate (). Indicii încep de la 0 și se termină la Count()-1. În caz contrar, puteți obține o eroare (Fig.2).

Pa

Există un singur parametru aici - o expresie logică, care este verificată pentru adevăr înainte de fiecare pas următor al buclei. De îndată ce expresia booleană eșuează, handlerul va finaliza traversarea.

Este foarte important de înțeles că în unele cazuri expresia testată poate fi întotdeauna Adevărata, astfel traversarea va fi efectuată de un număr infinit de ori, suspendând sistemul.

În astfel de cazuri, este necesar să se înregistreze una dintre cele două opțiuni pentru întreruperea execuției în interiorul corpului buclei.

Uneori poate apărea o situație când adevărul expresiei verificate nu va veni niciodată. Acest lucru poate duce la căutări inutile pentru erori în cod și pierderi de timp.

Întrerupeți execuția prin apăsarea unei combinații de taste

Dacă scrieți procedura UserInterrupt Handling() în corpul buclei, atunci în orice moment în timpul executării acesteia, apăsând combinația de taste Ctrl + PauseBreak, puteți opri funcționarea acesteia. În acest caz, o linie va fi afișată în fereastra de mesaje (Fig. 3).

Pentru a evita consecințele neplăcute ale activităților lor, este extrem de util ca programatorii să se obișnuiască să înregistreze această procedură în corpul de procesare.

Întreruperea condiționată

Destul de des, algoritmul programului implică oprirea procesării ciclice dacă este îndeplinită o anumită condiție. Puteți pune această procedură în corpul buclei folosind instrucțiunea Break.

Scrisă corect în codul programului, această declarație este evidențiată cu roșu.

Sărind unele operații în buclă

Adesea, într-o buclă, este necesar să se verifice îndeplinirea unei condiții și, dacă această condiție nu este îndeplinită, sări peste operatorul principal. Astfel de structuri pot fi implementate în două moduri:

  • În prima metodă, punem o condiție și în interiorul If Then End Dacă scriem codul executabil, dacă condiția nu este îndeplinită, codul nu va fi executat corespunzător. Dezavantajul evident al acestei abordări este că este destul de greoaie și în cazul unui număr mare de condiții este ușor să greșești acolo unde începe un „Dacă” și unde se termină altul;
  • Este mult mai corect să se folosească o construcție în care, în loc să se afirme o condiție, se ia negația acesteia (în loc de egală, se ia inegal etc.) și se plasează operatorul Continuare în interiorul construcției;

Instrucțiunea „Continuare” din corpul codului este evidențiată cu roșu și mută execuția buclei la începutul acesteia.

Top articole similare