Arrays sunt simple, multidimensionale și dinamice

Scopul prelegerii

Studiul unor matrice simple, multidimensionale și dinamice.

În practica programării, este adesea necesar să se proceseze un număr mare de același tip de date. Să spunem, distribuiți profitul săptămânal al unei cafenele în câteva zile. Ce este necesar pentru asta? Utilizați variabile de tip de monedă. doar pentru astfel de cazuri și utilizate. Și câte variabile avem nevoie? Ei bine, întrebarea este clară - pe o variabilă pentru o zi, doar șapte bucăți. Să vedem cum ar putea fi rezolvată o astfel de sarcină la Lazăr (un exemplu al unei academice, nu trebuie să o faceți):







Și dacă ar fi trebuit să profitați lunar sau anual. Cât va dura operatorul? Și, la urma urmei, există deseori calcule mai complexe care trebuie efectuate cu fiecare variabilă de același tip.

Din fericire, în limbile de programare, există un astfel de instrument ca arrays.

O matrice este o uniune formală a mai multor variabile identice într-un singur set, cu un nume comun.

De fapt, obținem un lanț al acelorași variabile sub un nume comun, unde fiecare astfel de variabilă are propriul număr în celulă - indicele. Astfel de variabile se numesc elemente matrice. fiecare element are propriul număr. Declarați o matrice în secțiunea variabilă după cum urmează:

Matricea de cuvinte cheie indică faptul că va fi o matrice. Numerele din parantezele pătrate sunt separate de două puncte și indică intervalul de indicii. Deci, [1..7] înseamnă că indicele matricei va fi de la 1 la 7, adică 7 bucăți. După ce cuvântul cheie este specificat, tipul matricei. Același tip va fi pentru fiecare element al matricei. Ca rezultat, compilatorul creează în memorie șapte celule de câte 8 octeți fiecare (tipul de monedă are 8 octeți):


Fig. 13.1. Plasarea elementelor a matricei a în memorie

Am anunțat matricele. Ce să mai faceți cu ei? Putem referi la orice element al matricei prin specificarea indexului acestui element după numele în paranteze pătrate. Deci, putem atribui o valoare unui element sau pentru a obține valoarea acestuia. Cu alte cuvinte, putem gestiona elementele matricei ca și în cazul variabilelor separate. exemple:

Bine, am învățat cum să creăm și să folosim matrice. Dar care sunt avantajele matricelor în contrast cu variabilele simple de tip? Am menționat deja primul astfel de avantaj, iată cum puteți declara pur și simplu o matrice cu elemente calculate pentru un an:

Încercați să declarați 365 de variabile separate! Al doilea avantaj este mult mai important: elementele de procesare ale matricei sunt mult mai ușor decât variabilele individuale. De exemplu, trebuie să creăm un program care să facă traducerea temperaturilor de la Celsius obișnuit la fahrenheitul SUA neobișnuit. Și lăsați intervalul posibilelor temperaturi să fie de la -100 grade la +200. Ideea este aceasta: utilizatorul introduce temperatura dorită, iar programul afișează rezultatul pe ecran. Desigur, ar fi mai simplu să faceți calculul necesar în momentul în care utilizatorul introduce datele și apasă butonul "calcula". Dar vom face următoarele: vom face mai întâi toate calculele și vom pune rezultatele într-o matrice. și apoi ieșim doar datele necesare. Matricea va fi globală pentru ao umple într-un singur eveniment și va scoate datele într-un alt eveniment. Deschidem Lazăr cu un nou proiect, îl salvăm imediat în dosarul 13-01 unde sunt stocate toate proiectele de instruire. Salvați proiectul ca MyTemp. și modulul formei principale, ca de obicei - Main. Să luăm forma principală, să modificăm următorii parametri:

  • Nume = fMain
  • Caption = Traducerea scalelor de temperatură
  • BorderStyle = bsDialog
  • Poziție = poMainFormCenter

Apoi, accesați fila Palete suplimentare a componentelor. găsi și instala componenta TStaticText pe formular. care este proiectat să afișeze un text explicativ, inclusiv un text cu mai multe linii. Dacă ați uitat, puteți găsi componenta potrivită pur și simplu: deplasați indicatorul mouse-ului peste componentă și, într-un timp scurt, va apărea un buton cu numele componentei.

În principiu, puteți utiliza un simplu Tabel pentru aceste scopuri. Dar ar fi mai interesant să se familiarizeze cu alte componente. În Inspectorul de obiecte, în proprietatea Caption, faceți clic pe butonul "..." din partea dreaptă a proprietății:

Arrays sunt simple, multidimensionale și dinamice


Fig. 13.2. Proprietatea Caption a componentei TStaticText

Așa este, în două rânduri. Apoi redimensionați componenta pe formular astfel încât textul să fie afișat exact așa cum am introdus-o. Și mai mult: în proprietatea Aliniere, selectați taRightJustify. astfel încât textul să fie aliniat la dreapta.

Acum mergeți la fila Misc din paleta de componente, găsiți-o acolo și puneți-o în partea dreaptă a lui TStaticText. componenta TSpinEdit. care este destinată introducerii de către utilizatorul de numere întregi. Această componentă este similară cu o simplă TEdit. dar în partea dreaptă există săgeți în sus și în jos, cu care utilizatorul poate adăuga sau scădea numărul specificat în linie. Utilizarea acestei componente asigură că utilizatorul nu poate introduce nimic altceva decât un întreg. Și pentru a se asigura în continuare gama corespunzătoare a acestor numere în proprietatea MAXVALUE (valoarea maximă posibilă), setat la 200, iar în MINVALUE (valoare minimă posibilă) -100 set (minus o sută). Acum, utilizatorul nu poate introduce nimic în afară de numere întregi în acest câmp. Dacă încearcă să depășească valoarea maximă. atunci componenta va seta automat numărul 200 - maximul posibil. Pe de altă parte, dacă specificați un număr mai mic de -100, -100 componenta de instalare, astfel încât să nu trebuie să vă faceți griji cu privire la greșeli. În plus, această componentă mai târziu, avem nevoie de încă două proprietăți: Text (valoarea setată ca un șir de caractere) și valoarea (valoarea setată ca un întreg).

În mod implicit, componenta nu este suficient de mare, astfel încât setați valoarea proprietății Lățimea 75. Și din nou, trebuie să ne referim la o componentă de nume și SpinEdit1 - acest nume este prea lung. Schimbați proprietatea Nume în SE1.







În cele din urmă, puneți un buton simplu pe formular, în proprietatea Caption, scrieți Calculați temperatura. Inscripția de pe buton nu se potrivește, deci butonul va trebui să fie extins. Plasați componentele pe formularul de mai jos:

Arrays sunt simple, multidimensionale și dinamice


Fig. 13.3. Aspectul formularului

Acum să facem calcule preliminare. În primul rând, trebuie să realizăm o gamă globală de numere reale - temperatura din Fahrenheit nu va mai fi un număr întreg. Valoarea Fahrenheit se calculează după cum urmează: temperatura este luată în Celsius, înmulțită cu 9/5, apoi rezultatul este adăugat la 32. Prin urmare, în secțiunea globală var. Imediat deasupra implementării cuvântului cheie, declarăm o matrice atemp:

Pentru că aceasta este o matrice globală. acesta va fi creat imediat când programul este încărcat și va exista până când programul își va termina lucrarea. Acum, să umplem această matrice.

Selectați formularul dând clic pe spațiul său liber, apoi în Inspectorul de obiecte mergeți la fila Evenimente. Avem nevoie de un eveniment OnCreate - apare o singură dată, când formularul este creat. Faceți dublu clic pe acest eveniment pentru al genera. Codul evenimentului este după cum urmează:

Acum, în final, putem evalua întregul farmec al folosirii matricelor! Să examinăm acest cod. În secțiunea var, am declarat o variabilă i de tip smallint. Acesta este contorul pentru buclă. pe care am folosit-o în cod. Din moment ce intervalul de valori de care avem nevoie este de la -100 la +200, tipul celuilalt este cel mai potrivit. Și acum acordați atenție codului:

Aceasta este cea mai importantă "caracteristică" a matricelor - procesarea întregii matrice, indiferent cât de mare este, într-o buclă simplă. La început, contorul i ia valoarea -100. În interiorul buclei, atribuim o valoare unui element al matricei. Dacă înlocuim variabila i cu valoarea ei. în calitate de compilator în procesul de lucru, obținem următoarele:

Astfel, vom calcula transferul temperaturii din grade Celsius Fahrenheit pentru o anumită temperatură: -100 de grade Celsius, și atribuiți elementul rezultat matrice atemp [-100]. Apoi ciclul se repetă, i este incrementat de unu și este deja egal cu -99. O nouă valoare este atribuită elementului nou al matricei și așa mai departe până la sfârșitul bucla. Credeți că câte elemente ale matricei vor fi completate în acest ciclu? Cine a spus 300. Și ai uitat de zero? Vor funcționa 301 de cicluri și vor fi atribuite 301 de valori diferite la 301 elemente ale matricei. Acum imaginați cum ar arăta variabilele individuale:

În loc de două linii de buclă, vom obține 301 de linii de cod cu aceleași calcule!

Dar, înapoi la proiectul nostru, pentru că mai trebuie să afișăm rezultatul traducerii de temperatură. Generați un eveniment OnClick pentru butonul1. Codul ei va fi foarte simplu:

Aici avem un singur operator - procedura ShowMessage (). Acesta generează un mesaj de ieșire din 4 părți: SE1.Text este acea valoare. Utilizatorul a instalat componenta TSpinEdit ca șir. Apoi introducem textul "Celsius =" în mesaj. Fiți atenți la spațiile de la începutul și la sfârșitul acestei piese - fără ele, cuvintele se vor lipi împreună, ceea ce este urât. Apoi adăugăm următorul cod pe linie:

Aici valoarea SE1.Value este acea valoare. care a fost setat de utilizator. dar sub forma unui număr întreg! Să presupunem că utilizatorul a setat valoarea la 35, atunci acest cod va fi:

În elementul matricea atemp [35], am păstrat deja temperatura de 35 de grade Celsius tradusă în Fahrenheit. Și funcția FloatToStr () traduce numai această valoare într-un șir. Astfel, pentru valoarea 35, se va genera un mesaj: "35 Celsius = 95 Fahrenheit". Salvați proiectul, compilați-l și asigurați-vă că programul funcționează corect în limitele de temperatură specificate și că utilizatorul nu-i poate depăși dacă dorește, deoarece nu poate introduce nimic altceva decât un număr întreg.

Gama multidimensională

Matricele pe care le-am analizat până acum au fost unidimensionale - din punct de vedere vizual, ele pot fi reprezentate ca un lanț de celule sau un rând dintr-o masă. Cu toate acestea, există situații în care acest lucru nu este suficient. Să presupunem că trebuie să salvați o masă. O matrice unidimensională cu o astfel de sarcină nu poate face față. Pentru aceasta, există matrice multidimensionale. care au o dimensiune de două sau mai multe. De exemplu, puteți declara matrice bidimensionale de 5 rânduri și 10 coloane după cum urmează:

Adică, în paranteze pătrate, este specificat un interval delimitat prin virgulă la începutul liniilor, apoi coloanele. Din punct de vedere vizual, o astfel de matrice ar putea fi reprezentată după cum urmează:

În primul caz, ne referim la elementul din al doilea rând, a noua coloană. În cea de-a doua linie - a treia, a zecea coloană. Prima modalitate de a accesa elementul pare să fie mai compactă, vom continua să o folosim.

Finalizați proiectul nostru. Ce se întâmplă dacă am converti temperatura noastră în Fahrenheit, nu numai, ci și în grade Kelvin (unitate de temperatură termodinamică în SI - Sistemul Internațional de Unități)? Conversia Celsius la Kelvin este chiar mai ușor decât în ​​Fahrenheit: este necesar să se adauge temperatura Celsius 273,15. Pentru aceasta avem nevoie în loc de o matrice unidimensională pentru a anunța dimensionale. Modificați codul de mai sus:

În prima linie vom avea Fahrenheit, în al doilea - Kelvin. Vom lua coloanele în intervalul dorit. Apoi, trebuie să schimbăm buclă în evenimentul OnCreate al formularului:

Notă: deoarece avem nevoie să executăm mai multe instrucțiuni în bucla și două, trebuie să le închidem în brațele de programare începând ... sfârșitul. făcând un operator compozit. Mai mult, totul este simplu: pentru rândul 1 al matricei noastre, calculam Fahrenheit, ca ultima dată. Și pentru linia 2 este deja Kelvins.

Dar trebuie să refacem evenimentul butonului OnClick:

Cu codul, sper că înțelegeți singur? Deci, dacă utilizatorul intră, de exemplu, la 36 de grade Celsius, atunci apăsând butonul va primi următorul mesaj:

Arrays sunt simple, multidimensionale și dinamice


Fig. 13.4. Mesajul generat de program

Dar dimensiunea matricei poate fi mai mare. O matrice tridimensională poate fi reprezentată vizual după cum urmează:

Arrays sunt simple, multidimensionale și dinamice


Fig. 13.5. Reprezentarea vizuală a unei matrice tridimensionale

Declarați o matrice similară ar putea fi astfel:

Și pentru a aborda elemente separate astfel:

Ar arata ca o matrice cu patru dimensiuni de vizual imposibil de imaginat. Ai capacitatea de a lucra chiar și cu o matrice în zece dimensiuni, dar practica de programare sunt utilizate în mod obișnuit una sau două-dimensionale matrice, și foarte rar nevoie de trei-dimensional. Nu uita unul dintre principiile de bază ale programării, pe care programatorii numit KISS (Keep It Simple, Stupid - păstrați-l simplu, prost). Acest principiu presupune că respectivul cod de program nu este necesar să complice lucrurile în mod inutil - cod complex, dificil de citit de programator, o mai mare încărcare a procesorului. și o eroare de execuție (erori de timp de funcționare - erori care apar în timpul executării programului, de obicei erori logice) într-un astfel de cod mai greu de urmărit.

Setul dinamic

În practică, programarea, uneori, se întâmplă să lucreze cu matrici de dimensiune nu este cunoscută în avans - poate depinde de datele introduse de către utilizator, din setările curente, volumul de informații prelucrate, dar încă o mulțime de lucruri. Programator, în aceste cazuri, nu poate oferi un anumit indici de matrice de frontieră. În astfel de cazuri, se folosesc rețele dinamice.

Seturile dinamice sunt, de asemenea, declarate în secțiunea var. după cum urmează:

După cum puteți vedea, specificăm numai tipul matricei. dar nu și dimensiunea sa. Memoria pentru matricea declarată nu este alocată în același timp. În viitor, cu o gamă dinamică, putem efectua diverse operații. set dimensiune (lungime) din matrice, mări sau micșora dimensiunea (deoarece matrice și dinamic), să recunoască limitele superioare și inferioare ale intervalului index de matrice, atribui valori la elemente individuale sau invers pentru a citi aceste valori. Cunoașteți funcțiile care fac toate acestea.

SetLength () - stabilește dimensiunea matricei. sintaxa:







Articole similare

Trimiteți-le prietenilor: