Vba exceli kirjelduse silmus. "VBA loopi avaldused

Silmused võimaldavad teil täita ühte või mitut koodirida mitu korda. VBA toetab järgmisi silmuseid:

For...Edasi Iga...Järgmine Tee... Loop

Konstruktsioon For. . . järgmiseks. Kui korduste arv on ette teada, kasutatakse For-silmust. . . järgmiseks. A For silmus kasutab muutujat, mida nimetatakse tsüklimuutujaks või tsükliloenduriks, mis suurendab või kahaneb määratud summa võrra iga kord, kui tsükkel kordub. Selle konstruktsiooni süntaks on:

Loendur = algus Lõpuni Järgmised laused

Parameetrid loendur (loendur), algus (tsükli algus), lõpp (tsükli lõpp) ja juurdekasv (inkrement) on numbrilised.

Märge. Kasvuparameeter võib olla kas positiivne või negatiivne. Kui see on positiivne, peab algusparameeter olema lõppparameetrist väiksem või sellega võrdne, vastasel juhul tsükkel ei käivitu. Kui inkrementi parameeter on negatiivne, peab algusparameeter olema tsükli põhiosa täitmiseks suurem või võrdne lõppparameetri väärtusega. Kui sammu parameetrit pole määratud, on juurdekasvu parameetri vaikeväärtus 1.

VBA käivitab tsükli For järgmises järjestuses:

1. Käivitab tsüklimuutujate loenduri.

2. Võrdleb tsüklimuutuja loenduri väärtust ja lõppparameetri väärtust. Kui loenduri muutuja on suurem, lõpetab VBA tsükli. (Kui juurdekasvuparameetri väärtus on negatiivne, lõpetab VBA tsükli, kui tsüklimuutujate loenduri väärtus on väiksem kui lõppparameetri väärtus.)

3. Täidab tsükli kehalausete laused.

4. Suurendab tsüklimuutujate loenduri väärtust 1 võrra või juurdekasvu parameetri väärtuse võrra, kui see on antud.

5. Korrake samme 2 kuni 4.

Vaatleme näidet: Arvutage funktsiooni f(t) väärtus

antud a, b, n, kui t muutub a-st b-ks sammuga Dt=(b-a)/(n-1).

Alamnäide3() Dim f() As Single Dim a As Single, b As Single, t As Single, dt As Single Dim i As Integer, n As Integer Call read("a1", a) : Call read("b1" , b) : Call read("c1", n) ReDim f(1 To n - 1) dt = (b - a) / (n - 1) : t = a Call out("a2", "i") : Call out("b2", "t") : Call out("c2", "f(t)") For i = 1 kuni n - 1 t = t + dt Kui t<= -1 Then f(i) = -1 ElseIf t >1 Siis f(i) = 1 Muidu f(i) = t End If Call out("a" & (2 + i), i) : Call out("b" & (2 + i), t) : Call out("c" & (2 + i), f(i)) Järgmine i End Sub

Iga konstruktsiooni jaoks. . . Edasi

Iga silmuse jaoks. . . Järgmine on nagu For-silmus. . . Järgmine, kuid see kordab lausete rühma iga elemendi jaoks objektide komplektist või massiivist, selle asemel, et korrata avaldusi teatud arv kordi. See on eriti kasulik, kui te ei tea, mitu elementi komplektis on.

Konstruktsiooni For Every silmus süntaks. . . Järgmine on:

Iga elemendi jaoks Grupilausetes Järgmine element

Iga silmuse kasutamisel pidage meeles järgmisi piiranguid. . . Järgmine:

Hulkade puhul saab elemendi parameetriks olla ainult tüübivariandi muutuja, tüübiobjekti üldine muutuja või objektibrauseris loetletud objekt

Massiivide puhul saab elemendi parameeter olla ainult Variant tüüpi muutuja

Iga tsükli jaoks ei saa kasutada. . . Järgmiseks kasutaja määratud tüüpi massiiviga, kuna tüübi variandi muutuja ei saa sisaldada kasutaja määratud tüüpi väärtust

Tee... Loop disain

Do-tsüklit kasutatakse lausete ploki täitmiseks piiramatu arv kordi. Do-konstruktsioonil on mitu varianti. . . Loop, kuid igaüks neist hindab tingimusavaldist, et määrata, millal tsüklist väljuda. Nagu If-konstruktsiooni puhul. . . Siis peab tingimus olema väärtus või avaldis, mille väärtus on Väär (null) või Tõene (mitte-null).

Järgmises konstruktsioonis Do . . . Silmuslauseid täidetakse seni, kuni tingimuse väärtus on True (True):

Do While Condition Loop laused

Selle tsükli täitmisel kontrollib VBA esmalt tingimust. Kui tingimus on Väär, jätab see kõik silmuslaused vahele. Kui see on Tõene, täidab VBA tsüklilaused, naaseb uuesti Do While-lause juurde ja testib tingimust uuesti.

Seetõttu saab selle konstruktsiooniga esindatud tsüklit täita mis tahes arv kordi seni, kuni tingimuse väärtus ei ole null või tõene. Pange tähele, et tsükli keha lauseid ei täideta kunagi, kui tingimust esimest korda kontrollides osutub see vääraks (False).

Vaatleme näidet: Arvutage seeria summa

etteantud täpsusega.

Alamnäide4() Dim e As Single, x As Single, s As Single Dim m As Single, p As Single, i Asingle Call read("a1", x) : Kõne loe("b1", e) s = 0 : i = 1: m = 1: p = -1 Call out("a2", "i") : Call out("b2", "m") : Call out("c2", "s") Do While Abs(m) >= e p = -p * x m = p / i s = s + m Call out("a" & (2 + i), i) : Call out("b" & (2 + i), Abs (m)) : väljakutsumine ("c" & (2 + i), s) i = i + 1 silmuse lõpu alam

Teine variant Do-konstruktsioonist. . . Loop täidab esmalt tsükli kehalaused ja seejärel kontrollib tingimust pärast iga täitmist. See variatsioon tagab, et tsükli kehas olevaid lauseid täidetakse vähemalt üks kord:

Kas avaldused Loop While tingimus

Ülejäänud kaks silmuskonstruktsiooni varianti on sarnased eelmistega, välja arvatud see, et silmus käivitatakse tingimusel, et tingimus on väär (False):

Silmust ei käivitata üldse või käivitatakse mitu korda:

Tehke kuni tingimuseni

Silmuslaused

Silmus käivitatakse vähemalt üks kord:

operaatorid

Loop Kuni seisukorrani

7.2 Pesastatud silmused.

Juhtstruktuure saate paigutada teiste juhtstruktuuride sisse (nt Kui ... Siis plokk tsükli For... Next sees). Väidetavalt on teise juhtimisstruktuuri sisse asetatud juhtstruktuur pesastatud.

Juhtstruktuuride pesastamise sügavus VBA-s ei ole piiratud. Koodi loetavuse parandamiseks on pesastatud juhtstruktuuride kasutamisel tavaline praktika nihutada programmis otsustuskonstruktsiooni või tsükli põhiosa.

Ühe või mitme muu silmuse pesastamisel ahelasse räägitakse pesastatud silmustest, mis eristavad välimist (sulgevat) ja sisemist (pesastatud) silmust.

Vaatleme näidet maatriksi A(n,m) elementide Aij ridade kaupa liitmisest.

Alamnäide5() Dim a() As Single, s() As Single Dim n As Integer, m As Integer Dim i As Integer, j As Integer Call read("a1", n): Call read("b1", m ) Redim a(1 kuni n, 1 kuni m), s(1 kuni n) "Maatriksi lugemine i = 1 kuni n jaoks j = 1 To m jaoks Helista readcell(i + 1, j, a(i, j)) Järgmine j Järgmine i "Arvutamine i = 1 jaoks To n s(i) = 0 j = 1 jaoks m s(i) = s(i) + a(i, j) Järgmine j Väljakutse (i + 1, m + 1) , s(i)) Järgmine i End Sub

Pange tähele, et esimene Next sulgeb sisemise For tsükli ja viimane Next välise For tsükli. Samamoodi rakendatakse pesastatud If-lausete puhul lähima If-lause sulgemiseks automaatselt lauseid End If. Pesastatud struktuurid Do . . . Silmused töötavad sarnaselt: kaugeim Loop-lause vastab kaugeimale Do-lausele.

Kahemõõtmelise massiivi elementide sisestamisel/väljastamisel Microsoft Exceli töölehel on mugav kasutada kohandatud sisend-/väljundprotseduure:

Alamlugemislahter(i täisarvuna, j täisarvuna, val kui variant) val = Leaf1.Cells(i, j).Väärtuse lõpp Alam-välislahter(i täisarvuna, j täisarvuna, val variandina) Leht1.Rakud(i, j).Väärtus = val End Sub

kus I on rea number, j on töölehe veeru number.

Juhtstruktuuridest lahkumine

Väljumise lause võimaldab teil väljuda otse For-tsüklist, Do-tsüklist, alamprotseduurist või funktsiooniprotseduurist. Väljumise avalduse süntaks on lihtne:

Loendur = algus Lõpuni [lauseplokk] [lauseplokk] Järgmine tee [(Kuni | Kuni) tingimus] [lauseplokk] [lauseplokk] Silmus

Välju For tsüklis For ja Exit Do Do-tsükli sees võivad ilmuda suvalise arvu kordi.

Välju Do-lause töötab kõigi Do-tsükli süntaksi variatsioonidega.

Käske Exit For ja Exit Do kasutatakse siis, kui on vaja tsükkel kohe lõpetada, ilma edasisi iteratsioone jätkamata või tsükli kehas lauseploki täitmist ootamata.

Kui kasutate tsüklist väljumiseks käsku Exit, sõltuvad tsüklimuutuja väärtused sellest, kuidas tsükkel lõpeb:

Kui tsükkel lõpeb normaalselt, on tsükli muutuja väärtus ühe võrra suurem kui silmuste arvu ülemine piir

Kui tsükkel lõpeb enneaegselt, säilitab tsüklimuutuja oma väärtuse, mille ta sai, võttes arvesse tavalisi reegleid

Kui tsükkel lõpeb komplekti lõpus, on tsüklimuutujaks Nothing, kui see on objektimuutuja, või tühi, kui see on variant

Viimane uuendus: 30.10.2015

Teist tüüpi juhtimisstruktuurid on silmused. VB.NET kasutab mitut tüüpi silmuseid.

For...Next Loop

Seda tsüklit teostatakse teatud arv kordi ja selle numbri määrab loendur:

For i As Integer = 1 kuni 9 Console.WriteLine("(0) ruut on (1)", i, i * i) Järgmine

Siin mängib muutuja i loenduri rolli. Pärast sõna To paneme loenduri maksimaalse väärtuse. Iga tsükliga suurendatakse loenduri väärtust ühe võrra. Ja seda väärtust võrreldakse väärtusega pärast To. Kui need kaks väärtust on võrdsed, siis tsükkel lõpeb.

Silmustega töötades saame loenduri väärtust iga läbimisega suurendada mitte ainult ühe, vaid üldiselt suvalise arvu võrra. Selleks peate kasutama kas märksõna samm ja pärast seda määrake tsükli samm, mille võrra loenduri väärtus suureneb, või saate loendurit otse tsüklis suurendada:

For i kui täisarv = 1 kuni -9 Samm -1 j jaoks As Integer = 1 kuni 9 Console.WriteLine("I ja j korrutis on (0)", i * j) j += 1 Järgmine Järgmine

Pange tähele, et esimese tsükli sammuks valitakse negatiivne väärtus ja loenduri väärtus väheneb iga läbimisega ühe võrra. Sisemises tsüklis suurendatakse loendurit j igal iteratsioonil 2 võrra, kuna see kasvab vaikimisi ühe võrra ja me suurendame seda ka tsüklis ühe võrra. Selle tulemusena töötab sisemine ahel viis korda ja välimine üheksa, see tähendab tegelikult 45 tsüklit.

Iga jaoks...Next Loop

Silmus For Every itereerib teatud rühma elemente, näiteks massiivi või kogu. Oletame, et meil on mingi Integer tüüpi massiiv ja me peame selle massiivi initsialiseerima juhuslike väärtustega ja seejärel kuvama ekraanil kõik selle elemendid:

"Loo viiest numbrist koosnev massiiv Dim nums(4) As Integer Dim r As New Random() "initsialiseeri massiiv For i As Integer = 0 To nums.Length - 1 nums(i) = r.Next(100) Next " Kuva elementide massiiv Iga i jaoks täisarvuna numbrites Console.Write("(0) ", i) Järgmine

Iga lause puhul määrame kõigepealt muutuja, mis võtab massiivi elementide väärtused. Ja pärast märksõna sisse Määrake rühm, kuhu soovite kõiki elemente sortida.

samas silmus

Kui tsüklis töötab see nii kaua, kuni on täidetud teatud tingimus, mis on määratud pärast sõna While:

Dim j täisarvuna = 10, samas kui j > 0 konsool.WriteLine(j) j -= 1 lõpp, kuigi

Tee silmus

Do-silmus, nagu tsükkel While, käivitatakse seni, kuni teatud tingimus on täidetud. Sellel on aga erinevad vormid. Seega kontrollitakse järgmises näites kõigepealt tingimust ja seejärel käivitatakse tsüklis määratletud koodiplokk:

Dim j kui täisarv = 10 tee, samas kui j > 0 konsool.WriteLine(j) j -= 1 silmus

Sel juhul käivitatakse silmus, kui j väärtus on suurem kui null. Kuid on veel üks kirje, kus sõna asemel kasutatakse sõna While Kuni, ja tsüklit täidetakse, kuni teatud tingimus on täidetud, st kuni j väärtus muutub nullist väiksemaks:

Dim j täisarvuna = 10 Tee Kuni j< 0 Console.WriteLine(j) j -= 1 Loop

Kui algselt on tsüklis määratud tingimus vale, siis tsükkel ei tööta. Kuid me saame tsükli lõpus määrata kontrolli ja seega jookseb meie tsükkel vähemalt korra:

Dim j täisarvuna = -1 Tee Console.WriteLine(j) j -= 1 Loop kuni j< 0 "либо Do Console.WriteLine(j) j -= 1 Loop While j > 0

Jätka ja väljumise avaldused

Tihti tuleb mitte oodata tsükli lõppu, vaid tsüklist kohe väljuda, kui teatud tingimus on täidetud. Selleks kasutage operaatorit väljuda, millele järgneb tsükli tüüp, millest väljuda, näiteks Exit Do (Exit While) :

Dim r As New Random() Dim num As Integer = r.Next(100) For i As Integer = 0 kuni 100 num -= 1 Kui num< 50 Then Exit For Next Console.WriteLine(num)

On veel üks ülesanne - väljuda mitte tsüklist, vaid praegusest läbimisest või iteratsioonist ja minna järgmise juurde. Selleks kasutage käsku Continue, mille järel nad näitavad tsükli tüüpi, millest väljutakse, näiteks Continue While:

Dim r As New Random() Dim num As Integer = r.Next(100) For i As Integer = 0 kuni 10 num -= 7 Kui num< 50 AndAlso num >25 Seejärel Continue For End If Console.WriteLine(num) Next

Sel juhul lahutame tsükli igal käigul arvust num arvu 7 ja seejärel vaatame, kas arv num kuulub intervalli 25 kuni 50. Ja kui kuulub, siis läheme tsükli uue iteratsiooni juurde ja kui ei, siis kuvame selle ekraanil.

Laboratoorsed tööd programmeerimise aluste kohta

2.1. Analüütiliselt esitatud funktsioonide tabel
ja lähenevad lähedale

Eesmärk

· Hargnevate ja tsükliliste struktuuride organiseerimise aluste teoreetiliste teadmiste kinnistamine.

· Praktiliste programmeerimisoskuste omandamine hargnevate ja tsükliliste struktuuride abil Visual Basic süsteemis.

VB-s on kolme tüüpi tsüklilauseid:

loendustsükkel: …Kuni…Järgmine

Eeltingimustega tsüklid: Do While...Loop, Do Til...Loop, While...WEend

Järeltingimustega silmused: Tee...Loop While, Do...Loop Kuni.

Loendustsükkel – võimaldab teil teatud arv kordi lausete komplekti läbi lugeda. Selle süntaks on järgmine:

Sest loendur = Alusta To lõpp

[operaatorid]

[operaatorid]

Järgmine[ loendur]

Parameeter loendur on numbriline muutuja (täisarv, reaalarv või kuupäev, variant, valuuta), mida suurendatakse automaatselt pärast iga iteratsiooni. Algne väärtus loendur võrdne parameetriga Alusta, ja viimane parameeter on lõpp. Kui pole määratud, loetakse samm võrdseks 1-ga, sammu väärtust saab muuta. See võib olla positiivne või negatiivne arv.

Do….loopi jaoks on neli süntaktilist konstruktsiooni:

Do...Loop märksõnade vahelisi lauseid täidetakse olenevalt tingimusest määratud arv kordi. Näiteks järgmises programmifragmendis, kui C = 100, on tingimus täidetud ja tsükkel siseneb. Tsükli sees kutsutakse protseduur ja C väärtus väheneb 1 võrra. Seejärel kontrollitakse uuesti tingimust (C > 0) ja käivitatakse uuesti tsüklilaused (neid täidetakse kokku 100 korda), kuni C = 0. Kui tingimus C > 0 muutub vääraks ja tsükkel peatub.

Tehke, kui C > 0

Sama programmifragment käivitati süntaksi 2 eeltingimustsükliga:

Sel juhul käivitatakse tsükkel tingimusel, et tingimus on Väär, vastupidiselt eelmisele, st see jätkub enne tingimuse täitmine C = 0.

Silmuslaused süntaksis 3 ja 4 on väga sarnased kahe esimesega, välja arvatud tingimus mitte hinnatakse seni, kuni tsükkel on vähemalt korra käivitatud.

Nende tsüklite süntaksites saate kasutada tsüklist tingimusteta väljumise operaatoreid Exit For ja Exit Do, mis võimaldavad teil juhtimise üle anda tsükli taga olevale operaatorile. Näiteks järgmises programmifragmendis, kui C algväärtus on >50, siis tsükkel peatub koheselt.



Tehke kuni C<= 0

MsgBox "Start. väärtus on lubatust suurem", "Sisestusviga"

Silmust While...Wend kasutati Visual Basicu varasemates versioonides. Selle süntaks on järgmine:

Kuigi<условие>

<Операторы>

Erinevalt Do..Loopist ei ole tsüklil While ..Wend teist võimalust, mille puhul tsükli lõpus sooritatakse seisunditest. Lisaks pole sellel tsükli väljumislauset nagu Exit Do.

VBA. Tsüklite organiseerimine.

Silmuslauseid kasutatakse toimingu või tegevuste rühma sooritamise kordamiseks määratud arv kordi. Korduste (tsükli iteratsioonide) arvu saab eelnevalt määratleda või arvutada.

VBA toetab kahte tüüpi silmuskonstruktsioone:

  1. Fikseeritud korduste arvuga silmused ( tsüklid loenduriga).
  2. Silmused määramatu arvu kordustega ( tingimuslikud silmused).

Seda mõistet kasutatakse igat tüüpi tsüklite puhul silmuse korpus A, mis määratleb lausete ploki, mis on suletud tsükli algus- ja lõpulausete vahele. Iga lausete kordus tsükli kehas nimetatakse iteratsioon .

Fikseeritud tsüklid

VBA pakub fikseeritud tsükli korraldamiseks kahte juhtimisstruktuuri: For ... Next (loenduriga tsükkel) ja For Every ... Next (silmus koos loendiga).

Sest…Järgmine avaldus see on tüüpiline loenduriga silmus, mis sooritab etteantud arvu iteratsioone. For … järgmise lause süntaks on:

Sest<счетчик> = <начЗначение>See<конЗначение>

<блок операторов>

Järgmine[<счетчик>]

Näide lause For … Next kasutamisest.

Loetelu 1. For … Järgmine väide

‘ EESMÄRK: Kirjutage programm, mis saab kasutajalt kaks numbrit.

' Lisab kõik numbrid nende kahe numbri antud vahemikus ja seejärel

' Kuvab saadud summa.

Alamnäidis7()

Dim i As Integer ‘silmusloendur

Dim sStart ‘loenduri algusväärtus

Dim sEnd ' loenduri lõppväärtus

Dim sSum As Long ‘tulemuslik summa

sStart = InputBox("Sisesta esimene number:")

sEnd = InputBox("Sisesta teine ​​number:")

sSum = 0

Kui i = CInt(sStart) kuni CInt(sEnd)

sSum = sSum + i

Järgmine i

MsgBox “Arvude summa vahemikust ” & sStart & ” kuni ” & sEnd & ” on: ” & sSum

lõpu alam

Iga … järgmise tsükli avalduse jaokskuulub objektitüüpide operaatorite kategooriasse, s.o. kehtib eelkõige kollektsioonide kohta nii objekte kui ka massiive . Silmuse keha täidetakse fikseeritud arv kordi, mis vastavad massiivi või kogumi elementide arvule. Iga … järgmise avalduse vorming on:

Igaühele<элемент>sisse<группа> <блок операторов>Järgmine[<элемент>]

Tingimuslikud tsüklid (määramata tsüklid)

Tingimuslikke silmuseid kasutatakse siis, kui korduvaid toiminguid on vaja teha ainult teatud tingimustel. Iteratsioonide arv ei ole määratletud ja üldiselt võib see olla võrdne nulliga (eriti eeltingimusega tsüklite puhul). VBA pakub arendajatele tingimusahelate korraldamiseks mitmeid juhtimisstruktuure:

  • Neli tüüpi ahelaid Do..Loop, mis erinevad kontrollitava tingimuse tüübi ja selle kontrolli teostamise aja poolest.
  • Katkematu While … Wend silmus.

Do While... Loop – tüüpiline silmus eeltingimusega. Tingimust kontrollitakse enne tsükli põhiosa täitmist. Tsükkel jätkab oma tööd kuni selleni<условие>täidetakse (st on tõene). Kuna kontroll tehakse alguses, ei pruugita tsükli keha kunagi käivitada. Loopi Do While… vorming:

Tee Kuigi<условие>

<блок операторов>

silmus

Nimekiri 2. Do While … Loop

" EESMÄRK: kirjutage programm, mis aktsepteerib kasutaja sisendit

‘ suvaline numbrijada. Sissepääs tuleb lõpetada

' alles pärast seda, kui sisestatud paaritute arvude summa ületab 100.

Alamnäide8()

Dim OddSum täisarvuna

Dim OddStr As String 'string paaritute numbritega

Dim Num 'sisendnumbrite aktsepteerimiseks

OddStr = "" 'väljundstringi initsialiseerimine

OddSum = 0 ‘OddSum summa initsialiseerimine

Tee Kuigi OddSum< 100 ‘начало цикла

Num = InputBox("Sisesta number: ")

Kui (Num Mod 2)<>0 Siis ‘paarisus

OddSum = OddSum + Arv ‘paaritute arvude summa kogunemine

OddStr = OddStr & Num & ”

Lõpeta, kui

silmus

‘väljastage paaritute numbritega string

MsgBox prompt:=”Paaritud numbrid: ” & OddStr

lõpu alam

Tee... Loop While avaldusmõeldud korraldamisekssilmus järeltingimusega. Tingimust kontrollitakse pärast seda, kui silmuse keha on vähemalt korra täidetud. Tsükkel jätkub kuni<условие>jääb tõeks. Tee... Loop While vorming:

Tee<блок операторов>silmus ajal<условие>

Nimekiri 3. Järelseisundiga silmus

EESMÄRK: koostage programm mängu "Arva ära arv" jaoks. Programm peaks olema juhuslik

Kasutaja peab selleks, et genereerida arv vahemikus 1 kuni 1000

'Arva ära see number. Programm kuvab iga sisestatud numbri kohta vihje.

' "rohkem või vähem".

Alamnäide8()

Juhusliku arvu generaatori initsialiseerimine

Dim msg As String ‘ sõnumistring

Dim SecretNumber nii pikk, UserNumber kui variant

Algus: SecretNumber = Round(Rnd * 1000) ‘ arvuti loodud number

UserNumber = Tühi 'kasutaja sisestatud number

Mängi

Valige Tõene suurtäht

Case IsEmpty(UserNumber): msg = "Palun sisestage number"

Case UserNumber > SecretNumber: msg = "Liiga palju!"

Juhtumi kasutajanumber< SecretNumber: msg = “Слишком мало!”

Lõpeta Vali

UserNumber = InputBox(prompt:=msg, Title:="Arva ära number")

Loop UserNumber ajal<>salajane number

' läbivaatus

Kui MsgBox("Kas sa tahad uuesti mängida?", vbYesNo + vbQuestion, "Arvasite õigesti!") = vbJah Siis

Mine algusesse

Lõpeta, kui

lõpu alam

Tehke kuni … Loop ja tee … Loop Kuni silmused on varem käsitletud tingimussilmuste inversioonid. Üldiselt töötavad need sarnaselt, välja arvatud see, et silmuse keha täidetakse valetingimustes (st.<условие>=Vale). Loopi Tee Kuni ... vorming on:

Tehke Kuni<условие> <блок операторов>silmus

Loop Do … Loop Until vorming on:

<блок операторов>

Loop kuni<условие>

Praktiline ülesanne:Kirjutage nimekirjades 10 ja 11 olevad programmid ümber, kasutades pöördahela lauseid.

Kuigi Loop ... Wend kehtib ka tingimussilmuste kohta. See väide vastab täielikult Do While … Loop struktuurile. Silmuse While … Wend formaat on:

Kuigi<условие>

<блок операторов>

Wend

Selle avalduse eripäraks on tsükli keha sunniviisilise lõpetamise (katkestamise) võimatus (Exit Do lause ei tööta tsüklis While ... Wend).

Silmuse katkestus

Väljumise lauset kasutatakse iteratsiooni lõpetamiseks ja tsüklist väljumiseks. See väide on rakendatav mis tahes tsüklilise struktuuri puhul, välja arvatud While ... Wend. Silmuse katkestamiseks väljumise kasutamise üldine süntaks on:

<начало_цикла>

[<блок операторов1>]

Välju (jaoks | Tee)

[<блок операторов2>]

<конец_цикла>

Väljumise lause täitmisel tsükkel katkeb ja juhtimine antakse üle lausele järgnevale avaldusele<конец_цикла>. Silmuse keha võib sisaldada mitut väljumislauset.

Nimekiri 4. Sundahela väljumine

Alamnäide9()

Kui i = 1 kuni 10000000

Kui i = 10, siis Exit For ' väljub tsüklist, kui loendur jõuab 10-ni

Edasi

Operaatori süntaks:

SestLoendur= Alusta ToLõpp[sammSamm]

Avaldus_plokk

EdasiLoendur

See on märgitud siin:

Sest jaoks (kohustuslik VB märksõna);

To enne (kohustuslik VB märksõna);

Avaldus_plokk helistas üks või mitu operaatorit tsikli keha;

loendur - täisarv muutuja, mis loeb täidetavate tsüklite arvu;

Algus, lõpp - loenduri alg- ja lõppväärtused;

samm samm (märksõna VB);

samm - loenduri muutmise samm; võib olla negatiivne; parameeter on valikuline, sest kui samm on 1, saate Step Samm madalam;

Next - next (kohustuslik VB märksõna, tsükli lõpu lause kirje).

Vastuväärtus (Algus, Lõpp) võib olla arvkonstandid või täis- või reaaltüüpi muutujad, võivad olla negatiivsed või positiivsed arvud. Et silmuse keha saaks vähemalt korra täita, peab see olema algus ≤ lõpp, kui Samm> 0 ja algus ≥ lõpp, kui Samm< 0. Niipea kui see selgub Loendur>Lõpp ( kui Alusta< Конец), tsükli täitmine lõpeb. Kui a Start =Lõpp, tsükkel sooritatakse üks kord;

Näide 9.1 .Funktsiooni hindamineY = 2 – 1.5 sinxkui muudate X-i sammuga 0,2 vahemikus .

Programmi fragment Y arvutamiseks ning argumendi X ja funktsiooni Y väljastamiseks:

X = 0 kuni 2,4 Samm 0,2

Y = 2–1,5*Sin(X)

Selle tsükli toimimise mõistmiseks on siin sarnase tsükli jaoks loodud programm operaatorminema, sildid, operaatorKuiSiis.

M1:X=X+0,2

Kui X<= 2.4 Then

Y = 2–1,5*Sin(X)

Analüüsime, kuidas see programm töötab. Esimene arvutus Y on ebastandardne, nagu see oli, langeb ahelast välja. Silmus algab pärast esimest kontrolli GoToM1 üleandmist sildile M1. M1-ga real suurendatakse argumenti X sammu võrra 0,2 ja koheselt kontrollitakse, kas X uus väärtus ei ületa lõppväärtust 2,4. Kui see ei ületa, siis korratakse Y arvutamist selle uue X-ga. Seejärel käivitatakse uuesti operaator GoToM1 - juhtimise ülekandmine M1 sildiga reale. Need Y arvutamise kordused (tsüklid) lõpevad kohe, kui X ületab 2,4.

Nüüd on programm If võrreldav tsükliga For…Next.

X = 0 kuni 2,4 Samm 0,2

asendab kaks rida

M1:X=X+0,2

Kui X<= 2.4 Then

Need on kaks viimast koodirida, mis käivitatakse tsüklis For, kuid me ei näe seda. Kodeerisime need stringiga cFor... Koodirida GoTo M1 on kodeeritud sõnaga Next X (sõna otseses mõttes: next X). Selle tulemuseks on kompaktne disain.

For…Next tsükli kasutamisel peate õppima, kuidas kasutada tsükliloendurit erinevate probleemide lahendamisel. Et mõista, kuidas saate loendurit probleemi lahendamiseks kasutada, peate seda tegema analüüsida probleemipüstitust, leida probleemi mõne parameetri muutumise mustreid.

Näide 9.2 . Rea elementide summa määramine: .

Programmi fragment:

S = 0 ‘S on jada summa

Kui i = 1 kuni 16 ‘, on loendur i murdosa nimetaja

S = S + 1/i ‘ akumulatsioonisumma

Prindi "S="; S ‘summa S väljund vormile

Iga loenduri i väärtuse jaoks moodustab avaldis 1/i järjestikku rea elemendid, alustades 1-st.

Näide 9.3 . Elementide jada summa arvutamine
.

Programmi fragment:

S = 0 ‘S on jada summa

Kui i = 1 kuni 18 ‘ loendur i – lugeja

S = S + i/(i + 1) ‘ nimetaja on lugejast 1 võrra suurem

Prindi "S="; S ‘summa S väljund vormile

Näide 9.4 . Summa arvutamine: 5 + 8 + 11 + ... + 32 + 35

Programmi fragment:

S = 0 ‘S on jada summa

Kui i = 5 kuni 35 Samm 3 ‘ hanki aritmeetika _

progressioon nimetajaga 3

Prindi "S="; S

Näide 9.5. Antud x summa arvutamine:

Ülesande analüüs näitab, et aste punktis X muutub 1-lt 10-le. Sel juhul on koefitsiendi lugeja lugeja astmes X suurem kui aste 1 võrra ja nimetaja on 2 võrra. Moodustatakse astme väärtus. loenduri kasutamine i. Seejärel saate kirjutada järgmise programmi (fragmendi):

S = 1 ‘S on jada summa

Kui loendurina i = 1 kuni 10 ', muutub aste X juures

S = S + (-1)^i*(i + 1)*x^i / (i + 2)

Prindi "S="; S

TsüklidSestEdasikasutataksesisend väljund jamassiivi töötlemine .

Näide 9.6. Massiivi elementide väärtuste sisend ja väljund B(N).

Programmi fragment:

‘ Jäta muutujale N väärtuse omistamine, _

sisestatud vormi tekstiväljale txtN:

B(i) = InputBox("Sisesta element B(" & i & ")", _

"Sisendmassiivi B(" & N & ")))

print " "; B(i);

Funktsioon Sisestuskast() kuvab dialoogiboksi sulgemisnupu, etteantud teate, sisestusvälja ja nuppudega Okei,Tühista, päis (või ilma selleta). Kui sisestatakse number 12 - massiivi N suurus, siis meie näites näeb see aken esmapilgul välja selline:

Nagu näete, sõnum Sisestage element B(1) palub teil sisestada tekstikasti 1. elemendi väärtus. See aken ilmub 12 korda, kuna massiiv sisaldab 12 elementi. See tuleneb vormi päisest. Elemendi B(i) indeks viiba varieerub vahemikus 1 kuni 12.

Kui vormil on vaja kuvada ainult massiivi B(N) elementide väärtused, koosneb silmuse keha ühest lausest:

Massiivi elementide vaatamine nendega mõne toimingu tegemiseks toimub ka operaatori For…Next silmuse abil.

Toome näiteid ühemõõtmeliste massiivide töötlemisest.

Näide 9.7 . Maksimaalse elemendi määramine massiivi B(M).

Jättes välja algandmete sisestamise ja tulemuste väljundi, kirjeldame lühidalt algoritmi:

    Deklareerime muutuja Bmax, millesse sisestame massiivi esimese elemendi väärtuse ja muutuja Imax, millele omistame 1 - massiivi esimese elemendi indeksi.

    Silmuses, kasutades operaatorit For…Next, vaatame läbi kõik massiivi elemendid, alustades teisest. Kasutades operaatorit If…Then, võrdleme nende väärtusi muutujas Bmax salvestatud väärtusega.

    Kui selgub, et massiivi elemendi väärtus on suurem kui Bmax, määratakse Bmax selle elemendi väärtus ja Imax väärtus on selle massiivi elemendi indeks.

Pärast tsükli lõppu sisaldab muutuja Bmax maksimaalse elemendi väärtust ja Imax selle indeksit (arvu).

Algoritmi selle osa programm.

Bmax = B(1): Imax = 1

Kui B(i) > Bmax, siis Bmax = B(i): Imax = i

Näide 9.8. Positiivsete massiivi elementide summa, korrutise ja arvu määramineD(M).

Muutujad: S, P, K on vastavalt positiivsete elementide summa, korrutis ja arv.

Algoritm see määratlus:

    Muutujale S ja K omistame nulli, muutujale P omistame 1. Reeglina nullitakse need muutujad, kuhu summa kogutakse, siin on S ja k, enne tsüklit nulliks ja 1 omistatakse tsüklile. muutujad, mille alusel toode arvutatakse.

    Kasutades tsüklit For…Next, käime läbi kõik massiivi elemendid ja kontrollime, kas need on positiivsed (D(i) > 0).

    Kui selgub, et element on positiivne, siis lisame selle väärtuse summa S väärtusele ja salvestame uue summa samasse muutujasse. Korrutame muutuja P elemendi positiivse väärtusega ja salvestame selle samuti muutujasse P. Ja lisame muutujale K 1 ja salvestame uue väärtuse samasse muutujasse

Programm see algoritmi osa näeb välja selline:

S = 0: P = 1: K = 0

Kui D(i) > 0 Siis

S = S + D(i) ‘nii koguneb summa _

massiivi elementide positiivsed väärtused D(i)

P = P*D(i) ‘positiivse korrutise määratlus

"massiivi elemendid

K = K + 1 ‘ seda operaatorit nimetatakse COUNTER, siin see on

' määrab positiivsete massiivi elementide arvu

Näide 9.9. Paaritute massiivi elementide summa, korrutise, arvu ja keskmise määramineD(M).

Esitame sellise määratluse programmi fragmenti.

S = 0: P = 1: K = 0

Kui D(i) Mod 2<>0 Siis

Ssr = S/k ‘ paaritute elementide keskmise arvutamine

Võrrelge seda programmi fragmenti näites 9.8 oleva programmiga. See programm kordab peaaegu täielikult eelmist. Muudetud on ainult tingimust If-lauses. Tingimus D(i) Mod 2<>0 tähendab, et otsime massiivi D(i) elemente, mis ei jagu isegi 2-ga, st paarituid elemente. Kui kontrollime tingimust D(i) Mod 2 = 0, siis valime massiivi paariselemendid.

Nagu teate, jagunemine Mod annab tulemuseks jagamise ülejäänud osa täisarvudes. Näiteks pärast operaatori d= 34Mod4 täitmist on muutuja d võrdne 2-ga. Seega, et valida massiivi elemendid, mis on 4-kordsed, tuleb kontrollida tingimust D(i) Mod 4 = 0. olla sarnased, kui otsime elemente, mis on teiste arvude kordsed. 4 asemel kirjutatakse need teised numbrid.

Näide 9.10. Massiivi elementide kirjutamineR(N) jagub 5-ga teise massiivi ja kuvab uue massiivi vormil.

Teist massiivi tähistatakse näiteks tähega R5(N). Selle uue massiivi suurus tuleks eeldada algse massiiviga, kuna piirjuhul võivad kõik elemendid olla 5-kordsed.

Ülesande algoritm:

    Lähtestame loenduri k. Kasutades operaatorit For…Next silmus, vaatame läbi kõik R(N) massiivi elemendid.

    Kontrollime iga elemendi kordsust 5, kasutades operaatorit If…Then ja jagades massiivi elemendi Mod.

    Kui element on 5-kordne, siis kasutades loendurit nagu k=k+ 1, moodustame massiivi R5(N) indeksid alates 1-st ja kirjutame selle teise massiivi –R5(N).

    Kui k on nullist erinev, väljastage massiivR5() vormile.

    Kui k on võrdne nulliga, väljastame: "Ei ole elemente, mis on 5-kordsed".

Programmi fragment:

Kui R(i) Mod 5 Siis k = k + 1: R5(k) = R(i)

Kui k<>0 Siis

Trüki "5-ga jaguvaid elemente pole"

Silmuseid saab pesastada teistesse silmustesse.

Näitame tööd pesastatud silmused . Allpool korraldab programm tsükliloendurite i, j ja k väärtuste väljundi. i,j,k väljundist selgub, kuidas pesastatud silmuseid täidetakse.

Privaatne alam frmCycle_DblClick()

ScaleMode = 4 ühikut – sümbolid

Kui i = 1 kuni 3 ‘välimine silmus

Prindi "i ="; i;

Kui j = 1 kuni 4 "1. pesastatud silmus".

PraeguneX = tekstilaius("i = 1") + 5

Prindi "j="; j;

PraeguneX = tekstilaius("i = 1 j = 1") + 7

Kui k = 1 kuni 5 ‘2. pesastatud silmus

Kuvatav vorm (joonis 1) näitab kõigi kolme ahela loendurite kuvamise tulemusi: välimine silmus - loendur i, esimene pesastatud silmus - counterj ja teine, kõige sisemine silmus - loendur. Nagu näeme, välimise ahela "aeglaseim" loendur(poi) ja “Kiireim” on sisemise ahela loendur (vastavaltk).

Programm käivitatakse pärast hiire vasaku nupuga frmCicli vormi topeltklõpsamist.

CurrentX, CurrentY - vormi atribuudid, mis määravad lähtepunkti X, Y koordinaadid teabe väljastamiseks printmeetodil (vt X- ja Y-telgede asukohta vormil joonisel 1).

TextWidth() on funktsioon, mis tagastab funktsioonis antud teksti laiuse argumendina jutumärkides.

Pesastatud silmuseid kasutatakse kahemõõtmeliste massiivide (maatriksite) töötlemisel. Kuid mõnes ülesandes, välja arvatud kahemõõtmelise massiivi elementide sisend ja väljund, saate piirduda ühe tsükliga. Mõelge mõnele maatriksprogrammeerimise näitele.

Näide 9.11. Täisarvude maatriksi (kahemõõtmelise massiivi) sisend ja väljundintA(N).

Saate sisestada maatriksi ridade ja veergude kaupa . Lihtsam on – rida-realt, kui massiivi elementide väljund vormile programmeeritakse kohe pärast nende sisestamist.

Maatriksi sisend ja väljundrida rea ​​haaval - fragment 1.

Dim M täisarvuna, N täisarvuna, i täisarvuna, j täisarvuna

Dim intA() Täisarvuna deklareerib dünaamilise massiivi

M = Val(txtN.Text) ‘ M on ridade arv

N = Val(txtN.Text) ‘ N on veergude arv

ReDim intA(M, N) Täisarvuna ’ määratlege massiiv uuesti

Kui i = 1 kuni M ‘, säilitan oma väärtuse kuni lõpuni

'pesastatud tsüklit j-l ei käivitata

print " "; intA(i, j); ‘ rida-realt väljund

Print ‘hüppa uue rea algusesse

Maatriksi sisestamiseks veergude kaupa on vaja teha välimine tsükkel j-le (määrab veergude numbrid) ja sisemine tsükkel i-le (määrab ridade numbrid).

Maatriksi sisend ja väljundveergude kaupa fragment 2.

PrY = 2500: CurrentY = PrY ‘ PrY määrab alguse Y-koordinaadi

‘ väljasta vormi iga veeru esimene element

Kui j = 1 kuni N ‘ j säilitab oma väärtuse kuni täieliku väärtuseni

'pesastatud tsüklit i-l ei käivitata

intA (i, j) = InputBox("Sisesta element intA(" & i & "," & j & ")", _

"Maatrikssisend intA(" & M & "," & N & ")")

Print Tab(6 * j); intA(i, j) ‘ kuva veergude kaupa

CurrentY = PrY ' esimese elemendi kuvamiseks

' järgmine veerg

See programmi teine ​​fragment ei korda esimesest fragmendist 5 esimest rida. Funktsioon Tab(6 * j) määrab väljundi alguse reale (märkides), mis algab vormi vasakust servast. PrY koordinaat on siin 2500 twips, kuid saate valida mõne muu väärtuse.

Näide 9.12 . Massiivi elementide väärtuste järjestamineV(N) Kasvav.

Massiivide järjestamiseks on mitu algoritmi. Siin on üks neist: kasutades pesastatud silmuseidSestEdasivalige elemendid esimesest eelviimaseni ja võrrelge neid järgnevate elementidega; kui selgub, et järgmine element on väiksem kui valitud, vaheta need ära.

Seda algoritmi rakendava programmi fragment:

Kui i = 1 kuni N - 1

Kui j = i + 1 kuni N

Kui V(j)< V(i) Then P = V(i): V(i) = V(j): V(j) = P

Selgitame seda programmi fragmenti.

Välise tsükli abil loenduriga i valime järgnevate elementidega võrdlemiseks elemendi V (i). Sisemine tsükkel loenduriga j valib võrdluseks V(j) järgmised elemendid. J algväärtus on i + 1. See on esimene element järgnevast.

Elementide V(i) ja V(j) väärtuste vahetamiseks võtame kasutusele muutuja P, millesse “peidame” ajutiselt ühe massiivi elemendi väärtuse (programmis on see V(i) )). Seejärel omistatakse elemendile V(i) elemendi V(j) väärtus ja elemendile V(j) väärtus V(i), mis salvestatakse muutujasse P. Kui me “peidame” V(j) väärtuse P-s, siis on väärtusvahetuse kood järgmine: P = V(j): V(j) = V(i): V(i) = P. tulemus ei muutu.

To sortida massiiv kahanevas järjekorras, piisab, kui kirjutada kontrollimise tingimus kujul V(j) > V(i), st muuta ebavõrdsusmärk teise vastu.

Kui massiiv ei ole numbriline, vaid string ja massiivi elemendid on täidetud perekonnanimedega, siis näite 9.12 programmi kasutades saate perekonnanimede loendit järjestada tähestikulises järjekorras. Fakt on see, et arvutis kasutatavate tähestiku tähtede puhul kehtivad ebavõrdsused: A< Б < В < Г….< Я и т. д., поскольку числовые коды букв алфавита последовательно увеличиваются, начиная с А и до конца алфавита. Это же справедливо и для букв английского алфавита.

Näide 9.13 . Maatriksi paaritute veergude positiivsete elementide summa arvutamineF(M, N) ja summade kuvamine vormil.

Programmi algoritm:

    Kasutades välimist tsüklit sammuga 2, moodustame maatriksi paaritute veergude indeksi, alustades esimesest veerust.

    Lähtestame summa S, millesse kogutakse positiivsete elementide summa.

    Sisemises tsüklis kontrollime massiivi elemendi märki.

    Kui massiivi element on positiivne (> 0), arvutage summa S.

    Pärast sisemise tsükli lõppu sisestage vormile summa S.

Fragment programmid:

Kui j = 1 kuni N, 2. samm

Kui F(i, j) > 0, siis S = S + F(i, j)

Trüki "Veeru summa"; j; ":"; S ‘j on veeru number!

Pesastatud silmused võimaldavad teil korraldada valikute loetlemine ja lahendada probleeme, mida ei saa analüütiliselt lahendada. Loendamise tulemusena saadakse lahendused, mille hulgast valitakse välja üks või mitu ülesande tingimusele vastavat.

Näide 9.14. Seal on 1801 rubla. Kui palju saab osta šokolaadi 31 rubla eest. ja rull 18 rubla eest, et kogu raha täielikult ära kulutada.

Programm:

Summa = 1801

Kõik šokolaadid = summa \ 31: kõik kuklid = summa \ 18

Kui i = 1 Kõigile šokolaadidele

Kui j = 1 To AllBulki

Hind = i * 31 + j * 18 ‘ostuhind kokku

Kui hind = 1801, siis

Prindi "Šokolaad:"; i; Tab(19); "Bulok:"; j

Selgitame programmi, milles kasutame venekeelseid muutujaid.

Esiteks teeme kindlaks, kui palju saab kogu summa eest osta ainult šokolaadi või ainult rullikesi. Saadud VseChocolate ja VseBulki väärtusi kasutatakse otsingute arvu piiramiseks šokolaadide ja rullide arvu järgi. Šokolaadide arvu (i) ja rullide arvu (j) iga väärtuse jaoks määrame nende ostu koguhinna. Kui arvutatud Hind on 1801, siis on valitud variant üks probleemi lahendustest.

Funktsioon Tab() määrab, millises kohas vormi servast sellele funktsioonile järgnev teave kuvatakse. Kui Tab(19), siis 19. positsioonilt.

Programm kuvab 3 võimalikku ostuvõimalust:

Šokolaad 7, rullid 88

Šokolaad 25, rullid 57

Šokolaad 43, rullid 26

Kui soovid anda üheselt mõistetavat vastust, tuleb sõnastada lisatingimus. Näiteks "osteti vähem kukleid kui šokolaadi." Siis oleks ainus lahendus 3. variant.

On palju matemaatilisi probleeme, mis lahendatakse lihtsalt pesastatud tsükliga programmeerimise itereerimisega.