![]() |
FACULTAD DE MINAS Escuela de Sistemas 3004578 - Algoritmos y Programación |
![]() |
![]() |
![]() |
Ejercicios resueltos: Algoritmos y Programas |
Preparó:William Alvarez Montoya. |
La solución de ecuaciones cuadráticas de la forma AX2 + BX + C = 0 implica obtener las raíces, X1, X2, que satiafacen la ecuación.
Los objetivos que se pretenden lograr con este ejemplo resuelto son los siguientes:
Practicar el diseño de una Interfaz Gráfica de Usuario (GUI) en Visual Basic, a partir del algoritmo que resuelve un problema.
Aprender y aplicar los conceptos básicos de programación, empleando las técnicas de diseño de algoritmo y de escritura de progamas en lenguaje (Visual Basic 6.0). Particularmente, el manejo de variables y constantes, expresiones, operadores, procedimientos, controles y sus propiedades y eventos, estructuras de selección lógica, estructuras de iteración. Para un mejor entendendimiento de los conceptos involudrados en este ejemplo es muy conveniente que el estudiante cumpla con los siguientes requisitos: Estudio de la sección 2.1.
Estudio y práctica con el Proyecto #1.
Realización de las tareas previas (sesiones teóricas y prácticas #1, #2).
Para resolver, algorítmicamente, este ejercicio se emplea la metodología de solución de problemas, típica en áreas técnicas y de ingenierías, que consta de los siguientes pasos generales:
Análisis del problemaObjetivos
Conceptos implicados
Requisitos
Solución
que implica conocer el dominio donde el problema surge, o estar asesorado por expertos en dicho dominio. Esto permite el entendimeitno cabal del problema. Lo cual permite identificar sus componentes, cómo interactúan dichos componentes. Los datos involucrados tanto de entrada cómo de salida. El entendimiento general de los procesamientos involucrados.
Diseño de una solución. Con los elementos de juicio obtenidos mediante el Análisis del problema entonces se está en capacidad de esbozar un Algoritmo general<7font>, que es la secuencia de pasos, procesos, o tareas, que llevan de los datos de entrada a los reusltados. Luego se detallan todos los pasos que así lo requieran.
Programación. Con los algoritmos, previamente elaborados, se escriben los programas pertinentes, que implementan los algoritmos dentro del contexto de un lenguaje de programación de computadores.
Pruebas, ajustes, mejoras. Los programas requieren, generalmente, de pruebas con datos típicos, de mejoras y ajustes según surjan nuevas necesidades de procesamiento de datos.
La metodología expuesta corresponde al algoritmo secuencial del proceso de datos, que lleva a solucionar problemas, mediante un computador, el cual se esquematiza en la siguiente figura:
Este problema consiste en resolver ecuaciones cuadráticas de la forma AX2 + BX + C = 0, cuyo dominio corresponde al Álgebra básica.
El dominio del problema es trivial, con el fín de centrarnos inicialmente en el dominio de la Teoría de Algoritmos y Programación.
El primer paso, dentro del enfoque metodológico adoptado, consiste en tener un cabal entendimiento del problema. Esto implica una correcta formulación del mismo, caracterizando todos sus parámetros, relaciones y restricciones.
La estructura de datos, expresada por medio de las variables, es fundamental, y normalmente se presenta en una tabla de Definición de Variables, como la que se ilustra a continuación, en la cual para cada variable se explicita el nombre, una descripción suscinta, y el tipo de datos.
Las Relaciones entre las variables se expresan, generalmente, mediante el uso de fórmulas algebraicas o más avanzadas. Para este caso dichas relaciones son: Las Restricciones para este caso corresponden a los rangos de precisión numérica del campo de los reales (véase sección 3.2, tabla 1). Además, es necesario considerar los casos cuando A = 0.0, que sólo genera una única raíz; y cuando D menor que 0.0, que da raíces imaginarias (Visual Basic 6.0 NO maneja la variable compleja).
El Proceso de Datos que se realiza en este proyecto corresponde a un Algoritmo Secuencial, cuyas etapas básicas se ilustran en el figura siguiente:
Puede conceptalizarse que el Núcelo central del Algoritmo transforma, mediante ciertas relaciones lógicas y operaciones matemáticas, los datos de entrada en los datos de salida (o resultados).
El algoritmo secuencial para este problema se ilustra en forma más detallada en la siguiente figura. La operación MOSTRAR equivale a desplegar en la pantalla, por medio de ciertos objetos. En su representación diagramática, el algoritmo genérico es el siguiente:
Aunque este algoritmo resuelve, en general, ecuaciones cuadráticas, NO involucra todas las posibilidades lógicas de tal proceso de solución. Por lo tanto, dicho algoritmo No está refinado.
El siguiente paso, en la elaboración de un proyecto en Visual Basic, consiste en el diseño de una interfaz gráfica de usuario (o simplemente: interfaz). Dicho diseño tiene como base un formulario (Form) sobre el cual se ubican otros objetos (controles), de acuerdo a la lógica expresada en el algoritmo.
Para este primer problema se emplea un formulario (Form1) y tres marcos (Frame1, Frame2, Frame3) para contener los demás objetos. La figura siguiente ilustra una distribución típica para este estilo de interfaz.
Las propiedades que se cambian para los diferentes objetos (controles) de la interfaz anterior, se compendian en la tabla siguiente:
La interfaz diseñada sólo tendrá funcionalidad, efectuando las operaciones del algoritmo, si se le suministra programación específica mediante instrucciones del lenguaje de programación.
Claro está, que ya se ha hecho una Programación Visual mediante el diseño mismo de la interfaz. En forma automática, Visual Basic genera un programa que es almacenado en el archivo del formulario (con extensión .FRM).
La programación específica que se efectúa en forma manual se ilustra en la tabla siguiente, para los diferentes eventos y/o controles (objetos) que así lo requieran. En este ejemplo, se programa el evento load() del formulario Form1, y los botones de comando del Frame3.
Programación para el diagrama inicial (no refinado) La anterior programación le da cierta funcionalidad a la interfaz. Para empezar a probar este proyecto, se puede intentar con datos de entrada como los mostrados en la figura siguinte:
Varios aspectos es necesario resaltar, apartir de la figura anterior que despliega el tiempo de ejecución del Proyecto #2, una vez se digitan datos válidos en las CajaTexto respectivas: El formulario, Form1, ocupa toda el área física de la pantalla. Este es el efecto de la propiedad WindowState del formulario puesta en 2 - Maximized.
La barra de título y control del formulario, Form1, no presenta el menú de control ni los botones de control típicos de una ventana del Sistema Operativo Windows. Este efecto se logra poniendo a False la propiedad ControlBox del objeto Form1, en la ventana de propiedades a tiempo de diseño.
Una vez se digitan los datos, correspondientes a las variables A, B, C, entonces los respectivos valores numéricos se asignan a las variables, y se desactiva el botón LEER y se activan los botones CALCULAR y BORRAR, como se muestra en la figura.
Al hacer click en el botón CALCULAR entonces se ejecuta la programación asignada a dicho botóncomando, ejecutándose las operaciones respectivas y desplegando los resultados en las cajatexto Text4 y Text5. Igualmente, se desactiva el botón CALCULAR y se activa el botón LEER, como ilustra la siguiente figura.
Si se digita el valor de cero (0.0) para la variable A, y se hace click en el botón CALCULAR, entonces, según la lógica del algoritmo hasta ahora diseñado, se intentará dividir por cero en la obtención de las raíces, lo cual generará automáticamente un error de desbordamiento (overflow), interrumpiéndose la ejecución dle programa.
La figura siguiente muestra el mensaje estándar que Visual Basic 6.0 genera al presentarse división por cero. Con el botón END se termina la ejecución del programa; con el botón DEBUG ("depurar") se llega al editor de programas en la línea de código fuente donde se generó el error.
Al interrumpirse la ejecución del proyecto, con un error fatal como el de desbordamiento, todo dato o resultado internedio se perderá, el proyecto pierde el control de ejecución, el cual pasa "a manos" del "motor interno" de Visual Basic 6.0, que está diseñado para responder con una ventana de diálogo suministrando el código del error presentado, una suscinta descripción del mismo, dando las opciones de continuación, y proporcionando -eventualmente- ayuda al respecto (con el botón de Ayuda, o Help).
Para obviar los errores fatales, en la ejecución de un proyecto, es preciso refinar el algoritmo dándole más robustez, esa decir, más solidez lógica. La siguiente sección ilustra el proceso de Refino Progresivo, o Refino Paso-a-Paso, para el presente proyecto.
En general, siempre es posible mejorar (refinar) un algoritmo diseñado para expresar la lógica de solución de un determinado problema. Para este caso, pueden considerarse las situaciones, o restricciones, que conducen a refinos en el algoritmo, de tal suerte que el algoritmo refinado tenga mayor robustez lógica que sin refino (véase las secciones 2.1, 2.2): ¿Qué pasa si A = 0.0? ¿Qué pasa si D es negativo?. Resultarían raíces de tipo imaginario. Visual Basic 6.0 no maneja directamente la vriable compleja. Una forma de proceder, en este caso, es desplegar sendos mensajes que informen sobre la obtención de raíces imaginarias. El trozo de diagrama siguiente ilustra las opciones respectivas:
¿Qué pasa si se digita texto, o caracteres alfanuméricos, en las cajas de texto Text1, Text2 y Text3, o si se dejan dichos controles en blanco?. Obviamente, dichos datos NO son datos numéricos válidos para ser contenidos en las variables reales A, B, C, y No se podrían efectuar cálculos aritméticos con ellos. Antes de efectuar los cálculos, e incluso: aún antes de leer efectivamente las variables A, B y C desde las cajas de texto, habría que verificar (validar) que los datos digitados sí sean datos numéricos válidos. Precisamente, la función IsNumeric() permite efectuar dicha validación. El trozo de diagrama siguiente, ilustra la selección lógica empleada:
La variable Ctr_Data ha de definirse en el objeto General, procedimiento (declarations), como de tipo lógico, o Boolean (véase la sección 3.2, Tabla 1): Dicha variable toma su valor (su contenido) de la expresión lógica respectiva. Una expresión lógica mezcla variables, operadores, funciones, paréntesis, y su valor de certeza es verdadero (True) o falso (False).
Involucrando los refinos arriba descritos, el diagrama de lógica para este proyecto quedaría así:
Obviamente, la programación del procedimiento de lectura cambia. No se podrá activar la opción CALCULAR mientras los datos digitados sean no-numéricos, es decir persistan en su invalidez numérica. Una posble versión de dicho procedimiento se muestra a continuación: La lógica del anterior procedimiento se basa en el contenido de la variable Ctr_Data y en el operador lógico Not para negar (véase sección 3.2); si la variable Ctr_Data es falsa, su negación es verdadera, significando esto que por lo menos uno de los controles TextBox (Text1, Text2 ó Text3) tiene datos no-numéricos.
Los objetos (controles) en Visal Basic 6.0 involucran programas pre-ensamblados denominados Métodos. El control TextBox tiene asignado el Método SetFocus cuyo funcionalismo consiste en establecer el enfoque, es decir, determinar el Objeto Activo; en este caso, se establece que el enfoque vaya a la CajaTexto Text1. La sintaxis genérica para invocar un método es: objeto.método.
La instrucción Exit Sub es una estructura automática de interrupción. Su efecto consiste en interrumpir el flujo lógico de ejecución de un procedimiento y retornar el control al sitio exacto desde el cual fue llamado el procedimiento; para este ejemplo, el control retorna a la interfaz, con el objeto activo Text1.
Obsérvese que la variable MM$, de contenido String (alfanumérico) se emplea para concatener una serie de textos, que conforman un mensaje multilínea. Se utiliza la función Chr(13), convenientemente situada, para lograr las líneas individuales del mensaje. La figura siguiente ilustra el caso de dicho mensaje cuando los datos son no válidos:
Un programa correspondiente al algoritmo mostrado en la figura anterior es el siguiente:
Tomando como base este segundo ejemplo, se pretende ilustrar varios conceptos relacionados con los principios básicos de la Programación de Computadores: El concepto de Algoritmo y su Representación mediante un Diagrama Estructurado de Lógica.
Utilización de las Estructuras Automáticas Básicas, mediante las cuales es posible expresar y representar una gama muy amplia de algoritmos. Dichas estructuras incluyen: la Secuencia, la Selección lógica, y la Iteración.
Empleo de la Interfaz Gráfica de Usuario [GUI] para elaborar, a su vez, una interfaz gráfica de usuario (o solamente, Interfaz) que permite la solución del problema planteado y expresado lógicamente en el Diagrama de Lógica.
Reconocer y aplicar los diferentes componentes del Escritorio Principal de Visual Basic: Barra de título y control ([design]/[run]), menú principal, barra de herramientas (íconos para grabar/abrir proyecto; íconos para visualizar ventana de propiedades, ventana exploradora de proyectos, caja de herramientas), formulario básico de diseño.
El concepto de Proyecto en Visual Basic.
Reconocer y manejar los diferentes tipos de objetos (controles) vistos en el proyecto: Form, Frame, Label, TextBox, CommandButton. Cómo se nombran dichos objetos (Form1; Frame1, Frame2,...; Label1, Label2,...; Text1, Text2,...; Command1, Command2,...).
Cómo se cambian las propiedades de un objeto (control) a tiempo de diseño (mediante la ventana de propiedades) y a tiempo de ejecución (mediante la instrucción de Asignación, como en Command2.Enabled = False).
Saber explicar la funcionalidad del objeto General.
Categorías de programación que utiliza Visual Basic 6.0: Visual Interactiva, generando automáticamente código que se almacena en el archivo del formulario (*.FRM), lo que se conoce como Programación Automática; con Código Fuente, es decir, escribiendo instrucciones específicas en el lenguaje Visual Basic.
Reconocer y aplicar el concepto de Procedimiento, que permite realizar una programación modularmente. Componentes de un procedimiento: nombre del procedimiento; plantilla estándar para el inicio y el fín del procedimiento; cuerpo del procedimiento.
El concepto de Evento. Reconocer y aplicar los eventos: Load(), Click(). Significado y funcionalidad de cada uno.
Explicar y aplicar correctamente las siguientes funciones de la Librería Estándar de Visual Basic 6.0: Val(), Str(), Sqr(), MsgBox(), IsNumeric().
Saber reconocer el significado, funcionalidad y la aplicación de las siguientes instrucciones: Cómo se detiene el Tiempo de Ejecución cuando se presentan errores en la programación.
Tareas: (a) - Elaborar un algoritmo y un proyecto Visual Basic para involucrar los Refinos

ENTENDER EL PROBLEMA
Nombre
Descripción suscinta
Tipo de datos A, B, C
Real D
Real X1, X2
Real
Las raíces, X1 y X2, se obtienen mediante la aplicación de esta fórmula.

Algoritmo Secuencial
![]()
DIAGRAMA DE LÓGICA

Diagrama estructurado de lógica
![]()
DISEÑO DE LA INTERFAZ

Interfaz en Visual Basic
OBJETO
(CONTROL)PROPIEDADES
A CAMBIARVALORES Form1
Frame1
Frame2
Frame3
Label1
Label2
Label3
Label4
Label5
Text1
a Text5Command1
Command2
Command3
Command4
![]()
PROGRAMACIÓN
OBJETO
(o EVENTO)NOMBRE DEL
PROCEDIMIENTOPROGRAMA
ASIGNADOForm1
(Load())Form_Load()
Private Sub Form_Load()
Command2.Enabled = False
Command3.Enabled = False
End SubGeneral
(declarations)
Dim A As Single, B As Single
Dim C As Single, D As Single
Dim X1 As Single, X2 As SingleCommand1
(Click())Command1_Click()
Private Sub Command1_Click()
A = Val(Text1)
B = Val(Text1)
C = Val(Text3)
Command1.Enabled = False
Command2.Enabled = True
Command3.Enabled = True
End SubCommand2
(Click())Command2_Click()
Private Sub Command2_Click()
D = B2 - 4*A*C
X1 = (-B+Sqr(D))/(2*A)
X2 = (-B+Sqr(D))/(2*A)
Text4.Text = Str(X1)
Text5.Text = Str(X2)
Command1.Enabled = True
Command2.Enabled = False
End SubCommand3
(Click())Command3_Click()
Private Sub Command3_Click()
Text1 = ""
Text2 = ""
Text3 = ""
Text4 = ""
Text5 = ""
Command2.Enabled = False
Command3.Enabled = False
Command1.Enabled = True
End SubCommand4
(Click())Command4_Click()
Private Sub Command4_Click()
Unload Form1
End Sub

Tiempo de ejecución, datos para A, B, C.

Tiempo de ejecución, obtención de los resultados.

Tiempo de ejecución, error de desbordamiento.
![]()
REFINOS

¿Qué pasa si A = 0.0?

¿Qué pasa si D es negativo?

Validación de los valores de A, B, C.
Dim Ctr_Data as Boolean

Diagrama de lógica refinado
Private Sub Command1_Click()
Dim Ctr_Data as Boolean, MM$, TT$
Ctr_Data = IsNumeric(Text1) And IsNumeric(Text2) _
And IsNumeric(Text3)
If(Not Ctr_Data)Then
MM$ = "... DATOS LEÍDOS: " & Chr(13)
MM$ = MM$ & "A = " & Text1.Text & Chr(13)
MM$ = MM$ & "B = " & Text2.Text & Chr(13)
MM$ = MM$ & "C = " & Text3.Text & Chr(13)
MM$ = MM$ & "--------------------------------" & Chr(13)
MM$ = MM$ & "*** DATOS NO VÁLIDOS ***"
TT$ = "** ERROR EN DATOS **"
Msgbox MM$, 16, TT$
Text1.Text = "" : Text2.Text = "" : Text3.Text = ""
Text1.SetFocus
EXIT SUB
Else
A = Val(Text1) : B = Val(Text2)
C = Val(Text3)
Command1.Enabled = False
Command2.Enabled = True
Command3.Enabled = True
MM$ = "... DATOS LEÍDOS: " & Chr(13)
MM$ = MM$ & "A = " & Str(A) & Chr(13)
MM$ = MM$ & "B = " & Str(B) & Chr(13)
MM$ = MM$ & "C = " & Str(C) & Chr(13)
MM$ = MM$ & "--------------------------------" & Chr(13)
MM$ = MM$ & "*** DATOS VÁLIDOS ***"
TT$ = "** LECTURA O.K. **"
Msgbox MM$, 16, TT$
End If
End Sub

Mensaje para datos no válidos y B = 0.0
Private Sub Command1_Click()
Dim Ctr_Data as Boolean, MM$, TT$
Ctr_Data = IsNumeric(Text1) And IsNumeric(Text2) _
And IsNumeric(Text3)
If(Not Ctr_Data)Then
MM$ = "... DATOS LEÍDOS: " & Chr(13)
MM$ = MM$ & "A = " & Text1.Text & Chr(13)
MM$ = MM$ & "B = " & Text2.Text & Chr(13)
MM$ = MM$ & "C = " & Text3.Text & Chr(13)
MM$ = MM$ & "--------------------------------" & Chr(13)
MM$ = MM$ & "*** DATOS NO VÁLIDOS ***"
TT$ = "** ERROR EN DATOS **"
Msgbox MM$, 16, TT$
Text1.Text = "" : Text2.Text = "" : Text3.Text = ""
Text1.SetFocus
EXIT SUB
Else
A = Val(Text1) : B = Val(Text2)
C = Val(Text3)
Command1.Enabled = False
Command2.Enabled = True
Command3.Enabled = True
MM$ = "... DATOS LEÍDOS: " & Chr(13)
MM$ = MM$ & "A = " & Str(A) & Chr(13)
MM$ = MM$ & "B = " & Str(B) & Chr(13)
MM$ = MM$ & "C = " & Str(C) & Chr(13)
MM$ = MM$ & "--------------------------------" & Chr(13)
MM$ = MM$ & "*** DATOS VÁLIDOS ***"
TT$ = "** LECTURA O.K. **"
Msgbox MM$, 16, TT$
If(A = 0.0 And B = 0.0)Then
MsgBox "NO HAY SOLUCIÓN"
ElseIf(A = 0.0 And B <> 0.0)Then
D = B^2 -4.0 * A * C
If(D < 0.0)Then
MsgBox "RAÍCES IMAGINARIAS"
Else
X1 = (-B + Sqr(D)) / (".0 * A)
X2 = (- B - Sqr(D) / (2.0 * A)
MM$ "X1 = " & X1 & Chr(13) & "X2 = " & X2
MM$ = MM$ & Chr(13) & "DOS RAÍCES REALES"
MsgBox MM$, 64, "** RESULTADOS **"
End If
End If
End If
End Sub
![]()
OBSERVACIONES