Programarea proceselor ciclice de procesare a datelor computaționale. Programarea proceselor de calcul ciclic. Un exemplu de utilizare a instrucțiunii for

Î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 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 declarații condiționale 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 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.

„Programarea proceselor de calcul ciclic”

Scopul lucrării: stăpânirea metodelor de compilare a algoritmilor pentru procese de calcul ciclice și organizarea de programe ciclice de structură complexă.

Partea teoretică

4.1.1. Algoritmi ciclici.

Un ciclu este o succesiune de acțiuni care pot fi efectuate de mai multe ori.

Un algoritm round-robin este un algoritm care conține una sau mai multe bucle.

Există 3 tipuri de cicluri:

Bucla cu precondiție;

Bucla cu postcondiție;

Buclă cu un numărător (buclă de numărare).

Dacă execuția unei bucle este asociată cu o condiție logică, atunci se folosesc bucle cu o precondiție sau o postcondiție.

Buclele contrare sunt o clasă în care execuția corpului buclei trebuie repetată de un număr prestabilit de ori.

Diagramele bloc ale algoritmilor ciclici arată astfel:

1. Buclă cu un contor.

2. Buclă cu precondiție. 3. Buclă cu postcondiție.

4.1.2 Operatori de buclă în limbajul de programare C++.

În C++, pentru fiecare tip de buclă există un operator corespunzător:

Loop like while (cu precondiție);

Loop like do...while (cu postcondiție);

Buclă like for (numărând).

1. Operator de buclă ca while

Formularul de înscriere:

while (condiție) declarație;

unde: (condiție) – expresie logică;

operator – operatorul sau corpul buclei executat într-o buclă.

Dacă corpul buclei este o instrucțiune compusă, atunci trebuie inclusă între paranteze operator (...):

în timp ce (condiție)

grup de operatori

Schema cum funcționează o astfel de buclă: în timp ce condiția este adevărată, corpul buclei este executat și condiția este verificată din nou etc. Când condiția devine falsă, bucla iese.

2. Operator de buclă ca do...while

Formularul de înscriere:

operator;

în timp ce(condiție);

Schema de funcționare a unei astfel de bucle: mai întâi se execută operatorul, apoi se verifică condiția, dacă condiția este adevărată, se execută operatorul și se verifică din nou condiția etc. Când condiția devine falsă, bucla iese.

Dacă corpul buclei este o instrucțiune compusă, atunci, ca și în cazul unei bucle cu o precondiție, aceasta trebuie inclusă între paranteze operator (...):



grup de operatori

în timp ce(condiție);

3. Operator buclă ca for

Formularul de înscriere:

operator;

A este o expresie inițială care specifică valorile inițiale pentru parametrul buclei și, dacă este necesar, valorile inițiale pentru alți parametri. De exemplu:

i=0, x=0,5, p=1, s=0

B este o expresie condiționată care verifică condiția pentru continuarea buclei. De exemplu:

C este o expresie de increment care specifică incrementul parametrului buclei și, dacă este necesar, alți parametri, apoi se scriu într-o listă. De exemplu: x+=0,1, i++

4.1.3 Un exemplu de compilare a unui algoritm și program în C++ pentru un proces de calcul ciclic.

Calculați valoarea unei expresii:

b– valoarea inițială, valoarea acesteia se introduce de la tastatură și nu se modifică;

A– modificări ale intervalului în trepte de 1;

y– rezultat, valorile sale sunt afișate pe ecran.

Pe baza specificației, variabila a este un număr întreg, deci poate fi folosită ca numărător într-o buclă de numărare.

Diagrama bloc a algoritmului pentru rezolvarea acestei probleme folosind un ciclu de numărare este următoarea:

#include

#include

#include

printf("Introduceți b: ");

scanf(„%f”,&b);

printf(„a y\n”);

pentru (a=0;a<=10;a++)

printf(„%3d”,a);

printf(„%8.2f\n”,y);

y=(a-b)/sqrt(a);

printf(„%8.2f\n”,y);

Diagrama bloc a algoritmului pentru rezolvarea acestei probleme folosind o buclă cu o precondiție este următoarea:

Textul programului C++ corespunzător acestui algoritm este următorul:

#include

#include

#include

printf("Introduceți b: ");

scanf(„%f”,&b);

printf(„a y\n”);

printf(„%3d”,a);

printf(„%8.2f\n”,y);

y=(a-b)/sqrt(a);

printf(„%8.2f\n”,y);

else printf(“y nu există\n”);

Diagrama bloc a algoritmului pentru rezolvarea acestei probleme folosind o buclă cu o postcondiție este următoarea:

Textul programului C++ corespunzător acestui algoritm este următorul:

#include

#include

#include

printf("Introduceți b: ");

scanf(„%f”,&b);

printf(„a y\n”);

printf(„%3d”,a);

printf(„%8.2f\n”,y);

y=(a-b)/sqrt(a);

printf(„%8.2f\n”,y);

else printf(“y nu există\n”);

In timp ce<=10);

Partea practică

4.2.1 Cerințe pentru efectuarea lucrării:

Finalizați sarcina din munca de laborator nr. 3 pentru un interval de valori ale uneia dintre variabile. Variabila care se modifică, intervalul său de modificare și pasul sunt indicate în Tabelul 4. Creați diagrame bloc de algoritmi și programe pentru cele două tipuri de cicluri specificate în sarcina individuală (Tabelul 4).

Formalizați ieșirea rezultatelor astfel încât valorile parametrului variabilei să fie clar evidențiate și pentru fiecare valoare specifică, valorile rezultatului (trei variabile din coloana 2 a tabelului 3) să fie afișate în formular a unei mese.

Ordinea de lucru.

1. Efectuați o analiză a sarcinii, formulați o enunțare a problemei.

2. Creați diagrame bloc ale algoritmilor.

3. Creați un program în C++. Furnizați intrarea datelor inițiale de la tastatură și afișarea rezultatelor pe ecran.

4. Verificați funcționalitatea programului pe diferite date inițiale.

5. Analizați rezultatele obținute.

Opțiuni pentru sarcini individuale.

Opțiunile pentru teme individuale sunt selectate din Tabelul 4 în conformitate cu numărul de elev din lista de grup din jurnalul profesorului.

Tabelul 4. Opțiuni pentru sarcini individuale

Nu. Variabilă mutabilă Tipuri de cicluri
10 ≤ a ≤ 10,Δ a=1
-4 ≤ d ≤ 4, Δ d = 0,5
-6 ≤ x ≤ 3, Δ x = 0,5
0 ≤ b ≤ 3 0, Δ b = 1,5 1. Cu condiție prealabilă, 2. Numărabil
-15 ≤ j ≤ 1 0, Δ j = 0,5 1. Cu precondiție, 2. Cu postcondiție
5 ≤ e ≤ 35,Δ e = 2 1. Numărabil, 2. Cu postcondiție
-5 ≤ m ≤ 15,Δ m = 1 1. Cu condiție prealabilă, 2. Numărabil
1 ≤ c ≤ 70,Δ c = 3 1. Cu precondiție, 2. Cu postcondiție
1,5 ≤ c ≤ 15,Δ c = 0,5 1. Numărabil, 2. Cu postcondiție
-8 ≤ b ≤ 28,Δ b = 2 1. Cu condiție prealabilă, 2. Numărabil
-4,5 ≤ x ≤ 11,5,Δ x = 0,5 1. Cu precondiție, 2. Cu postcondiție
-7 ≤ k ≤ 2,Δ k = 0,3 1. Numărabil, 2. Cu postcondiție
-1 ≤ m ≤ 21,Δ m = 1 1. Cu condiție prealabilă, 2. Numărabil
-2 ≤ e ≤ 34,Δ e = 2 1. Cu precondiție, 2. Cu postcondiție
-11 ≤ c ≤ 23,Δ c = 2 1. Numărabil, 2. Cu postcondiție
-13 ≤ p ≤ 50,Δ p = 3 1. Cu condiție prealabilă, 2. Numărabil
3,3 ≤ b ≤ 9,3,Δ b = 0,3 1. Cu precondiție, 2. Cu postcondiție
3,5 ≤ y ≤ 12,3,Δ y = 0,4 1. Numărabil, 2. Cu postcondiție
-7,5 ≤ a ≤ 5,7,Δ a = 0,6 1. Cu condiție prealabilă, 2. Numărabil
-1,5 ≤ h ≤ 1,2,Δ h = 0,1 1. Cu precondiție, 2. Cu postcondiție
0 ≤ h ≤ 10,Δ h=0,5 1. Numărabil, 2. Cu postcondiție
-15 ≤ b ≤ 15, Δ b =2 1. Cu condiție prealabilă, 2. Numărabil
-7 ≤ l ≤ 3, Δ l = 0,5 1. Cu precondiție, 2. Cu postcondiție
-5,5 ≤ b ≤ 6,5, Δ b = 0,5 1. Numărabil, 2. Cu postcondiție
1 ≤ k ≤ 9, Δ k = 0,4 1. Cu condiție prealabilă, 2. Numărabil
0 ≤ b ≤ 6,9,Δ b = 0,3 1. Cu precondiție, 2. Cu postcondiție
-3 ≤ v ≤ 9,Δ v = 0,6 1. Numărabil, 2. Cu postcondiție
-2 ≤ p ≤ 2,6,Δ p = 0,2 1. Cu condiție prealabilă, 2. Numărabil

4.3 Întrebări de testare și sarcini practice:

1. Cum funcționează declarația while?

2. Cum funcționează declarația do ... while?

3. Cum funcționează declarația for?

4. Subliniați enunțurile din program care formează un ciclu.

5. Care este diferența dintre declarațiile while și do ... while?

6. Înlocuiți un operator de buclă din program cu altul.

În programare, întâlnim adesea probleme care implică procese care se repetă. Prin urmare, trebuie să cunoaștem și să putem folosi un astfel de concept ca „ procese de calcul ciclic».

Va fi ușor pentru un programator începător să le înțeleagă folosind un exemplu generalizat. Mai mult, este important să înțelegeți că în toate limbajele de programare există modalități de implementare a buclelor.

Ce este o buclă în programare?

Un ciclu - în programare, este repetarea repetată a acelorași acțiuni sau calcule, dar în funcție de aceleași dependențe cu valori diferite ale variabilelor.

Întâlnim conceptul de ciclu nu numai în programare. Există cicluri în multe domenii ale vieții noastre.

De exemplu, ciclul apei în natură este un ciclu natural în viața noastră.

Acum să ne uităm la regulile și conceptele generale utilizate în ciclurile de calcul.

Etapele procesului ciclic

În general, ciclul ar trebui implementat în 4 etape:
  • Etapa 1 – pregătirea ciclului (inițializarea).
    Setarea valorii inițiale pentru parametrul și variabila buclă.
    Parametru de buclă– această valoare care numără numărul de pași ai ciclului (numărul de repetări ale ciclului).
    Variabilă buclă este o mărime care își modifică valoarea în fiecare etapă a ciclului.
    Inițializare– aceasta este setarea valorilor inițiale pentru parametrul și variabila buclă.
  • Etapa 2 – corpul ciclului.
    Aceasta este repetarea repetată a unei acțiuni într-un ciclu sau calcule bazate pe aceleași dependențe matematice cu valori diferite ale variabilelor.
  • Etapa 3 – modificarea (modificarea) ciclului.
  • Etapa 4 – managementul ciclului.
    Aceasta este o verificare a condiției pentru continuarea sau începerea buclei.
Există 3 operatori de buclă în pascal care pot implementa oricare algoritmic – structură ciclică :
  1. Declarație buclă cu parametru
  2. Operator de buclă cu precondiție
  3. Operator de buclă cu postcondiție
Le vom analiza în detaliu în articolul următor.

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 „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.




Top