Cvičení – vrácení polí z metod
Při vývoji aplikací budete často muset sestavovat a upravovat sady dat. Metody jsou užitečné pro provádění operací s daty a jsou to zvláště výkonné nástroje pro vytváření samotných datových sad. Vývoj metod pro vytváření polí představujících sadu dat pomáhá udržovat kód opakovaně použitelný, uspořádaný a zjednodušený. V tomto cvičení si procvičíte vrácení polí z metod.
Najít mince, které se mají změnit
Předpokládejme, že máte několik mincí různých hodnot. Máte za úkol najít dvě mince, jejichž součet se rovná cílové hodnotě. V tomto cvičení jsou mince k dispozici v celočíselném poli. Budete muset vrátit indexy dvou mincí v novém poli. Pusťme se do toho.
V editoru Visual Studio Code odstraňte veškerý existující kód z předchozích cvičení.
Do editoru visual studio Code zadejte následující kód:
int[] TwoCoins(int[] coins, int target) { return new int[0]; }V případě, že nejsou nalezeny žádné dvě mince, vrátí vaše metoda prázdnou matici. Chvíli zvažte syntaxi vráceného výsledku. I když můžete vytvořit proměnnou pro uložení nového
int[]pole a vrácení proměnné,returnpříkaz umožňuje současně vytvářet a vracet hodnoty.Existuje mnoho přístupů k vyřešení tohoto problému. Chvíli zvažte, jak můžete hledat dvě čísla v matici, jejichž součet se rovná dané hodnotě.
V tomto cvičení se použije následující přístup:
- Výběr jednoho čísla z pole
- Zkontrolujte další čísla po jednom, abyste zjistili, jestli sečtou do cílové hodnoty.
- Vrátí výsledek, jakmile se najde shoda.
Pokud chcete zkontrolovat každé číslo v poli, aktualizujte metodu
TwoCoinsnásledujícím kódem: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]; }Zde představuje
currjeden pevný index mincí anextpředstavuje následné indexy mincí. Zkuste přidat každounextminci s pevnoucurrmincí, abyste zjistili, jestli se rovná cílové hodnotě.Dále přidejte logiku pro kontrolu součtu dvou mincí pro cílovou hodnotu. Provedete to tak, že předchozí smyčky aktualizujete
fornásledujícím kódem: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}; } } }V tomto kódu kontrolujete, jestli se součet hodnot v
currpoli anextv poli rovná cílové hodnotě. Pokud je součet stejný, vytvoříte pole pro uložení těchto indexů a vrátíte ho. Pokud nejsou stejné, můžete je ignorovat a dál kontrolovat.
Testování řešení
V tomto kroku otestujete kód, abyste měli jistotu, že je spuštěný správně. Nejprve inicializujete některé proměnné pro uložení vstupních dat, pak zavoláte metodu a vytisknete výsledky.
Vytvořte nový prázdný řádek kódu nad podpisem
TwoCoinsmetody. Pak zadejte následující kód:int target = 60; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[] result = TwoCoins(coins, target);Vzpomeňte si, že
TwoCoinsmetoda vrátí prázdné pole, pokud se nenajde žádná změna. Před pokusem o tiskresultpole budete muset zkontrolovat velikost pole.Zadejte nový prázdný řádek kódu. Pak zadejte následující kód:
if (result.Length == 0) { Console.WriteLine("No two coins make change"); } else { Console.WriteLine($"Change found at positions {result[0]} and {result[1]}"); }V případě potřeby otevřete integrovaný panel terminálu editoru Visual Studio Code.
Na příkazovém řádku terminálu zadejte příkaz dotnet run. Porovnejte výstup s následujícím:
Change found at positions 2 and 5Pokud váš kód zobrazí neočekávané výsledky, budete muset zkontrolovat kód, abyste našli chybu a aktualizovali ji. Spusťte kód znovu, abyste zjistili, jestli jste problém vyřešili. Pokračujte v aktualizaci a spouštění kódu, dokud váš kód nevygeneruje očekávané výsledky.
Vyhledání několika párů mincí, které se mění
V tomto kroku rozšíříte metodu TwoCoins , abyste našli více dvojic mincí, jejichž součet se rovná cílové hodnotě. V tomto cvičení najdete maximálně pět dvojic. To znamená, že návratový typ bude 2D pole místo 1D pole a budete muset upravit způsob, jakým kód vrátí výsledky. Pusťme se do toho.
Změňte návratový typ v podpisu metody tak
int[], žeint[,]kód aktualizujete na následující:int[,] TwoCoins(int[] coins, int target)Dále vytvoříte
int[,]pole pro uložení a vrácení výsledků a proměnnou čítače, která bude sledovat počet párů přidaných do pole.Aktualizujte metodu
TwoCoinsnásledujícím kódem:int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0;Všimněte si, že jste inicializovali prvky výsledné matice do
-1. To vám pomůže později, když budete chtít vytisknout nalezené páry.V dalším kroku použijete
resultpole k uložení každého nalezeného páru místo vrácení první shody.Aktualizujte metodu
TwoCoinsnásledujícím kódem: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++; } } }Všimněte si, že
countse při každém přidání páru do pole zvýší. To může způsobit chybu indexu mimo hranice, pokud se najde více než pět párů. Chcete-li této chybě zabránit, můžete přidat kód, který zkontroluje hodnotucounta vrátí výsledekresultpole.Aktualizujte logiku
TwoCoinsv metodě následujícím kódem: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; } }Nakonec budete muset aktualizovat konečný návratový příkaz, aby vrátil správný výsledek, pokud se vůbec nenašly žádné shody nebo pokud bylo nalezeno méně než pět shod.
Přejděte na
returnpříkaz vTwoCoinsmetodě.returnUpravte příkaz tak, aby odpovídal následujícímu kódu:if (count == 0) { return new int[0,0]; } return result;Tento návratový kód můžete také zkrátit pomocí ternárního operátoru, například takto:
return (count == 0) ? new int[0,0] : result;Důležité
Flexibilita klíčového
returnslova umožňuje vrátit hodnotu výrazu, pokud výsledek odpovídá zadanému návratovém typu metody.V tomto okamžiku
TwoCoinsby metoda měla odpovídat následujícímu kódu: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; }
Zachycení nového návratového pole
Teď, když vaše metoda vrací 2D pole, můžete aktualizovat kód tak, aby načítal a vytiskl výsledky. Vzhledem k tomu, že byly inicializovány -1prvky pole výsledků , můžete přidat kontrolu pro tisk všech dvojic, dokud -1 se nenajde hodnota.
Přejděte na začátek programu, kde
targetje proměnná definovaná. Upravte kód následujícím způsobem:int target = 30; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[,] result = TwoCoins(coins, target);Dále aktualizujete volání tak, aby
Console.WriteLinesprávně vypsalaresulthodnoty.Přejděte na
Console.WriteLinehovor. Aktualizujte kód tak, aby odpovídal následujícímu: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]}"); } }Tady ponecháte kontrolu prázdného pole tak, jak je, a vytisknete hodnoty 2D pole ve smyčce for-loop.
-1Když se najde hodnota, přerušíte smyčku, protože neexistují žádné další páry.
Kontrola práce
V této úloze spustíte aplikaci z integrovaného terminálu a ověříte, že váš kód funguje správně. Pojďme na to.
Porovnejte kód s následujícím kódem, abyste měli jistotu, že je správný:
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; }Uložte práci pomocí ctrl + S nebo pomocí nabídky Soubor editoru Visual Studio Code.
V případě potřeby otevřete integrovaný panel terminálu editoru Visual Studio Code.
Na panelu PRŮZKUMNÍK otevřete terminál v umístění složky TestProject, klikněte pravým tlačítkem myši na TestProject a pak vyberte Otevřít v integrovaném terminálu.
Na příkazovém řádku terminálu zadejte příkaz dotnet run.
Ověřte, že váš kód vytvoří následující výstup:
Change found at positions: 0,3 0,4 1,3 1,4 3,6Pokud váš kód zobrazuje různé výsledky, budete muset zkontrolovat kód, abyste našli chybu a aktualizovali ji. Spusťte kód znovu, abyste zjistili, jestli jste problém vyřešili. Pokračujte v aktualizaci a spouštění kódu, dokud váš kód nevygeneruje očekávané výsledky.
Dále aktualizujte hodnotu
targetna hodnotu80:int target = 80;Uložte svoji práci a pak zadejte příkaz dotnet run na příkazovém řádku terminálu.
Pokud chcete ověřit, že váš kód funguje podle očekávání, porovnejte výstup aplikace s následujícím výstupem:
No two coins make changePokud váš kód zobrazuje různé výsledky, budete muset zkontrolovat kód, abyste našli chybu a aktualizovali ji. Spusťte kód znovu, abyste zjistili, jestli jste problém vyřešili. Pokračujte v aktualizaci a spouštění kódu, dokud váš kód nevygeneruje očekávané výsledky.