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:
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:
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:
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 :
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 :
String2 = Substring(0, String1.Length – String2.Length);
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:
C# - Tasks x Threads. Qual a diferença
C# - Programação Assíncrona como : Asycn e Task
C# - O Struct Guid