Scrieți o condiție de buclă for în vba. Bucle VBA (Partea 1). Echipe pentru organizarea ciclurilor. Buclă cu argumente negative

Pe lângă structurile decizionale, există un alt tip de structură de control numită ciclu.

Ciclu este o structură algoritmică cu ajutorul căreia se implementează mai multe repetiții ale blocurilor de operatori.

Există trei tipuri principale de bucle în Visual Basic, care sunt implementate folosind constructele For:Next, Do:Loop și While:Wend.

Pentru: bucla următoare. Folosit atunci când numărul de repetări ale unui anumit bloc de instrucțiuni este cunoscut în prealabil. Acest design arată astfel:

Pentru contor = valoarea inițială Până la valoarea finală Operatori1 Operatori2 Următorul [contor]

Când instrucțiunile de mai sus sunt executate pentru prima dată, variabilei contor i se atribuie o valoare inițială, după care sunt posibile două opțiuni. Dacă în urma verificării contorului de condiție > valoarea finală, se obține valoarea True, atunci bucla se termină, iar blocurile operators1 și operators2 nu sunt niciodată executate. Pe de altă parte, dacă rezultatul testului de condiție este Fals, atunci blocurile de instrucțiuni sunt executate prima dată, după care are loc trecerea la începutul buclei. În continuare, valoarea variabilei contor este mărită cu un pas situat după cuvântul cheie Step (dacă este absent, este setat pasul = 1). După aceasta, se verifică din nou adevărul contorului de condiție > valoarea finală etc., sfârșitul buclei are loc în momentul în care rezultatul acestei verificări este valoarea True.

Este adesea necesar să se încheie o „urgență” în buclă atunci când este îndeplinită o condiție suplimentară. În acest caz, în interiorul buclei, ar trebui să utilizați expresia de serviciu Exit:For, care este de obicei plasată într-un construct de control, de exemplu:

Dacă condiția Atunci Ieșire Pentru

Dacă rezultatul verificării condiției este adevărat, atunci execuția buclei va fi încheiată și blocul operator1 va fi executat din nou, dar blocul operator2 nu.

Do: Buclă. Este utilizat atunci când numărul de repetări ale operatorilor de corp buclă este necunoscut în prealabil. Există patru varietăți ale acestui design. Când folosiți primele două, bucla fie va fi executată de multe ori, fie deloc.

Instrucțiuni de buclă de condiție Do Until

Dacă rezultatul verificării condiției este Fals, atunci blocul de instrucțiuni este executat, în caz contrar trecerea la instrucțiunea situată după cuvântul de serviciu Loop. Pe de altă parte, dacă primul test al condiției returnează rezultatul Adevărat, atunci bucla nu va fi executată nici măcar o dată.

Do While Condition Loop declarații

Dacă condiția este adevărată, atunci blocul de instrucțiuni este executat, dar dacă este fals, adică rezultatul verificării este Fals, atunci bucla nu va fi executată nici măcar o dată.

Dacă se folosesc ultimele două constructe, bucla va fi executată cel puțin o dată.

Efectuați bucla de instrucțiuni până la condiție

Blocul de instrucțiuni este executat atâta timp cât rezultatul testului de condiție este Fals, altfel bucla se termină.

Efectuați bucla de instrucțiuni în timpul condiției

Dacă condiția este falsă, blocul de instrucțiuni este executat, dar dacă este adevărat, i.e. Rezultatul verificării este Adevărat, apoi are loc sfârșitul ciclului.

Bucla While:Wend. Este, de asemenea, utilizat atunci când numărul de repetări ale instrucțiunilor buclei este necunoscut în prealabil și are următoarea sintaxă:

În timp ce starea Wend declarații

Dacă rezultatul verificării condiției este True, atunci blocul de instrucțiuni este executat, în caz contrar trecerea la instrucțiunea situată după cuvântul de serviciu Wend. Pe de altă parte, dacă primul test al condiției are ca rezultat False, atunci bucla nu va fi executată nici măcar o dată.

VBA. Organizarea ciclurilor.

Instrucțiunile buclă sunt folosite pentru a repeta o acțiune sau un grup de acțiuni de un număr specificat de ori. Numărul de repetări (iterații în buclă) poate fi predeterminat sau calculat.

VBA acceptă două tipuri de constructe în buclă:

  1. Bucle cu un număr fix de repetări ( bucle contracate).
  2. Bucle cu un număr nedefinit de repetări ( bucle condiționate).

Pentru toate tipurile de cicluri se utilizează conceptul corpul buclei , care definește un bloc de instrucțiuni incluse între instrucțiunile de început și de sfârșit ale buclei. Se numește fiecare repetare a execuției instrucțiunilor corpului buclei repetare

Cicluri fixe

VBA oferă două structuri de control pentru organizarea unei bucle fixe: For ... Next (bucla cu un contor) și For Each ... Next (bucla cu o enumerare).

Operator pentru... În continuare Aceasta este o buclă tipică de contor care execută un număr specificat de iterații. Sintaxa instrucțiunii For...Next este:

Pentru<счетчик> = <начЗначение>Acea<конЗначение>

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

Următorul [<счетчик>]

Un exemplu de utilizare a operatorului For...Next.

Listare 1. Pentru... Următorul operator

‘ SARCINA: Creați un program care primește două numere de la utilizator.

‘ Adaugă toate numerele din intervalul specificat de aceste două numere și apoi

‘ afișează suma rezultată.

Subeșantion7()

Dim i As Integer ‘contor de cicluri

Dim sStart „valoarea inițială a contorului

Dim sEnd ‘valoarea contorului final

Dim sSum As Long ‘suma rezultată

sStart = InputBox(„Introduceți primul număr:”)

sEnd = InputBox(„Introduceți al doilea număr:”)

sSum = 0

Pentru i = CInt(sStart) To CInt(sEnd)

sSum = sSum + i

Apoi eu

MsgBox „Suma numerelor de la „ & sStart & ” la „ & sEnd & ” este: „ & sSum

End Sub

Declarație buclă pentru fiecare... În continuareaparține categoriei operatorilor de tip obiect, adică. se aplică în primul rând colecțiilor obiecte, precum și matrice . Corpul buclei este executat de un număr fix de ori, corespunzător numărului de elemente din matrice sau colecție. Pentru fiecare... formatul de declarație următor:

Pentru fiecare<элемент>În<группа> <блок операторов>Următorul [<элемент>]

Bucle condiționate (bucle nedefinite)

Buclele condiționate sunt utilizate atunci când acțiunile repetate trebuie efectuate numai în anumite condiții. Numărul de iterații nu este definit și, în general, poate fi egal cu zero (în special, pentru bucle cu o precondiție). VBA oferă dezvoltatorilor mai multe structuri de control pentru organizarea buclelor condiționate:

  • Patru tipuri de Do..Loops, care diferă în funcție de tipul de condiție care este verificată și de timpul necesar pentru a finaliza această verificare.
  • Buclă continuă în timp ce... Wend.

Bucla Do While... este tipică buclă cu precondiție. Condiția este verificată înainte ca corpul buclei să fie executat. Ciclul își continuă activitatea până când acesta<условие>este executat (adică are valoarea True). Deoarece verificarea este efectuată la început, corpul buclei nu poate fi executat niciodată. Do While... Format buclă:

Face în timp ce<условие>

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

Buclă

Lista 2. Do While... Loop

‘ SARCINA: Creați un program care necesită intrarea utilizatorului

„o succesiune arbitrară de numere. Intrarea trebuie să fie terminată

„ numai după ce suma numerelor impare introduse depășește 100.

Subeșantion8()

Dim OddSum As Integer „suma de numere impare”.

Dim OddStr As String „un șir cu numere impare

Dim Num pentru a accepta numerele introduse

OddStr = „” ‘inițializarea șirului de ieșire

OddSum = 0 ‘inițializați OddSum

Do While OddSum< 100 ‘начало цикла

Num = InputBox(„Introduceți un număr: “)

Dacă (Număr Mod 2)<>0 Apoi „verificarea parității”.

OddSum = OddSum + Num „acumularea sumei numerelor impare

OddStr = OddStr & Num & ” ”

Încheiați dacă

Buclă

„Tipărește un șir cu numere impare

MsgBox prompt:=”Numere impare: ” & OddStr

End Sub

Do... Instrucțiunea Loop Whileconcepute pentru organizarebuclă cu postcondiție. Condiția este verificată după ce corpul buclei a fost executat cel puțin o dată. Ciclul își continuă activitatea până când<условие>rămâne adevărat. Do... Loop While Format:

Do<блок операторов>Buclă în timp ce<условие>

Lista 3. Buclă cu postcondiție

SARCINA: Creați un program pentru jocul „Ghicește numărul”. Programul trebuie să fie aleatoriu

„Modul de a genera un număr în intervalul de la 1 la 1000, utilizatorul trebuie

ghici acest număr. Programul afișează un indiciu pentru fiecare număr introdus

' "mai mult sau mai putin".

Subeșantion8()

Randomize Timer „inițializați generatorul de numere aleatorii

Dim msg As String ‘ șirul de mesaj

Dim SecretNumber As Long, UserNumber As Variant

Începe: SecretNumber = Round(Rnd * 1000) ‘ număr generat de computer

UserNumber = Numărul gol introdus de utilizator

Faceți un joc

Selectați Case True

Case IsEmpty(UserNumber): msg = „Introduceți un număr”

Case UserNumber > SecretNumber: msg = „Prea multe!”

Număr de utilizator al cazului< SecretNumber: msg = “Слишком мало!”

Încheierea selectării

UserNumber = InputBox(prompt:=msg, Title:=”Ghicește numărul”)

Loop While UserNumber<>Număr secret

' examinare

Dacă MsgBox(„Jucați din nou?”, vbDaNu + vbÎntrebare, „Ați ghicit!”) = vbDa Atunci

GoTo Begin

Încheiați dacă

End Sub

Loops Do Until... Loop and Do... Loop Until sunt inversiuni ale buclelor condiționale discutate anterior. În general, ele funcționează în mod similar, cu excepția faptului că corpul buclei este executat dacă condiția este falsă (de ex.<условие>= Fals). Faceți până la... Format buclă:

Fă până la<условие> <блок операторов>Buclă

Efectuați... Buclă până la formatul buclei:

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

Buclă până la<условие>

Sarcina practica:Rescrieți programele din listele 10 și 11 folosind instrucțiuni de buclă inversată.

Loop While...Wend se aplică și buclelor condiționate. Acest operator este pe deplin în concordanță cu structura Do While... Loop. While...Format buclă Wend:

In timp ce<условие>

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

Merge încet

O caracteristică distinctivă a acestui operator este imposibilitatea de a forța finalizarea (întreruperea) corpului buclei (operatorul Exit Do nu funcționează în bucla While ... Wend).

Întreruperea unui ciclu

Pentru a termina o iterație mai devreme și a ieși din buclă, este utilizată instrucțiunea Exit. Acest operator este aplicabil în orice structură ciclică, cu excepția While... Wend. Sintaxa generală pentru utilizarea Exit pentru a întrerupe o buclă este:

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

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

Ieșire (Pentru | Faceți)

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

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

Când instrucțiunea Exit este executată, bucla este întreruptă și controlul este transferat instrucțiunii care urmează instrucțiunii<конец_цикла>. Pot exista mai multe instrucțiuni Exit în corpul unei bucle.

Lista 4. Forțați ieșirea din buclă

Subeșantion9()

Pentru i = 1 până la 10000000

Dacă i = 10, atunci Exit For ‘ ieși din buclă când contorul ajunge la 10

Următorul

Instrucțiuni de buclă

În VBA Există două tipuri principale de bucle: bucle cu un numărător (parametric) și bucle cu o condiție (iterativă).

Buclele contrare sunt utilizate în cazurile în care este necesar să se efectueze anumite acțiuni de un anumit număr de ori.

Buclele condiționate sunt folosite atunci când anumite acțiuni dintr-un program trebuie repetate până când este îndeplinită o anumită condiție.

Bucle cu parametru Pentru următorul

Structura ciclului:

Pentru Cycle_parameter = Initial_Value La Valoarea_finală

[Pas Pas]

Operatori

[Ieșire pentru]

Următorul [Parametru_ciclului]

unde Pentru cuvânt cheie VBA (de la), indicând începutul ciclului;

variabilă loop_parameter definită ca un numărător de bucle;

Initial_Value un număr care specifică valoarea inițială a parametrului buclei;

La cuvântul cheie VBA (înainte), împărțire

Valoarea_inițială și Cunoștințe_finale;

Final_Value un număr care specifică valoarea parametrului buclei,

La care se termină ciclul;

Cuvânt cheie pas VBA (pas) folosit pentru

Specificații pentru pasul buclei, argument opțional;

Pas un număr care specifică pasul ciclului, de ex. valoarea cu care

Crește (sau scade) valoarea parametrului

Ciclu la fiecare pas. Acest număr ar putea fi

Negativ;

Ieșire pentru operator de ieșire anticipată din buclă (opțional);

Următorul cuvânt cheie VBA (următorul) denotă

Sfârșitul ciclului.

Ciclu de lucru:

Pasul 1 În primul rând, se determină parametrul buclei, iar valorile inițiale și finale ale acestei variabile sunt calculate și stocate.

Pasul 2 Parametrului buclă i se atribuie o valoare inițială.

Pasul 3 Valoarea inițială a parametrului buclei este comparată cu valoarea finală.

Dacă parametrul buclei este mai mare decât valoarea finală, programul iese imediat din buclă și sare la linia de cod care urmează buclei.

Pasul 4 Corpul buclei este executat.

Pasul 5 După executarea corpului buclei, următoarea valoare este atribuită parametrului buclei. Treceți la pasul 3.

Notă.

1. Dacă este folosit un cuvânt cheie Etapa , apoi parametrul buclei se modifică în funcție de numărul specificat după acest cuvânt. Dacă cuvântul Etapa este absent, atunci valoarea pasului este egală cu unu.

Exemplul 1.

Pentru I = 0 până la 10 Pasul 2 (valoarea I va crește cu 2)

2. Pentru... bucla următoare poate fi terminat devreme atunci când este atinsă orice condiție. Pentru a face acest lucru, la locul potrivit în buclă trebuie să plasați operatorul Ieșire pentru.

Exemplul 2.

Dim S ca întreg

Dim j ca întreg

S=2

Pentru j = 1 până la 10

S = S + j

Dacă S > 6 Atunci

Ieșire pentru (Ieșiți din buclă dacă valoarea S > 6)

Încheiați dacă

Următorul j

MsgBox(S)

Bucle condiționate (iterative)

Dacă o acțiune (mai multe acțiuni) trebuie efectuată de mai multe ori, dar nu se știe dinainte de câte ori și acest lucru depinde de o anumită condiție, atunci ar trebui să utilizați o buclă cu o precondiție sau o postcondiție.

În VBA există două bucle principale FĂ... BUCLĂ cu o condiție introdusă de un cuvânt cheie In timp ce , și cu condiția introdusă de cuvântul cheie Pana cand . Ambele pot fi cu precondiție sau postcondiție.

Sintaxă:

unde Do cuvânt cheie (a face);

In timp ce cuvânt cheie (încă);

Pana cand cuvânt cheie (până la);

Buclă un cuvânt cheie care indică sfârșitul ciclului;

<условие>o expresie logică al cărei adevăr este verificat

La începutul fiecărei execuții a corpului buclei;

<тело_цикла>succesiune arbitrară de operatori;

Fă... În timpul construcției citește: fă în timp ce condiția este îndeplinită. În proiectare Fă... În timp ce Pentru

The Do...Until construcție citește: faceți până când condiția este îndeplinită. În proiectare Fă... Până la Pentru a crește pasul, ar trebui să scrieți un operator special, deoarece în ea, spre deosebire de design Pentru , acest lucru nu se face automat.

Condiție scrisă după cuvântul cheie Pana cand , este verificat la sfârșitul fiecărei iterații (după ce corpul buclei este executat). Rețineți că nu funcționează exact la fel ca în buclă In timp ce . Dacă condiția este adevărată ( Adevărat ), apoi bucla se termină. Dacă condiția nu este îndeplinită (este falsă Fals ), apoi corpul buclei este executat din nou.

Exemplul 1.

Formularea problemei. Calculați suma unei serii finite folosind o procedură de subrutină.

Tehnologia de executare a sarcinilor:

1. Date inițiale: i  Z

Rezultat: S  R .

2. Introduceți următoarea procedură personalizată în modulul de proiect standard folosind o buclă cu o precondiție In timp ce:

Sub summa()

Dim S ca întreg

Dim i ca întreg

S=0

i = 1

Faceți în timp ce i<= 10

S = S + i^2

i = i + 1

Buclă

MsgBox(S)

End Sub

3. Introduceți următoarea procedură personalizată în modulul de proiect standard folosind o buclă cu o precondiție Pana cand:

Sub summa()

Dim S ca întreg

Dim i ca întreg

S=0

i = 1

Faceți până la i > 10

S = S + i^2

i = i + 1

Buclă

MsgBox(S)

End Sub

4 Introduceți următoarea procedură personalizată în modulul de proiect standard folosind o buclă cu o postcondiție In timp ce:

Sub summa()

Dim S ca întreg

Dim i ca întreg

S=0

i = 1

S = S + i^2

i = i + 1

Buclă în timp ce i<= 10

MsgBox(S)

End Sub

5 Introduceți următoarea procedură personalizată în modulul de proiect standard folosind o buclă cu o postcondiție Pana cand:

Sub summa()

Dim S ca întreg

Dim i ca întreg

S=0

i = 1

S = S + i^2

i = i + 1

Buclă până la i > 10

MsgBox(S)

End Sub

Sintaxa operatorului:

PentruTejghea= start ToSfârşit[EtapaEtapa]

Block_Operators

UrmătorulTejghea

Aici este indicat:

Pentru Pentru (cuvânt cheie obligatoriu VB);

La inainte de (cuvânt cheie obligatoriu VB);

Block_Operators– unul sau mai mulți operatori apelați corpul ciclului;

Tejghea - o variabilă întreagă care numără numărul de bucle executate;

Început, sfârșit - valorile inițiale și finale ale contorului;

Etapa pas(cuvânt cheieVB);

Etapa - pasul de contraschimbare; poate fi negativ; parametrul este opțional, deoarece dacă pasul este 1, puteți să faceți un pas Etapa inferior;

Următorul – următorul (cuvânt cheie obligatoriu VB, intrarea operatorului final al buclei).

Contravaloare (Început, Sfârșit) poate fi constantele numerice sau variabilele de tip întreg sau real, pot fi numere negative sau pozitive. Pentru ca corpul buclei să fie executat cel puțin o dată, trebuie să existe Început ≤ Sfârșit, Dacă Etapa> 0 și Început ≥ Sfârșit, Dacă Etapa< 0. De îndată ce se dovedește că Tejghea>Sfârşit ( Dacă start< Конец), Execuția buclei se termină. Dacă Start =Sfârşit, bucla va fi executată o dată;

Exemplul 9.1 .Evaluarea funcțieiY = 2 – 1.5 Sinxcând X se modifică în trepte de 0,2 în interval.

Un fragment dintr-un program pentru calcularea Y și afișarea argumentului X și a funcției Y:

Pentru X = 0 până la 2,4 Pasul 0.2

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

Pentru a înțelege cum funcționează această buclă, iată un program pentru o buclă similară creată folosind operatorMergi la, etichete, operatorDacăApoi.

M1: X = X + 0,2

Daca X<= 2.4 Then

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

Să vedem cum funcționează acest program. Primul calcul Y este nestandard, ca și cum ar ieși din ciclu. Ciclul începe după primul transfer al controlului GoToM1 la eticheta M1. În linia etichetată M1, argumentul X este mărit cu un pas de 0,2 și se face imediat o verificare pentru a vedea dacă noua valoare a lui X depășește valoarea finală de 2,4. Dacă nu depășește, atunci calculul lui Y se repetă cu acest nou X. Apoi operatorul GoToM1 este executat din nou - transferând controlul pe linia etichetată M1. Aceste iterații (cicluri) de calcul al lui Y se vor încheia de îndată ce X depășește 2,4.

Acum să comparăm programul cu If cu bucla For...Next.

Pentru X = 0 până la 2,4 Pasul 0.2

înlocuiește două linii

M1: X = X + 0,2

Daca X<= 2.4 Then

Sunt ultimele două linii de cod care sunt executate în bucla For, dar nu le vedem. Le-am codificat cu linia cFor... Linia de cod GoTo M1 este codificată cu cuvântul Next X (literalmente: următorul X). Acest lucru are ca rezultat un design compact.

Când utilizați bucla For...Next, trebuie să învățați cum să utilizați contorul de bucle pentru a rezolva diverse probleme. Pentru a vă da seama cum să utilizați un contor pentru a rezolva o problemă, trebuie analizați formularea problemei, găsiți modele de modificări ale unor parametri ai problemei.

Exemplul 9.2 . Determinarea sumei elementelor unei serii: .

Fragment de program:

S = 0 ‘ S – suma seriei

Pentru i = 1 La 16 ‘ contorul i este numitorul fracției

S = S + 1/i ‘ acumularea sumei

Tipăriți „S = „; S ‘ scoate suma S în formă

Pentru fiecare valoare a contorului i, expresia 1/i formează secvenţial elementele seriei, începând de la 1.

Exemplul 9.3 . Calcularea sumei unei serii de elemente
.

Fragment de program:

S = 0 ‘ S – suma seriei

Pentru i = 1 La 18 ‘ contorul i – numărător

S = S + i/(i + 1) ‘ numitorul este cu 1 mai mare decât numărătorul

Tipăriți „S = „; S ‘ scoate suma S în formă

Exemplul 9.4 . Calculul sumei: 5 + 8 + 11 + … + 32 + 35

Fragment de program:

S = 0 ‘ S – suma seriei

Pentru i = 5 la 35 Pasul 3 ‘ obținem aritmetica _

progresie cu numitorul 3

Tipăriți „S = „; S

Exemplul 9.5. Calcularea sumei pentru un x dat:

Analiza problemei arată că gradul lui X variază de la 1 la 10. În acest caz, numărătorul din coeficientul lui X este mai mare decât gradul cu 1, iar numitorul cu 2. Vom forma valoarea gradului folosind contor i. Apoi puteți crea un program ca acesta (fragment):

S = 1 ‘ S – suma seriei

Pentru i = 1 până la 10’ ca și contorul i, gradul se schimbă la X

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

Tipăriți „S = „; S

CicluriPentruUrmătorulfolosit pentruintrare ieșire Șiprocesare matrice .

Exemplul 9.6. Intrarea și ieșirea valorilor elementelor matricei B(N).

Fragment de program:

„Omitem atribuirea valorii variabilei N, _

introdus în formular în câmpul de text txtN:

B(i) = InputBox("Introduceți elementul B(" & i & ")", _

„Matrice de intrare B(” & N & “)”)

Imprimare " "; B(i);

Funcţie InputBox() afișează o casetă de dialog cu un buton de închidere, un mesaj specificat, un câmp de introducere, butoane Bine,Anulare, cu un antet dat (sau fără el). Dacă este introdus numărul 12 - dimensiunea matricei N, atunci în exemplul nostru, când apare pentru prima dată, această fereastră va arăta astfel:

După cum vedem, mesajul Introduceți elementul B(1) vă solicită să introduceți valoarea primului element în caseta de text. Această fereastră va apărea de 12 ori deoarece matricea conține 12 elemente. Aceasta rezultă din titlul formularului. Indicele elementului B(i) din invitație va varia de la 1 la 12.

Dacă doriți să afișați numai valorile elementelor matricei B(N) pe formular, atunci corpul buclei va consta dintr-o declarație:

Vizualizarea elementelor de matrice pentru a efectua unele acțiuni asupra lor se face și folosind operatorul de buclă For...Next.

Să dăm exemple de prelucrare a tablourilor unidimensionale.

Exemplul 9.7 . Determinarea elementului maxim din tabloul B(M).

Excluzând intrarea datelor inițiale și ieșirea rezultatelor, descriem pe scurt algoritmul:

    Să declarăm o variabilă Bmax, în care vom introduce valoarea primului element al tabloului, și o variabilă Imax, căreia îi vom atribui 1 - indicele primului element al tabloului.

    Într-o buclă, folosind operatorul For...Next, ne uităm prin toate elementele matricei, începând cu al 2-lea. Folosind operatorul If...Then, le comparăm valorile cu valoarea stocată în variabila Bmax.

    Dacă se dovedește că valoarea unui element de matrice este mai mare decât valoarea lui Bmax, atunci Bmax i se atribuie valoarea acestui element, iar valorii Imax i se atribuie indexul acestui element de matrice.

După terminarea buclei, variabila Bmax va conține valoarea elementului maxim, iar Imax va conține indicele (numărul).

Programul pentru această parte a algoritmului.

Bmax = B(1): Imax = 1

Dacă B(i) > Bmax Atunci Bmax = B(i): Imax = i

Exemplul 9.8. Determinarea sumei, produsului și numărului de elemente pozitive ale unui tablouD(M).

Variabile: S, P, K – respectiv suma, produsul și numărul elementelor pozitive.

Algoritm o astfel de definitie:

    Atribuim zero variabilei S și K și atribuim 1 variabilei P. De regulă, variabilele în care se acumulează suma, aici este S și k, sunt întotdeauna resetate la zero înainte de buclă, iar variabilele din cărora se calculează produsul sunt atribuite 1.

    Folosind bucla For...Next, parcurgem toate elementele tabloului și verificăm dacă sunt pozitive (D(i) > 0).

    Dacă se dovedește că elementul este pozitiv, atunci adăugăm valoarea lui la valoarea sumei S și stocăm noua sumă în aceeași variabilă. Înmulțim variabila P cu valoarea pozitivă a elementului și, de asemenea, o stocăm în variabila P. Și adăugăm 1 la variabila K și stocăm noua valoare în aceeași variabilă

Program Această parte a algoritmului arată astfel:

S = 0: P = 1: K = 0

Dacă D(i) > 0 Atunci

S = S + D(i) ‘ așa se acumulează suma _

valori pozitive ale elementelor matricei D(i)

P = P*D(i) ‘ definiția produsului pozitiv

‘ elemente de matrice

K = K + 1 ‘ acest operator se numește COUNTER, iată-l

‘ definește numărul de elemente de matrice pozitive

Exemplul 9.9. Găsirea sumei, produsului, numărului și mediei elementelor de matrice impareD(M).

Iată un fragment dintr-un program pentru o astfel de definiție.

S = 0: P = 1: K = 0

Dacă D(i) Mod 2<>0 Atunci

Ssr = S/k ‘ calcularea mediei elementelor impare

Comparați acest fragment de program cu programul din Exemplul 9.8. Acest program îl repetă aproape complet pe cel precedent. Doar condiția din instrucțiunea If s-a schimbat. CondițiaD(i) Mod 2<>0 înseamnă că căutăm elemente ale matricei D(i) care nu sunt divizibile egal cu 2, adică elemente impare. Dacă verificăm condiția D(i) Mod 2 = 0, atunci vom selecta elemente pare ale matricei.

După cum se știe, împărțirea după Mod dă restul diviziunii în numere întregi. De exemplu, după executarea operatorului d = 34Mod4, variabila d va fi egală cu 2. Prin urmare, pentru a selecta elemente de matrice care sunt multipli de 4, trebuie să verificăm condiția D(i) Mod 4 = 0. Condiția va fi asemănător dacă căutăm elemente care sunt multipli ai altor numere. Aceste alte numere vor fi scrise în loc de 4.

Exemplul 9.10. Scrierea elementelor de matriceR(N), multipli de 5, într-o altă matrice și scoaterea noului tablou în formular.

Să notăm o altă matrice, de exemplu, R5(N). Mărimea acestei noi matrice ar trebui presupusă a fi aceeași cu cea inițială, deoarece în cazul extrem toate elementele pot fi multipli de 5.

Algoritmul problemei:

    Resetare contor k. Folosind operatorul de buclă For...Next, ne uităm prin toate elementele matricei R(N).

    Verificăm fiecare element pentru un multiplu de 5 folosind operatorul If...Then și împărțind elementul de matrice la Mod.

    Dacă elementul este multiplu de 5, atunci folosind un numărător de tip k=k+ 1 formăm indicii tabloului R5(N), începând de la 1, și îl scriem în această altă matrice –R5(N).

    Dacă k este diferit de zero, afișați tabloul R5() pe formular.

    Dacă k este egal cu zero, rezultă: „Nu există elemente divizibile cu 5”.

Fragment de program:

Dacă R(i) Mod 5 Atunci k = k + 1: R5(k) = R(i)

Dacă k<>0 Atunci

Tipăriți „Fără elemente divizibile cu 5”

Buclele pot fi imbricate în alte bucle.

Să demonstrăm munca bucle imbricate . Programul de mai jos afișează valorile contoarelor de ciclu i, j și k. Din rezultatul lui i, j, k, devine clar cum sunt executate buclele imbricate.

Sub privat frmCycle_DblClick()

ScaleMode = 4 ‘unități – simboluri

Pentru i = 1 La 3 ‘bucla exterioară

Tipăriți „i =”; eu;

Pentru j = 1 la 4 „prima buclă imbricată

CurrentX = TextWidth("i = 1") + 5

Tipăriți „j =”; j;

CurrentX = TextWidth("i = 1 j = 1") + 7

Pentru k = 1 La 5 ‘a doua buclă imbricată

Forma prezentată (Fig. 1) arată rezultatele ieșirii contoarelor tuturor celor trei bucle: bucla exterioară – contorul i, prima buclă imbricată – contorul j și a doua, cea mai interioară buclă – contorul k. După cum vedem, cel mai lent contor este bucla exterioară(poi), și cel mai „rapid” este contorul buclei celei mai interioare (conformk).

Programul este executat după dublu clic pe butonul stâng al mouse-ului din formularul frmCicli.

CurrentX, CurrentY – proprietăți de formular care specifică coordonatele X, Y ale punctului de plecare pentru afișarea informațiilor folosind metoda Print (vezi Fig. 1 pentru locația axelor X și Y pe formular).

TextWidth() este o funcție care returnează lățimea textului specificat în funcție ca argument între ghilimele duble.

Buclele imbricate sunt folosite la procesarea matricelor bidimensionale (matrici). Dar în unele sarcini, excluzând intrarea și ieșirea elementelor unei matrice bidimensionale, vă puteți limita la o singură buclă. Să ne uităm la câteva exemple de programare matricială.

Exemplul 9.11. Intrarea și ieșirea unei matrice (matrice bidimensională) de numere întregiintA(N).

Puteți intra în matrice pe rânduri și pe coloane . Este mai ușor - linie cu linie, dacă programați ieșirea elementelor matrice în formular imediat după ce sunt introduse.

Intrare și ieșire matricelinie cu linie - fragmentul 1.

Dim M ca număr întreg, N ca număr întreg, i ca număr întreg, j ca număr întreg

Dim intA() As Integer ‘ declară o matrice dinamică

M = Val(txtN.Text) ‘ M – numărul de linii

N = Val(txtN.Text) ‘ N – numărul de coloane

ReDim intA(M, N) As Integer ‘ redefiniți matricea

Pentru i = 1 To M ‘ i își va păstra valoarea până la complet

„bucla imbricată pe j nu va fi executată

Imprimare " "; intA(i, j); ‘ ieșire linie cu linie

Imprimați ‘ mergeți la începutul unei noi linii

Pentru a introduce o matrice pe coloane, ar trebui să faceți bucla exterioară în j (specifică numerele coloanelor) și bucla interioară în i (specifică numerele rândurilor).

Intrare și ieșire matricepe coloane fragmentul 2.

PrY = 2500: CurrentY = PrY ‘ PrY setează coordonata Y a pornirii

‘ afișează primul element al fiecărei coloane din formular

Pentru j = 1 To N ‘ j își va păstra valoarea până la complet

„bucla imbricată pe i nu va fi executată

intA (i, j) = InputBox("Introduceți elementul intA(" & i & "," & j & ")", _

"Matricea de intrare intA(" & M & "," & N & ")")

Fila Print (6 * j); intA(i, j) ‘ iesit prin coloane

CurrentY = PrY ' pentru a afișa primul element

' coloana următoare

Acest al doilea fragment de program nu repetă primele 5 rânduri din primul fragment. Funcția Tab(6 * j) setează începutul ieșirii într-o linie (în caractere), începând de la marginea stângă a formularului. Coordonata PrY aici este egală cu 2500 twips, dar puteți alege o altă valoare.

Exemplul 9.12 . Ordonarea valorilor elementelor de matriceV(N) Crescator.

Există mai mulți algoritmi pentru ordonarea tablourilor. Iată una dintre ele: folosind bucle imbricatePentruUrmătorulselectăm elemente, începând de la primul până la penultimul, și comparăm fiecare dintre ele cu elementele ulterioare; dacă se dovedește că elementul următor este mai mic decât cel selectat, le schimbăm.

Un fragment dintr-un program care implementează acest algoritm:

Pentru i = 1 la N – 1

Pentru j = i + 1 la N

Dacă V(j)< V(i) Then P = V(i): V(i) = V(j): V(j) = P

Să explicăm acest fragment al programului.

Folosind o buclă exterioară cu un numărător i, selectăm elementul V(i) pentru a compara cu elementele ulterioare. Bucla interioară cu un numărător j selectează elementele ulterioare ale lui V(j) pentru comparație. Valoarea inițialăj este i+ 1. Acesta este primul element din cele ulterioare.

Pentru a schimba valorile elementelor V(i) și V(j), introducem o variabilă P, în care „ascundem” temporar valoarea unuia dintre elementele tabloului (în program acesta este V(i). )). Apoi elementului V(i) i se atribuie valoarea elementului V(j), iar elementului V(j) i se atribuie valoarea V(i), care este stocată în variabilaP. Dacă „ascundem” valoarea V(j) în P, atunci codul pentru schimbul de valori va fi astfel: P = V(j): V(j) = V(i): V(i) = P Rezultatul nu se va schimba.

La sortați matricea în ordine descrescătoare, este suficient să scrieți condiția de verificare în forma V(j) > V(i), adică să schimbați semnul inegalității cu altul.

Dacă matricea nu este numerică, ci șir, iar numele de familie sunt introduse în elementele matricei, atunci folosind programul din exemplul 9.12, puteți ordona lista de nume de familie în ordine alfabetică. Cert este că pentru literele alfabetului utilizate într-un computer sunt adevărate următoarele inegalități: A< Б < В < Г….< Я и т. д., поскольку числовые коды букв алфавита последовательно увеличиваются, начиная с А и до конца алфавита. Это же справедливо и для букв английского алфавита.

Exemplul 9.13 . Calcularea sumei elementelor pozitive pentru coloanele impare ale unei matriceF(M, N) și scoateți sumele în formular.

Algoritmul programului:

    Folosind bucla exterioară cu pasul 2, formăm un index al coloanelor impare ale matricei, începând de la prima coloană.

    Resetăm suma S, în care se va acumula suma elementelor pozitive.

    În bucla interioară verificăm semnul elementului matrice.

    Dacă elementul matricei este pozitiv (> 0), calculăm suma S.

    După sfârșitul buclei interioare, afișăm suma S pe formular.

Fragment programe:

Pentru j = 1 la N Pasul 2

Dacă F(i, j) > 0 atunci S = S + F(i, j)

Tipăriți „Suma coloanei”; j; „:”; S ‘ j – numărul coloanei!

Buclele imbricate vă permit să vă organizați enumerarea optiunilor și rezolva probleme care nu pot fi rezolvate analitic. În urma căutării, se obțin opțiuni de soluție, dintre care sunt selectate una sau mai multe care îndeplinesc condițiile problemei.

Exemplul 9.14. Sunt 1801 de ruble. Câte bomboane de ciocolată poți cumpăra cu 31 de ruble? și chifle pentru 18 ruble pentru a cheltui complet toți banii.

Program:

Suma = 1801

AllChocolates = Sum\31: AllBulks = Sum\18

Pentru i = 1 To AllChocolates

Pentru j = 1 To VseBulk

Preț = i * 31 + j * 18 ‘preț total de achiziție

Dacă Preț = 1801 Atunci

Printează „Ciocolată:”; eu; fila (19); „Bulok:”; j

Să explicăm programul în care folosim variabile numite în rusă.

În primul rând, determinăm care este numărul maxim de ciocolate singure sau doar rulouri care pot fi achiziționate pentru întreaga sumă. Folosim valorile obținute ale AllChocolates și AllBulks pentru a limita numărul de căutări pentru numărul de bomboane și rulouri. Pentru fiecare valoare a numărului de bomboane de ciocolată (i) și a numărului de rulouri (j), determinăm prețul total pentru achiziționarea acestora. Dacă prețul calculat este 1801, atunci opțiunea selectată este una dintre soluțiile problemei.

Funcția Tab() specifică din ce poziție de la marginea formularului vor fi afișate informațiile care urmează acestei funcție. Dacă Tab(19), atunci din poziţia a 19-a.

Programul afișează 3 posibile opțiuni de cumpărare:

Ciocolată 7, rulouri 88

Ciocolată 25, rulouri 57

Ciocolata 43, rulouri 26

Dacă doriți să oferiți un răspuns fără ambiguitate, trebuie să formulați o condiție suplimentară. De exemplu, „s-au cumpărat mai puține chifle decât ciocolată”. Atunci singura soluție va fi a treia opțiune.

Există multe probleme matematice care pot fi rezolvate pur și simplu prin forță brută folosind programarea în buclă imbricată.

Lucrări de laborator privind bazele programării

2.1. Tabelarea funcţiilor reprezentate analitic
și convergând în apropiere

Scopul lucrării

· Consolidarea cunoștințelor teoretice privind bazele organizării structurilor ramificate și ciclice.

· Dobândirea deprinderilor practice de programare folosind structuri ramificate și ciclice în sistemul Visual Basic.

Există trei tipuri de instrucțiuni bucle în VB:

ciclu de numărare: Pentru...To...Next

bucle cu precondiții: Do While...Loop, Do Until...Loop, While...WEnd

· bucle cu postcondiții: Do...Loop While, Do...Loop Until.

Bucla de numărare – vă permite să parcurgeți un set de instrucțiuni de un număr specificat de ori. Sintaxa sa este următoarea:

Pentru tejghea = start La Sfârşit

[operatori]

[operatori]

Următorul [ tejghea]

Parametru tejghea este o variabilă numerică (întreg, tip real sau Data, Varianta, tip Monedă) care este incrementată automat după fiecare repetare. Valoarea initiala tejghea egal cu parametrul Start, iar parametrul final - Sfârşit. Dacă nu este specificat, pasul este considerat egal cu 1; valoarea pasului poate fi modificată. Poate fi un număr pozitiv sau negativ.

Există patru constructe sintactice ale buclei Do....Loop:

Instrucțiunile dintre cuvintele cheie Do... Loop sunt executate de un număr specificat de ori în funcție de condiție. De exemplu, în următorul fragment de program, când C = 100, condiția va fi îndeplinită și va fi introdusă bucla. În interiorul buclei se apelează procedura și se micșorează valoarea lui C cu 1. Apoi se verifică din nou condiția (C > 0) și se execută din nou operatorii de buclă (se vor executa de 100 de ori în total), până când C = 0. Când condiția C > 0 devine falsă și bucla se oprește.

Faceți în timp ce C > 0

Același fragment de program executat folosind o buclă cu o precondiție în sintaxa 2:

În acest caz, bucla rulează atâta timp cât condiția este False, spre deosebire de cazul precedent, adică continuă inainte deîndeplinirea condiției C = 0.

Instrucțiunile buclei 3 și 4 sunt foarte asemănătoare ca sintaxă cu primele două, cu excepția faptului că condiția Nu se calculează până când bucla este executată cel puțin o dată.

Aceste sintaxe de buclă pot folosi instrucțiunile de ieșire a buclei necondiționate Exit For și Exit Do pentru a transfera controlul operatorului din spatele buclei. De exemplu, în următorul fragment de program, dacă valoarea inițială a lui C este >50, atunci bucla se va opri imediat.



Faceți până la C<= 0

MsgBox „Start” valoarea este mai mare decât acceptabilă”, „Eroare de intrare”

Bucla While...Wend a fost folosită în versiunile timpurii ale Visual Basic. Sintaxa sa este următoarea:

In timp ce<условие>

<Операторы>

Spre deosebire de bucla Do..Loop, bucla While ..Wend nu are o a doua opțiune în care condiția să fie verificată la sfârșitul buclei. În plus, nu există nicio declarație de ieșire în buclă, cum ar fi Exit Do.