internetul Windows. Android

Structura blocului. Structura programului: bloc

De regulă, procedurile și funcțiile sunt situate în partițiile procedurilor și funcțiilor, adică sunt încorporate în programe sau în alte subrutine. Cu un astfel de atașament, descrierea subrutină este componenta unității, iar subrutina însăși include un bloc, atunci puteți introduce aspectul unui bloc extern și intern.

Unitatea externă este un bloc în care este investit subrutina. Blocul intern este subrutina în sine. Toate descrierile situate în blocuri externe pentru acest subprogram sunt numite globale blocului, care formează această subrutină. Toate descrierile situate în blocul interior sunt numite locale. Puteți intra în conceptul de niveluri de cuibărit. Dacă în descrierea procedurilor și funcțiilor descrie două sau mai multe subrutine, ei spun că aceste subprograme de un nivel de cuibărit. În ceea ce privește blocul extern, acestea sunt interne. În legătură cu subprogramele în sine, nu putem folosi termenii termeni externi sau interni, deoarece sunt un nivel de cuibărit. Dacă o subrutină este încorporată în descrierile procedurilor și funcțiilor blocului extern, în cadrul căruia o altă subrutină este situată în aceeași secțiune, vorbim despre diferite nivele de cuibărit de subrutine. Pentru al treilea bloc, care este cel mai intern subprogramm, ambele blocuri în care sunt încorporate vor fi externe. Nivelul de cuibărit al acestui subprogrammei 2. Pentru al doilea bloc, al treilea bloc va fi intern, iar primul este extern. Nivelul de cuibărit al celui de-al doilea bloc 1. Pentru primul bloc (exterior) al doilea și al treilea bloc va fi intern. Nivelul de cuibărit al primului bloc 0, adică Această unitate este principalul program.

De exemplu, ia în considerare structura blocurilor propuse de autor al limbii (Fig.16.16). Aici, în secțiunea a șaptea a programului A, sunt încorporate două subrutine B și C

Smochin. 16.16. - Exemplu de structură bloc

Vom înțelege cu scopul descrierilor. Descrierile etichetelor sunt valabile numai în secțiunea operatorilor de bloc în care sunt descriși. Toate celelalte descrieri acționează nu numai în interiorul blocului în care sunt descrise, dar și în toate blocurile interne încorporate în această unitate (indiferent de adâncimea de cuibărit). Pare că ar putea apărea conflicte între descrierile globale și localeDeoarece diversele concepte pot fi numite în diferite blocuri de nume identice. Pentru ca astfel de conflicte să nu aibă loc, se iau următoarea regulă - toate numele definite în descrierile locale anulează acțiunile numelor coincidente descrise în descrierile globale. În fig. 16.17 prezintă localizarea blocurilor dintr-un exemplu în niveluri. Aici, liniile săgeată arată acțiunea descrierilor globale. Astfel încât în \u200b\u200bblocul G, există descrieri ale blocurilor externe D, B, A.

Smochin. 16.17. - localizarea blocurilor pe niveluri și descrieri globale

Vom lua în considerare mai ales accesul la subrutine. Orice subrutină poate fi numită:

    de la operatorii de bloc în care este descris;

    de la partiția operatorilor însuși (recursion direct);

    din secțiunea operatorilor oricărei subrutină internă în legătură cu aceasta (recursionarea indirectă);

    din secțiunea operatorilor oricărui subprogram descris mai devreme în același bloc, în cazul în care această subrutină.

Aceste reguli pot fi reformulate după cum urmează - orice subprogramm poate solicita:

    orice subprogram descris în secțiunea subrutine din acest lucru;

    auto (recursion direct);

    toate subprogramele externe în legătură cu aceasta (recursionarea indirectă);

    subprograme descrise mai devreme la același nivel de cuibărit.

Interacțiunea blocurilor (subrutine) din exemplul este prezentată în fig. 16.18.

Smochin. 16.18 - Un exemplu de interacțiune între blocuri

Aici, liniile săgeată indică posibilitatea de a apela subrutine pentru execuție (săgețile indică direcția apelului). De exemplu, din program, pot fi cauzate numai subprograme în și C, care sunt investite în secțiunea a șaptea. Din subroutina F, subroutina F (recursion direct), subrutina C, la care este încorporată (recursion indirectă) și subprogramul E (este la același nivel și este descris anterior). S Programele A pot fi cauzate de subrutine B și C. Tabelul 16.9 pentru afișarea tuturor interacțiunilor posibile între blocuri. Aici, algoritmul principal este un bloc din care se face apelul subrutin, algoritmul auxiliar este numita subrutină.

Tabelul 16.9.Un exemplu de interacțiune între blocuri

Proceduri și funcții. Structura blocului Programe. Parametri.

Exemplu

Exemplu

Exemplu

O serie de numere reale a (10) este dată. Aranja această matrice Ascendent elementele sale, ᴛ.ᴇ. Faceți astfel încât fiecare element următor al matricei să fie mai mult decât cel precedent.

Luați în considerare una dintre cele mai multe algoritm simplu.dezvoltate pentru sarcinile de acest tip (figura 5).

Ideea acestui algoritm este în esență că elementele matricei de pornire sunt comparate în perechi mai întâi A 1 C A 2, apoi A 2C A 3, în continuare, cu 3 C A 4, etc. Dacă primul element din pereche este mai mult decât al doilea, atunci valorile lor numerice se schimbă, astfel încât primul element primește valoarea celei de-a doua și al doilea. În caz contrar, nu se fac substituții într-o pereche și comutați la compararea elementelor celei de-a doua perechi.

ᴀᴋᴎᴍᴀᴋᴎᴍ ᴏϭᴩᴀᴈᴏᴍ, există o "împingere" treptată a celui mai mare element al capătului matricei, iar funcția "trage" din algoritm efectuează ciclul intern. De îndată ce cel mai mare element al matricei se ia în ultimul loc, procedura descrisă este repetată cu cele mai îndepărtate 9 elemente, datorită căreia cel mai mare dintre elementele rămase va lua penultimul loc în matrice etc.

Pentru a obține un rezultat dorit, o astfel de procedură trebuie făcută de nouă ori, de fiecare dată când numărul repetițiilor ciclului intern ar trebui să scadă cu 1.

Această sarcină este rezolvată de ciclul extern. Parametrul său, care rulează de la repetare la repetarea de 9,8,7, ..., 1 servește nu numai de numărul de repetări efectuate, dar în același timp și cea mai mare valoare Parametrul ciclului intern.

program Fel;

var.

i, K: intege. r;

b: real ;

a: array. ofreal. ;

Începe.

scrie ("introduceți o matrice -");

pentru I: \u003d 1 la. 10 do. Readln (A [i]);

writeln ("Array Source");

pentru I: \u003d 1 la. 10 do. Writeln (A [I]: 5: 2);

pentru I: \u003d 9 downto. 1 do.

pentru K: \u003d 1 la. I. dood. A [K]\u003e A atunci.

Începe.

b: \u003d A [K]; A [K]: \u003d a; A: \u003d B

sfârșit.

writeln ("Array comandat");

pentru I: \u003d 1 la. 10 do. Scrieți (A [i]: 5: 2)

sfârșit. .

Matrix Dana (20 * 20). Pentru a forma un vector cu (20), al cărui element este produsul elementelor coloanei matricei, cu excepția elementului de pe diagonala principală. Indicarea rândurilor și a coloanelor matricei originale încep de la zero, indexarea elementelor vectoriale cu 10.

Formarea unei noi matrice (vector) este înregistrarea valorilor elementelor sale la celulele de memorie rezervate acestora. Valoarea numerică a fiecărui element al vectorului C este formată în ciclul intern al algoritmului, iar înregistrarea în celulă este în exterior după finalizarea următoarei repetări a corpului ciclului intern.

program Masiv;

b: array. ofreal. ;

c: array. ofreal. ;

p: real ;

m, N: întreg ;

Începe.

pentru M: \u003d 0 la. 19 do.

pentru N: \u003d 0 la. 19 do. Readln (B);

pentru N: \u003d 0 la. 19 do.

Începe.

p: \u003d 1; pentru M: \u003d 0 la. 19 do.

dacă M.<>n. atunci. (Formarea unei lucrări)

p: \u003d p * b; (Elemente ale coloanei matricei)

(cu excepția diagonali)

c: \u003d p; (Înregistrată formată)

(element vectorial în celula de memorie)

sfârșit. ;

pentru N: \u003d 10 la. 19 do. Writeln (C [N]: 10: 3)

sfârșit. .

Dana Matrix Mat (5 * 5), constând din elemente reale. Schimbați șirul matricei în locuri care conțin elemente maxime și minime.

program Minim maxim;

tip

m \u003d. array. ofreal. ;

var.

mAT: array. de. m;

maxi, Mini, I, J, I1, J1: întreg ;

Începe.

scrie ("Introduceți matricea - ');

pentru I: \u003d 1 la. 5 fă Pentru J: \u003d 1 la. 5 do. Citiți (MAT);

i1: \u003d 1; J1: \u003d 1; (Indicii minim de elemente)

i2: \u003d 1; J2: \u003d 1; (Indicii maximi ai elementelor)

pentru I: \u003d 1 la. 5 do.

pentru J: \u003d 1 la. 5 do.

dacă Mat\u003e Mat.

atunci.

Începe.

i2: \u003d i; J2: \u003d J (amintiți-vă indexurile unui maxim maxim)

sfârșit.

altfel.

dacă Mat.

atunci.

Începe.

i1: \u003d i; J1: \u003d J; (Amintiți-vă indicele noului minim)

sfârșit. ;

str: \u003d mat; (Înlocuind rândul matricei mat,)

mat: \u003d covor; (Conținutul maxim)

mat: \u003d str; (element, șir cu minim-)

(nume și invers)

pentru I: \u003d 1 la. 5 do.

Începe.

pentru J: \u003d 1 la. 5 do. Scrieți (MAT);

sfârșit.

Programul rezolvă două sarcini principale: căutarea liniilor, în care se află cele mai mari și cele mai mici elemente ale matricei și schimbul de date conținute în aceste linii.

Prima sarcină este un fel de sarcină tipică de căutare maximă sau un minim.

Diferența față de tipic constă, de fapt, elementele maxime și minime ale matricei sunt determinate, dar indicii lor. Variabilele sunt utilizate pentru stocarea indexurilor i1, J1. - pentru elementul minim și i2, J2 - Pentru maxim.

Pentru a rezolva a doua sarcină, sunt utilizați trei operatori de atribuire în care rândurile matricei sunt implicate cu elemente maxime și minime și o matrice auxiliară unidimensională. str..

< Что такое подпрограмма и для чего она нужна >

În Pascal, există două tipuri de subrutine: proceduri și funcții. Principala diferență dintre acestea este că funcția returnează valoarea și poate fi utilizată în expresii, de exemplu:

În timp ce procedura este chemată să efectueze una sau mai multe sarcini:

Writeln ("Aceasta este verificarea");

Procedurile și funcțiile vă permit să includeți blocuri suplimentare în principala unitate software. Fiecare descriere a procedurii sau a funcției conține un antet urmat de un bloc software.

Procedurile și funcțiile pot apărea oriunde corpului principal al programului. Pentru proceduri, se utilizează următorul format:

procedură. Numele procedurii (parametri);

Funcțiile au același format ca și procedurile, cu excepția faptului că încep cu titlul funcţie.și se termină cu un tip de date pentru funcția de returnare:

funcţie. Funcționare_name (parametri): tip de date;

Procedurile și fuchii pot avea constantele lor, tipurile de date, variabilele și chiar propriile proceduri și funcții. Dar toate aceste elemente pot fi utilizate numai în acele proceduri și funcții în care sunt determinate.

Procedura este activată utilizând operatorul de procedură. Funcția este activată la calcularea unei expresii cuprinzând un apel funcțional, iar valoarea returnată a valorii este substituită în această expresie.

Proceduri și funcții. Blocarea structurii programului. Parametri. - concept și specii. Clasificarea și caracteristicile categoriei "Proceduri și funcții. Structura blocului de program. Parametrii". 2017, 2018.

4.8. Structura blocului.

Limba "C" nu este o limbă cu structura blocului în

le pl / 1 sau algola; Nu poate fi descrisă cu privire la unele funcții.

În interiorul altora.

Variabilele, pe de altă parte, pot fi determinate de

metoda de structurare bloc. Descrieri variabile (inclusiv

initializarea ceaiului) poate urma suportul din stânga

care deschide orice operator și nu numai pentru asta

roy începe corpul funcției. Variabile descrise de astfel de

odată, deplasarea oricăror variabile de la blocurile externe având

aceleași nume și rămân anumite la cele corespunzătoare

figura din dreapta. De exemplu, în

Int i; / * Declarați un nou i * /

Pentru (i \u003d 0; i< N; I++)

Zona de acțiune a variabilei I este ramura "adevărată"

DACĂ; Acest lucru nu este legat de niciun alt I în program

Structura blocurilor afectează domeniul de aplicare al externului

variabile. Dacă sunt date descrieri

Apoi apariția lui X în interiorul funcției F se referă la re-

menna. tip dublu., și în afara f - la întreaga variabilă externă.

este adevărat cu privire la numele parametrilor formali:

În interiorul funcției, numele X se referă la parametrul formal și

nu la variabila externă.

4.9. Inițializare.

Am menționat mai multe ori inițializarea, dar

Întotdeauna trecerea, printre alte probleme. Acum, după

cum am discutat despre diverse clase de memorie, suntem în această secțiune

rezumează unele dintre regulile referitoare la inițializare.

Dacă nu există o inițializare explicită, atunci extern și

variabilele variabile sunt atribuite zero; automat

și înregistrările variabilelor sunt în acest caz

valori împărțite (gunoi).

Variabilele simple (nu se pot aduce matrice sau structuri)

calvizați cu descrierea lor prin adăugarea după semnul numelui

egalitatea și expresia constantă:

Char shote \u003d "\\";

Zi lungă \u003d 60 * 24; / * Minute într-o zi * /

Pentru variabilele externe și statice, inițializarea

doar o dată, la etapa de compilare. I.

variabilele de înregistrare sunt inițializate de fiecare dată de intrare

în funcție sau bloc.

În cazul variabilelor automate și de înregistrare, inițializarea

torus nu este obligat să fie o constantă: de fapt el poate fi

orice expresie semnificativă care poate include anumite

valori anterioare și chiar apel la caracteristici. De exemplu,

inițializarea în programul de căutare binară din capitolul 3 ar putea

ar fi înregistrat în formular

Int high \u003d n - 1;

Int scăzut, ridicat, mijlocul;

În funcție de rezultatul său, inițializarea schimbării automate

există înregistrări abreviate a operatorilor de atribuire.

Ce formă preferă - în esență cazul gustului. noi de obicei

folosim misiuni explicite, deoarece inițializarea în

descrierile sunt mai puțin vizibile.

Array-urile automate nu pot fi inițializate. Extern

și matricele statice pot fi inițializate prin plasare

urmând descrierea, lista închisă în paranteze curbate

valorile curate separate prin virgule. De exemplu, un program

numărarea caracterelor din capitolul 1, care a început cu

Int c, i, nwhite, nother;

Nwhite \u003d nother \u003d 0;

Pentru (i \u003d 0; i< 10; I++)

Ea este rescrisă în formă

Int ndigit \u003d (0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

Principalele () / * numără cifre, spațiu alb, altele * /

Aceste inițializări nu sunt de fapt necesare, deoarece toate sarcinile

valorile sunt zero, dar un stil bun - să le facă

evident. Dacă numărul valorilor inițiale este mai mic decât

dimensiunea matricei, elementele rămase sunt umplute cu

lei. Listarea de asemenea număr mare. Valori inițiale

este o eroare. Din păcate, nu este posibil

instrucțiuni că un anumit sens inițial se repetă și

este imposibil să inițializați elementul în mijlocul matricei fără

la toate cele anterioare.

Pentru matrice simbolice există un mod special

inițializare; În loc de paranteze și virgule curbate, puteți utiliza

utilizați șirul:

Char model \u003d "";

Aceasta este o înregistrare mai lungă, dar echivalentă:

Caractere char \u003d ("t", "h", "e", "\\ 0");

Dacă dimensiunea unei matrice de orice tip este omisă, compilatorul este determinat

decals lungimea sa, numărarea numărului de valori inițiale. ÎN

acest caz particular este dimensiunea egală cu patru (trei caractere

plus finit \\ 0).


Motive. În același timp, abstractizarea filosofică a limbii este legată inextricabil de principalele teme și mișcări ale filozofiei în ansamblu. Mai precis, etapele primite în mod tradițional în cadrul analizei AF a unei limbi obișnuite au fost profund influențate de filosofia lui Je Mura, în special a învățăturii sale despre bunul simț, conform căreia astfel de concepte ca "om", "pace", " I "," Lumea externă "," ...

Și alte țări CSI, precum și facilitarea accesului la cultura și știința rusă și mondială. Astfel, judecând după datele cercetării noastre, cererea limbii ruse a rămas ridicată în republică. Mulți reprezentanți ai tinerilor moderni moldoveni continuă, în calitate de tați și bunicii lor, ajung la cultura rusă, realizările științifice și tehnice ale Rusiei. Limba rusă rămâne limbă ...

Scrisoare de silabă verbală pitorească). Monumente ale perioadei eamice medii (14-12 secole. BC) sunt realizate de capătul curat Akkadian. Monumentele perioadei novoelamiene se referă la 8-6 secole. BC. El a fost o limbă oficială în statul persan al lui Ahemenidov în 6-4 metri. Se presupune că este influențat de vechea paseda, păstrată la Evul Mediu timpuriu. 7. Limba limbii Burussa Buruski (...

... / Dialect), Scythian, Sogdysky, mijlocul Percidan, Tadjik, Tajyrishi (limba / dialect), Tatysh, Tatsky, Khorezmisian, Khotańsk, Shullo-Rushanskaya Grup de limbi, Yagnobskiy, Yazguliam și altele. Acestea aparțin sucursalei Indoran din limbile indo-europene. Domenii de distribuție: Iran, Afganistan, Tadjikistan, unele zone din Irak, Turcia, Pakistan, India, Georgia, Federația Rusă. General ...

Modulul este o parte independentă funcțională a unui program care conține un set de variabile, constante, funcții și proceduri interconectate, menite să implementeze pe oricine funcționalitate. Modulul poate fi depanat independent de alte module de program și, prin urmare, să se organizeze lucrare comună Mai mulți programatori deasupra unui program rupt în module.

Utilizând module, puteți crea biblioteci de legătură care pot fi stocate atât sub formă de sursă, cât și codul de obiect (codul care este pregătit pentru compilarea articulară și combinarea cu alte module). În Delphi, codul obiect compilat al modulului este stocat în fișiere cu extensia ".dpu".

Structura modulului este similară cu structura programului din Pascal. Titlul modulului este necesar și începe cu unitatea de cuvânt (în loc de program ca în programul obișnuit):

Unitate.<имя модуля>;

Numele modulului trebuie să se potrivească cu numele fișierului în Pascal. Când Delphi generează automat module diferite, acesta o face astfel încât numele modulului să coincide cu numele fișierului.

Spre deosebire de program, corpul modulului (împărțirea operatorilor) poate fi absent. Se utilizează pentru inițializarea variabilelor modulului și este efectuată înainte de a efectua operatorilor principali de program. Modulul conține două părți obligatorii: interfață și executiv.

Partea de interfață a modulului este, de asemenea, numită deschisă, iar Executivul este închis. Anunțurile din secțiunea de interfață sunt adesea menționate ca o interfață deschisă, iar anunțurile din secțiunea de implementare sunt o interfață închisă. Toate variabilele și funcțiile declarate în secțiunea Interfață sunt disponibile pentru toate modulele și programele care leagă acest modul. Toate variabilele și funcțiile declarate în secțiunea de implementare sunt disponibile numai în acest modul. O astfel de diviziune domenii de aplicare Fabricat în mod specific pentru a se ascunde de la utilizator acele etape intermediare de calcule pe care nu le trebuie să le cunoască și care poate fi neglijentă sau deliberată stricată. Este furnizat. protecție fiabilă Toate funcțiile și variabilele care sunt destinate numai uz internDeși nu este întotdeauna convenabil și trebuie să scrieți funcții suplimentare Pentru a accesa variabilele interne.

Partea de interfață începe cu interfața Word. Prin interfață, programul principal este conectat cu un modul sau un modul cu alte module. În partea de interfață, sunt indicate obiecte (proceduri, funcții, variabile, constante, tipuri), disponibile pentru oricare dintre utilizatori ai acestui modul.

Printre procedurile și funcțiile modulului pot fi auxiliare, pe care dezvoltatorul modulului nu le poate include în descrierea interfeței, atunci acestea vor fi ascunse de utilizatori și nu sunt disponibile pentru a fi utilizate în afara modulului.

Dacă modulul utilizează alte module în activitatea sa (proceduri, funcții, variabile) ale altor module, acest lucru este indicat la începutul modulului utilizând designul utilizări, după care sunt specificate numele tuturor modulelor conectate la acest lucru, de exemplu, :

Utilizează M1, M2 ...;

Apoi, în partea de interfață, constantele, tipurile, variabilele, procedurile și funcțiile care pot fi utilizate la apelarea acestui modul sunt descrise și procedurile și funcțiile sunt indicate ca titluri, fără un corp. Procedurile corpului în sine sunt descrise mai târziu în partea executivă închisă a modulului. Este foarte important în partea de interfață cu ajutorul comentariilor documentate toate destinațiile pentru fiecare element al părții interfeței, toți parametrii, constantele și tipurile, astfel încât utilizatorii modulului să poată folosi cu ușurință.

Partea de interfață se încheie cu începutul părții executive. Partea executivă începe cu implementarea cuvântului cheie. Conține organismele tuturor procedurilor și funcțiilor descrise în partea de interfață. Poate include etichete locale de caracteristici și partiții ale operatorilor. După implementarea cuvântului poate, de asemenea, să urmărească cuvântul utilizări cu o listă de module care sunt utilizate în partea executivă. Următoarele sunt etichetele, tipurile, constantele, variabilele, procedurile și (lubpicele modulului.

După partea executivă, este necesar să urmați partea opțională a inițializării datelor, începând cu inițializarea cuvintelor cheie. Acesta conține operatori efectuați o dată la primul apel la modul,

La sfârșitul modulului, o parte opțională a finalizării poate merge, începând cu cuvântul cheie de finalizare, în care operatorii executați în timpul finalizării funcționării modulului. Modulul este finalizat cuvânt cheie. "SFÂRȘIT." Cu un punct obligatoriu la sfârșit.

Descrierea scurtă de sintaxă a modulului arată astfel:

Dacă variabilele sunt utilizate în diferite module, prefixul trebuie utilizat pentru a accesa un modul variabil:

<имя модуля>. <имя переменной>.

Exemplul 10.1. Luați în considerare posibilitatea interconectării modulelor. Programul se poate transforma în mai scurt dacă permiteți modulele să utilizeze elementele interne ale celuilalt.

marcarea "\u003e relație strânsă între module (sau grad ridicat de module de cuplare) și în acest caz devine imposibil să le folosească separat, ceea ce încalcă principiile programării modulare.

Dacă faceți o conexiune încrucișată în partițiile de interfață, compilatorul va remedia eroarea. Conectarea încrucișată a modulelor se poate face numai în secțiunile de implementare, dar este mai bine să se evite din cauza dependenței reciproce rezultate a modulelor.

De obicei, la proiectarea programelor, partiționarea proiectului pe module apare la începutul dezvoltării sistem software.. Acest proces se numește modularizare. De regulă, analistul proiectului și grupul său este angajat în acest sens. Se crede că dimensiunea modulului ar trebui să fluctueze în intervalul de 30-300 rânduri ale textului sursă. Claritatea modulului este îmbunătățită semnificativ prin utilizarea modulului de comentariu din titlu (începutul) descriere detaliata Funcțiile sale. La briefing, este suficient să citiți comentariile de rubrici, practic nu acordă atenție restului textului.

De obicei, rezultatul modularizării este reprezentat ca un grafic al interrelațiilor module și (sau) subsistemelor. Baza ("rădăcină") a acestui grafic este programul principal.. Fiecare vârf al graficului este module, iar arcul care leagă vârfurile arată relația dintre modulele între ele.

Aproape de vârfurile graficului sunt elemente de interfață prescrise: numele procedurilor, funcțiilor, constantelor, variabilelor declarate în partea deschisă a modulului, care sunt descrise în continuare în detaliu în comentariile la modul ca descriere completă Partea de interfață. Deasupra arcilor sunt prescrise acele nume care sunt utilizate în modulul asociat (de obicei părinte). În acest caz, conexiunea poate fi încrucișată, adică Modulul A utilizează elementele de interfață ale modulului în și. Dimpotrivă, modulul B utilizează elementele de interfață ale modulului A. După cum sa menționat deja, un astfel de design este nedorit, dar poate. În acest caz, elementele de interfață utilizate sunt prescrise mai sus și sub arcul care leagă modulele. Dăm un exemplu de un astfel de grafic (figura 10.1
).

Aici, programul principal P este împărțit în trei module principale M1, M2, MW. Din aceste module, programul utilizează elemente de interfață A, B, C (de la primul modul), D (de la cel de-al doilea modul), F, G, K, L (de la cel de-al treilea modul). Fiecare dintre aceste module este împărțită în mai mică, de exemplu, M2 este împărțită în M2.1, M2.2, M2.3 etc. Din această schemă, de exemplu, referințele încrucișate între module M2 și M3, precum și între M2.2 și M2.3, sunt vizibile.

După finalizarea modulației, fiecare modul este distribuit la codarea între programatori pentru a scrie independent codul și depanarea. Cu toate acestea, în astfel de cazuri, situația apare adesea atunci când se presupune că modulul părinte este să utilizeze procedurile și funcțiile modulelor copil, dar modulele fiice nu sunt încă codificate de alți programatori. De exemplu, elementele K, L de la modulele copil sunt utilizate în modulul MZ, dar aceste module nu sunt încă gata. Cum să fiți un programator care implementează codul modulului MZ? Producția din această situație se desfășoară prin scrierea procedurilor (sau a funcțiilor) din modulul părinte, care, după nume și parametri coincid cu elementele la, L. Conectorii vă permit să compilați și să executați programul în modul Debug .

"Plug" - Procedura este prezentată cu o specificație exactă a titlului (nume și parametri) și un corp gol. "Plug" - funcția este reprezentată de specificația titlului exact (nume și parametri) și are doar un singur operator în organism care returnează valoarea funcției. De exemplu, funcția de conectare a corpului poate fi așa:

formula "Src \u003d" http://hi-du.ru/e-books/xbook691/files/ris-page173.gif "Border \u003d" 0 "align \u003d" Absmiddle "Alt \u003d" (! Lang:

Cu o modulare bună, graficul interconectării modulelor, de regulă, este un copac, iar elementele de interfață sunt utilizate în funcție de coloana din frunze de copac până la noduri de nivel superior. Cu toate acestea, acest lucru nu este întotdeauna posibil și este necesar să se analizeze și să optimizeze graficul. Pentru a analiza calitatea rezultatelor modularizării, se utilizează două caracteristici: conectivitatea modulului și adeziunea modulelor care sunt luate în considerare mai jos.

Modul de conectivitate. definită ca. măsurarea componentelor de independență ale componentelor modulului. Cu cât este mai mare conexiunea modulului, cu atât este mai bună rezultatul designului. Tipurile de conectivitate (în paranteze sunt indicate de coeficientul forței de conectare):

  • funcțional (legat puternic) - 10;
  • secvențiale - 9;
  • comunicativ - 7;
  • procedural - 5;
  • temporar - 3;
  • logic - 1;
  • coincidență (conectivitate slabă) - 0.

Modulul C. conexiune funcțională Nu poate fi rupt în două alte legături de același tip. Dacă există subrutine pentru controlul fluxurilor de intrare-ieșire din modul și are o parte importantă a prelucrării acestor date, modulul efectuează o sarcină funcțională unificată. De regulă, un astfel de modul este implementat printr-o secvență de operații sub forma unui singur ciclu și are o conjuncție funcțională.

Modulul având conectat în mod consecvent Acesta poate fi împărțit în piese secvențiale care efectuează funcții independente, dar implementarea în comun a unei singure funcții. Dacă același modul este utilizat pentru a evalua și apoi pentru prelucrarea datelor, acesta are o conexiune consecventă. Un modul conectat serial este implementat ca o secvență de operații sau o secvență de cicluri.

Dacă modulul este compus din module independente care separă structura de date, atunci are conexiuni de comunicare. Structura generală a datelor este baza organizației sale ca un singur modul. Dacă modulul este conceput pentru a simplifica lucrarea cu o structură complexă de date, izolați această structură, are un comunicativ conectat. Acest modul este conceput pentru a efectua mai multe caracteristici diferite și independent utilizate (memorarea și căutarea de date). Dacă modulul este conceput pentru a izola selecția algoritmilor, acesta are o conexiune funcțională. Un astfel de modul poate procesa date cu o structură izolată, dar când apelul este considerat că efectuează singura funcție. Modulele cele mai înalte ale structurii ierarhice ale programului trebuie să aibă o coerență funcțională sau consistentă. Pentru modulele de întreținere (auxiliare), este preferabilă conectarea comunicativă. Dacă modulele au o conexiune procedurală, temporară, logică sau accidentală, aceasta indică o planificare insuficient atentă. Modificarea programului deja existent duce adesea la aceste tipuri de conexiuni.

Conexiune procedurală Se găsește în modul, ale căror structuri de control sunt organizate așa cum sunt descrise în schema structurală a programului. O astfel de structură a modulului poate apărea atunci când se dezmembrează programul lung din partea în funcție de transmisiile de control, dar fără definirea oricărei baze funcționale atunci când alegeți punctele de separare. Dacă un modul este împărțit în două module independente pentru a reduce dimensiunile (una este concepută pentru a procesa anunțurile de proceduri și date, iar al doilea este de a efectua structuri de control), fiecare dintre ele are o conexiune procedurală. Cea mai bună soluție ar trebui să fie considerată acest lucru în care modulul inițial se referă la mai multe alte module (de regulă, la trei-patru), fiecare dintre ele îndeplinește diferite funcții.

Modulul care conține părți este incoerentă funcțional, dar procesarea necesară în același timp are conexiune temporară (clasa conectată). Există cazuri în care toate funcțiile setate necesare în momentul loginului sunt efectuate de un modul de activare independent. În loc să utilizați un modul independent pentru a activa la începutul programului și celălalt pentru a transfera într-o stare pasivă la sfârșitul programului, funcția trebuie distribuită între diferite module.

Dacă operatorii sunt definiți în modul numai pe baza unei asemănări funcționale (dacă toți operatorii sunt destinate citirii sau scrierii datelor) și algoritmul de comutare este utilizat pentru a configura parametrii modulului. Acest modul are conectarea logică Deoarece nu asociază părți, dar au o ușoară asemănare între ele, de exemplu, un modul format dintr-o varietate de rutine pentru manipularea erorilor. Pe de altă parte, un modul conceput pentru a înregistra o varietate de mesaje de eroare are o conectivitate comunicativă dacă toate informațiile de ieșire pot fi obținute din fișierele de mesaje de eroare cu acesta.

Dacă operatorii de modul sunt combinați în mod arbitrar, de exemplu, când specificați plasarea lor în zona de memorie, un astfel de modul are coincidență confuzie.

Cele trei tipuri mai slabe de conectivitate apar, de regulă, ca urmare a proiectării necorespunzătoare a programului, prin urmare, este necesar să se realizeze o conexiune funcțională, consecventă, comunicativă sau procedurală.

Module de ambreiaj definită ca. măsurați independența relativă a modulelor. Modulele independente pot fi modificate fără modificarea oricăror alte module. Ambreiajul slab este mai de dorit Deoarece acest lucru înseamnă un nivel ridicat de independență a modulului. Modulele sunt considerate complet independente dacă fiecare dintre ele nu conține informații despre celălalt. Cu cât mai multe informații despre alte module sunt utilizate în ele, cu atât sunt mai puțin independente și mai tulbure. Aceste informații apar ca rezultat al utilizării încrucișate a numelor modulelor, atribuindu-se secvențele numite, aplicând implicit coduri de intrare și ieșire, precum și din datele definite de structurile regiunilor de memorie comune. Cu cât este mai aparent interacțiunea a două module conectate, cu atât este mai ușor să se determine ajustarea necesară a unui modul, în funcție de modificările produse în altele. Izolația mare și interacțiunea directă a modulelor duce la dificultăți în determinarea limitelor modificărilor într-un singur modul, ceea ce ar elimina erorile din altele. Mai jos sunt măsurile exemple de cuplare ale modulelor (în diferite surse de estimare a ambreiajului diferă) (Tabelul 10.1).

Adesea, în programe mari sunt utilizate subrotine pentru implementarea algoritmilor auxiliari. În YA, subrutinele sunt realizate sub formă de proceduri.

Descrierea procedurii

(Numele procentului) Proc (Parametrul) (procentul corpului) (denumire procentuală) ENDP în cazul în care (la sută) - trebuie să se repete de două ori și este utilizat pentru a face apel la procedură; (parametrul) poate lua una din cele două valori - (implicit) sau . Pentru a închide procedura (internă), puteți contacta, de asemenea, numai segmentul comenzilor în care este descris. În procedura îndepărtată (externă), puteți contacta orice segmente de comandă ale programului, inclusiv de unde este descrisă. Numele și etichetele descrise în procedură nu sunt localizate în interiorul acesteia, deci trebuie să fie unice în program . Deși este posibil să se descrie o procedură în interiorul celuilalt, nici un beneficiu nu și nu este utilizat, de obicei,.

Proceduri de provocare

Pe YA, toate tranzițiile dintre programul principal și procedura ar trebui organizate singure. Dacă o revenire la DOS este posibilă din procedură, se poate numi comanda de tranziție la numele procedurii JMP (nume procent) Dacă aveți nevoie de o revenire la programul de apelare, este mai ușor să utilizați apelul la comanda de apel (procente ) Apoi, în corpul procedurii trebuie să existe o comandă de returnare RET are o altă caracteristică: Amintiți-vă de returnarea adresei folosind stiva și organizați returnarea comenzilor de tranziție. La apelarea unei proceduri, procedura de parametri transmisă ar trebui luată în considerare și locația sa în raport cu punctul de apel, adică Tipul de tranziție în comanda de apel este determinat automat, de exemplu (pentru procedura P). P Apelare P Dacă acesta este un apel strâns (aproape), atunci sunt fabricate următoarele acțiuni: Stack: \u003d AB, IP: \u003d Offset P Unde AV este adresa de retur, adică. Adresa efectivă a comenzii ca urmare a provocării; Ofertă (FAR) oferă acțiuni: stivă: \u003d CS, stivă: \u003d AB, CS: \u003d SEG P, IP: \u003d Offset P Dacă descrierea procedurii este în segmentul sub comanda de apel, ar trebui să specificați atributul de tranziție de către Operatorul PTR. de exemplu, Sunați departe PTR P; Far apel P.

Localizarea procedurilor din segment

    Proceduri interne Sunt într-un segment cu apelantul.
În același timp, sunt posibile 3 opțiuni: a) toate procedurile sunt plasate mai devreme decât programul principal (cauzat), care poate fi, de asemenea, decorat ca o procedură. De exemplu: Segmentul de text "Cod" presupune ca CS: Text, DS: Date, SS: Stack A1 Proc ... Ret A1 ENDP principal Proc Mov ax, DATA MOV DS, AX ... Apel A1 ... Textul principal ENDP încheie segmentul de date. .. Datele se încheie segmentul de stivă "Stack" ... stack capete capăt B) Toate procedurile sunt sub punctul de apel. c) Proceduri - În cadrul procedurii principale, este posibil ca procedura să se afle în interiorul unei alte proceduri (deși nici un beneficiu nu o face) De exemplu, ... Principal Proc ... Apelați A1 ... MOV AX, C400H INT 21H A1 Proc ... Ret A1 ENDP TEXT TEXT TEXT 2) Proceduri externesituat în alte segmente sau alte fișiere. De exemplup, textul programului principal este localizat în fișierul "cod" din segmentul de text P.ASM; Combinarea modulelor secvențial; În segmentul general al presupunerii CS: Text, DS: date, SS: stivă Extrn Stop: Proc; Anunoparea numelui extern Proc ... STOPUL DE APLICAȚII ... Textul principal Textul se încheie segmentul de date ... Datele se încheie segmentul de stack "Stack" ... stack capete capăt Procedura de cod sursă este situată în textul P1.asm Segment public "Cod" presupune CS: oprirea publică a textului; Anunțarea numelui disponibilă din Oraș Stop Proc ...

STOP Textul ENDP se încheie capăt; Sfârșitul fișierului fără punctul de intrare, combinația acestor fișiere are loc în etapa de aspect, adică Au fost necesare difuzate necesare. De exemplu, pentru Masma Masma / Zi PR Masma / Zi P1 unde Zi este o opțiune care vă permite să puneți informații complete despre numerele și simbolurile modulului sursă (IM). După formarea PR.OBJ și P1.OBJ, acestea trebuie să fie complicate într-un singur link de bootabil / C0 PR P1, fișier compoze unde C0 este o opțiune care transmite informații simbolice care permite debuggerului CV să afișeze textul integral, inclusiv etichetele și comentariile de pe ecran. Modulul COMPOZ.EXE este gata de execuție. Poate sa conectați procedura din bibliotecă. Pentru a face acest lucru, în fața segmentelor, se introduce directiva includă (numele fișierului bibliotecii) De exemplup, pentru a conecta fișierul io.asm, scrieți includeți segmentul Intellde Io.asm S "Stack" ... s capete d "date" ... D capete C segment C "presupune CS: C, SS: S, DS: D BeG: ... ... C se termină sfârșitul începe

Transferul parametrilor între proceduri (organizat la cererea programatorului)

    Transferul parametrilor prin intermediul registrelor MP
Puteți transmite valorile parametrilor reale prin intermediul registrelor MP la cererea programatorului. de exemplu; Procedura de calcul al AX: \u003d MAX (AX, BX) MAX PROC PROC AX CMP, BX JGE Max1 MOV AX, BX MAX1: RET MAX ENDP ...; În procedura principală ... MOV AX, A; Pregătirea parametrilor MOV BX, B; Pentru a apela apelul Max Mov C, procedura AX; Conservarea rezultatului ...
    Transmiterea parametrilor prin referințăÎnseamnă transferul adresei (denumirii) celulei de memorie corespunzător parametrului real (transmiterea unei valori numite de la asamblarea din Pascal). Pentru a face acest lucru, puteți utiliza numele celulelor de memorie sau puteți descărca adresa înainte de a apela procedura la registru (BX, BP, SI sau DI, deoarece procedura poate utiliza aceste registre la adresa).
de exemplu, Echipa Lea Bx, B Sunați ......
    Transferați parametrii prin stivă.
Transferul parametrilor prin intermediul registrelor este limitat la acestea cu o cantitate mică. Dacă există mulți parametri (mai mult de 5), aceștia sunt transmise prin stivă după cum urmează: - Programul principal scrie parametrilor reali (valori sau adrese) din stivă; - Procedura utilizează parametrii înregistrați în stack. De exemplu: ; Apelați P (A1, ..., AK) Împingeți A1 ... Push AK Apel P ... În procedură, puteți utiliza pointerul opțional BP Stack, dar la începutul procedurii ar trebui să fie salvate valoarea BP a fost folosit în programul de apelare, adică ; Începutul procedurii P proc împingeți bp; Salvarea BP MOV BP, SP; Configurarea bp în partea de sus a stack-ului ... Apoi puteți utiliza adresa de bază. De exemplu, pentru un apel strâns, adresa de returnare enumerată în stack este automat, adresa ultimului parametru AK. Înainte de a reveni din procedură, ar trebui să restabiliți comanda BP cu comanda Pop BP, apoi ștergeți stiva de la parametrii transmis, astfel încât să nu suprasolicitați când procedurile sunt repetate, adică. Instalați valoarea SP, cu 2 * k mai mult decât după ce a apelat la procedură. Există 2 posibilități de returnare corectă din procedură. a) ajustați SP în programul apelantului
; Sfârșitul procedurii ; În programul apelant
Pop bp. Apelați P.
Ret. Adăugați SP, 2 * k; Sp. Corecție
P Endp.
b) Utilizați comanda de retur pentru a restabili stiva, având o vizualizare pentru un apel de închidere (CNT) unde (cNT) este un contor (expresie constantă), o dimensiune a cuvântului. Comanda efectuează următorii pași: IP: \u003d Stack SP: \u003d SP + (CNT) Apoi, sfârșitul procedurii are forma: Pop BP Ret 2 * KP ENDP pentru o procedură de apel cu rază lungă de acțiune, comanda de retur are o ret ( CNT) Vizualizați și efectuează următoarele: IP: \u003d Stack CS: \u003d Stack SP: \u003d SP + (CNT) Cu această revenire din procedura din programul de apelare, nu sunt necesare acțiuni suplimentare.
    Problema salvării registrelor la accesarea procedurii
Astfel încât procedura nu pordă valorile registrelor utilizate în programul de apelare sunt necesare în textul procedurii înainte de a utiliza orice registru pentru a salva valoarea "veche" în stivă și la sfârșitul anului Procedură, toate valorile salvate sunt restaurate. de exempluDacă registrul CH va fi utilizat în procedură, acesta trebuie salvat pe stivă, dar stack-ul își amintește numai cu cuvântul, astfel încât procedura va fi un fragment: împingeți CX; Conservarea "vechiului" cx CX, 0; Utilizați CX în procedură ...; Înainte de a părăsi procedura Pop CX; Restaurarea "vechiului" CX va fi astfel o schemă generalizată închidere (aproape) cu parametrii transmise prin registre și printr-o stivă

(Numele procentului) Proc

Împingeți BP pentru întreținere

MOV BP, SP STACK

Împuternicirea registrelor de economisire

utilizat în procedură

procentul corpului

ROR ... Restaurarea registrelor

ROR BP Restaurare BP