2.1.- Definición de clases, atributos, métodos y objetos.

Clases.
En el contexto del análisis y el diseño, una clase es una categoría o grupo de cosas que tienen atributos y comportamientos comunes.
La acción de agrupar los objetos de acuerdo a sus características comunes se llama clasificación y es una habilidad que utilizamos los humanos para organizar el conocimiento.
La clasificación puede verse como la acción de colocar cada objeto en un casillero etiquetado exprofeso para alojar a todos los objetos de esa clase.
Se acostumbra que los nombres para las clases se escriban en singular con la primera letra en mayúscula. Por ejemplo, los nombres para las clases de los objetos del aula serían:
Alumno
Profesor
Mesa
Silla
Pizarrón

También podemos observar que hay objetos compuestos de otros objetos. Por ejemplo, la silla está compuesta de:
4 patas
1 respaldo
1 asiento
A esta relación, donde un objeto está formado por otros objetos, se le llama agregación.
Otra relación consiste en que, a partir de un objeto existente, se pueda crear otro nuevo objeto, agregándole nuevos atributos o comportamientos. Por ejemplo, agregándole una paleta a una silla obtenemos un mesabanco. Esta relación se llama derivación.
En este caso, a partir de la clase Silla se ha formado una nueva clase llamada Mesabanco.
Objetos.
Un objeto es un instancia o caso particular de una clase.
Normalmente un objeto tiene una identidad personal que lo distingue de los demás objetos. De esta forma, un objeto tiene estado, comportamiento e identidad.
El estado de un objeto lo constituyen todos los datos que encapsula en un momento determinado. Un objeto tiene cierto numero de elementos que se conocen como atributos, cada uno de los cuales posee un valor.
El comportamiento es la manera en que actúa y reacciona un objeto, en función de sus cambios de estado y el paso de mensajes.
La identidad nos dice que un objeto tiene una existencia continuada. Por ejemplo los valores de los atributos de este objeto podrian cambiar, quizás como respuesta a un mensaje, pero seguiría siendo el mismo objeto.
Atributos.
Un atributo es una característica de un objeto. Por ejemplo, todos los objetos de la clase Lavadora tienen atributos como: la marca, el modelo, el numero de serie y la capacidad.
Por ejemplo:
miLavadora
Laudatorium
Washmeister
GL57774
7Kg.

Métodos.
Método es un término utilizado en algunos lenguajes de programación para referirse a algún comportamiento de los objetos de una clase.


2.2.- El modelo como resultado de la abstracción.

Modelo.
Un modelo es una representación abstracta de una especificación, un diseño o un sistema, desde un punto de vista de particular.
Objetivos:
Los modelos nos ayudan a visualizar cómo es o queremos que sea un sistema.
Los modelos nos permiten especificar la estructura o el comportamiento de un sistema.
Los modelos nos proporcionan plantillas que nos guían en la construcción de un sistema.
Los modelos documentan las decisiones que hemos adoptado.
Principios básicos del modelado
La elección de qué modelos crear tiene una profunda influencia sobre cómo se acomete un problema y cómo se da forma a una solución.
Los modelos adecuados pueden arrojar mucha luz sobre los problemas de desarrollo, ofreciendo una comprensión que simplemente no podríamos obtener de otra manera. Los modelos erróneos desorientan, haciendo que uno se centre en cuestiones irrelevantes.
Todo modelo puede ser expresado a diferentes niveles de precisión.
Los mejores tipos de modelos son aquéllos que permiten elegir el grado de detalle, dependiendo de quién está viendo el sistema y por qué necesita verlo.
Los mejores modelos están ligados a la realidad.
Es mejor tener modelos que tengan una clara conexión con la realidad y, donde esta conexión sea débil, saber exactamente cómo se apartan del mundo real esos modelos .
Un único modelo no es suficiente. Cualquier sistema no virtual se aborda mejor a través de un pequeño conjunto de modelos casi independientes.
La expresión clave aquí es "casi independiente". En este contexto significa tener modelos que podemos contruir y estudiar separadamente, pero aún así están relacionados.

2.3.- El UML como una herramienta de modelado de objetos.

Lenguaje de modelado.
Un lenguaje de modelado es una manera expresar los distintos modelos que se producen en el proceso de desarrollo. Un lenguaje de modelado define una colección de elementos del modelo.
UML ( Lenguaje Unificado de Modelado ) es un ejemplo de lenguaje de modelado. Un lenguaje de modelado como UML es, por tanto, un lenguaje estándar para los planos del software.
UML permite a los creadores de sistemas generar diseños que capturen sus ideas en una forma convencional y fácil de comprender, para comunicarlas a otras personas.
Diagramas UML de clases
Una clase es una categoría o grupo de cosas que tiene atributos y acciones similares. El símbolo que representa a la clase es un rectángulo dividido en tres áreas. El área superior contiene el nombre, el área central contiene los atributos, y el área inferior las acciones.
Los diagramas de clases facilitan las representaciones a partir de las cuales los desarrolladores podrán trabajar.
Los diagramas de clases colaboran en lo referente al análisis. Permite al analista hablarle a los clientes en su propia terminología, lo cual hace posible que los clientes indiquen importantes detalles de los problemas que requieren ser resueltos.
Al modelar un sistema orientado a objetos, el mundo puede dividirse al menos en un par de formas. En primer lugar está la división entre clase y objeto. Una clase es una abstracción y un objeto es una manifestación de una clase, como se muestra en la siguiente figura:



CLASE
OBJETO
Terminología y Conceptos
Una relación es una conexión entre elementos. En el lenguaje de modelado orientado a objetos, las tres relaciones mas importantes son las de dependencias, las generalizaciones y las asociaciones.
1.- Dependencia. Es una relación de uso que declara que un cambio en la especificación de un elemento puede afectar a otro elemento. Las dependencias se representan con una flecha y se emplean cuando se quiere indicar que un elemento utiliza a otro.
2.- Generalización. Es una relación entre un elemento general (llamado superclase o padre) y un caso mas específico de ese elemento (llamado subclase o hijo). La generalización se llama a veces relación "es-un" (un elemento mas general). Las relaciones se utilizan cuando se quieran mostrar relaciones padre/hijo.
.- Asociación. Es una relación estructural que especifica que los objetos de un elemento están conectados con los de otros. Las asociaciones se utilizan cuando se quiere representar relaciones estructurales, es decir, se define que se puede navegar desde un objeto de una clase hasta otro objeto de otra clase y viceversa. la asociación tiene cuatro tipos de partes: el nombre, el rol, la multiplicidad y la agregación.
La agregación representa una relación estructural entre iguales, es decir, ambas clases están conceptualmente en el mismo nivel, sin que ninguna sea más importante que la otra.
A veces se desea modelar una relación "todo/parte", en la cual una clase representa una cosa grande (el todo), que consta de elementos mas pequeños (las partes). Para especificar la agregación se utiliza el símbolo de rombo, que representa una relación de tipo "tiene-un".

2.4.- Planteamiento del problema

2.4.1.- Analizar el enunciado del problema

El problema
La parte más difícil en el desarrollo de un sistema es comprender, con suficiente grado de detalle, el problema a resolver.
La descripción inicial del problema, generalmente, suele ser incierta e insuficiente para realizar un análisis adecuado de los requisitos de los usuarios.
El análisis de requisitos es complejo, principalmente porque:
Diferentes usuarios tienen distintas prioridades, a veces en conflicto.
Los usuarios no suelen tener una visión clara y fácilmente expresable de lo que quieren. Por ejemplo, les resulta difícil distinguir entre lo que hace un sistema existente y lo que tiene que hacer un sistema adecuado.
Es difícil imaginar un sistema del cual sólo se ha visto su descripción, por lo que los usuarios pueden pensar que la descripción es correcta cuando en realidad falta algo vital.
Los encargados de hablar con los desarrolladores pueden no tener experiencia directa en el trabajo que realizan los usuarios del sistema.
Como un primer intento, se puede redactar una narrativa que describa el problema a resolver .
Ejemplo:
"El Tecnológico X nos ha contratado para desarrollar un sistema de software para administrar su biblioteca.
La biblioteca utiliza un programa que data de 1960, escrito en un lenguaje obsoleto. Con ese programa se llevan a cabo algunas tareas sencillas de gestión de libros y la búsqueda de usuarios por medio de un índice de credenciales. Se requiere construir un sistema que mantenga estos dos aspectos en línea"
Debido a que la información que arroja la narrativa anterior es muy escasa, se hace una investigación más detallada para averiguar hechos que ayuden a desarrollar un mejor sistema.
Libros, Revistas y Periódicos. La biblioteca tiene libros, revistas y periódicos. Puede haber uno o más ejemplares de un libro. El primer ejemplar se marca como "reserva". Los ejemplares de libros se pueden prestar a domicilio, excepto los marcados como "reserva". El período de préstamo a domicilio puede variar de 1 a 3 días. Un usuario puede tener en préstamo a domicilio hasta tres libros simultáneamente. Las revistas y los periódicos no se prestan a domicilio.
Consulta. Los usuarios pueden tomar los libros diréctamente de los anaqueles y leerlos dentro de la biblioteca. Al final, deberán depositarlos en los carritos dispuestos para tal efecto. Los empleados de la biblioteca se encargan de acomodar los libros que se encuentren en los carritos.Los usuarios leen las revistas y los periódicos en una sala especial.
Préstamos. Es muy importante que el sistema lleve un control de las fechas de préstamo y devolución de los libros, de acuerdo al procedimiento reglamentado. El sistema deberá informar si hay ejemplares disponibles de un libro para préstamo a domicilio.

2.4.2.- Identificar la funcionalidad del sistema.

Para que un sistema sea de alta calidad debe cubrir las necesidades de sus usuarios, por lo que el análisis de los sistemas debe hacerse con una fuerte orientación al usuario. Hay que identificar a los usuarios del sistema y a las tareas que deben realizar con el sistema. También hay que determinar cuáles tareas son las más importantes, para tomarlas como base en la planificación del desarrollo.
Casos de uso
Un caso de uso es una tarea que un actor ejecuta con ayuda del sistema.
Un actor es un usuario del sistema que tiene un rol particular. En este caso, un usuario puede ser una persona o un sistema externo; lo importante es que no forma parte del sistema que se está desarrollando.
El manejo de los casos de uso se facilita utilizando los diagramas de casos de uso de UML, donde un caso de uso se representa con un óvalo, y un actor con un monigote. Una línea une al actor con el caso de uso.
Ejemplo:
El detalle de cada caso de uso debería estar documentado en tercera persona y en voz activa.
Ejemplo:
Tomar prestado ejemplar de libro. Un usuario presenta un libro. El sistema verifica la identidad del usuario y que no tenga agotada su cuota de libros a préstamo. Si ambas verificaciones son positivas, el sistema registra la clave de identidad del usuario, la clave del ejemplar, la fecha actual y la fecha de devolución; en caso contrario, rechaza la solicitud de préstamo.
En la siguiente figura se muestra el sistema de biblioteca con algunos casos de uso y algunos actores.

2.5.- Análisis

2.5.1.- Descubrir objetos en el dominio del problema

El análisis
Para crear una aplicación de software hay que describir el problema y las necesidades o requerimientos( en qué consiste el problema y qué debe hacerse).
El análisis se centra en una investigación del problema, no en la manera de definir una solución.
La metodología
Normalmente, se utilizan las clases para modelar abstracciones extraídas del problema que se intenta resolver o de la tecnología para implementar una solución a ese problema. Cada una de estas abstracciones es parte del vocabulario del sistema, es decir, representan el conjunto de elementos que son importantes para los usuarios y los implementadores.
Para los usuarios, la mayoría de las abstracciones no son difíciles de identificar ya que, normalmente, las extraen de los objetos que usan para describir su sistema.
Para modelar el vocabulario de un sistema hay que:
1.- Identificar aquellas cosas que utilizan los usuarios o programadores para describir el problema o la solución.
2.- Identificar un conjunto de responsabilidades, para cada abstracción, y asegurarse de que cada clase está claramente definida y que hay un buen reparto de responsabilidades entre todas las clases.
3.- Proporcionar los atributos y operaciones necesarios en cada clase, para cumplir estas responsabilidades.
Identification de objetos
La identificación de objetos se hace examinando la descripción del problema (análisis gramatical del enunciado o descripción) y localizando nombres o cláusulas nominales. Normalmente, estos nombres y sus sinónimos suelen ser candidatos a objetos para nuestro modelado orientado a objetos.
Los objetos pueden caer dentro de las siguientes categorías:
Cosas tangibles (avión, libro, automóvil, fuente de alimentación, articulo).
Papeles representados por personas (gerente, cliente, empleado, medico, paciente).
Organizaciones (empresa, división, equipo, grupo, departamento).
Incidentes o sucesos (vuelo, accidente, llamada, anuncio).
Interacciones entre otros objetos (compras -comprador-vendedor-articulo-, matrimonio -esposo-esposa-iglesia-).
Lugares (sala de embarque, muelle de carga, pista de aterrizaje)
Ejemplo
En el análisis orientado a objetos del sistema de información de una biblioteca, se identificarían clases de objetos como: Libro, Cliente, Biblioteca, los cuales son una representación dentro del dominio del problema, como se muestra en la siguiente figura:
objeto de la clase Libro
abstracción en el análisis
La figura muestra cómo se descubren objetos que, con frecuencia, son parte del planteamiento del problema ( como libro) , o a veces se encuentran implicitos ( como: préstamo, multa, etc).


2.5.2.- Identificar atributos de los objetos

Atributos
Una vez que hemos logrado identificar los objetos que están en el dominio del problema, el segundo paso es identificar los atributos y métodos que actúan sobre ellos.
Los atributos son las propiedades de una clase de objetos; se identifican con un nombre y describen un rango de valores que pueden tener dichos objetos.
Los atributos determinan el estado de un objeto.
Ejemplos:

2.5.3.- Identificar metodos en los objetos

Métodos
Los métodos (operaciones o servicios) describen el comportamiento asociado a un objeto. Representan las acciones que pueden realizarse por un objeto o sobre un objeto.
La ejecución de un método puede conducir a cambiar el estado del objeto o dato local del objeto.
Declaración
Cada método tiene un nombre y un cuerpo que realiza la acción o comportamiento asociado con el nombre del método. En un lenguaje de programación orientado a objetos, el cuerpo del método consta de un bloque de código procedimental que ejecuta la acción requerida.
Todos los métodos que alteran o acceden a los datos de un objeto se definen dentro del objeto. Un objeto puede modificar directamente o acceder a los datos de otros objetos.
Mensajes
Un método dentro de un objeto se activa por un mensaje que es enviado por otro objeto.
Los objetos realizan acciones cuando reciben un mensaje. El mensaje es esencialmente una orden que se envía para indicarle que realice alguna acción.
El envío de mensajes a los objetos equivale al concepto de invocación a funciones de la programación procedimental (denominada también imperativa o algorítmica).

2.6.- Introducción al diseño de la solución

2.6.1.- Representación gráfica de un sistema de clases

Términos y conceptos
Sistema
Un sistema es una colección de subsistemas organizados para lograr un propósito descrito por un conjunto de modelos, posiblemente desde diferentes puntos de vista.
Un sistema representa la cosa que se está desarrollando, observada desde diferentes perspectivas mediante diferentes modelos, y con vistas presentadas en forma de diagramas.
Subsistema
Un subsistema es un grupo de elementos, algunos de los cuales constituyen una especificación del comportamiento ofrecido por los otros.
Modelo
Un modelo es una abstracción semánticamente cerrada de un sistema, es decir, representa una simplificación completa y autoconsistente de la realidad.
Vista
Una vista es una proyección de la organización y estructura de un modelo del sistema, centrada en un aspecto del sistema.
Diagrama
Un diagrama es la representación gráfica de un conjunto de elementos, normalmente mostrado como un grafo conexo de nodos (elementos) y arcos (relaciones).
Un diagrama es sólo una proyección gráfica de los elementos que configuran un sistema.
Por ejemplo, se podrían tener cientos de clases en el diseño de un sistema de recursos humanos de una empresa, y nunca se podrá ver la estructura o el comportamiento de ese sistema mirando un gran diagrama con todas esas clases y relaciones. En cambio, sería preferible realizar varios diagramas, cada uno centrado en una vista. Así, podría crearse un diagrama de clases que incluyese clases como: Persona, Departamento y Oficina, agrupadas para formar el esquema de una base de datos. Probablemente, algunas de las clases mencionadas formarán parte de un diagrama de interacción que reasigne un objeto de la clase Persona a un objeto de la clase Departamento.
Como muestra este ejemplo, un mismo elemento de un sistema (como la clase Persona) puede aparecer muchas veces en el mismo diagrama o incluso en diagramas diferentes. Cada diagrama ofrece una vista diferente de los elementos que configuran el sistema.
Diagramas estructurales
Los diagramas estructurales representan la parte estática de un sistema y se denominan:
Diagramas de clases.
Diagramas de objetos.
Diagramas de componentes.
Diagramas de despliegue.

Diagramas de comportamiento
Los diagramas de comportamiento representan la parte dinámica de un sistema y se denominan:
Diagramas de casos de uso.
Diagramas de secuencia.
Diagramas de colaboración.
Diagramas de estados.
Diagramas de actividades.

2.6.2.- Diagramas de comportamiento

Los diagramas de comportamiento se emplean para visualizar, especificar, construir y documentar los aspectos dinámicos de un sistema.
Los aspectos dinámicos de un sistema de software involucran cosas tales como el flujo de mensajes a lo largo del tiempo y el movimiento físico de componentes en una red.
A continuación se describe y ejemplifica cada uno de los cinco diagramas de comportamiento de UML.
Diagramas de casos de uso
Un diagrama de casos de uso representa un conjunto de casos de uso y actores (un tipo especial de clases) y sus relaciones.
Un caso de uso es una descripción de un conjunto de secuencias de acciones (incluyendo variantes) que ejecuta un sistema para producir un estado observable, de valor para un actor.
Un caso de uso se representa por medio de una elipse; el actor por medio de un monigote.
Por ejemplo, si una persona trabaja para un banco, podría ser un ResponsablePréstamos e interactuar con el caso de uso Procesar préstamo, como se muestra en la siguiente figura.
Actor
Caso de uso
Un actor representa un conjunto coherente de roles que los usuarios de los casos de uso juegan al interactuar con éstos. Normalmente, un actor representa un rol que es jugado por una persona, un dispositivo hardware o incluso otro sistema.
Un caso de uso realiza cierto trabajo cuyo efecto es tangible. Desde la perspectiva de un actor determinado, un caso de uso produce algo de valor para algún actor; por ejemplo, el cálculo de un resultado, la generación de un nuevo objeto, o un cambio de estado de otro objeto.
Diagramas de secuencia
Un diagrama de secuencia es un diagrama de interacción que destaca la ordenación temporal de los mensajes. Gráficamente, un diagrama de secuencia es una tabla que representa objetos, dispuestos a lo largo del eje X, y mensajes, ordenados según se suceden en el tiempo, a lo largo del eje Y.
En un diagrama de secuencia destaca la ordenación de los mensajes respecto al tiempo, como muestra la siguiente figura del ejemplo de una lavadora:
Los diagramas de secuencia se forman colocando en primer lugar los objetos que participan en la interacción en la parte superior del diagrama, a lo largo del eje X. Normalmente se coloca a la izquierda el objeto que inicia la interacción, y los objetos subordinados a la derecha. A continuación se colocan los mensajes que estos objetos envían y reciben a lo largo del eje Y, en orden de sucesión en el tiempo, desde arriba hasta abajo. Esto ofrece al lector una visión clara del flujo de control a lo largo del tiempo, con base en la línea de vida.
La línea de vida de un objeto es una línea discontínua vertical que representa la existencia de un objeto a lo largo de un periodo de tiempo. La mayoría de los objetos que aparecen en un diagrama de interacción existirán mientras dure la interacción, así que los objetos se colocan en la parte superior del diagrama, con sus líneas de vida dibujadas desde arriba hasta abajo. Pueden crearse objetos durante la interacción; sus líneas de vida comienzan con la recepción del mensaje estereotipado como "create". Los objetos pueden destruirse durante la interacción. Sus líneas de vida acaban con la recepción del mensaje estereotipado como "destroy" (además, se muestra la señal visual de una gran X que marca el final de sus vidas).
Diagramas de colaboraciones
Colectivamente, los objetos que interactúan para ejecutar alguna tarea, junto con los enlaces entre ellos, se conocen como colaboraciones.
Por ejemplo, se puede agregar un cronómetro interno al conjunto clases que constituyen a una lavadora. Luego de cierto tiempo, el cronómetro detendrá el flujo de agua y el tambor comenzará a girar de un lado a otro.
Diagramas de interacción
Un diagrama de interacción muestra una interacción que consta de un conjunto de objetos y sus relaciones, incluyendo los mensajes que pueden enviarse entre ellos.
Los diagramas de interacción cubren la vista dinámica de un sistema.
Tanto los diagramas de secuencia como los diagramas de colaboración son un tipo de diagramas de interacción, porque:
Un diagrama de secuencia resalta la ordenación temporal de los mensajes.
Un diagrama de colaboración resalta la organización estructural de los objetos que envían y reciben mensajes.

Diagramas de estados
Un diagrama de estados representa una máquina de estados, constituída por estados, transiciones, eventos y actividades.
Los diagramas de estados se utilizan para mostrar cómo reacciona un objeto cada vez que recibe un mensaje .
Los diagramas de estados son especialmente importantes para modelar la funcionalidad de un sistema, así como para resaltar el flujo de control entre objetos.
Ejemplo:
Una lavadora puede estar en la fase de remojo, lavado, enjuague, centrifugado o apagada, y cambiará de una a otra, de acuerdo al siguiente diagrama de estados.

3.1.1.- Elementos y reglas de la representación gráfica de los algoritmos.

Concepto y características de algoritmo
El programador de computadoras es una persona que resuelve problemas. Es por ello que, para llegar a ser un programador eficaz, se necesita aprender a resolver problemas de un modo riguroso y sistemático.
El eje central de la metodología para resolver estos problemas es el algoritmo. Un algoritmo es un método para resolver un problema.
La palabra algoritmo proviene de Mohammed al-KhoWârizmi, matemático persa que vivió durante el siglo IX y alcanzó gran reputación por el enunciado de las reglas paso a paso para sumar, restar, multiplicar y dividir números decimales. La traducción al latín del apellido en la palabra algorismus derivó posteriormente en algoritmo.
La resolución de un problema exige el diseño de un algoritmo que resuelva el problema, como lo muestra la siguiente figura:
Pasos para la resolución de un problema
1.- Diseño del algoritmo que describe la secuencia ordenada de pasos �sin ambigüedades- que conducen a la solución de un problema dado.(Análisis del problema y desarrollo del algoritmo).
2.- Expresar el algoritmo como un programa en un lenguaje adecuado. (Fase de codificación).
3.- Ejecución y validación del programa por la computadora
Características de los algoritmos
Un algoritmo debe:
ser preciso e indicar el orden de realización de cada paso.
estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez.
ser finito. Si se sigue un algoritmo, se debe terminar en algún momento; o sea, debe tener un número finito de pasos.
Se denomina diseño del algoritmo al proceso que convierte los resultados del análisis del problema en un diseño modular con refinamientos sucesivos que permitan una posterior traducción a un lenguaje.
El diseño del algoritmo es independiente del lenguaje de programación en el que se vaya a codificar posteriormente. Existen dos herramientas utilizadas conceptualmente para diseñar algoritmos: los diagramas de flujo y el pseudocodigo.
Diagramas de flujo
Un diagrama de flujo (flowchart) es una representación gráfica de un algoritmo. Los símbolos utilizados para la elaboración de diagramas de flujo han sido normalizados por el ANSI, y los mas frecuentes se presentan el la siguiente figura:

3.2.- Diseño algorítmico de las funciones

A los segmentos de código que implementan al comportamiento de los objetos se les denomina de diferentes maneras, dependiendo del lenguaje de programación que se utilice para hacer la implementación. Por ejemplo, en C++ se les conoce como funciones miembro, en Java y C# como métodos.
La implementación de los métodos se basa en el diseño algorítmico visto en 3.1, sólo que en este caso no se trata de algoritmos que resuelven completamente un problema dado, sino de algoritmos que realizan una tarea específica, la cual representa el comportamiento que manifestará el objeto, cuando reciba el mensaje correspondiente.

4.1.1.- Software de sistemas

Al resultado de la programación de sistemas se le conoce como software de base o software de sistemas . Al software de sistemas pertenecen los programas cuya finalidad es servir a otros programas y ejecutar funciones comunes para todos los usuarios de la computadora.
El software de sistemas implementa funciones de control que permiten al software de aplicación comunicarse con otros elementos del software.
Entre los programas que pertenecen al software de sistemas se encuentran: los sistemas operativos , compiladores , ensambladores , cargadores, manejadores de bases de datos, etc.

4.1.2.- Software de aplicación

El software de aplicación implementa los procedimientos requeridos para realizar las funciones de procesamiento de la información. El software de aplicación es el software específico para aplicaciones particulares de los usuarios de un sistema de cómputo. Su utilización se restringe a cierto ámbito( a diferencia del software de sistemas). Normalmente, en la codificación del software de aplicación no se utiliza un lenguaje de bajo nivel, sino que se codifican en lenguajes de alto nivel y se traducen ya sea por compiladores o por intérpretes (los cuales forman parte del software de sistemas). Podemos decir que el software de aplicación se apoya en el software de sistemas , lo cual no puede decirse en sentido inverso.
En lo que sigue del curso desarrollaremos software de aplicación, utilizando un compilador (software de base) para el lenguaje C# ( C Sharp ).

4.2.- Conceptos de programación

4.2.1.- Definición de programa

Un programa es un conjunto de instrucciones internas, utilizadas para ejecutarse en una computadora y producir un resultado concreto.

4.2.2.- Definición de programación

La programación es el proceso de escribir programas para computadora. Generalmente, los programas para computadora se escriben en lenguajes de alto nivel o en lenguaje ensamblador (bajo nivel).

4.2.3.- Definición de lenguaje de programación

Para que una computadora pueda ejecutar una instrucción, ésta debe estar escrita en un lenguaje que "entienda" la máquina. La máquina está compuesta por circuitos eléctricos.
Originalmente, la programación de las computadoras se hacía abriendo y cerrando los circuitos de éstas. Para introducir las órdenes en la computadora sólo se podían manejar dos estados con cada circuito: "cerrado" y "abierto" (esto es, con corriente y sin corriente). Debido a que la introducción de instrucciones con apertura y cierre de circuitos por métodos manuales era muy lento, se inventó el concepto de programa. Para escribir los programas, se convino en que un 0 (cero) significaría "abierto" (esto es, sin corriente), y un 1 (uno) significaría "cerrado" (esto es, con corriente). Con la invención del transistor el concepto de "cerrado" se cambió a "alto voltaje" y el de abierto a "bajo voltaje" . Actualmente, el alto voltaje es un valor cercano a 5 voltios, y el bajo voltaje uno cercano a 2 voltios.
Se necesita un grupo de varios circuitos para representar cada carácter de un lenguaje humano, y varios grupos para representar una palabra. Así que escribir conjuntos de instrucciones (programas) implica largas cadenas de unos y ceros, con una alta probabilidad de cometer errores (y una gran dificultad para corregirlos).
Para facilitar la escritura de programas, se inventaron los lenguajes de programación "de bajo nivel" (ensambladores) con nemotécnicos de palabras de un lenguaje humano y, posteriormente, los "de alto nivel" que utilizan palabras completas. La escritura de programas en lenguajes diferentes al de la máquina hace necesario el uso de programas traductores (ensambladores , compiladores e intérpretes)
Podemos definir a un lenguaje de programación como un lenguaje que está formado por un subconjunto de símbolos y palabras pertenecientes a un lenguaje natural. Aunque el lenguaje natural comunmente utilizado para crear lenguajes de programación es el Inglés, con UNICODE es posible usar caracteres de todos los lenguajes naturales existentes.

4.3.- Datos

4.3.1.- Definición

Técnicamente, los datos son hechos y cifras en bruto que se utilizan como entrada. Los datos se procesan para construir información. En el uso cotidiano, los términos datos e información se toman como sinónimos.

4.3.2.- Tipos de datos

Un tipo de datos es una categoría que está determinada por un conjunto de datos con características comunes entre sí.
Asociado a un tipo de dato se tiene el espacio de almacenamiento que ocupa cada dato.
En C#, existen varios tipos de datos que se clasifican en dos categorías:
Tipos valor
Tipos referencia
Los tipos valor son tipos de datos que almacenan los valores de los datos.
Los tipos referencia almacenan las direcciones de las localidades de memoria donde están almacenados los valores.
Tipos valor
Los tipos valor se subclasifican de la siguiente manera:
Tipo simple
Tipo entero
con signo
sbyte
short
int
long
sin signo
byte
ushort
uint
ulong
Tipo punto flotante
float
double
Tipo char
Tipo bool
Tipo decimal
Tipo struct
Tipo enum
Estos nombres de tipo valor en realidad son alias de los nombres originales definidos en .NET, que pertenecen a nombres de clases del espacio de nombres System.
La siguiente tabla muestra los alias para los tipos valor de .NET
Tipo de .NET
Alias
System.Boolean
bool
System.Byte
byte
System.Sbyte
sbyte
System.Char
char
System.Decimal
decimal
System.Double
double
System.Single
float
System.Int32
int
System.UInt32
uint
System.Int64
long
System.UInt64
ulong
System.Object
object
System.Int16
short
System.UInt16
ushort
System.String
string

Tipos referencia
Los tipos referencia se clasifican en:
Tipo class
Tipo interface
tipo delegate
tipo array
Características de los tipos valor
La siguiente tabla muestra el espacio requerido(en bytes) y el rango de valores para los tipos enteros.
Tipo
Bytes
Rango
sbyte
1
-128 a 127
byte
1
0 a 255
short
2
-32,768 a 32,767
ushort
2
0 a 65,535
int
4
-2,147,483,648 a 2,147,483,647
uint
4
0 a 4,294,967,295
long
8
-9,223,372,036,854,775,808a 9,223,372,036,854,775,807
ulong
8
0 a 18,446,744,073,709,551,615



Y esta para los tipos de punto flotante.
Tipo
Bytes
Precisión(dígitos)
Rango de valores
float
4
7
1.5E-45 a 3.4E38
double
8
15 a 16
5.0E-324 a 1.7E308


El tipo decimal es de punto fijo y se utiliza en operaciones financieras.
Tipo
Bytes
Precisión(dígitos)
Rango de valores
decimal
16
28 a 29
1.0E-28 a 7.9E28
Tipo bool
El tipo bool admite sólo dos valores:
true
false
Tipo char
Con 2 bytes, permite asignar valores para 65,536 caracteres diferentes. Esto significa que se pueden manejar todos los caracteres de todos los lenguajes naturales del mundo.
También se pueden asignar valores a secuencias de escape. Las secuencias de escape son útiles cuando se necesita manejar caracteres no imprimibles.
En la siguiente tabla se muestran las secuencias de escape y los nombres de los caracteres que representan.
Secuencia
Nombre
\'
Comilla simple
\"
Comillas dobles
\\
Barra invertida
\0
Carácter nulo
\a
Alerta (pitido)
\b
Retroceso
\f
Avance de forma
\n
Nueva línea
\r
Retorno de carro
\t
Tabulación horizontal
\v
Tabulación vertical
Tipos enum
El tipo enum permite utilizar un grupo de constantes por medio de nombres más representativos. Las constantes pueden ser de los tipos: byte, short, int, long.
Ejemplos:
1).- enum dígitos {cero,uno,dos,tres,cuatro,cinco,seis,siete,ocho,nueve};
2).- enum colores {rojo,regro,azul,blanco,amarillo};
rojo=0, negro=1, azul=2, blanco=3, amarillo=4
3).- enum docenas {una=12, dos=24, tres=36};
4).- enum clave { director=100, subdirector, jefeDepto, jefeOfna};
director = 100, subdirector = 101, jefeDepto=102, jefeOfna=103
Por default, los valores son de tipo int . El siguiente ejemplo cambia el tipo a byte.
5).- enum docenas : byte
{
una=12,dos=24,tres=36
};
Tipos struct
Los tipos struct son sintácticamente iguales a las clases, con la diferencia de que class es un tipo referencia y struct es un tipo valor.
Ejemplo:
struct Persona {
stringnombre ;byte edad;
};
Tipos referencia
Tipo class
Un tipo class define una estructura de datos que puede contener atributos y métodos.
Tipo object
Todos los tipos de C# heredan de System.Object, lo cual garantiza que cualquier tipo tenga los métodos de la clase object.
Tipo string
El tipo string representa una cadena de caracteres Unicode. El tipo string es un alias de la clase System.String. El tipo string deriva directamente del tipo object.
Aunque string es un tipo referencia, los objetos se construyen como si fueran de tipo valor.
Puede accederse a los caracteres de una cadena, como si fueran del tipo array.
Por ejemplo:
string carrera = "Sistemas Computacionales";
char c4 = carrera[3]; // c4 = t
El tipo void
El tipo void no ocupa espacio en memoria. Se utiliza, principalmente, como tipo de retorno para los métodos que no devuelven valor alguno.

4.3.3.- Identificadores

Un identificador es un nombre que se utiliza para etiquetar variables, constantes, métodos, clases, etc.
Existen identificadores predefinidos por el lenguaje, pero el programador puede definir los que requiera la aplicación a desarrollar.


Palabras reservadas
De los identificadores predefinidos por el lenguaje, un grupo se restringe para un uso específico. A tales identificadores se les conoce como palabras reservadas o palabras clave.
Las palabras reservadas de C# se muestran en la siguiente tabla:
abstract
as
base
bool
break
byte
case
catch
char
checked
class
const
continue
decimal
default
delegate
do
double
else
enum
event
explicit
extern
false
finally
fixed
float
for
foreach
goto
if
implicit
in
int
interface
internal
lock
is
long
namespace
new
null
object
operator
out
override
params
private
protected
public
readonly
ref
return
sbyte
sealed
short
sizeof
stackalloc
static
string
struct
switch
this
throw
true
try
typeof
uint
ulong
unchecked
unsafe
ushort
using
virtual
void
while




Identificadores definidos por el programador
En C#, los identificadores definidos por el programador deben cumplir las siguientes reglas:
El primer carácter debe ser una letra o el carácter de subrayado.
Del segundo carácter en adelante el identificador puede consistir de cualquier carácter Unicode. Debido a esto, es posible escribir identificadores con caracteres especiales como las vocales acentuadas y las letras ñ y Ñ del idioma español.
Se hace distinción entre las letras mayúsculas y las minúsculas. Así, Impuesto, IMPUESTO e impuesto son identificadores diferentes.

4.3.4.- Almacenamiento, direccionamiento y representación en memoria.

Almacenamiento
La computadora posee determinada cantidad de almacenamiento interno denominado memoria principal, memoria RAM o memoria volátil. Esta memoria se activa al encender la computadora y se desactiva al apagarla. Para que un programa se ejecute, debe cargarse en la memoria principal, así como los datos necesarios. Como es más costosa, es un recurso escaso donde sólo se almacenan los datos que se requieren de inmediato, y los demás se relegan a los dispositivos de almacenamiento externo, donde la capacidad de almacenamiento es mayor, pero también el tiempo de recuperación. Por otra parte, el costo del almacenamiento externo es más bajo.
Direccionamiento
La memoria principal de la computadora se divide en pequeñas unidades de tamaño uniforme denominadas palabras, que tienen una dirección única.
Cada una de éstas palabras es capaz de almacenar una unidad de información (como, por ejemplo, resultados numéricos), y determina el número más grande y el más pequeño que puede almacenar.
El tamaño de la palabra depende de la computadora, pero siempre se especifica en múltiplos de 8 bits. Así, existen computadoras con tamaños de palabra de 8, 16, 32 y 64 bits.
Cada palabra de la memoria principal tiene una dirección fija que va de cero hasta el número total de palabras - 1. Las direcciones de memoria sirven para identificar cada palabra individualmente, de tal manera que pueda accederse al dato contenido en ella. A fin de simplificar su comprensión, las memorias se consideran como una hilera de palabras.
Por ejemplo, suponiendo que la memoria principal de una computadora tiene un tamaño de palabra de 8 bits, la cinta de color amarillo que se muestra enseguida podría representar las tres primeras palabras:



Dirección
P a l a b r a
Valor en decimal
0000
0
1
0
0
1
0
1
1
75
0001
0
1
0
0
0
0
0
1
65
0002
0
0
1
1
0
0
1
0
50
Representación en memoria
La representación en memoria de los caracteres no reviste mayor complicación, debido a que los códigos utilizados, como el ASCII (American Standard Code for Information Interchange), les asignan valores enteros positivos.
En el caso de los datos numéricos hay que considerar la distinción entre números negativos y positivos, y la que hay entre números de punto flotante y enteros.
Los signos se manejan normalmente mediante el bit más significativo de la palabra (el situado a la extrema izquierda), y se le denomina bit de signo. Cuando el bit de signo almacena un cero, el número se considera positivo; cuando almacena un uno el número es negativo. Es por esto que, si el tamaño de la palabra es de m bits, quedan m-1 bits para representar la magnitud del número almacenado.
Los números de punto flotante se manejan en formato logarítmico, con un número fijo de bits para la base y otro para la mantisa. El estándar para los números de punto flotante lo fija el IEEE.
Debido al formato logarítmico, los cálculos que se hacen con tipos de punto flotante no son tan precisos como los que se hacen con tipos enteros.

4.3.5.- Sistema de numeración binario y hexadecimal

Sistema de numeración binario
Las memorias de las computadoras se componen de microcircuitos que son capaces de conducir bajo voltaje(aprox. 2 voltios) y alto voltaje (aprox. 5 voltios). Estos dos estados se representan con los símbolos 0 y 1. A este sistema de numeración que utiliza dos símbolos se le denomina binario, y a los dígitos 0 y 1 se les denomina dígitos binarios o simplemente bits (binary digits) .
Nuestro sistema de numeración decimal toma su nombre de los diez únicos símbolos (0,1,2,3,4,5,6,7,8, 9) que pertenecen al código.
Esta diferencia entre los dos sistemas de numeración complica la comunicación entre las personas y las computadoras.
Para resolver el problema se requiere convertir de un sistema a otro para codificar la información.
Sistema hexadecimal
Al sistema que utiliza 16 símbolos se le denomina hexadecimal. Los símbolos hexadecimales y sus equivalesntes en binario y decimal se muestran en la siguiente tabla.
Hex
Bin
Dec
0
0000
0
1
0001
1
2
0010
2
3
0011
3
4
0100
4
5
0101
5
6
0110
6
7
0111
7
8
1000
8
9
1001
9
A
1010
10
B
1011
11
C
1100
12
D
1101
13
E
1110
14
F
1111
15
Por ejemplo, en el código ASCII la letra 'Y' tiene asociado el número decimal 89. Si queremos manejar la letra 'Y' con la computadora, necesitamos comunicarle el código de la letra (89) en el sistema de numeración que ella entiende, esto es, convertir el número 89 a binario.
La conversión se logra tomando en cuenta que cada dígito tiene asociado un peso que depende de su posición en la secuencia de símbolos en la cifra.
Así, el número 89 puede expresarse como 9x10 elevado a la potencia 0 + 9x10 elevado a la potencia 1, esto es: 9x1 + 8x10.
Para convertir de binario a decimal podemos utilizar la siguiente tabla:
7
6
5
4
3
2
1
0
Exponente
1
1
1
1
1
1
1
1
Binario
128
64
32
16
8
4
2
1
Valordecimal
De la tabla anterior, podemos escribir el 89 en binario como:
89 = 01011001 = 64 + 16 + 8 +1
A la inversa, si tuvieramos la serie de dígitos binarios 01011001 y quisieramos conocer su equivalencia en decimal, escribiríamos:
0x2^7+1x2^6+0x2^5+1x2^4+1x2^3+0x2^2+0x2^1+1x2^0=
= 0 + 1x64 + 0 + 1x16+ 1x8 + 0 + 0 + 1x1 =
= 64 + 16 + 8 + 1 = 89
La conversión del número hexadecimal F9B5 a decimal sería:
F9B5 = Fx16^3 + 9x16^2 + Bx16^1 + 5x16^0
= 15x16x16x16 + 9x16x16 + 11x16 +5x1 =
= 61,440 + 2,304 + 176 + 5
= 63,925
En general, la conversión al sistema decimal del número abcde de un sistema numérico de base n es:
a x n^4 + b x n^3 + c x n^2 + d x n^1 + e x n^0

4.3.6.- Variables

Una variable es un contenedor de datos que tiene asociado un tipo, un identificador y un valor que puede cambiar en tiempo de ejecución.
El tipo determina el tamaño de memoria que se asigna a la variable, el identificador es una etiqueta equivalente a la dirección de memoria del primer byte, y el valor es el contenido de la variable.

4.3.7.- Constantes

Una constante es un contenedor de datos que tiene asociado un tipo, un identificador y un valor que NO puede cambiar en tiempo de ejecución.

4.4.- Operadores, operandos y expresiones.

Los operadores son elementos del lenguaje que sirven para reducir expresiones y obtener resultados. Dependiendo de su tipo, se aplican sobre uno, dos o tres operandos.
Los operadores se agrupan en las siguientes categorías:
Unarios. Se aplican sobre un sólo operando.
Binarios. Se aplican sobre dos operandos.
Ternarios. Se aplican sobre tres operandos.
Aquí describiremos brevemente los operadores binarios, algunos unarios que se relacionan con las operaciones de suma y resta, y el operador ternario ?:
Binarios
Los operadores binarios se subdividen en:
Aritméticos:
Operador
Operación
+
Suma
-
Resta
*
Multiplicación
/
División
%
Residuo
Operadores aritméticos unarios:
Operador
Operación
++
Incremento
- -
Decremento
Relacionales.
Operador
Operación
= =
Igual que
!=
Diferente (no igual) que
<
Menor que
<=
menor o igual que
>
Mayor que
>=
Mayor o igual que

Lógicos.
Operador
Operación
&&
Conjunción ( Y )

Disyunción ( O )
!
Negación ( NO )

Operador ternario ?:
El operador ternario debe su nombre a que utiliza tres operandos.
La sintaxis para el operador ternario es:
expresión booleana ? instrucción1 : instrucción2
Donde:
expresión booleana es cualquier expresión que produzca un valor de verdad true o false.
instrucción1 es la instrucción que se ejecutará cuando el valor de verdad producido por expresión booleana sea true.
instrucción2 es la instrucción que se ejecutará cuando el valor de verdad producido por expresión booleana sea false.
Ejemplo:
x > y ? y = 10 : y = 0 ;
Se lee: ¿ x es mayor que y ?
Si la respuesta es si, asigna 10 a la variable y
En caso contrario ( la respuesta es no), asigna 0 a la variable y
Observe que hemos introducido el operador de asignación =

4.5.- Prioridad de operadores, evaluación de expresiones

Una expresión es una combinación de operandos y operadores.
La evaluación de una expresión consiste en reducirla, esto es, realizar todas las operaciones contenidas en ella para obtener un valor final.
Para evaluar una expresión es necesario conocer la prioridad de los operadores, con lo cual se puede determinar cuál operación se va a realizar antes que las demás.
Una expresión entre paréntesis se evalúa primero que las demás. Si hay paréntesis anidados, se evalúa primero la expresión contenida en los paréntesis más internos.
La siguiente tabla muestra los operadores y su asociatividad (empezando con los de mayor prioridad).
Operadores
Asociatividad
( ) [ ] . new typeof
izquierda a derecha
- ~ ! ++ -- (tipo)expresión
derecha a izquierda
* / %
izquierda a derecha
+ -
izquierda a derecha
<< >>
izquierda a derecha
< <= > >= is as
izquierda a derecha
== !=
izquierda a derecha
& ^
izquierda a derecha
&&
izquierda a derecha
?:
derecha a izquierda
= *= /= %= += -= <<= >>= >>>= &= = ^=
derecha a izquierda

4.6.- Estructura básica de un programa

C# es un lenguaje orientado a objetos puro, esto es, sólo puede manejar aplicaciones creadas con el modelo de objetos ( a diferencia del lenguaje C++ que permite crear aplicaciones con el modelo de objetos y aplicaciones con el modelo procedimental). Debido a ésto, toda aplicación de C# debe constar de, al menos, una clase que contenga al método Main().
Ejemplo:
saludo.cs
// Mi primer programa en C#
class HolaMundo{
public static void Main( ){
System.Console.WriteLine("¡ Hola, Mundo !");
}
}
Una aplicación puede definir tantas clases como sea necesario y también utilizar clases predefinidas. La única condición es que una de las clases contenga al método Main( ).
El código del método Main( ) marca el inicio para la ejecución de toda aplicación.

4.7.- Proceso de creación de un ejecutable

Una vez que se crea el código fuente en C#, se procede a la creación del código ejecutable.
Para la creación de un ejecutable, primero debe compilarse el código fuente.
Para compilar una aplicación existen dos formas:
Desde la línea de comandos del DOS
Utilizando el IDE de Visual Studio .NET
Compilación desde la línea de comandos
Cargar Visual Studio .NET en modo comando desde: Todos los programas / Microsoft Visual Studio .NET 2003/ Visual Studio .NET Tools / Símbolo del sistema de Visual Studio .NET
Cambiarse a la carpeta donde se haya almacenado el código fuente. Ejemplo: C:\ > cd C:\EjemC#
Invocar al compilador: C:\EjemC#>csc saludo.cs . Esto crea el archivo saludo.exe
El programa saludo.exe se ejecuta desde el símbolo del sistema, tecleando:
saludo

Compilación desde Visual Studio .NET
Todos los programas / Microsoft Visual Studio .NET 2003/ Visual Studio .NET 2003
En la ventana Microsoft Development Environment hacer clic en el botón Nuevo proyecto
En la ventana Nuevo proyecto, con la carpeta Proyectos de Visual C# abierta, ir a la parte derecha de la ventana y hacer doble clic en el icono Aplicación de consola.
Después de crearse algunas carpetas y archivos para el nuevo proyecto, se abrirá una ventana con el siguiente texto:
using System;
namespace ConsoleApplication1{
///

/// Descripción breve de Class1.///
class Class1{
/// /// Punto de entrada principal de la aplicación./// [STAThread]
static void Main(string[] args){
//// TODO: agregar aquí código para iniciar la aplicación//
}
}
}
Modifique este texto para que luzca como el archivo saludo.cs
En la barra de menú, haga clic en Depurar/Iniciar sin Depurar.
Si el código fuente fue tecleado correctamente, aparecerá una ventana de consola, similar a la siguiente:
C:\EjemC#\EjemploHola\bin\Debug\saludo.exe
¡ Hola, Mundo !
Press any key to continue

Introducción
En la fase de implementación, una clase es un tipo o molde que sirve para crear objetos.
La sintaxis para declarar una clase es:
[modificador] class {
// Campos de la clase
// Métodos de la clase
}

5.1.- Modificadores de acceso

Los modificadores de acceso sirven para restringir el acceso a los campos o a los métodos de una clase.
Los principales modificadores de acceso son:
private
protected
public
El modificador private permite que el campo o método sólo pueda ser accedido dentro de la clase donde fue declarado.
El modificador protected permite que el campo o método sólo pueda ser accedido dentro de la clase donde fue declarado y en todas las clases derivadas de ella.
El modificador public permite que el campo o método pueda ser accedido desde cualquier clase.

5.2.- Encapsulamiento de la clase

La clase se encapsula encerrando entre un par de llaves los campos y los métodos de la clase.
Ejemplo:
public class Punto{
// Campos
int x;int y;
// Métodos
public Punto(int a, int b){
x = a;y = b;
}
public int daX( ){
return x ;
}
public int daY( ){
return y ;
}
}
// De aquí en adelante se puede utilizar el nuevo tipo Punto para crear objetos. // La creación de objetos debe hacerse dentro de una clase.

class Principal{
static void Main( ) {
// Se crea el objeto centro de la clase Punto
Punto centro = new Punto(10,20); System.Console.WriteLine("X = {0} \n Y = {1} \n", centro.daX(), centro.daY());
}
}

5.3.- El método como elemento de la comunicación

Para que los objetos de un sistema trabajen coordinadamente necesitan comunicarse.
La comunicación entre objetos se lleva a cabo a través del envío y/o recepción de mensajes. La comunicación se establece a través de los métodos.
En C#, el envío y recepción de mensajes es semejante a la invocación a funciones que se maneja en otros lenguajes de programación.

5.3.1.- Sintaxis

Los métodos pueden ser de dos tipos:
de clase y
de instancia
Los métodos de clase se declaran por medio del modificador static antepuesto al nombre del método.La sintaxis para declarar un método de clase o estático es:
[modificador de acceso] static ( [parámetros]){
// Cuerpo del método.
}
Ejemplo:
public static float daArea( ){
return ba*altura ;
}
Cuando un método se declara como estático, sólo existe un ejemplar de él para ser compartido por todos los objetos de la clase.
Los métodos de instancia no tienen el modificador static.
De los métodos de instancia existe un ejemplar en cada objeto de la clase.

5.3.2.- Concepto de parámetro

Los parámetros son variables que se usan para que los métodos se pasen información.
Un parámetro puede pasar una copia del valor contenido (parámetro valor) o la dirección (parámetro referencia) del contenedor de un valor.
Ejemplo de parámetro valor :
// Declaración
public double suma( double x, double y){
double z;z = x + y ; return z ;
}
.............
// Comunicación
............. objeto.suma(a, b);
................

Para utilizar los parámetros referencia se utiliza la palabra ref en la línea de cabecera del método y en la instrucción de comunicación.
Puesto que reciben una dirección de memoria, pueden modificar el contenido almacenado en esa dirección.
Ejemplo de parámetro referencia:
// Declaración
public double cambia( ref double x, ref double y){
x = 10.5 ;y = 20.6 ;
}
...........
// Comunicación
..............objeto.cambia(ref a, ref b) ;

5.3.3.- Parámetros de salida

Un método puede regresar un sólo valor por medio de la instrucción return.
Los parámetros de salida son útiles cuando se requiere que un método regrese más de un valor.
Los parámetros de salida se declaran utilizando el modificador out.
Los parámetros de salida funcionan como los parámetros referencia, sólo que el objeto referenciado no necesita estar inicializado.
Ejemplo:
class EjemploOut{
static int paramSalida(out int x){
x = 100 ;
return 5 ;
}
static void Main( ){
int m , n ;n = paramSalida(out m); System.Console.WriteLine("El valor de m es : " + m ) ; System.Console.WriteLine("El valor de n es : " + n ) ;
}
}

5.3.4.- El constructor.

El constructor es un método especial que sirve para inicializar el estado de un objeto.
El constructor es utilizado por el operador new para crear un objeto de la clase a la que pertenece el constructor.
Ejemplo:
class Cuadrado{
public int lado; public Cuadrado( int x) {
lado = x ;
}
}
class Principal{
static void Main( ){
Cuadrado c = new Cuadrado( 10 ); System.Console.WriteLine("Lado = " + c.lado ) ;
}
}
Cuando no se declara un constructor, el compilador crea un constructor predeterminado, sin parámetros y con el cuerpo vacío.
Ejemplo:
public Cuadrado( ){
}
Obsérvese que el método constructor debe tener el modificador de acceso public y no tener tipo de retorno.

5.3.5.- El destructor

El método destructor sirve para liberar el espacio de memoria que se asigno a un objeto de una clase.
La sintaxis para declarar un destructor es:
[atributos] ~ ( ) {
// Cuerpo del destructor.
}
El identificador para el método destructor es el mismo que para el constructor.
Ejemplo:
public ~ Cuadrado( ){
}
En C# no es necesario utilizar explícitamente un método destructor, ya que existe un programa llamado recolector de basura (garbage collector), que se encarga de checar cuáles objetos no están siendo referenciados en una aplicación y, cuando esto sucede, devuelve la memoria ocupada por esos objetos. A partir de ese momento, la memoria devuelta puede ser utilizada para crear nuevos objetos.

6.1.- Estructuras secuenciales

Una estructura secuencial consiste de una secuencia de instrucciones, como se muestra en el siguiente diagrama de flujo.

Donde un Bloque consiste de una o más instrucciones.

6.2.- Entrada y salida de datos

La entrada de datos consiste en colocar en la memoria principal datos provenientes desde algún dispositivo de entrada( teclado, disco, etc. ) para que la computadora, de acuerdo a un programa, realice una tarea.
La salida de datos consiste en enviar datos ( que, generalmente, son el resultado de un procesamiento) desde la memoria principal hacia un dispositivo de salida ( pantalla, impresora, disco, etc.).
La siguiente figura muestra un esquema conceptual del equipo de cómputo.

Esquema conceptual del equipo de cómputo

La consola
En los albores de la computación, el teclado y la pantalla formaban la consola.
En la actualidad, a la combinación de teclado y pantalla se les sigue considerando como a la antigua consola.
En C#, la entrada y la salida de datos se pueden manejar a través de los métodos de la clase Console.
Entrada de datos desde el teclado
Para la entrada de datos por medio del teclado se pueden utilizar los métodos Read( ) y ReadLine( ) de la clase Console.
Ejemplos:
System.Console.Read( ) ; // Lee el siguiente carácter desde el flujo de la entrada estándar.
System.Console.ReadLine( ) ; // Lee la siguiente línea de caracteres desde el flujo de la entrada estándar.
Salida de datos hacia la pantalla
La salida de datos hacia la pantalla se puede realizar utilizando los métodos Write y WriteLine( ) de la clase Console.
Ejemplos:
System.Console.Write( ) ; // Escribe el siguiente carácter en el flujo de la salida estándar (la pantalla).
System.Console.WriteLine( ) ; // Escribe la siguiente línea de caracteres en el flujo de la salida estándar.

6.3.- Interacción de la aplicación y la clase

Existen dos maneras de crear aplicaciones: una donde los campos y métodos se declaran como estáticos, en cuyo caso se dice que son "de clase" porque existirá un solo ejemplar que pertenecerá a la clase.
Ejemplo:
using System;
class Procedimental{
static double sueldo = 10000.00;
static void Main( ){
Console.WriteLine("Sueldo = " + sueldo ) ;
}
}
La otra manera es declarar los campos y métodos sin el modificador static. En este caso se dice que los elementos son "de instancia", porque cada objeto de la clase tendrá su propia copia de cada elemento.
En una aplicación pueden declararse tantas clases como sea necesario, pero en una de ellas deberá declararse el método Main( ).
Ejemplo:
using System ;
class Círculo{
int x, y ; // private, por omisión. public Circulo( int a, int b){
x = a ;y = b ;
}
public int daX( ){
return x ;
}
public int daY( ){
return y ;
}
}
class Principal{
static void Main( ){
Círculo circ = new Círculo( 10,15); // Crea e inicializa a circ. Console.WriteLine("X = " + circ.daX( ) ) ;Console.WriteLine("Y = " + circ.daY( ) ) ;
}
}

6.4.- Estructuras selectivas

Las estructuras selectivas sirven para seguir una sola de entre varias líneas de ejecución disponibles.

6.4.1.- Selectiva simple

La estructura selectiva simple sirve para seguir una línea de ejecución cuando se cumple una condición.
Diagrama de flujo:
Sintaxis:
Caso 1)
if(condición) instrucción ; // Una sola instrucción
Caso 2)
if(condición){
Bloque // Varias instrucciones
}

Ejemplo 1:
if(calificación >= 70) estatus = "Acreditado" ;
Ejemplo 2:
if(crédito == true){
clave = 1200 ;adeudo += compra ;
}

6.4.2.- Selectiva doble

La estructura selectiva doble sirve para seguir una línea de ejecución cuando se cumple la condición, o seguir otra línea cuando no se cumple la condición.
Diagrama de flujo:


Sintaxis:
Caso 1)
if(condición) instrucción 1 ; // Una sola instrucción
else instrucción 2 ;
Caso 2)
if(condición){
Bloque 1 // Varias instrucciones
}
else{
Bloque 2 // Varias instrucciones
}
Ejemplo 1:
if(calificación >= 70) estatus = "Acreditado";
else estatus = "No Acreditado";
Ejemplo 2:
if(crédito == true){
clave = 1200 ;adeudo += compra ;
}
else{
clave = 1000 ;adeudo += 0.0 ;
}

6.4.3.- Selectiva anidada


La estructura selectiva anidada es una cadena de estructuras selectivas que se conectan de la parte else de la actual con la parte if de la siguiente.
Diagrama de flujo:


Sintaxis:
if(condición1) Bloque 1 ;else if(condición2) Bloque 2 ;else Bloque 3;
Ejemplo:
if(edad < = 2 ) Console.WriteLine("Bebé" ) ; else if(edad <>

6.4.4.- Selectiva múltiple

La estructura selectiva múltiple es similar a la selectiva anidada, salvo que las condiciones deben ser de alguno de los tipos enteros o de tipo carácter.
Diagrama de flujo:

Sintaxis

switch(Expresión){case Cte 1: Bloque 1 ; break;case Cte 2: Bloque 2 ; break;case Cte N: Bloque N ; break;default: Bloque X ; break;// Opcional।}

Ejemplo: switch(opción){case 'A': System.Console.WriteLine("Altas"); break;case 'B': System.Console.WriteLine("Bajas") ; break;case 'C': System.Console.WriteLine("Cambios") ; break;default: System.Console.WriteLine("Opción inválida") ; break;}

6.4.5.- Selectiva intenta

La estructura intenta ( try/catch ) se utiliza para atrapar excepciones. Aunque es una estructura de uso especializado, vale la pena describirla brevemente aquí para compararla con alguna de las otras estructuras aquí estudiadas.
Diagrama de flujo:

Sintaxis:
try{
// Bloque de instrucciones que pueden generar una o más // situaciones excepcionales.
}
catch(Excepción 1){
// Bloque alternativo para el caso de existir la Excepción 1
}
...
catch(Excepción N ){
// Bloque alternativo para el caso de existir la Excepción N
}
finally // Opcional{
// Bloque de instrucciones que siempre se ejecutan
}

Ejemplo:
try {
byte num1; byte num2; byte suma; byte cociente;
num1 = 126; num2 = 2; cociente = checked ((byte)(num1/num2)); suma = checked ((byte)(num1 + num2)); Console.WriteLine(suma); Console.WriteLine(cociente);
Console.WriteLine("Pulse enter para finalizar..."); Console.Read();
} catch ( OverflowException ) {
Console.WriteLine("Una operación matemática produjo desbordamiento.");
Console.Read();
}
catch ( DivideByZeroException ) {
Console.WriteLine("Se intentó dividir por cero."); Console.Read();
}
finally {
Console.WriteLine("El bloque finally siempre se ejecuta.");
}

7.1.- Mientras ( while )

En esta estructura, de entrada se evalúa una condición. En caso de que el resultado de tal evaluación sea true, se ejecuta un bloque de instrucciones, en el cual debe existir una instrucción que modifique la condición. De no existir esa instrucción, se ejecutará un ciclo infinito ( loop ). Si el resultado de la evaluación es false , el bloque de instrucciones no se ejecuta y finaliza la ejecución de la estructura.
Diagrama de flujo:

Sintaxis:
while( condición ){
Bloque ;
}
Ejemplo:
using System;
namespace EjemploWhile{
class Capturador{
public string leeClave( ){
string c = "" ;while(c == ""){
c = Console.ReadLine( ) ;
} return c ;
}
}class Principal{
static void Main(){
string clave= "";Capturador objeto = new Capturador();Console.Write("Escriba la clave: ");clave = objeto.leeClave();Console.WriteLine("Clave = " + clave );
}
}
}

7.2.- Hacer mientras ( do-while )

La estructura do-while tiene un comportamiento similar a while, sólo que en este caso primero se ejecuta el bloque de instrucciones y después se evalúa la condición. Con esto se asegura que el bloque se ejecutará al menos una vez.
Diagrama de flujo:
Sintaxis:
do

{
Bloque ;
}
while(condición) ;
Ejemplo:
using System;
namespace EjemploDoWhile{
class Capturador{
public string leeClave( ){
string c ;do{
c = Console.ReadLine( ) ;
}

while(c != "") ;return c ;
}
}
class Principal{
static void Main(){
string clave= "";Capturador objeto = new Capturador();Console।Write("Escriba ला clave: "); clave = objeto।leeClave();Console।WriteLine("Clave = " + clave );
}
}
}

7.3.- Desde ( for )

Entre las estructuras de iteración, for es la más versátil ya que, entre otras características, permite la declaración de variables dentro de su estructura.