border
VB 6
 
 
  #1 (permalink)  
Antiguo 20-09-2010, 16:01:54
Nuevo Amigo
 
Registrado: oct 2008
Posts: 26
Créditos: 1.037
amillalu Aun no valorado
Predeterminado Suma de números pares "entre" A y B

Me dejaron como tarea hacer un programa que me dé como resultado la suma de los números pares comprendidos entre dos números a y b.

Lo estoy realizando en un formulario de macros de power point.

Y con la ayuda de la web he logrado la resolución del programa casi completo:

El problema esta en q no sé q debo hacer para q el resultado solo considere los números que estan "entre" a y b, porq en caso el número a o b sea par tbm lo considera y lo suma...


Private Sub CommandButton1_Click()
num1 = Val(Me.TextBox1.Text)
num2 = Val(Me.TextBox2.Text)
If num1 < num2 Then
Me.TextBox3.Text = SumaPares(num1, num2)
End If
End Sub
Function SumaPares(ByVal a As Integer, ByVal b As Integer) As Integer
Dim Suma As Integer
Dim x As Integer
Suma = 0
For x = a To b
If x Mod 2 = 0 Then
Suma = Suma + x
End If
Next
SumaPares = Suma
End Function


También quisiera q me expliquen un poco la resolución, no entiendo la parte de la función: ByVal a As Integer, ByVal b As Integer, etc...

Garacias de antemano,

Luciana
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Responder Con Cita
  #2 (permalink)  
Antiguo 20-09-2010, 17:38:35
Avatar de acalanto
Administrador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 6.227
Créditos: 53.006
acalanto ha deshabilitado la reputación
Predeterminado Re: Suma de números pares "entre" A y B

Bueno, has debido copiar el código de algún lugar´, de lo contrario no me explico que no comprendas el propósito de los parámetros de la función.

La función SumaPares recibe dos parámetros de tipo INTEGER y los trata por su valor (BYVAL). Con esto se consigue que la función, ademas de recibir los datos que se le envian desde algún lugar de la aplicación, pueda modificar sin afectar a los datos enviados, es decir, si a tiene una valor 2 en origen y b un valor de 8, y en la funcion se modifican por 4 y 10, en origen sigune valiendo 2 y 8.

Lo contrario sucedería si en la función se hubiese omitido la directiva BYVAL o se hubiera puesto implicito BYREF; en este caso, cualquier alteración de los valores a y b dentro de la función, los midifica también desde el punto de llamada.


Te he escrito una función (al vuelo, no la he probado) que suma los números pares consecutivos entre a y b.

Esta función además verifica los siguientes aspectos de los valores recibidos.

Si A es impar, le sumamos 1 para transformarlo en PAR
Si B es impar, le restamos 1 para transformarlo en PAR
Si el parámetro opcional INCLUDE lo omitimos o ponemos TRUE, la función dejará los valores tal como están para procesar la suma de A a B ambos inclusive.
Si el parámetro INCLUDE lo ponemos en FALSE, la función recalculará los valores A y B, sumando 2 al primero (número par inmediatamente superior) y restará 2 al segundo (número par inmediatamente inferior), quedando así excluidos de la suma los extremos.

Por último verificamos qué, con los datos enviados a la función y las correcciones aplicadas, A sea siempre MENOR que B, de lo contrario devolvemos por resultado el valor '0'.

Cuando tenemos todo verificado y santificado vamos a proceder a aplicar una fórmula que nos permite calcular con tan solo dos operaciones la suma de números pares A->B, creando la misma carga de trabajo para 2->8 que para 2002->2023230321322.


En el código creo que está lo suficientemente documentado para que lo comprendas



Código:
Public Function sumaPares(byval a as LONG, byval b as LONG, optional include = true as boolean) AS LONG
     dim suma       as long 
     dim sumb       as long 
     on local error resume next 
     'Transformamos en par los valores recibidos
      'en caso de que sean inpares (aseguramos que a y b son pares)
      if (a mod 2) <> 0 then a = a + 1
      if (b mod 2) <> 0 then b = b - 1
      'Transformamos si el usuario desea la suma ambos incluidos excluidos, es decir, 
      'sumamos de a -> b [INCLUDE = TRUE]  o de (a + 2) -> (b - 2) [INCLUDE = FALSE]
      if Include = false then 
          a=a+2
          b=b-2
      end if 
      'Comprobamos que B sea mayor que A
      if b > a then 
            '------------------------------------------------------------------------
            'procedemos a realizar la sumatoria empleando para ello la siguiente
            'fórmula que nos devuelve la suma de numeros pares consecutivos entre
            '2 y B
            '------------------------------------------------------------------------
            '
            ' SUMA(2, B) = (B x (B + 2)) / 4
            '------------------------------------------------------------------------
            'Sumamos el rango de números pares consecutivos (2->B)
            sumab = (b*(b+2))/4
            'Sumamos el rango de números pares consecutivos (2->A)
            sumaa = (a*(a+2))/4
            'Sustraemos los resultados para obtener la sumatoria (a->b)
            sumapares = sumab-sumaa
      else
            sumapares = 0
      end if 
End Function

Espero que te resulte útil.



PD: He modificado el tipo de los parámetros de la función de INTEGER a LONG, pues INTEGER solamente te aceptará valores hasta 32767, mientras que con LONG podrás operar con números que rozan los 2 BILLONES.
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Leer detalladamente las normas del foro es una buena forma de comenzar a participar en él. Te llevará unos pocos minutos y el colectivo de usuarios te lo agradecerá. <si no las has leído sigue este enlace>
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Responder Con Cita
  #3 (permalink)  
Antiguo 22-09-2010, 22:37:08
Nuevo Amigo
 
Registrado: oct 2008
Posts: 26
Créditos: 1.037
amillalu Aun no valorado
Predeterminado Re: Suma de números pares "entre" A y B

Hola acalatanto, gracias mil por tu pronta respuesta, bueno probe la resolución q me diste pero me daba error, un amigo me dio la solución:

Private Sub CommandButton1_Click()
num1 = Val(Me.TextBox1.Text)
num2 = Val(Me.TextBox2.Text)
If num1 < num2 Then
Me.TextBox3.Text = SumaPares(num1, num2)
End If
End Sub
Function SumaPares(ByVal a As Integer, ByVal b As Integer) As Integer
Dim Suma As Integer
Dim x As Integer
Suma = 0
For x = a + 1 To b - 1 Step 1
If x Mod 2 = 0 Then
Suma = Suma + x
End If
Next x
SumaPares = Suma
End Function
Private Sub CommandButton2_Click()
End
End Sub

Recalco q el único cambio q hizo fue a esta línea:

For x = a + 1 To b - 1 Step 1

Saludos,

Luciana

Última edición por amillalu fecha: 22-09-2010 a las 22:40:18. Razón: ehmm.. se borro el primero q envie...
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Responder Con Cita
  #4 (permalink)  
Antiguo 23-09-2010, 05:10:58
Avatar de acalanto
Administrador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 6.227
Créditos: 53.006
acalanto ha deshabilitado la reputación
Predeterminado Re: Suma de números pares "entre" A y B

Bueno, pues me alegro que te funcione. Lo que no comprendo es que no hayas podido utilizar el código que yo te he aconsejado. ¿Qué error produce y dónde?.

La solución que yo te puse tiene ciertas ventajas sobre la que estás utilizando.

1.- Asegura que la primera cifra es más pequeña que la segunda.
2.- Asegura que los números son pares.
3.- Incluye o excluye de la suma los límites extremos.
4.- No utiliza un bucle para calcular, con lo que es extremadamente rápida.
5.- Permite parametros y sumas superiores a 32767

Pero bueno, puedes utilizar el que tú has puesto si ya te funciona, solamente te pido que pruebes lo siguiente y me digas que tal funciona:


misuma = sumapares(30, 40)
misuma = sumapares(31, 40)
misuma = sumapares (25000, 28000)

Compruébalo con calculadora y ya me dirás si realmente está sumando los números pares.
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Leer detalladamente las normas del foro es una buena forma de comenzar a participar en él. Te llevará unos pocos minutos y el colectivo de usuarios te lo agradecerá. <si no las has leído sigue este enlace>
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Responder Con Cita
  #5 (permalink)  
Antiguo 23-09-2010, 18:40:34
Nuevo Amigo
 
Registrado: oct 2008
Posts: 26
Créditos: 1.037
amillalu Aun no valorado
Predeterminado Re: Suma de números pares "entre" A y B

Hola Acalanto, bueno el primer error que me daba era "no se ha definido Sub o Function" y saltaba q el error estaba en esta linea:

Public Function sumaPares(byval a as LONG, byval b as LONG, optional include = true as boolean) AS LONG

----->> la misma q corregi de la siguiente manera (aunq no sé si era la forma correcta)...

Function sumaPares(ByVal a As Long, ByVal b As Long, Optional include As Boolean = True) As Long

De ahi corria el programa y el error era en los resultados:

suponiendo q A = 4 y B = 8
la respuesta daba: 14
no sumaba el número par de "A" pero seguía sumando el par de "B"

pero en una segunda prueba observe algo extraño:

suponiendo q A=1 y B=8
la respuesta daba: 18

es decir siempre suma los pares descartando el primer número par...

espero me hayas comprendido...


Private Sub CommandButton1_Click()
num1 = Val(Me.TextBox1.Text)
num2 = Val(Me.TextBox2.Text)
If num1 < num2 Then
Me.TextBox3.Text = sumaPares(num1, num2)
End If
End Sub
__________________________________________________ _______
Function sumaPares(ByVal a As Long, ByVal b As Long, Optional include As Boolean = True) As Long
Dim suma As Long
Dim sumb As Long
On Local Error Resume Next

If (a Mod 2) <> 0 Then a = a + 1
If (b Mod 2) <> 0 Then b = b - 1

If include = False Then
a = a + 2
b = b - 2
End If

If b > a Then

sumab = (b * (b + 2)) / 4
sumaa = (a * (a + 2)) / 4
sumaPares = sumab - sumaa
Else
sumaPares = 0
End If
End Function
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Responder Con Cita
  #6 (permalink)  
Antiguo 23-09-2010, 19:35:58
Avatar de acalanto
Administrador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 6.227
Créditos: 53.006
acalanto ha deshabilitado la reputación
Predeterminado Re: Suma de números pares "entre" A y B

Pues tienes razón, cuando el primer número es 2 la función no lo tenía en cuenta y producía un error en cálculo.

Ahora la tienes perfectamente comprobada. Si recuerdas, la primera versión te comentaba que la había escrito 'al vuelo'.

No obstante déjame decirte que ante un error producido por un código regalado, es bueno esforzarse para tratar de analizar el porqué se produce. Así se aprende a programar y a muchas otras cosas.

No sé si tienes VB6 para probar el proyecto que te adjunto. Si te es posible pruébalo, y si lo ejecutas con la tecla F8, pasando por todo el código, comprenderás como trabaja y su explicación.


Código:
 
Public Function sumaPares(a As Long, b As Long, Optional include As Boolean = True) As Long
    Dim sumaA       As Long
    Dim sumaB       As Long
    On Local Error Resume Next
    'Asegurar que son números pares
    If (a Mod 2) <> 0 Then a = a + 1
    If (b Mod 2) <> 0 Then b = b - 1
    'Analizar si se incluyen los extremos
    If include = False Then
        a = a + 2
        b = b - 2
    End If
    'Calcular la suma siempre que a < b
    If a < b Then
        sumaB = (b * (b + 2)) / 4
        sumaA = IIf(a = 2, 0, ((a + (a + 2)) / 4))
        If Err.Number = 0 Then
            sumaPares = (sumaB - sumaA)
        Else
            MsgBox "Resultado sobrepasa la cifra de 2*10^32" + vbNewLine + "Trabaje con rangos menores"
            sumaPares = 0
        End If
    Else
        'devolvemos 0 como resultado
        sumaPares = 0
    End If
End Function
Archivos Adjuntos
Tipo de Archivo: zip sumapares.zip (2,6 KB, 6 visitas)
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Leer detalladamente las normas del foro es una buena forma de comenzar a participar en él. Te llevará unos pocos minutos y el colectivo de usuarios te lo agradecerá. <si no las has leído sigue este enlace>
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Responder Con Cita
  #7 (permalink)  
Antiguo 23-09-2010, 21:15:42
Nuevo Amigo
 
Registrado: oct 2008
Posts: 26
Créditos: 1.037
amillalu Aun no valorado
Predeterminado Re: Suma de números pares "entre" A y B

Hola gracias por tu ayuda, y disculpa por no haber tomado más atención e intentar arreglar los errores por mi cuenta, es q las herramientas q usas no me las han enseñado aún, busque información en la web para resolver el ejercicio empiricamente pero no me dio resultado.

Si tengo VB6, pero creo q es una versión desactualizada asi q uso el visual del office (.ppt).

Copie el código y debuggee (F8) y me da error en esta línea:
Me.TextBox3.Text = sumaPares(num1, num2) >>>sombrea el num1

"El tipo de argumento de ByRef no coincide" ,
... lei en la web q ese error es provocado si se pasa un parámetro a un procedimiento sub o función por referencia, el tipo del parámetro real pasado y el argumento correspondiente de la función debe coincidir.

a que hace referencia?

mil disculpas,

Luciana
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Responder Con Cita
  #8 (permalink)  
Antiguo 24-09-2010, 08:42:48
Avatar de acalanto
Administrador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 6.227
Créditos: 53.006
acalanto ha deshabilitado la reputación
Predeterminado Re: Suma de números pares "entre" A y B

Pero eso te sucede porque no estás copiando todo el código que te envié, sólo copias la función.

Si revisas el proyecto comprobarás que antes de llamar a la función me tomo el interés de transformar el contenido de los TextBoxes a dos variables dimensionadas tipo LONG, y son estas variables las que paso a la función, no los textboxes, que es lo que tú debes estar intentando.

Si lo haces bien ya verás como si que funciona, además en los parámetros que envías a la función, obtendrás los valores que ella ha ajustado.
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Leer detalladamente las normas del foro es una buena forma de comenzar a participar en él. Te llevará unos pocos minutos y el colectivo de usuarios te lo agradecerá. <si no las has leído sigue este enlace>
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Responder Con Cita
  #9 (permalink)  
Antiguo 24-09-2010, 12:50:47
Nuevo Amigo
 
Registrado: oct 2008
Posts: 26
Créditos: 1.037
amillalu Aun no valorado
Predeterminado Re: Suma de números pares "entre" A y B

Copio todo el código q me envias... no sé q estoy haciendo mal.

Te adjunto mi archivo,

Saludos,

Luciana
Archivos Adjuntos
Tipo de Archivo: rar Problema 2_suma_numeros pares_comprendidos_entre a_y_b.rar (30,5 KB, 6 visitas)
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Responder Con Cita
  #10 (permalink)  
Antiguo 24-09-2010, 13:02:16
Avatar de acalanto
Administrador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 6.227
Créditos: 53.006
acalanto ha deshabilitado la reputación
Predeterminado Re: Suma de números pares "entre" A y B

No Amillalu, no me envías el código que yo te envié ayer a última hora de la tarde; no se parece ni de lejos.

Revísalo todo, a conciencia, línea por línea y a ver si detectas que es lo que no has copiado bien o aquello que tú, por tu cuenta y riesgo, has modificado sin tener en cuenta las consecuencias.
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Leer detalladamente las normas del foro es una buena forma de comenzar a participar en él. Te llevará unos pocos minutos y el colectivo de usuarios te lo agradecerá. <si no las has leído sigue este enlace>
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
Responder Con Cita
Respuesta


Herramientas

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado



La franja horaria es GMT. Ahora son las 18:15:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios


right
Inactive Reminders By Icora Web Design