internetul Windows. Android

Blocarea structurii programului. Dezvoltarea structurii programului și programarea modulară

61.1k.

Site-urile au, de asemenea, scheletul propriu. Dar este inutil despre caracteristicile sale de a cere medicilor. Da, iar veterinarii nu sunt, de asemenea, conștienți de clădirea site-ului. Numai velocferii au fost discutate. Din ele este faptul că structura scheletului viiturii resurse depinde. Și modalitatea principală de a crea oase de scheletul său este un aspect al blocului.

Layout-ul site-ului - Craft pentru dedicat

Există ceva misterios în aspectul site-ului. Dar până când vă familiarizați cu acest ambarcațiune. Începem dedicarea noastră:


Următoarea etapă a dezvoltării site-ului după crearea layout-ului este un aspect. Sarcina vestovel pentru a se deplasa cu folosind HTML. CSS Cod și tabele Skeleton al site-ului viitor în mirl Virtual. Pur și simplu puneți, mutați dimensiunea și proporțiile resursei în forma care este de înțeles de browser.

În procesul de aspect, codul HTML are loc pe partea "schelet". Un C. folosind CSS. (cascadă foi de stil) Dimensiunea "oaselor", culoarea și locația sunt setate.

Există mai multe tipuri de aspecte:

I. Fab-uri - mai devreme a fost principalul mod de aspect. În aspectul tabular pentru a seta structura site-ului utilizat etichetă

Și filialele sale etichetează. Layout-ul utilizând tabele vă permite să poziționați proporțional toate elementele de proiectare reciprocă. Dar, în același timp, un astfel de cod este obținut prea voluminos:


De asemenea, principalele dezavantaje ale codului tabular includ conținutul său lung de încărcare și indexare slabă de către motoarele de căutare.

Conținutul paginii, tabelul pe bază de cordant, nu va fi afișat până când toate datele sunt încărcate. Layout-ul blocului vă permite să afișați separat fiecare element încărcat.

Paginile tabulare de indexare necorespunzătoare sunt explicate prin goluri mari între blocurile de text amplasate în diferite celule ale mesei.

Acum, vesta de masă este rar utilizată ca metodă principală de creare a site-urilor. Acum este utilizat numai pentru a structura date tabulare și localizarea imaginilor grafice.

II. Bloc - în acest moment este principalul mod de aspect. Spre deosebire de aspectul blocului tabular, există o serie de beneficii:

  • Elemente de separare de la codul HTML. ;
  • Abilitatea de a suprapune un strat la altul - această posibilitate facilitează în mare măsură poziționarea elementelor.
  • Cea mai bună indexare de către motoarele de căutare;
  • Pagina de descărcare de mare viteză constând din elemente independente reciproc;
  • Ușor de creat efecte vizuale (meniuri drop-down, liste, sfaturi pop-up).

Principalul dezavantaj al layout-ului bloc este unii " ambiguitate»Înțelegerea codului ei diverse browsere. Prin urmare, paginile HTML trebuie adesea să "aducă" folosind hack-uri speciale.

Odată cu apariția layout-ului blocului, un astfel de concept sa născut ca "browser încrucișat". Datorită diferenței de afișare a aceluiași element din diferite browsere Comercianții trebuie să introducă bucăți de cod în HTML principal (Khaki).

Efectul hack este foarte specializat și rezolvă problema afișării incorecte numai într-un browser.

Elementul principal aplicat în structura blocului este eticheta

. Codul codului separat de această etichetă se numește un strat. Toate soluțiile de stil sunt făcute dincolo de limitele codului HTML în foi de stil cascadă. Accesul la ele se efectuează prin identificatori sau clase CSS:

Cum este aspectul blocului?

Înainte de a începe un aspect pregătit al site-ului PSD în editor grafic Tăiat pe blocuri (straturi). Într-un dosar separat sunt așezate tăiate imagini de fundal.care vor fi atașate separat fiecărui strat:


De exemplu, luați acest aspect al site-ului creat în Photoshop. Primul B. editor de text Folosind DIV, specificăm structura resurselor viitoare și atribui selectorului de identificare identic la fiecare strat. Se pare că o astfel de structură:

Apoi la structura terminată a site-ului de pe șirul HTML Atașați fișierul CSS. După aceea, adăugați o descriere stilistică a fiecărui strat în ea, poziționarea în raport cu alte elemente și dimensiunea acestuia.

Citiți mai mult cu toate proprietăți CSS Este posibil din documentația tehnică pentru limba.

Codul complet al unui exemplu Index.html:

Un exemplu de aspect al blocului

Conţinut



Conținutul fișierului stil.css:

corp (fundal: # F3F2F3; Culoare: # 000000; Font-fata: Trebuchet MS, Arial, Ori nou. Român; Dimensiune font: 12px; ) #Container (margine: 30px auto; lățime: 900px; înălțime: 600px;) #header (fundal: # 66cccccccccccccccccccc; înălțime: 100px; lățime: 900px;) #navigație (fundal: # FF9999; lățime: 900px; înălțime: 20px ;) #) (Fundal: # 99cc99; plutitor: stânga; lățime: 200px; înălțime: 400px;) #content (fundal: # d2d0d2; float: dreapta; lățime: 700px; înălțime: 400px;) Clear (clar: ambele; ) #Footer (fundal: # 0066FF, înălțime: 80px; lățime: 900px;)

Deci, exemplul nostru de layout bloc al site-ului se uită în fereastra browserului.

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 simpludezvoltate 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 acestea 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