Cvičení – vrácení polí z metod

Dokončeno

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.

  1. V editoru Visual Studio Code odstraňte veškerý existující kód z předchozích cvičení.

  2. 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é, return příkaz umožňuje současně vytvářet a vracet hodnoty.

  3. 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:

    1. Výběr jednoho čísla z pole
    2. Zkontrolujte další čísla po jednom, abyste zjistili, jestli sečtou do cílové hodnoty.
    3. Vrátí výsledek, jakmile se najde shoda.
  4. Pokud chcete zkontrolovat každé číslo v poli, aktualizujte metodu TwoCoins ná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 curr jeden pevný index mincí a next představuje následné indexy mincí. Zkuste přidat každou next minci s pevnou curr mincí, abyste zjistili, jestli se rovná cílové hodnotě.

  5. Dále přidejte logiku pro kontrolu součtu dvou mincí pro cílovou hodnotu. Provedete to tak, že předchozí smyčky aktualizujete for ná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 curr poli a next v 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.

  1. Vytvořte nový prázdný řádek kódu nad podpisem TwoCoins metody. 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 TwoCoins metoda vrátí prázdné pole, pokud se nenajde žádná změna. Před pokusem o tisk result pole budete muset zkontrolovat velikost pole.

  2. 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]}");
    }
    
  3. V případě potřeby otevřete integrovaný panel terminálu editoru Visual Studio Code.

  4. 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 5
    

    Pokud 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.

  1. Změňte návratový typ v podpisu metody tak int[] , že int[,] 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.

  2. Aktualizujte metodu TwoCoins ná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 result pole k uložení každého nalezeného páru místo vrácení první shody.

  3. Aktualizujte metodu TwoCoins ná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 count se 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 hodnotu count a vrátí výsledek result pole.

  4. Aktualizujte logiku TwoCoins v 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.

  5. Přejděte na return příkaz v TwoCoins metodě. return Upravte 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 return slova umožňuje vrátit hodnotu výrazu, pokud výsledek odpovídá zadanému návratovém typu metody.

  6. V tomto okamžiku TwoCoins by 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.

  1. Přejděte na začátek programu, kde target je 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.WriteLine správně vypsala result hodnoty.

  2. Přejděte na Console.WriteLine hovor. 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. -1 Když 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.

  1. 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;
    }
    
  2. Uložte práci pomocí ctrl + S nebo pomocí nabídky Soubor editoru Visual Studio Code.

  3. 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.

  4. Na příkazovém řádku terminálu zadejte příkaz dotnet run.

  5. 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,6
    

    Pokud 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.

  6. Dále aktualizujte hodnotu target na hodnotu 80:

    int target = 80;
    
  7. Uložte svoji práci a pak zadejte příkaz dotnet run na příkazovém řádku terminálu.

  8. 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 change
    

    Pokud 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.