Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Windows 8
  • Programarea proceselor de calcul ciclic vba. Programarea proceselor ciclice

Programarea proceselor de calcul ciclic vba. Programarea proceselor ciclice

Scopul lucrării:

Studiați operatorii ciclici pentru, while, do - while, aflați cum să compuneți și să programați algoritmi ciclici.

Informații teoretice scurte

Operatorii de buclă sunt utilizați atunci când este necesar să se repete anumite acțiuni (operatori și operații) de mai multe ori, iar astfel de secțiuni ale algoritmilor se numesc bucle.

Operatorul pentru buclă

Forma de bază a instrucțiunii buclei for este:

pentru (expresie_1; expresie_2; expresie_3)

operator;

Unde expresie_1– valoarea inițială a parametrului ciclului;

expresie_2– verificarea conditiilor de continuare a ciclului;

expresie_3– modificarea parametrului ciclului (corecție);

operator– operator simplu sau compus în limbaj C.

Schema de operare a operatorului este următoarea: o singură dată se calculează prima expresie_1, apoi se verifică expresia_2, iar dacă este „adevărat”, atunci se execută o secțiune ciclică a programului, apoi se corectează parametrul și așa mai departe până când expresia_2 ia valoarea „fals”.

De exemplu: pentru (k=1; k<5; k++)

printf(“\n %d”, k);

Ca urmare a executării acestui operator, numerele de la 1 la 4 sunt tipărite într-o coloană.

Puteți utiliza o variabilă de orice tip de bază ca parametru de buclă.

De exemplu:

pentru(ch=’a’; cap<=’z’; ch++) // Вывод на экран букв

printf(„%c”,ch); // Alfabetul latin

Este necesar să controlați cu atenție structura buclelor for din program, astfel încât să nu ajungeți cu o buclă fără sfârșit (din care nu există ieșire).

De exemplu:

pentru(k=10; k>6;k++)

printf(„buclă fără sfârșit\n”);

Bucla de ieșireînainte de termen, în următoarele moduri:

Prin condiție suplimentară;

Folosind următorii operatori:

pauză;- ieșire din bucla în care se află break, controlul este transferat la prima instrucțiune executată după buclă;

exit(int Kod);- ieși din program;

întoarcere;- ieșire din funcție;

Folosind operatorul de salt necondiționat mergi la<метка>;

Din timp finalizarea pasului ciclic curent posibil folosind o condiție sau un operator suplimentar continua, care întrerupe execuția pasului curent al buclei, adică. omite instrucțiunile din restul buclei și transferă controlul către instrucțiunea principală a buclei pentru a ajusta parametrul și a verifica starea.

Este interzis să transferați controlul din exterior în interiorul buclei.

Oricare dintre expresiile buclei for din paranteze poate lipsi, dar simbolul „;”. nu poate fi coborât.

De exemplu:

pentru(; i<3; i++)

pune(„Bună ziua!”);

Instrucțiuni ciclice while și do–while

Forma de bază a operatorului ciclic in timp ce:

În timp ce (condiție)

operator;

Unde operator

Bucla rulează atâta timp cât condiția se evaluează ca adevărată, de exemplu. expresia din paranteze returnează un rezultat diferit de zero. Aceasta este o buclă cu o precondiție - mai întâi condiția este verificată, apoi instrucțiunea este executată. Prin urmare, bucla while nu va fi executată nici măcar o dată dacă rezultatul inițial al calculării condiției este 0.

Forma de bază a operatorului face în timp ce:

operator;

în timp ce(condiție);

Unde operator este o afirmație simplă, compusă sau goală.

Operator doin timp ce– operator de buclă cu postcondiție, i.e. mai întâi declarația este executată și apoi condiția este verificată pentru adevăr. Deoarece într-o buclă do–while condiția este verificată la sfârșitul buclei, bucla va fi executată cel puțin o dată.

În bucle precum while și do–while, aceleași metode de ieșire timpurie din buclă și de finalizare timpurie a pasului curent al buclei sunt permise ca în instrucțiunea for, dar în ultimul caz, spre deosebire de bucla for, controlul este transferat. la verificarea stării. Pentru a preveni o buclă nesfârșită în buclele while și do–while, trebuie să asigurați modificarea variabilelor incluse în condiție.

De exemplu:

pentru (i=1;i<=300;i++) // Печать целых чисел, кратных 5

dacă (i%5!=0) continuă;

printf(„%5d”,i);

Exemple de bucle infinite:

operator;

2) în timp ce(număr_nu_0) // Întotdeauna adevărat!

operator;

operator;

în timp ce(număr_nu_0); // Întotdeauna adevărat!

Printre operatorii de buclă trebuie să existe o condiție de ieșire.

Bucle imbricate

În cazul buclelor imbricate, o buclă se află în interiorul alteia, de exemplu:

pentru(i=nn;i

pentru(j=mn;j

operator;

Unde operator este o afirmație simplă, compusă sau goală. Bucla interioară va fi executată pentru fiecare valoare a parametrului i care satisface condiția buclei exterioare.

Exemplu:

pentru(i=1;i<10;i++) // Печать таблицы умножения

pentru(j=1;j<4;j++)

printf(„\n %d*%d=%2d”, i, j, i*j);

printf(“\n”);

Un exemplu de utilizare a instrucțiunii for

Calculati. Programul ar trebui să imprime rezultatele intermediare și finale.

Textul programului poate arăta ca

#include

#include

puts(„Introduceți N”);

scanf(„%d”,&N);

pentru (s=0, k=1; k<=N; k++) // В заголовке цикла можно выпол-

( // luați și dublați misiunea

printf(" \n k=%d s=%f ", k, s);

printf("\n RĂSPUNS: s=%f, Apăsați orice tastă...",s);

Opțiuni pentru sarcini individuale

Scrieți un program pentru a determina un tabel cu valorile funcției laîntr-un interval arbitrar [ A,b] se schimbă argumentul X cu pași arbitrari h. Valori a, b, h introdus de la tastatură. Tabelul trebuie să conțină următoarele coloane: numărul de ordine, valoarea argumentului X, valoarea funcției, mesaj despre creșterea sau descreșterea funcției, diferența dintre două valori ale funcției adiacente.

Determinați valorile maxime și minime ale funcției.

1. a=-p; b=p; h=0,4.

2. a=0,7; b=1,8; h=0,1.

3. a=-0,5; b=2,5; h=0,2.

4. a=-0,9; b=2,7; h=0,3.

5. a=-2; b=0,8; h=0,2.

6. a=-1,9; b=2,7; h=0,3.

7. a=-0,4p; b=0,4p; h=0,5.

8. a=-0,3p; b=1,3p; h= p/10.

9. a=-p/2; b= p/2; h=p/10.

10. a=-3; b=3; h=0,5.

PROGRAMARE PROCESE DE CALCUL CICLIC

Informatii de baza

Este numit un proces în care o instrucțiune sau un grup de instrucțiuni este executată în mod repetat pentru diferite valori ale argumentului proces ciclic. VBA utilizează instrucțiuni de buclă pentru a efectua acțiuni repetitive, care sunt de următoarele tipuri:

operator buclă cu parametru Pentru – În continuare, a cărui construcție este utilizată dacă se știe dinainte de câte ori trebuie repetat corpul buclei:

Pentru counter = initial_value Apoi final_value Pas pas block_of_operators

Urmează cu contor

operatori buclă cu precondiție sau postcondiție, care sunt folosite pentru a organiza o buclă cu un număr necunoscut de repetări ale corpului buclei:

Proiectare buclă

Proiectare buclă

cu o condiție prealabilă arată astfel:

cu o postcondiție are forma:

Condiție Do While

statement_block

statement_block

Condiție Loop While

A face până la condiție

statement_block

statement_block

Loop Până la condiție

În timp ce starea

statement_block

Vom dezvolta un formular personalizat și vom crea un program pentru a determina indicele de rentabilitate al proiectului de investiții propus pentru reînnoirea echipamentelor, dacă valoarea investiției inițiale (IP) este de 10.000 de mii de ruble, rata de actualizare este r = 10% și valoarea așteptată. fluxurile de numerar sunt după cum urmează:

Flux de numerar (DPk B),B mii ruble

Lăsați forma utilizatorului să arate ca (Fig. 1), iar valorile fluxurilor de numerar din anii 1–5 sunt citite din celulele foii de lucru „Exemplu 1” (Fig. 2).

Proprietățile obiectelor formular sunt prezentate în tabelul 1.

Orez. 1. Formular „Indice de profitabilitate”

rentabilitatea

proiect de investitii"

calculate prin formula

∑n

DPk

IR =

k = 1 (1+ r)

unde n este numărul de ani în care vor ajunge încasările de numerar.

Orez. 2. Tabel de distribuție a fluxului de numerar

tabelul 1

Proprietate

Proprietate

Legendă = Index de chirie-

Legendă = Mărimea originală

albul investiţiei

noi investitii

al-lea proiect

Legendă = Rata de reducere

Legendă = Indicele de profitabilitate

Legendă = Clear

Legendă = Ieșire

Pentru a procesa evenimentul de clic pe butonul „Calculați”, introduceți următoarele

Sub privat calc_Click()

„Setați tipul de variabilă

Dim pv, dp, i, n ca întreg

Dim r, s Ca Single

„citirea valorilor variabilelor

pv = Val(txtPV.Text)

r = Val(txtSD.Text) / 100

n = Val(InputBox("Introduceți numărul de ani pentru care

vino

monetar

chitanțe”, „Intrare date”))

„citirea valorilor fluxurilor de numerar

dp = Cells(2, i + 2)

'însumare

txtIR.Text = Round(s / pv, 2) ‘rotunjirea și afișarea rezultatului

Funcția Round(N, k) rotunjește numărul N la k zecimale.

Apoi utilizați elementul Buton din bara de instrumente Controale Să plasăm butonul „Open Form” sub tabel pentru a lansa procedura „Profitability Index Form” (Fig. 3). Codul pentru această procedură arată astfel:

Subform privat Index de profitabilitate_Click()

Orez. 3. Determinarea indicelui de rentabilitate al unui proiect de investitii

Folosind butonul creat „Formular deschis”, lansăm formularul și calculăm indicele de profitabilitate al proiectului de investiții (Fig. 3).

Să dezvoltăm un formular personalizat și să creăm un program pentru a găsi toate numerele din două cifre a căror sumă de pătrate de cifre este divizibilă cu 13.

Pentru a crea acest formular personalizat, să mergem la editorul VB (vom rămâne în același registru de lucru MS Excel ca în exemplul 1) și să adăugăm un alt formular (Fig. 4).

Proprietățile obiectelor formular sunt prezentate în tabelul 2.

Pentru a gestiona evenimentele clic pe buton

următorul cod:

Sub privat calc_Click()

Orez. 4. Formularul de exemplu 2

Label2.Caption = ""

„definiția primei cifre a unui număr format din două cifre

„definiția celei de-a doua cifre a unui număr format din două cifre

Dacă (i1^2+i2^2) Mod 13=0, atunci Label2.Caption = Label2.Caption+Str(i)+" "

Private Sub clean_Click()

Label2.Caption = ""

Private Sub exitForm_Click()

masa 2

Proprietate

Legendă = Exemplul 2

Legendă = numere din două cifre, sumă

pătratele numerelor divizibile cu 13

TextAlign = 2-fmTextAlignCenter

Legendă = „ ”

AutoSize = Fals

Proprietate

Legendă = Clear

Legendă = Ieșire

Pe foaia de lucru „Exemplu 2” vom plasa

Butonul „Deschide formularul” pentru a deschide formularul

„Exemplu 2” și lansați acest formular (Fig.

Să ne dezvoltăm

personalizat

interfata

si machiaza

program pentru tine

sume de serie:

numere cu precizie ε = 10P

k+2

S = ∑

(− 1)

k = 1

Să rămânem în același registru de lucru Excel,

ca în exemplele 1 şi 2. Folosind unealta

Orez. 5. Numere din două cifre, suma pătratului

paginile „Inscripție”, „Câmp” și „Buton”

sume de cifre care sunt divizibile cu 13

nici unelte

Elemente

management

Să plasăm obiectele corespunzătoare pe foaia de lucru „Exemplu 3” (Fig. 6).

Proprietățile obiectelor foaie „Exemplu 3” sunt prezentate în Tabelul 3.

Tabelul 3

Proprietate

Proprietate

Legendă = Suma seriei

Legendă = Clear

Pentru a procesa evenimentele de apăsare a butoanelor „Calculate” și „Ștergeți”, introduceți următorul cod de program în modulul „Sheet3 (Example 3)”:

eps = Val(InputBox(„Setare precizie”, „Intrare date”))

a = (-1)^(k + 2) / (f * 2^k) s = s + a

Buclă txtS.Text = s

Private Sub clean_Click() txtS.Text = ""

Aici va fi corpul buclei Do While – Loop

să fie efectuate

termen

absolut

k+2

n− 1

k+2

n+ 2

dimensiune (adică

(− 1)

−∑

(− 1)

(− 1)

) voi

Orez. 6. Calculați suma

k = 1

k = 1

depășește precizia specificată 10 P

Să verificăm funcționarea programului (Fig. 7).

Să ne dezvoltăm

personalizat

Să scriem un program pentru a rezolva următoarea problemă.

Când se analizează activitățile economice, pre-

instalat

Următorul

model: în ianuarie 2004, profitul acestui

întreprinderea s-a ridicat la 573 mii de ruble. iar în timpul

în următorii 5 ani a crescut lunar cu i%,

unde i este numărul lunii (adică în februarie - cu 2%, în martie

- cu 3% etc.), comparativ cu valoarea profitului în

Orez. 7. Rezultatul calculului

luna precedentă.

Determinați pre-

sume de serie

acceptând cuantumul profitului pentru anii 2004, 2005, ..., 2008, precum și suma totală a profitului pentru acești 5 ani.

Pentru a crea acest formular personalizat, să mergem la editorul VB (vom rămâne în același registru de lucru MS Excel ca în exemplele 1–3) și să adăugăm un alt formular (Fig. 8). Ieșirea valorilor calculate ale profitului întreprinderii va fi efectuată atât în ​​câmpul obiectului listă (ListBox), plasat pe formular, cât și în celulele foii de lucru „Exemplu 4” (Fig. 9).

Orez. 8. Formular „Profit al întreprinderii” Fig. 9. Tabel de exemplu 4

Proprietățile obiectelor formular sunt prezentate în Tabelul 4.

Tabelul 4

Proprietate

Proprietate

Legendă = profitul întreprinderii

Legendă = Clear

Legendă = Ieșire

Notă. Proprietatea ColumnCount specifică numărul de coloane ale obiectului ListBox.

Pentru a procesa evenimentele de apăsare a butoanelor „Calculate”, „Șterge” și „Ieșire”.

mutați" introduceți următorul cod:

Private Sub calc_Click() Dim i, j As Integer

Dim PrM, prG, sPr As Single

PrM = Val(InputBox(„Introduceți profitul primit în ianuarie 2004,” „Intrare date”))

ListBox folosește metoda AddItem pentru a adăuga elemente în listă

ListName.AddItem Expresie, Index

unde Expresie este elementul de listă care trebuie adăugat; Index – numărul de serie al unui element din listă (numerotarea elementelor listei începe de la 0).

Și proprietatea List (RowNumber, ColumnNumber) a obiectului ListBox returnează (atribuie) elementul listă situat la intersecția rândului și coloanei specificate.

Pe foaia de lucru „Exemplu 4” vom plasa butonul „Open Form” pentru a apela formularul „Enterprise Profit” și a lansa acest formular (Fig. 10).

Acum puteți adăuga o altă foaie la registrul de lucru MS Excel numit „Cuprins”, pe care, de exemplu, folosind instrumentul Buton din bara de instrumente Formulare, vom crea patru butoane: „Indice de profitabilitate”, „Numere din două cifre” , „Suma de serie”, întreprinderi „Profit”.

În editorul VB, adăugați un nou modul (Insert → Module), în care introducem următorul cod:

Fișă secundară publicăExemplu1()

Fișe de lucru(„Exemplu 1”).Activați

ListPr.AddItem „An”, 0

„setarea semnăturilor și datelor inițiale

ListPr.List(0, 1) = „Profit, mie de ruble”.

„ciclu după an

„ciclați prin lunile fiecărui an

Dacă (i = 4) Și (j = 1) Atunci

PrM = PrM * (1 + j / 100)

Făcând clic pe butonul „Descărcați arhiva”, veți descărca gratuit fișierul de care aveți nevoie.
Înainte de a descărca acest fișier, gândiți-vă la acele eseuri bune, teste, lucrări, disertații, articole și alte documente care se află nerevendicate pe computerul dvs. Aceasta este munca ta, ar trebui să participe la dezvoltarea societății și să beneficieze oamenii. Găsiți aceste lucrări și trimiteți-le la baza de cunoștințe.
Noi și toți studenții, studenții absolvenți, tinerii oameni de știință care folosesc baza de cunoștințe în studiile și munca lor vă vom fi foarte recunoscători.

Pentru a descărca o arhivă cu un document, introduceți un număr de cinci cifre în câmpul de mai jos și faceți clic pe butonul „Descărcați arhiva”

Documente similare

    Întocmirea unei foi de raport „Magazine” în Excel 2013. Lucrul cu tabele din familia Microsoft Office. Construirea de diagrame circulare și histograme, grafice. Dezvoltarea procedurilor de tabelare a funcţiilor. Programarea funcțiilor utilizatorului în VBA.

    lucrare curs, adăugată 04.03.2014

    Suita Microsoft Office. Foaie de calcul MS Excel. Crearea unui formular de ecran și introducerea datelor. Formule și funcții. Explicația funcțiilor utilizatorului MS Excel. Formularea fizică a problemelor. Stabilirea condițiilor limită pentru valorile acceptabile ale variabilelor.

    lucrare curs, adăugată 06.07.2015

    Caracteristici de utilizare a funcțiilor încorporate ale Microsoft Excel. Crearea de tabele, completarea lor cu date, construirea de grafice. Aplicați formule matematice pentru a efectua interogări folosind pachete de aplicații. Cerințe tehnice pentru computer.

    lucrare curs, adaugat 25.04.2013

    Organizarea fișierelor și accesul. Operații cu fișiere. Programare folosind funcții I/O încorporate; procese de calcul liniare, ramificate și ciclice folosind If-else, operator de selecție a cazului; matrice și matrice.

    lucrare de curs, adăugată 24.05.2014

    Procesorul de foi de calcul Microsoft Excel este un program de aplicație conceput pentru a automatiza procesul de prelucrare a informațiilor economice prezentate sub formă de tabele; aplicarea de formule și funcții pentru calcule; complotând.

    rezumat, adăugat 02.03.2013

    Programarea proceselor de calcul în FORTRAN pentru a asigura interacțiunea sistemului „Om-Producție-Natura”. Utilizarea matricelor pentru a compila cicluri pentru calcularea nivelului de poluare a mediului și a costurilor de procesare a deșeurilor.

    lucrare de curs, adăugată 30.05.2014

    Crearea unei aplicații care va reprezenta grafice de funcții folosind o expresie matematică dată. Dezvoltarea programului „Generator de funcții matematice”. Crearea unui asistent de funcții pentru introducerea unei expresii matematice, testare.

    teză, adăugată 16.02.2016

1. Metode de construire a proceselor de calcul ciclice în programe.

2. Intrat în computerNnumere reale. Scrieți un program care să afișeze media aritmetică a acestei mulțimi.

Introducere

Programele ciclice sunt folosite în aproape orice software. În acest caz, ciclurile pot fi explicite sau implicite. În special, bucla implicită este prezentă în manevrele de întrerupere, care rulează efectiv într-o buclă infinită al cărei corp este declanșat de întrerupere. Subrutinele - funcțiile ferestre ale aplicațiilor Windows - sunt, de asemenea, ciclice. Mai jos luăm în considerare programele cu o buclă al căror corp conține module funcționale.

Proces ciclic este un proces de calcul în care calculele sunt efectuate în mod repetat folosind aceleași formule pentru diferite valori ale argumentului.

Programe, implementarea unui proces ciclic sunt numite programe ciclice.

Organizarea ciclului poate fi împărțită în următoarele etape:

pregătirea (inițializarea) ciclului (ȘI);

efectuarea calculelor buclei (corpul buclei) (T);

modificarea parametrilor (M);

verificarea stării de încheiere a ciclului (U).

Ordinea acestor pași, cum ar fi T și M, poate varia. În funcție de locația verificării stării de sfârșit de ciclu, se face o distincție între ciclurile cu terminații inferioare și superioare. Pentru o buclă de sfârșit de jos, corpul buclei este executat cel puțin o dată deoarece calculele sunt efectuate mai întâi și apoi este verificată condiția de ieșire din buclă.


În cazul unei bucle cu sfârșit de sus, corpul buclei poate să nu fie executat nici măcar o singură dată dacă condiția de ieșire este îndeplinită imediat.

Un ciclu se numește determinist dacă numărul de repetări ale corpului buclei este cunoscut sau determinat în prealabil. Un ciclu se numește iterativ dacă numărul de repetări ale corpului buclei este necunoscut în prealabil, dar depinde de valorile parametrilor (unele variabile) implicați în calcule.

Corpul buclei- Aceasta este o secțiune a programului repetată în mod repetat.

Parametru de buclă este o variabilă care ia noi valori de fiecare dată când se repetă bucla (buclele pot fi simple sau complexe).

Vedere generală a buclei de n ori

În general, o buclă de n ori este scrisă astfel:

nc număr de repetări

Cuvântul de serviciu nts (începutul ciclului) și kts (sfârșitul ciclului) sunt scrise strict unul sub celălalt și conectate printr-o linie verticală. În dreapta acestei linii, este scrisă o secvență repetabilă de comenzi (corpul buclei).

Numărul de repetări este un număr întreg arbitrar.

La executarea algoritmului, secvența de comenzi din corpul buclei se repetă de numărul specificat de ori. Regulile limbajului algoritmic permit specificarea oricărui număr întreg de repetări. Poate fi zero sau chiar negativ. Aceste cazuri nu sunt considerate eronate, corpul buclei pur și simplu nu va fi executat nici măcar o dată, iar computerul va proceda imediat la executarea comenzilor scrise după cc

Vedere generală a ciclului de până acum

În general, ciclul este scris în prezent după cum urmează:

nicio conditie inca

| corpul buclei (secvență de comenzi)

La efectuarea unui ciclu, computerul repetă următoarele acțiuni:

a) verifică condiția scrisă după cuvântul funcției while;

b) dacă condiția nu este îndeplinită, atunci execuția buclei se termină și calculatorul începe să execute comenzile scrise după cc. Dacă condiția este îndeplinită, atunci computerul execută corpul buclei, verifică din nou condiția etc.

Vedere generală a ciclului pentru

nc pentru i de la i1 la i2

| corpul buclei (secvență de comenzi)

Aici i este numele unei valori de tip întreg, i1, i2 sunt numere întregi arbitrare sau expresii cu valori întregi. Corpul buclei este executat secvenţial pentru i = i1, i = i1 + 1, i1 + 2, …i = i2.

Regulile limbajului algoritmic permit specificarea oricăror numere întregi i1, i2. în special, i2 poate fi mai mic decât i1. acest caz nu este considerat o eroare - pur și simplu corpul buclei nu va fi executat nici măcar o dată, iar computerul va trece imediat la executarea comenzilor scrise după cc.

Buclă de n ori și buclă while

Buclele de n ori și până acum sunt formatate aproape în același mod în limbajul algoritmic. Acest lucru nu este surprinzător, deoarece ambele comenzi definesc o buclă - o secvență repetată de comenzi. Cuvintele de serviciu nts și kts indică faptul că o buclă este în curs de execuție, iar antetul buclei specifică mecanismul specific pentru executarea acesteia.

Cu toate acestea, aceste două cicluri au o diferență semnificativă. Când computerul începe să execute o buclă de n ori, știe de câte ori va trebui să repete corpul buclei. La executarea unei bucle, acesta nu este încă cazul: computerul verifică de fiecare dată starea buclei și nu poate determina în prealabil când se va termina execuția. Deocamdată, puteți afla numărul de repetări ale unui ciclu numai după ce ciclul este finalizat.

Acest lucru face clar în ce cazuri ce buclă ar trebui utilizată. Dacă numărul de repetări este cunoscut până la momentul începerii buclei, este convenabil să folosiți bucla de n ori. Dacă numărul de repetări nu poate fi determinat în prealabil, este necesar un ciclu.

De exemplu, un program de control automat are structura prezentată în Fig. 1. Module incluse în ciclu(precum și modulele de gestionare a întreruperilor), cu câte o intrare și câte o ieșire fiecare, au de obicei caracteristica că modulele conțin variabile statice cărora li se atribuie o valoare în ciclul curent, iar analiza acestor variabile este efectuată în ciclul următor . Astfel, variabilele menţionate caracterizează starea modulului la sfârşitul ciclului curent sau începutul următorului ciclu de program. În cele ce urmează, vom lua în considerare numai astfel de module de programe ciclice și le vom desemna pe scurt ca MCP.


Fig.1. Structura tipică a unui program de control cu ​​o buclă infinită.

MCP-urile au o structură variată, a cărei complexitate trebuie evaluată conform unor criterii speciale. V.V.Lipaev a propus un criteriu convenabil și obiectiv pentru complexitatea modulelor software și anume: numărul și lungimea totală a căilor din graficul de control al modulului. Sunt luate în considerare doar declarațiile condiționate și de selecție. Cu toate acestea, acest criteriu nu este în mod clar suficient pentru un MCP cu memorie statică, deoarece atunci când se analizează un MCP este necesar să ne amintim valorile tuturor variabilelor statice stabilite în ciclul anterior. În plus, nu există recomandări pentru standardizarea algoritmilor și programelor, cu excepția programarii structurate de mult cunoscute în limbaje de programare utilizate în mod obișnuit, cum ar fi C și Pascal. Acest articol propune să umple aceste lacune în legătură cu MCP.

2. Fragmente de module de program ciclic

Un fragment cu două terminale, sau pur și simplu un fragment, va fi considerat o secțiune a unui program cu o intrare și o ieșire (inclusiv operatorii de buclă) în ipoteza că MCP-urile luate în considerare sunt structurate. Cel mai simplu fragment include o singură declarație. O secvență de fragmente este, de asemenea, un fragment. MCP, la rândul său, este un fragment și constă dintr-o secvență de fragmente.

Metoda fragmentelor independente este propusă pentru sintetizarea structurii modulelor care implementează tabele de decizie. În acest caz, un fragment care poate fi inserat oriunde în secvența fragmentelor de modul este considerat independent. Independența locației unui astfel de fragment se datorează faptului că datele analizate în acesta nu sunt generate în secvența specificată de fragmente, iar datele generate în fragmentul independent nu sunt analizate în această secvență de fragmente. Prin urmare, fragmentele independente pot fi executate în paralel (pseudo-paralel). În fig. Figura 2 prezintă posibile opțiuni de implementare pentru un modul cu două fragmente independente. În opțiunile „a” și „b” fragmentele sunt rearanjate fără a distorsiona esența programului; în opțiunea „c” fragmentele sunt implementate în paralel.


Fig.2. Opțiuni pentru implementarea unui modul cu fragmente independente:

a) și b) - implementare secvențială,

c) - implementare paralelă: o linie orizontală dublă indică paralelizarea programului, o linie orizontală groasă indică finalizarea proceselor paralele.

Un fragment dependent este unul a cărui locație depinde de locația altui fragment(e) în modul. Vom distinge între fragmentele dependente de deasupra și de dedesubt. Fragmentul dependent de vârf trebuie să fie întotdeauna situat sub un fragment în care se formează variabilele utilizate în acest fragment (dependent). Un fragment dependent de fund ar trebui să fie întotdeauna plasat deasupra unui fragment care utilizează variabile generate în acest fragment. Două fragmente dependente, dintre care unul este dependent de sus de al doilea, iar al doilea de jos dependent de primul, vor fi numite fragmente dependente reciproc. Ele nu pot fi interschimbate și nu pot fi implementate în paralel. În fig. Figura 3 prezintă un exemplu de modul cu fragmente dependente reciproc. Între fragmente dependente reciproc pot exista altele, dependente sau independente de ele. Fig.3. Modul cu fragmente dependente.

Vom numi un fragment dependent a cărui locație în modul este strict definită ca fixă. De exemplu, în modulul pentru recunoașterea unui caracter introdus de la tastatură, primul trebuie să fie fragmentul dependent de partea de jos a caracterului introdus efectiv. Operatorii „pornire” și „sfârșit” ai unui modul sunt fragmente fixe.

Fragmente absolut independente nu există, fie și doar pentru că în orice modul există fragmentele fixe menționate ale începutului și sfârșitului. Prin urmare, un fragment independent, în general, are o zonă posibilă de localizare limitată de două fragmente dependente reciproc. Adică, o definiție mai strictă a unui fragment independent este următoarea: independent față de două fragmente fixe, vom numi un fragment care poate fi plasat oriunde în secvența de fragmente delimitate deasupra și dedesubt de fragmentele fixe specificate.

În programare, există adesea sarcini care necesită execuția repetată a aceluiași grup de instrucțiuni de program cu valori diferite ale operanzilor lor. Astfel de procese sunt numite ciclic sau pur și simplu cicluri. Un grup de afirmații repetate ciclic formează așa-numitul corpul buclei, care poate fi reprezentată fie printr-o expresie simplă, fie printr-o expresie compusă. Vom numi execuția unică a corpului buclei repetare.

Corpul unei bucle dintr-un program este întotdeauna precedat de antetul buclei, care conține denumirea operator de buclăși o expresie care definește (direct sau indirect) numărul de iterații. Rețineți că corpul buclei este operandul operatorului buclei; prin urmare, antetul și corpul buclei constituie o unitate structurală indivizibilă a programului. În cele ce urmează, folosind termenul „ operator de buclă„, vom însemna atât antetul, cât și corpul buclei.

Pentru a organiza cicluri în toate sistemele de programare, există specializate operatori de buclă, a cărui utilizare scutește programatorul de necesitatea de a programa ciclurile „manual”. MathCAD acceptă două tipuri de astfel de operatori - ciclu cu predestinare Pentru (numit si buclă cu contor) Și buclă cu precondiție In timp ce . O descriere a structurii acestor operatori este dată în Tabelul 5.

5.4.1 Operator Pentru

Acest operator ar trebui utilizat în cazurile în care numărul de iterații este predeterminat, adică cunoscut în prealabil.

Antet buclă al acestui operator (operandul drept) conține o variabilă numită parametru(sau contor) ciclu, Și lista de valori acest parametru. Numărul de elemente ale listei determină și numărul de iterații - în timpul fiecărei iterații, parametrul buclei primește următoarea valoare din lista specificată în antet.

Parametru de buclă are statutul de variabilă internă de program și are toate proprietățile sale (descrise în secțiunea 5.1.4). De regulă, parametrul buclă este utilizat în partea dreaptă a expresiilor incluse în corpul buclei, deși nu este interzis în mod formal să-l folosească în partea stângă a expresiilor (adică în stânga definiției locale). operatorul „f”). Trebuie amintit că, dacă un parametru a fost modificat în corpul buclei, valoarea sa modificată va fi valabilă doar până la sfârșitul iterației curente, deoarece înainte de începerea următoarei iterații parametrul va primi în continuare următoarea valoare de la iterația curentă. lista specificată în antetul buclei.

În mod formal, este permis să nu se folosească deloc parametrul buclei în expresiile corpului buclei - în acest caz, lista de valori ale parametrilor nu joacă niciun rol - doar lungimea acestei liste este semnificativă, ceea ce determină numărul de iterații (posibil fără sens).

La terminarea ultimei iterații, instrucțiunea programului care urmează instrucțiunii buclei va fi executată. În acest caz, variabila folosită ca parametru al buclei finalizate păstrează valoarea pe care o avea în ultimul efectiv finalizat repetare[*]. Rețineți că această valoare nu coincide întotdeauna cu ultima valoare din lista specificată în antetul buclei, deoarece o ieșire „devreme” din buclă este posibilă atunci când operatorul este declanșat Pauză incluse în corpul buclei.

Lista de valori Parametrul buclei este scris în antetul buclei după simbolul " Î ", indicând apartenența la un set (acest simbol nu trebuie introdus manual - va fi afișat automat la intrarea în operator Pentru ). MathCAD permite utilizarea trei forme intrări din această listă: transfer direct– elementele listei sunt specificate explicit separate prin virgule, parametrul primește valorile din listă în ordinea în care apar; în stil variabil clasat – elementele listei formează seria aritmetică corespunzătoare; matrice– elementele listei primesc secvențial valorile elementelor matricei în ordinea indicilor lor (în primul rând, coloanele de la stânga la dreapta, apoi rândurile de sus în jos).

Cele trei programe prezentate în Figura 21 ilustrează diferite utilizări ale operatorului Pentru .

Program Fapt(n) calculează factorialul unui număr n . Operatorul buclă din acest program face parte dintr-o expresie compusă, care, la rândul său, este operandul unui operator condiționat In caz contrar. Parametru de buclă k obține valori dintr-o serie aritmetică întreagă.

Program Ch(V,N,p) procesează vectorul de intrare V , înlocuindu-l cu valoarea p acele elemente ai căror indici sunt specificați de elementele celui de-al doilea vector de intrare N . În acest exemplu, o listă de valori ale parametrilor buclei i definite de un set de elemente vectoriale N . Rețineți că ambele programe efectuează controlul datelor de intrare și blochează execuția algoritmului principal dacă argumentele reale ale programului sunt specificate incorect.

Program L(M,z) dat în exemplu V ), este însoțită de comentarii detaliate și nu necesită explicații. Acest program ilustrează posibilitatea utilizării mai multor instrucțiuni bucle, dintre care una este inclusă printre instrucțiuni corp o alta. Utilizare bucle imbricate- o tehnică tipică utilizată pentru procesarea tablourilor multidimensionale.

Figura 21 – Exemple de programare ciclului Pentru


Figura 22 ilustrează utilizarea operatorilor Pauză Și Continua în corpul buclei. De obicei, acești operatori sunt ei înșiși operanzi ai operatorilor condiționali Dacă sau In caz contrar .

Operator Pauză ("avorta") întrerupe executarea buclei și transferă controlul către operator în urma operatorului buclei întrerupte. Rețineți că dacă operatorul Pauză întrerupt buclă imbricată, execuția buclei exterioare va continua.

Operator Continua („continuare”) acţionează diferit – el întrerupe doar iterația curentă a bucleiși transferă controlul la antetul acestei bucle, după care bucla este executată continuă de la următoarea iterație (cu excepția cazului în care, desigur, iterația întreruptă a fost ultima).

Operator Pauză permis să utilizeze și in afara corpul ciclului. În acest caz, execuția întregii subrutine este întreruptă, iar rezultatul evaluării ultimei sale expresii executate efectiv este returnat.

Figura 22 – Exemple de utilizare a operatorilor Pauză Și Continua

Funcţie SumN(V) însumează numai acele elemente vectoriale care conțin date numerice scalare și omite elementele rămase. Funcţie invers (V) formează un vector ale cărui elemente sunt valorile inverse ale elementelor corespunzătoare ale vectorului original. Mai mult, dacă următorul element conține numărul „0” sau nu este un scalar de tip numeric, ciclul este întrerupt. Rețineți că operatorul Pauză în ultimul exemplu nu întrerupe programul, ci transferă controlul către operator Întoarcere , imediat după operator Pentru .

5.4.3 Operator In timp ce

Spre deosebire de operator Pentru , antetul declarației In timp ce (în traducere - " Pa") nu conține indicații explicite ale numărului de iterații - conține expresie logică, a cărui valoare este calculată automat înainte de început execuția fiecărei iterații următoare[†]. Atâta timp cât această expresie este adevărată, bucla va continua să se repete; de îndată ce expresia devine falsă după finalizarea următoarei iterații, următoarea iterație a buclei nu va fi executată, iar instrucțiunea de program care urmează instrucțiunii va primi control In timp ce .

Evident, dacă în antetul buclei este plasată o expresie logică identic falsă, această buclă nu va finaliza niciuna dintre iterațiile sale, iar dacă această expresie este identic adevărată, bucla va fi infinită (aceasta din urmă situație se numește buclă programe). Pentru a evita astfel de situații, operanzii unei expresii logice trebuie să includă una sau mai multe variabile care își modifică valorile în corpul buclei astfel încât bucla să fie finită (se pot folosi alte mijloace pentru a preveni bucla - de exemplu, forțând operatorul să iasă din buclă Pauză ).

Exemple de utilizare a operatorului In timp ce sunt prezentate în Figura 23. Sunt date trei opțiuni pentru rezolvarea aceleiași probleme: fiecare dintre programe F0 , F1 Și F2 returnează indexul primului element al vectorului sursăV depășind valoarea specificatăz .

Primul program (exemplu A ) adaugă unul la contor k în corpul buclei In timp ce pana la urmatorul k al-lea element al vectorului original nu va depăși valoarea specificată z . După aceasta, bucla se termină și programul returnează ultima valoare modificată a variabilei k , care este soluția problemei. Rețineți că, spre deosebire de ciclu Pentru , tejghea k aici este necesar să-l procesați cu instrucțiuni separate: inițializați (adică atribuiți-i o valoare inițială) înaintea operatorului de buclă și modificați valoarea acestuia în corpul buclei.

Este ușor de observat că opțiunea A ) al programului are un dezavantaj semnificativ: nu împiedică programul să facă buclă în cazul în care problema nu are soluție, adică atunci când parametrul z depășește valoarea celui mai mare element al vectorului V . În acest exemplu, bucla într-o astfel de situație nu se va întâmpla cu adevărat - dar acesta nu este meritul programului nostru, ci al sistemului MathCAD, care va controla rezultatul indexului vectorial V în afara valorilor permise și va genera un mesaj de eroare.

Opțiunea este liberă de acest dezavantaj b ) a unui program în care corpul buclei conține o verificare suplimentară pentru validitatea următoarei valori de indice și întrerupe forțat bucla cu operatorul Pauză în situația corespunzătoare cu emiterea unui mesaj text.

Poate cea mai eficientă soluție la această problemă este opțiunea V ), care nu folosește deloc operatorul In timp ce . În acest program variabila k folosit doar pentru a menține „puritatea stilului” - pentru a exclude procesarea parametrului buclei i în afara operatorului Pentru .

Figura 23 – Exemple de programare ciclului In timp ce

Cele mai bune articole pe această temă