SEMANA 12 A 17

PROGRAMACIÓN MODULAR

La programación modular se define como aquélla que afronta la solución de un problema descomponiéndolo en subproblemas más simples, y estos a su vez se resuelven mediante un algoritmo o módulo más o menos independiente del resto.

Ventajas de la programación modular
  • Facilita la comprensión del problema y su resolución escalonada

  • Aumenta la claridad y legibilidad de los programas

  • Permite que varios programadores trabajen en el mismo problema a la vez, puesto que cada uno puede trabajar en uno o varios módulos de manera bastante independiente

  • Reduce el tiempo de desarrollo, reutilizando módulos previamente desarrollados Mejora la fiabilidad de los programas, porque es más sencillo diseñar y depurar módulos pequeños que programas enormes Facilita el mantenimiento de los programas
Resumiendo, es posible afirmar sin temor a fallar que es virtualmente imposible escribir un programa de grandes dimensiones si no procedemos a dividirlo en fragmentos más pequeños, abarcables por nuestro pobre intelecto humano.

Hay que tener muy presente que la programación modular y la estructurada no son técnicas incompatibles, sino más bien complementarias.

La mayoría de los programas que se desarrollan con lenguajes estructurados son, de hecho, estructurados y modulares al mismo tiempo.

Desarrollar programas de forma modular

Significa que pueden identificarse las principales tareas a realizar por el programa y que se pueden diseñar y probar procedimientos individuales para estas tareas. Por ejemplo:

¿Qué transacciones se le hacen a una cuenta de ahorros?

Transacciones:
  • Depósito (cheque y efectivo)

  • Intereses

  • Retiro

  • Estado de cuenta

  • Cambio de libreta

Tiempo de vida de los datos

Según el lugar donde son declaradas puede haber dos tipos de variables.



  • Globales : las variables permanecen activas durante todo el programa. Se crean al iniciarse éste y se destruyen de la memoria al finalizar. Pueden ser utilizadas en cualquier procedimiento o función.

  • Locales : las variables son creadas cuando el programa llega a la función o procedimiento en la que están definidas. Al finalizar la función o el procedimiento, desaparecen de la memoria
Si dos variables, una global y una local, tienen el mismo nombre, la local prevalecerá sobre la global dentro del módulo en que ha sido declarada.

Dos variables locales pueden tener el mismo nombre siempre que estén declaradas en funciones o procedimientos diferentes.


Parámetros Formales

Es un tipo especial de variables en un procedimiento a los que se pueden pasar valores desde el exterior del procedimiento. Se declaran en la cabecera del procedimiento. Ejemplos:

1. Uso de variables globales en procedimientos o funciones.

Algoritmo global var x:entero

Inicio

x ¬0cambiar

escribir (x)

fin

Módulo cambiar

inicio

x ¬1

fin


La variable X está definida como global, por lo tanto la salida será 1.

2. Uso de variables locales.

Algoritmo local

var x:entero

Inicio

x ¬0

cambiar

escribir (x)

fin

Módulo cambiar

var x:entero

inicio

x ¬1

fin

Como x es local, no tiene efecto en el programa, por lo tanto la salida será 0.

3. Variables locales y globales.

Programa en Borland C++

/* Variables globales y locales. */

#include stdio.h int num1=1;

main()

/* Escribe dos cifras */

{

int num2=10;

printf("%d\n",num1);

printf("%d\n",num2);

}


Parámetros por Valor

Son los parámetros que pueden recibir valores pero que no pueden devolverlos.

Es una variable global que se conecta con una variable local mediante el envío de su valor, después de lo cual ya no hay relación. Lo que le sucede a la variable local no afectará a la global.

Cuando un parámetro actual se pasa por valor, el subprograma 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 subprograma 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. Ejemplo:

Algoritmo parámetro valor

var x: entero

Inicio

x = 0

cambiar(x)

escribir(X)

Fin


Módulo cambiar (y:entero)

inicio

y ¬1

fin

Salida 0


Parámetros por Variable

Son los que pueden recibir y devolver valores. Son variables globales que se conectan con una local a través de su contenido; al establecerse dicha conexión las variables se convierten en sinónimos, lo que afecte a la variable local le sucederá a la variable global. Ejemplo:

Algoritmo parámetro variable

var x:entero

Inicio

x ¬0

cambiar (x)

escribir (x)

Fin


Módulo cambiar (var y:entero)

inicio

y ¬1

fin

Salida: x =1


PROCEDIMIENTOS Son subprogramas, es decir, módulos que forman parte de un programa y realizan una tarea específica. Un procedimiento puede tener sus propias variables que se declaran en la sección var del propio procedimiento. Estas se llaman variables locales. La casilla de memoria para estas variables se crea cada vez que el procedimiento es llamado y se borran al salir del mismo. Asi, las variables locales para un procedimiento sólo se pueden usar en el cuerpo del procedimiento y no en el cuerpo principal del programa.

FUNCIONES La función es una estructura autónoma similar a los módulos. La diferencia radica en que la función se usa para devolver un solo valor de un tipo de dato simple a su punto de referencia. La función se relaciona especificando su nombre en una expresión, como si fuera una variable ordinaria de tipo simple. Las funciones se dividen en estándares y definidas por el usuario.
  • Estándar : Son funciones proporcionadas por cualquier lenguaje de programación de alto nivel, y se dividen en aritméticas y alfabéticas.
  • Definidas por el usuario : son funciones que puede definirlas el programador con el propósito de ejecutar alguna función específica, y que por lo general se usan cuando se trata de hacer algún cálculo que será requerido en varias ocasiones en la parte principal del algoritmo. Ejemplos:

Función factorial (n:entero):

entero var i,

factorial:entero

inicio

si n <=1 entonces

factorial <-- 1

sino

factorial <-- 1

desde i = 1 hasta n hacer

factorial <-- factorial * 1

fin_desde

fin_si fin

Evaluar la función f = x! / (y!(x-y)!)

Algoritmo hallarf

var x,y:entero

f:real

inicio

leer (x,y)

f <-- factorial (x)/(factorial (y)* factorial (x-y))

escribir ("El valor de f es:", f)

fin


Semejanzas entre Procedimientos y Funciones.

La definición de ambos aparece en la sección de subprogramas de la parte de declaraciones de un programa y en ambos casos consiste en una cabecera, una parte de declaraciones una parte de instrucciones.

Ambos son unidades de programa independientes. Los parámetros, constantes y variables declarados en una función o procedimiento son locales a la función o al procedimiento, solamente son accesibles dentro del subprograma.

Cuando se llama a una función o a un procedimiento, el número de los parámetros reales debe ser el mismo que el número de los parámetros formales y los tipos de los parámetros reales deben coincidir con los tipos de los correspondientes parámetros formales, con una excepción: se puede asociar un parámetro real de tipo entero con un parámetro formal por valor de tipo real.

Diferencias entre Procedimientos y Funciones.

Mientras que a un procedimiento se le llama mediante una instrucción de llamada a procedimiento, a una función se la llama usando su nombre en una expresión.

Puesto que se debe asociar un valor al número de una función, también se le debe asociar un tipo. Por tanto, la cabecera de una función debe incluir un identificador de tipo que especifique el tipo del resultado. Sin embargo, no se asocia ningún valor con el nombre de un procedimiento y, por tanto, tampoco ningún tipo.

Las funciones normalmente devuelven un único valor a la unidad de programa que la llama. Los procedimientos suelen devolver más de un valor, o pueden no devolver ninguno si solamente realizan alguna tarea, como una operación de salida.

En los procedimientos, los valores se devuelven a través de parámetros por variable, pero el valor de una función se devuelve mediante la asignación al nombre de la función de dicho valor en la parte de instrucciones de la definición de la función

PROGRAMACION ORIENTADA A OBJETOS
La programación orientada a objetos (POO) es una técnica o estilo de programación que utiliza objetos como bloque esencial de construcción.
Un programa orientado a objetos es una colección de clases. Necesita de una función principal que cree objetos y comience la ejecución mediante la invocación de sus funciones o métodos.

En primer lugar, se crean los objetos.

Segundo, los mensajes se envían desde unos objetos y se reciben en otros a medida que el programa se ejecuta.

Tercero, se borran los objetos cuando ya no son necesarios y se recupera la memoria ocupada por ellos.

Los objetos son tipos de datos abstractos (TDA) definidos por el programador. En realidad son unidades que contienen datos y funciones que operan sobre esos datos. A los objetos también se les conoce como instancias de clase.

A los elementos de un objeto se les conoce como miembros (datos miembros yfunciones miembro).

Ejemplos de objetosventanas, iconos, arreglos, pilas, colas, árboles binarios, números complejos.

Los datos de un objetos están ocultos y solamente a través de sus funciones pueden ser accesados.

Todos los campos miembros y funciones están completamente en el interior del objeto y son ocultos desde el exterior, lo que significa que están encapsulados.

A las funciones de un objeto también se les conoce como métodos y a los datos como variables.

CARACTERISTICAS
  • Los diseñadores definen nuevas clases (o tipos) de objetos.

  • Los objetos poseen una serie de operaciones asociadas a ellos.

  • Las operaciones tienden a ser genéricas, es decir, operan sobre múltiples tipos de datos.

  • Las clases o tipos de objetos comparten componentes comunes mediante mecanismos de herencia.

Pero no hay un acuerdo aceptado por todo el mundo respecto a cuáles son las características que definen la POO, pero al menos todos concuerdan en estas tres:


Abstracción Un buen ejemplo de abstracción es el cuerpo humano, aunque el cuerpo es una unidad, está dividido en lo que conocemos por sistemas (el sistema respiratorio, el sistema linfático, cardiovascular, etc., etc.).

Estos sistemas, a su vez están compuestos por otros más pequeños: los órganos, y así sucesivamente. La abstracción nos permite dividir nuestro programa en distintos objetos que se agrupan para formar cosas más complejas.

Básicamente la abstracción es la capacidad de separar los elementos (al menos mentalmente) para poder verlos de forma singular. Como cuando describimos el cuerpo humano y decimos cabeza, brazo(s), pierna(s), etc.

Encapsulación: También conocida como ocultamiento .

La encapsulación se encarga de mantener ocultos los procesos internos que necesita para hacer lo que sea que haga, dándole al programador acceso sólo a lo que necesita . Esto da dos ventajas iniciales:
Lo que hace el usuario puede ser controlado internamente (incluso sus errores), evitando que todo colapse por una intervención indeseada.

La segunda ventaja es que, al hacer que la mayor parte del código esté oculto , puedes hacer cambios y/o mejoras sin que eso afecte el modo como los usuarios van a utilizar tu código. Sólo tienes que mantener igual la forma de acceder a él. Por cierto, estas puertas de acceso que se dan a los usuarios son lo que se conoce como interfaz .

Herencia: La herencia es la capacidad que tiene una clase de derivar las propiedades y métodos de otra. Por ejemplo: Decimos que una gallina es un ave ; esto quiere decir que las gallinas tienen características comunes con otras aves (pico, plumas, etc.), es decir que la gallina hereda las características comunes de todas las aves. Pero además, resulta que un ave es un animal , lo que significa que también comparte características comunes al caballo, el perro, el hombre y cualquier otra cosa que pueda ser clasificada como animal.

La herencia nos permite, entre otras cosas, evitar tener que escribir el mismo código una y otra vez, puesto que al definir que una categoría pertenece a otra, automáticamente estamos atribuyéndoles las características generales de la primera, sin tener que definirlas de nuevo.
Polimorfismo:
El término de polimorfismo define la capacidad de que más de un objeto puedan crearse usando la misma clase de base para lograr dos conceptos de objetos diferentes, en este caso podemos citar el típico ejemplo de los teléfonos, los cuales se basan en un teléfono base, con la capacidad de hacer ring y tener un auricular, para luego obtener un teléfono digital, inalámbrico, con botonera de marcado y también, tomando la misma base, construir un teléfono analógico y con disco de marcado.


Ventajas de la programación orientada a objetos


  • Flexibilidad. Si partimos del hecho que mediante la definición de clases establecemos módulos independientes, a partir de los cuales podemos definir nuevas clases, entonces podemos pensar en estos módulos como bloques con los cuales podemos construir diferentes programas.

  • Reusabilidad. Una vez que hemos definido a la entidad persona para utilizarla en una aplicación de negocios, por mencionar un ejemplo, y deseamos construir a continuación una aplicación, digamos de deportes, en donde requerimos definir a la misma entidad persona, no es deseable volver a escribir la definición para la entidad persona. Por medio de la reusabilidad podemos utilizar una clase definida previamente en las aplicaciones que nos sea conveniente. Es claro que la flexibilidad con la que se definió la clase va a ser fundamental para su reutilización.

  • Mantenibilidad. Las clases que conforman una aplicación, vistas como módulos independientes entre sí, son fáciles de mantener sin afectar a los demás componentes de la aplicación.

  • Extensibilidad. Gracias a la modularidad y a la herencia una aplicación diseñada bajo el paradigma de la orientación a objetos puede ser fácilmente extensible para cubrir necesidades de crecimiento de la aplicación.

Desventajas de la POO

A pesar de que las ventajas de la programación orientada a objetos superan a las limitaciones de la misma, podemos encontrar algunas características no deseables en ésta.



  • Limitaciones para el programador. No obstante que la tecnología orientada a objetos no es nueva, un gran porcentaje de programadores no están familiarizados con los conceptos de dicha tecnología. En otras palabras, la lógica de la programación estructurada sigue siendo predominante en la mayoría de los desarrolladores de software, después de haber revisado de forma breve los principios de la programación orientada a objetos, nos es claro que en ésta se requiere una lógica de pensamiento totalmente diferente a la lógica comúnmente utilizada para la programación estructurada.

  • Tamaño excesivo en las aplicaciones resultantes. La gran mayoría de los equipos de computo cuentan con capacidades tanto de almacenamiento como de memoria lo suficientemente buena como para ejecutar la mayoría de las aplicaciones que puedan desarrollarse con la tecnología orientada a objetos, sin embargo existen casos en los que lo anterior no se cumple.

  • Una de las desventajas de la programación orientada a objetos es que cuando se heredan clases a partir de clases existentes se heredan de forma implícita todos los miembros de dicha clase aun cuando no todos se necesiten, lo que produce aplicaciones muy grandes que no siempre encajan en los sistemas con los que se disponga.

  • Velocidad de ejecución. Esto tiene que ver, en cierto modo, con el punto anterior, unaaplicación innecesariamente pesada en muchas ocasiones es más lenta de ejecutar que una aplicación conformada únicamente por los módulos necesarios.

QUE ES UN OBJETO Objeto es el concepto clave de la Programación Orientada a Objetos, la idea de objeto es similar a la del mundo real, un objeto puede ser una silla, una mesa. Tu perro es un objeto.


Los objetos tienen dos características: Un estado y un comportamiento. Fijate que por ejemplo tu perro tiene un estado: nombre, color, raza, altura, etc. y un comportamiento: ladrar, cavar pozo, llorar, dormir, comer, etc.


Un auto es un objeto. También tiene un estado: Cantidad de puertas, color, tamaño, etc. y un comportamiento: acelerar, frenar, subir cambio, bajar cambio, girar izq., girar der., etc.


Entonces podemos definir a un objeto en POO, como un conjunto de datos y funciones relacionadas. A las funciones de los objetos, tales como acelerar en el caso del auto, de aquí en más las llamaremos métodos, a los datos los llamaremos atributos.


Los objetos en programación, son modelados observando objetos del mundo real, por ejemplo implementamos el objeto "perro" dentro de nuestro programa definiendo los atributos y métodos del objeto perro real.

Un ejemplo mas complicado de un objeto podría ser el siguiente:

Objeto: Cuenta bancaria

Atributos: tipo, titular, saldo.

Métodos: Depositar, Extraer.

Aquí se ve la necesidad de que el atributo "saldo" sea solo accesible a través de los métodos "Depositar" y "Extraer" por una cuestión de seguridad, encapsulamiento y para evitar comportamientos indeseados.

QUE ES UNA CLASE Una clase es algo abstracto que define la "forma" del objeto, se podría hablar de la clase como el molde de los objetos.


En el mundo real existen objetos del mismo tipo, por ejemplo tu bicicleta es solo una mas de todas las bicicletas del mundo. Entonces diríamos que tu bicicleta es una instancia de la clase "Bicicleta". Todas las bicicletas tienen los atributos: color, cantidad de cambios, dueño y métodos: acelerar, frenar, pasar cambio, volver cambio.

Las fabricas de bicicletas utilizan moldes para producir sus productos en serie, de la misma forma en POO utilizaremos la clase bicicleta (molde) para producir sus instancias (objetos).

Los objetos son instancias de clases. Ejemplo: Podríamos tener la clase Perro, una instancia de esta clase podría ser el objeto perro llamado "Chicho". La clase Perro especificaría que todos los perros tendrían un nombre, color de pelo, una altura. Mientras que la instancia "Chicho" contendrá valores específicos para cada uno de estos atributos.

Podemos definir a una clase como una plantilla que define variables y métodos comunes para todos los objetos de cierto tipo.

Existe un lenguaje de modelado llamado UML mediante el cual podemos representar gráficamente todo un sistema orientado a objetos utilizando rectángulos, líneas y otro tipo de símbolos gráficos.

MENSAJES Un objeto por si solo no tiene mucho significado. Ejemplo: el objeto "bicicleta" no tiene mucho sentido si no interactúa con un objeto "persona" que pedalee.

La interacción entre objetos se produce mediante mensajes. Los mensajes son llamados a métodos de un objeto en particular.

Podemos decir que el objeto persona envía el mensaje "girar a la izquierda" al objeto bicicleta.

Los mensajes pueden contener parámetros. Por ejemplo teniendo un método en la clase bicicleta llamado "Girar" que recibe como parámetro la dirección (derecha o izquierda).

Un mensaje esta compuesto por los siguientes tres elementos:

El objeto destino, hacia el cual el mensaje es enviado
El nombre del método a llamar
Los parámetros solicitados por el método


Beneficios de los mensajes Como todo lo que un objeto puede hacer esta expresado mediante métodos, el envío de mensajes soporta todas las posibles interacciones entre objetos.

Para enviar o recibir mensajes, los objetos no necesitan formar parte del mismo proceso, ni siquiera de la misma máquina.


DIRIJASE A LA SIGUIENTE URL: http://d.scribd.com/docs/26qa9w41d4jir6du417f.pdf

En esta página usted verá la estructura de la programación orientada a objetos mediante un ejemplo el cuál está desarrollado en Visual basic.Net.

SEMANA 9-11

ESTRUCTURAS DE ALMACENAMIENTO

Como sabemos, el almacenamiento constituye una de las partes principales dentro de los sistemas computacionales, puesto que es en dispositivos de gran capacidad donde la información es guardada para luego ser accedida o recuperada. Uno de los mayores dispositivos que se utiliza para este propósito son los conocidos díscos duros (discos rígidos).

La estructura física de un disco rígido esta compuesta por:

Cabezas lectoras que recorren la superficie del disco
Platos que son pequeños discos que se encuentra uno sobre otro y compuestos por caras.
Las pistas que son circuferencias ubicadas en una cara.
Y cilindros definidos como la unión de pistas alineadas verticalmente.


Una correcta planificación trae con sigo un aumento en la velocidad de acceso a datos:


Planificación FCFS Conocido como first-come-fist-served es un algoritmo que atiende las peticiones en orden de llegada sin importar si se encuentran en ragos muy dispersos. No es muy eficiente pues el cabezal de lectura recorre la superficie de una manera irregular.


Planificación SSTF Basada en el principio de short-seek-time-first estable las peticiones de dirección de tal manera que será atendida aquella que se encuentre más cerca de la cabeza de lectura. Este algoritmo reduce considerablemente el tiempo, pero como desventaja puede provocar que inanición por la presencia de solicitudes siempre menores.


Planificación SCAN También conocido como algoritmo del elevador, pues recorre toda la longitud de los platos de un lado a otro buscando en su camino las solicitudes que se encuentren pendientes. Uno de sus inconvenientes es el que las solicitudes de acceso no tienen un tiempo de espera uniforme, es decir, las de un extremo serán atendidas luego de un tiempo mayor.

Planificación C-SCAN Esta planificación es una variación del anterior que resuelve la espera de tiempo para cada solicitud, haciendo un recorrido uniforme en cuanto ha atender pedidos lo que hace que la cabeza lectora recorra el plato de inicio a fin y retorne.

Planificación LOOK En la práctica los dos algoritmos anteriores, que recorren todo el plato no son implementados, si no que se usa más la forma de detectar la última petición y regresar nuevamente al principio, es decir no hay razón de seguir recorriendo si ya no existen solicitudes.

Otro aspecto importante en el almacenamiento masivo:

Espacio de Intercambio Este es un concepto importante pues su implementación es conocida como memoría virtual. Lo quepermite aumentar la cantidad de memoría de tal manera que el SO moverá al disco todo o parte de un proceso sin mucha actividad, permitiendo liberar recursos.

Para ubicar el espacion de intercambio existen dos formas, la primera como un fichero de intercambio que puede reducir o ampliar su tamaño pero que puede ser afectado por la paginación y la segunda una Partición de intercambio, que es basicamente especificar una partición del disco para utilizar, y en diferencia a la anterior no puede ser modificado su tamaño.

Por qmarqevaon 21-06-2008 (http://www.utpl.edu.ec/blog/sistemasoperativos/2008/06/21/estructura-del-almacenamiento-masivo/)

ARRAYS (ARREGLOS)

Un array (también llamado arreglo) es una agrupación de muchos datos individuales del mismo tipo bajo el mismo nombre. Cada dato individual de un array es accesible mediante un índice.

VECTOR Es el caso más simple de array unidimensional.

En los vectores hay dos cosas que hay q diferenciar y son:

Posición y la cantidad.

Por ejemplo: int serie[5]=3;

La cantidad es 3 y la posición es 5. En la posición 5 del vector serie. se almacena el número 3.

Los vectores siempre arrancan de la posición 0.

OPERACIONES BASICAS CON VECTORES

Manipulación de elementos individuales Los vectores en C deben manipularse elemento a elemento . No se pueden modificar todos los elementos a la vez.

Llenado de un vector por definición: Para asignar valores a los elementos de un vector, por lo tanto, el mecanismo es este:

int serie[5];
serie[0] = 5;
serie[1] = 3;
serie[2] = 7;
...etc...

La inicialización de los valores de un vector también puede hacerse conjuntamente en el momento de declararlo, así: int serie[5] = {5, 3, 7, 9, 14};

El resultado de esta declaración será un vector de 5 elementos de tipo entero a los que se les asigna estos valores:


Cada elemento del vector es, a todos los efectos, una variable que puede usarse independientemente de los demás elementos. Así, por ejemplo, un elemento del vector serie puede usarse en una instrucción de salida igual que cualquier variable simple de tipo int:

int serie[5];
serie[0] = 21;
printf("%i", serie[0]);

Del mismo modo, pueden usarse elementos de vector en una instrucción de entrada. Por ejemplo:

int serie[5];
scanf("%i", &serie[0]);

serie[1] = serie[0] + 15;
printf("%i", serie[1]);

Llenado de un vector por lectura o teclado:

int v[n]=0, i;
for (i=0; i<=n-1, i++)
{
printf (datos:%d : ,i+1);
scanf ("%d",v[i] );
}

Imprimir un vector

for (i=0; i<=n-1, i);
printf (datos:%d : ,i+1);

Sumar posiciones
a=0;
for (i=0; i<=n-1, i++)
printf (datos:%d : ,i+1);
a=a+v[i];

COMO ORDENAR UN VECTOR

Mencionaremos tres métodos de ordenación muy populares:

1. Ordenación por INTERCAMBIO DIRECTO (burbuja) El método de la burbuja es muy ineficiente, pues tarda mucho tiempo en ordenar un vector si éste es muy largo. Pero es fácil de entender.

La idea general es simple: tomaremos los dos primeros elementos y los compararemos. Si están desordenados, intercambiamos sus posiciones. Si están ordenados, los dejamos como están.

Después haremos lo mismo con los elementos segundo y tercero (comparar y, si es necesario, intercambiar). Luego, con el tercero y el cuarto. Después con el cuarto y el quinto, y así sucesivamente hasta recorrer el vector completo.

Cuando lleguemos al final, el vector no estará todavía ordenado, pero el elemento más grande del vector habrá subido hasta la última posición, igual que una burbuja de aire en el agua .

Si volvemos a repetir el proceso desde el principio, el segundo elemento más grande habrá subido hasta la penúltima posición del vector. Y, la siguiente vez, el tercer elemento más grande subirá hasta la antepenúltima posición. Y así hasta que ordenemos todos los elementos.

Si el vector tiene N elementos, hay que repetir el recorrido N veces, aunque en cada repetición podemos quedarnos una posición más abajo del final, ya que sabemos con seguridad que los últimos elementos están colocados en su sitio.

El algoritmo funciona exactamente igual si recorremos el vector desde el final hacia el principio, sólo que, en ese caso, son los elementos más pequeños los que van descendiendo y colocándose en su posición definitiva en cada iteración del algoritmo.

En la siguiente implementación, usamos este segundo enfoque: repetimos el proceso tantas veces como elementos tenga el vector (longitudvector) y, en cada repetición, recorremos el vector desde el final hacia atrás, comparando e intercambiando pares adyacentes de elementos. (Aviso importante : la plantilla de WordPress muestra automáticamente dos caracteres “-” consecutivos cómo si fueran un guión largo “–”. Si desea usar esta implementación, recuerde que debe deshacer ese cambio)

void ordena_vector(int v[longitudvector])
{
int i, j, minimo, posicion_minimo;
for (i = 0; i < minimo =" v[i];" posicion_minimo =" i;" j="i;" minimo =" v[j];" posicion_minimo =" j;">




El método de la burbuja necesita muchos pasos para completarse (y por eso tarda tanto y se dice que es un algoritmo ineficiente). En concreto, si vector tiene N elementos, hay que ejecutar alrededor de N*N pasos para completar la ordenación. El tiempo de ejecución es proporcional al número de pasos necesarios y, por lo tanto, crecerá exponencialmente (al ritmo de N 2 ) con el tamaño del vector. Por eso no es un método práctico cuando se trata de vectores muy grandes.

2. Ordenación por selección directa El algoritmo de selección directa también parte de un concepto bastante simple: es recorrer todo el vector para buscar el elemento más pequeño y, una vez localizado, colocarlo en la primera posición.

El elemento que estuviera ocupando la primera posición debe ser movido al lugar donde estaba el elemento más pequeño, claro, o de lo contrario se sobreescribiría y se perdería para siempre.

Después, haremos lo mismo buscando el segundo elemento más pequeño, moviéndolo a la segunda posición del vector. Luego buscamos el tercer elemento más pequeño, el cuarto, etc. Repitiendo esta búsqueda tantas veces como elementos tenga el vector, habremos conseguido ordenarlo.

A continuación se presenta una posible implementación en C.

Observe que también se necesitan dos bucles anidados para culminar el proceso, por lo que el número de pasos necesarios es alrededor de N 2 y, por lo tanto, el tiempo de ejecución también crece exponencialmente, como en el caso de la burbuja.

void ordena_vector(int v[LONGITUD_VECTOR])

{

int i, j, elem;

for (i = 1; i <>
{

for (j = LONGITUD_VECTOR - 1; j >=i; j--)

{

if (v[j-1] > v[j])

{

elem = v[j-1];

v[j-1] = v[j];

v[j] = elem;

}


}

}

}


Ordenación rápida (QUICKSORT) El algoritmo Quicksort (u ordenación rápida) es un método de ordenación mucho más elaborado que los dos anteriores y, por lo tanto, más difícil de comprender. La versión que presentamos es recursiva, pero existen implementaciones equivalentes iterativas, más difíciles (todavía) de comprender, pero más rápidas.
La idea es la siguiente: tomemos un elemento cualquiera del vector (generalmente el elemento central), que llamaremos pivote. Buscamos a la derecha del pivote todos los elementos que deberían estar a la izquierda (porque sean más pequeños que el pivote) y, a la izquierda, todos los que deberían estar a la derecha (por ser más grandes) e intercambiémoslos.


El proceso de intercambio de pares se repetirá hasta que alcancemos el pivote. Entonces, sabremos que todos los elementos de la derecha del pivote son mayores que éste, y, los de la derecha, son menores.
Ahora dividimos el vector en dos mitades: a la izquierda del pivote y a la derecha del pivote. Procesaremos cada mitad con el mismo procedimiento: buscar un nuevo pivote e intercambiar elementos de la izquierda y de la derecha.


Repetiremos el proceso hasta que los vectores sean triviales (es decir, hasta que el pivote coincida con los extremos izquierdo y/o derecho).


Este algoritmo necesita, por término medio, un número de pasos proporcional a N * log(N). Puede que no parezca mucho comparado con el N 2 que necesita la burbuja, pero, para tamaños muy grandes, la diferencia de tiempos es enorme.

NOTA: en esta implementación, por simplicidad, el vector v es una variable global


void ordena_vector(int iz, int de)
{
int i, j, x, w; i = iz;
j = de;
x = v[(iz+de) / 2];
do
{
while (v[i] < w =" v[i];" w =" v[i];">


video
MARTINEZ B, Néstor Raúl. METODO BURBUJA EN VECTORES . Universidad Cooperativa de Colombia seccional Bucaramanga, 2009 ó en el cd de la tesis en la ruta CD DE LOGICA DE PROG\VIDEOS BLOGGER LOGICA DE PROGRAMACION



MATRICES

Una matriz, tabla o array bidimiensional, como un vector, es una colección de elementos individuales, todos del mismo tipo, agrupados bajo el mismo identificador. La diferencia con el vector es que, en el momento de declararlo y de acceder a cada elemento individual, debemos utilizar dos índices en lugar de uno:



int matriz[4][4];


Tenemos aquí una variable compleja llamada matriz que no consta de 4 elementos enteros, sino de 16, es decir, 4×4. Podemos representar gráficamente la matriz como una tabla:
Cada casilla de la tabla o matriz es identificable mediante una pareja de índices. Normalmente, el primero de los índices se refiere a la fila, y el segundo, a la columna. Por ejemplo, si hacemos estas asignaciones:






matriz[0][0] = 5;

matriz[1][0] = 1;

matriz[3][2] = 13;


el estado en el que quedará la matriz será el siguiente
Por descontado, los dos índices de la matriz pueden ser diferentes, obteniéndose tablas que son más anchas que altas o más altas que anchas.


Por lo demás, las matrices se utilizan exactamente igual que los vectores. A modo de ejemplo, éste sería el código para inicializar una matriz de 5×10 enteros con todos sus elementos a 0. Observe cómo se usan los dos bucles anidados para acceder a todos los elementos:

int m[5][10];i

int i, j;for (i = 0; i<= 4; i++)

{

for (j = 0; j <= 9; j++)

{

m[i][j] = 0;

}

}


OPERACIONES BASICAS CON MATRICES


Manipulación de elementos individuales

Llenado de una matríz por definición: El llenado de la matríz se hace por filas y se hace de una vez.
n = Filas y m = Columnas.
int A[n][m]={{3,7,4,2},{1,1,1,1},{3,5,8,9},{4,3,7,8},{6,2,3,4} }


Llenado de una matris por lectura o teclado: Hay 2 formas por filas o por columnas

Por Filas Por columnas


for (i=0; i<=n-1, i++) for (j=0; j <=m-1,j++)

(j=0; j <=m-1, j++) for (i=0; i <=n-1,i++)

{

printf ("datos: ");

scanf ("%d", & v[i][j]);}
for (i=0; i<=n-1, i++)

for (j=0; j <=m-1,j++)

{

printf ("fila %d, columna %d, i++, j++");

scanf ("%d", & v[i][j]);

}
for (i=0; i<=n-1, i++)

{

printf ("fila %d, i++);

for (j=0; j <=m-1,j++)

{

printf ("columna %d, j++");

scanf ("%d", & v[i][j]);

}

}


Llenado de una matríz por asignación: Es ubicar la cantidad que se necesite en donde se desee
for (i=0; i<=n-1, i++)

for (j=0; j <=m-1,j++)

if (i=j)

v[i][j])=1;




Imprimir una matríz
for (i=0; i<=n-1, i++)

{

printf ("\n");

for (j=0; j <=m-1,j++)

printf ("%d\t", v[i][j]);

}

Suma por filas


float s[n]=0;

A[i][j]int suma=0;

for (i=0; i<=n-1, i++) {

suma=0;

for (j=0;j<=m-1, j++)

suma=suma+A[i][j];
s[i]=suma;





float A[n][m]=0;

int suma=0;
for (i=0; i<=n-1, i++)

{

suma=0;

for (j=0; j<=m-2, j++)

suma=suma+A[i][j];

A[i][m-1]=suma;




Suma por columnas


for (j=0; j<=m-1, j++)

{

suma=o;

for (i=0; i<=n-1, i++)

suma=suma+A[i][j];

s[j]=suma;




for (j=0; j<=m-1, j++)

{

suma=o;

for (i=0; i<=n-2, i++)

suma=suma+A[i][j];

A[n-1][j]=suma;


Imprimir la suma de las columnas

i=n-1;

for (j=0; j <=m-1, j++)
printf ("%f", A[i][j]);


Imprimir el total de la columna 2

i=4;
j=1;
printf ("%f",A[i][j]);




video



MARTINEZ B, Néstor Raúl.SUMA DE FILAS Y DE COLUMNAS EN UNA MATRIS DE MxN. Universidad Cooperativa de Colombia seccional Bucaramanga, 2009 ó en el cd de la tesis en la ruta CD DE LOGICA DE PROG\VIDEOS BLOGGER LOGICA DE PROGRAMACION

Ahora desarrolle las actividades que se encuentran en la plataforma moodle.



SEMANA 4 A LA SEMANA 8

ESTRUCTURAS BASICAS

Las Estructuras Básicas pueden ser:

Secuenciales : Cuando una instrucción del programa sigue a otra.

Selección o decisión : Acciones en las que la ejecución de alguna dependerá de que se cumplan una o varias condiciones.

Repetición, Iteración: Cuando un proceso se repite en tanto cierta condición sea establecida para finalizar ese proceso.

ESTRUCTURA SECUENCIAL Se caracteriza porque una acción se ejecuta detrás de otra. El flujo del programa coincide con el órden físico en el que se han ido poniendo las instrucciones.

Dentro de este tipo podemos encontrar operaciones de inicio/fin, inicialización de variables, operaciones de asignación, cálculo, sumarización, etc. Este tipo de estructura se basa en las 5 fases de que consta todo algoritmo o programa: Definición de variables (Declaración), Inicialización de variables, Lectura de datos, Cálculo, Salida.

Ejemplo: Se desea encontrar la longitud y el área de un círculo de radio 5.

video

MARTINEZ B, Néstor Raúl. Video Estrutura Secuencial. Universidad Cooperativa de Colombia seccional Bucaramanga, 2009 ó ver en el cd de la tesis en la ruta CD DE LOGICA DE PROG\VIDEOS BLOGGER LOGICA DE PROGRAMACION

ESTRUCTURAS SELECTIVAS Las estructuras selectivas o alternativas se clasifican en:

  • Simples
  • Dobles
  • Compuestas
  • Múltiples
Estructura de Selección Simple (IF) Se identifican porque están compuestos únicamente de una condición. La estructura si - entonces evalúa la condición y en tal caso:
Si la condición es verdadera, entonces ejecuta la acción Si (o acciones si son varias). Si la condición es falsa, entonces no se hace nada.


Estructura de Selección doble Son estructuras lógicas que permiten controlar la ejecución de varias acciones y se utilizan cuando se tienen dos opciones de acción, por la naturaleza de estas se debe ejecutar una o la otra, pero no ambas a la vez, es decir, son mutuamente excluyentes.

video

MARTINEZ B, Néstor Raúl. Ejm Estructura Doble. Universidad Cooperativa de Colombia seccional Bucaramanga, 2009 ó ver en el cd de la tesis en la ruta CD DE LOGICA DE PROG\VIDEOS BLOGGER LOGICA DE PROGRAMACIONo ver en CD de Proyecto de OVAS II Fase

Estructura selectiva compuesta En la solución de problemas encontramos casos en los que luego de tomar una decisión y marcar el camino correspondiente a seguir, es necesario tomar otra decisión. Dicho proceso puede repetirse numerosas veces. En aquellos problemas en donde un bloque condicional incluye otro bloque condicional se dice que un bloque está anidado dentro del otro.





Estructura selectiva multiple Se usa cuando existan más de dos elecciones posibles. Este problema se podría resolver por estructuras selectivas simples o dobles, anidadas o en cascada, pero si el número de alternativas es grande puede plantear serios problemas de escritura y de legibilidad.
Usando la estructura de decisión múltiple se evaluará una expresión que podrá tomar n valores distintos, 1, 2 , 3, ....,n y según que elija uno de estos valores en la condición, se realizará una de las n acciones o lo que es igual, el flujo del algoritmo seguirá sólo un determinado camino entre los n posibles.
Esta estructura se representa por un selector el cual si toma el valor 1 ejecutará la acción 1, si toma el valor 2 ejecutará la acción 2, si toma el valor N realizará la acción N.

LENGUAJES DE PROGRAMACION

(História de los lenguajes de programación) http://www.youtube.com/watch?v=MiMKWVqxSls&feature=related ó en el cd de la tesis en la ruta CD DE LOGICA DE PROG\VIDEOS BLOGGER LOGICA DE PROGRAMACION

Ya que este tema es bastante largo recomendamos que visite: http://www.lenguajes-de-programacion.com/

Los lenguajes de programación son herramientas que nos permiten crear programas y software. Entre ellos tenemos Delphi, Visual Basic, Pascal, Java, etc..Una computadora funciona bajo control de un programa el cual debe estar almacenado en la unidad de memoria; tales como el disco duro.Los lenguajes de programación de una computadora en particular se conoce como código de máquinas o lenguaje de máquinas.

Hay lenguajes de programación que utilizan compilador.

Un leguaje de programación es un conjunto de símbolos junto a un conjunto de reglas para combinar dichos símbolos que se usan para expresar programas. Los leguajes de programación constan de:.
Léxico : Conjunto de símbolos permitidos o vocabulario Sintaxis : Reglas que indican cómo realizar las construcciones del lenguaje Semántica: Reglas que permiten determinar el significado de cualquier construcción del lenguaje.

TIPOS DE LENGUAJES

Lenguaje de bajo nivel Es el tipo de lenguaje que cualquier computadora es capaz de entender. Se dice que los programas escritos en forma de ceros y unos están en lenguaje de máquina, porque esa es la versión del programa que la computadora realmente lee y sigue.

Lenguajes de alto nivel Son lenguajes de programación que se asemejan a las lenguas humanas usando palabras y frases fáciles de entender.

En un lenguaje de bajo nivel cada instrucción corresponde a una acción ejecutable por el ordenador, mientras que en los lenguajes de alto nivel una instrucción suele corresponder a varias acciones.

Características de los lenguajes de programacicón:

  • Son independientes de la arquitectura física de la computadora.
  • Permiten usar los mismos programas en computadoras de diferentes arquitecturas (portabilidad), y no es necesario conocer el hardware específico de la máquina.
  • La ejecución de un programa en lenguaje de alto nivel, requiere de una traducción del mismo al lenguaje de la computadora donde va a ser ejecutado.
  • Una sentencia en un lenguaje de alto nivel da lugar, al ser traducida, a varias instrucciones en lenguaje entendible por el computador.
  • Utilizan notaciones cercanas a las usadas por las personas en un determinado ámbito.
  • Se suelen incluir instrucciones potentes de uso frecuente que son ofrecidas por el lenguaje de programación.

GENERACION DE LOS LENGUAJES DE PROGRAMACION :

Lenguaje de máquina (Primera Generación) Es el lenguaje que la computadora entiende, su estructura está totalmente adaptada a los circuitos de la máquina y la programación es tediosa porque los datos se representan por ceros y unos. Es de bajo nivel. Es un conjunto de instrucciones codificadas en binario que son capaces de relacionarse directamente con los registros y circuitería del microprocesador de la computadora y que resulta directamente ejecutable por éste, sin necesidad de otros programas intermediarios.
Los datos se referencian por medio de las direcciones de memoria donde se encuentran y las instrucciones realizan operaciones simples. Estos lenguajes están íntimamente ligados a la CPU y por eso no son transferibles. (baja portabilidad). Para los programadores es posible escribir programas directamente en lenguaje de máquina, pero las instrucciones son difíciles de recordar y los programas resultan largos y laboriosos de escribir y también de corregir y depurar.

Lenguaje ensamblador (Segunda Generación) Es otro lenguaje de programación de bajo nivel, pero simbólico porque las instrucciones se construyen usando códigos de tipo mnemotécnico, lo cual facilita la escritura y depuración de los programas pero no los acorta puesto que para cada acción se necesita una instrucción. El programa ensamblador va traduciendo línea a línea a la vez que comprueba la existencia de errores. Si localiza alguno da un mensaje de error. Algunas características que lo diferencian del lenguaje de máquina son que permite el uso de comentarios entre las líneas de instrucciones; en lugar de direcciones binarias usa identificadores como total, x, y, etc. Y los códigos de operación se representan por mnemotécnica siempre tienen la desventaja de repertorio reducido de instrucciones, rígido formato para las instrucciones, baja portabilidad y fuerte dependencia del hardware. Tiene la ventaja del uso óptimo de los recursos hardware, permitiendo la obtención de un código muy eficiente. Ejemplo de algunos códigos mnemónicos son: STO para guardar un dato, LOA para cargar algo en el acumulador, ADD para adicionar un dato, INP para leer un dato, STO para guardar información, MOV para mover un dato y ponerlo en un registro, END para terminar el programa, etc. Con la tercera generación avanzamos a los lenguajes de alto nivel, muchos de los cuales se consideran exportables. Esto es, pueden correr en más de un tipo de computadoras, se les puede exportar de una máquina a otra.

Lenguaje de procedimientos (Tercera Generación) Son lenguajes de alto nivel similares al habla humana pero requieren cierta capacitación para su uso.

Ventajas :

a. Independencia de la arquitectura física de la computadora (portabilidad), esto significa que un mismo lenguaje puede funcionar (al menos en teoría) en distintos computadores, por lo que tanto el lenguaje como los programas escritos con él serán transportables de un computador a otro. En la práctica, esta característica resulta limitada por la gran diversidad de versiones y dialectos que se constituyen para cada lenguaje.

b. una sentencia en un lenguaje de alto nivel da lugar, al ser traducida, a varias instrucciones en lenguaje máquina. Se llaman de procedimientos porque están diseñados para expresar la lógica capaz de resolver problemas generales. Entre estos tenemos: Basic Pascal Cobol C Fortran Para que el lenguaje de procedimientos pueda funcionar debe traducirse a lenguaje de máquina a fin de que la computadora lo entienda. Para ello se han de usar programas traductores que realicen dicho proceso. Tienen la capacidad de soportar programación estructurada.

Lenguajes orientados a problemas (4GL) Resultan más eficaces para la resolución de un tipo de problemas a costa de una menor eficiencia para otros. Requieren poca capacitación especial de parte del usuario Son considerados de muy alto nivel Diseñados para resolver problemas específicos Incluye: lenguajes de consulta y generador de aplicaciones

  • Lenguajes de consulta: Permiten a no programadores usar ciertos comandos de fácil comprensión para la búsqueda y generación de reportes a partir de una base de datos.
  • Generador de aplicaciones: Quiere decir que cuando se diseña uno de estos lenguajes, se tiene en cuenta que su finalidad es la resolución de problemas, prescindiendo de la arquitectura del computador. Contiene varios módulos que han sido preprogramados para cumplir varias tareas.

Lenguajes naturales Lenguajes orientados a aplicaciones en inteligencia artificial, como lisp y prolog. Dentro de este campo destacan las aplicaciones en sistemas expertos, juegos, visión artificial (Jurasic Park) y robótica. Lisp es un lenguaje para procesamiento de listas y manipulación de símbolos. Prolog es un lenguaje basado en la lógica, para aplicaciones de bases de datos e Inteligencia Artificial.
Podemos decir entonces, que los lenguajes de alto nivel, tienen las ventajas de mayor legibilidad de los programas, portabilidad, facilidad de aprendizaje y facilidad de modificación.


ENTORNO DE DESARROLLO INTEGRADO (EDI)

Ver en el OVAS el temario del curso http://201.221.156.156/moodle

video

MARTINEZ B, Néstor Raúl. EDI V3. Universidad Cooperativa de Colombia seccional Bucaramanga, 2009 ó en el cd de la tesis en la ruta CD DE LOGICA DE PROG\VIDEOS BLOGGER LOGICA DE PROGRAMACION


ESTRUCTURAS REPETITIVAS O CICLO O BUCLE.

Son operaciones que se deben ejecutar un número repetido de veces. El conjunto de instrucciones que se ejecuta repetidamente cierto número de veces, se llama Ciclo, Bucle o Lazo .

Generalmente, son usados para hacer una acción repetida sin tener que repetir varias veces el mismo código, esto ahorra tiempo, deja el código más sencillo y facilita su modificación en el futuro.

Iteración es cada una de las diferentes pasadas o ejecuciones de todas las instrucciones contenidas en el bucle.

Fases de un Programa Cíclico :

  • Entrada de datos e instrucciones previas
  • Lazo o bucle Instrucciones finales o resto del proceso
  • Salida de resultado.

ESTRUCTURA DESDE/PARA (FOR) Se usa frecuentemente cuando se conoce de antemano el número de veces que se ejecutarán las acciones de un bucle.

A la estructura Desde/Para se le conoce como Repetitiva. Para utilizar esta estructura en algoritmos, debemos hacer uso de contadores y algunas veces de acumuladores, cuyos conceptos se describen a continuación:

CONTADOR: Un contador es una variable cuyo valor se incrementa o decrementa en una cantidad constante cada vez que se produce un determinado suceso o acción. Los contadores se utilizan con la finalidad de contar sucesos o acciones internas de un bucle; deben realizar una operación de inicialización y posteriormente las sucesivas de incremento o decremento del mismo. La inicialización consiste en asignarle al contador un valor. Se situará antes y fuera del bucle.
Representación: ¬ nombre del contador> + Si en vez de incremento es decremento se coloca un menos en lugar del más. Ejemplo: i = i + 1

ACUMULADOR O TOTALIZADOR : Es una variable que suma sobre sí misma un conjunto de valores para de esta manera tener la suma de todos ellos en una sola variable. La diferencia entre un contador y un acumulador es que mientras el primero va aumentando de uno en uno, el acumulador va aumentando en una cantidad variable.
Representación: ¬ +
Un ejemplo muy claro apra el ciclo For se verá cuando lleguemos a hablar de los vectores y la matrices.

ESTRUCTURA MIENTRAS (While) Se usa cuando queremos repetir la ejecución de unas sentencias un número indefinido de veces.

Su sintaxis es la siguiente: while(condición){ sentencia a ejecutar }

Para entender mejor el uso de while nos serviremos del siguiente ejemplo: while($color != "rojo"){ color= dame un color; }

ESTRUCTURA HACER MIENTRAS (Do While) El bucle DO. WHILE se usa cuando no sabemos el número de veces que va a ejecutarse un bucle pero lo que si tenemos claro es que por lo menos una vez si que se ejecutara la accion.

Su sintaxis es la siguiente:
do{
sentencia del bucle
}
while(condicion

video

MARTINEZ B, Néstor Raúl. Ejm Bucles. Universidad Cooperativa de Colombia seccional Bucaramanga, 2009 ó en el cd de la tesis en la ruta CD DE LOGICA DE PROG\VIDEOS BLOGGER LOGICA DE PROGRAMACION