UNIDAD IV Secuenciales: ◦ Sentencias son ejecutadas en un orden especifico (arriba abajo o izq. a derecha). Selectivas: ◦ El flujo del programa se determina de acuerdo a una expresión lógica (comparación o condición). Selección simple: (un camino alterno) Selección doble: (dos caminos alternos) Selección múltiple: (varios caminos alternos) Repetitivas: ◦ Permiten la repetición de una secuencia de sentencias en función de si se cumple o no una expresión lógica. Repetición Predefinida Repetición con entrada condicionada Repetición con salida condicionada Sentencia: es una instrucción o línea de código en algún lenguaje de programación. Sentencias de Declaración de variables o constantes: ◦ Dim variable as Tipo o Const identificador as tipo Sentencias de entrada o lectura de datos: ◦ Console.read() lee un carácter desde teclado ◦ Console.readLine() lee una línea de caracteres (cadena) desde teclado Sentencias que formulan el proceso a realizar a través de operaciones primitivas (expresiones aritméticas o lógicas): ◦ ◦ ◦ ◦ ◦ Asignación: variable=valor o expresión Operadores Aritméticos: ^,*,/,\,MOD,+,Operadores Relacionales: >,<,>=,=<,<>,= Operadores Lógicos: AND, OR, NOT, XOR, ANDALSO, ORELSE Asignaciones simplificadas: +=,-=,*=,/=,&=,\=, ^= Sentencias de salida o escritura de datos: ◦ Console.write() escribe un mensaje o datos sin saltar de línea ◦ Console.writeLine() escribe un mensaje o datos y salta una línea Module Suma Sub Main() Dim a,b,r as integer Console.write(“Dame el primer valor”) a=CINT(Console.readline()) Console.write(“Dame el segundo valor”) b=CINT(Console.readline()) r=a+b Console.writeLine(“La suma de {0} y {1} es {2}“,a,b,r) End Sub End Module Se selecciona un camino o flujo a seguir de acuerdo al resultado de una expresión lógica. Una expresión lógica es aquella cuyo resultado es un valor lógico: Falso (false) o Verdadero (true). La expresión lógica esta utiliza operadores relacionales para comparar y lógicos para relacionar 2 o más comparaciones. Una comparación esta conformada por 2 operandos (variables o constantes numéricas) y un operador relacional. Ejemplos: (5>3) , (a<=b), (a<>7),… Una expresión lógica puede estar conformada por 2 o más comparaciones unidas por operadores lógicos, por ejemplo: ((a>b) and (b>c)) or ((a=b) and (b=c)) Si la expresión lógica es verdadera se realizan las sentencias incluidas en la estructura. Sólo se considera una alternativa. Sintaxis: Varias líneas de código: If Expresión lógica Then Código End If Una línea de código: If Expresión Then Instrucción Module Mayor3 Sub Main() Dim a,b,c,mayor as integer Console.writeline(“Teclea los 3 valores:”) a=Cint(Console.readLine()) b=Cint(Console.readLine()) c=Cint(Console.readLine()) mayor=a if (b>mayor) Then mayor=b if (c>mayor) Then mayor=c Console.writeLine(“El mayor es {0}”,mayor) End Sub End Module Se consideran 2 alternativas (Verdadero y Falso). Si la expresión lógica es verdadera el flujo del programa realiza las sentencias incluidas en la parte verdadera (THEN) y en caso contrario si la expresión es falsa se realiza el código incluido en la parte falsa (ELSE). Varias líneas de código: Anidada o Multiple: If Expresión lógica Then If Expresión1 Then Código Else Código End If Código ElseIf Expresión2 Then Código ... [ElseIf ExpresiónN Then] Código Una línea de código: Else If Expresión Then Instrucción Else Instrucción Código End If Manera Simplificada: iff(Expresión,instrucción si verdadero,instrucción si falso) Module Mayor3 Sub Main() Dim a,b,c as integer Console.writeline(“Teclea los 3 valores:”) a=Cint(Console.readLine()) b=Cint(Console.readLine()) c=Cint(Console.readLine()) if (a>b) then if (a>c) then Console.writeLine(“El mayor es {0}”,a) else Console.writeLine(“El mayor es {0}”,c) end if elseif (b>c) then Console.writeLine(“El mayor es {0}”,b) else Console.writeLine(“El mayor es {0}”,c) end if End Sub End Module Dependiendo del valor que toma una determina variable o expresión (selector) se ejecuta el código correspondiente. La variable o expresión debe de ser de tipo entero, carácter o cadena. Sintaxis: Select Case Expresión Case Lista1 Código [Case Lista2] Código [Case Else] Código End Select donde ListaN: Expresión o valor Expr1 To Expr2 (valorInicial To valorFinal) Is OpComparación Expresión o valor Module DiasMes Sub main dim mes as Integer Console.write("Teclea no. de mes") mes=cint(Console.readLine()) select case (mes) case 1,3,5,7,8,10,12 Console.writeLine("31 dias") case 2 Console.writeLine("28 dias") case 4,6,9,11 Console.writeLine("30 dias") case else Console.writeLine("No valido") end select End Sub End Module Una estructura de repetición, también llamada lazo o bucle(ciclo), hace posible la ejecución repetida de secciones específicas de código. Hay tres tipos básicos de estructuras de repetición, cuya diferencia principal radica en cómo se controlan las mismas: ◦ Repetición Predefinida: es controlada por un contador. Con esta estructura, un bloque de sentencias se ejecuta una vez para cada uno de los valores que va tomando un contador. Se ejecuta un número específico de veces, siendo el número de repeticiones conocido antes de que empiece la ejecución de tal ciclo (FOR). ◦ Repetición con entrada condicionada: la entrada al ciclo es controlada por una expresión lógica . En este caso, un bloque de sentencias se ejecuta un número indefinido de veces, mientras satisfaga alguna condición establecida por el programador, lo cual desde el punto de vista de la programación, equivale a que una cierta expresión lógica tome el valor de true (WHILE). ◦ Repetición con salida condicionada: la salida del ciclo es controlada por una expresión lógica . En este caso, un bloque de sentencias se ejecuta un número indefinido de veces, hasta que se satisface alguna condición establecida por el programador. (DO..LOOP UNTIL). Esta estructura ejecuta un bloque de sentencias un número específico de veces. Se debe de utilizar cuando de antemano se sabe cuantas veces se va a repetir un proceso. El número de repeticiones no depende de las proposiciones dentro del ciclo. El número de veces se obtiene del planteamiento del problema o de una lectura que indica que el número de iteraciones se debe realizar para N ocurrencias. For contador = valorInicial To valorFinal [ Step paso ] <sentencias> Next Para colecciones o arreglos: For Each elemento In Variable <sentencias> Next Module NumerosImpares Sub main dim n as Integer Console.write(“Hasta que numero quieres") n=cint(Console.readLine()) For i as integer=1 To n step +2 Console.write(“{0} “,i) Next End Sub End Module La estructura Mientras se utiliza cuando no se sabe el número de veces a repetir un ciclo. Dicho número depende de las proposiciones dentro del ciclo. La entrada o repetición del ciclo depende de la evaluación de una expresión lógica y éste será ejecutado mientras la condición sea verdadera. Es decir cuando la condición sea falsa se finalizará la ejecución del ciclo. Evaluación al principio: While (condiciones) Do While (condiciones) <sentencias> Código [Exit While] [Exit Do] <sentencias> Código End While Loop Evaluación al final: Do <sentencias> [Exit Do] <sentencias> Loop While (condiciones) Imports System.Console Module Primos Sub Main() Dim c, n, mitad As Integer: Dim primo As Boolean Write("Tecla el numero a evaluar "):n = CInt(ReadLine()) mitad = n \ 2: c = 2 primo = True While ((primo) And (c <= mitad)) If ((n Mod c) = 0) Then primo = False End If c=c+1 End While If ((primo) And (n > 1)) Then WriteLine("Es primo") Else WriteLine("No primo") End If ReadLine() End Sub End Module La estructura Until(hasta) se utiliza cuando no se sabe el número de veces a repetir un ciclo. La repetición del ciclo depende de si la evaluación de la expresión lógica es falsa, es decir las sentencias dentro del ciclo se repiten hasta que la condición sea verdadera. Cuando la condición es verdadera se termina la ejecución del ciclo. Evaluación al principio: Do Until (Expresión lógica o condición) Código [Exit Do] Código Loop Evaluación al final: Do Código [Exit Do] Código Loop Until (Expresión lógica o condición) Imports System.Console Module gasto Sub Main() Dim gasto As Double Dim suma As Double = 0.0 Do Write("teclea un gasto") gasto = CDbl(ReadLine()) If (gasto > 0) Then suma = suma + gasto Loop Until (gasto < 0) 'Ciclo con salida condicionada Write("Total que gastastes={0}", suma) ReadLine() End Sub End Module Un método es un conjunto de instrucciones a las que se les da un determinado nombre de tal manera que sea posible ejecutarlas en cualquier momento sin tenerlas que reescribir sino usando sólo su nombre. A estas instrucciones se les denomina cuerpo del método, y a su ejecución a través de su nombre se le denomina llamada al método. Es la implementación de un algoritmo que representa una operación o función que un objeto realiza. El conjunto de los métodos de un objeto determinan el comportamiento del objeto. La ejecución de las instrucciones de un método puede producir como resultado un objeto de cualquier tipo. A este objeto se le llama valor de retorno del método y es completamente opcional, pudiéndose escribir métodos que no devuelvan ninguno. La ejecución de las instrucciones de un método puede depender del valor de unas variables especiales denominadas parámetros del método, de manera que en función del valor que se dé a estas variables en cada llamada la ejecución del método se pueda realizar de una u otra forma y podrá producir uno u otro valor de retorno. Al conjunto formado por el nombre de un método y el número y tipo de sus parámetros se le conoce como signatura o firma del método. La signatura o firma de un método es lo que verdaderamente lo identifica, de modo que es posible definir en un mismo tipo varios métodos con idéntico nombre siempre y cuando tengan distintos parámetros. Cuando esto ocurre se dice que el método que tiene ese nombre está sobrecargado. El método o subrutina main es invocado por el sistema cuando se ejecuta un programa (compilado). Cada llamada a métodos regresa al lugar que lo llamó. En VB.NET los métodos se implementan a través de procedimientos(subrutinas) y funciones: ◦ Sub (procedimientos), no devuelven valor ◦ Function (funciones), devuelven un valor ◦ Property (para manejar propiedades de objetos) Llamada o invocación: ◦ Sub ProcPrueba() ◦ Function CalcRaiz() Resultado = CalcRaiz() + 5 Sub [Ámbito] Sub NombreProcedimiento[(ListaParámetros)] [CódigoEjecutable] [Exit Sub | Return] [CódigoEjecutable] End Sub Function [Ámbito] Function NombreFunción[(ListaParámetros)] As TipoDato [CódigoEjecutable] [Return Valor] [NombreFunción = Valor] [Exit Function] [CódigoEjecutable] End Function Ámbito: capacidad de poder llamar a una subrutina o procedimiento desde un punto dado del código. Depende del nivel de acceso indicado en la declaración del Sub/Function: ◦ Ámbito { Sub | Function } Nombre ([Parámetros]) ◦ Public: Público Puede ser llamado desde cualquier módulo del proyecto. ◦ Private: Privado Sólo puede ser llamado desde el módulo en que se ha declarado. public sub escribe(byRef frase as String, byVal n as Integer) For i as interger=1 To n Console.writeline(frase) Next End Sub public Function suma(byVal a as integer,byVal b as integer) Dim resultado as integer resultado=a+b return (resultado) End Function Los parámetros son canales de comunicación para pasar datos entre programas y subprogramas en ambos sentidos. Los parámetros van asociados a variables, constantes, expresiones, etc., y, por tanto, se indican mediante los correspondientes identificadores o expresiones. Los parámetros que se utilizan en la llamada o invocación al subprograma se denominan parámetros actuales, reales o argumentos, y son los que entregan la información al subprograma. Los parámetros que la reciben en el subprograma se denominan parámetros formales o ficticios y se declaran en la cabecera del subprograma. Algunos procedimientos carecen de parámetros cuando se realizan tareas que no requieren recibir información del programa principal. En una llamada a un subprograma tiene que verificarse que: ◦ El número de parámetros formales debe ser igual al de actuales. ◦ Los parámetros que ocupen el mismo orden en cada una de las listas deben ser compatibles en tipo. cuando un parámetro actual se pasa por valor, el método o función miembro hace una copia del valor de éste en una posición de memoria idéntica en tamaño pero distinta en ubicación a la del parámetro actual y la asigna al parámetro formal correspondiente. como el método o función miembro trabaja a partir de sus parámetros formales, si durante la ejecución se modifica el valor de un parámetro formal correspondiente a un paso por valor, el contenido de la posición de memoria del parámetro actual no se verá alterado. Puede decirse que el paso por valor es un canal de transferencia de información con una sola dirección, es decir, de entrada al método o función miembro. El paso de las variables por valor le ofrece alguna seguridad a los programadores: los métodos no puede modificar de forma no intencionada una variable que está fuera de su ámbito. [Optional] [ByVal] [ParamArray] Nombre AsTipoDato Opción por defecto, se crea una nueva variable (se hace una copia) Imports System.Console Module ParametroValor Sub Main() Dim a As Integer=10 Dim b As Integer=20 prueba(a,b) „Parametros actuales o argumentos Write(“El valor de a={0} y el de b={1}”,a,b) End Sub 'Definición de una subrutina o procedimiento Sub prueba(ByVal a As Integer, ByVal b As Integer) 'Param. Formales a=a*100 b=b*100 End Sub End Module En el paso por referencia el parámetro formal queda asociado a la misma posición de memoria que su correspondiente parámetro actual, por lo que cualquier modificación que el método o función miembro realice sobre el contenido del parámetro formal se efectúa sobre el parámetro actual correspondiente y repercutirá en el programa principal o llamador. Si un parámetro actual es pasado por referencia, este parámetro no puede ser ni una constante, ni una expresión, sino que debe ser una variable u objeto, ya que no pueden modificarse los contenidos de una constante ni de una expresión. De todo esto se deduce que si no queremos que un método o función altere el contenido de un parámetro actual, es decir, de una variable del programa principal o invocador, debemos realizar paso por valor. Por el contrario, si queremos que un método o función altere el valor de un parámetro actual tenemos que pasarlo por referencia. Ambas variables utilizan la misma memoria. Los cambios afectan a la variable del código llamador. [Optional] [ByRef] [ParamArray] Nombre AsTipoDato Imports System.Console Module ParametroReferencia Sub Main() Dim a As Integer=10 Dim b As Integer=20 prueba(a,b) „Parametros actuales o argumentos Write(“El valor de a={0} y el de b={1}”,a,b) End Sub 'Definición de una subrutina o procedimiento Sub prueba(ByRef x As Integer, ByRef y As Integer) 'Param. Formales x=x*100 y=y*100 End Sub End Module Los parámetros actuales(invocación) deben de coincidir en el tipo de dato con los parámetros formales(signatura del método). Asociación entre los parámetros escritos en la llamada y los escritos en la declaración del procedimiento o función: ◦ Por posición Prueba (Importe, DiaHoy) ◦ Por nombre Prueba (Fecha:=DiaHoy, Cantidad:=Importe) VB necesita que un método declare el tipo de dato del valor que devuelve. Los métodos pueden devolver tipos de datos primitivos o tipos de datos de referencia. Los métodos utilizan el operador return para devolver un valor. Cuando el método es una Function debe contener una sentencia return. El tipo de dato del valor devuelto por la sentencia return debe corresponder con el tipo de dato que el método tiene que devolver; no se puede devolver un objeto desde un método que fue declarado para devolver un entero. Cuando se devuelva un objeto, el tipo de dato del objeto devuelto debe ser una subclase o la clase exacta indicada. Cuando se devuelva un tipo interface, el objeto retornado debe implementar el interface especificado. Varias versiones de un procedimiento (mismo nombre), pero con listas de parámetros diferenciadas en su número, orden o tipo. Overloads Sub Datos() ' código del procedimiento ' ............ End Sub Overloads Sub Datos(ListaParametrosA) ' código del procedimiento ' ............ End Sub Overloads Function Datos(ListaParametrosB) As TipoDatoRetorno ' código del procedimiento ' ............ End Function public sub escribe() For i as interger=1 To 10 Console.writeline(“HOLA MUNDO”) Next End Sub public sub escribe(byVal n as Integer) For i as interger=1 To n Console.writeline(“HOLA MUNDO”) Next End Sub public sub escribe(byRef frase as String, byVal n as Integer) For i as interger=1 To n Console.writeline(frase) Next End Sub