Java creând o matrice bidimensională. Matrice în Java. Unidimensional și multidimensional. Sortare și căutare în cursul CS50

Imaginați-vă celulele într-o cameră de depozitare. Fiecare dintre ele are propriul său număr și fiecare dintre ele stochează un fel de obiect „Bagaj”. Sau o listă de vinuri, în care sunt numerotate toate tipurile de vin și când plasezi o comandă, trebuie doar să dai numărul băuturii. Sau o listă de studenți dintr-un grup, în care elevul „Andreev” va fi scris în prima celulă și „Yakovlev” în ultima celulă. Sau o listă de pasageri ai avionului, fiecăruia cărora li se atribuie un loc număr specific. În Java, pentru a lucra cu structuri similare, adică o mulțime de date omogene, sunt adesea folosite matrice.

Ce este o matrice?

O matrice este o structură de date care stochează elemente de același tip. Poate fi gândit ca un set de celule numerotate, fiecare dintre acestea putând conține anumite date (un element de date pe celulă). Accesul la o anumită celulă se realizează prin numărul acesteia. Numărul unui element dintr-o matrice este de asemenea numit index. În cazul Java, o matrice omogen, adică toate celulele sale vor stoca elemente de același tip. Astfel, o matrice de numere întregi conține numai numere întregi (de exemplu, tastați int), o matrice de șiruri de caractere - doar șiruri de caractere, o matrice de elemente din clasa Dog creată de noi va conține doar obiecte Dog. Adică, în Java, nu putem pune un număr întreg în prima celulă a unui tablou, un șir în a doua și un „câine” în a treia.

Declarație de matrice

Cum se declară o matrice?

Ca orice variabilă, o matrice în Java trebuie declarată. Puteți face acest lucru într-unul din două moduri. Sunt echivalente, dar primul este mai consistent cu stilul Java. Al doilea este moștenirea limbajului C (mulți programatori C au trecut la Java și, pentru confortul lor, a fost lăsat cale alternativă). Tabelul arată ambele moduri de declarare a unui tablou în Java: În ambele cazuri, dataType este tipul variabilelor din matrice. În exemple am declarat două tablouri. Unul va stoca numere întregi de tip int, celălalt va stoca obiecte de tip Object. Astfel, atunci când o matrice este declarată, aceasta are un nume și un tip (tipul variabilelor matricei). ArrayName este numele matricei.

Crearea unui Array

Cum se creează o matrice?

Ca orice alt obiect, puteți crea o matrice Java, adică să rezervați spațiu de memorie pentru acesta, folosind operatorul nou. Acest lucru se face astfel: new typeOfArray [lungime] ; Unde tipOfArray este tipul matricei, iar lungimea este lungimea acestuia (adică numărul de celule), exprimată în int. Totuși, aici am alocat doar memorie pentru matrice, dar nu am asociat matricea creată cu nicio variabilă declarată anterior. De obicei, o matrice este mai întâi declarată și apoi creată, de exemplu: int myArray; // declarație matrice myArray = new int [10]; // crearea, adică alocarea memoriei pentru o matrice de 10 elemente de tip int Aici am declarat o matrice de numere întregi numită myArray și apoi am declarat că este formată din 10 celule (fiecare dintre acestea va stoca un număr întreg). Cu toate acestea, este mult mai obișnuit să se creeze un tablou imediat după declarare folosind această sintaxă scurtă: int myArray = new int [ 10 ] ; // declarație și alocare de memorie „într-un singur pachet” Notă: După crearea unei matrice folosind new , celulele sale sunt umplute cu valori implicite. Pentru tipurile numerice (ca în exemplul nostru) acesta va fi 0, pentru boolean - fals, pentru tipurile de referință - null. Astfel, după operația int myArray = new int [ 10 ] ; obținem o matrice de zece numere întregi și până când acest lucru se schimbă în timpul programului, fiecare celulă conține un 0.

Lungimea matricei în Java

După cum am spus mai sus, lungimea unei matrice este numărul de elemente pentru care este proiectată matricea. Lungimea unei matrice nu poate fi modificată odată ce a fost creată. Vă rugăm să rețineți: în Java, elementele matricei sunt numerotate începând de la zero. Adică dacă avem o matrice de 10 elemente, atunci primul element al matricei va avea indicele 0, iar ultimul va avea indicele 9. Puteți accesa lungimea matricei folosind variabila lungime. Exemplu: int myArray = new int [ 10 ] ; // a creat o matrice de numere întregi cu 10 elemente și a numit-o myArray Sistem. afară. println(myArray. length) ; // afișează lungimea matricei în consolă, adică numărul de elemente pe care le putem pune în matrice Ieșire program: 10

Inițializarea unei matrice și accesarea elementelor acesteia

Cum să creați o matrice în Java este deja clar. După această procedură, nu obținem o matrice goală, ci o matrice plină cu valori implicite. De exemplu, în cazul lui int acestea vor fi 0, iar dacă avem o matrice cu date de tip referință, atunci în mod implicit, null este scris în fiecare celulă. Accesăm un element de matrice (adică scriem o valoare în el sau o afișăm pe ecran sau efectuăm o operațiune cu el) prin indexul său. Inițializarea unei matrice înseamnă umplerea acesteia cu date specifice (nu în mod implicit). Exemplu: Să creăm o matrice de 4 sezoane și să o umplem cu valori de șir - numele acestor sezoane. String anotimpuri = String nou [4]; /* a declarat și a creat o matrice. Java a alocat memorie pentru o matrice de 4 șiruri de caractere, iar acum fiecare celulă conține valoare nulă(deoarece șirul este un tip de referință)*/ anotimpuri[ 0 ] = "Iarna" ; /* în prima celulă, adică în celula cu numărul zero, am scris șirul Winter. Aici avem acces la element zero matrice și scrieți o anumită valoare acolo */ anotimpuri[ 1 ] = „Primăvara” ; // faceți aceeași procedură cu celula numărul 1 (a doua) anotimpuri[ 2 ] = „Vara” ; // ...numărul 2 anotimpuri[ 3 ] = "Toamna" ; // iar din ultimul, numărul 3 Acum, toate cele patru celule ale matricei noastre conțin numele anotimpurilor. Inițializarea se poate face și în mod diferit, combinând inițializarea și declararea: Sezoane șir = String nou ("Iarna", "Primăvara", "Vara", "Toamna" ) ; În plus, nou operator pot fi omise: Anotimpuri șir = ("Iarna", "Primăvara" , "Vara" , "Toamna" );

Cum să afișați o matrice în Java pe ecran?

Puteți afișa elemente de matrice pe ecran (adică pe consolă), de exemplu, folosind pentru buclă. Încă unul, mai mult drum scurt afișarea unei matrice pe ecran va fi discutată în paragraful „. Deocamdată, să ne uităm la un exemplu cu ieșirea ciclică a unui tablou: String anotimpuri = String nou ("Iarna", "Primăvara", "Vara" , "Toamna" ) ; pentru (int i = 0; i< 4 ; i++ ) { System. out. println (seasons[ i] ) ; } Ca rezultat, programul va scoate următorul rezultat: Iarna primavara Vara Toamna

Matrice Java unidimensionale și multidimensionale

Ce se întâmplă dacă vrem să creăm nu o matrice de numere, o matrice de șiruri de caractere sau o matrice de unele obiecte, ci o matrice de matrice? Java vă permite să faceți acest lucru. Matricea deja familiară int myArray = new int este așa-numita matrice unidimensională. Și o matrice de matrice se numește bidimensională. Este ca un tabel care are un număr de rând și un număr de coloană. Sau, dacă ai predat începuturile algebrei liniare, pe o matrice. De ce sunt necesare astfel de matrice? În special, pentru programarea acelorași matrice și tabele, precum și a obiectelor care le seamănă ca structură. De exemplu, terenul de joc pentru șah poate fi specificat ca o matrice 8x8. O matrice multidimensională este declarată și creată după cum urmează: Int myTwoDimentionalArray = new int [ 8 ] [ 8 ] ; Există exact 64 de elemente în această matrice: myTwoDimentionalArray, myTwoDimentionalArray, myTwoDimentionalArray, myTwoDimentionalArray și așa mai departe până la myTwoDimentionalArray. Deci dacă îl folosim pentru a ne imagina tablă de şah, apoi celula A1 va fi reprezentată de myTwoDimentionalArray , iar celula E2 va fi reprezentată de myTwoDimentionalArray . Unde sunt doi, sunt trei. În Java, puteți specifica o matrice de matrice... o matrice de matrice de matrice și așa mai departe. Adevărat, matricele tridimensionale și mai multe sunt folosite foarte rar. Cu toate acestea, folosind o matrice tridimensională, puteți programa, de exemplu, un cub Rubik.

Metode utile pentru lucrul cu matrice

Pentru a lucra cu matrice în Java există o clasă java.util.Arrays (matrice în engleză înseamnă „matrice”). În general, cu tablouri se efectuează cel mai adesea următoarele operații: completarea cu elemente (inițializarea), preluarea unui element (după număr), sortarea și căutarea. Căutarea și sortarea matricelor este un subiect separat. Pe de o parte, este foarte util să exersați și să scrieți singur mai mulți algoritmi de căutare și sortare. Pe de altă parte, totul cele mai bune moduri au fost deja scrise și incluse în bibliotecile Java și pot fi utilizate legal.

Articole de căutat și sortat:

Sortarea și căutarea în cursul CS50:

Iată trei metode utile această clasă

Sortați o matrice

Metoda void sort(int myArray, int fromIndex, int toIndex) sortează o matrice de numere întregi sau o subserie a acestora în ordine crescătoare.

Căutarea într-o matrice pentru elementul dorit

int binarySearch(int myArray, int fromIndex, int toIndex, int key) . Această metodă caută elementul cheie în matrice deja sortată myArray sau subbarray, începând de la fromIndex și terminând cu toIndex . Dacă elementul nu este găsit, returnează numărul elementului sau fromIndex-1 .

Convertirea unui tablou într-un șir

Metoda String toString(int myArray) convertește o matrice într-un șir. Chestia este că în matricele Java nu înlocuiți toString() . Aceasta înseamnă că, dacă încercați să tipăriți întreaga matrice (mai degrabă decât element cu element ca în " ") direct pe ecran (System.out.println(myArray)), veți obține numele clasei și codul hash hexadecimal al matrice (acesta este definit Object.toString()). Dacă ești începător, s-ar putea să fii confuz cu privire la explicația metodei toString. În prima etapă, acest lucru nu este necesar, dar folosind această metodă ieșirea matricei este simplificată. Java facilitează afișarea unei matrice fără a utiliza o buclă. Acest lucru este discutat în exemplul de mai jos.

Exemplu pe sort, binarySearch și toString

Să creăm o matrice de numere întregi, să o afișăm pe ecran folosind toString , să o sortăm folosind metoda de sortare și să găsim un număr în el. clasa Main ( public static void main ( String args ) ( int array = ( 1 , 5 , 4 , 3 , 7 ) ; //declară și inițializează tabloul Sistem. afară. println(matrice); //încercarea de a afișa matricea noastră pe ecran fără metoda toString - obținem un număr hexazecimal//tipărește matricea „corect” Matrice. sortare(matrice, 0, 4); //sortează întreaga matrice de la zero la al patrulea membru Sistem. afară. println(Matrice. toString(matrice)); //afișează matricea sortată pe ecran int key = Arrays. binarySearch(matrice, 5); // căutarea cheii - numărul 5 din matricea sortată. // metoda binarySearch va returna indexul elementului din tabloul sortat în care numărul necesar este „ascuns” Sistem. afară. println(cheie); //tipărește indexul numărului necesar Sistem. afară. println(Matrice. BinarySearch(matrice, 0)); //acum să încercăm să găsim un număr care nu este în matrice, // și afișează imediat rezultatul pe ecran } } Ieșire program: 3 -1 Prima linie este o încercare de a afișa o matrice pe ecran fără toString , a doua este afișarea unei matrice folosind toString , a treia este o matrice sortată, a patra este indexul numărului dorit 5 din matricea sortată (rețineți că numără de la zero, deci al patrulea element al matricei are un indice 3). În a cincea linie vedem -1. O matrice nu are un astfel de index. Ieșirea semnalează că elementul căutat (în în acest caz,, 0) nu este în tablou.

Principalul lucru despre matrice

    Principalele caracteristici ale unei matrice: tipul de date plasate în ea, numele și lungimea.
    Acesta din urmă este decis în timpul inițializării (alocarea memoriei pentru matrice), primii doi parametri sunt determinați la declararea matricei.

    Mărimea matricei (numărul de celule) trebuie definită în int

    Nu puteți modifica lungimea unei matrice după ce a fost creată.

    Un element de matrice poate fi accesat prin indexul său.

    În matrice, ca și în alte părți în Java, elementele sunt numerotate începând de la zero.

    După procedura de creare a matricei, acesta este umplut cu valori implicite.

    Array in limbajul Java diferă semnificativ de o matrice în C++. Cu toate acestea, este practic la fel ca un pointer către o matrice dinamică.

Materiale utile despre matrice

Doriți să aflați mai multe despre matrice? Vă rugăm să aruncați o privire la articolele de mai jos. Există o mulțime de informații interesante și utile pe această temă.

    Ceva despre matrice - bun articol detaliat despre matrice

    Clasa Arrays și utilizarea ei - articolul descrie câteva metode ale clasei Array

    Arrays este prima prelegere JavaRush dedicată matricelor.

    Returnează o matrice de lungime zero, nu nulă - Autorul de programare eficientă Joshua Bloch vorbește despre cum să returnezi mai bine matricele goale

Imaginați-vă celulele într-o cameră de depozitare. Fiecare dintre ele are propriul său număr și fiecare dintre ele stochează un fel de obiect „Bagaj”. Sau o listă de vinuri, în care sunt numerotate toate tipurile de vin și când plasezi o comandă, trebuie doar să dai numărul băuturii. Sau o listă de studenți dintr-un grup, în care elevul „Andreev” va fi scris în prima celulă și „Yakovlev” în ultima celulă. Sau o listă de pasageri ai avionului, fiecăruia cărora le este atribuit un loc cu un anumit număr. În Java, pentru a lucra cu structuri similare, adică o mulțime de date omogene, sunt adesea folosite matrice.

Ce este o matrice?

O matrice este o structură de date care stochează elemente de același tip. Poate fi gândit ca un set de celule numerotate, fiecare dintre acestea putând conține anumite date (un element de date pe celulă). Accesul la o anumită celulă se realizează prin numărul acesteia. Numărul unui element dintr-o matrice este de asemenea numit index. În cazul Java, o matrice omogen, adică toate celulele sale vor stoca elemente de același tip. Deci, o matrice de numere întregi conține doar numere întregi (de exemplu, de tip int), o matrice de șiruri de caractere conține doar șiruri de caractere, o matrice de elemente din clasa Dog creată de noi va conține doar obiecte Dog. Adică, în Java, nu putem pune un număr întreg în prima celulă a unui tablou, un șir în a doua și un „câine” în a treia.

Declarație de matrice

Cum se declară o matrice?

Ca orice variabilă, o matrice în Java trebuie declarată. Puteți face acest lucru într-unul din două moduri. Sunt echivalente, dar primul este mai consistent cu stilul Java. Al doilea este moștenirea limbajului C (mulți programatori C au trecut la Java și, pentru confortul lor, a fost lăsată o metodă alternativă). Tabelul arată ambele moduri de declarare a unui tablou în Java: În ambele cazuri, dataType este tipul variabilelor din matrice. În exemple am declarat două tablouri. Unul va stoca numere întregi de tip int, celălalt va stoca obiecte de tip Object. Astfel, atunci când o matrice este declarată, aceasta are un nume și un tip (tipul variabilelor matricei). ArrayName este numele matricei.

Crearea unui Array

Cum se creează o matrice?

Ca orice alt obiect, puteți crea o matrice Java, adică să rezervați spațiu de memorie pentru acesta, folosind operatorul nou. Acest lucru se face astfel: new typeOfArray [lungime] ; Unde tipOfArray este tipul matricei, iar lungimea este lungimea acestuia (adică numărul de celule), exprimată în int. Totuși, aici am alocat doar memorie pentru matrice, dar nu am asociat matricea creată cu nicio variabilă declarată anterior. De obicei, o matrice este mai întâi declarată și apoi creată, de exemplu: int myArray; // declarație matrice myArray = new int [10]; // crearea, adică alocarea memoriei pentru o matrice de 10 elemente de tip int Aici am declarat o matrice de numere întregi numită myArray și apoi am declarat că este formată din 10 celule (fiecare dintre acestea va stoca un număr întreg). Cu toate acestea, este mult mai obișnuit să se creeze un tablou imediat după declarare folosind această sintaxă scurtă: int myArray = new int [ 10 ] ; // declarație și alocare de memorie „într-un singur pachet” Notă: După crearea unei matrice folosind new , celulele sale sunt umplute cu valori implicite. Pentru tipurile numerice (ca în exemplul nostru) acesta va fi 0, pentru boolean - fals, pentru tipurile de referință - null. Astfel, după operația int myArray = new int [ 10 ] ; obținem o matrice de zece numere întregi și până când acest lucru se schimbă în timpul programului, fiecare celulă conține un 0.

Lungimea matricei în Java

După cum am spus mai sus, lungimea unei matrice este numărul de elemente pentru care este proiectată matricea. Lungimea unei matrice nu poate fi modificată odată ce a fost creată. Vă rugăm să rețineți: în Java, elementele matricei sunt numerotate începând de la zero. Adică dacă avem o matrice de 10 elemente, atunci primul element al matricei va avea indicele 0, iar ultimul va avea indicele 9. Puteți accesa lungimea matricei folosind variabila lungime. Exemplu: int myArray = new int [ 10 ] ; // a creat o matrice de numere întregi cu 10 elemente și a numit-o myArray Sistem. afară. println(myArray. length) ; // afișează lungimea matricei în consolă, adică numărul de elemente pe care le putem pune în matrice Ieșire program: 10

Inițializarea unei matrice și accesarea elementelor acesteia

Cum să creați o matrice în Java este deja clar. După această procedură, nu obținem o matrice goală, ci o matrice plină cu valori implicite. De exemplu, în cazul lui int acestea vor fi 0, iar dacă avem o matrice cu date de tip referință, atunci în mod implicit, null este scris în fiecare celulă. Accesăm un element de matrice (adică scriem o valoare în el sau o afișăm pe ecran sau efectuăm o operațiune cu el) prin indexul său. Inițializarea unei matrice înseamnă umplerea acesteia cu date specifice (nu în mod implicit). Exemplu: Să creăm o matrice de 4 sezoane și să o umplem cu valori de șir - numele acestor sezoane. String anotimpuri = String nou [4]; /* a declarat și a creat o matrice. Java a alocat memorie pentru o matrice de 4 șiruri, iar acum fiecare celulă conține o valoare nulă (deoarece șirul este un tip de referință) */ anotimpuri[ 0 ] = "Iarna" ; /* în prima celulă, adică în celula cu numărul zero, am scris șirul Winter. Aici accesăm elementul zero al matricei și scriem o anumită valoare acolo */ anotimpuri[ 1 ] = „Primăvara” ; // faceți aceeași procedură cu celula numărul 1 (a doua) anotimpuri[ 2 ] = „Vara” ; // ...numărul 2 anotimpuri[ 3 ] = "Toamna" ; // iar din ultimul, numărul 3 Acum, toate cele patru celule ale matricei noastre conțin numele anotimpurilor. Inițializarea se poate face și în mod diferit, combinând inițializarea și declararea: Sezoane șir = String nou ("Iarna", "Primăvara", "Vara", "Toamna" ) ; Mai mult, noul operator poate fi omis: String anotimpuri = ( „Iarna” , „Primăvara” , „Vara” , „Toamna” ) ;

Cum să afișați o matrice în Java pe ecran?

Puteți afișa elemente de matrice pe ecran (adică pe consolă), de exemplu, folosind o buclă for. Un alt mod, mai scurt, de a afișa o matrice pe ecran va fi discutat în paragraful „. Deocamdată, să ne uităm la un exemplu cu ieșirea ciclică a unui tablou: String anotimpuri = String nou ("Iarna", "Primăvara", "Vara" , "Toamna" ) ; pentru (int i = 0; i< 4 ; i++ ) { System. out. println (seasons[ i] ) ; } Ca rezultat, programul va scoate următorul rezultat: Iarna primavara Vara Toamna

Matrice Java unidimensionale și multidimensionale

Ce se întâmplă dacă vrem să creăm nu o matrice de numere, o matrice de șiruri de caractere sau o matrice de obiecte, ci o matrice de matrice? Java vă permite să faceți acest lucru. Matricea deja familiară int myArray = new int este așa-numita matrice unidimensională. Și o matrice de matrice se numește bidimensională. Este ca un tabel care are un număr de rând și un număr de coloană. Sau, dacă ai predat începuturile algebrei liniare, pe o matrice. De ce sunt necesare astfel de matrice? În special, pentru programarea acelorași matrice și tabele, precum și a obiectelor care le seamănă ca structură. De exemplu, terenul de joc pentru șah poate fi specificat ca o matrice 8x8. O matrice multidimensională este declarată și creată după cum urmează: Int myTwoDimentionalArray = new int [ 8 ] [ 8 ] ; Există exact 64 de elemente în această matrice: myTwoDimentionalArray, myTwoDimentionalArray, myTwoDimentionalArray, myTwoDimentionalArray și așa mai departe până la myTwoDimentionalArray. Deci, dacă o folosim pentru a reprezenta o tablă de șah, atunci celula A1 va fi reprezentată de myTwoDimentionalArray , iar celula E2 va fi reprezentată de myTwoDimentionalArray . Unde sunt doi, sunt trei. În Java, puteți specifica o matrice de matrice... o matrice de matrice de matrice și așa mai departe. Adevărat, matricele tridimensionale și mai multe sunt folosite foarte rar. Cu toate acestea, folosind o matrice tridimensională, puteți programa, de exemplu, un cub Rubik.

Metode utile pentru lucrul cu matrice

Pentru a lucra cu matrice în Java există o clasă java.util.Arrays (matrice în engleză înseamnă „matrice”). În general, cu tablouri se efectuează cel mai adesea următoarele operații: completarea cu elemente (inițializarea), preluarea unui element (după număr), sortarea și căutarea. Căutarea și sortarea matricelor este un subiect separat. Pe de o parte, este foarte util să exersați și să scrieți singur mai mulți algoritmi de căutare și sortare. Pe de altă parte, toate cele mai bune practici au fost deja scrise și incluse în bibliotecile Java și pot fi utilizate în mod legal.

Articole de căutat și sortat:

Sortarea și căutarea în cursul CS50:

Iată trei metode utile ale acestei clase

Sortați o matrice

Metoda void sort(int myArray, int fromIndex, int toIndex) sortează o matrice de numere întregi sau o subserie a acestora în ordine crescătoare.

Căutarea într-o matrice pentru elementul dorit

int binarySearch(int myArray, int fromIndex, int toIndex, int key) . Această metodă caută elementul cheie în matrice deja sortată myArray sau subbarray, începând de la fromIndex și terminând cu toIndex . Dacă elementul nu este găsit, returnează numărul elementului sau fromIndex-1 .

Convertirea unui tablou într-un șir

Metoda String toString(int myArray) convertește o matrice într-un șir. Chestia este că în matricele Java nu înlocuiți toString() . Aceasta înseamnă că, dacă încercați să tipăriți întreaga matrice (mai degrabă decât element cu element ca în " ") direct pe ecran (System.out.println(myArray)), veți obține numele clasei și codul hash hexadecimal al matrice (acesta este definit Object.toString()). Dacă ești începător, s-ar putea să fii confuz cu privire la explicația metodei toString. În prima etapă, acest lucru nu este necesar, dar folosind această metodă ieșirea matricei este simplificată. Java facilitează afișarea unei matrice fără a utiliza o buclă. Acest lucru este discutat în exemplul de mai jos.

Exemplu pe sort, binarySearch și toString

Să creăm o matrice de numere întregi, să o afișăm pe ecran folosind toString , să o sortăm folosind metoda de sortare și să găsim un număr în el. clasa Main ( public static void main ( String args ) ( int array = ( 1 , 5 , 4 , 3 , 7 ) ; //declară și inițializează tabloul Sistem. afară. println(matrice); //încercarea de a afișa matricea noastră pe ecran fără metoda toString - obținem un număr hexazecimal//tipărește matricea „corect” Matrice. sortare(matrice, 0, 4); //sortează întreaga matrice de la zero la al patrulea membru Sistem. afară. println(Matrice. toString(matrice)); //afișează matricea sortată pe ecran int key = Arrays. binarySearch(matrice, 5); // căutarea cheii - numărul 5 din matricea sortată. // metoda binarySearch va returna indexul elementului din tabloul sortat în care numărul necesar este „ascuns” Sistem. afară. println(cheie); //tipărește indexul numărului necesar Sistem. afară. println(Matrice. BinarySearch(matrice, 0)); //acum să încercăm să găsim un număr care nu este în matrice, // și afișează imediat rezultatul pe ecran } } Ieșire program: 3 -1 Prima linie este o încercare de a afișa o matrice pe ecran fără toString , a doua este afișarea unei matrice folosind toString , a treia este o matrice sortată, a patra este indexul numărului dorit 5 din matricea sortată (rețineți că numără de la zero, deci al patrulea element al matricei are un indice 3). În a cincea linie vedem -1. O matrice nu are un astfel de index. Ieșirea semnalează că elementul dorit (în acest caz, 0) nu se află în matrice.

Principalul lucru despre matrice

    Principalele caracteristici ale unei matrice: tipul de date plasate în ea, numele și lungimea.
    Acesta din urmă este decis în timpul inițializării (alocarea memoriei pentru matrice), primii doi parametri sunt determinați la declararea matricei.

    Mărimea matricei (numărul de celule) trebuie definită în int

    Nu puteți modifica lungimea unei matrice după ce a fost creată.

    Un element de matrice poate fi accesat prin indexul său.

    În matrice, ca și în alte părți în Java, elementele sunt numerotate începând de la zero.

    După procedura de creare a matricei, acesta este umplut cu valori implicite.

    O matrice în Java este semnificativ diferită de o matrice în C++. Cu toate acestea, este practic la fel ca un pointer către o matrice dinamică.

Materiale utile despre matrice

Doriți să aflați mai multe despre matrice? Vă rugăm să aruncați o privire la articolele de mai jos. Există o mulțime de informații interesante și utile pe această temă.

    Frumos articol detaliat despre matrice

    Articolul descrie câteva metode ale clasei Array

    Prima prelegere JavaRush dedicată matricelor.

  • Java,
  • Algoritmi
    • Tutorial

    Cred că puțini dintre cei care se pregătesc pentru primul lor interviu, atunci când aplică pentru primul loc de muncă ca programator (pre)junior, vor răspunde negativ la această întrebare. Sau măcar să te îndoiești de răspunsul pozitiv. Desigur, o structură de date atât de simplă cu acces direct la index - fără trucuri! Nu, în unele limbi tip JavaScript sau matrice PHP, desigur, sunt implementate într-un mod foarte interesant și sunt în esență mult mai mult decât o simplă matrice. Dar nu despre asta vorbim, ci despre implementarea „tradițională” a matricelor sub forma unei „zone solide de memorie”. În acest caz, pe baza indicilor și a dimensiunii unui element, adresa este pur și simplu calculată și se accesează valoarea corespunzătoare. Ce este atât de greu la asta?
    Să ne dăm seama. De exemplu, în Java. Cererea unui solicitant nebănuit să creeze o serie de numere întregi n X n. Persoana scrie cu încredere ceva de genul:
    int g = nou int[n][n];
    Grozav. Acum vă cerem să inițializați elementele matricei cu ceva. Cel puțin în unități, cel puțin ca sumă de indici. Primim:
    for(int i = 0; i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
    Ei chiar scriu mai des
    for(int i = 0; i< g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
    care este și un motiv de conversație, dar acum vorbim despre altceva. Încercăm să aflăm ce știe o persoană și să vedem cum gândește. Prin urmare, îi atragem atenția asupra faptului că valorile sunt situate simetric și îi rugăm să economisească pe iterațiile buclei. Desigur, de ce să treci prin toate valorile indexului când poți trece doar prin triunghiul de jos? Subiectul este de obicei ușor de acord și evidențiind cu înțelepciune diagonala principală, scrie cu atenție ceva de genul:
    for(int i = 0; i< n; i++) { g[i][i] = 2* i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } }
    În loc de g[i][i] = 2* i; scris adesea g[i][i] = i + i; sau g[i][i] = i<< 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: Cât de repede va rula programul?. Raționamentul obișnuit este următorul: de aproape 2 ori mai puține calcule ale indicilor; de aproape 2 ori mai puține calcule ale valorilor (însumarea); același număr de sarcini. Aceasta înseamnă cu 30 la sută mai rapid.Dacă o persoană are un fundal bun în matematică, atunci puteți chiar să vedeți numărul exact de operațiuni salvate și o evaluare mai motivată a eficacității optimizării.
    Acum este timpul pentru lovitura principală. Rulăm ambele versiuni ale codului pe o valoare suficient de mare n(aproximativ câteva mii), de exemplu, așa.

    Cod controlat de timp

    clasa A ( public static void main(String args) ( int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0;i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nOne time " + (en - st)/1000000.d + " msc"); // two st = System.nanoTime(); for(int i = 0; i < n; i++) { g[i][i] = i + i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nTwo time " + (en - st)/1000000.d + " msc"); } }


    Ce vedem? Versiunea optimizată funcționează de 10-100 de ori mai lent! Acum este momentul să observăm reacția candidatului la poziție. Care va fi reacția la o situație stresantă neobișnuită (mai precis, obișnuită în practica dezvoltatorului). Dacă fața inculpatului arată emoție și începe să apese butoane, uitând temporar de existența ta, atunci acesta este un semn bun. Până la un punct. Nu vrei să angajezi un cercetător căruia nu-i pasă de rezultatul proiectului, nu? Atunci nu-i pune întrebarea „De ce?” Cereți-le să reproșeze a doua opțiune, astfel încât să funcționeze de fapt mai repede decât prima.
    Acum puteți să vă ocupați de afacerea dvs. în siguranță pentru o perioadă. În jumătate de oră veți avea suficient material pentru a evalua calitățile personale și profesionale de bază ale solicitantului.
    Apropo, când am descris pe scurt această problemă pe site-ul meu de muncă, cel mai popular comentariu a fost „Aceasta este curba ta Java”. Postez codul pe Great și Free special pentru ei. Și proprietarii fericiți de Free Pascal pentru Windows pot arunca o privire

    sub spoiler

    Ora programului; folosește Windows; var start, finish, res: int64; n, i, j: întreg; g: Array of Array of Integer; începe n:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(start); pentru i:=1 la n-1 face pentru j:=1 la n-1 face g:= i + j; QueryPerformanceCounter(terminare); writeln("Timp pe rânduri:", (terminare - început) / res, " sec"); QueryPerformanceCounter(start); pentru i:=1 la n-1 face pentru j:=1 la n-1 face g:= i + j; QueryPerformanceCounter(terminare); writeln("Timp prin coloane:", (terminare - start) / res, " sec"); Sfârşit.


    În codul de mai sus în Pascal, am eliminat aspectele „confuze” și am lăsat doar esența problemei. Dacă aceasta poate fi numită o problemă.
    Ce întrebări ajungem să punem inculpatului?
    1. De ce funcționează mai lent? Și mai detaliat...
    2. Cum se face inițializarea mai rapidă?

    Dacă este nevoie să aprofundăm implementarea Java, atunci solicităm solicitantului să respecte timpul de execuție pentru valori mici. n. De exemplu, pe ideone.com pentru n=117, opțiunea „optimizată” este pe jumătate mai lentă. Dar pentru următoarea valoare n=118 se dovedește a fi deja de 100 (o sută) de ori mai rapidă decât cea neoptimizată! Sugerați să experimentați pe o mașină locală. Lasă-l să se joace cu setările.
    Apropo, toată lumea înțelege ce se întâmplă?

    Câteva cuvinte de justificare

    Aș dori să spun câteva cuvinte pentru a justifica această metodă de angajare a interviurilor. Da, nu testez cunoștințele despre sintaxa limbajului și cunoștințele structurilor de date. Poate că, pe o piață a muncii civilizată, totul funcționează. Dar în condițiile noastre de lipsă totală de personal calificat, trebuie să evaluăm mai degrabă adecvarea pe termen lung a solicitantului pentru munca cu care se va confrunta. Acestea. capacitatea de a învăța, de a străpunge, de a înțelege, de a face.
    Acest lucru este similar în spirit cu „interviul” pentru recrutarea legionarilor în Roma antică. Viitorul războinic a fost foarte speriat și a privit să vadă dacă roșește sau păliște. Dacă devine palid, atunci într-o situație stresantă sângele se scurge din capul solicitantului și este predispus la o reacție pasivă. De exemplu, leșinul. Dacă solicitantul s-a înroșit, atunci sângele i-a urcat în cap. Acestea. este predispus la acțiuni active și să se grăbească în lupte. Acesta a fost considerat potrivit.
    Ei bine, un ultim lucru. De ce le-am spus tuturor despre această sarcină în loc să o folosesc în continuare în interviuri? Doar că potențialii solicitanți au „învățat” deja această sarcină și trebuie să folosească altele.
    De fapt, am acordat atenție acestui efect tocmai în legătură cu sarcina reală de procesare a imaginii. Situația a fost oarecum confuză și nu am înțeles imediat de ce mi-a scăzut fps-ul atât de mult după refactorizare. În general, oricine are probabil o mulțime de astfel de momente minunate.

    Până acum, versiunea principală este că memoria cache a procesorului este de vină. Acestea. accesul secvențial în prima opțiune funcționează într-un hash, care este actualizat atunci când se depășește o anumită limită. La accesarea pe coloane, hash-ul este forțat să fie actualizat în mod constant și acest lucru necesită mult timp. Să verificăm această versiune în cea mai pură formă. Să creăm o matrice și să comparăm ceea ce este mai rapid - să procesăm toate elementele într-un rând sau să procesăm elementele matricei cu un număr aleatoriu de același număr de ori? Acest program este ideone.com/tMaR2S. Pentru 100.000 de elemente de matrice, accesul aleatoriu este de obicei vizibil mai rapid. Ce înseamnă acest lucru?
    Aici mi s-a subliniat pe bună dreptate (Big_Lebowski) că rearanjarea buclelor schimbă rezultatele în favoarea opțiunii secvenţiale. Pentru puritatea experimentului, a trebuit să stabilesc un ciclu de încălzire. În același timp, am făcut mai multe repetări pentru a obține timpul mediu de funcționare așa cum mi-a recomandat Leventov. A ieșit așa ideone.com/yN1H4g. Acestea. Accesul aleatoriu la elementele unei matrice mari este cu ~10% mai lent decât accesul secvenţial. Poate cache-ul poate juca un rol. Cu toate acestea, în situația inițială, performanța a scăzut semnificativ. Deci mai este ceva.

    Treptat, versiunea despre acțiuni suplimentare atunci când treceți de la un rând al unui tablou la altul devine lider. Și este corect. Rămâne să ne dăm seama ce se întâmplă exact acolo.

    Etichete:

    • Programare
    • matrice
    • memorie
    Adaugă etichete
    • Tutorial

    Cred că puțini dintre cei care se pregătesc pentru primul lor interviu, atunci când aplică pentru primul loc de muncă ca programator (pre)junior, vor răspunde negativ la această întrebare. Sau măcar să te îndoiești de răspunsul pozitiv. Desigur, o structură de date atât de simplă cu acces direct la index - fără trucuri! Nu, în unele limbi precum JavaScript sau PHP, matricele sunt, desigur, implementate într-un mod foarte interesant și sunt în esență mult mai mult decât o matrice. Dar nu despre asta vorbim, ci despre implementarea „tradițională” a matricelor sub forma unei „zone solide de memorie”. În acest caz, pe baza indicilor și a dimensiunii unui element, adresa este pur și simplu calculată și se accesează valoarea corespunzătoare. Ce este atât de greu la asta?
    Să ne dăm seama. De exemplu, în Java. Cererea unui solicitant nebănuit să creeze o serie de numere întregi n X n. Persoana scrie cu încredere ceva de genul:
    int g = nou int[n][n];
    Grozav. Acum vă cerem să inițializați elementele matricei cu ceva. Cel puțin în unități, cel puțin ca sumă de indici. Primim:
    for(int i = 0; i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
    Ei chiar scriu mai des
    for(int i = 0; i< g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
    care este și un motiv de conversație, dar acum vorbim despre altceva. Încercăm să aflăm ce știe o persoană și să vedem cum gândește. Prin urmare, îi atragem atenția asupra faptului că valorile sunt situate simetric și îi rugăm să economisească pe iterațiile buclei. Desigur, de ce să treci prin toate valorile indexului când poți trece doar prin triunghiul de jos? Subiectul este de obicei ușor de acord și evidențiind cu înțelepciune diagonala principală, scrie cu atenție ceva de genul:
    for(int i = 0; i< n; i++) { g[i][i] = 2* i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } }
    În loc de g[i][i] = 2* i; scris adesea g[i][i] = i + i; sau g[i][i] = i<< 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: Cât de repede va rula programul?. Raționamentul obișnuit este următorul: de aproape 2 ori mai puține calcule ale indicilor; de aproape 2 ori mai puține calcule ale valorilor (însumarea); același număr de sarcini. Aceasta înseamnă cu 30 la sută mai rapid.Dacă o persoană are un fundal bun în matematică, atunci puteți chiar să vedeți numărul exact de operațiuni salvate și o evaluare mai motivată a eficacității optimizării.
    Acum este timpul pentru lovitura principală. Rulăm ambele versiuni ale codului pe o valoare suficient de mare n(aproximativ câteva mii), de exemplu, așa.

    Cod controlat de timp

    clasa A ( public static void main(String args) ( int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0;i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nOne time " + (en - st)/1000000.d + " msc"); // two st = System.nanoTime(); for(int i = 0; i < n; i++) { g[i][i] = i + i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nTwo time " + (en - st)/1000000.d + " msc"); } }


    Ce vedem? Versiunea optimizată funcționează de 10-100 de ori mai lent! Acum este momentul să observăm reacția candidatului la poziție. Care va fi reacția la o situație stresantă neobișnuită (mai precis, obișnuită în practica dezvoltatorului). Dacă fața inculpatului arată emoție și începe să apese butoane, uitând temporar de existența ta, atunci acesta este un semn bun. Până la un punct. Nu vrei să angajezi un cercetător căruia nu-i pasă de rezultatul proiectului, nu? Atunci nu-i pune întrebarea „De ce?” Cereți-le să reproșeze a doua opțiune, astfel încât să funcționeze de fapt mai repede decât prima.
    Acum puteți să vă ocupați de afacerea dvs. în siguranță pentru o perioadă. În jumătate de oră veți avea suficient material pentru a evalua calitățile personale și profesionale de bază ale solicitantului.
    Apropo, când am descris pe scurt această problemă pe site-ul meu de muncă, cel mai popular comentariu a fost „Aceasta este curba ta Java”. Postez codul pe Great și Free special pentru ei. Și proprietarii fericiți de Free Pascal pentru Windows pot arunca o privire

    sub spoiler

    Ora programului; folosește Windows; var start, finish, res: int64; n, i, j: întreg; g: Array of Array of Integer; începe n:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(start); pentru i:=1 la n-1 face pentru j:=1 la n-1 face g:= i + j; QueryPerformanceCounter(terminare); writeln("Timp pe rânduri:", (terminare - început) / res, " sec"); QueryPerformanceCounter(start); pentru i:=1 la n-1 face pentru j:=1 la n-1 face g:= i + j; QueryPerformanceCounter(terminare); writeln("Timp prin coloane:", (terminare - start) / res, " sec"); Sfârşit.


    În codul de mai sus în Pascal, am eliminat aspectele „confuze” și am lăsat doar esența problemei. Dacă aceasta poate fi numită o problemă.
    Ce întrebări ajungem să punem inculpatului?
    1. De ce funcționează mai lent? Și mai detaliat...
    2. Cum se face inițializarea mai rapidă?

    Dacă este nevoie să aprofundăm implementarea Java, atunci solicităm solicitantului să respecte timpul de execuție pentru valori mici. n. De exemplu, pe ideone.com pentru n=117, opțiunea „optimizată” este pe jumătate mai lentă. Dar pentru următoarea valoare n=118 se dovedește a fi deja de 100 (o sută) de ori mai rapidă decât cea neoptimizată! Sugerați să experimentați pe o mașină locală. Lasă-l să se joace cu setările.
    Apropo, toată lumea înțelege ce se întâmplă?

    Câteva cuvinte de justificare

    Aș dori să spun câteva cuvinte pentru a justifica această metodă de angajare a interviurilor. Da, nu testez cunoștințele despre sintaxa limbajului și cunoștințele structurilor de date. Poate că, pe o piață a muncii civilizată, totul funcționează. Dar în condițiile noastre de lipsă totală de personal calificat, trebuie să evaluăm mai degrabă adecvarea pe termen lung a solicitantului pentru munca cu care se va confrunta. Acestea. capacitatea de a învăța, de a străpunge, de a înțelege, de a face.
    Acest lucru este similar în spirit cu „interviul” pentru recrutarea legionarilor în Roma antică. Viitorul războinic a fost foarte speriat și a privit să vadă dacă roșește sau păliște. Dacă devine palid, atunci într-o situație stresantă sângele se scurge din capul solicitantului și este predispus la o reacție pasivă. De exemplu, leșinul. Dacă solicitantul s-a înroșit, atunci sângele i-a urcat în cap. Acestea. este predispus la acțiuni active și să se grăbească în lupte. Acesta a fost considerat potrivit.
    Ei bine, un ultim lucru. De ce le-am spus tuturor despre această sarcină în loc să o folosesc în continuare în interviuri? Doar că potențialii solicitanți au „învățat” deja această sarcină și trebuie să folosească altele.
    De fapt, am acordat atenție acestui efect tocmai în legătură cu sarcina reală de procesare a imaginii. Situația a fost oarecum confuză și nu am înțeles imediat de ce mi-a scăzut fps-ul atât de mult după refactorizare. În general, oricine are probabil o mulțime de astfel de momente minunate.

    Până acum, versiunea principală este că memoria cache a procesorului este de vină. Acestea. accesul secvențial în prima opțiune funcționează într-un hash, care este actualizat atunci când se depășește o anumită limită. La accesarea pe coloane, hash-ul este forțat să fie actualizat în mod constant și acest lucru necesită mult timp. Să verificăm această versiune în cea mai pură formă. Să creăm o matrice și să comparăm ceea ce este mai rapid - să procesăm toate elementele într-un rând sau să procesăm elementele matricei cu un număr aleatoriu de același număr de ori? Acest program este ideone.com/tMaR2S. Pentru 100.000 de elemente de matrice, accesul aleatoriu este de obicei vizibil mai rapid. Ce înseamnă acest lucru?
    Aici mi s-a subliniat pe bună dreptate (Big_Lebowski) că rearanjarea buclelor schimbă rezultatele în favoarea opțiunii secvenţiale. Pentru puritatea experimentului, a trebuit să stabilesc un ciclu de încălzire. În același timp, am făcut mai multe repetări pentru a obține timpul mediu de funcționare așa cum mi-a recomandat Leventov. A ieșit așa ideone.com/yN1H4g. Acestea. Accesul aleatoriu la elementele unei matrice mari este cu ~10% mai lent decât accesul secvenţial. Poate cache-ul poate juca un rol. Cu toate acestea, în situația inițială, performanța a scăzut semnificativ. Deci mai este ceva.

    Treptat, versiunea despre acțiuni suplimentare atunci când treceți de la un rând al unui tablou la altul devine lider. Și este corect. Rămâne să ne dăm seama ce se întâmplă exact acolo.

    Etichete: Adăugați etichete

    Un tablou este o succesiune finită de elemente ordonate de același tip, fiecare element în care este accesat de indexul său.

    Mărimea sau lungimea unei matrice este numărul total de elemente din matrice. Mărimea matricei este setată la crearea matricei și nu poate fi modificată ulterior, adică nu puteți elimina elemente din matrice sau nu le puteți adăuga acolo, dar puteți atribui noi valori elementelor existente.

    Indicele elementului de pornire este 0, următorul este 1 etc. Indicele ultimului element din matrice este cu unul mai mic decât dimensiunea matricei.

    În Java, tablourile sunt obiecte. Aceasta înseamnă că numele dat fiecărei matrice indică doar adresa unei date din memorie. Nimic nu este stocat în această variabilă, cu excepția adresei. Indicele matricei, de fapt, indică cât de departe trebuie să vă deplasați de la elementul inițial al matricei din memorie pentru a ajunge la elementul dorit.

    Pentru a crea o matrice, trebuie să declarați un nume potrivit pentru aceasta și apoi să asociați cu acest nume fragmentul de memorie dorit, unde valorile elementelor matricei vor fi stocate una după alta. Următoarele opțiuni pentru declararea unei matrice sunt posibile: nume de tip; numele tipului;

    Unde tip este tipul de elemente ale matricei și Nume- un identificator unic (nu este ocupat de alte variabile sau obiecte din această parte a programului) care începe cu o literă.

    Exemple: int a; dublu ar1; dublu ar2;

    În exemplu, am declarat nume pentru trei matrice. Cu prenume A o matrice de elemente de tip int poate fi asociată în continuare și cu nume ar1Și ar2în plus, pot fi conectate șiruri de numere reale (de tip double). Până acum nu am creat matrice, ci doar le-am pregătit nume.

    Acum puteți crea (sau, după cum se spune, inițializa) tablouri după cum urmează: a = new int; // matrice de 10 elemente de tip int int n = 5; ar1 = dublu nou[n]; // Matrice de 5 elemente dublu ar2 = (3.14, 2.71, 0, -2.5, 99.123); // O matrice de 6 elemente de tip double Adică, la crearea unei matrice, putem specifica dimensiunea acesteia, sau imediat listăm toate elementele dorite separate prin virgule în acolade (în acest caz, dimensiunea va fi calculată automat pe baza succesiunea elementelor care vor fi specificate). Vă rugăm să rețineți că, în acest caz, un punct și virgulă este plasat după acolada de închidere, ceea ce nu se întâmplă atunci când acolada închide un bloc.

    Dacă matricea a fost creată folosind operatorul nou, atunci fiecare dintre elementele sale primește o valoare implicită. Ceea ce va fi este determinat pe baza tipului de date (0 pentru int, 0.0 pentru double etc.).

    A fost posibil să se declare un nume pentru o matrice și să se creeze matricea în sine pe o singură linie folosind următoarea schemă: nume de tip = tip nou [dimensiune]; nume de tip = (el0, el1, ..., elN); Exemple: int mas1 = (10,20,30); int mas2 = new int;

    Pentru a accesa unul dintre elementele matricei pentru a citi sau modifica valoarea acestuia, trebuie să specificați numele matricei urmat de indexul elementului între paranteze drepte. Un element de matrice cu un index specific se comportă la fel ca o variabilă. De exemplu, pentru a afișa ultimul element al matricei mas1, trebuie să scriem în program:

    System.out.println("Ultimul element al matricei" + mas1);

    Și așa putem pune în matricea mas2 același set de valori care sunt stocate în mas1:

    Mas2 = 10; mas2 = 20; mas2 = 30;Deja din acest exemplu este clar că pentru a accesa toate elementele matricei, trebuie să repetăm ​​același tip de acțiuni. După cum vă amintiți, buclele sunt folosite pentru a repeta operațiunile de mai multe ori. În consecință, am putea umple matricea cu elementele necesare folosind o buclă: for(int i=0; iEste clar că dacă am avea o matrice nu de 3, ci de 100 de elemente, pur și simplu nu am fi putut face acest lucru. fără buclă.

    Lungimea oricărei matrice creată nu trebuie reținută, deoarece există o proprietate care o stochează. Puteți accesa această proprietate adăugând .length la numele matricei. De exemplu:

    Int razmer = mas1.lungime; Această proprietate nu poate fi modificată (adică nu i se poate atribui nimic), poate fi doar citită. Folosind această proprietate, puteți scrie cod de program pentru a procesa o matrice fără să știți măcar dimensiunea sa specifică.

    De exemplu, acesta este modul în care puteți afișa elementele oricărei matrice numite ar2:

    Pentru(int i = 0; i<= ar2.length - 1; i++) { System.out.print(ar2[i] + " "); } Для краткости удобнее менять нестрогое неравенство на строгое, тогда не нужно будет вычитать единицу из размера массива. Давайте заполним массив целыми числами от 0 до 9 и выведем его на экран: for(int i = 0; i < ar1.length; i++) {ar1[i] = Math.floor(Math.random() * 10); System.out.print(ar1[i] + " "); }

    Vă rugăm să rețineți că la fiecare pas al buclei, am trimis mai întâi o valoare aleatorie elementului de matrice cu indicele i, apoi am afișat același element pe ecran. Dar cele două procese (umplere și retragere) ar putea fi efectuate în cicluri diferite. De exemplu:

    Pentru(int i = 0; i< ar1.length; i++) { ar1[i] = Math.floor(Math.random() * 9); } for(int i = 0; i < ar1.length; i++) { System.out.print(ar1[i] + " "); } В данном случае более рационален первый способ (один проход по массиву вместо двух), но не всегда возможно выполнить требуемые действия в одном цикле.

    Pentru a procesa matrice, bucle de tip „n times” (for) sunt întotdeauna folosite deoarece știm dinainte de câte ori trebuie să se repete bucla (de același număr de ori cât există elemente în matrice).

    Sarcini

      Creați o matrice cu toate numerele pare de la 2 la 20 și afișați elementele matricei mai întâi într-o linie, separând un element de altul cu un spațiu, apoi într-o coloană (separând un element de altul prin începerea unei noi linii). Înainte de a crea o matrice, gândiți-vă cât de mare va fi.

      2 4 6 … 18 20
      2
      4
      6

      20

      Creați o matrice cu toate numerele impare de la 1 la 99, afișați-o pe ecran ca o linie și apoi afișați aceeași matrice pe ecran ca o linie, dar în ordine inversă (99 97 95 93 ... 7 5 3 1 ).

      Creați o matrice de 15 numere întregi aleatorii din segment. Afișați matricea pe ecran. Numărați câte elemente pare sunt în matrice și afișați acest număr pe ecran pe o linie separată.

      Creați o matrice de 8 numere întregi aleatorii din segment. Imprimați matricea pe ecran ca șir. Înlocuiți fiecare element cu un indice impar cu zero. Din nou, afișați matricea pe o linie separată.

      Creați 2 matrice de 5 numere întregi aleatorii din segment fiecare, afișați matricele pe ecran pe două linii separate. Calculați media aritmetică a elementelor fiecărei matrice și raportați pentru care dintre matrice această valoare a fost mai mare (sau raportați că mediile lor aritmetice sunt egale).

      Creați o matrice de 4 numere întregi aleatorii din segment, imprimați-o pe ecran ca șir. Determinați și afișați un mesaj care indică dacă matricea este o secvență strict crescătoare.

      Creați o matrice cu primele 20 de numere Fibonacci și afișați-o pe ecran. Vă reamintim că primul și al doilea termen al șirului sunt egali cu unii, iar fiecare următor este suma celor doi anteriori.

      Creați o matrice de 12 numere întregi aleatoare din segmentul [-15;15]. Determinați care element este maximul din această matrice și raportați indexul ultimei sale apariții în matrice.

      Creați două matrice de 10 numere întregi aleatorii din segment și o a treia matrice de 10 numere reale. Fiecare element cu indicele i al celui de-al treilea tablou trebuie să fie egal cu raportul dintre elementul din prima matrice cu indicele i-lea și elementul din a doua matrice cu indicele i-lea. Tipăriți toate cele trei matrice pe ecran (fiecare pe o linie separată), apoi imprimați numărul de elemente întregi din a treia matrice.

      Creați o matrice de 11 numere întregi aleatoare din segmentul [-1;1], afișați matricea ca o linie. Determinați ce element apare cel mai des în matrice și afișați un mesaj despre acesta pe ecran. Dacă două elemente apar de același număr de ori, atunci nu scoateți nimic.

      Utilizatorul trebuie să specifice un număr pozitiv par de la tastatură, iar programul trebuie să creeze o matrice de dimensiunea specificată din numere întregi aleatorii de la [-5;5] și să-l afișeze pe ecran ca o linie. După aceasta, programul trebuie să determine și să informeze utilizatorul despre suma modulelor a căror jumătate din matrice este mai mare: stânga sau dreapta, sau să informeze că aceste sume ale modulelor sunt egale. Dacă utilizatorul introduce un număr incorect, programul ar trebui să necesite introducerea repetată până când este specificată valoarea corectă.

      Programul trebuie să creeze o matrice de 12 numere întregi aleatoare din segmentul [-10;10] astfel încât să existe un număr egal de elemente negative și pozitive și să nu existe zerouri. În acest caz, ordinea elementelor trebuie să fie aleatorie (adică, opțiunea nu este potrivită atunci când tabloul conține în mod constant mai întâi 6 numere pozitive și apoi 6 negative, sau când elementele alternează constant printr-unul etc.). Afișați matricea rezultată pe ecran.

      Utilizatorul introduce de la tastatură un număr natural mai mare decât 3, care este stocat în variabila n. Dacă utilizatorul a introdus un număr incorect, programul ar trebui să-i ceară utilizatorului să repete introducerea. Creați o matrice de n numere întregi aleatoare dintr-un segment și afișați-o pe ecran. Creați o a doua matrice numai din elementele pare ale primei matrice, dacă există, și afișați-o pe ecran.

    Sortați o matrice

    Sortarea este procesul de rearanjare a elementelor unui tablou, atunci când toate elementele sale sunt aranjate în ordine crescătoare sau descrescătoare.Puteți sorta nu numai matrice numerice, ci și, de exemplu, șiruri (după același principiu pe care sunt aranjate cărțile). rafturile bibliotecii). În general, puteți sorta elementele oricărui set în care este specificată relația de ordine.Există algoritmi universali care efectuează sortarea indiferent de starea inițială a matricei. Dar, pe lângă ei, există algoritmi speciali care, de exemplu, pot sorta foarte rapid o matrice aproape ordonată, dar nu fac față bine unei matrice puternic amestecate (sau nu fac față deloc). Sunt necesari algoritmi speciali acolo unde viteza este importantă și se rezolvă o problemă specifică; studiul lor detaliat depășește scopul cursului nostru.

    Sortare după selecție

    Să ne uităm la un exemplu de sortare în ordine crescătoare. Adică poziția inițială din matrice ar trebui să aibă elementul minim, următoarea ar trebui să aibă un element mai mare sau egal etc., iar ultima poziție ar trebui să aibă elementul cel mai mare. Esența algoritmului este următoarea. Căutăm elementul minimal în orice și îl schimbăm cu cel inițial. Apoi, în partea rămasă a matricei (adică, printre toate elementele, cu excepția celui inițial), căutăm din nou elementul minim și îl schimbăm cu al doilea element din matrice. Și așa mai departe.

    Ilustrare:

    Pentru (int i = 0; i

    Sortare cu bule

    Esența algoritmului este aceasta. Dacă parcurgem orice matrice, stabilind ordinea corectă în fiecare pereche de elemente adiacente, atunci după aceea trecere elementul dorit va fi garantat a fi pe ultimul loc al matricei (cel mai mare pentru sortare în ordine crescătoare sau cel mai mic pentru sortare în ordine descrescătoare). Dacă treceți din nou prin matrice cu aceleași transformări, atunci elementul dorit este garantat a fi pe penultimul loc. Și așa mai departe. Exemplu:

    2 9 1 4 3 5 2 → ordinea este corectă, nu va exista nicio rearanjare

    2 9 1 4 3 5 2 → 2 1 9 4 3 5 2

    2 1 9 4 3 5 2 → 2 1 4 9 3 5 2

    2 1 4 9 3 5 2 → 2 1 4 3 9 5 2

    2 1 4 3 9 5 2 → 2 1 4 3 5 9 2

    2 1 4 3 5 9 2 → 2 1 4 3 5 2 9

    Cod: /* Bucla exterioară îngustează în mod constant fragmentul de matrice * care va fi luat în considerare, deoarece după fiecare trecere * a buclei interioare, elementul dorit va fi * în ultimul loc al fragmentului (nu trebuie să fie fi luat în considerare din nou). */ for (int i = a.length - 1; i >= 2; i--) ( /* În variabila sortată vom stoca un semn dacă tabloul * este sortat. Înainte de fiecare trecere a buclei interne * vom presupune că este sortat, dar dacă facem * cel puțin o permutare, înseamnă că nu suntem încă complet sortați. * Această tehnică, care simplifică sortarea, se numește criteriul Iverson. */ boolean sortat = adevărat; /* În bucla interioară parcurgem fragmentul de matrice, care este * determinat de bucla exterioară În acest fragment stabilim * ordinea corectă între elementele adiacente, deci în perechi * procesând întreg fragmentul */ for (int j = 0; j a) ( int temp = a[j]; a[j] = a; a = temp ; sortat = false; ) ) /* Dacă matricea este sortată (adică nu au existat permutări * în bucla interioară, atunci puteți opriți bucla exterioară *. */ if(sortat) ( break; ) )

    Matrice multidimensionale

    Un tablou poate consta nu numai din elemente de un anumit tip încorporat (int, double etc.), ci și, printre altele, din obiecte ale unei clase existente și chiar din alte tablouri.

    O matrice care conține alte matrice ca elemente se numește matrice multidimensională.Matricele bidimensionale sunt cel mai des folosite. Astfel de tablouri pot fi ușor reprezentate ca o matrice. Fiecare rând este o matrice unidimensională obișnuită, iar unirea tuturor rândurilor este o matrice bidimensională, în fiecare element din care este stocată o legătură către un rând al matricei. O matrice tridimensională poate fi imaginat ca un set de matrice, pe care fiecare le-am notat pe o fișă de bibliotecă. Apoi, pentru a ajunge la un anumit număr, trebuie mai întâi să indicați numărul cardului (primul index al matricei tridimensionale), prin urmare să indicați numărul rândului (al doilea indice al matricei) și numai apoi numărul elementului din rând (al treilea indice).

    În consecință, pentru a accesa un element al unui tablou n-dimensional, trebuie să specificați n indici.

    Matricele sunt declarate astfel: int d1; //Obișnuit, unidimensional int d2; //D3 dublu bidimensional; //Tridimensional int d5; //Cincidimensionale Când creați o matrice, puteți specifica în mod explicit dimensiunea fiecărui nivel: d2 = int; // Matrice de 3 rânduri și 4 coloane Dar puteți specifica doar dimensiunea primului nivel: int dd2 = int; /* Matrice de 5 rânduri. Nu se știe încă câte elemente vor fi în fiecare linie. */ În acest din urmă caz, puteți crea o matrice bidimensională, care nu va fi o matrice datorită faptului că fiecare rând va avea un număr diferit de elemente. De exemplu: for(int i=0; i<5; i++) { dd2[i] = new int; } В результате получим такой вот массив: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Мы могли создать массив явно указав его элементы. Например так: int ddd2 = {{1,2}, {1,2,3,4,5}, {1,2,3}};

    În acest caz, puteți accesa elementul cu indice 4 din al doilea rând ddd2, dar dacă accesăm elementul ddd2 sau ddd2- va apărea o eroare, deoarece astfel de elemente pur și simplu nu există. Mai mult, această eroare va apărea în timpul execuției programului (adică compilatorul nu o va vedea).

    În mod obișnuit, sunt utilizate matrice bidimensionale cu un număr egal de elemente în fiecare rând. Pentru a procesa matrice bidimensionale se folosesc două bucle imbricate cu contoare diferite. Exemplu (umplem o matrice bidimensională cu numere aleatoare de la 0 la 9 si afiseaza-l pe ecran sub forma unei matrice): int da = new int; for(int i=0; i

    Sarcini

      Creați o matrice bidimensională de 8 rânduri a câte 5 coloane fiecare dintre numere întregi aleatorii din segment. Afișați matricea pe ecran.

      Creați o matrice bidimensională de 5 rânduri cu 8 coloane fiecare de numere întregi aleatorii din segmentul [-99;99]. Afișați matricea pe ecran. Apoi, pe o linie separată, afișați valoarea elementului maxim al acestui tablou (indexul său nu contează).

      Creați o matrice bidimensională de 7 rânduri cu câte 4 coloane de numere întregi aleatorii din segmentul [-5;5]. Afișați matricea pe ecran. Determinați și afișați indicele rândului cu cel mai mare produs absolut al elementelor. Dacă există mai multe astfel de linii, atunci tipăriți indexul primei linii întâlnite.

      Creați o matrice bidimensională de 6 rânduri cu 7 coloane fiecare dintre numere întregi aleatorii din segment. Afișați matricea pe ecran. Transformați matricea astfel încât cel mai mare element din fiecare rând să fie primul. În acest caz, compoziția matricei nu poate fi modificată, ci doar elementele pot fi rearanjate într-o singură linie. Ordinea elementelor rămase ale liniei nu este importantă (adică, puteți face o singură permutare sau puteți sorta fiecare linie în ordine descrescătoare). Afișați matricea convertită pe ecran.

      Pentru a testa cunoștințele reziduale ale elevilor după vacanța de vară, profesorul din școala primară a decis să înceapă fiecare lecție cerând fiecărui elev câte un exemplu din tabla înmulțirii, dar în clasă sunt 15 persoane, iar exemplele dintre ei nu trebuie repetate. . Pentru a ajuta profesorul, scrieți un program care să afișeze 15 exemple aleatorii din tabla înmulțirii (de la 2*2 la 9*9, deoarece sarcinile de înmulțire cu 1 și 10 sunt prea simple). Mai mult, printre cele 15 exemple nu ar trebui să existe altele care se repetă (exemplele 2*3 și 3*2 și perechile similare ar trebui considerate repetate).

    2010, Alexey Nikolaevich Kostin. Departamentul TIDM, Facultatea de Matematică, Universitatea Pedagogică de Stat din Moscova.

    • Serghei Savenkov

      un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva