viernes, 16 de septiembre de 2011

Calculadora en C#


Últimamente he estado algo flojo en cuanto a programación, hace mucho que no lo hago y empezare a recuperar el tiempo perdido, comenzare con C# en Visual Studio 2010 del que no se mucho y con algo sencillo como una calculadora simple, después podre ir mejorando mis proyectos.
Mostrare el código utilizado y también dejare el proyecto completo terminado al final del post.

Para comenzar, con este esquema donde se muestran los elementos de la ventana que utilice como los botones y en este caso utilice 2 pantallas o TextBox.

Lo primero es añadir los elementos y organizarlos como queramos que se vea nuestra calculadora y darle nombre a nuestros elementos para no confundirlos en este caso nombre a los botones bt1 al botón con el numero 1, bt2, bt3, btsum, etc., a la pantalla principal la nombre Pantalla y a la otra donde se muestran las operaciones que se van haciendo la nombre Previo.

Ahora una breve explicación de lo que queremos que haga nuestra calculadora tomando como referencia la calculadora de windows.

Cuando abrimos la calculadora lo primero que vemos es que en la pantalla de inicio nos muestra el numero cero.

Botones numéricos. al iniciar la calculadora y apretar el numero cero, no pasa nada hasta que presionamos otro numero se borra el cero de inicio y entonces podemos poner el numero que queramos.

Botón del punto decimal, solo queremos que el punto se imprima en pantalla una sola vez como debe de ser.

Botones de operación. si lo primero que hacemos al iniciar la calculadora es presionar uno de estos números entonces se tomara al cero de inicio como primer valor para la operación.
También tenemos dos estados, por decirlo de alguna manera, de estos botones, primero cuando se utilizan pro primera vez, es decir, la primera vez que presionemos cualquiera de estos botones, y segundo, cuando ya hemos hecho una operación nos muestre el resultado automáticamente. 

Botón de igualdad. también puse dos estados, el primero que realiza la operación correspondiente y el segundo que muestra el resultado según el segundo numero introducido de forma automática al seguir presionando este botón. Eje. 2 + 1 = 3, si seguimos presionando el botón de igual nos mostrara el valor del resultado + 1 que es el segundo valor que introdujimos.

Botones de borrado que conocemos bien, el botón C nos borra absolutamente todo, pantalla y variables, todo lo regresa al estado de inicio, y el botón CE que solamente nos limpia la pantalla actual y la devuelve a cero.

Tambien se utilizan funciones en el menuStrip, es este proyecto solo tres menus:

Archivo --> Cerrar. Lo que hacer es cerrar la aplicación.

Editar. Aquí tenemos las funciones de Copiar y Pegar lo que esta en pantalla.

Ayuda --> Acerca de... Una breve explicación del proyecto, versión y demás información que queramos poner, yo lo puse en un nuevo form al que llamo desde este menú.

Dicho lo anterior vamos a lo que nos interesa comenzare por las variables.

bool ceroinicial = true;    //para controlar el cero que tiene la calculadora al iniciar
bool pdecimal = true;       //para controlar el punto decimal
bool op = true;             //para controlar el resultado cuando se presiona cada signo aritmetico
bool igual = true;          //para controlar el estado del boton de igualdad
string operacion;           //variable usada en el case de la igualdad
double numero1 = 0;         //variable para el primer valor
double numero2 = 0;         //variabla para el segundo valor
double temp = 0;            //variable para el resultado
Ahora vamos con los botones numéricos.

if (ceroinicial)
            {
                txtPantalla.Text = " ";
                txtPantalla.Text = "1";
                ceroinicial = false;
            }
            else
            {
                txtPantalla.Text = txtPantalla.Text + "1";
            }

Ese código va para los números del 1 al 9, ya que el cero se comporta diferente y el código va como sigue.

if (txtPantalla.Text == "0")
                {
                    
                }
                else
                {
                    if (ceroinicial)
                    {
                        txtPantalla.Text = " ";
                        txtPantalla.Text = "0";
                        ceroinicial = false;
                    }
                    else
                    {
                        txtPantalla.Text = txtPantalla.Text + "0";
                    }

                }
El punto decimal.
 if (ceroinicial) //cuando el punto es el primer boton que presionas
            {
                txtPantalla.Text = " ";
                txtPantalla.Text = "0";
                ceroinicial = false;
            }

            if (pdecimal)  // cuando no hay punto en pantalla imprime el punto, de lo contrario no hace nada
                {
                    txtPantalla.Text = txtPantalla.Text + ".";
                    pdecimal = false;
                }


Seguimos con las operaciones básicas.
Suma.
ceroinicial = true;
            pdecimal = true;

            if (op)   //Guarda primer valor en variable al presionar el boton suma por primera vez
            {
                numero1 = double.Parse(txtPantalla.Text);
                txtPrevio.Text = txtPrevio.Text + txtPantalla.Text + " + ";
                op = false;
            }
            else    //Muestra el resultado al presionar el boton suma por segunda ocacion
            {
                numero2 = double.Parse(txtPantalla.Text);
                txtPrevio.Text = txtPrevio.Text + txtPantalla.Text + " + ";
  
                switch (operacion)  
                {
                    case "+":
                       
                        temp = numero1 + numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);
                        break;

                    case "-":
                       
                        temp = numero1 - numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);
                        
                        break;

                    case "*":
                       
                        temp = numero1 * numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);
                        
                        break;

                    case "/":
                        if (numero2 == 0)
                        {
                            
                            txtPantalla.Text = "Error";
                            break;
                        }
                        else
                        {
                          
                            temp = numero1 / numero2;
                            txtPantalla.Text = temp.ToString();
                            numero1 = double.Parse(txtPantalla.Text);
                            break;
                        }

                }

            }
            operacion = "+";

Resta
ceroinicial = true;
            pdecimal = true;

            if (op)    //Guarda primer valor en variable al presionar el boton resta por primera vez
            {
                numero1 = double.Parse(txtPantalla.Text);
                txtPrevio.Text = txtPrevio.Text + txtPantalla.Text + " - ";
                op = false;
            }
            else    //Muestra el resultado al presionar el boton resta por segunda ocacion
            {
                numero2 = double.Parse(txtPantalla.Text);
                txtPrevio.Text = txtPrevio.Text + txtPantalla.Text + " - ";


                switch (operacion)
                {
                    case "+":

                        temp = numero1 + numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);
                        break;

                    case "-":

                        temp = numero1 - numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);

                        break;

                    case "*":

                        temp = numero1 * numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);

                        break;

                    case "/":
                        if (numero2 == 0)
                        {

                            txtPantalla.Text = "Error";
                            break;
                        }
                        else
                        {

                            temp = numero1 / numero2;
                            txtPantalla.Text = temp.ToString();
                            numero1 = double.Parse(txtPantalla.Text);
                            break;
                        }

                }

            }
            operacion = "-";



Multiplicación
ceroinicial = true;
            pdecimal = true;

            if (op)   //Guarda primer valor en variable al presionar el boton multiplicar por primera vez
            {
                numero1 = double.Parse(txtPantalla.Text);
                txtPrevio.Text = txtPrevio.Text + txtPantalla.Text + " * ";
                op = false;
            }
            else   //Muestra el resultado al presionar el boton multiplicar por segunda ocacion
            {
                numero2 = double.Parse(txtPantalla.Text);
                txtPrevio.Text = txtPrevio.Text + txtPantalla.Text + " * ";


                switch (operacion)
                {
                    case "+":

                        temp = numero1 + numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);
                        break;

                    case "-":

                        temp = numero1 - numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);

                        break;

                    case "*":

                        temp = numero1 * numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);

                        break;

                    case "/":
                        if (numero2 == 0)
                        {

                            txtPantalla.Text = "Error";
                            break;
                        }
                        else
                        {

                            temp = numero1 / numero2;
                            txtPantalla.Text = temp.ToString();
                            numero1 = double.Parse(txtPantalla.Text);
                            break;
                        }

                }

            }
            operacion = "*";



División. Sabemos que no se puede dividir entre cero.
ceroinicial = true;
            pdecimal = true;

            if (op)   //Guarda primer valor en variable al presionar el boton division por primera vez
            { 
                numero1 = double.Parse(txtPantalla.Text);
                txtPrevio.Text = txtPrevio.Text + txtPantalla.Text + " / ";
                op = false;
            }
            else  //Muestra el resultado al presionar el boton division por segunda ocacion
            {
                numero2 = double.Parse(txtPantalla.Text);
                txtPrevio.Text = txtPrevio.Text + txtPantalla.Text + " / ";


                switch (operacion)
                {
                    case "+":

                        temp = numero1 + numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);
                        break;

                    case "-":

                        temp = numero1 - numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);

                        break;

                    case "*":

                        temp = numero1 * numero2;
                        txtPantalla.Text = temp.ToString();
                        numero1 = double.Parse(txtPantalla.Text);

                        break;

                    case "/":
                        if (numero2 == 0)
                        {

                            txtPantalla.Text = "Error";
                            break;
                        }
                        else
                        {

                            temp = numero1 / numero2;
                            txtPantalla.Text = temp.ToString();
                            numero1 = double.Parse(txtPantalla.Text);
                            break;
                        }

                }
            }
            operacion = "/";



Botón de igualdad
//devuelve las variables a su estado inicial
           ceroinicial = true;
           pdecimal = true;
           op = true;

           if (igual)   //  realiza la operacion correspondiente si es la primeravez que se presiona el boton
           {
               numero2 = double.Parse(txtPantalla.Text);
               switch (operacion)
               {
                   case "+":
                       txtPrevio.Text = txtPrevio.Text + txtPantalla.Text;
                       temp = numero1 + numero2;
                       txtPantalla.Text = temp.ToString();
                       break;

                   case "-":
                       txtPrevio.Text = txtPrevio.Text + txtPantalla.Text;
                       temp = numero1 - numero2;
                       txtPantalla.Text = temp.ToString();
                       break;

                   case "*":
                       txtPrevio.Text = txtPrevio.Text + txtPantalla.Text;
                       temp = numero1 * numero2;
                       txtPantalla.Text = temp.ToString();
                       break;

                   case "/":
                       if (numero2 == 0)
                       {
                           txtPrevio.Text = txtPrevio.Text + txtPantalla.Text;
                           txtPantalla.Text = "Error";
                           break;
                       }
                       else
                       {
                           txtPrevio.Text = txtPrevio.Text + txtPantalla.Text;
                           temp = numero1 / numero2;
                           txtPantalla.Text = temp.ToString();
                           break;
                       }

               }
               igual = false;
           }

           else  //Realiza la operacion correspondiente al seguir presionando el boton
           {
               switch (operacion)
               {
                   case "+":
                       temp = temp + numero2;
                       txtPantalla.Text = temp.ToString();
                       break;

                   case "-":
                       temp = temp - numero2;
                       txtPantalla.Text = temp.ToString();
                       break;

                   case "*":
                       temp = temp * numero2;
                       txtPantalla.Text = temp.ToString();
                       break;

                   case "/":
                       if (numero2 == 0)
                       {
                           txtPrevio.Text = txtPrevio.Text + txtPantalla.Text;
                           txtPantalla.Text = "Error";
                           break;
                       }
                       else
                       {
                           temp = temp / numero2;
                           txtPantalla.Text = temp.ToString();
                           break;
                       }

               }
               
           }

           txtPrevio.Text = " "; //limpia la pantalla Previo



Boton C
 ceroinicial = true;
            pdecimal = true;
            operacion = null;
            op = true;
            igual = true;
            numero1 = 0;
            numero2 = 0;
            
            temp = 0;
            txtPrevio.Text = " ";
            txtPantalla.Text = "0";



Boton CE
 ceroinicial = true;
            pdecimal = true;
            txtPantalla.Text = "0";


Para cerrar la aplicación desde el menú salir.
 Application.Exit();


Para copiar al portapapeles.
 Clipboard.SetDataObject(txtPantalla.Text);


Para pegar del portapapeles.
txtPantalla.Text = " "; //Limpiar pantalla primero
            txtPantalla.Paste();    //Pegar del portapapeles


Para llamar a otro form, acerca de...
Form2 frm = new Form2();  

            frm.Show();                 //llamar a otro form






Para cerrar el nuevo formulario sin cerrar la aplicación.
this.Close(); //cerrar form2


Con este código agregamos un link a una web con LinkLabel.
System.Diagnostics.Process.Start("http://jaguarnegro18.blogspot.com/");  //Linklabel


 Quizás mucho código, falta la creación de una estructura para no tener el mismo código por ejemplo en cada signo de operación y solo llamarlo una sola vez, pero eso lo haré mas adelante, junto con las funciones de una calculadora científica, por el momento esta creo que funcional con las 4 operaciones básicas.



Dejo el proyecto para descargar, tal como lo tengo yo.


6 comentarios:

Me podrías mandar el proyecto a mi correo, ya que no lo puedo bajar, me sería de mucha utilidad.

De antemano, muchas gracias.
Te dejo mi correo: lanakma@gmail.com

Disculpa amigo no se puede bajar... Podrias enviarlo a mi correo?... Te lo agradecere muchisimo....

Que tal acuafrank revise el enlace y funciona bien solo dale click donde dice slow download y si sigue sin funcionarte me aviasas para enviartelo, porque por ahora no tengo mucho tiempo

Muy bueno amigo muy bien explicado y aparte de diferente manera. gracias

Buen proyecto, solo que si me podrías mandar el proyecto a mi mail porfa, por que no puedo bajarlo.. Saludos y gracias

carita1206@hotmail.com

buen proyecto man... porfavor me podias enviarlo a mi correo es que no se puede descargar porfa... este es mi correo jolteon_10@hotmail.com

Publicar un comentario en la entrada

Comparte

Twitter Delicious Facebook Digg Stumbleupon Favorites More