Programarea proceselor de calcul ciclic. Informații teoretice scurte

Î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 trebuie utilizat în cazurile în care numărul de iterații este predeterminat, adică cunoscut dinainte.

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 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 de a utiliza mai multe 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 ale vectorului care conțin date scalare de tip numeric ș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 ) al 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 a ciclurilor In timp ce

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.

Sarcina nr. 2

Programarea proceselor de calcul ramificate

Scopul lucrării

Dobândiți abilități în programarea proceselor de calcul ramificate. Explorați instrucțiunile condiționate, variabilele booleene, relațiile logice și operațiile.

Fie specificată o regiune D pe planul x, y Este necesar să se determine dacă punctul cu coordonatele (x, y) „cade” în regiunea D sau nu. Dacă lovește, atunci este necesar să se calculeze funcția și să se atribuie valoarea M=1 variabilei M, a cărei valoare este un semn al unei „lovituri” sau „eșecuri”. În caz contrar, calculați și setați M=2.

Progres

Algoritm pentru rezolvarea problemei:

1. Scrieți regiunea D și notați funcțiile și

2. Notați ecuațiile care determină limitele zonei

3. Pregătiți 7 puncte astfel încât unele dintre puncte să fie în interiorul lui D, iar altele în afara lui.

4. Scrieți un program pentru a finaliza sarcina.

5. Obțineți și înregistrați rezultatele numărării pentru punctele selectate.

f 1= tan(x)/e y f 2 =

(x>0 și y>0 și X**2+Y**2<=9) или (x<0 и y>0 și y<=x+4) или (x<0 и y<0 и x>(-4) și y>(-2))

atunci punctul aparține regiunii D

1)(1;1)
2)(3;3)
3)(-1;2)
4)(-5;2)
5)(-2;-1)
6)(-5;-3)

Fortran MathCAD
X y z m c z m c
0,1573E+01 T 1.573
0,0751E+01 F 0.751
-1 -0,1211E+01 T -1.211
-5 0,083E+01 F 0.83
-2 -1 0,394E+01 T 3.94
-5 -3 0,0282E+01 F 0.282
-3 0,0271E+01 F 0.271

PRINT *,"X=?,Y=?";CITEȘTE *,X,Y

C=(x>0..și.y>0..și.X**2+Y**2<=9).or.(x<0..and.y>0..și.a<=x+4).or.(x<0..and.y<0..and.x>(-4).și.y>(-2))

TIPARĂ 2,X,Y,Z,C,M

2 FORMAT ("X=",F7.3,3X,"Y=",F7.3,3X,"Z=",E11.4,3X,"C=",L2,3X,"M=", I2/)

TERMINAT PROGRAMUL LAB2

FUNCȚIA F1(X,Y)

F1=tan(x)/exp(x)**y

FUNCȚIA F2(X,Y)

F2= (sqrt(sin(2*x+3*y)**2)**1./3.)

print*,"a,b,c=?";citește "(2F7.3)",a,b,c

q=a>b.and.a

A c

w=b>a.și.b

b c

e=c>a.and.c

c b

28.,558.,345. 345.0000


Sarcina nr. 3

Programarea proceselor de calcul ciclic

Scopul lucrării

Dobândiți abilități în programarea proceselor de calcul ciclic. Învață bucle de pas și bucle condiționate.

1. Notați formulele de calcul pentru calcularea termenului și a sumei finale

2. Creați un algoritm pentru calcularea cu o precizie dată a sumei unui număr finit de termeni ai seriei în intervalul specificat de variație a parametrului x cu un pas dat. Pentru a obține pasul, intervalul de modificare x este împărțit la 10.

3. Creați un program pentru rezolvarea problemei. În program, pentru fiecare valoare a lui x, asigurați-vă calcularea atât a unei sume aproximative, cât și a unei sume exacte a seriei corespunzătoare y folosind formula dată în tabel.

valoarea exactă a sumei seriei, precum și numărul de termeni însumați.

Progres

1. Setați x0 - începutul ciclului și xl - sfârșitul ciclului

2. Setați pasul h folosind formula

4. Creați un program pentru rezolvarea problemelor folosind o metodă recurentă

5. Construiți un tabel cu datele primite

Formula serie:

Formula pentru calculul exact al sumei: π/4

1. x0= π/10 xk=9 π/10

3.


real:: a,b,c,eps,h,s,x,x0,xk,y,p

b=(sin*(x)*(2*n)-1+sin*((2*n-1)*x))/4*n-2

daca(abs(a)

imprimați 2,x,s,y,n; scrieți(1,2)x,s,y,n

end do 2 format("x=",f6.3,3x,"s=",e10.3,3x,"y=",e10.3,3x,"n=",i5)

programul final lab3


X S x) y
0.314 0.324 0.785
0.565 0.622 0.785
0.817 0.979 0.785
1.068 1.404 0.785
1.319 1.43 0.785
1.57 -19.257 0.785
1.821 -533.961 0.785
2.072 -8,624E+3 0.785
2.324 -9,986E+4 0.785
2.575 -8,928E+5 0.785
2.826 -6,477E+6 0.785

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. Când executați o buclă, 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 inferioară a caracterului introdus efectiv. Operatorii „start” și „end” 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.

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva