Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Për secilën, rendi i kundërt është 1s. Lakohet duke përdorur një shprehje boolean

Përshkrim:

Operatori i ciklit For është menduar për përsëritjen ciklike të operatorëve të vendosur brenda konstruksionit Loop - Cycle End.

Para fillimit të ekzekutimit të ciklit, vlera Shprehja 1 i caktohet variablit Emri_Variable. Vlera e emrit të ndryshores rritet automatikisht me çdo kalim nëpër lak. Numëruesi rritet sa herë që ekzekutohet cikli.

Cikli ekzekutohet për sa kohë që vlera e ndryshores Emri_Variable është më e vogël ose e barabartë me vlerën e Shprehjes 2. Gjendja e ekzekutimit të ciklit kontrollohet gjithmonë në fillim, përpara ekzekutimit të ciklit.

Sintaksë:

Parametrat:

VariableName Identifikuesi i variablës (loop counter), vlera e të cilit rritet automatikisht me 1 sa herë që përsëritet cikli. I ashtuquajturi numërues i ciklit.Shprehja 1 Shprehja numerike që specifikon vlerën fillestare të caktuar në numëruesin e ciklit herën e parë që kalon qarku.Nga Lidhja sintaksore për shprehjen 2.Shprehja 2 Vlera maksimale e numëruesit të ciklit. Kur ndryshorja Variable_name bëhet më e madhe se Shprehja 2, ekzekutimi i deklaratës së ciklit For përfundon.Lak Deklaratat pas fjalës kyçe Loop ekzekutohen për sa kohë që vlera e ndryshores Emri_Variable është më e vogël ose e barabartë me vlerën e Shprehjes 2.

Cikli për të gjithë

Përshkrim:

Operatori i ciklit Për secilin, ai është krijuar për të kaluar nëpër koleksione vlerash. Çdo përsëritje e ciklit kthen një artikull të ri koleksioni. Përshkimi kryhet derisa të jenë përshkuar të gjithë elementët e koleksionit.

Sintaksë:

Parametrat:

Variable_name_1 Një variabël që i caktohet vlera e elementit tjetër të koleksionit në çdo përsëritje të ciklit.Nga Sintaksa Link për VariableName_2.Variable_name_2 Një variabël ose shprehje që përfaqëson një koleksion. Elementet e këtij koleksioni do t'i caktohen parametrit variable_name_1.Loop Deklaratat pas fjalës kyçe Loop ekzekutohen për çdo artikull në koleksion.// Operatorët Një operator i ekzekutueshëm ose një sekuencë e operatorëve të tillë.Ndërprerja Ndërpreni ciklin në çdo moment. Pas ekzekutimit të kësaj deklarate, kontrolli transferohet në deklaratën pas fjalës kyçe EndCycle.Vazhdo Menjëherë transferon kontrollin në fillim të ciklit, ku cikli vlerësohet dhe kontrollohet. Operatorët që e ndjekin atë në trupin e ciklit nuk ekzekutohen në këtë përsëritje.Fundi i ciklit Një fjalë kyçe që përfundon strukturën e një deklarate të ciklit.

Cikli mirupafshim

Përshkrim:

Operatori i ciklit Ndërsa është menduar për përsëritje ciklike të pohimeve që janë brenda strukturës Loop - Fundi i ciklit... Cikli ekzekutohet për aq kohë sa është shprehja boolean E vërtetë... Gjendja e ekzekutimit të ciklit kontrollohet gjithmonë në fillim, përpara ekzekutimit të ciklit.

Sintaksë:

Parametrat:

Shprehje logjike Shprehje logjike.Operatorët e ciklit që ndjekin fjalën kyçe Loop ekzekutohen për aq kohë sa rezultati i shprehjes logjike është E vërtetë. // Operatorët Një operator i ekzekutueshëm ose një sekuencë e operatorëve të tillë.Ndërprerja Ndërpreni ciklin në çdo moment. Pas ekzekutimit të kësaj deklarate, kontrolli transferohet në deklaratën pas fjalës kyçe EndCycle.Vazhdo Menjëherë transferon kontrollin në fillim të ciklit, ku cikli vlerësohet dhe kontrollohet. Operatorët që e ndjekin atë në trupin e ciklit nuk ekzekutohen në këtë përsëritje.Fundi i ciklit Një fjalë kyçe që përfundon strukturën e një deklarate të ciklit.
12 dhjetor 2014 në orën 13:13

Cili cikël është më i shpejtë? Testimi 1C

  • Performanca e lartë,
  • Programim jonormal,
  • Programimi

Unë kam programuar 1C për disa vite, dhe më pas erdha me një ide - "Pse të mos merrni një lloj kursi trajnimi, papritmas ka disa boshllëqe në njohuri për të cilat as nuk i dija më parë"? E thënë më shpejt se sa bëhet. Unë ulem, dëgjoj kursin, vij te operatorët ciklik dhe pastaj mendimi i dytë (po, nuk i kam shpesh) - "Cili cikël është më i shpejtë?" Duhet të kontrollojmë.
Kështu që gjeta pesë mënyra, si mund të organizoni një cikël me anë të 1C.

Lloji i parë i ciklit, le ta quajmë me kusht "ForPo" duket kështu:

Për n = 0 nga numri i ciklit të përsëritjeve WhatToAction (); Fundi i Ciklit;
Pamja e dytë "Për të gjithë":

Për çdo koleksion Artikull nga Koleksioni, zgjidh WhatToAction (); Fundi i Ciklit;
Së treti "deri":

Deri në n<>Numri i Përsëritjeve Loop WhatToAction (); n = n + 1; Fundi i Ciklit;
Pastaj m'u kujtua rinia e gjuhës së asamblesë - cikli "Nëse":

~ Fillimi i ciklit: Nëse n<>Numri i përsëritjeve Pastaj WhatToAction (); n = n + 1; Shko ~ Fillimi i Ciklit; FundNëse;
Dhe së fundi "Rekursion"

Cikli rekurziv i procedurës (n, numri i përsëritjeve) WhatToAction (); Nëse n<>Numri i Përsëritjeve Pastaj Cikli Rekurziv (n + 1, Numri i Përsëritjeve); FundNëse; Fundi i procedurës
Natyrisht, nuk është plotësisht e saktë të klasifikoni rekursionin si një lak, por megjithatë, ju mund të arrini rezultate të ngjashme me ndihmën e tij. Më lejoni të bëj një rezervë menjëherë se rekursioni nuk mori pjesë në testime të mëtejshme. Së pari, të gjitha testet janë kryer në 1,000,000 përsëritje, dhe rekursioni bie tashmë në 2,000 përsëritje. Së dyti, shkalla e rekursionit është dhjetë herë më e vogël se shkalla e unazave të tjera.

Digresioni i fundit. Një nga kushtet ishte ekzekutimi i çdo veprimi në cikël. Së pari, laku i zbrazët përdoret shumë rrallë. Së dyti, cikli "Për të gjithë" përdoret për një koleksion, që do të thotë se pjesa tjetër e cikleve duhet të punojë me koleksionin në mënyrë që testimi të bëhet në të njëjtat kushte.

Epo, le të shkojmë. Leximi nga një grup i mbushur paraprakisht u përdor si trupi i lakut.


ose, kur përdorni ciklin "Për të gjithë"

TestValue Marrës = Elem;
Testimi u krye në platformën 8.3.5.1231 për tre lloje ndërfaqesh (aplikacion i rregullt, aplikacion i menaxhuar dhe taksi).
Numrat janë koha në milisekonda e marrë duke përdorur funksionin Data Universale aktuale në milisekonda () të cilën e thirra para dhe pas lakut. Numrat janë thyesorë sepse kam përdorur mesataren aritmetike të pesë matjeve. Pse nuk përdora matësin e performancës? Qëllimi im nuk ishte të matja shpejtësinë e çdo rreshti kodi, vetëm shpejtësinë e cikleve me të njëjtin rezultat pune.

Do të duket se kjo është e gjitha, por - provoni, kështu që provoni!
Rezultati për platformën 8.2.19.106
Mesatarisht, platforma 8.2 është 25% më e shpejtë se 8.3. Nuk e prisja një ndryshim të tillë dhe vendosa ta testoja në një makinë tjetër. Unë nuk do t'i jap rezultatet, ju mund t'i gjeneroni ato vetë duke përdorur këtë konfigurim. Mund të them vetëm se 8.2 ishte më i shpejtë atje me 20 për qind.

Pse? Nuk e di, çmontimi i kernelit nuk ishte pjesë e planeve të mia, por gjithsesi shikoja matjen e performancës. Doli që vetë operacionet ciklike në 8.3 janë disi më të shpejta se në 8.2. Por në linjë
ReceiverTestValue = TestArray.Get (n);
domethënë, ka një degradim të ndjeshëm të performancës kur lexohet një artikull koleksioni në një variabël.

Përfundimisht:
Për çfarë është e gjithë kjo? Për veten time, bëra disa përfundime:

1. Nëse është e mundur të përdorni një cikël të specializuar - "Për të gjithë", atëherë është më mirë ta përdorni. Nga rruga, në vetvete, ai funksionon më gjatë se sythe të tjera, por shpejtësia e hyrjes në një artikull koleksioni është shumë më e lartë.
2. Nëse e dini numrin e përsëritjeve paraprakisht, përdorni ForPo. "Bye" do të funksionojë më ngadalë.
3. Nëse përdorni ciklin "Nëse", programuesit e tjerë padyshim që nuk do t'ju kuptojnë.

Kujdes! Në fund të artikullit, ekziston një lidhje me një video tutorial.
Nëse nuk keni hasur në programim më parë, atëherë nevoja për të përdorur një cikël në programin 1C ndoshta nuk është plotësisht e qartë. Në këtë artikull, unë do të flas për operatorët e lakut, si dhe qëllimin e tyre kryesor.

Por së pari, për hir të qartësisë, disa sqarime në lidhje me shprehjet e përdorura në artikull:
PërsëritjaËshtë përsëritje.
Kllapat e operatorit- fjalët e rezervuara, të cilat shkruhen gjithmonë në dyshe, operator hapës dhe operator mbyllës. Për shembull: Funksioni - FundFunksioni, Nëse - EndIf, Për - Fundi i ciklit, etj.
Trupi i lakut- kodi i programit brenda kllapave të operatorit të ciklit.
CikliËshtë një ndërtim që përsërit ekzekutimin e linjave në trupin e lakut, numri i përsëritjeve varet nga rezultati i kushteve në fillim të ciklit.

Nëse nuk do të ishte për këtë operator, atëherë kodi brenda ciklit do të duhej të shkruhet aq herë sa duhen përsëritje. Imagjinoni nëse ka 100 rreshta në një dokument dhe ju duhet t'i renditni ato dhe, të themi, të ndryshoni vlerën, por nëse në të njëjtën kohë numri i tyre ndryshon periodikisht, d.m.th. ato shtohen dhe hiqen. Nuk do të ishte e lehtë.
Një lak ju lejon të thjeshtoni detyrën e ekzekutimit të linjave të përsëritura të kodit.
Ekzistojnë tre ndërtime të cikleve në programin 1C 8.1:
"Për .. Nga .. Cikli" - përsërit numrin e cikleve nga vlera fillestare e numëruesit deri në vlerën përfundimtare të specifikuar, duke shtuar 1 në ndryshoren e numëruesit në çdo përsëritje. Përdoret kur dihet numri i përsëritjeve.

Cikli 1C Për

Për numërues = 1 Nga 3 Cikli // Cikli i fundit i trupit të ciklit;

Cikli 1C Mirupafshim

"Ndërsa ... Cikli" - ekzekutohet ndërsa vlera e llogaritur është True. Mund të përdoret në rastet kur ndryshoret për vlerësimin e shprehjes ndryshojnë në trupin e ciklit, ose nëse koleksioni përsëritet dhe ka një metodë përkatëse që kthen një boolean, i cili thirret në fillim të ciklit.

Ndërsa Fetch.Next () Loop // Trupi i ciklit EndCycle;

Cikli 1C Për të gjithë

Për secilin ... Nga ... Lakja përsëritet mbi koleksionin nga artikulli i parë tek i fundit. Shkrimi i një ndryshoreje (në shembullin: TekElement) i vlerës së elementit.

Për çdo element aktual nga ArrayElements Loop // Cikli i fundit i trupit të ciklit;

Cikli i kundërt 1C

Ekziston gjithashtu një lak i kundërt që mund të përdoret për të përshkuar koleksionet në rend të kundërt d.m.th. nga poshtë lart (nga fundi). Kjo metodë mund të jetë e nevojshme nëse keni nevojë të fshini elementë të koleksionit.

Numri i Artikujve = Vargu i Artikujve.Numri (); Për Indeksin Reverse = 1 Sipas Numrit të Artikujve Loop TekElement = Grup Artikujsh [Numri i Artikujve - ReverseIndex]; Fundi i Ciklit;

Operatorët vazhdojnë dhe aborti diskutohen në videon, lidhjen më poshtë.

Algoritmet e shumë programeve shpesh përfshijnë përsëritjen ciklike të veprimeve të caktuara. 1C nuk është përjashtim në këtë rast. Ciklet në 1C lejojnë:

  • Kaloni nëpër elementët e drejtorisë;
  • Plotësoni zonat e paraqitjes;
  • Kryeni veprime të caktuara me një përzgjedhje dokumentesh;
  • Dhe shumë e shumë të tjera.

Llojet e lakut

Në 1C, është zakon të bëhet dallimi midis tre llojeve të cikleve, në varësi të grupit të fjalëve të përfshira në ndërtim:

  1. Për çdo "Ndryshore" nga "Mbledhja e vlerave";
  2. Për "Variable" = "Fillimi. vlera "Nga" Con. Kuptimi";
  3. Ndërsa “Shprehja”.

Le t'i shqyrtojmë ato në më shumë detaje.

Për secilën prej

Ky zvarritës është i përshtatshëm për koleksione vlerash (përzgjedhja e dokumenteve ose artikujve të katalogut, stoku). Ekzekutimi do të vazhdojë derisa të kalohet elementi i fundit i koleksionit. Linja duhet të përmbajë:

  • Një variabël që identifikon artikullin aktual në koleksion;
  • Përcaktimi i një koleksioni vlerash.

Gabimi më i zakonshëm në këtë rast është paraqitur në Fig. 1.

Më shpesh, ndodh kur programuesi nuk e kupton plotësisht ndryshimin midis një objekti (dokumenti, libri referues) dhe një koleksioni (zgjedhjeje) vlerash të marra duke përdorur operatorin Select ().

Për nga

Në këtë rast, parametrat që i kalohen vargut janë:

  1. Emri i ndryshores - iterator;
  2. Vlera fillestare e ndryshores;
  3. Vlera përfundimtare e ndryshores.

Përsëritja e bllokut të deklaratave të përfshira në trupin e ciklit do të kryhet derisa ndryshorja të jetë e barabartë ose për herë të parë të kalojë vlerën përfundimtare. Në këtë rast, përsëritësi do të rritet me 1 çdo hap. Vlerat krahasohen përpara se të kryhet hapi tjetër.

Ky dizajn përdoret shumë shpesh kur përshkohen seksionet tabelare.

Kur përdorni këtë zvarritës, është e rëndësishme të bëni dallimin midis numrit të rreshtave në seksionin tabelor dhe indeksit të një rreshti të vetëm të marrë. Në rastin e parë, vlera fillestare do të jetë 1, vlera përfundimtare mund të merret duke përdorur operatorin Sasia (). Indekset fillojnë me 0 dhe mbarojnë me numërimin () - 1. Përndryshe, mund të merrni një gabim (Fig. 2).

Deri në

Ekziston vetëm një parametër - një shprehje logjike, e cila kontrollohet për të vërtetën përpara çdo hapi tjetër të lakut. Sapo shprehja boolean dështon, mbajtësi do të përfundojë kalimin.

Është shumë e rëndësishme të kuptohet se në disa raste shprehja e testuar mund të jetë gjithmonë në vlerën True, kështu që kalimi do të kryhet një numër të pafundëm herë, duke pezulluar sistemin.

Në raste të tilla, është e nevojshme të regjistrohet një nga dy opsionet për ndërprerjen e ekzekutimit brenda trupit të lakut.

Ndonjëherë mund të lindë një situatë kur e vërteta e shprehjes së testuar nuk do të ndodhë kurrë. Kjo mund të çojë në kërkim të padobishëm për gabime në kod dhe humbje kohe.

Ndërprisni ekzekutimin duke shtypur një kombinim tasti

Nëse në trupin e ciklit shkruani procedurën User Interrupt Handling (), atëherë në çdo moment të ekzekutimit të saj, duke shtypur kombinimin e tastit Ctrl + PauseBreak, mund të ndaloni funksionimin e tij. Në këtë rast, një rresht do të shfaqet në dritaren e mesazheve (Fig. 3).

Për të shmangur pasojat e pakëndshme të aktiviteteve të tyre, është jashtëzakonisht e dobishme që programuesit të trajnojnë veten për të shkruar këtë procedurë në trupin përpunues.

Ndërprerja e kushtëzuar

Shumë shpesh, algoritmi i programit supozon ndalimin e përpunimit ciklik nëse plotësohet ky apo ai kusht. Ju mund ta vendosni këtë procedurë në trupin e ciklit duke përdorur operatorin Interrupt.

Kjo deklaratë, e shkruar saktë në kodin e programit, është e theksuar me të kuqe.

Kërcimi i disa operacioneve të ciklit

Shpesh në një lak është e nevojshme të kontrollohet përmbushja e një kushti dhe, nëse ky kusht nuk plotësohet, të anashkalohet mbajtësi kryesor. Ndërtime të tilla mund të zbatohen në dy mënyra:

  • Në metodën e parë, vendosim një kusht brenda If Then End Nëse shkruajmë kodin e ekzekutueshëm, nëse kushti nuk plotësohet, kodi nuk do të ekzekutohet në përputhje me rrethanat. Disavantazhi i dukshëm i kësaj qasjeje është se ajo është mjaft e rëndë dhe në rastin e një numri të madh kushtesh është e lehtë të bësh një gabim, ku fillimi i një “Nëse” vjen dhe ku mbaron tjetri;
  • Është shumë më e saktë të përdoret një konstruksion ku, në vend të një deklarate të një kushti, merret mohimi i tij (në vend të barabartë, merret në mënyrë të pabarabartë, etj.) dhe vendndodhjen e operatorit Continue brenda konstruksionit;

Operatori "Continue" në trupin e kodit është theksuar me të kuqe dhe e transferon ekzekutimin e lakut në fillimin e tij.

Artikujt kryesorë të lidhur