C# - Os doze trabalho de Hércules - 12 Desafios cumpridos pela linguagem C# - II


Na primeira parte do artigo a linguagem C# completou os 6 trabalhos propostos.  Vamos agora terminar os 6 trabalhos restantes e provar que a linguagem C# é poderosa.

Para cada um dos trabalhos restantes propostos iremos incluir um novo projeto na solução via menu FILE -> Add New Project selecionando o tipo do projeto Windows Forms Application ou Console Application conforme o trabalho;

Para ativar o projeto atual para execução clique com o botão do mouse sobre o nome da Solução e defina qual o projeto deseja executar em Single startup project.

Ao trabalho...
 
Trabalho 7
 
Escreva um programa que receba n valores do usuário e em seguida ordene os valores em ordem ascendente.

 

Teoria

Na linguagem C#  os arrays possuem o índice com base zero, ou seja, o primeiro elemento do array possui o índice zero (0).

Um array de uma dimensão é declarado informando o tipo de dados do array seguido do nome do array, lembrando que devemos colocar colchetes ([]) depois do tipo do array e não após o seu nome:

Ex:  int[] tabela; ==> correto     int tabela[];  ==> incorreto

Na linguagem C# o tamanho do array não é parte do seu tipo, isso permite declarar uma array e em seguida atribuir qualquer array de objetos int a ele, sem considerar o seu tamanho:

Ex:    int[] numeros;                       //declara numeros como um array de inteiros de qualquer tamanho
         numeros = new int[10];          // numeros agora é um array de 10 elementos
         numeros = new int[20];          // numeros agora é um array de 20 elementos

Além de arrays de uma dimensão a linguagem C# suporta os seguintes tipos de arrays:

- Arrays com mais de uma dimensão :

    string[,] names;      
    int[,] array = new int[2, 2];

-  Array-of-arrays (jagged):

     byte[][] resultados;
     int[][] numArray = new int[][] { new int[] {1,3,5}, new int[] {2,4,6,8,10} };

Em C# declaramos um array assim :

string[] nomes;                 //array nomes de qualquer tamanho

mas isso não cria o array para fazer isso devemos declarar:

nomes = new string[5];        //array de strings de 5 elementos 

finalmente para inicializar o array fazemos assim:

nomes[0] = "José";
nomes[1] = "Carlos";
nomes[2] = "Macoratti";
nomes[3] = "Miriam";
nomes[4] = "Estela";


Observe o índice indicando a posição do elemento no array. O primeiro elemento é o zero e o último é 4. Assim temos 5 elementos no array com posições : 0,1,2,3 e 4.

Prática

 

Using System;
namespace Trabalho7
{
    class Program
    {
        static void Main(string[] args)
        {
            int numero;
            int temp;
            Console.WriteLine("\t\t  Macoratti .net\n\tQuase tudo para Visual Basic\n");
        try
        {
            //solicita a informação de quantos numeros vai usar
            Console.WriteLine("Informe quantos números você quer usar :");
            numero = Convert.ToInt32(Console.ReadLine());
            int[] array = new int[numero];
            //recebe os numeros do usuário
            for (int i = 0; i < numero; i++)
            {
                Console.Write("Informe o no. " + i + " Valor:");
                array[i] = Convert.ToInt32(Console.ReadLine());
            }
            //realiza a ordenação 
            for (int i = 0; i < numero ; i++)
            {
                for (int j = 0; j < numero - 1; j++)
                {
                    if (array[j] > array[j + 1])
                    {
                        temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
            }
            Console.WriteLine("Ordenando em Ordem Ascendente : ");
            //imprime os numeros ordenados
            for (int i = 0; i < numero; i++)
            {
                Console.WriteLine(array[i]);
            }
            Console.ReadKey();
        }
        catch (Exception ex)
       {
             Console.WriteLine(ex.Message);
             Console.ReadKey();
      }
    }
}

 

Note que para acessar um elemento eu utilizei o seu índice (array[0]) , e como em C# os arrays são base zero, o primeiro elemento tem o índice igual a zero (0).

 
Trabalho 8
 
Escreva um programa que receba 2 números de um usuário e retorne qual dos números é o maior e depois verifique se esse número é primo ou não.

 

Teoria

Um método é um bloco de código que contém uma série de instruções. Um programa faz com que as instruções sejam executados chamando o método e especificando todos os argumentos necessários do método. Em C#, todas instruções são executadas por métodos. O método Main é o ponto de entrada para cada aplicativo C# e ele é chamado pelo CLR (Common Languege Runtime) quando o programa é iniciado.

Métodos são declarados em uma classe ou struct, especificando o nível de acesso como public, private, abstract ou sealed, o valor de retorno, o nome do método. Essas partes juntas compõe a assinatura de método.

Os parâmetros do método são colocados entre parênteses e são separados por vírgulas. Os parênteses vazios indicam que o método não requer nenhum parâmetro.

Chamar um método em um objeto é como acessar um campo. Após o nome do objeto, adicione um ponto, o nome do método e parênteses. Os argumentos são listados dentro dos parênteses, e separados por vírgulas. 

Prática

 

using System;
namespace Trabalho8
{
    class Program
    {
        static void Main(string[] args)
        {
            //cria uma instância da classe Program
            Program p = new Program();
            //define as variáveis usadas no programa como do tipo int
            int num1, num2;
            int numeroEscolhido;
            Console.WriteLine("\t\t  Macoratti .net\n\tQuase tudo para Visual Basic\n");
            try
            {
                //recebe os numeros via console
                Console.WriteLine("Informe o primeiro número : ");
                num1 = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("Informe o segundo número  :");
                num2 = Convert.ToInt32(Console.ReadLine());
                //chamando o método para definir qual o numero maior
                numeroEscolhido = p.NumeroMaior(num1, num2);
                Console.WriteLine("O número maior é " + numeroEscolhido);
                //chamando o método para verificar se o número é primo
                p.NumeroPrimo(numeroEscolhido);
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
        private int NumeroMaior(int num1, int num2)
        {
            if (num1 > num2)
            {
                return num1;
            }
            else
            {
                return num2;
            }
        }
        private void NumeroPrimo(int num)
        {
            int i = 2;
            while (i < num)
            {
                if (num % i == 0)
                {
                    Console.WriteLine("\nEste número é um número Composto.");
                    break;
                }
                i++;
            }
            //
            if (i == num)
            {
                Console.WriteLine("\nEste número é um número Primo.");
            }
            if (num == 0 || num == 1)
            {
                Console.WriteLine("\nEste número não Composto nem Primo.");
            }
        }
    }
}

 
Neste exemplo poderíamos ter usado a função Max da classe Math que retorna  o maior valor entre dois números. Ex: Math.Max(x,y)
 
Trabalho 9
 
Escreva um programa que mostre a diferença entre um parâmetro por valor e um parâmetro por referência

 

Teoria


Em C#, os argumentos podem ser passados os parâmetros por valor ou por referência. A passagem por referência permite que membros da função, métodos, propriedades, indexadores, operadores e construtores alterem o valor dos parâmetros fazendo com que essa alteração persista no ambiente de chamada.
 

Uma variável de um tipo por referência não contém seus dados diretamente. Ele contém uma referência a seus dados. Quando você passa um parâmetro de tipo de referência por valor, é possível alterar os dados apontados por referência, como, por exemplo, o valor de um membro da classe. No entanto, você não pode alterar o valor da referência propriamente dito; ou seja, você não pode usar a mesma referência alocando memória para uma nova classe. Para isso, passe o parâmetro usando a palavra-chave ref ou  out.

Existem três modificadores de parâmetros que podem ser usados para alterar a forma como os parâmetros são passados para as funções :

A forma padrão de enviar um parâmetro é por valor.

 

Os parâmetros de referência são necessários quando você quer permitir a um método operar em vários pontos de dados declarados dentro do escopo do chamador. Observe a diferença entre parâmetros de saída e parâmetros de referência:

Prática

 

using System;
namespace Trabalho9
{
    class Program
    {
        public static void PorValor(int num)
        {
            num++;
        }
        public static void PorReferencia(ref int num)
        {
            num++;
        }
        static void Main(string[] args)
        {
            Console.WriteLine("\t\t  Macoratti .net\n\tQuase tudo para Visual Basic\n");
            int num;
            try
            {
                Console.Write("Informe um número :\t");
                num = Convert.ToInt32(Console.ReadLine());
                Console.WriteLine("\n\n\tTipo por Valor");
                Console.WriteLine("--------------------------");
                Console.Write("\nValor Anterior:\t{0}", num);
                Program.PorValor(num);
                Console.Write("\nValor Atual:\t{0}", num);
                Console.WriteLine("\n\n\n--------------------");
                Console.WriteLine("\tTipo por Referência");
                Console.WriteLine("--------------------------");
                Console.Write("\nValor Anterior:\t{0}", num);
                Program.PorReferencia(ref num);
                Console.Write("\nValor Atual:\t{0}", num);
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
    }
}

 

Note que o valor passado por referência foi alterado pela função.

 
Trabalho 10
 
Escreva um programa que receba um número de um usuário e exiba a soma dos dígitos deste número. Ex: Se o usuário informar 142 o valor exibido será: 1+4+2 = 7

 

Teoria

 

O C# fornece um grande conjunto de operadores, que são os símbolos que especificam quais operações executar em uma expressão.

No C#, um operador é um elemento de programa que é aplicado a um ou mais operandos em uma expressão ou instrução. Operadores que usam um operando, como, por exemplo, o operador de incremento (++) ou new, são chamados de Unário operadores.

Operadores que usam dois operandos, como, por exemplo, operadores aritméticos (+,-,*,/), são chamados de binário operadores. Um operador, o operador condicional (?:), usa três operandos e é o único operador Ternário em C#.

Operações em tipos integrais como ==, !=, <, >, <=, >=, binary +, binary -, ^, &, |, ~, ++, --, e sizeof() geralmente são permitidos em enumerações. Além disso, muitos operadores podem ser sobrecarregados pelo usuário, alterando, portanto, seu sentido quando aplicado a um tipo definido pelo usuário.

Cada operador tem uma precedência definida. Em uma expressão que contém vários operadores que têm níveis diferentes de precedência, a precedência dos operadores determina a ordem na qual os operadores são avaliados.

Comparação entre as linguagens VB .NET e C# - Operadores Aritméticos :

Propósito

VB.NET

C#

Adição + +
Subtração - -
Multiplicação * *

Divisão de inteiros

\

/

Módulo(divisão retornando o resto)

Mod

%

Exponenciação

^

n/d

Se você  precisa realizar cálculos mais complexos do que uma simples soma ou uma multiplicação em C#, use as funções da classe Math :

Função Finalidade Exemplo
Abs(x) Valor absoluto de x Abs(4.5) = 4,5;
Abs(-4.5) = 4,5;
Acos(x) Arco cosseno de x Acos (0.3) = 1,26...
Asin(x) Arco seno de x Asin(0.6) = 0,64...
Atan(x) Arco tangente de x Atan(0.5) = 0,46...
Ceiling(x) Arredonda x para cima Ceiling(0.1) = 1;
Ceiling(-0.1) = 0;
Cos(x) Cosseno de x Cos(0.5) = 0,87...
E Valor da constante E E = 2,71...
Exp(x) Exponencial (e elevado na x) Exp(2.0) = 7,38...
Floor(x) Arredonda x para baixo Floor(0.8) = 0;
Floor(-0.8) = -1;
Log(x) Logaritmo de x na base natural e Log(2.71) = 0,99...
Log10(x) Logaritmo de x na base 10 Log(2.0) = 0,30...
Max(x,y) Maior valor entre dois números Max(1.8,1.9) = 1.9;
Max(-0.3,-0.5) = -0,3;
Min(x) Menor valor entre dois números Min(1.2,1.5) = 1.2;
Min(-0.3,-0.6) = -0,3;
PI Valor de PI PI = 3,1415...
Pow(x,y) Valor de x elevado na y Pow(3,2) = 9
Round(x,y) Arredonda x para y casas decimais Round(6.98765,3) = 6,988
Sin(x) Seno de x Sin(2) = 0,9...
Sqrt(x) Raiz quadrada de x Sqrt(144) = 12
Tan(x) Tangente de x Tan(0.5) = 0,54...


Prática
 

using System;
namespace Trabalho10
{
    class Program
    {
        static void Main(string[] args)
        {
            Program p = new Program();
            string numero;
            int a;
            int tamanho;
            Console.WriteLine("\t\t  Macoratti .net\n\tQuase tudo para Visual Basic\n");
            try
            {
                Console.WriteLine("Informe um número inteiro : ");
                numero = Console.ReadLine();
                tamanho = numero.Length;
                a = int.Parse(numero);
                p.calcular(a, tamanho);
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
        private void calcular(int numero,int tamanho)
        {
            int a;
            int soma = 0;
            for (int i = 1; i <= tamanho; i++)
            {
                a = numero % 10;
                numero = numero / 10;
                Console.Write( a );                
                if (tamanho > i)
                   Console.Write(" + ");                
                soma = soma + a;
            }
            Console.WriteLine("\n");
            Console.WriteLine("A soma dos dígitos individuais deste número é => " + soma);
        }
    }
}

 

Nota : O operador ‘%’ tem como sua única função obter o resto de uma divisão.

 
Trabalho 11
 
Escreva um programa que calcule a área de um triângulo quando são fornecidos pelo usuário  o valor dos 3 lados A, B e C. O programa deve verificar se o triângulo existe.

 

Teoria

 

Heron de Alexandria é o responsável por elaborar uma fórmula matemática que calcula a área de um triângulo em função das medidas dos seus três lados. A fórmula de Heron de Alexandria é muito útil nos casos em que não sabemos a altura do triângulo, mas temos a medida dos lados.


Em um triângulo de lados medindo a, b e c podemos calcular a sua área utilizando a fórmula de Heron:
 

         P = (a + b + c) / 2;
         Area = Math.Sqrt(P * (P - a) * (P - b) * (P - c));

 

Sabemos que um triângulo é formado por três lados que possuem uma determinada medida, mas essas não podem ser escolhidas aleatoriamente como os lados de um quadrado ou de um retângulo, é preciso seguir uma regra.

Só irá existir um triângulo se, somente se, os seus lados obedeceram à seguinte regra:
um de seus lados deve ser maior que o valor absoluto (módulo) da diferença dos outros dois lados e menor que a soma dos outros dois lados.

 

Veja o resumo da regra abaixo:

| b - c | < a < b + c
| a - c | < b < a + c
| a - b | < c < a + b

 

Prática
 

using System;
namespace Trabalho11
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("\t\t  Macoratti .net\n\tQuase tudo para Visual Basic\n");
            double a, b, c, P;
            double Area;
            Console.WriteLine("\t  Cálculo da área do Triângulo pela fórmula de Heron \n");
            try
            {
                Console.Write("Informe o Lado A : ");
                a = Convert.ToDouble(Console.ReadLine());
                Console.Write("Informe o Lado B : ");
                b = Convert.ToDouble(Console.ReadLine());
                Console.Write("Informe o lado C : ");
                c = Convert.ToDouble(Console.ReadLine());
                if (verificaSeTrianguloExiste(a,b,c))
                {	
                    P = (a + b + c) / 2;
                    Area = Math.Sqrt(P * (P - a) * (P - b) * (P - c));
                    Console.WriteLine("\n\n");
                    Console.WriteLine("A Area do Triângulo de lados " + a + "," + b + " e " + c + " é igual a : " + Area);
                    Console.ReadKey();	
                }
                else
                {
                    Console.WriteLine("\n\n");
                    Console.WriteLine("Não existe triângulo com os lados informados");
                    Console.ReadKey();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
        private static bool verificaSeTrianguloExiste(double a, double b, double c)
        {
            // Exemplo : 5, 10 e 9 -> verdadeiro
            // A condição de existência 
            //| b - c | < a < b + c
            //| a - c | < b < a + c
            //| a - b | < c < a + b
            //-------------------------
            double bc = Math.Abs(b-c);
            double ac = Math.Abs(a-c);
            double ab = Math.Abs(a-b);
            //
            bool cond1 = false;
            bool cond2 = false;
            bool cond3 = false;
            if (bc < a && a < b + c)
            {
                cond1 = true;
            }
            if (ac < b && b < a + c)
            {
                cond2 = true;
            }
            if (ab < c && c < a + b)
            {
                cond3 = true;
            }
            if (cond1 && cond2 && cond3)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}


A função Math.Abs retorna o valor absoluto de um número.

 

Trabalho 12
 
Escreva um programa que exiba uma lista dos serviços instalados no computador local e ao final informe o número total de serviços instalados.

 

Teoria

O método ServiceController.GeServices() recupera todos os serviços no computador local, exceto serviços de driver de dispositivo.

A classe ServiceController representa um serviço do Windows e permite que você se conecte a um serviço em  execução ou interrompido, manipule o serviço e obtenha informações sobre ele.

Você pode usar a classe ServiceController para conectar e controlar o comportamento de serviços existentes. Quando você cria uma instância da classe de ServiceController , você define suas propriedades para poder interagir com um serviços específicos do Windows. Você pode usar a classe para iniciar, parar, e para manipular de outra maneira o serviço.

Depois de criar uma instância de ServiceController, você deve definir duas propriedades para identificar o serviço com que interage: o nome do computador e o nome de serviço que você deseja controlar.

Prática
 

using System;
using System.Linq;
using System.ServiceProcess;
namespace Trabalho12
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceController[] services = ServiceController.GetServices();
            Console.WriteLine("\t\t  Macoratti .net\n\tQuase tudo para Visual Basic\n");
            Console.WriteLine("\t Exibindo os serviços do Windows Instaldos \n");
            try
            {
                foreach (ServiceController servico in services)
                {
                    Console.WriteLine(" Serviço : " + servico.DisplayName);
                }
                Console.WriteLine("\n\n");
                Console.WriteLine(" Total de Serviços : " + services.Count());
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadKey();
            }
        }
    }
}


E com isso concluímos os 12 trabalhos de Hércules usando a linguagem C# aproveitando para abordar diversos tópicos da linguagem.

 

Pegue o projeto completo aqui : DozeTrabalhos_CSharp2.zip

João 3:26 E foram ter com João e disseram-lhe: Rabi, aquele que estava contigo além do Jordão, do qual tens dado testemunho, eis que está batizando, e todos vão ter com ele.

João 3:27 Respondeu João: O homem não pode receber coisa alguma, se não lhe for dada do céu.

João 3:28 Vós mesmos me sois testemunhas de que eu disse: Não sou o Cristo, mas sou enviado adiante dele.

 


Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#
 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti