Autor Tema: Ejercicio Calculadora  (Leído 2412 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Pac-man

  • elPacMan.com.ar
  • Moderador Global
  • *****
  • Mensajes: 1.731
  • Programador Don
    • elPacMan
Ejercicio Calculadora
« en: Septiembre 07, 2007, 04:56:39 am »
Código: [Seleccionar]
' 5.09.2007 by pac-man

' Calculadora basica

' Sin validaciones _
' Manejadores _
' Metodo Mid _
' Pasaje por valor y ref, en este caso no lo utilize.

' Nota: El siguiente codigo corre sin necesidad de incrustar los controles _
' ya que los mismo estan implementados en el codigo, para poder usarlo, creen _
' un proyecto nuevo, pulsen sobre el fomulario, borren el codigo que le _
' genera, luego peguen el siguiente codigo y por ultimo a correrlo.

' www.vebenet.blogspot.com , allí puse los demas ejercicios.Cualquier cosa _
' pregunten.

Public Class Form1

    Dim i, LugarSigno As Integer
    Dim aux As String

    Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
    Friend WithEvents Button01 As System.Windows.Forms.Button
    Friend WithEvents Button02 As System.Windows.Forms.Button
    Friend WithEvents Button03 As System.Windows.Forms.Button
    Friend WithEvents Button04 As System.Windows.Forms.Button
    Friend WithEvents Button05 As System.Windows.Forms.Button
    Friend WithEvents Button06 As System.Windows.Forms.Button
    Friend WithEvents Button07 As System.Windows.Forms.Button
    Friend WithEvents Button08 As System.Windows.Forms.Button
    Friend WithEvents Button09 As System.Windows.Forms.Button
    Friend WithEvents Button10 As System.Windows.Forms.Button
    Friend WithEvents Button11 As System.Windows.Forms.Button
    Friend WithEvents Button12 As System.Windows.Forms.Button
    Friend WithEvents Button13 As System.Windows.Forms.Button
    Friend WithEvents Button14 As System.Windows.Forms.Button
    Friend WithEvents Button15 As System.Windows.Forms.Button
    Friend WithEvents Button16 As System.Windows.Forms.Button

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.TextBox1 = New System.Windows.Forms.TextBox
        Me.Button01 = New System.Windows.Forms.Button
        Me.Button02 = New System.Windows.Forms.Button
        Me.Button03 = New System.Windows.Forms.Button
        Me.Button04 = New System.Windows.Forms.Button
        Me.Button05 = New System.Windows.Forms.Button
        Me.Button06 = New System.Windows.Forms.Button
        Me.Button07 = New System.Windows.Forms.Button
        Me.Button08 = New System.Windows.Forms.Button
        Me.Button09 = New System.Windows.Forms.Button
        Me.Button10 = New System.Windows.Forms.Button
        Me.Button11 = New System.Windows.Forms.Button
        Me.Button12 = New System.Windows.Forms.Button
        Me.Button13 = New System.Windows.Forms.Button
        Me.Button14 = New System.Windows.Forms.Button
        Me.Button15 = New System.Windows.Forms.Button
        Me.Button16 = New System.Windows.Forms.Button
        Me.SuspendLayout()
        '
        'TextBox1
        '
        Me.TextBox1.Font = New System.Drawing.Font("Microsoft Sans Serif", 72.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.TextBox1.Location = New System.Drawing.Point(0, 1)
        Me.TextBox1.Name = "TextBox1"
        Me.TextBox1.Size = New System.Drawing.Size(399, 116)
        Me.TextBox1.TabIndex = 0
        '
        'Button01
        '
        Me.Button01.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Button01.Location = New System.Drawing.Point(0, 157)
        Me.Button01.Name = "Button01"
        Me.Button01.Size = New System.Drawing.Size(75, 53)
        Me.Button01.TabIndex = 1
        Me.Button01.Text = "1"
        Me.Button01.UseVisualStyleBackColor = True
        '
        'Button02
        '
        Me.Button02.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Button02.Location = New System.Drawing.Point(81, 157)
        Me.Button02.Name = "Button02"
        Me.Button02.Size = New System.Drawing.Size(75, 53)
        Me.Button02.TabIndex = 2
        Me.Button02.Text = "2"
        Me.Button02.UseVisualStyleBackColor = True
        '
        'Button03
        '
        Me.Button03.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Button03.Location = New System.Drawing.Point(162, 157)
        Me.Button03.Name = "Button03"
        Me.Button03.Size = New System.Drawing.Size(75, 53)
        Me.Button03.TabIndex = 3
        Me.Button03.Text = "3"
        Me.Button03.UseVisualStyleBackColor = True
        '
        'Button04
        '
        Me.Button04.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button04.Location = New System.Drawing.Point(243, 157)
        Me.Button04.Name = "Button04"
        Me.Button04.Size = New System.Drawing.Size(75, 53)
        Me.Button04.TabIndex = 4
        Me.Button04.Text = "4"
        Me.Button04.UseVisualStyleBackColor = True
        '
        'Button05
        '
        Me.Button05.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button05.Location = New System.Drawing.Point(324, 157)
        Me.Button05.Name = "Button05"
        Me.Button05.Size = New System.Drawing.Size(75, 53)
        Me.Button05.TabIndex = 5
        Me.Button05.Text = "5"
        Me.Button05.UseVisualStyleBackColor = True
        '
        'Button06
        '
        Me.Button06.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button06.Location = New System.Drawing.Point(0, 216)
        Me.Button06.Name = "Button06"
        Me.Button06.Size = New System.Drawing.Size(75, 53)
        Me.Button06.TabIndex = 6
        Me.Button06.Text = "6"
        Me.Button06.UseVisualStyleBackColor = True
        '
        'Button07
        '
        Me.Button07.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button07.Location = New System.Drawing.Point(81, 216)
        Me.Button07.Name = "Button07"
        Me.Button07.Size = New System.Drawing.Size(75, 53)
        Me.Button07.TabIndex = 7
        Me.Button07.Text = "7"
        Me.Button07.UseVisualStyleBackColor = True
        '
        'Button08
        '
        Me.Button08.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button08.Location = New System.Drawing.Point(162, 216)
        Me.Button08.Name = "Button08"
        Me.Button08.Size = New System.Drawing.Size(75, 53)
        Me.Button08.TabIndex = 8
        Me.Button08.Text = "8"
        Me.Button08.UseVisualStyleBackColor = True
        '
        'Button09
        '
        Me.Button09.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button09.Location = New System.Drawing.Point(243, 216)
        Me.Button09.Name = "Button09"
        Me.Button09.Size = New System.Drawing.Size(75, 53)
        Me.Button09.TabIndex = 9
        Me.Button09.Text = "9"
        Me.Button09.UseVisualStyleBackColor = True
        '
        'Button10
        '
        Me.Button10.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button10.Location = New System.Drawing.Point(324, 216)
        Me.Button10.Name = "Button10"
        Me.Button10.Size = New System.Drawing.Size(75, 53)
        Me.Button10.TabIndex = 10
        Me.Button10.Text = "0"
        Me.Button10.UseVisualStyleBackColor = True
        '
        'Button11
        '
        Me.Button11.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button11.Location = New System.Drawing.Point(324, 277)
        Me.Button11.Name = "Button11"
        Me.Button11.Size = New System.Drawing.Size(76, 51)
        Me.Button11.TabIndex = 11
        Me.Button11.Text = "="
        Me.Button11.UseVisualStyleBackColor = True
        '
        'Button12
        '
        Me.Button12.Font = New System.Drawing.Font("Microsoft Sans Serif", 10.75!)
        Me.Button12.Location = New System.Drawing.Point(0, 123)
        Me.Button12.Name = "Button12"
        Me.Button12.Size = New System.Drawing.Size(399, 28)
        Me.Button12.TabIndex = 12
        Me.Button12.Text = "&Limpar"
        Me.Button12.UseVisualStyleBackColor = True
        '
        'Button13
        '
        Me.Button13.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button13.Location = New System.Drawing.Point(0, 275)
        Me.Button13.Name = "Button13"
        Me.Button13.Size = New System.Drawing.Size(75, 53)
        Me.Button13.TabIndex = 13
        Me.Button13.Text = "+"
        Me.Button13.UseVisualStyleBackColor = True
        '
        'Button14
        '
        Me.Button14.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button14.Location = New System.Drawing.Point(81, 275)
        Me.Button14.Name = "Button14"
        Me.Button14.Size = New System.Drawing.Size(75, 53)
        Me.Button14.TabIndex = 14
        Me.Button14.Text = "-"
        Me.Button14.UseVisualStyleBackColor = True
        '
        'Button15
        '
        Me.Button15.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button15.Location = New System.Drawing.Point(162, 277)
        Me.Button15.Name = "Button15"
        Me.Button15.Size = New System.Drawing.Size(75, 51)
        Me.Button15.TabIndex = 15
        Me.Button15.Text = "*"
        Me.Button15.UseVisualStyleBackColor = True
        '
        'Button16
        '
        Me.Button16.Font = New System.Drawing.Font("Microsoft Sans Serif", 27.75!)
        Me.Button16.Location = New System.Drawing.Point(243, 277)
        Me.Button16.Name = "Button16"
        Me.Button16.Size = New System.Drawing.Size(75, 51)
        Me.Button16.TabIndex = 16
        Me.Button16.Text = "/"
        Me.Button16.UseVisualStyleBackColor = True
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(490, 329)
        Me.Controls.Add(Me.Button16)
        Me.Controls.Add(Me.Button15)
        Me.Controls.Add(Me.Button14)
        Me.Controls.Add(Me.Button13)
        Me.Controls.Add(Me.Button12)
        Me.Controls.Add(Me.Button11)
        Me.Controls.Add(Me.Button10)
        Me.Controls.Add(Me.Button09)
        Me.Controls.Add(Me.Button08)
        Me.Controls.Add(Me.Button07)
        Me.Controls.Add(Me.Button06)
        Me.Controls.Add(Me.Button05)
        Me.Controls.Add(Me.Button04)
        Me.Controls.Add(Me.Button03)
        Me.Controls.Add(Me.Button02)
        Me.Controls.Add(Me.Button01)
        Me.Controls.Add(Me.TextBox1)
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
        Me.MaximizeBox = False
        Me.Name = "Form1"
        Me.ShowIcon = False
        Me.Text = " Calculadora"
        Me.ResumeLayout(False)
        Me.PerformLayout()

        ' Manejadores
        AddHandler Button01.Click, AddressOf Metodo
        AddHandler Button02.Click, AddressOf Metodo
        AddHandler Button03.Click, AddressOf Metodo
        AddHandler Button04.Click, AddressOf Metodo
        AddHandler Button05.Click, AddressOf Metodo
        AddHandler Button06.Click, AddressOf Metodo
        AddHandler Button07.Click, AddressOf Metodo
        AddHandler Button08.Click, AddressOf Metodo
        AddHandler Button09.Click, AddressOf Metodo
        AddHandler Button10.Click, AddressOf Metodo
        AddHandler Button11.Click, AddressOf Calcul
        AddHandler Button12.Click, AddressOf Limpia
        AddHandler Button13.Click, AddressOf Metodo
        AddHandler Button14.Click, AddressOf Metodo
        AddHandler Button15.Click, AddressOf Metodo
        AddHandler Button16.Click, AddressOf Metodo

    End Sub

    Private Sub Metodo(ByVal sender As System.Object, ByVal e As System.EventArgs)

        TextBox1.Text = TextBox1.Text & CType(sender, Button).Text
        i = i + 1
        If IsNumeric(Mid(TextBox1.Text, i, 1)) = False Then LugarSigno = i

    End Sub

    Private Sub Calcul(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click

        Select Case (Mid(TextBox1.Text, LugarSigno, 1))
            Case "+"
                TextBox1.Text = (CType((Mid(TextBox1.Text, 1, LugarSigno - 1)), Integer)) + (CType((Mid(TextBox1.Text, LugarSigno + 1, i - LugarSigno)), Integer))
            Case "-"
                TextBox1.Text = (CType((Mid(TextBox1.Text, 1, LugarSigno - 1)), Integer)) - (CType((Mid(TextBox1.Text, LugarSigno + 1, i - LugarSigno)), Integer))
            Case "*"
                TextBox1.Text = (CType((Mid(TextBox1.Text, 1, LugarSigno - 1)), Integer)) * (CType((Mid(TextBox1.Text, LugarSigno + 1, i - LugarSigno)), Integer))
            Case "/"
                TextBox1.Text = (CType((Mid(TextBox1.Text, 1, LugarSigno - 1)), Integer)) / (CType((Mid(TextBox1.Text, LugarSigno + 1, i - LugarSigno)), Integer))
            Case Else
                Button12.Text = "Borrar resultado"
        End Select

    End Sub

    Public Sub Limpia(ByVal sender As System.Object, ByVal e As System.EventArgs)
        i = 0
        TextBox1.Clear()
        Button12.Text = "Limpiar"
    End Sub

End Class
« última modificación: Septiembre 07, 2007, 04:59:09 am por Pac-man »
<pac-man>
   <frase autor='Albert Einstein'>
      "Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
   </frase>
</pac-man>

Desconectado Severino

  • Moderador Global
  • *****
  • Mensajes: 3.156
Re: Ejercicio Calculadora
« Respuesta #1 en: Septiembre 07, 2007, 09:26:29 am »
Código: (vbnet) [Seleccionar]
If IsNumeric(Mid(TextBox1.Text, i, 1)) = False Then LugarSigno = i
Muy buyena no se me habia ocurrido hacerlo ahi :D

Desconectado Pac-man

  • elPacMan.com.ar
  • Moderador Global
  • *****
  • Mensajes: 1.731
  • Programador Don
    • elPacMan
Re: Ejercicio Calculadora
« Respuesta #2 en: Septiembre 07, 2007, 09:41:06 am »
Si al final en dos o tres lineas se pudo hacer, no me funcionaba al principio por que hacia la cuenta y la primera vez lo hacia bien pero la segunda cuenta no, despues me avive que la variable i me habia olvidado de asignar a 0 en el metodo limpiar.Estube un tiempito para sacar el error dolobu ese.En este ejercicio no emplee lo que es pasar por valor o ref, despues voy a trata de implementarlo, por si alguno quiere implementarlo en este ejercicio que puse taria bueno que lo haga para ver como funciona.
<pac-man>
   <frase autor='Albert Einstein'>
      "Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
   </frase>
</pac-man>

Desconectado Severino

  • Moderador Global
  • *****
  • Mensajes: 3.156
Re: Ejercicio Calculadora
« Respuesta #3 en: Septiembre 07, 2007, 09:50:48 am »
Dale, yo en un rato poesteo mi versión, voy a ver si le imp0lemento esa forma de sacar la posición del signo, que lo hacia en una función a parte yo.

Desconectado Pac-man

  • elPacMan.com.ar
  • Moderador Global
  • *****
  • Mensajes: 1.731
  • Programador Don
    • elPacMan
Re: Ejercicio Calculadora
« Respuesta #4 en: Septiembre 07, 2007, 12:42:52 pm »
Dale! subilo si podes o si tenes tiempo.

Che y ale mucho blabla en clases, pero por aca no tiro una linea en cuanto al ejercicio.La competencia del menos codigo, tipo que quedo fuera, no ?  :P, tendria que postear el suyo tambien.

TextBox1.Text = TextBox1.Text & CType(sender, Button).Text
i = i + 1
If IsNumeric(Mid(TextBox1.Text, i, 1)) = False Then LugarSigno = i

Nota: La tercer linea es una forma de usar el if en una sola linea y tambien se puede implementar los dos puntos para que lo tome como el sino

Ejemplo:

If IsNumeric(Mid(TextBox1.Text, i, 1)) = False Then LugarSigno = i : TextBox2.Text = i
« última modificación: Septiembre 07, 2007, 12:49:12 pm por Pac-man »
<pac-man>
   <frase autor='Albert Einstein'>
      "Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
   </frase>
</pac-man>

Desconectado Severino

  • Moderador Global
  • *****
  • Mensajes: 3.156
Re: Ejercicio Calculadora
« Respuesta #5 en: Septiembre 07, 2007, 12:54:27 pm »
Si pasa que es un señor del alto ejecutivo y esta muy ocupado :P.

Una variante mejor al if con el : es el iif:
Código: (vbnet) [Seleccionar]
iif(nuevoregistro=true,insertar(),Actualizar())
el iif pide 3 parametros, el primero es la condicion, el segundo es lo que se hace en caso q sea cierta la condicion y la tercera lo que se hace si la condicion no es cierta.
Yo la use en vb6 mucho  :revere :bf_new

Desconectado Pac-man

  • elPacMan.com.ar
  • Moderador Global
  • *****
  • Mensajes: 1.731
  • Programador Don
    • elPacMan
Re: Ejercicio Calculadora
« Respuesta #6 en: Septiembre 07, 2007, 12:58:53 pm »
Buenisima, gracias por el dato.
<pac-man>
   <frase autor='Albert Einstein'>
      "Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
   </frase>
</pac-man>

Desconectado vpassador

  • Administrador
  • *****
  • Mensajes: 294
Re: Ejercicio Calculadora
« Respuesta #7 en: Septiembre 07, 2007, 01:19:24 pm »
Buenas, les tiro un par de preguntas con respecto al ejercicio, para pensar ...

¿Qué sucede si ponen el Option Strict en ON?
¿Qué sucede si dividen por cero?

Saludos !

Victor H. Passador

Desconectado Severino

  • Moderador Global
  • *****
  • Mensajes: 3.156
Re: Ejercicio Calculadora
« Respuesta #8 en: Septiembre 07, 2007, 02:03:17 pm »
Buenas, les tiro un par de preguntas con respecto al ejercicio, para pensar ...

¿Qué sucede si ponen el Option Strict en ON?
¿Qué sucede si dividen por cero?

Saludos !

Victor H. Passador
lo de dividir por 0 yo lo tuve en cuenta :) .
Lo de option strict lo voy a investigar.
Depsues posteo el ejercicio.
Saludos Victor y gracias.!

Desconectado Pac-man

  • elPacMan.com.ar
  • Moderador Global
  • *****
  • Mensajes: 1.731
  • Programador Don
    • elPacMan
Re: Ejercicio Calculadora
« Respuesta #9 en: Septiembre 07, 2007, 02:59:58 pm »
En cuanto a las validación el prof dijo que no validemos nada, yo lo hice al pie de la letra. Ja

Tipificación obligatoria
---------------------
Cuando declaramos una variable, no es obligatorio por defecto, establecer un tipo de dato para la
misma. Igualmente, al asignar por ejemplo, una variable numérica a una de cadena, se realizan
automáticamente las oportunas conversiones de tipos, para transformar el número en una cadena de caracteres. Veamos un ejemplo en el Código fuente 60. sigue ...

Ver pagina 200 Muy bueno es este archivo se los recomiendo.

Victor recomendas el uso de Option Strict Off para luego declarar variables sin la necesidad de especificar su tipo?, segun el texto es recomendable.

Un ejemplito que hice en modo consola... ta muy bueno usar eso ...

Código: [Seleccionar]

Option Strict Off
Module Module1

    Sub Main()

        Dim numero
        Dim cadena

        numero = 8
        cadena = numero

        numero = cadena + cadena

        System.Console.WriteLine("{0}", numero)

        System.Console.Read()
    End Sub

End Module

Salida:

16

Si en el ejemplo anterior no hubieramos puesto Option Strict Off, en vez de hacer la suma, lo hubiera concatenado y su salida seria: 88
« última modificación: Septiembre 07, 2007, 03:15:10 pm por Pac-man »
<pac-man>
   <frase autor='Albert Einstein'>
      "Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
   </frase>
</pac-man>

Desconectado javis86

  • CODMW2 Plyr
  • Moderador Global
  • *****
  • Mensajes: 709
  • Disco Disco Good Good!!!
Re: Ejercicio Calculadora
« Respuesta #10 en: Septiembre 07, 2007, 03:21:33 pm »
Buenas, les tiro un par de preguntas con respecto al ejercicio, para pensar ...

¿Qué sucede si ponen el Option Strict en ON?
¿Qué sucede si dividen por cero?

Saludos !

Victor H. Passador

Con la division por cero, con variables doubles no podes capturar el error, tira infinito
¿?

Desconectado Severino

  • Moderador Global
  • *****
  • Mensajes: 3.156
Re: Ejercicio Calculadora
« Respuesta #11 en: Septiembre 07, 2007, 03:31:58 pm »
Con la division por cero, con variables doubles no podes capturar el error, tira infinito
¿?
tampoco es una ciencia entonces...
Código: (vbnet) [Seleccionar]
case is ="/"
  if num2=0 then
     messagbox.show("No se puede dividir por 0")
  end if   
Yo lo de option strict lo tendria siempre en on....para mi usar variables tipo object aca (que vendrian a ser un variant de antes, no victor?) es hacer las cosas desprolijas. Despues otro tiene que corregir tu codigo y se vuelve loco buscando de que tipo es la variable. Imaginate en un proceso de 500 lines todas variables asi,...........
Si realizaste un buen analisis del problema no deberias necesitar declarar las variables sin tipo...creo yo!!!
 ::)
« última modificación: Septiembre 07, 2007, 03:41:13 pm por colubi »

Desconectado Severino

  • Moderador Global
  • *****
  • Mensajes: 3.156
Re: Ejercicio Calculadora
« Respuesta #12 en: Septiembre 07, 2007, 04:27:06 pm »
BUeno aca va mi ejercicio, con la validación y el optionstric(tuve que agregarle algunos casteso, sobre todo al hacer textbox.text=algun dato numerico)
Victor ya que estamos, a ver si me podes dar una mano. EN el form load como veras asigno todos los manejadores de eventos a los botones. Pero en el caso del boton "=", por alguna razon me lo agrega dos veces el manejador, entonces al tocar el = la aplicacion tira una excepcion porque hace la rutina dos veces. Posteo codigo y adjunto proyecto tambien.
Saludos.
FOrm
Código: (vbnet) [Seleccionar]
Option Strict On
Public Class Form1
    Private Num1, Num2 As Double
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'MANEJADORES
        AddHandler cmd0.Click, AddressOf PasaTexto
        AddHandler cmd1.Click, AddressOf PasaTexto
        AddHandler cmd2.Click, AddressOf PasaTexto
        AddHandler cmd3.Click, AddressOf PasaTexto
        AddHandler cmd4.Click, AddressOf PasaTexto
        AddHandler cmd5.Click, AddressOf PasaTexto
        AddHandler cmd6.Click, AddressOf PasaTexto
        AddHandler cmd7.Click, AddressOf PasaTexto
        AddHandler cmd8.Click, AddressOf PasaTexto
        AddHandler cmd9.Click, AddressOf PasaTexto
        AddHandler cmdSuma.Click, AddressOf PasaTexto
        AddHandler cmdResta.Click, AddressOf PasaTexto
        AddHandler cmdigual.Click, AddressOf PasaTexto
        AddHandler cmdMultiplicar.Click, AddressOf PasaTexto
        AddHandler cmddivicion.Click, AddressOf PasaTexto
        AddHandler cmdigual.Click, AddressOf PasaTexto
        AddHandler cmdC.Click, AddressOf PasaTexto
        'CONTROLES

    End Sub
    Private Sub PasaTexto(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim boton As Button
        boton = CType(sender, Button)
        If boton.Text = "=" Then
            Dim signo, cadena As String
            cadena = txtVisor.Text
            signo = Funciones.PasaaNum(Num1, Num2, cadena)
            txtVisor.Text = CStr(Calcular(Num1, Num2, signo))
        ElseIf boton.Text = "C" Then
            txtVisor.Text = ""
        Else
            txtVisor.Text = txtVisor.Text & boton.Text
        End If
    End Sub

    Private Sub txtVisor_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtVisor.KeyPress
        'Desactiva la caja           
        e.Handled = True
        Beep()
    End Sub


    Private Sub cmdsalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdsalir.Click
        End
    End Sub
End Class

Módulo:
Código: (vbnet) [Seleccionar]
Module Funciones

    Public Function Calcular(ByVal Num1 As Double, ByVal Num2 As Double, ByVal signo As String) As Double
        Select Case signo
            Case Is = "-"
                Return Num1 - Num2
            Case Is = "X"
                Return Num1 * Num2
            Case Is = "/"
                If Num2 = 0 Then
                    MessageBox.Show("NOOOOO se puede divir por 0")
                    Exit Function
                Else
                    Return Num1 / Num2
                End If
            Case Is = "+"
                Return Num1 + Num2
        End Select
    End Function
    'Por referencia lleno los numeros y devuelvo el signo
    Public Function PasaaNum(ByRef Num1 As Double, ByRef Num2 As Double, ByRef cadena As String) As String
        Dim mitad As Boolean = False
        Dim aux, posisicionsigno As Integer
        For i As Integer = 1 To cadena.Length
            Try
                aux = CInt(Mid(cadena, i, 1))
            Catch e As InvalidCastException
                posisicionsigno = i
            End Try
        Next
        Num1 = CDbl(Mid(cadena, 1, posisicionsigno - 1))
        Num2 = CDbl(Mid(cadena, posisicionsigno + 1, cadena.Length - posisicionsigno))
        Return Mid(cadena, posisicionsigno, 1)
    End Function
End Module
:bf_new

[archivo adjunto borrado por el administrador]

Desconectado vpassador

  • Administrador
  • *****
  • Mensajes: 294
Re: Ejercicio Calculadora
« Respuesta #13 en: Septiembre 07, 2007, 05:56:24 pm »
Con respecto al Option Strict ... debería estar siempre en ON (por defecto viene en OFF).
Por suerte sí el Option Explicit lo pusieron en ON.
De esta manera, si bien tenemos que pensar un poco más al escribir código para no cometer errores de casting, esos errores se van a detectar en tiempo de compilación, y no en ejecución, donde obviamente es mucho más peligroso.
Por lo tanto, siempre Option Strict en ON.

Con respecto a la validación antes de dividir, dos consideraciones:

La fácil: Encerrar todo en un try .. catch ... y listo.
La mejor (más larga, y alguno dirá también que más fea por cómo queda el código): Validar todos los datos antes de operarlos.
El try ... catch ... es todo un tema .. hay que tener cuidado ya que si estuviera a su vez dentro de alguna iteración larga, se puede perder performance, porque es muy costoso el armado de la exception (NET tiene que andar recolectando mucha información del stack). Pero no lo descarten, sólo manejenlo con cuidado.

Lo que pretendía al comentarles sobre la división por cero es que no se olviden de armar una estrategia de manejo de errores y de validación de datos. Es una de las primeras cosas que van a mirar cuando se presenten a alguna entrevista laboral.

Lo del evento que se repite , seguramente se está suscribiendo al manejador en más de un lugar .. ahora lo miro con más detalle y te cuento, mientras tanto fijate en el archivo con extensión ".Designer.vb".

Saludos,

Victor

Desconectado Pac-man

  • elPacMan.com.ar
  • Moderador Global
  • *****
  • Mensajes: 1.731
  • Programador Don
    • elPacMan
Re: Ejercicio Calculadora
« Respuesta #14 en: Septiembre 07, 2007, 05:57:28 pm »
Colubis pusistes dos veces el manejador!

'MANEJADORES       
AddHandler cmd0.Click, AddressOf PasaTexto       
AddHandler cmd1.Click, AddressOf PasaTexto       
AddHandler cmd2.Click, AddressOf PasaTexto       
AddHandler cmd3.Click, AddressOf PasaTexto       
AddHandler cmd4.Click, AddressOf PasaTexto       
AddHandler cmd5.Click, AddressOf PasaTexto       
AddHandler cmd6.Click, AddressOf PasaTexto       
AddHandler cmd7.Click, AddressOf PasaTexto       
AddHandler cmd8.Click, AddressOf PasaTexto       
AddHandler cmd9.Click, AddressOf PasaTexto       
AddHandler cmdSuma.Click, AddressOf PasaTexto       
AddHandler cmdResta.Click, AddressOf PasaTexto       
AddHandler cmdigual.Click, AddressOf PasaTexto    <------------------------ UNO     
AddHandler cmdMultiplicar.Click, AddressOf PasaTexto       
AddHandler cmddivicion.Click, AddressOf PasaTexto       
AddHandler cmdigual.Click, AddressOf PasaTexto  <-------------------------- DOS
AddHandler cmdC.Click, AddressOf PasaTexto       
'CONTROLES
<pac-man>
   <frase autor='Albert Einstein'>
      "Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas."
   </frase>
</pac-man>