.NET - A classe Math


A classe System.Math oferece muitos campos constantes e métodos estáticos que você pode usar para fazer cálculos trigonométricos, logarítmicos, e outros cálculos matemáticos. Por exemplo, o método Pow da classe System.Math pode ser usado para elevar um número a uma potência de x.

A seguir alguns exemplos de funções matemáticas e constantes existentes na classe System.Math:

Função/Constantes Resultado Exemplo
Abs(x) Fornece Valor absoluto de x Abs(4.5) = 4.5;
Abs(-4.5) = 4.5;
Ceiling(x) Arredonda x para cima Ceiling(4.1) = 5;
Ceiling(-4.1) = -4;
Cos(x) Obtém o cosseno de x Cos(2.0) = -0.4161......
Sin(x) Obtém o seno de x Sin(2) = 0.909297...
Tan(x) Obtém o valor da Tangente de x Tan(1.5) =14.1014...
PI Obtém o valor de PI PI = 3.141516171819...
E Obtém o valor da constante E E = 2.7182818284590451
Exp(x) Obtém o exponencial (e elevado na x) Exp(5.0) =54.59...
Floor(x) Arredonda o valor de x para baixo Floor(2.9) = 2;
Floor(-2.9)) = -3;
Log(x) Calcula o logaritmo de x na base natural e Log(3.0) = 1.098612...
Log10(x) Calcula o logaritmo de x na base 10 Log10(3.0) = 0.47712...
Max(x,y) Obtém o maior valor entre dois números Max(2.46,2.56) = 2.56;
Max(-2.46,-2.56) = 2.46;
Min(x,y) Obtém o menor valor entre dois números Min(1.92,1.89) = 1.89;
Min(-1.92,-1.89) = 1.92;
Pow(x,y) Obtém o valor de x elevado na y Pow(2,4) = 16
Round(x,y) Arredonda x para y casas decimais Round(7.6758549,4) = 7.6759
Sqrt(x) Obtém a raiz quadrada de x Sqrt(169) = 13

Vamos usar o método Pow e o campo Math.PI (devolve o valor de PI, a razão entre a circunferência de um círculo com o seu diâmetro), para calcular a área de um círculo . Onde RaioDoCirculo é o raio de um círculo, e PI  é o número 3.14159265358979323846.

Crie um novo projeto usando o Visual Studio Express 2012 for Desktop. Escolha a sua linguagem de preferência VB .NET ou C#. Informe o nome do projeto como AreaDoCirculo;

A seguir defina o seguinte código em arquivo Program.cs para projeto C# ou no modulo padrão em Sub Main() para um projeto VB .NET:

using System;

namespace CalcularAreaCirculo
{
 class Program
 {
  static void Main(string[] args)
  {

   double areaCirculo = 0;
  
double RaioDoCirculo = 0;
  
Console.WriteLine(" Informe o raio do Círculo : ");
   RaioDoCirculo =
Convert.ToDouble(Console.ReadLine());
   areaCirculo =
Math.PI * Math.Pow(RaioDoCirculo, 2);
  
Console.WriteLine(" A área do círculo de raio " +  RaioDoCirculo.ToString() + " é : " + areaCirculo.ToString());
   Console.ReadKey();
  }
 }
}

Module Module1

Sub Main()

Dim areaCirculo As Double
Dim
RaioDoCirculo As Double

Console.WriteLine(" Informe o raio do Círculo : ")
RaioDoCirculo =
Convert.ToDouble(Console.ReadLine)
areaCirculo =
Math.PI * Math.Pow(RaioDoCirculo, 2)
Console.WriteLine(" A área do círculo de raio " & RaioDoCirculo.ToString & " é : " & areaCirculo.ToString)

Console.ReadKey()

End Sub
End
Module

 

C# VB .NET

O resultado pode ser visto abaixo:

Outra constante, diferente de PI, é a base logarítmica natural ou constante de Euler, especificada pela constante Math.E ( 2,7182818284590452354). O método Log() calcula o logaritmo de um número especificado em uma base especificada.

Assim o método Log(double a,double novaBase) tem dois parâmetros. O primeiro é o número cujo logaritmo é para ser encontrado, e o segundo é a base do logaritmo.

Então podemos fazer:

Console.WriteLine(System.Math.Log(Math.E, 10))
Console
.ReadKey()

A função Math.Round tem outra sobrecarga com o qual você pode especificar o número de dígitos além do ponto decimal no valor retornado.

Em outras palavras, ele retorna o valor mais próximo do número com precisão igual ao segundo parâmetro passado.

Console.WriteLine(Math.Round(5.44, 1)) ' retorna 5.4
Console.WriteLine(Math.Round(5.45, 1)) ' retorna 5.4
Console.WriteLine(Math.Round(5.46, 1)) ' retorna 5.5
Console.WriteLine(Math.Round(5.54, 1)) ' retorna 5.5
Console.WriteLine(Math.Round(5.55, 1)) ' retorna 5.6
Console.WriteLine(Math.Round(5.56, 1)) ' retorna 5.6
Console.ReadKey()
Console.WriteLine(Math.Round(5.44, 1)); // retorna 5.4
Console.WriteLine(Math.Round(5.45, 1)); // retorna 5.4
Console.WriteLine(Math.Round(5.46, 1)); // retorna 5.5
Console.WriteLine(Math.Round(5.54, 1)); // retorna 5.5
Console.WriteLine(Math.Round(5.55, 1)); // retorna 5.6
Console.WriteLine(Math.Round(5.56, 1)); // retorna 5.6
Console.ReadKey();
VB .NET  C#

Você pode usar o método Floor para truncar um número real. O método retorna o maior número inteiro menor que o número original. Por exemplo, use o seguinte para obter o Floor de 4.8.

            Console.WriteLine(Math.floor (4.8));  //retorna 4
          
 Console.WriteLine(Math.floor (-4.8)); //retorna -5

A resposta seria 4. Observe que o método Floor pode se comportar diferentemente do que você poderia esperar para valores negativos. Por exemplo, Math.floor (-4.8) retorna -5.

O método de Celing faz o contrário, retornando o menor número inteiro maior do que o original.

             Console.WriteLine(Math.Ceiling (4.8));  //retorna 5
             Console.WriteLine(Math.Ceiling (-4.8));  //retorna -4

Criando uma classe para cálculo de área de volume com base na classe Math

Vamos agora criar uma classe para realizar alguns cálculos de área e volume com base na classe Math.

Esta classe será uma classe estática com métodos estáticos de forma que não precisaremos instanciar a classe para acessar os seus métodos.

Para criar a classe estática vamos estar atentos às seguintes regras :

Iremos criar um projeto do tipo Class Library de forma que o afinal teremos uma DLL que poderemos referenciar em qualquer tipo de projeto.

Abra o Visual Studio Express 2012 for desktop e clique no menu File-> New Project;

A seguir selecione o template : Visual C# -> Class Library, informando o nome MacMath;

A seguir defina o seguinte código nesta classe:       

using System;
namespace Macoratti
{
    public static class MacMath
    {
        /// <summary>
        /// Area do Quadrado em função do lado
        /// </summary>
        /// <param name="lado"></param>		
        /// <returns></returns>
        public static double AreaQuadrado(double lado)
        {
            return lado * lado;
        }
        /// <summary>
        /// Area do quadrado com base na diagonal
        /// </summary>
        /// <param name="diagonal"></param>
        /// <returns></returns>
        public static double AreaQuadradoDiagonal(double diagonal)
        {
            return (diagonal * diagonal) / 2;
        }
        /// <summary>
        /// Area do tringulo em função da base e altura
        /// </summary>
        /// <param name="altura"></param>
        /// <param name="valorBase"></param>
        /// <returns></returns>
        public static double AreaTriangulo(double altura, double valorBase)
        {
            return (valorBase * altura)/2;
        }
        /// <summary>
        /// Area do retangulo em função da base e altura
        /// </summary>
        /// <param name="valorBase"></param>
        /// <param name="altura"></param>
        /// <returns></returns>
        public static double AreaRetangulo(double valorBase, double altura)
        {
            return (valorBase * altura);
        }
        /// <summary>
        /// Area do circulo em função do raio
        /// Usa a constante PI
        /// </summary>
        /// <param name="raio"></param>
        /// <returns></returns>
        public static double AreaCirculo(double raio)
        {
            return (raio * Math.PI);
        }
        /// <summary>
        /// Area do trapezio em função da altura e base menor e maior
        /// </summary>
        /// <param name="altura"></param>
        /// <param name="baseMenor"></param>
        /// <param name="baseMaior"></param>
        /// <returns></returns>
        public static double AreaTrapezio(double altura, double baseMenor, double baseMaior)
        {
            return (altura * (baseMaior - baseMenor)) / 2;
        }
        /// <summary>
        /// Area d Anel(setor circular em função dos raios interno e externo
        /// </summary>
        /// <param name="raioInterno"></param>
        /// <param name="raioExterno"></param>
        /// <returns></returns>
        public static double AreaSetorCircular(double raioInterno,double raioExterno)
        {
            return (AreaCirculo(raioInterno) - AreaCirculo(raioExterno));
        }
        /// <summary>
        /// Volume do cilindro com base na altura e raio
        /// </summary>
        /// <param name="altura"></param>
        /// <param name="raio"></param>
        /// <returns></returns>
        public static double VolumeCilindro(double altura, double raio)
        {
            return Math.PI * Math.Pow(raio,2) * altura;
        }
        /// <summary>
        /// Volume de um tubo (cilindro vasado)
        /// </summary>
        /// <param name="altura"></param>
        /// <param name="raioExterno"></param>
        /// <param name="raioInterno"></param>
        /// <returns></returns>
        public static double VolumeCilindroOco(double altura, double raioExterno, double raioInterno)
        {
            return VolumeCilindro(altura, raioExterno) - VolumeCilindro(altura, raioInterno);
        }
        /// <summary>
        /// Volume da Esfora com base no raio
        /// </summary>
        /// <param name="raio"></param>
        /// <returns></returns>
        public static double VolumeEsfera(double raio)
        {
            return 4 / 3 * Math.PI * Math.Pow(raio, 3);
        }
        /// <summary>
        /// Area da esfera com base no raio
        /// </summary>
        /// <param name="raio"></param>
        /// <returns></returns>
        public static double AreaEsfera(double raio)
        {
            return 4 * Math.PI * Math.Pow(raio, 2);
        }
        /// <summary>
        /// Volume da Piramide em função da altura e area da base
        /// </summary>
        /// <param name="altura"></param>
        /// <param name="areaBase"></param>
        /// <returns></returns>
        public static double VolumePiramide(double altura, double areaBase)
        {
            return (altura * areaBase) / 3;
        }
    }
}

Estamos criando os seguintes métodos nesta classe:

Cada método possui uma documentação básica e usa as fórmulas matemáticas para calcular a respectiva área e/ou volume.

Após criar a classe compile o projeto de forma gerar o arquivo dll - MacMath.dll - que iremos referenciar em um projeto Windows Forms de forma a usar os métodos para calcular algumas áreas e volumes.

Criando o projeto Windows Forms e usando a classe MacMath

Abra o Visual Studio Express 2012 for desktop e clique no menu File-> New Project;

A seguir selecione o template : Visual C# ->Windows Forms, informando o nome Calculando;

Vamos agora incluir a referência a nossa dll criada no projeto Class Library.

No menu PROJECT clique em Add Reference e a seguir na guia Browse e localize onde você criou o arquivo dll do projeto Class Library:

Selecione o arquivo e clique no botão OK;

Agora vamos definir uma interface bem simples no formulário form1.cs usando os seguintes controles:

Abaixo vemos o leiaute do formulário exibindo as duas visualizações possíveis:

Abaixo temos o código do formulário iniciando com a declaração dos namespaces. Note que estamos declarando o namespace Macoratti de forma a simplificar a chamada dos métodos da Library.

O código do formulário abaixo mostra que no evento Click de cada botão de comando estamos chamando diretamente o método da classe MacMath sem a necessidade de criar uma instância da classe pois ela é uma classe estática.

Exemplo da chamada do método AreaQuadrado da classe MacMath :  MacMath.AreaQuadrado(lado).ToString();

using System;
using System.Windows.Forms;
using Macoratti;
namespace Calculando
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void btnQuadrado_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txtLado.Text))
            {
                MessageBox.Show("Informe o valor do lado do quadrado.", "Lado do Quadrado", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            //
            try
            {
                double lado = Convert.ToDouble(txtLado.Text);
                txtAreaQuadrado.Text = MacMath.AreaQuadrado(lado).ToString();
            }
            catch
            {
                MessageBox.Show("Ocorreu um erro no cálculo da área.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtLado.Focus();
            }
        }
        //valida o valor no textbox
        private void txtLado_KeyPress(object sender, KeyPressEventArgs e)
        {
           e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) &&  !(e.KeyChar ==',');
       }
        private void btnRetangulo_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txtBaseRetangulo.Text))
            {
                MessageBox.Show("Informe  o valor da base do retângulo.", "Base do Retângulo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (String.IsNullOrEmpty(txtAlturaRetangulo.Text))
            {
                MessageBox.Show("Informe o valor da altura do retângulo.", "Altura do Retângulo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            //
            try
            {
                double b = Convert.ToDouble(txtBaseRetangulo.Text);
                double a = Convert.ToDouble(txtAlturaRetangulo.Text);
                txtAreaRetangulo.Text = MacMath.AreaRetangulo(b,a).ToString();
            }
            catch
            {
                MessageBox.Show("Ocorreu um erro no cálculo da área.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtLado.Focus();
            }
        }
        private void txtBaseRetangulo_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && !(e.KeyChar == ',');
        }
        private void txtAlturaRetangulo_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && !(e.KeyChar == ',');
        }
        private void btnVolumeEsfera_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txtRaioEsfera.Text))
            {
                MessageBox.Show("Informe  o valor do raio da esfera.", "Raio da Esfera", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            //
            try
            {
                double raio = Convert.ToDouble(txtRaioEsfera.Text);
                txtVolumeEsfera.Text = MacMath.VolumeEsfera(raio).ToString();
            }
            catch
            {
                MessageBox.Show("Ocorreu um erro no cálculo da área.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtRaioEsfera.Focus();
            }
        }
        private void btnVolumeCilindro_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(txtAlturaCilindro.Text))
            {
                MessageBox.Show("Informe  o valor da altura do Cilindro.", "Altura do Cilindro", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (String.IsNullOrEmpty(txtRaioCilindro.Text))
            {
                MessageBox.Show("Informe o valor do raio do Cilindro.", "Raio do Cilindro", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            //
            try
            {
                double altura = Convert.ToDouble(txtRaioCilindro.Text);
                double raio = Convert.ToDouble(txtAlturaCilindro.Text);
                txtVolumeCilindro.Text = MacMath.VolumeCilindro(raio,altura).ToString();
            }
            catch
            {
                MessageBox.Show("Ocorreu um erro no cálculo da área.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                lblaltura.Focus();
            }
        }
        private void txtRaioEsfera_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && !(e.KeyChar == ',');
        }
        private void txtRaioCilindro_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && !(e.KeyChar == ',');
        }
        private void textBox5_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && !(e.KeyChar == ',');
       }
    }
}

Estamos usando o evento KeyPress para permitir somente valores numéricos nas caixas de texto e estamos verificando se foram informando valores nas caixas de texto.

O código básico é :  e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && !(e.KeyChar == ',');

que permite somente números, a vírgula e backspace.

Pegue o projeto completo aqui:  MacMath.zip e Calculando.zip

1Pe 2:6 Por isso, na Escritura se diz: Eis que ponho em Sião uma principal pedra angular, eleita e preciosa; e quem nela crer não será confundido.

1Pe 2:7 E assim para vós, os que credes, é a preciosidade; mas para os descrentes, a pedra que os edificadores rejeitaram, esta foi posta como a principal da esquina,

1Pe 2:8 e: Como uma pedra de tropeço e rocha de escândalo; porque tropeçam na palavra, sendo desobedientes; para o que também foram destinados.

Referências:


José Carlos Macoratti