Exercițiu - Returnarea matricelor de la metode
Atunci când dezvoltați aplicații, va trebui adesea să construiți și să modificați seturi de date. Metodele sunt utile pentru efectuarea de operațiuni asupra datelor și sunt instrumente deosebit de puternice pentru construirea seturilor de date propriu-zise. Dezvoltarea de metode pentru a crea matrice reprezentând setul de date vă ajută să păstrați codul reutilizabil, organizat și simplificat. În acest exercițiu, veți exersa returnarea matricelor din metode.
Găsiți monede pentru a efectua modificări
Să presupunem că aveți mai multe monede de valori diferite. Vi se atribuie sarcina de a găsi două monede a căror sumă este egală cu o valoare țintă. În acest exercițiu, monedele disponibile sunt reprezentate într-o matrice întreagă. Va trebui să returnați indicii celor două monede într-o matrice nouă. Să începem!
În Visual Studio Code Editor, ștergeți orice cod existent din exercițiile anterioare.
Introduceți următorul cod în Visual Studio Code Editor:
int[] TwoCoins(int[] coins, int target) { return new int[0]; }În cazul în care nu se găsesc două monede, metoda returnează o matrice goală. Gândiți-vă la sintaxa rezultatului returnat. Deși puteți să creați o variabilă pentru a stoca o matrice nouă
int[]și a returna variabila, instrucțiuneareturnvă permite să creați și să returnați simultan valori.Există multe abordări pentru a rezolva această problemă. Gândiți-vă cum puteți căuta două numere într-o matrice a cărei sumă este egală cu o valoare dată.
În acest exercițiu, se va utiliza următoarea abordare:
- Alegeți un număr din matrice
- Verificați alte numere pe rând pentru a vedea dacă adună până la valoarea țintă
- Returnarea rezultatului imediat ce se găsește o potrivire
Pentru a verifica fiecare număr din matrice, actualizați
TwoCoinsmetoda cu următorul cod:int[] TwoCoins(int[] coins, int target) { for (int curr = 0; curr < coins.Length; curr++) { for (int next = curr + 1; next < coins.Length; next++) { } } return new int[0]; }Aici,
currreprezintă un index fix al monedei șinextreprezintă indicii monedei următoare. Veți încerca să adăugați fiecarenextmonedă cu moneda fixăcurrpentru a vedea dacă sunt egale cu valoarea țintă.În continuare, adăugați logică pentru a verifica suma celor două monede pentru valoarea țintă. Pentru a face acest lucru, actualizați buclele anterioare
forcu următorul cod:for (int curr = 0; curr < coins.Length; curr++) { for (int next = curr + 1; next < coins.Length; next++) { if (coins[curr] + coins[next] == target) { return new int[]{curr, next}; } } }În acest cod, verificați dacă suma valorilor de la
currșinextdin matrice este egală cu valoarea țintă. Dacă suma este egală, creați o matrice pentru a stoca acești indici și a o returna. Dacă acestea nu sunt egale, puteți să le ignorați și să continuați verificarea.
Testați soluția
În acest pas, veți testa codul pentru a vă asigura că rulează corect. Mai întâi, veți inițializa unele variabile pentru a stoca datele de intrare, apoi veți apela metoda și veți imprima rezultatele.
Creați o linie de cod necompletată nouă deasupra semnăturii metodei
TwoCoins. Apoi introduceți următorul cod:int target = 60; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[] result = TwoCoins(coins, target);Rețineți că
TwoCoinsmetoda returnează o matrice goală dacă nu se găsește nicio modificare. Va trebui să verificați dimensiunea matricei înainte de a încerca să imprimați matricearesult.Introduceți o nouă linie de cod necompletată. Apoi introduceți următorul cod:
if (result.Length == 0) { Console.WriteLine("No two coins make change"); } else { Console.WriteLine($"Change found at positions {result[0]} and {result[1]}"); }Dacă este necesar, deschideți panoul Terminal integrat visual Studio Code.
În linia de comandă Terminal, introduceți run dotnet. Comparați ieșirea cu următoarele:
Change found at positions 2 and 5Dacă codul afișează rezultate neașteptate, va trebui să revizuiți codul pentru a găsi eroarea și a face actualizări. Rulați codul din nou pentru a vedea dacă ați remediat problema. Continuați actualizarea și rularea codului până când codul produce rezultatele așteptate.
Găsiți mai multe perechi de monede care fac modificări
În acest pas, veți extinde TwoCoins metoda pentru a găsi mai multe perechi de monede a căror sumă este egală cu valoarea țintă. Pentru acest exercițiu, veți găsi maximum cinci perechi. Aceasta înseamnă că tipul returnat va fi o matrice 2D în locul unei matrice 1D și va trebui să modificați modul în care codul returnează rezultatele. Să începem!
Modificați tipul de returnare din semnătura metodei la
int[]int[,], actualizând codul la următoarele:int[,] TwoCoins(int[] coins, int target)În continuare, veți crea o
int[,]matrice pentru a stoca și a returna rezultatele și o variabilă contor pentru a urmări numărul de perechi adăugate la matrice.Actualizați
TwoCoinsmetoda cu următorul cod:int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0;Observați că ați inițializat elementele matrice de rezultate la
-1. Acest lucru vă va ajuta mai târziu atunci când doriți să imprimați perechile care au fost găsite.În continuare, veți utiliza matricea
resultpentru a stoca fiecare pereche găsită în loc să returnați prima potrivire.Actualizați
TwoCoinsmetoda cu următorul cod:int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0; for (int curr = 0; curr < coins.Length; curr++) { for (int next = curr + 1; next < coins.Length; next++) { if (coins[curr] + coins[next] == target) { result[count, 0] = curr; result[count, 1] = next; count++; } } }Observați că
counteste incrementat de fiecare dată când se adaugă o pereche la matrice. Acest lucru poate cauza o eroare index în afara limitelor dacă se găsesc mai mult de cinci perechi. Pentru a preveni această eroare, puteți să adăugați cod pentru a verifica valoareacountși a returna rezultatul matriceiresult.Actualizați logica
TwoCoinsdin metoda cu următorul cod:for (int next = curr + 1; next < coins.Length; next++) { if (coins[curr] + coins[next] == target) { result[count, 0] = curr; result[count, 1] = next; count++; } if (count == result.GetLength(0)) { return result; } }În sfârșit, va trebui să actualizați instrucțiunea finală de returnare pentru a returna rezultatul corect dacă nu se găsesc deloc potriviri sau dacă s-au găsit mai puțin de cinci potriviri.
Navigați la instrucțiunea
returndinTwoCoinsmetodă. Modificați instrucțiuneareturnpentru a se potrivi cu următorul cod:if (count == 0) { return new int[0,0]; } return result;De asemenea, puteți scurta acest cod de returnare utilizând operatorul ternar astfel:
return (count == 0) ? new int[0,0] : result;Important
Flexibilitatea cuvântului
returncheie vă permite să returnați valoarea unei expresii, atât timp cât rezultatul corespunde tipului specificat de returnare al metodei.În acest moment,
TwoCoinsmetoda ar trebui să corespundă următorului cod:int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0; for (int curr = 0; curr < coins.Length; curr++) { for (int next = curr + 1; next < coins.Length; next++) { if (coins[curr] + coins[next] == target) { result[count, 0] = curr; result[count, 1] = next; count++; } if (count == result.GetLength(0)) { return result; } } } return (count == 0) ? new int[0,0] : result; }
Capturați noua matrice de returnare
Acum, că metoda returnează o matrice 2D, puteți actualiza codul pentru a regăsi și a imprima rezultatele. Deoarece elementele matrice rezultat au fost inițializate la -1, puteți adăuga o verificare pentru a imprima toate perechile până când se găsește o -1 valoare.
Navigați la începutul programului unde este definită variabila
target. Modificați codul după cum urmează:int target = 30; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[,] result = TwoCoins(coins, target);În continuare, veți actualiza apelul pentru a
Console.WriteLineimprimaresultcorect valorile.Navigați la
Console.WriteLineapel. Actualizați codul pentru a se potrivi cu următoarele:if (result.Length == 0) { Console.WriteLine("No two coins make change"); } else { Console.WriteLine("Change found at positions:"); for (int i = 0; i < result.GetLength(0); i++) { if (result[i,0] == -1) { break; } Console.WriteLine($"{result[i,0]},{result[i,1]}"); } }Aici păstrați verificarea pentru o matrice goală as-isși imprimați valorile matricei 2D într-o buclă. Atunci când se găsește o
-1valoare, ieșiți din buclă, deoarece nu există perechi următoare.
Verificați-vă activitatea
În această activitate, veți rula aplicația de la Terminalul integrat și veți verifica dacă codul funcționează corect. Să începem.
Comparați codul cu următoarele pentru a vă asigura că este corect:
int target = 30; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[,] result = TwoCoins(coins, target); if (result.Length == 0) { Console.WriteLine("No two coins make change"); } else { Console.WriteLine("Change found at positions:"); for (int i = 0; i < result.GetLength(0); i++) { if (result[i,0] == -1) { break; } Console.WriteLine($"{result[i,0]},{result[i,1]}"); } } int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0; for (int curr = 0; curr < coins.Length; curr++) { for (int next = curr + 1; next < coins.Length; next++) { if (coins[curr] + coins[next] == target) { result[count, 0] = curr; result[count, 1] = next; count++; } if (count == result.GetLength(0)) { return result; } } } return (count == 0) ? new int[0,0] : result; }Salvați lucrul utilizând Ctrl + S sau utilizând meniul Fișier de cod Visual Studio.
Dacă este necesar, deschideți panoul Terminal integrat visual Studio Code.
În panoul EXPLORER, pentru a deschide un Terminal la locația folderului TestProject, faceți clic dreapta pe TestProject, apoi selectați Deschidere în terminal integrat.
În linia de comandă Terminal, introduceți run dotnet
Verificați dacă codul dvs. generează următoarea ieșire:
Change found at positions: 0,3 0,4 1,3 1,4 3,6Dacă codul afișează rezultate diferite, va trebui să revizuiți codul pentru a găsi eroarea și a face actualizări. Rulați codul din nou pentru a vedea dacă ați remediat problema. Continuați actualizarea și rularea codului până când codul produce rezultatele așteptate.
În continuare, actualizați valoarea
targetla o valoare a80:int target = 80;Salvați lucrul, apoi introduceți punctnet rulare în linia de comandă Terminal
Pentru a verifica dacă codul funcționează conform așteptărilor, comparați rezultatul aplicației cu următorul rezultat:
No two coins make changeDacă codul afișează rezultate diferite, va trebui să revizuiți codul pentru a găsi eroarea și a face actualizări. Rulați codul din nou pentru a vedea dacă ați remediat problema. Continuați actualizarea și rularea codului până când codul produce rezultatele așteptate.