domingo, 16 de agosto de 2015

Calculadora científica (Cambios en el primer avance)

Integrantes:
Sergio Andrés Sepúlveda
Sthefany Blanco
Juan David Franco

Se modificó el primer avance de la calculadora científica:cambiamos la única clase que había por clases respectivas a los dominios de los números (una clase para numeros complejos, otra para naturales, otra para reales, etc.)
implementamos el manejo de los números complejos

Diagrama de clases:

Código fuente:

Clase CalculadoraComplejos:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace calculadora
{
/// <summary>
/// Clase que contiene métodos para operar números complejos
/// </summary>
class CalculadoraComplejos
{
/// <summary>
/// Método que suma 2 números complejos
/// </summary>
/// <param name="a">Parte real del primer complejo</param>
/// <param name="b">Parte imaginaria del primer complejo</param>
/// <param name="c">Parte real del segundo complejo</param>
/// <param name="d">Parte imaginaria del segundo complejo</param>
/// <returns>Retorna un string que contiene la suma de los 2 números complejos</returns>
public static string SumaComplejo(double a, double b, double c, double d)
{
///creamos un arreglo que contiene el resultado de la suma según la siguiente fórmula:
///(a+bi)+(c+di)=(a+c)+(b+d)i
double[] resultado = new double[] { a+ c, b + d };
///con este if se mejorará la "presentación" del string que contiene el resultado
///si la parte imaginaria es menor a 0 el programa la concatenará sin necesidad de usar ningún símbolo
///para separarlo de la parte real debido debido a que la parte imaginaria estará acompañada de un signo "-" (ejemplo: 2-4i)
///En caso de que la parte imaginaria sea 0 o mayor se concatenará con un signo "+" a la parte real (ejemplo: 2+3i)
if (resultado[1] < 0)
{
///la sentencia string.join imprime en una sola linea los elementos de un arreglo (en este caso el arreglo resultado)
///y los separa con cualquier texto que uno use dentro de las comillas
string suma = string.Join("", resultado);
return suma;
}
else
{
string suma = string.Join("+", resultado);
return suma;
}
}
/// <summary>
/// Método que resta 2 números complejos
/// </summary>
/// <param name="a">Parte real complejo 1</param>
/// <param name="b">Parte imaginaria complejo 1</param>
/// <param name="c">Parte real complejo 2</param>
/// <param name="d">Parte imaginaria complejo 2</param>
/// <returns>retorna un string que contiene el resultado de la resta de 2 números complejos</returns>
public static string RestaComplejo(double a, double b, double c, double d)
{
///creamos un arreglo que contiene el resultado de la resta según la siguiente fórmula:
///(a+bi)-(c+di)=(a-c)+(b-d)i
double[] resultado = new double[] {a - c, b - d };
///if para imprimir el resultado según su parte imaginaria (ver el if del metodo suma complejo)
if (resultado[1] < 0)
{
string resta = string.Join("", resultado);
return resta;
}
else
{
string resta = string.Join("+", resultado);
return resta;
}
}
/// <summary>
/// Método que multiplica 2 números complejos
/// </summary>
/// <param name="a">Parte real complejo 1</param>
/// <param name="b">Parte imaginaria complejo 1</param>
/// <param name="c">Parte real complejo 2</param>
/// <param name="d">Parte imaginaria complejo2</param>
/// <returns></returns>
public static string MultiplicacionComplejo(double a, double b, double c, double d)
{
///Creamos un arreglo que contiene el resultado de la multiplicación según la siguiente fórmula:
///(a+bi)*(c+di)=(ac-bd)+(ad+bc)i
double[] resultado = new double[] { (a * c) - (b * d), (a * d) + (b* c) };
///if para imprimir el resultado según su parte imaginaria (ver el if del metodo suma complejo)
if (resultado[1] < 0)
{
string multi = string.Join("", resultado);
return multi;
}
else
{
string multi = string.Join("+", resultado);
return multi;
}
}
public static string DivisionComplejo(double a, double b, double c, double d)
{
///verifica si el segundo complejo ingresado tiene 0 en su parte real o imaginaria ya que estos no pueden ser 0
///si es así retornará la excepción DivideByZeroException
if (c == 0 || d == 0)
{
throw new DivideByZeroException();
}
else
///si el segundo numero complejo no contiene 0 creará un arreglo con el resultado de la división usando la siguiente fórmula
///{[(a*c)+(b*d)]/[(c^2+d^2)]}+{[(b*c)-(a*d)]/[(c^2+d^2)]}i
///la sentencia Math.Pow(base, potencia) se usa para elevar c y d al cuadrado
{
double[] resultado = new double[] { ((a * c) + (b * d)) / (Math.Pow(c, 2) + Math.Pow(d, 2)), ((b * c) - (a * d)) / (Math.Pow(c, 2) + Math.Pow(d, 2)) };
///if para imprimir el resultado según su parte imaginaria (ver el if del metodo suma complejo)
if (resultado[1] < 0)
{
string div = string.Join("", resultado);
return div;
}
else
{
string div = string.Join("+", resultado);
return div;
}
}
}
}
}



Clase Calculadora Enteros:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace calculadora
{
    /// <summary>
    /// Clase que contiene métodos para operar números enteros
    /// </summary>
    class CalculadoraEnteros
    {
        /// <summary>
        /// Método que suma 2 números enteros ámbos de tipo int ya que este tipo de dato no admite decimales
        /// </summary>
        /// <param name="x">entero 1</param>
        /// <param name="y">entero 2</param>
        /// <returns>retorna un int que es la suma de los 2 numeros enteros</returns>
        public static int SumaEntero(int x, int y)
        {
            int suma = x + y;
            return suma;
        }

        /// <summary>
        /// Método que resta 2 números enteros ámbos de tipo int ya que este tipo de dato no admite decimales
        /// </summary>
        /// <param name="x">entero 1</param>
        /// <param name="y">entero 2</param>
        /// <returns>retorna un int que es la resta de los 2 números enteros</returns>
        public static int RestaEntero(int x, int y)
        {
            int resta = x - y;
            return resta;
        }

        /// <summary>
        /// Método que multiplica 2 números enteros ámbos de tipo int ya que este tipo de dato no admite decimales
        /// </summary>
        /// <param name="x">entero 1</param>
        /// <param name="y">entero 2</param>
        /// <returns>retorna un int que es la multiplicaión de los 2 números enteros</returns>
        public static int MultiplicacionEntero(int x, int y)
        {
            int multi = x * y;
            return multi;
        }

        /// <summary>
        /// Método que divide 2 números enteros ámbos de tipo int ya que este tipo de dato no admite decimales
        /// </summary>
        /// <param name="x">entero 1</param>
        /// <param name="y">entero 2</param>
        /// <returns>retorna un int que es la división de los 2 números enteros</returns>
        public static int DivisionEntero(int x, int y)
        {
            //verifica si el segundo número ingresado es 0 ya que la división por 0 no existe
            ///si es así retornará la excepción DivideByZeroException
            if (y == 0)
            {
                throw new DivideByZeroException();
            }
            else
            {
                int div = x / y;
                return div;
            }
        }
    }
}

Clase CalculadoraNaturales:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace calculadora
{
    class CalculadoraNaturales
    {
        /// <summary>
        /// Método que suma 2 números naturales, las variables son de tipo int por que no aceptan decimales
        /// </summary>
        /// <param name="x">primer número natural</param>
        /// <param name="y">segundo número natural</param>
        /// <returns>retorna un int con la suma de los 2 números naturales</returns>
        public static int SumaNatural(int x, int y)
        {
            ///verifica si los números ingresados están dentro del rango de los naturales
            ///si no es así retornará la excepción SystemException
            if (x < 0 || y < 0)
            {
                throw new SystemException();
            }
            else
            {
                int suma = x + y;
                return suma;
            }
        }

        /// <summary>
        /// Método que resta 2 números naturales, las variables son de tipo int por que no aceptan decimales
        /// </summary>
        /// <param name="x">primer número natural</param>
        /// <param name="y">segundo número natural</param>
        /// <returns>retorna un int con la resta de los 2 números naturales</returns>
        public static int RestaNatural(int x, int y)
        {
            ///verifica si los números ingresados están dentro del rango de los naturales
            ///si no es así retornará la excepción SystemException
            if (x < 0 || y < 0)
            {
                throw new SystemException();
            }
            ///verifica si el segundo numero es mayor que el primero
            ///ya que esto produce que el resultado esté fuera de los numeros naturales
            ///de ser así retornará la excepción InvalidOperationException
            else if (x < y)
            {
                throw new InvalidOperationException();
            }
            else
            {
                int resta = x - y;
                return resta;
            }
        }

        /// <summary>
        /// Método que multiplica 2 números naturales, las variables son de tipo int por que no aceptan decimales
        /// </summary>
        /// <param name="x">primer número natural</param>
        /// <param name="y">segundo número natural</param>
        /// <returns>retorna un int con la multiplicación de los 2 números naturales</returns>
        public static int MultiplicacionNatural(int x, int y)
        {
            ///verifica si los números ingresados están dentro del rango de los naturales
            ///si no es así retornará la excepción SystemException
            if (x < 0 || y < 0)
            {
                throw new SystemException();
            }
            else
            {
                int multi = x * y;
                return multi;
            }

        }

        /// <summary>
        /// Método que divide 2 números naturales, las variables son de tipo int por que no aceptan decimales
        /// </summary>
        /// <param name="x">primer número natural</param>
        /// <param name="y">segundo número natural</param>
        /// <returns>retorna un int con la división de los 2 números naturales</returns>
        public static int DivisionNatural(int x, int y)
        {
            ///verifica si los números ingresados están dentro del rango de los naturales
            ///si no es así retornará la excepción SystemException
            if (x < 0 || y < 0)
            {
                throw new SystemException();
            }
            else if (y == 0)//verifica si el segundo número ingresado es 0 ya que la división por 0 no existe
            {
                throw new DivideByZeroException();
            }
            else
            {
                int div = x / y;
                return div;
            }
        }
    }
}

Clase Calculadora Racionales:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace calculadora
{
    /// <summary>
    /// Clase que contiene métodos para operar números racionales
    /// </summary>
    class CalculadoraRacionales
    {
        /// <summary>
        /// Método que suma 2 números racionales, son de tipo double por que este incluye decimales
        /// </summary>
        /// <param name="x">primer numero racional,</param>
        /// <param name="y">segundo numero racional</param>
        /// <returns>retorna un double con la suma de los 2 numeros racionales</returns>
        public static double SumaRacional(double x, double y)
        {
            double suma = x + y;
            return suma;
        }

        /// <summary>
        /// Método que resta 2 números racionales, son de tipo double por que este incluye decimales
        /// </summary>
        /// <param name="x">primer numero racional,</param>
        /// <param name="y">segundo numero racional</param>
        /// <returns>retorna un double con la resta de los 2 numeros racionales</returns>
        public static double RestaRacional(double x, double y)
        {
            double resta = x - y;
            return resta;
        }

        /// <summary>
        /// Método que multiplica 2 números racionales, son de tipo double por que este incluye decimales
        /// </summary>
        /// <param name="x">primer numero racional,</param>
        /// <param name="y">segundo numero racional</param>
        /// <returns>retorna un double con la multiplicación de los 2 numeros racionales</returns>
        public static double MultiplicacionRacional(double x, double y)
        {
            double multi = x * y;
            return multi;
        }

        /// <summary>
        /// Método que divide 2 números racionales, son de tipo double por que este incluye decimales
        /// </summary>
        /// <param name="x">primer numero racional,</param>
        /// <param name="y">segundo numero racional</param>
        /// <returns>retorna un double con la división de los 2 numeros racionales</returns>
        public static double DivisionRacional(double x, double y)
        {
            ///verifica si el segundo número ingresado es 0 ya que la división por 0 no existe
            ///si es así retornará la excepción DivideByZeroException
            if (y == 0)
            {
                throw new DivideByZeroException();
            }
            else
            {
                double div = x / y;
                return div;
            }
        }

    }
}

Clase CalculadoraReales

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace calculadora
{
    /// <summary>
    /// Clase que contiene métodos para operar números reales
    /// </summary>
    class CalculadoraReales
    {
        /// <summary>
        /// Método que suma 2 números reales, usa datos de tipo double debido a que los números reales incluyen decimales
        /// </summary>
        /// <param name="x">primer número real</param>
        /// <param name="y">segundo número real</param>
        /// <returns>retorna la suma de 2 números reales</returns>
        public static double SumaReal(double x, double y)
        {
            double suma = x + y;
            return suma;
        }

        /// <summary>
        /// Método que resta 2 números reales, usa datos de tipo double debido a que los números reales incluyen decimales
        /// </summary>
        /// <param name="x">primer número real</param>
        /// <param name="y">segundo número real</param>
        /// <returns>retorna la resta de 2 números reales</returns>
        public static double RestaReal(double x, double y)
        {
            double Resta = x - y;
            return Resta;
        }

        /// <summary>
        /// Método que multiplica 2 números reales, usa datos de tipo double debido a que los números reales incluyen decimales
        /// </summary>
        /// <param name="x">primer número real</param>
        /// <param name="y">segundo número real</param>
        /// <returns>retorna la multiplicación de 2 números reales</returns>
        public static double MultiplicacionReal(double x, double y)
        {
            double multi = x * y;
            return multi;
        }

        /// <summary>
        /// Método que divide 2 números reales, usa datos de tipo double debido a que los números reales incluyen decimales
        /// </summary>
        /// <param name="x">primer número real</param>
        /// <param name="y">segundo número real</param>
        /// <returns>retorna la división de 2 números reales</returns>
        public static double DivisionReal(double x, double y)
        {
            ///verifica si el segundo número ingresado es 0 ya que la división por 0 no existe
            ///si es así retornará la excepción DivideByZeroException
            if (y == 0)
            {
                throw new DivideByZeroException();
            }
            else
            {
                double div = x / y;
                return div;
            }
        }
    }
}

Clase Principal:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace calculadora
{
    /// <summary>
    /// Clase principal con los menús para operar los números
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {   ///variables para los operadores
            ///naturales y enteros
            int a, b;
            ///racionales, reales y complejos
            double c, d, x, y; 
            ///Menú para seleccionar el dominio de números
            Console.WriteLine("Seleccione el dominio de números para trabajar:\n1.Naturales\n2.Enteros\n3.Racionales\n4.Reales\n5.Complejos\n6.Salir\n");
            int menu = int.Parse(Console.ReadLine());
            switch (menu)
            {
                ///menu números naturales
                case 1:
                    Console.WriteLine("\nEscriba el primer valor: ");
                    a = int.Parse(Console.ReadLine());
                    Console.WriteLine("\nEscriba el segundo valor: ");
                    b = int.Parse(Console.ReadLine());
                    ///submenú para seleccionar operación
                    Console.WriteLine("\nSeleccione la operación:\n1.Suma\n2.Resta\n3.Multiplicación\n4.División\n5.Salir\n");
                    int menunatural = int.Parse(Console.ReadLine());
                    switch (menunatural)
                    {
                        case 1:
                            try
                            {
                                Console.WriteLine("\nSuma = " + CalculadoraNaturales.SumaNatural(a, b));
                            }
                            catch (SystemException e)
                            {
                                Console.WriteLine("\nEn los números naturales no entran los numeros negativos");
                            }
                            break;

                        case 2:
                            try
                            {
                                Console.WriteLine("\nResta = " + CalculadoraNaturales.RestaNatural(a, b));
                            }
                            catch (InvalidOperationException e)
                            {
                                Console.WriteLine("\nLa operacion da como resultado un número negativo lo que es inválido en los naturales");
                            }
                            catch (SystemException e)
                            {
                                Console.WriteLine("\nEn los números naturales no entran los numeros negativos");
                            }
                            break;

                        case 3:
                            try
                            {
                                Console.WriteLine("\nMultiplicación = " + CalculadoraNaturales.MultiplicacionNatural(a, b));
                            }
                            catch (SystemException e)
                            {
                                Console.WriteLine("\nEn los números naturales no entran los numeros negativos");
                            }
                            break;

                        case 4:
                            try
                            {
                                Console.WriteLine("\nDivisión = " + CalculadoraNaturales.DivisionNatural(a, b));
                            }
                            catch (DivideByZeroException e)
                            {
                                Console.WriteLine("\nNo existe la división por 0");
                            }
                            catch (SystemException e)
                            {
                                Console.WriteLine("\nEn los números naturales no entran los numeros negativos");
                            }
                            break;

                        case 5:
                            System.Environment.Exit(0);
                            break;

                        default:
                            Console.WriteLine("\nEscriba un numero de 1 a 5");
                            break;
                    }
                    break;

                ///menu números enteros
                     case 2:
                         Console.WriteLine("\nEscriba el primer valor: ");
                         a = int.Parse(Console.ReadLine());
                         Console.WriteLine("\nEscriba el segundo valor: ");
                         b = int.Parse(Console.ReadLine());
                        ///submenú para seleccionar la operación
                         Console.WriteLine("\nSeleccione la operación:\n1.Suma\n2.Resta\n3.Multiplicación\n4.División\n5.Salir\n");
                         int menuentero = int.Parse(Console.ReadLine());
                         switch (menuentero)
                         {
                             case 1:
                                 Console.WriteLine("\nSuma = " + CalculadoraEnteros.SumaEntero(a,b));
                                 break;

                             case 2:
                                 Console.WriteLine("\nResta = " + CalculadoraEnteros.RestaEntero(a, b));
                                 break;

                             case 3:
                                 Console.WriteLine("\nMultiplicación = " + CalculadoraEnteros.MultiplicacionEntero(a, b));
                                 break;

                             case 4:
                                 try
                                 {
                                     Console.WriteLine("\nDivisión = " + CalculadoraEnteros.DivisionEntero(a, b));
                                 }
                                 catch (DivideByZeroException e)
                                 {
                                     Console.WriteLine("\nNo existe la división por 0");
                                 }
                                 break;

                             case 5:
                                 System.Environment.Exit(0);
                                 break;

                             default:
                                 Console.WriteLine("\nEscriba un numero de 1 a 5");
                                 break;
                         }
                         break;

                     ///menu números racionales
                     case 3:
                         Console.WriteLine("\nEscriba el primer valor: ");
                         c = double.Parse(Console.ReadLine());
                         Console.WriteLine("\nEscriba el segundo valor: ");
                         d = double.Parse(Console.ReadLine());
                        ///Submenú para seleccionar la operación
                         Console.WriteLine("\nSeleccione la operación:\n1.Suma\n2.Resta\n3.Multiplicación\n4.División\n5.Salir\n");
                         int menuracional = int.Parse(Console.ReadLine());
                         switch (menuracional)
                         {
                             case 1:
                                 Console.WriteLine("\nSuma = " + CalculadoraRacionales.SumaRacional(c, d));
                                 break;

                             case 2:
                                 Console.WriteLine("\nResta = " + CalculadoraRacionales.RestaRacional(c, d));
                                 break;

                             case 3:
                                 Console.WriteLine("\nMultiplicación = " + CalculadoraRacionales.MultiplicacionRacional(c, d));
                                 break;

                             case 4:
                                 try
                                 {
                                     Console.WriteLine("\nDivisión = " + CalculadoraRacionales.DivisionRacional(c, d));
                                 }
                                 catch (DivideByZeroException e)
                                 {
                                     Console.WriteLine("\nNo existe la división por 0");
                                 }
                                 break;

                             case 5:
                                 System.Environment.Exit(0);
                                 break;

                             default:
                                 Console.WriteLine("\nEscriba un numero de 1 a 5");
                                 break;
                         }
                         break;

                    /// menú números reales
                     case 4:
                         Console.WriteLine("\nEscriba el primer valor: ");
                         c = double.Parse(Console.ReadLine());
                         Console.WriteLine("\nEscriba el segundo valor: ");
                         d = double.Parse(Console.ReadLine());
                        ///Submenú para seleccionar la operación
                         Console.WriteLine("\nSeleccione la operación:\n1.Suma\n2.Resta\n3.Multiplicación\n4.División\n5.Salir\n");
                         int menureal = int.Parse(Console.ReadLine());
                         switch (menureal)
                         {
                             case 1:
                                 Console.WriteLine("\nSuma = " + CalculadoraReales.SumaReal(c, d));
                                 break;

                             case 2:
                                 Console.WriteLine("\nResta = " + CalculadoraReales.RestaReal(c, d));
                                 break;

                             case 3:
                                 Console.WriteLine("\nMultiplicación = " + CalculadoraReales.MultiplicacionReal(c, d));
                                 break;

                             case 4:
                                 try
                                 {
                                     Console.WriteLine("\nDivisión = " + CalculadoraReales.DivisionReal(c, d));
                                 }
                                 catch (DivideByZeroException e)
                                 {
                                     Console.WriteLine("\nNo existe la división por 0");
                                 }
                                 break;

                             case 5:
                                 System.Environment.Exit(0);
                                 break;

                             default:
                                 Console.WriteLine("\nEscriba un numero de 1 a 5");
                                 break;
                         }
                         break;

                    /// menu numeros complejos
                     case 5:
                         Console.WriteLine("\nEscriba valor real del primer complejo ");
                         c = double.Parse(Console.ReadLine());
                         Console.WriteLine("\nEscriba el valor imaginario del primer complejo ");
                         d = double.Parse(Console.ReadLine());
                         if (d < 0)
                         {
                             Console.WriteLine("\nprimer complejo: " + c + d + "i\n");
                         }
                         else 
                         {
                             Console.WriteLine("\nprimer complejo: " + c + "+" + d + "i\n");
                         }
                         Console.WriteLine("\nEscriba valor real del segundo complejo ");
                         x = double.Parse(Console.ReadLine());
                         Console.WriteLine("\nEscriba el valor imaginario del segundo complejo ");
                         y = double.Parse(Console.ReadLine());
                         if (y < 0)
                         {
                             Console.WriteLine("\nsegundo complejo: " + x + y + "i\n");
                         }
                         else
                         {
                             Console.WriteLine("\nsegundo complejo: " + x + "+" + y + "i\n");
                         }
                        ///Submenú para seleccionar la operación
                         Console.WriteLine("\nSeleccione la operación:\n1.Suma\n2.Resta\n3.Multiplicación\n4.División\n5.Salir\n");
                         int menucomplejo = int.Parse(Console.ReadLine());
                         switch (menucomplejo)
                         {
                             case 1:
                                 Console.WriteLine("\nSuma = " + CalculadoraComplejos.SumaComplejo(c, d, x, y) + "i");
                                 break;

                             case 2:
                                 Console.WriteLine("\nResta = " + CalculadoraComplejos.RestaComplejo(c, d, x, y) + "i");
                                 break;

                             case 3:
                                 Console.WriteLine("\nMultiplicación = " + CalculadoraComplejos.MultiplicacionComplejo(c, d, x, y) + "i");
                                 break;

                             case 4:
                                 try
                                 {
                                     Console.WriteLine("\nDivisión = " + CalculadoraComplejos.DivisionComplejo(c, d, x, y) + "i");
                                 }
                                 catch (DivideByZeroException e)
                                 {
                                     Console.WriteLine("\nNo existe la división por 0");
                                 }
                                 break;

                             case 5:
                                 System.Environment.Exit(0);
                                 break;

                             default:
                                 Console.WriteLine("\nEscriba un numero de 1 a 5");
                                 break;
                         }
                         break;

                     case 6:
                         System.Environment.Exit(0);
                         break;

                     default:
                         Console.WriteLine("\nEscriba un numero de 1 a 6");
                         break;
            }
            Console.ReadLine();
        }
    }
}

Proyecto:
Calculadora Primer Avance