Fundamentos de Programación
Fundamentos de Programación
Definición
Un problema es un conjunto de cuestiones que se plantean para ser resueltas.
En Informática: se busca la solución utilizando computadoras, mediante un
programa (buscando el mejor resultado en tiempo y forma).
Planteo
QUE me están pidiendo;
CÓMO resolverlo;
CON QUÉ, expresar la supuesta solución (recursos, herramientas...).
Dicho de otro modo, responde al siguiente orden de planteo:
1) ESTRATÉGICO
2) LÓGICO
3) HERRAMENTAL
Enunciado
Debe estar dado en forma completa, correcta y sin ambigüedades. El problema
tiene una naturaleza, su particularidad, y debo reconocerla para saber si puedo
enfrentarlo, para ello se sugiere tener en cuenta:
a) CONOCIMIENTO
b) HABILIDAD
c) EXPERIENCIA
es decir:
- conocer los elementos, propiedades, leyes, teoría;
- poseer cualidades que me permitan alcanzar la solución, creatividad;
- toma de decisiones, naturaleza que me de mayor seguridad y garantía de
resolución.
Debo sentirme en condiciones de responder, ya que no entiendo lo que no
conozco.
CONCEPTO DE ALGORITMO
Para ser un programador eficaz se necesita aprender a resolver problemas de
un modo riguroso y sistemático.
Los algoritmos son más importantes que los lenguajes de programación o las
computadoras. Un lenguaje de programación es tan sólo un medio para
expresar el algoritmo, y una computadora es sólo un procesador para
ejecutarlo.
Definición
Un algoritmo es un conjunto de tareas o pasos en una cantidad finita que se
ejecutan en un
orden determinado, y para determinada situación inicial se resuelve el problema
en un
tiempo finito.
situación ---------> algoritmo ----------> solución inicial
Características que debe cumplir
1) Debe ser correcto; responder a lo que me piden y resolver el problema;
2) Eficiente en cuanto a recursos y tiempo;
3) Claro;
4) Flexible; poder adaptarse a pequeños cambios de lógica;
5) Preciso; e indicar el orden de realización de cada paso;
6) Estar definido: si se sigue un algoritmo dos veces, se debe obtener el
mismo resultado
cada vez;
7) Ser finito: se debe terminar el algún momento; debe tener un número finito
de pasos;
8) Fiable ó confiable; estar acorde a lo anterior en cuanto a propuesta de
solución.
La definición de un algoritmo debe describir tres partes: entrada, proceso y
salida.
Instrucciones a la computadora
El término instrucción (operación realizable) se suele referir a los lenguajes
máquina y bajo nivel, reservando el término sentencia o proposición para los
lenguajes de alto nivel.
Las instrucciones básicas y comunes a todos los lenguajes de programación se
pueden condensar en cuatro grupos:
o Instrucciones de entrada / salida: instrucciones de transferencia de
información entre dispositivos periféricos y la memoria central;
o Instrucciones aritmético / lógicas: instrucciones que ejecutan operaciones
aritméticas y lógicas;
o Instrucciones selectivas: instrucciones que permiten la selección de tareas
alternativas en función de los resultados de diferentes expresiones
condicionales;
o Instrucciones repetitivas: Instrucciones que permiten la repetición de
secuencias de instrucciones un número determinado o indeterminado de veces.
El que se lleve a cabo una instrucción se denomina ejecución.
Lenguaje máquina
Son aquellos que están escritos en lenguajes directamente inteligibles por la
máquina, ya que sus instrucciones son cadenas binarias que especifican una
operación, y las posiciones (dirección) de memoria implicadas en la operación
se denominan instrucciones de máquina o código máquina.
Las ventajas de programar en lenguaje máquina es la posibilidad de cargar
(transferir un programa a la memoria) sin necesidad de traducción posterior, lo
que supone una velocidad de ejecución superior a cualquier otro lenguaje de
programación.
Los inconvenientes que hacen que este lenguaje no sea recomendado son:
dificultad y lentitud en la codificación, poca fiabilidad, dificultad grande de
verificar y poner a punto los programas, y que los programas sólo son
ejecutables en el mismo procesador.
Paradigma de programación
Definición
Conjunto de patrones conceptuales que moldean la forma de resolver y pensar
un problema, diseñar un algoritmo y estructurar un programa. Es decir, va a ser
tenido en cuenta en el armado del programa.
Se lo puede entender como un estilo de programación marcado como un
conjunto de criterios para manejar el programa.
Clasificación general
-Grupo de paradigmas con efectos laterales: Imperativo, ensamblador,
orientado a objetos;
-Grupo de paradigmas declarativos: funcional, lógico.
P. declarativos
Se basan en fundamentos matemáticos, no tienen en cuenta la estructura
interna de la pc.
(sistema binario: números/caracteres). el fucional se basa en que su célula no
es la variable sinó la función; el lógico se basa en proposiciones lógicas
(inteligencia artificial).
// ¿cómo pensar un problema?: dentro del paradigma imperativo. //
Traductores de lenguaje
Los traductores de lenguaje son programas que traducen a código máquina los
programas fuente escritos en lenguajes de alto nivel; y se dividen en
compiladores e intérpretes.
Un intérprete es un traductor que toma un programa fuente, lo traduce y a
continuación lo ejecuta.
Un compilador es un programa que traduce a lenguaje máquina los programas
fuente escritos en lenguajes de alto nivel.
_Numéricos:
-Entero
-Real
_Caracter:
-Cadena de caracteres: string >> "el"
-Cadena nula: " "
-Caracter en blanco: b
_Lógico: -Verdadero
-Falso
Los tipos de datos primitivos van a tener operaciones válidas, expresadas con
la sintaxis admitida:
_Numéricos
+ - * / **
(orden >> comparaciones; Ej.: entero (3,8)= 3)
_Caracter
(orden >> comparaciones; Ej.: numb1>numb2)
-Concatenación de cadenas (unión) +
(no es conmutativo)
dia:= "lunes"
tex:= "hoybesb"
nombredia:= tex + dia
-Subcad (T.P.C)
Permite como resultado una subcadena dentro de un valor que puede estar
dado por una expresión T, luego explicar con que posición P, y la cantidad de
caracteres C que me interesa extraer.
leer: dia
tex:= "hoybesb"
nombredia:= tex + dia
imprimir: subcad (nombredia, 8, 6) // Es decir, va a imprimir a partir de la
posición 8 inclusive, los 6 caracteres que se encuentran a continuación: va a
imprimir sólo el nombre del día. //
-Long (T)
Cantidad de caracteres que conforman T.
leer: nombredia
imprimir: subcad (nombredia, 8, long(nombredia) - 7)
_Lógicos
Las operaciones que se pueden realizar no son de orden, sino de
igualdad / desigualdad:
d1 <> d2 (distintos) funciones primitivas
r = x and (y)
or (o)
not (negación)
Constantes y variables
Una constante es un componente que va a tener un identificador y un valor
asignado en la declaración, a través del cual se conoce el tipo de dato. Es un
valor constante: no se va a poder modificar durante todo el transcurso del
programa.
Una variable es una referencia abstracta de una zona de memoria en donde se
guarda/almacena un dato; su valor puede cambiar durante el desarrollo del
algoritmo y/o durante la ejecución del programa.
//Memoria: conjunto de celdas o zonas referenciadas mediante direcciones
absolutas, que se manejan en el paradigma ensamblador.//
Variable: -Identidad (declaración);
-Tipo (declaración);
-Valor (ejecución).
Constante: -identificador;
-Valor (tipo).
Expresiones
Las expresiones son combinaciones de constantes, variables, símbolos de
operación, paréntesis y nombres de funciones especiales. Una expresión
consta de operandos y operadores, y según sea el tipo de objetos que
manipulan, las expresiones se clasifican en aritméticas, lógicas y carácter.
Funciones internas
Las operaciones que se requieren en los programas exigen en numerosas
ocasiones, además de las operaciones aritméticas básicas, un número
determinado de operadores especiales que se denominan funciones internas,
incorporadas o estándar.
Cuando se le envía una cierta cantidad de valores a una función, ésta tiene
como objetivo devolver un único valor, el cuál le es asignado a una variable.
La operación de asignación: instrucción básica
La operación de asignación (dentro del Paradigma Imperativo) es el modo de
asignarle valores a una variable. Esta operación se conoce como instrucción o
sentencia de asignación cuando se refiere a un lenguaje de programación.
La nomenclatura en el lenguaje pseudocódigo es la siguiente:
<var>:=<exp> // nombre:=expresión //
EJ1) Desarrollar el algoritmo en pseudocódigo que me permita calcular e
informar el promedio de dos valores numéricos ingresados.
CONCEPTO DE PROGRAMA
Un programa es un conjunto de instrucciones (órdenes) que producirán la
ejecución de una determinada tarea; es la conversión del algoritmo haciendo
uso de los constructores formales de un lenguaje de programación para ser
ejecutado en una pc.
Atributos, características
-debe estar definido: único punto de entrada/salida, que se comprenda la
secuencia de las acciones;
-debe ser confiable;
-eficiente, en cuanto al uso de los recursos de la mejor manera posible;
// Recursos:
-tiempo (análisis de cantidad de acciones/operaciones);
-espacio (asociado a la cantidad de datos a considerar en el algoritmo). //
-debe ser claro, tener una documentación;
-debe ser portable: permitir ser ejecutado en distintas pcs con un mínimo de
cambios.
El proceso de programación es un proceso de solución de problemas, y el
desarrollo de un programa requiere las siguientes fases:
1-Definición y análisis del problema.
2-Diseño de algoritmos:
-diagrama de flujo
-diagrama N-S
-pseudocódigo
3-Codificación del programa.
4-Depuración y verificación del programa.
5-Documentación externa.
6-Mantenimiento.
En todos los casos anteriores, llevar a cabo simultáneamente la adecuada
documentación interna.
Contadores y acumuladores
VARIABLE ACUMULADORA: Su función es acumular valores, distintos o no,
en forma parcial; valores resultantes de sumas sucesivas. Se debe inicializar
siempre, de lo contrario el valor que esta tome va a incluir el acumulado de
todas las veces que corrió el programa. Generalmente se inicializa al comienzo
o casi al final del programa. El modo de acumularle valores es siempre el
mismo:
Interruptores
Un interruptor o conmutador (switch) – llamado a veces, indicador o bandera
(flag) – es una variable que puede tomar diversos valores a lo largo de la
ejecución del programa, y que permite comunicar información de una parte a
otra del mismo.
Comentarios
La documentación de un programa es el conjunto de información interna y
externa al programa, que facilitará su posterior mantenimiento y puesta a punto.
La documentación interna es la que acompaña en el código o programa fuente
y se realiza a base de comentarios significativos. Estos comentarios se
representan con diferentes notaciones, según el tipo de lenguaje de
programación.
La documentación externa se realizará con información ajena al programa, y
será proporcionada por el programador.
CAPITULO V
INTRODUCCION A LA PROGRAMACION ESTRUCTURADA
Programación modular
Una estrategia para la resolución de un problema complejo con computadoras,
es la división o descomposición del mismo en subproblemas más pequeños.
Estos subproblemas se implementan mediante módulos o subprogramas. Los
subprogramas son una herramienta importante para el desarrollo de algoritmos
y programas, ya que un proyecto de programación normalmente se compone
de un programa principal, y de un conjunto de subprogramas, los cuales son
llamados o invocados desde el programa principal.
En la programación modular, el programa se divide en módulos, cada uno de
ellos independiente de los restantes, que ejecutan cada uno una única actividad
o tarea. Cada uno de ellos se analiza, codifica y pone a punto por separado.
Cada programa contiene un módulo denominado programa principal que
controla todo lo que sucede; de allí se transfiere el control de ejecución a
submódulos de modo que ellos puedan ejecutar sus funciones o
procedimientos; sin embargo, cada submódulo devuelve el control al módulo
principal cuando se haya completado su tarea. Si la tarea asignada a cada
submódulo es demasiado compleja, éste deberá dividirse en otros módulos
más pequeños. El proceso sucesivo de subdivisión de módulos continúa hasta
que cada módulo tenga una tarea específica que ejecutar.
Los módulos son independientes en el sentido en el que ningún módulo puede
tener acceso directo a cualquier otro módulo, con excepción del módulo al que
llama o invoca, y sus propios submódulos. Sin embargo, los resultados
producidos por un módulo pueden ser utilizados por cualquier otro módulo
cuando se transfiere a ellos el control de ejecución.
Programación estructurada
El término programación estructurada se refiere a un conjunto de técnicas que
aumentan la productividad del programa reduciendo el elevado tiempo
requerido para escribir, verificar, depurar y mantener los programas.
La programación estructurada es el conjunto de técnicas que incorporan:
o Diseño descendente (Top-Down).
o Recursos abstractos.
o Estructuras básicas.
DISEÑO DESCENDENTE
El diseño descendente es el proceso mediante el cual un problema se
descompone en una serie de niveles o pasos sucesivos de refinamiento
(stepwise). La metodología descendente consiste en efectuar una relación
entre las sucesivas etapas de estructuración, de modo que se relacionen unas
con otras mediante entradas y salidas de información.
RECURSOS ABSTRACTOS
Descomponer un programa en términos de recursos abstractos consiste en
descomponer una determinada acción compleja en función de un número de
acciones más simples, capaces de ser ejecutadas por una computadora, y que
constituirán sus instrucciones.
DESCRIPCIÓN
<variable de control> : Es una variable de tipo Entero, que nos permite
controlar la repetición de la secuencia de instrucciones que se encuentra dentro
de la estructura de control.
<desde> : tipo Entero; nos indica el valor inicial de la repetición, puede llegar a
ser un valor constante, una variable, o una operación.
<hasta> : tipo Entero; nos indica el valor hasta el cual nosotros queremos llegar
con la repetición. Puede llegar a ser un valor constante, una variable o una
operación.
<paso> : tipo Entero; nos indica el paso de incremento de la variable de
control, generalmente es de a uno (se le suma uno a la variable de control),
pero se podrían plantear pasos de mas de uno, e inclusive pasos negativos
(decrementar la variable de control).
Las instrucciones que se encuentran dentro del bucle se ejecutan una vez para
cada valor de la variable de control, desde el valor inicial hasta el valor final,
con el incremento de a pasos.
Ejemplos de control
a) I =1,100,1 >> 1,2,3...99,100 |101
b) P = 2,100,2 >> 2,4,6...100 |102
c) D = 1,10 >> 1,2...9,10 |11 //Por defecto, el paso es 1 //
d) F = 20,1,-1 >> 20,19,18...1 |0
e) X = 1, totsillas >> -si totsillas= 5 >> 1,2,3,4,5
(0,99)
-si totsillas=Ø >> ?
EJ3) Una empresa tiene 13 sucursales de las cuales se informa la cantidad de
facturas confeccionadas entre 0 y 99 con hasta 99 artículos en cada una, con
un importe total máximo de
$10.000 dentro del cual se cobran $13 del flete.
Informar:
-cantidad total de facturas
-cantidad de artículos vendidos por sucursal
-importe a reservar para amortizar el flete.
Análisis:
-13 sucursales
-c/u entre 0 y 99 facturas
- c/ factura entre 1 y 99 artículos
-máximo de importe $10.000
-flete $13
Diseño:
(variables)
cantfactot //será necesario inicializarla en 0 //
recauda //inicializar //
impfac //var. de entrada: lectura//
artfac //entrada //
cantfacsuc //entrada //
cantartsuc //inicializar //
impflete //var. de salida: impresión //
(constantes)
cantsuc = 13
costoflete = 13
Codificación
Programa: ventas
Constantes
CANTSUC=13
COSTOFLETE=13
Variables
(ISUC, IFAC) entero 3 // índices: sucursal y factura //
(artfac, cantfacsuc) entero 2 // articulos x factura, cant de facturas en sucursal //
cantfactot entero 4 // cantidad de facturas en total //
(imfac, cantartsuc, impflete) entero 5 // importe factura, cant.artículos sucursal,
importe flete//
recauda entero 8 // recaudación //
Hacer
cantfactot:= 0
recauda:= 0
Repetir Para: ISUC:= 1,CANTSUC
cantartsuc:= 0
Leer: CANTFACSUC
Repetir Para: IFAC:= 1,CANTFACSUC
Leer: imfac, artfac
recauda:= recauda + imfac
cantartsuc:= cantartsuc + artfac
Fin Repetir Para
cantfactot:= cantfactot + cantfacsuc
Imprimir: cantfactot, recauda
Fin Repetir Para
Fin Hacer
Fin Programa
PREDICADO
Definición
Es una condición lógica o expresión lógica.
-Expresión lógica
-Simple (sin conectores lógicos); // Conectores lógicos: -and
-Compuesta (uso de conectores). -or //
-Variable lógica
-Verdadero
-Falso
-Constante lógica:
-Verdadero
-Falso
Ejemplos
1. (resultado >= 4)
2. (libre = verdadero)
3. ((x >= I) and (x <= J)) and (tope < 5) //resultará verdadero o falso//
// I <= x <= J //
Repetición condicional; “Repetir Mientras”
La estructura repetitiva mientras (while) es aquella en la cual el cuerpo del
bucle se repetirá mientras se cumpla una determinada condición. En
pseudocódigo:
SINTAXIS
Repetir Mientras (<condición o condiciones compuestas>)
...
..
..(instrucciones)
..
...
Fin Repetir Mientras
DESCRIPCIÓN
<condición o condiciones compuestas> : En este sector de la estructura, se
debe expresar la condición que nos indique que mientras permanezca
verdadera, se siguen repitiendo las instrucciones dentro del bucle; se observa
que no hay una repetición fija, sino que está condicionada, no se sabe cuantas
veces se va a repetir.
-Condicional:
-Verdadero >> repite otra vez
-Falso >> deja de repetir
Bucles infinitos
Algunos bucles no exigen fin y otros no encuentran el fin por algún error en su
diseño. Un
bucle que nunca termina se denomina bucle infinito. Los bucles sin fin, no
intencionados,
son perjudiciales para el programa, y se deben evitar siempre.
Codificación
Programa: Prueba entre colegios
Variables
(nota, PROM) real 4,2
colegio entero 2
PORC real 5,2
acumnota real 6,2 // variable acumuladora //
cantcol5 entero 2 // variable contadora //
cantotros entero 3 // contadora //
Hacer
acumnota:= 0
cantcol5:= 0
cantotros:= 0
Repetir Mientras "ingresar nota y colegio" //sin desarrollar//
Leer: nota, colegio
Si: (colegio = 5) Entonces
cantcol5:= cantcol5 + 1
acumnota:= acumnota + nota
Sino
cantotros:= cantotros + 1
Fin Si
Fin Repetir Mientras
PROM:= acumnota / cantcol5
PORC:= cantotros / (cantotros + cantcol5) * 100
Imprimir: "promedio=", PROM, "porcentaje=", PORC
Fin Hacer
Fin Programa
Alternativa múltiple: CASO
La estructura de decisión múltiple evaluará una expresión que podrá tomar n
valores distintos; según el valor que tome, se realizará una de las n acciones.
La debo utilizar en una situación en la que se deben realizar diferentes
acciones que dependen de una variable. El objetivo es eliminar el anidamiento
excesivo.
En pseudocódigo:
Caso <variable>
(condición 1): (instrucciones)
(condición 2): (instrucciones)
....
(condición n): (instrucciones)
En otro caso:
....
....(instrucciónes)
....
Fin Caso
Análisis
Máximo p/ carga 1000 kg
Máximo contenedores 8000 kg // 5000 tope teórico //
tipos:
A
B
C
D: 30% jugo
70% mermelada
Datos de entrada:
N° de día (1, 2 ó 3), tipo de fruta y cantidad.
Datos de salida:
Informe cada 2 días.
Diseño
carga // lectura //
conten // acum. Va a chequear que el contenedor no pase las 8 ton.//
(A, B, C) // acum. //
jugo // acum. //
merme // acum. //
dia // lectura //
tipo //lectura//
Codificación
Programa: Frutas
Variables
carga entero 4
conten entero 4
(A, B, C) entero 4
(jugo, merme) entero 4
dia entero 1
tipo caracter 1
Hacer
conten:= 0
A:= 0
B:= 0
C:= 0
jugo:= 0
merme:= 0
dia:= 1 //obligo al programa a ejecutarse al menos 1 vez//
Repetir Mientras (dia <3)
Imprimir: "ingrese carga en kg."
Leer: carga
Imprimir: "ingrese calidad"
Leer: tipo
conten:= conten + carga
Si: (conten=8000) Entonces
Imprimir: "Los contenedores han llegado a su límite."
Sino
Si: (conten > 8000) Entonces
Imprimir: "Los contenedores han
//anidamiento// sobrepasado su capacidad!"
Fin Si
Fin Si
Caso tipo
(tipo="A"): A:= A + carga
(tipo="B"): B:= B + carga
(tipo="C"): C:= C + carga
(tipo="D"): jugo:= jugo + (30 * carga / 100) // 30 % //
merme:= merme + (70 * carga / 100)
Fin Caso
Imprimir: "ingrese el número de día"
Leer: dia
Fin Repetir mientras
Imprimir: "cantidad de frutas tipo A=", A,"; tipo B=", B,"; tipo C=", C,"frutas para
jugo=",
jugo,"; para mermelada=", merme
Fin Hacer
Fin Programa
CAPITULO VI
SUBPROGRAMAS
PROCEDIMIENTOS Y FUNCIONES
FUNCIONES
Una función es un subprograma que recibe, como argumentos o parámetros,
datos de tipo numérico o no numérico, y devuelve un único resultado.
Las funciones incorporadas al sistema se denominan funciones internas, o
intrínsecas; las funciones definidas por el usuario se llaman funciones externas.
El algoritmo o programa invoca la función con el nombre de esta última en una
expresión seguida de una lista de argumentos que deben coincidir en cantidad,
tipo y orden con los de la función que fue definida.
Declaración de funciones
En pseudocódigo:
SINTAXIS
Funcion nombrefun(lista de parámetros): Tipo
..
...(Declaraciones locales)
..
Hacer
..(cuerpo ejecutable de la función)
...
nombrefun:= <valor de la función> // 1 //
Fin Hacer
Fin Funcion
DESCRIPCIÓN
nombrefun : es el nombre indicatorio de la función.
lista de parámetros: es la lista de parámetros formales. Esta lista NO puede
ser vacía.
Tipo: es el tipo de resultado que devuelve la función.
// 1 // En el cuerpo de la función debe existir una sentencia que asigne valor
explícitamente
al nombre de la función.
Para que las acciones descritas en un subprograma función sean ejecutadas,
se necesita que éste sea invocado desde un programa principal o desde otros
subprogramas a fin de proporcionarle los argumentos de entrada necesarios
para realizar estas acciones.
Invocación a las funciones
Una función definida por el usuario se llama haciendo referencia a su nombre.
En pseudocódigo:
..
... //líneas de programa//
...
nombrefun(lista de parámetros reales o actuales)
...
..
Declaración de procedimientos
Al igual que cualquier otra variable, los procedimientos se deben declarar
dentro del cuerpo del programa que los usa. La declaración del mismo NO
indica que debe ejecutarse ese procedimiento, sino que le indica a la
computadora cuales son las instrucciones del mismo y donde están localizadas.
En pseudocódigo:
SINTAXIS
Procedimiento nombre (lista de parámetros formales)
Declaraciones locales
...
Hacer
...
cuerpo del procedimiento
...
Fin Hacer
Fin Procedimiento
DESCRIPCIÓN
nombre: se refiere al nombre del procedimiento y debe ser un identificador
válido.
lista de parámetros formales: es el conjunto de valores que sirven para pasar
y/o devolver información a/desde el procedimiento, desde/a el programa
llamador. En la lista se especifica cada parámetro indicando nombre y tipo de
cada uno de ellos. Esta lista puede ser vacía, es decir, existen procedimientos
sin parámetros.
La posición adecuada de la declaración de los procedimientos está entre la
declaración de las variables y el cuerpo del programa principal:
Programa nombreprog
Constantes
...(declaración de las constantes)
Variables
...(declaración de las variables)
Procedimientos y funciones
...(declaración de los procedimientos y/o las funciones)
..
..
Hacer
..
...(cuerpo del programa principal)
..
Fin Hacer
Fin Programa
....
La sentencia nombredelprocedimiento acompañada de la liste de parámetros
(si es que ésta existe), es la que inicia la ejecución del procedimiento. El control
lo toma el procedimiento, ejecuta secuencialmente cada una de sus sentencias,
y cuando termina de ejecutársele devuelve el control al programa llamador,
ejecutándose la sentencia inmediatamente siguiente a la de la llamada.
PROCEDIMIENTO FUNCIÓN
Puede devolver uno, muchos o ningún resultado.
Su nombre no está asociado a ninguno de los resultados que obtiene.
Existen procedimientos sin parámetros.
Devuelve un único resultado.
El resultado lo devuelve en el nombre de la función, que es el identificador.
No existen funciones sin parámetros.
Paso de parámetros
Existen diferentes métodos para el paso de parámetros a subprogramas. Es
preciso conocer el método adoptado por cada lenguaje, ya que la elección
puede afectar a la semántica del código. Los parámetros pueden ser
clasificados como:
O Entradas (E): las entradas proporcionan valores desde el programa que
llama, y se utilizan dentro del procedimiento.
O Salidas (S): las salidas proporcionan los resultados del subprograma.
O Entradas/Salidas (E/S): un solo parámetro se utiliza para mandar
argumentos a un programa y para devolver resultados.
Los métodos mas empleados para realizar el paso de parámetros son:
o Paso por valor (parámetro valor)
o Paso por referencia o dirección (parámetro variable)
o Paso por nombre
o Paso por resultado
Los parámetros formales (locales al subprograma) reciben como valores
iniciales los valores de los parámetros reales, y con ellos se ejecutan las
acciones descritas en el subprograma.
EFECTOS LATERALES
Las modificaciones que se produzcan mediante una función o procedimiento en
los elementos situados fuera del subprograma se denominan efectos laterales.
En procedimientos
Si un procedimiento modifica una variable global (distinta de un parámetro real),
éste es un efecto lateral. Por ello, excepto en contadas ocasiones, no debe
aparecer en la declaración del procedimiento. Si se necesita una variable
temporal en un procedimiento, se debe utilizar una variable local, no una global.
Si se desea que el procedimiento modifique el valor de una variable global,
utilícela como el parámetro real en una llamada al procedimiento.
En Funciones
Una función puede tener parámetros variables además de parámetros valor en
la lista de parámetros formales. Una función puede cambiar el contenido de una
variable global y ejecutar instrucciones de entrada/salida. Estas operaciones se
conocen como parámetros laterales, y se deben evitar.
RECURSIÓN (recursividad)
Un subprograma que se puede llamar a sí mismo se llama recursivo. La
recursión puede ser utilizada como una alternativa a la repetición o estructura
repetitiva. La escritura de un procedimiento o función recursiva es similar a sus
homónimos no recursivos; sin embargo, para evitar que la recursión continúe
indefinidamente, es preciso incluir una condición de terminación.
CAPITULO VII
ESTRUCURAS DE DATOS.
ARREGLOS
Un arreglo es una secuencia de posiciones de memoria a las que se puede
acceder directamente, que almacenan valores del mismo tipo, los cuales se
identifican por su posición, que en pseudocódigo comienza en 1.
DATOS ESTRUCTURADOS:
Estáticos:
Arreglo Vector
Arreglo Matriz
Registro
Archivo (fichero)
Conjunto
Cadena
Dinámicos:
Lista (pila / cola)
Lista enlazada
Árbol
Grafo
(Estructuras homogéneas)
(Estructuras heterogéneas)
Los tipos de datos simples o primitivos no están compuestos de otras
estructuras de datos.
Las estructuras de datos estáticas son aquellas en las que el tamaño
ocupado en memoria se define antes de que el programa se ejecute y no puede
modificarse dicho tamaño durante la ejecución del programa.
Las estructuras de datos dinámicas no tienen las restricciones o limitaciones
en el tamaño de memoria ocupada que son propias de las estructuras
estáticas.
Los tipos de datos simples tienen como característica común que cada
variable representa a un elemento.
Los tipos de datos estructurados tienen como característica común que un
identificador (nombre) puede representar múltiples datos individuales, pudiendo
cada uno de éstos ser referenciado independientemente.
ARREGLOS
Un arreglo (matriz o vector) es un conjunto finito y ordenado de elementos
homogéneos. La propiedad “ordenado” significa que el elemento primero,
segundo, tercero,..., enésimo de un arreglo puede ser identificado. Los
elementos de un arreglo son homogéneos, es decir, del mismo tipo de dato.
Cada componente de un arreglo se denota, explícitamente, y es accedida,
directamente, mencionando el nombre del arreglo seguido de una expresión
encerrada entre paréntesis, a la que llamamos índice del arreglo.
La cantidad de componentes del arreglo se india explícitamente cuando se
declara el mismo, y queda desde entonces INVARIABLE. A ese número lo
llamamos dimensión del arreglo.
El índice del arreglo toma valores entre uno y la dimensión del mismo. Si se
direcciona una posición que no se encuentra entre dichos límites, se producirá
un error de ejecución, pues se estará intentando acceder a una zona de
memoria indefinida (pues el vector está definido entre las posiciones 1 y
dimensión).
A un arreglo lineal se lo denomina unidimensional, y se utiliza un solo índice
para denotar sus elementos. A un arreglo tipo matricial se lo denomina arreglo
bidimensional o de dos dimensiones, y usa dos índices para determinar sus
elementos.
Declaración de vectores
Los vectores se definen en la zona de declaración del programa. Dicha
definición se encabeza con la palabra reservada “Tipos estructurados”. Para
declararlos se explicita el nombre del mismo, acompañado de su dimensión, y a
continuación se especifica el tipo de sus elementos. Todos los elementos de un
vector serán del mismo tipo.
En pseudocódigo:
Programa.....
Tipos estructurados
<nom_vector>= Arreglo [Dimensión] : <tipo> //declaro un vector...//
Variables
<nom_variable>: <nom_vector> //y luego una variable de tipo//
//vector, donde alojarlo//
Hacer
...
Fin Hacer
Fin Programa.....
Declaración de matrices
Las matrices se definen en la zona de declaraciones del programa, dentro del
bloque de
Tipos estructurados. Para ello se especifica el nombre de la misma seguido de
la cantidad
total de filas y de columnas, separadas por coma y encerradas entre corchetes,
y luego se
escribe el tipo y precisión de los elementos. En pseudocódigo:
Programa.....
Tipos estructurados
<nom_matriz>= Arreglo [filas,columnas] : <tipo> //declaro una matriz...//
Variables
<nom_variable>: <nom_matriz> //y luego una variable de tipo//
//matriz, donde alojarla//
Hacer
...
Fin Hacer
Fin Programa.....
La declaración reserva lugar en la memoria, lo asocia con el nombre de la
matriz, pero su contenido queda indeterminado, como ocurre con las variables.
Es necesario hacer una operación de asignación de valores, para que la matriz
tenga elementos.
EJ7) Declaración y asignacion de valores a una matriz.
Programa: 2D
Tipos Estructurados
//Declaro de la forma <nom_matriz>= Arreglo [Dimensión] : <tipo> //
MAT= Arreglo [1..5, 1..5]: entero 7
Variables
M: MAT //declaro una variable de tipo matriz MAT//
(I, J): entero 1 //índices//
Hacer
Repetir Para: I:= 1, 5, 1 // filas //
Repetir Para: J := 1, 5, 1 //columnas //
M [I, J]:= 0 //inicializo en 0 toda la matriz//
//sino también podría ser: Leer: M [I, J] //
Fin Repetir Para
Fin Repetir Para
Fin Hacer
Fin Programa
CÓDIGO ASCII
El código ASCII básico utiliza 7 bits (dígitos binarios, 0, 1)) para cada carácter a
representar, lo que supone un total de 2 7 (128) caracteres distintos. El ASCII
ampliado utiliza 8 bits y, en este caso, consta de 256 caracteres:
o Alfabéticos
o Numéricos
o Especiales
o De control: son caracteres no imprimibles y que realizan una serie de
funciones relacionadas con la escritura, transmisión de datos, separador de
archivos, etc.
CÓDIGO EBCDIC
Es muy similar al ASCII, incluyendo también, además de los caracteres
alfanuméricos y especiales, caracteres de control.
Cadena de caracteres
La longitud de una cadena es la cantidad de caracteres que contiene. La
cadena que no contiene ningún caracter se denomina cadena nula, y su
longitud es cero; no se debe confundir con una cadena compuesta sólo de
espacios en blanco, ya que esta última tendrá como longitud el número de
blancos de la misma.
La representación de las cadenas suele ser con comillas simples o dobles.
Una subcadena es una cadena de caracteres que ha sido extraída de otra
cadena de mayor longitud.
PROCESAMIENTO DE DATOS
Acciones básicas de manejo de datos
(sobre arreglos que ya están cargados en memoria).
Ordenamiento
Logra optimizar el almacenamiento / acceso a los datos:
-Simple (arreglo; vector)
-complejo (lista)
Búsqueda
Consiste en poder acceder a un dato dentro de un conjunto de datos,
dependiendo si el último está ordenado o no:
-Sobre un conjunto ordenado >> búsqueda binaria
-Sobre uno desordenado >> búsqueda secuencial
Intercalación
Se refiere a mezclar datos de diferentes conjuntos, es decir unir varios
conjuntos para crear uno nuevo:
-Previamente ordenados >> intercalo
-Sin ordenar >> intercalo y luego ordeno
ORDENAMIENTO
El ordenamiento provee un método para organizar la información, facilitando de
esta manera la recuperación de datos específicos. Imaginemos lo difícil que
sería usar un diccionario que no estuviese ordenado alfabéticamente.
La elección de un algoritmo debe tener en cuenta el uso eficiente de la
memoria que se tiene disponible, así como también el tiempo de ejecución del
mismo.
Clasificación
Simple (arreglo; vector)
Complejo (lista)
Principios Básicos
(de ordenamiento de datos entre sí)
Selección
Intercambio
Inserción
Selección
Compara contenidos; mantiene fija una posición "i", y la compara con otra "j",
luego con "j + 1" y así sucesivamente hasta recorrer completamente el vector.
Intercambio
Compara una posición "j" contra una "j + 1".
Inserción
Construye un grupo ordenado final cuando los datos que van llegando tienen
un manejo especial; del conjunto original genera un subconjunto "ordenado" en
el que va insertando datos y los coloca entre los valores mayor y menor
correspondientes, desplazando otros datos.
MÉTODO DE SELECCIÓN
Repetir Para: I := 1, n - 1 //controla al cantidad de pasadas//
Repetir Para: J := I + 1, n //manejo el valor de posición / índice//
Si: (V[I] < V [J]) Entonces //comparación de elementos en forma ascendente//
AUX:= V[I]
V[I]:= V[J]
V[J]:= AUX
Fin Si
Fin Repetir Para
Fin Repetir Para
- Cantidad de operaciones en el orden de n al cuadrado
Prueba de escritorio
MÉTODO DE INSERCIÓN
//Tarea adicional: el índice debe estar en la posición correcta//
BÚSQUEDA
El problema de la búsqueda se refiere a localizar un dato dentro de un
conjunto; el dato a localizar puede o no estar dentro de los elementos del
conjunto. La búsqueda de un elemento determinado es un área muy frecuente;
por ejemplo buscar por el nombre y apellido de un alumno de Algoritmos el
resto de sus datos.
Debido a la importancia del tema, se han desarrollado una serie de algoritmos,
donde la eficiencia de los mismos se mide por la velocidad con que se
encuentra el dato buscado.
Formalmente, al problema de búsqueda lo podemos enunciar así:
Dado un conjunto de n elementos distintos, y un dato k llamado argumento,
determinar:
-si k pertenece al conjunto, y en ese caso, indicar cual es su posición en el
mismo;
-si k no pertenece al conjunto.
BÚSQUEDA SECUENCIAL
La manera más sencilla y natural para encontrar un argumento k, dentro de un
conjunto es comparar k con cada elemento hasta encontrarlo o bien, hasta
agotar el conjunto. En pseudocódigo:
Programa Busco Tipos estructurados
V= ARREGLO[1..30]: entero 2
Variables
K : entero 2
I : entero 2
Esta : bolean
VEC : V
INTERCALACIÓN (MEZCLA)
El vector V3 fue creado a partir de V1 y V2, mezclando los valores contenidos
en los dos últimos.
Para realizar este proceso, se deben tener en cuenta los siguientes factores:
-Los vectores a mezclar no suelen tener la misma longitud;
-La longitud del tercer vector siempre resulta de la suma de las long. de los dos
primeros.
-Cuando se realiza el proceso, siempre hay un vector que termina de recorrerse
antes que otro, sin importar sus longitudes;
-Las comparaciones que se realizan entre ambos no son parejas; es decir, no
se compara el primer valor del vector 1 con el primero del vector 2, y luego el
segundo valor del vector 1 con el segundo valor del vector 2, etc.;
-Si los vectores a mezclar ya están ordenados, solo hay que mezclarlos;
-Si están desordenados, primero hay que intercalarlos y luego ordenarlos.
I:= 1 //índice del V1//
J:= 1 //índice del V2//
K:= 0 //índice del V3//
Repetir Mientras ((I <= n) and (J <= m)) //Deja de repetir si algún vector se
recorre completamente//
K:= K + 1 //El V3 siempre va adquirir un valor, ya sea de V1 ó de V2//
Si: (V1 [I] <= V2 [J]) Entonces //V1 menor ó igual que V2//
V3 [K]:= V1 [I]
I := I + 1 //entonces avanzo un lugar para comparar con el valor que
corresponde de V2//
Sinó //V2 menor que V1//
V3 [K]:= V2 [J]
J := J + 1
Fin Si
Fin Repetir Mientras
Si: (I <= n) Entonces //El vector que resta por recorrer es V1//
Repetir Para: X := I, n
K := K + 1
V3 [K] := V1 [X] //entonces se copian los valores de V1 a V3//
Fin Repetir Para
Sinó
Repetir Para: X := J, m //El que resta por recorrer es V2//
K := K + 1
V3 [K] := V2 [X] //Se copia a V3//
Fin Repetir Para
Fin Si
CAPITULO X
ARCHIVOS
INTRODUCCIÓN
En un arreglo podemos almacenar información del mismo tipo, es decir
homogénea. Pero la realidad nos conduce a veces a situaciones en donde la
información que manejamos no es toda del mismo tipo. Ello nos demuestra que
en ciertas ocasiones es necesario trabajar datos que se hallan relacionados
lógicamente, pero que no son homogéneos.
Consideremos el siguiente ejemplo: Los siguientes datos le pertenecen a un
alumno, NUMERO DE ALUMNO, NOMBRE Y APELLIDO, CARRERA,
DOCUMENTO, DIRECCIÓN. Podemos ver que por cada dato genérico alumno,
hay una mezcla de datos numéricos y alfabéticos que lo definen unívocamente
como tal entidad. Para almacenar esta información heterogénea vamos a usar
estructuras de datos compuestas, que reciben el nombre de registros. O sea
que, bajo un mismo nombre genérico, vamos a manejar un conjunto de datos
como un todo, y que serán almacenados sobre variables y/o arreglos de distinto
tipo.
Así, el registro nos permitirá almacenar en un conjunto de variables y/o
arreglos, información relacionada lógicamente.
Cada una de estas variables y arreglos constituye un campo del registro. Un
campo es la unidad mínima de información de un registro. Cada campo recibe
un nombre que respeta las normas de declaración de variables y arreglos.
Además, para cada campo se especifica el tipo y la longitud de los datos que
en ellos se almacenan.
A la variable compuesta del ejemplo anterior la escribiremos de la siguiente
manera:
ALUMNO: Registro
NUM: entero 4
NOMYAP: caracter 40
CARR: caracter 40
DOCUM: entero 10
DIREC: caracter 40
Fin Registro
Los campos de un registro pueden ser de tipo entero, real, caracter, boleanos,
arreglos o registros.
El uso del registro es muy similar al de las variables; puede asignársele datos,
usarlo como argumento de un imprimir, etc. El uso mas destacado del mismo
es que sirve para estructurar la información de los archivos: se lo utiliza como
recepción de los valores de un archivo, desde cada registro físico.
Se define de manera similar a los arreglos; se pueden definir arreglos de datos
tipo registro como un registro con arreglos como componentes.
Se ordena un arreglo de registros de manera similar al ordenamiento de una
tabla por filas.
El registro como estructura de datos es también temporario.
Los registros se declaran en la zona de Tipos estructurados, especificando su
nombre genérico y el nombre, tipo y precisión de cada uno de sus campos.
Nuevamente, el efecto de la declaración es guardar lugar en memoria, en
posiciones consecutivas, para almacenar los datos en el registro. Su contenido
queda indefinido, y así se mantiene hasta aplicarle una acción de asignación de
valor sobre el mismo. El espacio que ocupa un registro en memoria es igual a
la suma de los espacios que ocupan cada uno de sus campos.
ARCHIVOS
Hasta el momento hemos visto todas estructuras de datos que nos permitían
guardar o mantener datos en la memoria principal de una computadora. Pero
existen varias razones por las cuales no siempre es posible mantener toda la
información necesaria en dicha memoria, a la vez. Entre ellas podemos
mencionar:
- La cantidad de datos que manipula un programa es muy grande y no hay
suficiente espacio en la memoria principal;
- Es frecuente que el resultado o salida de un programa sirva de entrada para
otro, por lo cual es necesario guardarlo en forma permanente;
- Es engorroso y lleva mucho tiempo tener que cargar datos a cada rato cuando
el conjunto de los mismos es muy grande.
Para lograr un mejor y más provechoso manejo de tales datos, necesitaremos
una memoria externa o secundaria. Este dispositivo de memoria externa
permite almacenar los datos y recuperarlos mediante operaciones de escritura
y lectura respectivamente. Entre esos dispositivos, podemos mencionar al disco
duro, los diskettes, cintas, etc..
Para poder hacer uso de esos dispositivos, surge la necesidad de organizar o
estructurar los datos que allí se almacenan; con ese fin usaremos los registros;
los registros se agruparán, formado archivos.
Un conjunto de registros con ciertos aspectos en común, y organizados para
algún propósito particular, constituye un archivo. Al mismo se lo identifica con
un nombre genérico.
Físicamente, un archivo se almacena como una sucesión de datos
estructurados por el diseño del registro. La información se guarda con el
formato especificado por el registro, y se recupera con ese mismo formato.
En forma transparente al usuario, además, la máquina agrega al final de cada
registro físico, una marca de fin de registro, y al final de todos los registros, una
marca especial llamada MARCA DE FIN DE ARCHIVO, o EOF (end of file).
Si se tiene el siguiente ejemplo:
LIBRO: Registro
TITULO: caracter 30
NRO: entero 5
AUTOR: caracter 39
Fin Registro
ARCH1: Archivo secuencial de registro: LIBRO
Declaración de archivos
Para declarar los archivos se coloca en la zona de Tipos estructurados el
nombre del mismo, acompañado de la estructura de registro que le da su
diseño. En pseudocódigo:
Programa Arch
Tipos estructurados
ALUMNO: Registro
NUM: entero 4
NOMYAP: caracter 40
CARR: caracter 40
DOCUM: entero 10
DIREC: caracter 40
Fin Registro
ARCH: archivo secuencial de registro: ALUMNO
Variables
A : ARCH //variable tipo archivo//
Hacer
...
Fin Hacer
Fin Programa
Como vemos, obviamente también debe figurar la declaración del registro de
diseño, antes que la del archivo.
Organización de archivos
Según las características del soporte empleado, y el modo en que se han
organizado los registros, se consideran dos tipos de acceso a los registros de
un archivo:
o Acceso secuencial: implica el acceso a un archivo según el orden de
almacenamiento de sus registros, uno tras otro.
o Acceso directo: Implica el acceso a un registro determinado, sin que ello
implique la consulta de los registros precedentes.
La organización de un archivo define la forma en que los registros se disponen
sobre el soporte de almacenamiento, o también se define la organización como
la forma en que se estructuran los datos de un archivo. En general, se
consideran tres organizaciones fundamentales:
ORGANIZACIÓN SECUENCIAL
Un archivo con organización secuencial es una sucesión de registros
almacenados consecutivamente sobre el soporte externo, de tal modo que para
acceder a un registro N dado, es obligatorio pasar por todos los N-1 artículos
que le preceden.
Los ficheros organizados secuencialmente contienen un registro particular (el
último) que contiene una marca de fin de archivo.
ORGANIZACIÓN DIRECTA
Un archivo está organizado en modo directo cuando el orden físico no se
corresponde con el orden lógico. Los datos se sitúan en el archivo y se accede
a ellos aleatoriamente mediante su posición, es decir, el lugar relativo que
ocupan.
La organización directa tiene el inconveniente de que se necesita programar la
relación existente entre el contenido de un registro y la posición que ocupa. El
acceso a los registros en modo directo implica la posible existencia de huecos
libres dentro del soporte, y por consiguiente, pueden existir huecos libres entre
registros.
Las condiciones para que un archivo sea de organización directa son:
-debe estar almacenado en un soporte direccionable;
-los registros deben contener un campo específico denominado clave que
identifique a cada registro de modo único;
-debe haber una correspondencia entre los posibles valores de la clave y las
direcciones disponibles sobre el soporte.
ORGANIZACIÓN SECUENCIAL INDEXADA
Un diccionario es un archivo secuencial, cuyos registros son las entradas y
cuyas claves son las palabras definidas por las entradas. Para buscar una
palabra (clave) no se busca secuencialmente desde la “a” hasta la “z”, sino que
se abre el diccionario por la letra inicial de la palabra. El diccionario es un
ejemplo típico de archivo secuencial indexado con dos niveles de índices, el
nivel superior para las letras iniciales y el nivel menor para las cabeceras de
página. En una organización de computadora, las letras y las cabeceras de
páginas se guardarán en un archivo de índice independiente de las entradas
del diccionario (archivo de datos). Por consiguiente, cada archivo secuencial
indexado consta de un archivo índice y un archivo de datos, y consta de las
siguientes partes:
- Área de datos primaria: Contiene los registros en forma secuencial y está
organizada en secuencia de claves sin dejar huecos intercalados;
- Área de índices: Es una tabla que contiene los niveles de índice; la existencia
de varios índices enlazados se denomina nivel de indexación.
- Área de excedentes: Utilizada, si fuese necesario, para las actualizaciones.
Características de un archivo
TAMAÑO
Se refiere a la cantidad de registros que tiene el archivo, y al espacio que
ocupa el mismo en memoria. Espacio = tamaño de un registro * cantidad de
registros.
ACTIVIDAD
Se refiere a determinar con que frecuencia se usa el archivo y cuántos registros
del mismo se utilizan.
CRECIMIENTO
Es el tamaño que se prevé que puede llegar a tener el archivo al cabo de su
vida útil, en cuanto a la cantidad de registros.
LUGAR DE RESIDENCIA
Se refiere al lugar donde se almacena el archivo, y depende específicamente
del tamaño del archivo, de su actividad, crecimiento y del método de acceso
(EJ: en cinta se guardan archivos grandes, de baja actividad y gran
crecimiento).
ORGANIZACIÓN
Se refiere a cómo se organiza el lugar de residencia o almacenamiento.
TÉCNICAS DE ACCESO
Se refiere a qué método d e acceso se usa para recuperar os datos del archivo.
Secuencial: se procesa un registro detrás de otro sin saltear ninguno; Directo:
se lee o graba por calve o índice el registro deseado, independientemente de
los otros.
Todo archivo de organización secuencial se accede por métodos secuenciales,
y los de organización directa admiten tanto una técnica como la otra.
La clase Console
Esta clase se encuentra dentro del espacio de nombres System, y nos
proporciona a través de sus métodos, acceso a la consola para mostrar u obtener
información del usuario.
Debido a que los miembros de esta clase se encuentran compartidos (shared), no
es necesario crear una instancia previa de la misma en una variable, pudiendo
ejecutar directamente sus métodos sobre el objeto Console. Todo ello se
explicará en los siguientes apartados.
Module Module1
Sub Main()
End Sub
End Module
Escritura de información
Para mostrar texto utilizaremos el método WriteLine( ) del objeto Console. Este
método escribe en la línea actual de la consola el valor que le pasemos como
parámetro, añadiendo automáticamente las marcas de retorno de carro y nueva
línea, por lo que la siguiente escritura se realizará en una nueva línea.
Sub Main()
Console.WriteLine("Hola mundo desde la consola")
Console.WriteLine("Esta es otra línea nueva")
End Sub
Sub Main()
Console.WriteLine("Hola mundo desde la consola")
Console.WriteLine("Esta es otra línea nueva")
Console.ReadLine()
End Sub
Los valores a mostrar con WriteLine( ) pueden ser de distintos tipos de datos,
pudiendo insertar también líneas en blanco.
Sub Main()
' ejemplos con WriteLine()
' escritura de cadenas de caracteres
Console.WriteLine("Esta es la primera línea")
Console.WriteLine("Ahora ponemos una línea vacía")
Console.WriteLine() ' línea vacía
' escritura de números
Console.WriteLine("A continuación escribimos un número")
Console.WriteLine(5891)
Console.WriteLine("Operaciones con números")
Console.WriteLine(500 + 150)
Console.WriteLine() ' otra línea vacia
' escritura de valores lógicos
Console.WriteLine("Resultado de la expresión lógica: 5 > 2")
Console.WriteLine(5 > 2)
' parada y espera respuesta del usuario
Console.ReadLine()
End Sub
Write( ) es otro método que nos permite también escribir valores en la consola.
Su uso es igual que
WriteLine( ), aunque debemos tener en cuenta que Write( ) no separa los
valores a mostrar. Veamos
un ejemplo en el Código fuente 41.
Sub Main()
Console.Write("Hola")
Console.Write("A")
Console.Write("Todos")
Console.Write(3456)
End Sub
Array.
Sub Main()
' crear un array y rellenarlo con valores
Dim Nombres(3) As String
Nombres(0) = "Ana"
Nombres(1) = "Pedro"
Nombres(2) = "Antonio"
Nombres(3) = "Laura"
' recorrer el array y mostrar el contenido
' de cada uno de sus elementos
Dim Contador As Integer
For Contador = 0 To UBound(Nombres)
Console.WriteLine("Posición del array: {0}, valor: {1}", _
Contador, Nombres(Contador))
Next
Console.ReadLine()
Redim Nombres(5)
End Sub
Constantes.
Sub Main()
Const Color As String = "Azul"
Const ValorMoneda As Double = 120.48
End Sub
Operadores.
Aritméticos
Efectúan el conjunto habitual de operaciones matemáticas.
Potenciación: ^
Multiplicación: *
División real: /
División entera: \
Resto: Mod
Suma: +
Resta: -
Concatenación: &, +
Operadores abreviados de asignación
Potencia: ^=
Multiplicación: *=
División real: /=
División entera: \=
Suma: +=
Resta: -=
Concatenación: &=
Comparación
Comparación de cadenas
• Option Compare Binary.
• Option Compare Text.
La función Asc( )
La función Chr( )
Comparación de cadenas en base a un patrón. El operador Like
Resultado = Cadena Like Patrón
Procedimientos
Todo el código ejecutable de una aplicación se ubica en rutinas de código o
procedimientos. Un procedimiento es un elemento del lenguaje compuesto por
un conjunto de líneas de código, a las que se denomina cuerpo del
procedimiento. Su comienzo y fin lo establecemos mediante ciertas palabras
reservadas del lenguaje, asociándole un identificador, que nos servirá para
reconocerlo entre el resto de procedimientos creados en el programa. Podemos
enviarle también información adicional en forma de parámetros, con lo que el
resultado de la ejecución de un procedimiento variará según los valores que
pasemos en cada llamada.
En VB.NET disponemos de los siguientes tipos de procedimientos:
Sub. Procedimiento que realiza un conjunto de operaciones pero no devuelve
valor al punto de llamada. A lo largo del texto también nos referiremos a las
rutinas de tipo Sub con el nombre genérico de procedimiento.
Function. Procedimiento que realiza un conjunto de operaciones, y devuelve
un valor denominado valor de retorno al punto de código que realizó la llamada.
A lo largo del texto también nos referiremos a las rutinas de tipo Function con
el nombre genérico de función.
Los elementos que forman parte de este tipo de rutina son los siguientes:
Ámbito. Define el modo en que vamos a poder acceder o llamar al
procedimiento desde otro
punto de la aplicación. El ámbito de los elementos del lenguaje será tratado en
un apartado posterior.
Sub...End Sub. Palabras clave que indican el comienzo y final del
procedimiento respectivamente. Cuando hagamos una llamada al
procedimiento, el compilador ejecutará el código comprendido entre estas dos
palabras clave.
NombreProcedimiento. Identificador que utilizamos para reconocer y llamar
al procedimiento.
ListaParámetros. Lista de variables separadas por comas, y encerradas entre
paréntesis, que representan la información que recibe el procedimiento desde el
código llamador.
Return. Esta palabra clave permite salir de la ejecución del procedimiento sin
haber llegado a su fin. Podemos utilizarla en tantos lugares dentro de un
procedimiento como sea necesario.
Se recomienda su uso en lugar de Exit Sub, ya que podemos emplear Return
para salir de cualquier tipo de procedimiento, con lo cual se unifica la escritura
del código.
Exit Sub. Al igual que en el punto anterior, esta palabra clave permite salir de
la ejecución del procedimiento sin haber llegado a su fin, pudiendo igualmente,
situarla en tantos lugares dentro del procedimiento como sea necesario.
El muestra el modo más simple de crear un procedimiento. Escriba el lector
este procedimiento en la aplicación de consola sobre la que está realizando las
pruebas, a continuación de Main( ).
Sub Prueba()
Console.WriteLine("Estamos en el procedimiento Prueba")
End Sub
Los elementos que forman parte de este tipo de rutina son los siguientes:
Ámbito. Define el modo en que vamos a poder acceder o llamar al
procedimiento desde otro punto de la aplicación. El ámbito de los elementos del
lenguaje será tratado en un apartado posterior.
Function...End Function. Palabras clave que indican el comienzo y final de
la función respectivamente. Cuando hagamos una llamada a la función, el
compilador ejecutará el código comprendido entre estas dos palabras clave.
NombreFunción. Identificador que utilizamos para reconocer y llamar a la
función. En este tipo de procedimiento, también utilizamos su nombre para
asignar el valor que será devuelto al código llamador en el modo
NombreFunción = Valor, en esta última situación, podemos
situar esta expresión de devolución en tantos lugares como necesitemos dentro
de la función.
TipoDato. Tipo de dato del valor devuelto como resultado de la ejecución de
la función.
ListaParámetros. Lista de variables separadas por comas, y encerradas entre
paréntesis, que representan la información que recibe la función desde el código
llamador.
Return. Esta palabra clave permite salir de la ejecución de la función
devolviendo al mismo
tiempo un valor al código que hizo la llamada. Podemos utilizarla dentro de una
función, en tantos lugares como necesitemos.
Exit Function. Esta palabra clave permite salir de la ejecución de la función
sin haber llegado a su fin. Podemos utilizarla dentro de una función, en tantos
lugares como necesitemos.
Function Calcular() As Integer
Dim MiValor As Integer
Console.WriteLine("Introducir un número de 1 a 100")
MiValor = Console.ReadLine()
Return MiValor
' también podemos utilizar esta
' sintaxis para devolver el valor
' de retorno de la función:
'Calcular = MiValor
End Function
Parámetros opcionales
Un parámetro opcional es aquel que no es necesario especificar al hacer la
llamada a un procedimiento.
Para indicar en la declaración de un procedimiento que un parámetro es
opcional, debemos utilizar la palabra clave Optional seguida de la
especificación del parámetro, y finalizar con la asignación de un valor por
defecto para el parámetro. Teniendo en cuenta además, que a partir del primer
parámetro opcional en la lista de un procedimiento, todos los parámetros
sucesivos también deben ser opcionales.
Después hacemos dos llamadas a dicho procedimiento, pasando y omitiendo el
parámetro opcional respectivamente en cada llamada.
Sub Main()
Dim Localidad As String
Dim Importe As Integer
Dim Resultado As Integer
' ---------------------
Localidad = "Sevilla"
Importe = 15044
' paso de todos los parámetros al procedimiento
Resultado = Calcular(Localidad, Importe)
Console.WriteLine("Primera llamada, valor devuelto: {0}", Resultado)
' ---------------------
Localidad = "Madrid"
' paso sólo del primer parámetro al procedimiento,
' esto hará que se utilice el valor por defecto
' del parámetro opcional
Resultado = Calcular(Localidad)
Console.WriteLine("Segunda llamada, valor devuelto: {0}", Resultado)
Console.ReadLine()
End Sub
Function Calcular(ByVal Ciudad As String, Optional ByVal Cantidad As Integer =
5500) As Integer
Console.WriteLine("Valores de los parámetros")
Console.WriteLine("Ciudad: {0} - Cantidad: {1}", Ciudad, Cantidad)
Return Cantidad + 100
End Function
Array de parámetros
Cuando en la lista de parámetros de un procedimiento utilizamos la palabra
clave ParamArray junto al nombre del último parámetro de la lista, dicho
parámetro será considerado un array, por lo que al hacer la llamada al
procedimiento podremos pasarle un número variable de valores, que
manejaremos a través del array.
Sub Main()
Dim Valor As Integer
Dim Ciudad As String
Dim Nombre As String
Valor = 7954
Ciudad = "Valencia"
Nombre = "Jorge"
' en la llamada al procedimiento Prueba()
' todos los valores que pasemos a continuación
' del primer parámetro, serán depositados
' en el array de parámetros
Prueba(Valor, Ciudad, "mesa", Nombre)
Console.ReadLine()
End Sub
' el parámetro MasDatos del procedimiento es un array
' de parámetros variables
Sub Prueba(ByVal Importe As Integer, ByVal ParamArray MasDatos() As String)
Dim Contador As Integer
' mostrar el primer parámetro
Console.WriteLine("Parámetro Importe: {0}", Importe)
Console.WriteLine()
' el resto de parámetros del procedimiento
' están en el array, los obtenemos recorriendolo
' con(una) estructura For...Next
Console.WriteLine("Contenido del array de parámetros MasDatos():")
For Contador = 0 To UBound(MasDatos)
Console.WriteLine("Elemento: {0} - Valor: {1}", _
Contador, MasDatos(Contador))
Next
End Sub
Estructuras de control.
If ExpresiónA Then
' código cuando ExpresiónA es Verdadero
' .......
ElseIf ExpresiónB Then
' código cuando ExpresiónB es Verdadero
' .......
[ElseIf ExpresiónN Then]
' código cuando ExpresiónN es Verdadero
' .......
[Else]
' código cuando ninguna expresión devuelve Verdadero
' .......
End If
Sub Main()
Dim Valor As Integer
Dim Resultado As Integer
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
If Valor = 5 Then
Resultado = Valor + 10
ElseIf Valor > 100 Then
Resultado = Valor + 200
ElseIf Valor < 1 Then
Resultado = -8
Else
Resultado = 777
End If
Console.WriteLine("La variable Resultado contiene {0}", Resultado)
Console.ReadLine()
End Sub
Repetición
Estas estructuras, también denominadas bucles, ejecutan un bloque de código de
forma repetitiva mientras se cumpla una condición asociada a la estructura. A
cada una de las veces en que se ejecuta el código contenido en estas estructuras
se le denomina iteración.
While...End While
Se trata del tipo más sencillo, ejecuta las líneas de código que contiene,
mientras que la expresión situada junto a While devuelva Verdadero.
While Expresión
' código
' .....
End While
Sub Main()
Dim Valor As Integer
Dim Contador As Integer
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
Console.WriteLine("Mostrar en consola todos los números desde 1 hasta el
introducido")
While Contador < Valor
Console.Write("-" & Contador)
Contador += 1
End While
Console.ReadLine()
End Sub
Do...Loop
Esta estructura ejecuta un conjunto de líneas de código, en función del valor
devuelto por una expresión, que a modo de condición, podemos situar al
comienzo o final de la estructura.
Es posible además, no utilizar la expresión de evaluación al principio o final,
debiendo en ese caso, introducir alguna condición en el interior del código de la
estructura, para forzar la salida del bucle y evitar caer en un bucle infinito. La
instrucción Exit Do nos permite forzar la salida del bucle, pudiendo emplearla
tantas veces como sea necesario.
Veamos a continuación, las diferentes variantes disponibles.
Condición al principio.
La sintaxis se muestra en el .
Do While | Until Expresión
' código
' ......
[Exit Do]
' código
' ......
Loop
Condición al final.
La diferencia en este caso, consiste en que el contenido de la estructura se
ejecuta al menos una vez. El muestra su sintaxis.
Do
' código
' ......
[Exit Do]
' código
' ......
Loop While | Until Expresión
Sin condición.
Este es el modo más sencillo de la estructura: sin incluir condición al principio o
final. También es el modo más peligroso, ya que si no incluimos un control
dentro del código, corremos el riesgo de caer en un bucle infinito. En el ejemplo
del , establecemos una condición de salida mediante una estructura If dentro del
bucle, que comprueba el contenido de la variable, y fuerza la salida cuando
tenga un valor superior a cierto número.
Sub Main()
Dim Valor As Integer
Do
Console.WriteLine("Introducir un número")
Valor = Console.ReadLine()
' comprobar y salir del bucle si es necesario
If Valor > 400 Then
Exit Do
End If
Loop
End Sub
For...Next
Esta estructura ejecuta un bloque de código un número determinado de veces,
establecido por un rango de valores y controlado por un contador. El muestra
su sintaxis
For Contador = Inicio To Fin [Step Incremento]
' código
' ......
[Exit For]
' código
' ......
Next
For Each...Next
Se trata de una variante de la estructura For...Next, y su misión consiste en
ejecutar un bloque de código por cada uno de los elementos existentes en un
array o colección. El muestra su sintaxis.
For Each Elemento In ColecArray
' código
' ......
[Exit For]
' código
' ......
Next
Sub Main()
' crear un array y rellenarlo con valores
Dim lsColores() As String = {"Azul", "Verde", "Marino", "Violeta"}
Dim lsColor As String
' en cada iteración se obtiene un elemento
' del array lsColores, y se guarda en la variable lsColor
For Each lsColor In lsColores
Console.WriteLine(lsColor)
Next
End Sub