Bueno este es un proyecto de investigacion en el cual he recopilado datos de muchas bibliografias en las cuales me han permitido aprender mucho y tambien datos en los cuales he podido aumentar a estos temas tan interesantes
viernes, 17 de abril de 2009
UML(UNIFIED MODELLING LANGUAJE)
Es lenguaje de modelado de sistemas de software más conocido y utilizado en la actualidad;está respaldado por el OMG (Object Management Group). Es el lenguaje gráfico para visualizar, especificar, construir y documentar un sistema. UML ofrece un estándar para describir un "plano" del sistema (modelo), incluyendo aspectos conceptuales tales como procesos de negocio y funciones del sistema y aspectos concretos como expresiones de lenguajes de programación, esquemas de bases de datos y componentes reutilizables.
Es importante resaltar que UML es un "lenguaje de modelado" para especificar o para describir métodos o procesos. Se utiliza para definir un sistema para detallar los artefactos en el sistema y para documentar y construir. En otras palabras, es el lenguaje en el que está descrito el modelo.
Se puede aplicar en el desarrollo de software entregando gran variedad de formas para dar soporte a una metodología de desarrollo de software (tal como el proceso unificado racional o RUP), pero no especifica en sí mismo qué metodología o proceso usar.
UML no puede compararse con la programación estructurada, pues UML significa LENGUAJE UNIFICADO DE MODELADO, no es programación, solo se diagrama la realidad de una utilización en un requerimiento. Mientras que, programación estructurada, es una forma de programar como lo es la orientación a objetos, sin embargo la programación orientada a objetos viene siendo un complemento perfecto de UML, pero no por eso se toma UML sólo para lenguajes orientados a objetos.
UML cuenta con varios tipos de diagramas, los cuales muestran diferentes aspectos de las entidades representadas. 1) MODELOS:
un modelo representa a un sistema software desde una perspectiva específica. Al igual que la planta y el alzado de una figura de un dibujo técnico nos muestran la misma figura vista desde distintos ángulos, cada modelo nos permite fijarnos en un aspecto distinto del sistema.
Los modelos de UML que se tratan en esta parte son los siguientes:
Diagrama de estructura estática.
Diagrama de casos de uso.
Diagrama de secuencia.
Diagrama de colaboración.
Diagrama de estados.
2) ELEMENTOS COMUNES A TODOS LOS DIAGRAMAS
2.1 Notas Una nota sirve para añadir cualquier tipo de comentario a un diagrama o a un elemento de un diagrama. Es un modo de indicar información en un formato libre, cuando la notación del diagrama en cuestión no nos permite expresar dicha información de manera adecuada. Una nota se representa como un rectángulo con una esquina doblada con texto en su interior. Puede aparecer en un diagrama tanto sola como unida a un elemento por medio de una linea discontinua. Puede contener restricciones, comentarios, el cuerpo de un procedimiento, etc.
2.2 Dependencias la relación de dependencia entre dos elementos de un diagrama significa que un cambio en el elemento destino puede implicar un cambio origen (por tanto, si cambia el elemento destino habría el elemento origen). Una dependencia se representa por medio de una linea de trazo discontinuo entre los dos elementos con una flecha en su extremo. El elemento dependiente es el origen de la flecha y el elemento del que depende es el destino (junto a él está la flecha).
3) DIAGRAMAS DE ESTRUCTURA ESTATICA
Los diagramas de estructura estática de UML se van a utilizar para representar tanto modelos conceptuales como diagramas de clases de diseño. Ambos usos son distintamente conceptualmente mientras los primeros modelan elementos del dominio los segundos presentan los elementos de la solución software. Ambos tipos de diagramas comparten una parte de la notación para los elementos que los forman (clases y objetos) las relaciones que existen entre los mismos (asociaciones). Sin embargo hay otros elementos de notacion que seran exclusivos de uno u otro tipo de diagrama.
3.1 Clases
Una clase se representa mediante una caja subdividida en tres partes: En la superior se muesta el nombre de la clase, en la media los atributos y en la inferior las operaciones. Una clase puede representarse de forma esquematica con los atributos y operaciones suprimidos, siendo entonces tan solo un rectangulo con el nombre de la clase. Se ve como una misma clase puede representarse a distinto nivel de detalle segun interese y segun la frase en la que este.
3.2 Objetos
Un objeto se representa de la misma forma que una clase. En el compartimento superior aparecen el nombre del objeto junto con el nombre de la clase subrayados, según la siguiente sintaxis: nombre_del_objeto: nombre_de_la_clase Puede representarse un objeto sin un nombre específico, entonces sólo aparece el nombre de la clase.
3.3 Asociaciones
Las asociaciones entre dos clases se representan mediante una línea que las une. La línea puede tener una serie de elementos gráficos que expresan características particulares de la asociación.
3.3.1 Nombre De La Asociacion y Direccion
El nombre de la asociación es opcional y se muestra como un texto que está próximo a la línea. Se puede añadir un pequeño triángulo negro sólido que indique la dirección en la cual leer el nombre de la asociación.Los nombres de las asociaciones normalmente se incluyen en los modelos para aumentar la legibilidad. Sin embargo, en ocasiones pueden hacer demasiado abundante la información que se presenta, con el consiguiente riesgo de saturación. En ese caso se puede suprimir el nombre de las asociaciones consideradas como suficientemente conocidas. En las asociaciones de tipo agregación y de herencia no se suele poner el nombre.
3.3.2 Multiplicidad
La multiplicidad es una restricción que se pone a una asociación, que limita el número de instancias de una clase que pueden tener esa asociación con una instancia de la otra clase. Puede expresarse de las siguientes formas:
• Con un número fijo: 1.
• Con un intervalo de valores: 2..5.
• Con un rango en el cual uno de los extremos es un asterisco. Significa que es un intervalo abierto.
Por ejemplo, 2..* significa 2 o más.
• Con una combinación de elementos como los anteriores separados por comas: 1, 3..5, 7, 15..*.
• Con un asterisco: * . En este caso indica que puede tomar cualquier valor (cero o más).
3.3.3 Roles
Para indicar el papel que juega una clase en una asociación se puede especificar un nombre de rol.Se representa en el extremo de la asociación junto a la clase que desempeña dicho rol.
3.3.4 Agregación
El símbolo de agregación es un diamante colocado en el extremo en el que está la clase que representa el “todo”.
3.3.5 Clases Asociacion
Cuando una asociación tiene propiedades propias se representa como una clase unida a la línea de la asociación por medio de una línea a trazos. Tanto la línea como el rectángulo de clase representan el mismo elemento conceptual: la asociación. Por tanto ambos tienen el mismo nombre, el de la asociación. Cuando la clase asociación sólo tiene atributos el nombre suele ponerse sobre la línea . Por el contrario, cuando la clase asociación tiene alguna operación o asociación propia, entonces se pone el nombre en la clase asociación y se puede quitar de la línea.
3.3.6 Navegabilidad
En un extremo de una asociación se puede indicar la navegabilidad mediante una flecha. Significa que es posible "navegar" desde el objeto de la clase origen hasta el objeto de la clase destino. Se trata de un concepto de diseño, que indica que un objeto de la clase origen conoce al (los) objeto(s) de la clase destino, y por tanto puede llamar a alguna de sus operaciones.
3.3.7 Herencia
La relación de herencia se representa mediante un triángulo en el extremo de la relación que corresponde a la clase más general o clase “padre”.
A continuacion se va a elaborar el analizis PIN
P Positivo
* Es un lenguaje gráfico.
* Se puede aplicar con software libre.
* Cuenta con varios tipos de diagramas.
* Muestra diferentes aspectos de las entidades representadas.
I Importante
* Es un lenguaje de modelado de sistemas de software mas conocido y utilizado en la actualidad.
* Ofrece un standar para describir un plano del sistema.
* Es un lenguaje de modelado para describir metodos o procesos.
* Se puede aplicar en el desarrollo de software entregando gran variedad de formas para dar soporte a una metodología.
* Es un standar insdustrial promovido por el grupo OMG.
N Negativo
* Carece de una semantica precisa.
* No es tan objetiva.
* No se presta con facilidad al diseño de sistemas distribuidos.
* No se puede señalar si un objeto es persistente o remoto.
BIBLIOGRAFÍA:
[Booch99] El Lenguaje Unificado de Modelado. G. Booch, J. Rumbaugh, I. Jacobson. Addison Wesley Iberoamericana, 1999. [Fowler99] UML Distilled. M. Fowler, K. Scott. Addison-Wesley, 99. [Larman99] UML y Patrones. C. Larman. Prentice Hall, 1999. [OMG99] Unified Modeling Language Specification, v1.3. Object Management Group (OMG), 1999. [OMG02] UML Home Page. Object Management Group (OMG). http://www.uml.org/
Entender que es un objeto es la clave para entender cualquier lenguaje orientado a objetos.
Existen muchas definiciones que se le ha dado al Objeto. Primero empecemos entendiendo que es un objeto del mundo real. Un objeto del mundo real es cualquier cosa que vemos a nuestro alrededor. Digamos que para leer este artículo lo hacemos a través del monitor y una computadora, ambos son objetos, al igual que nuestro teléfono celular, un árbol o un automóvil.
Analicemos un poco más a un objeto del mundo real, como la computadora. No necesitamos ser expertos en hardware para saber que una computadora está compuesta internamente por varios componentes: la tarjeta madre, el chip del procesador, un disco duro, una tarjeta de video, y otras partes más. El trabajo en conjunto de todos estos componentes hace operar a una computadora.
Internamente, cada uno de estos componentes puede ser sumamente complicado y puede ser fabricado por diversas compañías con diversos métodos de diseño. Pero nosotros no necesitamos saber cómo trabajan cada uno de estos componentes, como saber que hace cada uno de los chips de la tarjeta madre, o cómo funciona internamente el procesador. Cada componente es una unidad autónoma, y todo lo que necesitamos saber de adentro es cómo interactúan entre sí los componentes, saber por ejemplo si el procesador y las memorias son compatibles con la tarjeta madre, o conocer donde se coloca la tarjeta de video. Cuando conocemos como interaccionan los componentes entre sí, podremos armar fácilmente una computadora.
Todo objeto del mundo real tiene 2 componentes: características y comportamiento.
Por ejemplo, los automóviles tienen características (marca, modelo, color, velocidad máxima, etc.) y comportamiento (frenar, acelerar, retroceder, llenar combustible, cambiar llantas, etc.).
Los Objetos de Software, al igual que los objetos del mundo real, también tienen características y comportamientos. Un objeto de software mantiene sus características en una o más "variables", e implementa su comportamiento con "métodos". Un método es una función o subrutina asociada a un objeto.
Para redondear estas ideas, imaginemos que tenemos estacionado en nuestra cochera un Ford Focus color azul que corre hasta 260 km/h. Si pasamos ese objeto del mundo real al mundo del software, tendremos un objeto Automóvil con sus características predeterminadas:
Marca = Ford
Modelo = FocusColor = Azu
lVelocidad Máxima = 260 km/h
Cuando a las características del objeto le ponemos valores decimos que el objeto tiene estados. Las variables almacenan los estados de un objeto en un determinado momento.
Definición teórica: Un objeto es una unidad de código compuesto de variables y métodos relacionados.
Una clase define los atributos y los métodos de una serie de objetos. Todos los objetos de esta clase (instancias de esa clase) tienen el mismo comportamiento y el mismo conjunto de atributos (cada objetos tiene el suyo propio). En ocasiones se utiliza el término “tipo” en lugar de clase, pero recuerde que no son lo mismo, y que el término tipo tiene un significado más general.
En ¨, las clases están representadas por rectángulos, con el nombre de la clase, y también pueden mostrar atributos y operaciones de la clase en otros dos “compartimentos” dentro del rectángulo.
Atributos:
En UML, los atributos se muestran al menos con su nombre, y también pueden mostrar su tipo, valor inicial y otras propiedades. Los atributos también pueden ser mostrados visualmente:
+ Indica atributos públicos
# Indica atributos protegidos
- Indica atributos privadoS
Operaciones:
La operaciones (métodos) también se muestan al menos con su nombre, y pueden mostrar sus parámetros y valores de retorno. Las operaciones, al igual que los atributos, se pueden mostrar visualmente:
+ Indica operaciones públicas
# Indica operaciones protegidas
- Indica operaciones privadas
Plantillas:
Las clases pueden tener plantillas, un valor usado para una clase no especificada o un tipo. El tipo de plantilla se especifica cuando se inicia una clase (es decir cuando se crea un objeto). Las plantillas existen en C++ y se introducirán en Java 1.5 con el nombre de Genéricos.
Asociaciones de clases
Las clases se puede relaciones (estar asocionadas) con otras de diferentes maneras:
Generalización:
La herencia es uno de los conceptos fundamentales de la programación orientada a objetos, en la que una clase “recoge” todos los atributos y operaciones de la clase de la que es heredera, y puede alterar/modificar algunos de ellos, así como añadir más atributos y operaciones propias.
En UML, una asociación de generalización entre dos clases, coloca a estas en una jerarquía que representa el concepto de herencia de una clase derivada de la clase base. En UML, las generalizaciones se representan por medio de una línea que conecta las dos clases, con una flecha en el lado de la clase base.
Asociaciones:
Una asociación representa una relación entre clases, y aporta la semántica común y la estructura de muchos tipos de “conexiones” entre objetos.
Las asociaciones son los mecanismos que permite a los objetos comunicarse entre sí. Describe la conexión entre diferentes clases (la conexión entre los objetos reales se denomina conexión de objetos o enlace).
Las asociaciones pueden tener una papel que especifica el propósito de la asociación y pueden ser unidireccionales o bidireccionales (indicando si los dos objetos participantes en la relación pueden intercambiar mensajes entre sí, o es únicamente uno de ellos el que recibe información del otro). Cada extremo de la asociación también tiene un valor de multiplicidad, que indica cuántos objetos de ese lado de la asociación están relacionados con un objeto del extremo contrario.
En UML, las asociaciones se representan por medio de líneas que conectan las clases participantes en la relación, y también pueden mostrar el papel y la multiplicidad de cada uno de los participantes. La multiplicidad se muestra como un rango [mín...máx] de valores no negativos, con un asterisco (*) representando el infinito en el lado máximo.
Acumulación:
Las acumulaciones son tipos especiales de asociaciones en las que las dos clases participantes no tienen un estado igual, pero constituyen una relación “completa”. Una acumulación describe cómo se compone la clase que asume el rol completo de otras clases que se encargan de las partes. En las acumulaciones, la clase que actúa como completa, tiene una multiplicidad de uno.
En UML, las acumulaciones están representadas por una asociación que muestra un rombo en uno de los lados de la clase completa.
Composición:
Las composiciones son asociaciones que representan acumulaciones muy fuertes. Esto significa que las composiciones también forman relaciones completas, pero dichas relaciones son tan fuertes que las partes no pueden existir por sí mismas. Únicamente existen como parte del conjunto, y si este es destruido las partes también lo son.
En UML, las composiciones están representadas por un rombo sólido al lado del conjunto.
DIAGRAMAS DE CLASES:
Los diagramas de clases muestran las diferentes clases que componen un sistema y cómo se relacionan unas con otras. Se dice que los diagramas de clases son diagramas “estáticos” porque muestran las clases, junto con sus métodos y atributos, así como las relaciones estáticas entre ellas: qué clases “conocen” a qué otras clases o qué clases “son parte” de otras clases, pero no muestran los métodos mediante los que se invocan entre ellas.
MAPEO DE JAVA :
Supongamos que tenemos tenemos un el caso del Diccionario implementado mediante un árbol binario, en donde cada nodo posee:
key: Variable por la cual se realiza la búsqueda, puede ser generica.
item: Contenido a almacenar en el diccionario asociado a "key", cuyo tipo también puede ser genérico.
Para este caso particular hemos definido un Diccionario para almacenar String y Personas, las cuales pueden funcionar como llaves o como item, solo se mostrarán las relaciones para la implementación del Diccionario:
EJEMPLO DE JAVA:
Este ejercicio en java divide un números sucesivamente hasta conseguirel número de cifras que tiene un entero.
Por ejemplo si tu introduces el número 3454 el programa te devolveráun 4.
import java.io.
*;class Cifras
{
static int total=0;
static int x=0;
static int numCifras(int x)
{
while(x!=0)
{
x=x/10; total+=1; //incrementamos el contador
}
return total;
}
public static void main(String[]args) throws IOException
{
//BufferedReader para leer de consola BufferedReader leer = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Introduce un nu4mero:");
//leemos una línea como string String linea = leer.readLine(); /*
Convertirmos el string a un número. Podrías poner *un try y catch para comprobrar errores al convertirlo.Por *ejemplo si introducen un string*/ x= Integer.parseInt(linea); System.out.println("El numero de cifras es:"); //Imprimimos el número de líneas System.out.println(numCifras(x));}}
La Programación Orientada a Objetos (POO u OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones para diseñar aplicaciones y programas de computadora. Está basado en varias técnicas, incluyendo herencia, modularidad, polimorfismo, y encapsulamiento. Su uso se popularizó a principios de la década de 1990. Actualmente son muchos los lenguajes de programación que soportan la orientación a objetos.
INTRODUCCION:
Los objetos son entidades que combinan estado, comportamiento e identidad:
*El estado está compuesto de datos, serán uno o varios atributos a los que se habrán asignado unos valores concretos (datos).
*El comportamiento está definido por los procedimientos o métodos con que puede operar dicho objeto, es decir, qué operaciones se pueden realizar con él.
*La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras palabras, es su identificador (concepto análogo al de identificador de una variable o una constante).
La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar.
De esta forma, un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados métodos que favorecen la comunicación entre ellos. Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separan ni deben separarse el estado y el comportamiento.
ORIGEN:
Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Al parecer, en este centro, trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema basado en programas estáticos.
La programación orientada a objetos tomó posición como el estilo de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++, una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para las cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación dirigida por eventos.
CONCEPTOS FUNDAMENTALES:
La programación orientada a objetos es una nueva forma de programar que trata de encontrar una solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:
*Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas, (de c a d),Es la facilidad mediante la cual la clase D ha definido en ella cada uno de los atributos y operaciones de C, como si esos atributos y operaciones hubiesen sido definidos por la misma D.
*Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (métodos). Se corresponde con los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Es una instancia a una clase.
*Método: algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.
*Evento: un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento, a la reacción que puede desencadenar un objeto, es decir la acción que genera.
*Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.
*Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto y esto se define como sus características predeterminadas, y cuyo valor puede ser alterado por la ejecución de algún método.
*Estado interno: es una variable que se declara privada, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). No es visible al programador que maneja una instancia de la clase.
Componentes de un objeto:atributos, identidad, relaciones y métodos.
*Representación de un objeto: un objeto se representa por medio de una tabla o entidad que esté compuesta por sus atributos y funciones correspondientes.
CARACTERISTICAS:
Hay un cierto desacuerdo sobre exactamente qué características de un método de programación o lenguaje le definen como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes (para más información, seguir los enlaces respectivos):
*Abstracción: Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción.
*Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultación, principalmente porque se suelen emplear conjuntamente.
*Principio de ocultación: Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.
*Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.
*Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que reimplementar su comportamiento. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple.
LENGUAJES ORIENTADAS A OBJETOS
Entre los lenguajes orientados a objetos se destacan los siguientes:
La capacidad de presentación de información dentro de un objeto se divide en dos partes bien diferenciadas:
Interna: La información que necesita el objeto para operar y que es innecesaria para los demás objetos de la aplicación. Estos atributos se denominada privados y tienen como marco de aplicación únicamente a las operaciones asociadas al objeto.
Externa :La que necesitan el resto de los objetos para interactuar con el objeto que definimos . Estas propiedades se denominan públicas y corresponde a la información que necesitan conocer los restantes objetos de la aplicación respecto del objeto definido para poder operar.
Podemos imaginarla encapsulación como introducir el objeto dentro de una caja negra donde existen dos ranuras denominadas entrada y salida. Si introducimos datos por la entrada automáticamente obtendrá un resultado en la salida. No necesita conocer ningún detalle del funcionamiento interno de la caja.
El término encapsulación indica l capacidad que tienen los objetos de construir una cápsula a su alrededor, ocultando la información que contienen (aquélla que es necesaria para su funcionamiento interno, pero innecesaria para los demás objetos) a las otras clases que componen la aplicación.
Aunque a primera vista la encapsulación puede parecer superflua, tengamos en cuenta que existen muchas variables utilizadas de forma temporal: contadores y variables que contienen resultados intermedios, etc. D no ser por la encapsulación estas variables ocuparían memoria y podrían interferir en el funcionamiento del resto de los objetos.
La encapsulación no es exclusiva de los lenguajes de programación orientados a objetos. Aparece en los lenguajes basados en procedimientos (PASCAL, C, COBOL, ETC) como una forma de proteger los datos que se manipulan dentro de las funciones.
Los lenguajes OOP incorporan la posibilidad de encapsular también las estructuras de datos que sirven como base a las funciones. Aportan por tanto un nivel superior en cuanto a protección de información.
La encapsulación nos permite el uso de librerías de objetos para el desarrollo de nuestros programas. Recordemos que las librerías son definiciones de objetos de propósito general que se incorporan a los programas. Al ser el objeto parcialmente independiente en su funcionamiento del programa en donde está definido, ya que contiene y define todo lo que necesita para poder funcionar, es fácil utilizarlo en los mas variados tipos de aplicaciones. Si aseguramos , depurando las propiedades y las operaciones dentro de la clase que el objeto función bien dentro de una aplicación, con una correcta encapsulación el objeto podrá funcionar en cualquier otra.
Otra de las ventajas de la encapsulación es que , al definir el objeto como una caja negra con entradas y salida asociadas, en cualquier momento podemos cambiar el contenido de las operaciones del objeto, de manera que no afecte al funcionamiento general del programa.
La encapsulación está en el núcleo de dos grandes pilares de la construcción de sistemas; mantenibilidad y reusabilidad.
Mantenibilidad:
Cualidad que indica que un programa o sistema debe ser fácilmente modificable. Es decir que los cambios en las condiciones externas (como la definición de una nueva variable) implicarán modificaciones pequeñas en el programa / sistema. El concepto de mantenibilidad implica que un programa, al igual que un ser vivo debe ser capaz de adaptarse a un medio ambiente siempre cambiante.
Reusabilidad:
Cualidad que nos indica que partes del programa ( en este caso objetos) pueden ser reutilizados en la confección de otros programas. Ello implica que los objetos definidos en un programa pueden ser extraídos del mismo e implantados en otro sin tener que realizar modificaciones importantes en el código del objeto. El objeto final es que el programador construya una librería de objetos que le permita realizar programas basándose en la técnica de cortar y pegar. Esta extrae (corta) código de otras aplicaciones ya realizadas y las implementa (pega) en la aplicación a realizar donde, tras algunos retoques, la nueva aplicación estará lista para funcionar. Como podrá observar el concepto de reusabilidad, permite reducir el tiempo de realización , ganando en claridad, mantenibilidad y productividad.
La encapsulación de datos se muestra como una herramienta poderosa que nos permite ganar en tiempo de desarrollo y claridad, con el único coste adicional de definir con precisión las entradas y salida de nuestras operaciones.
Poliformismo:
El polimorfismo es una nueva característica aportada por la OOP. Esta propiedad indica la posibilidad de definir varias operaciones con el mismo nombre, diferenciándolas únicamente en los parámetros de entrada. Dependiendo del objeto que se introduzca como parámetro de entrada, se elegirá automáticamente cual de las operaciones se va a realizar.
Ya está habituado al operador <> que está presente en todos los lenguajes de programación. Sin embargo, los operadores <> y <> no existen en casi ningún lenguaje de programación.
Los lenguajes OOP permiten definir un operador <> tal que reconozca que tipo de objeto se le está aplicando, a través de operaciones de objetos. Previamente deberá definir la fracción y el número complejo como una clase y la operación suma como una operación de una clase.
Definiendo adecuadamente las operaciones suma de fracciones y suma de números imaginarios, el operador suma devolverá, en el caso que los operandos sean fracciones, una fracción y , en el caso de los números imaginarios, otros número imaginario.
Herencia:
La herencia es la última de las propiedades relativas a la OOP, Consiste en la propagación de los atributos y las operaciones a través de distintas sub-clases definidas a partir de una clase común.
Introduce, por tanto, una posibilidad de refinamiento sucesivo del concepto de clase. Nos permite definir una clase principal y , a través de sucesivas aproximaciones, cualquier característica de los objetos. A partir de ahora definiremos como sub-clases todas aquellas clases obtenidas mediante refinamiento de una (o varias) clases principales.
La herencia nos permite crear estructuras jerárquicas de clases donde es posible la creación de sub-clases que incluyan nuevas propiedades y atributos. Estas sub-clases admiten la definición de nuevos atributos, así como crear, modificar o inhabilitar propiedades.
Construcción de clases:
Tal como hemos definido con anterioridad, una clase de objeto describe a un grupo de objetos con similares:
*Propiedades (atributos)
*Comportamientos (operaciones)
*Relaciones con otros objetos
La abreviatura clase es utilizada en lugar de clase de objetos. Los objetos difieren en los valores asociados a sus atributos definidos dentro de la clase. Cada objeto <> cuál es su clase. La mayoría de los lenguajes orientados a objetos pueden determinar a que clase pertenece un objeto durante la ejecución del programa.
A continuación expondremos una serie de pasos para definir una clase.
Identificar los objetos.
Para ello examine la aplicación e identifique las distintas estructuras de datos, algunos tips a tener en cuenta son los siguientes:
El nombre de la aplicación a veces nos da la del nombre del objeto principal
Los objetos software pueden imitar el mundo real, modelizando las propiedades de los objetos a través de variables Cualquier propiedad de un objeto puede ser identificada dentro del objeto correspondiente a través de variables.
Los objetos no se han de corresponder siempre con objetos físicos, sino que también pueden ser entidades que se utilizan dentro de la construcción del programa.
Piense en el objeto en <persona>>. Este truco nos puede identificar claramente los atributos y sus operaciones asociadas: <>.
Una clase es un tipo de dato que puede ser usado para declarar objetos, de la misma forma que una estructura es un tipo definido por el usuario que puede utilizarse para declarar variables.
Definir las operaciones
Defina las operaciones a partir de los objetos, examinando las distintas operaciones asociadas a un conjunto de datos. Los atributos del objeto se deben definir de tal manera que éstos satisfagan todos los requerimientos de cada una de las operaciones.
A estas operaciones añada dos más: Crear y Destruir. Estas operaciones nos servirán para inicializar y borrar el objeto dentro de la aplicación.
A partir de la definición de las propiedades, un objeto siempre debe ser capaz de responder a estas tres preguntas: ¿Qué soy ?, ¿Qué hago? ¿Qué dejo ver al resto del mundo?
Algunas de las operaciones sólo se aplicarán a determinados objetos pertenecientes a las clases. Hemos visto que a través de la herencia podemos <> un sub conjunto de objetos creando una sub-clase.
Únicamente aquellas operaciones que sean comunes a todos los objetos de la clase deben incluirse dentro de las operaciones de la clase. El resto, que corresponden a las operaciones de sub-Grupos de objetos, se deben definir dentro de la especializaciones de la clase.
Definir los atributos de los objetos
Una vez identificados los objetos, defina los atributos de la clase. Un atributo es un valor almacenado en los objetos de la clase.
Aplicaciones orientadas a objetos
A lo largo de la historia de la programación, los lenguajes y las metodologías han pasado de una relativa simplicidad a una complejidad creciente. Los lenguajes de programación orientados a objetos pretenden aportar simplicidad a la tarea de programación de grandes aplicaciones.
Cuando se crearon las primeras computadoras todavía no existían los lenguajes de programación, tal como ahora los entendemos. El lenguaje ensamblador puede considerarse como el primer lenguaje de programación propiamente dicho. Permitía al usuario un diálogo más fluido con la máquina a través de instrucciones que tenían relación directa con el conjunto de operaciones que la máquina podía realizar.
A partir de este momento empezó la evolución de los lenguajes de programación. _cada uno tenía su entorno definido y aunque en realidad todos los lenguajes son polivalentes (en teoría, con cualquiera de ellos se puede desarrollar cualquier programa de gestión o científico). Pronto apareció la especialización funcional. Así, COBOL (Common Business Orientated Language) se introdujo como lenguaje mainframe para el diseño de aplicaciones de gestión.; FORTRAN (Formula Translator) para el diseño de aplicaciones científicas; APL (A Programming Language) para el cálculo matemático, etc.
A medida que el software tomaba importancia, aparecieron los primeros problemas relacionados con la programación. Al tiempo que aumenta el volumen de un programa, disminuye el control del mismo por parte del programador y la capacidad de este de dar mantenimiento.
En un intento de solucionar estos problemas aparecen las metodologías de programación. Una metodología es un conjunto de reglas destinadas a simplificar las tareas de diseño, estimación de costes, desarrollo y mantenimiento de un sistema informático. A menudo se ven acompañadas con unas herramientas (CASE: Computer Aided Software Engeneering) que permiten la elaboración estructurada y documentada de los sistemas informáticos.
DISEÑO DE APLICACIONES Y ELECCIÓN DE ENTORNO.
En entorno de programación implica tanto el lenguaje de programación como al empleo de una determinada metodología.
Los lenguajes de programación no se producen por generación espontánea y se ven influidos en gran manera por la forma en la que los profesionales piensan que se debe programar. De esta manera se crea un conjunto de reglas para simplificar la tarea de programación. Generalizadas y codificadas, se convierten en <<principios>> de los que surgen los lenguajes de programación en un afán por darles soporte.
Estos <<principios>> son modelos que proporcionan técnicas que , a su vez, deben aplicarse en el diseño e implementación de los programas. Estas técnicas nos indican la forma de resolver los distintos problemas que surgen a la hora de programar.
Decimos que un lenguaje de programación <> un conjunto de <> si el lenguaje simplifica la aplicación de estas técnicas. A estos <> se les denomina metodologías de programación.
Las metodologías de programación son modelos sobre como diseñar e implementar los programas. Diferentes modelos tienen como resultado diferentes técnicas. Que cada técnica sea distinta no implica que una sea la verdadera y que las demás falsas. Por el contrario, las metodologías se complementan entre sí. Lo que todas las metodologías tienen en común es la premisa de que hay que partir de abstracciones que corresponden a elementos del problema a resolver, y que la implementación de la solución se debe realizar mediante un conjunto de módulos preferiblemente reutilizables.
Las metodologías orientadas a objetos se centran en las estructuras de datos que sin embargo se relegan a un segundo plano en los modelos procedurales. La base de esta metodología es que una estructura de datos debe contener las operaciones que los modifican. La técnica que se utiliza para obtener esta <> es la encapsulación de los mismos en una estructura conocida como clase.
El accesos a los datos contenidos en la clase se realiza mediante las operaciones que la propia clase define. Por tanto, la metodología orientada a objetos complementa el punto de vista procedural de operaciones realizadas sobre un flujo de datos, al asociar a cada dato el conjunto de operaciones que lo modifican. Como podrá ver, ambos enfoques son complementarios.
Para ilustrar las diferencias entre las aproximaciones orientadas a procedimientos y las orientadas a objetos, considere el diseño de un <>
El compilador es un programa que a partir de un conjunto de fichero fuente (programa) construye el código objeto que posteriormente se convierte en programa. Para realizar su trabajo, el compilador lee el fichero fuente y separa de él las variables y las instrucciones. Las variables constituyen la tabla de símbolos del programa, mientras que las instrucciones se organizan en un árbol sintáctico donde se plasman todas la referencias que realizan los mandatos y funciones entre sí.
Un programa procedural simple
Vamos a plantear un ejemplo sencillo. Para ello supondremos un lenguaje imperativo con una sintaxis similar a la de Pascal (usaremos este lenguaje ficticio para simplificar la explicación, en los apéndices al final del artículo podrá encontrar ejemplos equivalentes en PHP, Python y Eiffel).
Supongamos que tenemos el siguiente programa:
program personas;
type persona = record
nombre: string;
apellido: string;
edad: integer
end;
procedure inicializar(n, a: string; e: integer; var p: persona);begin
p.nombre := n;
p.apellido := a;
p.edad :=
eend;
function es_mayor(p: persona):
boolean;begin
return p.edad >= 18
end;
function nombre_completo(p: persona):
string;begin
return p.nombre + ” ” + p.apellido;
end;
var p: persona;
begin inicializar(”Juan”, “Perez”, 25, p);
write(nombre_completo(p));
if (es_mayor(p)) then writeln (” es mayor de edad.”)
else
writeln (” es menor de edad.”)
end.
EJEMPLO:
la relación de herencia del ejemplo de las figuras aunque la clase base “Figura” tiene los métodos “calcularArea” y “calcularPerimetro”, las subclases “Circulo”, “Cuadrado”, “Triangulo” y “Rectangulo” redefinen estos métodos ya que el calculo del área y el perímetro de cada uno de ellos es diferente.
class Figura
{
protected double area;
protected double perimetro;
public Figura()
{
this.area=0;
this.perimetro=0;
}
public double getArea()
{
return area;
}
public double getPerimetro()
{
return perimetro;
}
public void calcularArea(){}
public void calcularPerimetro(){}
}
public class Circulo extends Figura
{ private double radio;
public Circulo()
{
super();
}
public double getRadio()
{
return radio;
}
public void setRadio(double radio)
{
this.radio = radio;
}
public void calcularArea()
{
this.area = Math.PI*Math.pow(this.radio,2.0);
}
public void calcularPerimetro()
{
this.perimetro = 2*Math.PI*this.radio;
}
EJEMPLO:
Vemos que el método “muevete” llama al método mover de un mamífero y aunque el no sabe con qué clase de mamífero trata, funciona y se llama al método correspondiente al objeto específico que lo llama (es decir, primero un gato y luego un perro). Si no existiera la ligadura dinámica tendríamos que crear un método “muevete” para los mamíferos de tipo “Gato” y otro para los de tipo “Perro”.
class Mamifero
{
public void mover()
{
System.out.println("Ahora es un mamifero el que se mueve");
}
}
class Perro extends Mamifero
{
public void mover()
{
System.out.println("Ahora es un perro el que se mueve");
}
}
class Perro extends Mamifero
{
public void mover()
{
System.out.println("Ahora es un gato el que se mueve");
Un diagrama de flujo de datos (DFD) es un modelo lógico-gráfico para representar el funcionamiento de un sistema en un proyecto software. Sus elementos gráficos son círculos, flechas, y rectángulos cerrados o abiertos. Los cerrados representan entidades externas mientras que los abiertos describen almacenes o archivos. Los círculos significan procesos y las flechas flujos de datos desde, o hacia, un proceso.
VENTAJAS DE LOS DIAGRAMAS DE FLUJO:
* Favorecen la comprensión del proceso a través de mostrarlo como un dibujo. El cerebro humano reconoce fácilmente los dibujos. Un buen diagrama de flujo reemplaza varias páginas de texto.
* Permiten identificar los problemas y las oportunidades de mejora del proceso. Se identifican los pasos redundantes, los flujos de los reprocesos , los conflictos de autoridad, las responsabilidades, los cuellos de botella, y los puntos de decisión.
* Muestran las interfases cliente-proveedor y las transacciones que en ellas se realizan, facilitando a los empleados el análisis de las mismas.
* Son una excelente herramienta para capacitar a los nuevos empleados y también a los que desarrollan la tarea, cuando se realizan mejoras en el proceso.
SIMBOLOS QUE SE EMPLEAN EN LOS DIAGRAMAS DE FLUJO
inicio o fin del programa
Pasos, procesos o líneas de instruccion de programa de co
Operaciones de entrada y salida
Toma de desiciónes y Ramificación
Conector para unir el flujo a otra parte del diagrama
Cinta magnética
Disco magnético
Conector de pagina
Líneas de flujo
Anotación
Display, para mostrar datos
OBSERVACION:
Para obtener la correcta elaboración de los símbolos, existen plantillas. Las puedes conseguir en Papelerías.
SIMBOLOS GRAFICOS:
+ MAS
- Menos
* Multiplicación
/ División
± Mas o menos
= Equivalente a
> Mayor que
<> Diferente de
Si
No
True
False
REGLAS PARA LA CREACION DE UN DIAGRAMA DE FLUJO
1.-Los Diagramas de flujo deben escribirse de arriba hacia abajo, y/o de izquierda a derecha.
2.-Los símbolos se unen con líneas, las cuales tienen en la punta una flecha que indica la dirección que fluye la información procesos, se deben de utilizar solamente líneas de flujo horizontal o verticales (nunca diagonales).
3.-Se debe evitar el cruce de líneas, para lo cual se quisiera separar el flujo del diagrama a un sitio distinto, se pudiera realizar utilizando los conectores. Se debe tener en cuenta que solo se van a utilizar conectores cuando sea estrictamente necesarias.
4.-No deben quedar líneas de flujo sin conectar
5.-Todo texto escrito dentro de un símbolo debe ser legible, preciso, evitando el uso de muchas palabras.
6.-Todos los símbolos pueden tener más de una línea de entrada, a excepción del símbolos.
EJEMPLOS:
Diagrama de flujo que encuentra la suma de los primeros 50 numeros naturales
Bueno, y ahora la descripción del diagrama anterior:
*El primer bloque indica el inicio del Diagrama de flujo .
*El segundo bloque, es un Símbolo de procesos En este bloque se asume que las variables suma y N han sido declaradas previamente y las inicializa en 0 para comenzar a el conteo y la suma de valores (Para declararlas existe el bloque Tarjeta perforada).
*El tercer bloque, es también un Símbolo de procesos En éste paso se incrementa en 1 la variable N (N = N + 1). Por lo que, en la primera pasada esta N valdrá 1, ya que estaba inicializada.
*El cuarto bloque es exactamente lo mismo que el anterior Pero en éste, ya se le agrega el valor de N a la variable que contendrá la suma (En el primer caso contendrá 1, ya que N = 1).
*El quinto bloque es uno Símbolo de Toma de decisiones y Ramificación Lo que hay dentro del bloque es una pregunta que se le hace a los valores que actualmente influyen en el proceso (Por decir algo, no se como decirlo, soy muy sope ) ¿Es N=50?, Obviamente la respuesta es no, ya que N todavía es 1. por lo que el flujo de nuestro programa se dirigirá hacía la parte en donde se observa la palabra no: Tercer Bloque, éste le sumará 1 (N=N+1) y vuelve a llegar a éste bloque, donde preguntará ¿Es N=50?... ¡No!, todavía es 2. Ha pues, regresa al Tercer bloque y vuelve hacer lo mismo. Y así hasta llegar a 50, obteniendo así la suma de los primeros 50 primeros números naturales.
*Por último indicamos que el resultado será mostrado en la impresora (Este lo puedes cambiarlo por el display para mostrar datos).
A CONTINUACION UN VIDEO EN EL QUE MUESTRA PASO A PASO PARA REALIZAR EL DIAGRAMA DE FLUJO DE VENTAS.
Un algoritmo es una serie de pasos lógicos, que se estructuran para resolver un problema.Generalmente un algoritmo se compone de sentencias simples y sentencias de control.
Los algoritmos están delimitados por la palabras : INICIO y FIN
Sentencias simples Asignación de variables
Se le asigna un valor a una variable, a través del simbolo de flecha(<--) que dice que el valor a la derecha tiene que ser asignado a la variable que está a la izquierda.
EJEMPLO:
a <-- 10 Se asigna un valor 10 a la variable a. Al escribir esta sentencia por primera vez en un algoritmo, da por entendido su declaración o creación. Comunmente al lado derecho de la flecha, se pueden realizar operaciones aritméticas (+,-,/,*), para que su resultado se le asigne a la variable. Además en estas operaciones se puede incluir la misma variable u otras. ejemplo :
INICIO
x <-- 5 y <-- 10 z <-- x + y z <-- y * x + 7 z <-- x/8 + y/9 + (7 + x/8) z <-- z + 1 z <-- z * z + y * y x <-- -x + -y + -3 FIN
EJEMPLO:
determinar cuánto vale (a,b,c) después de las siguientes sentencias de asignación INICIO
a <-- 2 b <-- a * 4 /* b <-- 2 * 4 = 8 */ a <-- b + 2 * a /* a <-- 8 + 2 * 2 = 12 */ b <-- 2 - a * b /* b <-- 2 - 12 * 8 = 2 - 96 = -94 */ a <-- a - b /* a <-- 12 - -94 = 12 + 94 = 106 */ b <-- -b + 6 /* b <-- --94 + 6 = 94 + 6 = 100 */ FIN
Para seguir en forma ordenada, el cambio de valores en las variables, se utiliza una tabla llamada traza. a 2
---------------
b
a 2
---------------
b 8
a 2 12
---------------
b 8
a 2 12
---------------
b 8 -94
a 2 12 106
----------------
b 8 -94 100
valores finales : a = 106 , b = 100
Por lo tanto si se pide una traza, se debe mostrar la última tabla. Los pasos anteriores son sólo pasos explicativos.
EJERCICIO:
hacer la traza del siguiente algoritmo INICIO
t <-- 1 p <-- 4 t <-- 3 * t p <-- p - 12 t <-- -t + 6 p <-- -p * -2 FIN
valores finales : t = 3 y p = -16
LECTURA DE VARIABLES:
En muchos algoritmos, el valor de alguna variable debe ser introducido dinámicamente por el usuario a través del teclado o algún otro medio. A esa acción le llamaremos "leer", que consiste en la asignación del valor de entrada, a la variable correspondiente. ejemplo: INICIO
a <-- 12 leer b a <-- a + b FIN
Si se tiene que leer más de una variable, se pueden escribir usando el separado coma.
EJEMPLO:
Leer a, b, c /* lee en ese orden las variables a, b y c */
DECLARACION DE UNA CONSTANTE:
Si se necesita incluir en el algoritmo alguna constante, se debe seguir la misma metodología de la asignación de variables, pero con la limitación que el identificador debe estar escrito con letras mayúsculas y que la declaración se haga a continuación del inicio del algoritmo.
Comentarios
Todo comentario de alguna sentencia, debe ir entre los simbolos /* */.Los comentarios son útiles para explicar mejor alguna sentencia que puede estar no clara, para alguien que se enfrenta a las sentencias por primera vez. Ej : INICIO
PI <-- 3.14 /* constante */ Leer radio area <-- 4 * PI * radio * radio /* area de una esfera */ FIN
COMPARACIONES:
Para comparar dos variables se usará la siguiente nomenclatura : a <> b /* esta sentencia es verdadera (true) si a es mayor que b , y es falsa (false) en caso contrario */
a <= b /* esta sentencia es verdadera (true) si a es menor o igual que b, y ees falsa " " */ a >= b /* esta sentencia es verdadera (true) si a es mayor o igual que b , y es falsa " " */
a == b /* esta sentencia es verdadera si a tiene el mismo valor de b, y es falsa en caso contrario */
a != b /* esta sentencia es verdadera si a no tiene el mismo valor de b, y es falsa en caso contrario */
METODO IMPRIMIR:
Se usara un método llamado "imprimir", para identificar una salida estándar (ej : pantalla o consola).
El método consiste de la palabra "imprimir", seguido de un conjunto de argumentos, delimitado entre paréntesis.
imprimir(..argumentos..)
Los argumentos pueden ser de dos tipos : constantes alfanuméricas o variables. Si se quiere encadenar una constante con una variable, se debe usar el separador '+'.
Ej: INICIO
imprimir("Ingrese radio : ") /* imprime el mensaje constante "Ingrese x : " */
leer radio
imprimir("El valor del radio ingresado es : " + radio) /* se encadena lo constante con lo variable */
imprimir(r * 2) /* imprime el resultado de la operación aritmética */
FIN
En el caso que la operación tenga el operador suma, se deben adicionar paréntesis para su correcta interpretación. Debe ser interpretado como un operador aritmético y no de concatenación. imprimir("la suma de a y b es : " + (a + b) )
imprimir("a + b + c +++") /* como el simbolo suma esta dentro de la cadena constante, limitada
por comillas "", es interpretado como caracter */
SENTENCIAS DE CONTROL
SENTENCIA SI SI (condicion) ENTONCES
sentencia_1
sentencia_2
:
sentencia_n
FIN SI
Si la condición es verdadera, entonces se ejecutarán en orden las sentencias delimitadas por el FIN SI.Si la condición es falsa o no se cumple, el punto de algoritmo ejecutará la sentencia posterior al FIN SI.
Ejemplo : Una vez leidos b y c, si c es mayor que b, entonces asignar a b el valor de c y a continuación asignar a c el valor del doble de b. INICIO
leer b
leer c
SI (c > b) ENTONCES
b <-- c c <-- 2 * b FIN SI
FIN
EJEMPLO:
Si a es igual a b, entonces imprimir "Diferencia cero". A continuación imprimir "Concluida la comparación" INICIO
leer b,c
SI (c == b) ENTONCES
imprimir("Diferencia cero")
FIN SI
imprimir("Concluida la comparación")
FIN
EN GENERAL :
Es válido, ejecutar un conjunto de sentencias de control, dentro de otra del mismo tipo. Para una ordenada notación, todas las sentencias contenidas dentro de otra sentencia, se escribiran dejando un número positivo (recomendado : 4) de espacios a la derecha, de la columna correspondiente al inicio de la sentencia.
Para el caso de la sentencia SI, a continuación se muestra una abertura del ciclo de segundo orden :
INICIO
SI (c + a > 0 ) ENTONCES
imprimir("c + a es mayor que cero")
SI (c - a > 0) ENTONCES
imprimir("a es menor que c );
FIN SI
FIN SI
FIN
SENTENCIA SI - SINO
SI (condicion) ENTONCES
sentencia(s)
SINO
sentencia(s)
FIN SI
Si la condición es verdadera, entonces se ejecutarán las sentencias anteriores al SINO. Si la condición es falsa, el punto de algoritmo ejecutará las sentencias posteriores al SINO.
Ejemplo : SI (a != b) ENTONCES
imprimir("a es distinto de b")
SINO
imprimir("a es igual b ")
FIN SI
Para eliminar el problema de tener muchas condiciones "SI (variable == valor_i) ENTONCES", se agrupan las instrucciones, en función del valor que tome cierta variable.
Ejemplo :
Algoritmo de la Calculadora INICIO
imprimir("1.- suma");
imprimir("2.- resta");
imprimir("3.- multiplicacion")
imprimir("4.- division")
imprimir("Ingrese opcion : ")
Leer a,b,opcion
SELECCION(opcion)
1 : imprimir("suma de " + a + " y " + b + " igual a : " + (a + b))
2 : imprimir("resta de " + a + " y " + b + " igual a : " + (a - b))
3 : imprimir("multiplicacion de " + a + " y " + b + " igual a : " + (a * b))
4 : SI (b != 0) ENTONCES
imprimir("division de " + a + " y " + b + " igual a : " + (a / b))
SINO
imprimir("division por cero --> infinito ")
FIN SI
FIN SELECCION
FIN
CICLOS ITERATIVOS
SENTENCIA MIENTRAS MIENTRAS (condicion) HACER
sentencia(s)
FIN MIENTRAS
Mientras se cumpla la condición, se ejecutarán las sentencias anteriores al FIN MIENTRAS. Además se cumple, que se puede entrar al ciclo, sólo si se cumple la condición. Finalmente, es muy importante determinar la variación de alguna variable, para quebrar la condición y no convertir al ciclo iterativo, en un "loop" o ciclo infinito.
EJEMPLOS:
Cantidad de dígitos de un número INICIO
Leer numero
contador <-- 0 MIENTRAS (numero > 0) HACER
numero <-- numero / 10 contador <-- contador + 1 FIN MIENTRAS imprimir("cantidad de digitos : " + contador) FIN
SENTENCIA HACER MIENTRAS
HACER
sentencia(s)
MIENTRAS (condición)
Se ejecutarán las sentencias, mientras se cumpla la condición. Además, una diferencia con la sentencia de control anterior, es que en ésta por lo menos se entra una vez en el ciclo.
Ej : leer un carácter, mientras sea distinto de '#' INICIO
HACER
leer caracter
MIENTRAS (caracter != '#')
FIN
SENTENCIA PARA PARA variable <-- valorInicial HASTA valorFinal HACER sentencia(s)
FIN PARA
Esta sentencia es útil para hacer variar el valor de una variable entera, permitiendo su inicialización y la determinación del último valor que puede tomar dentro del ciclo.
El ciclo cumple los siguientes pasos :
1) Inicializa el valor de la variable
2) Revisa la condición de término
3) SI se cumple la condición ENTONCES
ejecuta la sentencia
incrementa la variable
Vuelve al paso 2)
SINO saltar al paso 4)
4) Fin del ciclo
EJEMPLO:
1) Imprimir todos los dígitos (0..9)
PARA i <-- 0 HASTA 9 HACER imprimir(i) FIN PARA PROBLEMAS RESUELTOS Problema del triángulo Determinar si un triangulo es : equilatero, isóceles o escaleno, conociendo sus tres lados (a,b,c). INICIO
leer a,b,c
SI (a == b) ENTONCES
SI (b == c) ENTONCES
imprimir("Triangulo Equilátero")
SINO
imprimir("Triangulo Isóceles")
FIN SI
SINO
SI (b == c) ENTONCES
imprimir("Triangulo Isóceles")
SINO
imprimir("Triangulo Escaleno")
FIN SI
FIN SI
FIN
Problema del fósforo, el ventilador y la vela
Def : encender una vela con un fósforo, en función con las siguientes restricciones.
Existe un ventilador que se ubica frente al camino del fósforo prendido, el cual genera una corriente de aire, que se interpone a la llegada del fósforo prendido. Se cuenta con una cantidad limitada de fósforos, que se deben gastar completamente si es que no se lográra prender la vela. El ventilador no se puede apagar durante los intentos.
Variables
n : Número inicial de fósforos.
f : número de fósforos quemados. Por cada ensayo fallido, esta variable disminuirá en una unidad. Posibles valores : {n , n - 1 , n -2 , .. , 1 , 0 }.
velaApagada : estado lógico {true,false}
Métodos
intento() : retorna true si la vela fue prendida, retorna false en caso que la vela siga apagada.
imprimir() : imprime según los parámetros.
Una vez que se prende, mostrar o imprimr la cantidad de fósforos quemados y sin usar. Si no se prende nunca, imprimir el mensaje : "no se pudo prender la vela." INICIO
Leer n
velaPrendida <-- false f <-- 0 SI (velaPrendida == false) ENTONCES MIENTRAS (n - f > 0) HACER
f <-- f + 1 /* aumento en 1, los fosforos usados */ velaPrendida <-- intento() /* la variable puede tomar valor true o false */ SI (velaPrendida == true) imprimir("Cantidad de fosforos quemados :" + f ) imprimir("Cantidad de fosforos sin usar :" + (n - f) ) f <-- n /* se fuerza a salir del ciclo mientras, quebrando su condición */ FIN SI FIN MIENTRAS SINO imprimir("No se pudo prender la vela")
FIN SI FIN
Problema del reconocimiento de cadena en un proceso de transición de estados
Un proceso computacional, lee una cadena constante formada por ceros y unos (terminada en "#") ("0110#" , "11000110#",...) para verificar su reconocimiento o no.El proceso reconoce una cadena, si es que al terminar de leer ésta (leer caracter "#"), el proceso se encuentra en el estado c.Especificaciones del proceso1) El proceso parte en el estado a y lee el primer carácter de la cadena.2) Si el proceso está en el estado a y es leído un carácter "1" entonces el estado del proceso cambia a b. En caso contrario si es que el carácter leído es un "0", el estado se mantiene en a.3) Si el proceso está en el estado b y si lee un carácter "1" el proceso se mantiene en el mismo estado. En caso contrario, si el carácter leído es un "0" el estado cambiará a c. 4) Si el proceso está en el estado c y es leído un carácter "1" el proceso cambia al estado a. En caso contrario, si el carácter leído es un "0" el estado se mantiene en c. 5) La cadena no puede comenzar con el carácter "#". Cadenas que dejan el proceso en estado A : {"0#" , "00#" ,.., "101#" , "0101#" , "00101101#" ,...}Cadenas que dejan el proceso en estado B : {"1#" , "01#" ,.., "111#" , "0011#" , "01101011#" ,...}Cadenas que dejan el proceso en estado C : {"10#" , "010#" ,.., "001100#" , "101100110#" , ...}
Se pide diseñar un algoritmo que lea una cadena (String) y determine el estado del proceso en función de aquella.Además, si la cadena de entrada deja al proceso en el estado c, ésta se deberá imprimir, en caso contrario se deberá imprimir "cadena no reconocida".
Algoritmo INICIO
estado <-- a leer cadena
c <-- leerCaracter() HACER SELECCION(estado)
a : SI (c == 1) ENTONCES
estado <-- b FIN SI
b : SI (c == 0) ENTONCES
estado <-- c FIN SI
c : SI (c == 1) ENTONCES
estado <-- a
FIN SI
FIN SELECCION
c <-- leerCaracter() MIENTRAS (c != "#") SI (estado == c) ENTONCES imprimir(cadena) SINO imprimir("cadena no reconocida") FIN SI FIN
Problema de detención en un semáforo
Escribir el algoritmo, que describe las acciones que el conductor realiza ante el estado verde,amarillo o rojo de un semáforo. Tener en cuenta, que ante una luz amarilla, el conductor acelerará si es arriesgado, o desacelerará si es que es prudente.
Variables
luz : {VERDE , AMARILLA , ROJA} estaDetenido : {true,false}
Métodos
parte() , pasa() , acelera() , desacelera(), frena(), estaDetenido(), espera() INICIO
leer luz
SELECCION (luz)
VERDE : SI (estaDetenido == false) ENTONCES
parte()
SINO
pasa()
FIN SI
AMARILLA : SI (conductorEsArriesgado == true) ENTONCES
acelerarara()
SINO
desacelera()
frena()
FIN SI
ROJA : SI (estaDetenido == false) ENTONCES
desacelera()
frena()
SINO
espera()
FIN SI
FIN SELECCION
FIN
Problema de compra en función de la calidad de un lote de productos
Se requiere implementar un algoritmo, que permita registrar la calidad de un lote de productos, para agilizar el proceso de compra. El sistema consiste, en un lector de calidad que va leyendo mediante sensores a un producto dejado a través de una correa transportadora, para transmitir a continuación los datos a un software especial, depositado en un computador, que entrega hacia afuera uno de los siguientes estados numéricos :
0 : Producto MALO
1 : Producto DEFECTUOSO
2 : Producto BUENO
Especificaciones
a) Los datos que llegan en forma iterativa (mientras no se haya acabado el lote de productos a revisar), son rescatados por el método test().
b) El térnmino de la revisión está determinado cuando el método fin() retorne el valor true.
c) El algoritmo debe llevar un conteo de cuántos productos corresponden a cadaestado { MALO : 2 , DEFECTUOSO : 5 , BUENO : 43 }, para posteriormente aplicar un cálculo de porcentaje.
d) Inicialmente no se sabe la cantidad total de productos del lote, por lo tanto es fundamental que se implemente un contador para los cálculos posteriores.
e) El precio original de compra del lote, tiene que ser ingresado por el usuario. Después del análisis, se deberá imprimir según los criterios el precio propuesto de compra.
Una vez terminado el proceso de análisis y conteo, se determinará el precio de compra propuesto para el lote en cuestión.Criterios
1) Si el porcentaje de productos malos es superior al 15%, el lote no se compra (precio <-- 0). En caso contrario, pasar al punto 2
2) Si el porcentaje de productos defectuosos es menor a un 10%, se compra a un 70% del precio original. En caso contrario, pasar al punto 3
3) Si el porcentaje de productos buenos es mayor o igual a un 70%, el lote se compra al precio original. En caso contrario, se estaría comprando a un 60% del precio original.
Algoritmo INICIO N <-- 0 /* cantidad de productos analizados */ contMalos <-- 0 contDefect <-- 0 contBuenos <-- 0 precio <-- 0 /* precio en función del análisis */ leer precioInicial MIENTRAS (fin() != true) HACER calidad <-- test() SELECCION (calidad) 0 : contMalos <-- contMalos + 1 1 : contDefect <-- contDefect + 1 2 : contBuenos <-- contBuenos + 1 FIN SELECCION N <-- N + 1 FIN MIENTRAS SI (contMalos / N > 0.15) ENTONCES
precio <-- 0 SINO SI (contDefect / N <>= 0.7 )
ENTONCES
precio <-- precioOriginal SINO precio <-- precioOriginal * 0.6 FIN SI FIN SI FIN SI imprimir(precio) FIN
Problemas resueltos y una pequeño vistazo al lenguaje Java Problema de los trampolines
Se cuenta con dos trampolines olímpicos, para que una persona pueda realizar una serie de saltos, con tal de terminar parado en el segundo trampolín.
La distancia vertical entre los trampolines, es de 3 metros. Se sabe que siempre el primer salto es de 60 cm (0,6 mts).Además, se sabe que en cada salto se supera el rendimiento del salto anterior en un 30%. Determinar : cantidad de saltos necesarios para alcanzar el segundo trampolín y la altura máxima que se llega con respecto al primer trampolín. Además se necesita saber la altura alcanzada en cada salto. ejemplo : separación entre trampolines : 3.0porcentaje de aumento (0..1) : 0.3 cs altura -- ------ 1 0.6 2 0.78 3 1.014 4 1.3182 5 1.7137 6 2.2278 7 2.8961 Cantidad de saltos : 8 Altura maxima alcanzada : 3.765 seguir(1)/salir(0) : 0 Algoritmo INICIO cs <-- 1 /* cantidad de saltos */ h <-- 0.60 /* altura */ MIENTRAS( h < cs =" 1;" h =" 0.60;" seguir =" 1;" in =" new" h =" 0.6;" cs =" 1;" sep =" Double.parseDouble(in.readLine());" aumento =" Double.parseDouble(in.readLine());" seguir =" Integer.parseInt(in.readLine());" seguir ="=" href="http://pjsml.50megs.com/java/fuentes/Trampolin.java">Bajar archivo
Problema del electrón en los anillos
a ) Un electrón se mueve en un conjunto de 10 anillos, con una velocidad constante en cada uno de ellos . Una caracteristica de la trayectoria, es que una vez que completa el recorrido en un anillo, cambia de estado pasándose al anillo siguiente o más cercano al centro, con una velocidad 1.12 veces mayor a la anterior.
El electrón, después de recorrer el último anillo y llegar teóricamente al centro (k = 0), sale disparado perpendicularmente al radio del anillo, a una velocidad igual al doble de velocidad del radio uno (k = 1) por el último radio al cuadrado.
Además, la trayectoria cuenta con la caracteristica que el radio de cada anillo, es un 35% menor con respecto al anterior, siendo el radio inicial de 5.0 nm.
Finalmente, se sabe que el electrón tiene una velocidad inicial de 2.0 ns.
Datos
Para k : 1 , ... , 10 se tiene que
radio de cada anillo : radio_k-1 = radio_k * 0.65
Velocidad constante en cada anillo : v_k-1 = 1.12 * v_k
Tiempo_k = Distancia_k / Velocidad_k
radio inicial = 5.0 [nm]
velocidad disparo = 2 * v_1 * (1 + radio)^2
Determinar
Velocidad, distancia y tiempo en recorrer cada anillo, además del tiempo acumulado para recorrer los 10 anillos y la velocidad de disparo del electrón.
El algoritmo debe generar la siguiente salida : ingrese numero de anillos : 10
ingrese radio inicial : 5.0
ingrese velocidad inicial : 2.0
k radio Distancia Velocidad Tiempo
--- ----- --------- --------- ------
10 5.0 31.415 2.0 15.707963267948966
9 3.25 20.42 2.24 9.11622868229181
8 2.112 13.273 2.508 5.2906684316872115
7 1.373 8.627 2.809 3.07047721481847
6 0.892 5.607 3.147 1.781973383600005
5 0.58 3.645 3.524 1.0341809815535743
4 0.377 2.369 3.947 0.6001943196516281
3 0.245 1.54 4.421 0.3483270605121055
2 0.159 1.001 4.951 0.20215409761863268
1 0.103 0.65 5.546 0.11732157451081357
Velocidad disparo : 14.152
tiempo total : 37.26948901419321
Algoritmo INICIO
PI <-- 3.14 /* constante */ k <-- 10 radio <-- 5.0 velocidad <-- 2.0 distancia <-- 0 tiempo <-- 0 tiempoAcum <-- 0 imprimir("k radio Distancia Velocidad Tiempo"); imprimir("----------------------------------------------"); MIENTRAS (k > 0) HACER
distancia <-- 2 * PI * radio tiempo <-- distancia / velocidad tiempoAcum <-- tiempoAcum + tiempo imprimir(k + " " + radio + " " + distancia + " " + Velocidad" + " " + tiempo) velocidad <-- 1.12 * velocidad radio <-- radio * 0.65 k <-- k - 1 FIN MIENTRAS velocidad <-- 2 * velocidad * (1 + radio) * (1 + radio) imprimir("Velocidad disparo : " + velocidad) imprimir("tiempo total : " + tiempoAcum) FIN b ) Realizar un algoritmo en donde la cantidad de anillos, el radio inicial y la velocidad inicial, sean variables que deben ser leídas. Además, se quiere permitir tener la opción de salir o seguir calculando con nuevos valores. SoluciónINICIO PI <-- 3.14 /* constante */ distancia <-- 0 tiempo <-- 0 seguir <-- 1 HACER tiempoAcum <-- 0 /* en cada ciclo se debe inicializar en cero */ imprimir("ingrese numero de anillos : ") leer k imprimir("ingrese radio inicial") leer radio imprimir("ingrese velocidad inicial") leer velocidad imprimir("k radio Distancia Velocidad Tiempo"); imprimir("----------------------------------------------");
MIENTRAS (k > 0) HACER
distancia <-- 2 * PI * radio tiempo <-- distancia / velocidad tiempoAcum <-- tiempoAcum + tiempo imprimir(k + " " + radio + " " + distancia + " " + Velocidad" + " " + tiempo) velocidad <-- 4 * velocidad radio <-- radio * 0.65 k <-- k - 1 FIN MIENTRAS velocidad <-- 2 * velocidad * (1 + radio) * (1 + radio) imprimir("Velocidad disparo : " + velocidad) imprimir("tiempo total : " + tiempoAcum) imprimir("seguir(1)/salir(0) : ") leer seguir MIENTRAS (seguir == 1) FIN Programa en Java import java.io.*; public class Anillo { private static double redondear(double num) { double aux = num * 1000; int tmp = (int) aux; return (double) tmp / 1000; } public static void main(String[ ] args) throws IOException { double distancia = 0.0; double tiempo = 0.0; double tiempoAcum = 0.0; double radio; int k; double velocidad; int seguir = 1; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); do { tiempoAcum = 0.0; /* en vcada ciclo se debe inicializar en cero */ System.out.print("\n\ningrese numero de anillos : "); k = Integer.parseInt(in.readLine()); System.out.print("ingrese radio inicial : "); radio = Double.parseDouble(in.readLine()); System.out.print("ingrese velocidad inicial : "); velocidad = Double.parseDouble(in.readLine()); System.out.println("\n\nk\tradio\t\tDistancia\tVelocidad\tTiempo"); System.out.println("---\t-----\t\t---------\t---------\t------"); while (k > 0) {
distancia = 2.0 * Math.PI * radio;
tiempo = distancia / velocidad;
tiempoAcum = tiempoAcum + tiempo;
System.out.println(k + "\t" + redondear(radio) + "\t\t" + redondear(distancia) + "\t\t" +
redondear(velocidad) + "\t\t " + tiempo);
velocidad *= 1.12;
radio = radio * 0.65;
k--;
}
velocidad = 2.0 * velocidad * Math.pow(1.0 + radio, 2.0) ;
System.out.println("\n\tVelocidad disparo : " + redondear(velocidad));
System.out.println("\n\ttiempo total : " + tiempoAcum);
System.out.print("\n\n\tseguir(1)/salir(0) : ");
seguir = Integer.parseInt(in.readLine());
} while (seguir == 1);
}
}
UN VIDEO SOBRE ALGORITMOS SOBRE UN EJERCICIO DE INGRESO DE NOTAS EL CUAL TIENE QUE DESARROLLAR EL INGRESO DE NOTAS Y SACAR UN PROMEDIO.
OTRO VIDEO PARA OTRA DEMOSTRACION DE ALGORITMOS:
PSEUDOCODIGO
Un pseudocódigo (falso lenguaje), es una serie de normas léxicas y gramaticales parecidas a la mayoría de los lenguajes de programación, pero sin llegar a la rigidez de sintaxis de estos ni a la fluidez del lenguaje coloquial. Esto permite codificar un programa con mayor agilidad que en cualquier lenguaje de programación, con la misma validez semántica, normalmente se utiliza en las fases de análisis o diseño de Software, o en el estudio de un algoritmo. Forma parte de las distintas herramientas de la ingeniería de software.
No siendo el pseudocódigo un lenguaje formal, varían de un programador a otro, es decir, no hay una estructura semántica ni arquitectura estándar. Es una herramienta ágil para el estudio y diseño de aplicaciones, veamos un ejemplo, que podríamos definir como: lenguaje imperativo, de tercera generación, según el método de programación estructurada.
La definición de datos se da por supuesta, sobre todo en las variables sencillas, si se emplea formaciones: pilas, colas, vectores o registros, se pueden definir en la cabecera del algoritmo, y naturalmente cuando empleemos el pseudocódigo para definir estructuras de datos, esta parte la desarrollaremos adecuadamente.
DEFINICION DE ESTRUCTURAS DEL CONTROL:
Como se había mencionado antes, cada autor usa su propio pseudocódigo con sus respectivas convenciones. Por ejemplo, considere la instrucción "Reemplace el valor de la variable x por el valor de la variable y"; algunas de las posibles sintaxis para indicar lo anterior podrían ser:
asigne a X el valor de Y
X - Y
X := Y
X = Y
Sin embargo, independientemente de estas diferencias, muchos autores consideran tres estructuras de control para desarrollar los procedimientos:
SECUENCIAL:
Las instrucciones se siguen en una secuencia fija que normalmente viene dada por el número de renglón. Es decir que las instrucciones se ejecutan de arriba hacia abajo.
Instrucción1
Instrucción2
Instrucción3
.
:
Instrucción
SELECTIVA:
La instrucción selectiva determina si una determinada instrucción se ejecuta o no, según el cumplimiento de una condición P.
Si P entonces
instrucciones
FIN SI
La condición P es una variable booleana o una función reducible a booleana (lógica, Verdadero/Falso). Si esta condición es cierta se ejecuta Instrucciones1, si no es así, ésta no se ejecuta.
SELECTIVA DOBLE ( ALTERNATIVA)
La instrucción selectiva realiza una instrucción de dos posibles, según el cumplimiento de una condición P.
si P entonces
Instrucciones1
si no
Instrucciones2
fin si
La condición P es una variable booleana o una función reducible a booleana (lógica, Verdadero/Falso). Si esta condición es cierta se ejecuta Instrucciones1, si no es así, entonces se ejecuta Instrucciones2.
SELECTIVA MULTIPLE:
También es común el uso de una selección múltiple que equivaldría a anidar varias funciones de selección.
si Condición1 entonces
Instrucciones1
si no si Condición2 entonces
Instrucciones2
.
:
si no si Condiciónn entonces
Instruccionesn - 1
si no
Instruccionesn
fin si
*En este caso hay una serie de condiciones que tienen que ser mutuamente excluyentes, si una de ellas se cumple las demás tienen que ser falsas necesariamente, hay un caso si no que será cierto cuando las demás condiciones sean falsas.
En esta estructura si Condición1 es cierta, entonces se ejecuta sólo Instrucciones1. En general, si Condicióni es verdadera, entonces sólo se ejecuta Instrucciones.
SELECTIVA MULTIPLE-CASOS:
Una construcción similar a la anterior (equivalente en algunos casos) es la que se muestra a continuación.
seleccionar Indicador
caso Valor1:
Instrucciones1
caso Valor2:
Instrucciones2
.
:
caso Valorn-1:
Instruccionesn-1
[en otro caso:
Instruccionesn]
Fin seleccionar Indicador
*En este caso hay Indicador es una variable o una función cuyo valor es comparado en cada caso con Valori, si en algún caso coinciden ambos valores, entonces se ejecutarán las Instruccionesi correspondientes. La sección en otro caso es análoga a la sección si no del ejemplo anterior.
ITERATIVA:
Las instrucciones iterativas abren la posibilidad de realizar una secuencia de instrucciones más de una vez.
mientras P hacer
Instrucciones
fin mientras
*El bucle se repite mientras la condición P sea cierta, si al llegar por primera vez al bucle mientras la condición es falsa, el cuerpo del bucle no se ejecuta ninguna vez.
Existen otras variantes que se derivan a partir de la anterior. La estructura de control hacer se utiliza cuando es necesario que las instrucciones de una estructura mientras se ejecuten al menos una vez:
hacer
Instrucciones
mientras P
La estructura anterior equivaldría a escribir:
Instrucciones
mientras P hacer
Instrucciones
fin mientras
Una estructura de control muy común es el ciclo para, la cual se usa cuando se desea iterar sobre sobre un índice i (por convención se usa i, sin embargo se puede usar cualquier identificador):
para I -- X hasta n hacer
Instrucciones
fin para
la cual se define como:
I -- X
mientras I mayor o igual a N hacer
Instrucciones
i -- i+1
fin mientras
Por último, también es común usar la estructura de control para cada. Esta sentencia se usa cuando se tiene una lista o un conjunto L y se quiere iterar por cada uno de sus elementos:
para X pertenece L hacer
Instrucciones
fin para
Si asumimos que los elementos de L son L0,L1,L2 ,........,Ln entonces esta sentencia equivaldría A:
para I -- 0 hasta n hacer
X -- Li
Instrucciones
fin para
sin embargo, en la práctica existen mejores formas de implementar esta instrucción dependiendo del problema.
Es importante recalcar que el pseudocódigo no es un lenguaje estandarizado. Eso significa que diferentes autores podrían dar otras estructuras de control o bien usar estas mismas estructuras, pero con una notación diferente. Sin embargo, las funciones matemáticas y lógicas toman el significado usual que tienen en matemática y lógica, con las mismas expresiones.
EL ANIDAMIENTO:
Cualquier instrucción puede ser sustituida por una estructura de control. El siguiente ejemplo muestra un pseudocódigo de un método de ordenamiento denominado Ordenamiento de burbuja en el cual aparecen varias estructuras anidadas. Este algoritmo ordena una lista L.
procedimiento ORDENAR (L)
//L= (L1,L2,....., Ln) es una lista con n elementos//
hacer
INTERCAMBIO -- FALSO
para I -- 1 hasta N - 1 hacer
si L_{i+1}\,"
INTERCAMBIAR (Li , Li + 1)
INTERCAMBIO -- VERDADERO
fin si
fin para
mientras INTERCAMBIO = VERDADERO
fin procedimiento
*El pseudocódigo que a continuación se define fue tomado de la guía EGEL lnfo-Comp del CENEVAL. Sirve para escribir programas de computadora en lenguaje natural de tal manera que se facilite la comprensión, prueba y posterior codificación en un lenguaje de programación específico.
La relación de convenciones empleadas en el pseudocódigo es la siguiente:
*El pseudocódigo se escribe empleando la fuente Times New Roman Las palabras reservadas del pseudocódigo se muestran en negritas
*Los puntos "..." indican la posibilidad de repetir algún elemento del pseudocódigo
*Cuando exista la posibilidad de elegir algún elemento a partir de un conjunto de elementos, éstos se listarán separados por el símbolo ""
*Las diferentes opciones o posibilidades de uso del pseudocódigo se listan con viñetas
El pseudocódigo posee las características siguientes:
*Se emplean oraciones en lenguaje natural, donde cada una se refiere a una actividad general o específica
*Se utiliza un lenguaje común, sin palabras rebuscadas.
*Se evitan errores gramaticales, abreviaciones y puntuaciones
2.- TIPOS DE DATOS:
Los tipos de datos básicos son:
*string cadena de caracteres
*integer número entero
*real número real
*boolean falso o verdadero
Estos tipos de datos se declaran de acuerdo con las formas siguientes:
*tipo variable1
*tipo variable2, variable3 , ... , variablen
*tipo variablen1, variablen2, ... , variablenm = valor
donde: tipo puede ser string, integer, real o boolean.
3.- ESTRUCTURA DE DATOS:
Las estructuras de datos son:
*ARREGLOS
tipo array1[rango1,...,rangon], ... , array2[rango1, ... , rangon]
donde: rangon: número de localidades deseadas. La primera localidad se referencia con uno.
tipo: es alguno de los tipos de datos básicos o alguna estructura de datos.
*REGISTROS
Declaración:
record nombre_registro
tipo variable1
... ...
tipo variablen
end
Creación de un registro:
nombre_registro registro
La referencia a un campo de un registro se efectúa de la forma: registro.nombre_campo
*ARCHIVOS
Declaración:
file nombre_archivo
*CLASES
Declaración:
class nombre_clase
variables y funciones miembros
end
Instanciación de un objeto:
nombre_clase objeto
La referencia a un campo de una clase se efectúa de la forma: objeto.nombre_campo. El llamado a una función de una clase se efectúa de la forma: objeto.nombre_función(lista_parámetros)
4.- OPERADORES:
*ARITMETICOS:
+ suma
- resta
* multiplicación
/ división
mod módulo
div división entera
de comparación:
= igual
<> diferente
<> mayor que
<= menor o igual que >= mayor o igual que
*LOGICOS:
AND La expresión será verdadera si y sólo si ambas expresiones son verdaderas
OR La expresión será verdadera si al menos una expresión es verdadera
XOR La expresión será verdadera si y sólo si ambas expresiones son diferentes (verdadero y falso, o viceversa)
NOT El valor de la expresión es la negación de la expresión original
NOTA: La precedencia de los operadores la establecerán los paréntesis
5.- OPERACIONES DE CADENAS:
Las funciones para cadenas son las siguientes:
*LENGTH(nombre_de_la_cadena)
Regresa un valor entero que "contiene" la longitud de la cadena nombre_de_la_cadena
Regresa una cadena,
en donde:
posición inicial es la posición a partir de la cual se copiará el contenido de nombre_de_la_cadena
longitud es el número de caracteres que se copiarán
La forma para copiar el contenido de una cadena hacia otra es:
if c1 then
e1
else
e2
case variable expresión of
valor1: e1
valor2: e2
...
valorn: en
otherwise: ex
end
donde: otherwise es opcional
*LITERACIONES CONDICIONALES:
while c1
e1
do
e1
until c1
for variable = valor_inicial to c1, incremento decremento
e1
NOTAS:
*Es posible efectuar combinaciones de las estructuras de control de secuenciación, condición e iteración condicional.
*En puede ser una asignación, alguna estructura de control, combinación de estas últimas o una secuenciación delimitada por las palabras reservadas de: begin y end
cn es una condición
*Se recomienda que los pseudocódigos posean una indentación o sangría consistente
8.- FUNCIONES O PROCEDIMIENTOS
func nombre_función (lista_parámetros): tipo
begin
e1
...
en
return variable expresión valor
end
donde:
lista_parámetros, : tipo y return son opcionales
Para llamar a una función o procedimiento se escribe: nombre_función(lista_parámetros)
lista_parámetros en la definición de la función es de la forma: tipo variable1, tipo variable2, ..., tipo variablen
lista_parámetros en el llamado a la función es de la forma: variable1, variable2, ..., variablen
9.- OPERACIONES DE ENTRADA Y SALIDA:
*READ(variable1, variable2, ..., variablen)
Lee una(s) variable(s) del teclado
*WRITE("texto1", ... , "texton", variable1, ... , variablen)
Despliega texto(s) o el valor de una(s) variable(s) en el monitor
*OPEN(archivo, read write append read/write)
Abre un archivo en algún modo (escritura, lectura, adición o lectura/escritura, respectivamente)
*CLOSE(archivo)
Cierra un archivo previamente abierto
*READFILE(archivo, nombreRegistro)
Lee un registro de archivo dejando la información leída en nombreRegistro
*WRITEFILE(archivo, nombreRegistro)
Escribe o sobreescribe el contenido de nombreRegistro en el registro actual de archivo
*EOF(archivo)
Regresa verdadero si es el fin de archivo y falso en caso contrario
*ERROR(archivo)
Regresa verdadero si se presentó un error en la última instrucción ejecutada en un archivo y falso en caso contrario
*SEEK (archivo, inicio final registron)
Se posiciona al inicio, al final o en un registro x de archivo
*POSITION(archivo)
Regresa el número de registro actual en archivo
*El principal objetivo del pseudocódigo es el de representar la solución a un algoritmo de la forma más detallada posible, y a su vez lo más parecida posible al lenguaje que posteriormente se utilizara para la codificación del mismo. Las principales características de este lenguaje son:
Se puede ejecutar en un ordenador
*Es una forma de representación sencilla de utilizar y de manipular.
*Facilita el paso del programa al lenguaje de programación.
*Es independiente del lenguaje de programación que se vaya a utilizar.
*Es un método que facilita la programación y solución al algoritmo del programa. Todo documento en pseudocódigo debe permitir la descripción de:
-Instrucciones primitivas
-Instrucciones de proceso
-Instrucciones de control
-Instrucciones compuestas
-Instrucciones de descripción Estructura a seguir en su realización:
Cabecera:
*Programa:
*Modulo:
*Tipos de datos:
*Constantes:
*Variables:
Cuerpo:
*Inicio
*Instrucciones
*Fin
Para comentar en pseudocódigo se le antepone al comentario dos asteriscos (*)
Ejemplos
* Programa que calcula el área de un cuadrado a partir de un lado dado por teclado.
Programa: area_cuadrado
Modulo: main **( también se puede llamar principal)
Variables:
lado: natural
area: natural
Inicio
Visualizar "Introduce el lado del cuadrado"
Leer lado
Area<- lado * lado
Visualizar "El área del cuadrado es",
area Fin
* Programa que visualice la tabla de multiplicar del numero introducido por teclado
Programa: Tabla multiplicar
Modulo: main
Variables: t: entero
num : entero
Inicio
Visualizar "Introduce un número"
Leer num
Desde t=1 hasta t=10 repetir
Visualizar num, " X", t, "=", num*t
Fin desde Fin
Una vez que tenemos preparado un diagrama de flujos (ordinograma u organigrama) y un pseudocódigo ya podemos comenzar con la codificación del programa en nuestro ordenador. A partir de aquí todo varía dependiendo del lenguaje de programación que utilicemos, pero en todos los programas tendremos que definir los tipos de datos que utilizaremos. De todo esto hablaré en el siguiente artículo.