Matricile în practică c

După cum se arată, la începutul codificatoare au multe întrebări atunci când decizia pe tema „Arrays“ sarcini. Acest articol a abordat aspecte legate numai de matrice în sensul clasic. Lucrul cu containerele STL - este o chestiune separată.







Ca o regulă, sarcinile sunt după cum urmează: a umple matrice pentru a face unele operații cu elementele de matrice, imprima rezultatul. Deja în formularea problemei discerne blocurile logice să o rezolve. În continuare, voi încerca să arate „cărămizi“ tipice, care pot fi pliate din soluția - .. de exemplu, programul.

organizație matrice

Memoria pentru matrice poate fi selectată în mod automat sau în mod dinamic.

Alocarea memoriei automată utilizată atunci când dimensiunea matrice este cunoscută la momentul compilării (t. E. Când scrierea de cod).

Alocarea dinamică a memoriei utilizate atunci când dimensiunea matrice nu este cunoscut la momentul compilarii (de exemplu, solicitat de către utilizator).

Ambele tipuri de matrice pot fi fie globale (anumite funcții) și locale (în cadrul anumitor funcții sau unitate). Aici pentru tablouri automate, există o subtilitate. Memorie pentru matrice locală automată alocate pe stivă. Prin urmare, dimensiunea de matrice ar trebui să fie mici. În caz contrar, puteți obține o stivă de preaplin și, ca rezultat, un program de terminare anormală. Stack Overflow pot fi obținute, de asemenea, la dimensiuni mici și matrice automată locală în timpul mai multor apeluri de funcții recursive. Prin urmare, atunci când definiți o funcție în matrice automată, ar trebui să știi exact ceea ce faci.

Pentru matrice folosind alocarea dinamică a memoriei, memoria este alocată de la „heap» (heap). Un buchet - este memoria alocată de programul sistemului de operare pentru utilizarea acestui program. dimensiunea memoriei este de obicei semnificativ dimensiune mai mare stivă, și sistem de operare care acceptă paradigma de memorie virtuală, dimensiunea heap poate, teoretic, limitat biți aplicații numai.

Utilizarea de tablouri automate

matricele automate folosesc atunci când dimensiunea matrice este cunoscut la momentul compilarii.

Dimensiunea de matrice în codul este recomandat să indice printr-o constantă pe nume. Acest lucru este util pentru mai multe motive:

  1. numele constantă trebuie să indice domeniul de aplicare a acesteia - codul de auto-documentare;
  2. dacă este necesar, modificați dimensiunea de cod al unei matrice trebuie să facă schimbări într-un singur loc;
  3. dimensiunea matrice, de obicei utilizate în ciclurile de verificare limita de trecere matrice și așa mai departe. Prin urmare, utilizați un nume simbolic eludează nevoia de inspecție atentă și îndreptare a întregului cod atunci când modificarea dimensiunii de matrice.

Tip de expresie constantă pentru a determina mărimea (numărul de elemente) de matrice să fie automat întreg: char. int. unsigned int. mult timp. etc.

Memoria alocată în cadrul matrice automate este eliberat la ieșirea din domeniul de aplicare al matrice variabilă. Pentru matrice locală este o funcție sau un bloc. matricile globale sunt distruse atunci când programul iese.

EXEMPLU determinarea matrice auto lungime globală de 10 elemente de tip int:

EXEMPLU determinarea automată a lungimii de matrice locale 10 elemente de tip int:

Utilizarea tablourilor cu o alocare dinamică a memoriei

Matricele cu alocarea dinamică a memoriei utilizate atunci când dimensiunea matrice nu este cunoscut la momentul compilarii. Dimensiunea reală a șirului poate fi calculată în program sau introdus de utilizator - nu contează.

Matricea de memorie este alocată de noul operator sub forma de tip nou [elementeNumerice].

tip de expresie care definește mărimea (numărul de elemente) de matrice trebuie să fie un număr întreg. De asemenea, această expresie poate fi o constantă.

Atunci când se lucrează cu o serie este finalizată, memoria alocată pentru matrice ar trebui să fie eliberat. Acest lucru se face folosind operatorul delete sub forma delete [] VARIABLE_NAME. Odată ce memoria este eliberat, nu se poate lucra cu o matrice.







Exemplu de matrice cu alocare dinamică a memoriei:

Completarea unui tablou de valori

În rezolvarea problemelor educaționale sunt, de obicei trebuie să completeze o serie de valori, sau introduse de la tastatură, sau valori aleatoare dintr-un anumit interval. Să începem cu al doilea caz ca un simplu (paradox? Nu, adevărul vieții).

Completarea o serie de numere aleatoare

Pentru a porni generatorul de numere aleatorii este necesar. Mai jos este codul de una dintre cele mai simple implementari:

Cu toate acestea, fără mișcări suplimentare funcția standard de rand () va fi de fiecare dată când executați programul pentru a genera aceeași secvență de numere aleatoare (de altfel, este foarte util în depanare!). Pentru a fi de fiecare dată când porniți programul de a primi o secvență unică de numere aleatoare, functia rand (), este necesar să se „unitate“ valoarea inițială aleatoare. Acest lucru se face folosind srand () și timpul ().

Completarea o serie de valori, desigur, vom face în ring. Amintiți-vă că elementele de matrice în C / C ++ sunt numerotate 0. Prin urmare element de ultima matrice are o unitate indice mai mică decât dimensiunea de matrice.

Exemplul arată cum o gamă automată la nivel mondial de 10 elemente de valori aleatoare de tip int în domeniul de -100 până la 100, inclusiv:

Notă includerea fișierelor header!

Completarea o serie de numere introduse de utilizator

Destul de ciudat, acesta este un caz mai complicat. Faptul este că, în primul rând, prezența omului poate duce întotdeauna la introducerea de date incorecte (eroare), și în al doilea rând, pentru persoana este necesară pentru a oferi o nici o interfață, și în al treilea rând, STL sistem de streaming IO are caracteristicile sale neplăcute .

Deci, folosind exemplul anterior, să scrie un fragment care este responsabil pentru punerea matrice de valori de la tastatura. Adăugați cod în partea de sus a #include fișier antet . și în loc să inițializa matrice cu valori aleatoare am scrie ceva de genul:

Se pare să funcționeze, dar dacă încercați, ca numărul de (accidental desigur!) Pentru a intra 1111111111111111111111111111111111 sau 11q. apoi, în funcție de compilator, veți putea vedea unele efecte interesante ale programului.

Deci, va trebui să scrie cod mai complex:

O analiză detaliată a fragmentului depășește sfera de aplicare a acestui articol. Dar interesat poate dezasambla, înarmat cu, de exemplu, bine cunoscuta carte a lui Shildt.

valorile de ieșire console dintr-o matrice

matrice de valori de ieșire la consola vândute brainer. Având în vedere cele de mai sus, nu am de mult pentru a adăuga:

Lucrul cu valori dintr-o matrice

Tot ceea ce a fost scris mai sus, a fost ca și în cazul în care elementele auxiliare ale programului. Să examinăm în continuare ne câteva exemple de procesare matrice.

Căutarea maximă / valori maxime în matrice

Mai jos este un program de cercetare cod de valoare minimă completă în matrice și indexul său. Programul utilizează matrice automat la nivel mondial. Valorile de matrice sunt obținute printr-un generator de numere aleatoare.

Acest cod poate fi optimizat, dar nu am făcut, că ei sunt mai bine văzute aceste „cărămizi“ din care sunt colectate.

Determinată de două variabile, dintre care unul va conține o valoare minimă, iar al doilea - indicele valorii minime. Aceste variabile sunt inițializate de primul element (zero) în matrice și zero respectiv. Mai mult, în fiecare ciclu, valoarea următoare a elementului de matrice este comparat cu găsit deja cea mai scăzută valoare și dacă valoarea curentă este mai mică decât, valoarea curentă stocată stocată și indexul său.

Este clar că căutarea pentru valoarea maximă este realizată complet analog, până la semnele „mai mult“ / „mai puțin“, șirul de ieșire pentru utilizator și numele variabilelor.

Căutați o anumită valoare în matrice

Căutarea pentru o anumită valoare într-o matrice dezordonate este realizată folosind un algoritm de căutare liniară. Acesta este cel mai simplu algoritm iterativ matrice de serie și le-au comparat cu valoarea dorită.

Sarcina de a găsi în matrice poate fi în două forme:

  1. găsi prima (ultima) apariție a valorii
  2. pentru a găsi toate aparițiile

Caută prima apariție:

Ultima intrare de căutare:

Fiți atenți la următoarele puncte.

Variabila buclă este descrisă înaintea ciclului. Astfel, această variabilă continuă să existe după ciclul de închidere, iar valoarea acesteia poate fi utilizată.

Dacă elementul dorit este găsit, atunci ciclul se termina rupe prematur declarație. vizualiza restul de matrice nu are nici un sens - sarcina se face.

Caută toate aparițiile:

Aici, ciclul nu este întrerupt. Matricea este complet vizibilă.

Suma / produsul din elementele negative ale șirului

Cantitatea de elemente de matrice cu indici pare / impare

Lucrul cu matrice cu ajutorul funcțiilor

Aproape toate piesele de cod date mai sus, pot fi aranjate în funcție, și o serie de parametri pentru a trece prin. Ca un exemplu, un program pentru a găsi suma elementelor de matrice cu chiar indici, care utilizează (pentru diversitate) matrice dinamică.

Rețineți că alocarea de memorie pentru matrice și eliberarea acestuia are loc într-o singură funcție (în acest caz, în principal ()). Alocați de memorie într-o singură funcție, și pentru a elibera cealaltă - o idee rea, plină de erori.

concluzie

Acest articol discută doar tehnicile cele mai de bază pentru lucrul cu matrice care va (sperăm!) Novice encoder pentru a înțelege modul de a lucra cu matrice.

Că el să rămână cu voi sfinți apostoli și Bjarne-l! ;-)