Exercício - Retornar matrizes de métodos
Ao desenvolver aplicativos, muitas vezes você precisará criar e modificar conjuntos de dados. Os métodos são úteis para executar operações em dados e são ferramentas especialmente poderosas para criar os próprios conjuntos de dados. O desenvolvimento de métodos para criar matrizes que representam seu conjunto de dados ajuda a manter seu código reutilizável, organizado e simplificado. Neste exercício, você praticará o retorno de matrizes de métodos.
Encontre moedas para fazer o troco
Suponha que você tenha várias moedas de valores diferentes. Você é encarregado de encontrar duas moedas cuja soma é igual a um valor-alvo. Neste exercício, as moedas disponíveis são representadas em uma matriz inteira. Você precisará retornar os índices das duas moedas em uma nova matriz. Vamos começar!
No Editor de Códigos do Visual Studio, exclua qualquer código existente dos exercícios anteriores.
Insira o seguinte código no Editor de Códigos do Visual Studio:
int[] TwoCoins(int[] coins, int target) { return new int[0]; }No caso em que não são encontradas duas moedas, seu método retorna uma matriz vazia. Reserve um momento para considerar a sintaxe do resultado retornado. Embora você possa criar uma variável para armazenar uma nova
int[]matriz e retornar a variável, areturninstrução permite que você crie e retorne valores simultaneamente.Existem muitas abordagens para resolver este problema. Reserve um momento para considerar como você pode procurar dois números em uma matriz cuja soma é igual a um determinado valor.
Neste exercício, será utilizada a seguinte abordagem:
- Escolha um número da matriz
- Verifique outros números, um de cada vez, para ver se eles se somam ao valor-alvo
- Devolver o resultado assim que for encontrada uma correspondência
Para verificar cada número na matriz, atualize o
TwoCoinsmétodo com o seguinte código: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]; }Aqui,
currrepresenta um índice de moeda fixa enextrepresenta os índices de moeda subsequentes. Você tentará adicionar cadanextmoeda com a moeda fixacurrpara ver se elas correspondem ao valor-alvo.Em seguida, adicione lógica para verificar a soma das duas moedas para o valor alvo. Para fazer isso, atualize os loops anteriores
forcom o seguinte código: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}; } } }Neste código, você está verificando se a soma dos valores em
currenextna matriz é igual ao valor de destino. Se a soma for igual, você criará uma matriz para armazenar esses índices e devolvê-la. Se eles não forem iguais, você pode ignorá-los e continuar verificando.
Teste a sua solução
Nesta etapa, você testará seu código para garantir que ele esteja sendo executado corretamente. Primeiro, você inicializará algumas variáveis para armazenar os dados de entrada, depois chamará o método e imprimirá os resultados.
Crie uma nova linha de código em branco acima da assinatura do
TwoCoinsmétodo. Em seguida, insira o seguinte código:int target = 60; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[] result = TwoCoins(coins, target);Lembre-se de que o
TwoCoinsmétodo retorna uma matriz vazia se nenhuma alteração for encontrada. Você precisará verificar o tamanho da matriz antes de tentar imprimi-laresult.Insira uma nova linha de código em branco. Em seguida, insira o seguinte código:
if (result.Length == 0) { Console.WriteLine("No two coins make change"); } else { Console.WriteLine($"Change found at positions {result[0]} and {result[1]}"); }Se necessário, abra o painel Terminal integrado do Visual Studio Code.
No prompt de comando do Terminal, digite dotnet run. Compare a sua saída com o seguinte:
Change found at positions 2 and 5Se o código apresentar resultados inesperados, terá de rever o código para encontrar o erro e fazer atualizações. Execute o código novamente para ver se você corrigiu o problema. Continue atualizando e executando seu código até que seu código produza os resultados esperados.
Encontre vários pares de moedas que fazem a mudança
Nesta etapa, você estenderá o TwoCoins método para encontrar mais pares de moedas cuja soma é igual ao valor alvo. Para este exercício, você encontrará um máximo de cinco pares. Isso significa que o tipo de retorno será uma matriz 2D em vez de uma matriz 1D, e você precisará modificar a maneira como seu código retorna os resultados. Vamos começar!
Altere o tipo de retorno na assinatura do método de
int[]paraint[,]atualizando seu código para o seguinte:int[,] TwoCoins(int[] coins, int target)Em seguida, você criará uma
int[,]matriz para armazenar e retornar seus resultados e uma variável de contador para acompanhar o número de pares adicionados à matriz.Atualize o
TwoCoinsmétodo com o seguinte código:int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0;Observe que você inicializou os elementos da matriz de resultados em
-1. Isso irá ajudá-lo mais tarde quando você quiser imprimir os pares que foram encontrados.Em seguida, você usará a
resultmatriz para armazenar cada par encontrado em vez de retornar a primeira correspondência.Atualize o
TwoCoinsmétodo com o seguinte código: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++; } } }Observe que é incrementado toda vez que
countum par é adicionado à matriz. Isso pode causar um erro de índice fora dos limites se houver mais de cinco pares encontrados. Para evitar esse erro, você pode adicionar código para verificar o valor ecountretornar o resultado daresultmatriz está preenchido.Atualize a
TwoCoinslógica no método com o seguinte código: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; } }Por fim, você precisará atualizar a declaração de retorno final para retornar o resultado correto se nenhuma correspondência for encontrada ou se menos de cinco correspondências tiverem sido encontradas.
Navegue até a
returninstrução noTwoCoinsmétodo. Modifique areturninstrução para corresponder ao seguinte código:if (count == 0) { return new int[0,0]; } return result;Você também pode encurtar esse código de retorno usando o operador ternário assim:
return (count == 0) ? new int[0,0] : result;Importante
A flexibilidade da
returnpalavra-chave permite que você retorne o valor de uma expressão, desde que o resultado corresponda ao tipo de retorno especificado do método.Neste ponto, o
TwoCoinsmétodo deve corresponder ao seguinte código: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; }
Capturar a nova matriz de retorno
Agora que seu método está retornando uma matriz 2D, você pode atualizar seu código para recuperar e imprimir os resultados. Como os elementos da matriz de resultados foram inicializados no -1, você pode adicionar uma verificação para imprimir todos os pares até que um -1 valor seja encontrado.
Navegue até o início do seu programa onde a
targetvariável está definida. Modifique seu código da seguinte maneira:int target = 30; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[,] result = TwoCoins(coins, target);Em seguida, você atualizará a chamada para
Console.WriteLineimprimir corretamente osresultvalores.Navegue até a
Console.WriteLinechamada. Atualize o código para corresponder ao seguinte: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]}"); } }Aqui, você mantém a verificação de uma matriz vazia como está e imprime os valores da matriz 2D em um loop for. Quando um
-1valor é encontrado, você sai do loop, pois não há próximos pares.
Verifique o seu trabalho
Nesta tarefa, você executará seu aplicativo a partir do Terminal Integrado e verificará se seu código está funcionando corretamente. Vamos começar.
Compare seu código com o seguinte para garantir que esteja correto:
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; }Salve seu trabalho usando Ctrl + S ou usando o menu Arquivo de código do Visual Studio.
Se necessário, abra o painel Terminal integrado do Visual Studio Code.
No painel EXPLORER, para abrir um Terminal no local da pasta TestProject, clique com o botão direito do mouse em TestProject e selecione Abrir no Terminal Integrado.
No prompt de comando do Terminal, digite dotnet run
Verifique se o código produz a seguinte saída:
Change found at positions: 0,3 0,4 1,3 1,4 3,6Se o código apresentar resultados diferentes, terá de rever o código para encontrar o erro e fazer atualizações. Execute o código novamente para ver se você corrigiu o problema. Continue atualizando e executando seu código até que seu código produza os resultados esperados.
Em seguida, atualize o valor de para um valor de
target80:int target = 80;Salve seu trabalho e digite dotnet run no prompt de comando do Terminal
Para verificar se o código está funcionando conforme o esperado, compare a saída do seu aplicativo com a seguinte saída:
No two coins make changeSe o código apresentar resultados diferentes, terá de rever o código para encontrar o erro e fazer atualizações. Execute o código novamente para ver se você corrigiu o problema. Continue atualizando e executando seu código até que seu código produza os resultados esperados.