C# - Algoritmos de troca


 Hoje vamos tratar dos algoritmos de troca usando a linguagem C#.

Os algoritmos são o fundamento para quem deseja aprender a programar em qualquer linguagem.

Podemos dizer que um algoritmo é uma sequência finita de ações que visam obter uma solução para um determinado tipo de problema.

Vamos iniciar abordando um algoritmo de troca convencional que pode ser usado para trocar duas variáveis, cujo enunciado pode ser definido assim:

"Dada duas variáveis X e Y, troque os seus conteúdos fazendo com que o valor de Y para X e vice-versa"

A sequência de ações que resolver o problema pode ser descrita assim:

  1. Copie o conteúdo da variável X para uma variável temporária;
  2. Copie o conteúdo de Y para X;
  3. Copie o conteúdo da variável para Y;

Ao final X passa a ter o valor original de Y e Y passa a ter o valor original de X.

Esse seria um contexto trivial para quem esta iniciando com algoritmos e embora possa parecer 'uma barbada', em uma entrevista de emprego pode ser solicitado ao candidato que escreva a lógica para trocar dois números.

Assim neste artigo iremos discutir os seguintes tópicos relacionados:

  1. Como trocar dois números usando uma terceira variável;
  2. Como trocar dois números sem usar uma terceira variável;
  3. Mostrar exemplos usando valores numéricos e alfanuméricos;

Em todos os exemplos de código estaremos usando um projeto do tipo Console(.NET Core) no VS 2019 Community e a linguagem C#

Trocando dois números usando uma terceira variável

Vamos começar com a opção mais simples : trocar dois números usando uma terceira variável.

Para isso vamos seguir os seguintes passos:

  1. Primeiro atribuímos a primeira variável à variável temporária,
  2. Em seguida atribuímos a segunda variável à primeira variável
  3. Finalmente atribuímos o valor que está na terceira variável (que contém o primeiro número) para a segunda variável.

Veja o código abaixo:

using System;
namespace Algoritmos_Troca1
{
    class Program
    {
        static void Main(string[] args)
        {
            int temp;
            while (true)
            {
                Console.WriteLine("Algoritmo para Trocar números inteiros");
                Console.WriteLine("Para encerrar digite 999 \n");
                Console.WriteLine("Informe o primeiro número: ");

                var numero1 = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("Informe o segundo número:");

               var numero2 = Convert.ToInt32(Console.ReadLine());
              Console.WriteLine($"\nAntes de fazer a troca numero1= {numero1}, numero2 = {numero2}");
                if (numero1 == 999 || numero2 == 999)
                {
                    break;
                }
                temp = numero1; 
                numero1 = numero2; 
                numero2 = temp; 
                Console.WriteLine($"Depois de fazer trocar numero1= {numero1}, numero2 = {numero2}\n");
            }
        }
    }
}

Grande parte do código é para tratar a entrada do usuário e criar o laço while a lógica fica restrita a 3 linhas de código:

                temp = numero1;
                numero1 = numero2;
                numero2 = temp;

Veja o resultado abaixo:

Trocando dois números sem usar uma terceira variável

Podemos obter o mesmo resultado sem recorrer a uma terceira variável e para isso podemos usar :

  1. *  e /  (multiplicação e divisão)
  2. + e  -  (soma e subtração)

Veja a implementação para multiplicação e divisão:

static void Main(string[] args)
{
            while (true)
            {
                Console.WriteLine("Algoritmo para Trocar números inteiros");
                Console.WriteLine("Para encerrar digite 999 \n");
                Console.WriteLine("Informe o primeiro número: ");
                var numero1 = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("Informe o segundo número:");
                var numero2 = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine($"\nAntes de fazer a troca numero1= {numero1}, numero2 = {numero2}");
                if (numero1 == 999 || numero2 == 999)
                {
                    break;
                }
                numero1 = numero1 * numero2;
                numero2 = numero1 / numero2;
                numero1 = numero1 / numero2;
                Console.WriteLine($"Depois de fazer trocar numero1= {numero1}, numero2 = {numero2}\n");
            }
 } 

Executando o projeto teremos o resultado abaixo :

Para aplicar a adição e subtração basta usar:

   numero1 = numero1 + numero2;
   numero2 = numero1 - numero2; 
   numero1 = numero1 - numero2;

Trocando strings sem usar uma terceira variável

Para trocar o valor de duas variáveis do tipo string podemos definir a seguinte sequência de ações :

  1. Primeiro anexe a segunda string(String2) com a primeira string(String1) e armazene na primeira string:

    String1 = String1 + String2;
     
  2. A seguir use o método substring(int startIndex, int length) passando startindex como 0 e o length como String1.Length - String2.Length e armazene na segunda string;

    String2 = Substring(0, String1.Length – String2.Length);
     

  3. Finalmente chame o método Substring(int startindex) passando startindex como sendo String2.Lenght para obter a primeira string;

        String1 = Substring(String2.Length);

A ideia é fazer a concatenação de strings e então usar o método Substring() para realizar esta operação. Este método  pode ser usado de duas formas:

A seguir temos a implementação deste algoritmo:

using System;
namespace Algoritmos_Troca2
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                Console.WriteLine("Algoritmo para Trocar strings");
                Console.WriteLine("Para encerrar digite 'sair' \n");
                Console.WriteLine("Informe a primeira string: ");
                var string1 = Console.ReadLine();
                Console.WriteLine("Informe o segundo número:");
                var string2 = Console.ReadLine();
                Console.WriteLine($"\nAntes de fazer a troca string1= {string1}, string2 = {string2}");
                if (string1.Equals("sair") || string2.Equals("sair"))
                {
                    break;
                }
                // 1: anexa segunda string coma a primeira
                string1 = string1 + string2;
                // 2: armazena a string inicial string1 na string string2 
                string2 = string1.Substring(0, string1.Length - string2.Length);
                // 3: armazena a string a string string2 na string string1 
                string1 = string1.Substring(string2.Length);
                Console.WriteLine($"\nDepois de fazer a troca string1= {string1}, string2 = {string2}");
            }
        }
    }
}

Abaixo o resultado :

Trocando os elementos em um array

Veremos agora um método simples para trocar elementos em um array. O objetivo é trocar dois valores de dados nas posições n e m em um array de inteiros.

Embora simples, o conceito é importante, pois é muito usado em algoritmos de ordenação.

Dado um array com n números inteiros o objetivo é trocar dois valores nas posições n e m do vetor definidas.

Para isso podemos usar a seguinte implementação:

        public static int[] TrocarValores(int[] arrayDados, int m, int n)
        {
            int temp;
            temp = arrayDados[m];
            arrayDados[m] = arrayDados[n];
            arrayDados[n] = temp;
            return arrayDados;
        }

A seguir o código completo:

using System;
namespace Algoritmos_Troca3
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] numeros = { 230, 45, 345, 4, 324, 90, 76, 34, 67 };
            
            foreach(int numero in numeros)
                Console.Write($"{numero} ");
            Console.WriteLine("\n\nTrocando as posições 2 e 6 \n");
            int[] numerosTrocados = TrocarValores(numeros, 2, 6);
            foreach (int numero in numerosTrocados)
                Console.Write($"{numero} ");
            Console.ReadLine();
        }
        public static int[] TrocarValores(int[] arrayDados, int m, int n)
        {
            int temp;
            temp = arrayDados[m];
            arrayDados[m] = arrayDados[n];
            arrayDados[n] = temp;
            return arrayDados;
        }
    }
}

O resultado obtido é visto abaixo:

Nota:  Lembre-se que em um array a primeira posição possui o índice zero.

A o método TrocaValores() é vital para todos os algoritmos de ordenação pois ele é usado sempre que dois itens estão fora de ordem, e , quando isso ocorrer, eles serão trocados.

Isso não significa que o item chega ao seu lugar de descanso final na matriz. Significa apenas que, no momento, os itens foram reordenados, então ficaremos mais perto de ter uma matriz classificada.

Na próxima parte do artigo veremos alguns algoritmos de ordenação.

Pegue o projeto completo aqui:  Algoritmos_Troca1.zip

"Mas, se o nosso evangelho ainda está encoberto, é para os que se perdem que está encoberto, nos quais o deus deste século cegou o entendimento dos incrédulos, para que lhes não resplandeça a luz do evangelho da glória de Cristo, o qual é a imagem de Deus."
2 Coríntios 4:3,4

Referências:


José Carlos Macoratti