You are on page 1of 100

6.

8 Materiales final del capítulo 181

6.8.2 Los términos clave

10-Gigabit Ethernet 168 proveedor de servicios de Internet (ISP) 136

analógico a analógico de conversión 177 internetwork 134

De analógico a digital 176 dirección IP 146

datos analógicos 175 datagrama IP 158

señal analógica 175 IP nueva generación (IPng) 164

capa de aplicación 141 enlace 167

velocidad de bits 171 red de área local (LAN) 134

Bluetooth 170 Agente de acceso a mensajes (MAA) 151

telefonía celular 173 agente de transferencia de mensajes (MTA) 151

texto cifrado 138 red de área metropolitana (MAN) 169

paradigma cliente-servidor 144 módem 171

cable coaxial 178 modularidad 139

dispositivo 134 de conexión modulador 171

protocolo sin conexión 182 módulo 139

dominio de país 154 espacio de nombres 153

demodulador 171 capa de red 142

digital a analógico 177 nodo 167

De digital a digital 175 empaquete 160

datos digitales 175 peer-to-peer (P2P) paradigma 145

señal digital 175 capa física 141

línea de abonado digital (DSL) 171 número de puerto 142

nombre de dominio 153 protocolo 137

Dominio del servidor de nombres (DNS) 152 capas de protocolo 137

espacio de nombres de dominio 153 login remoto 151

notación decimal con puntos 163 enrutador 134

el correo electrónico (email) 150 Secure Shell (SHH) 151

sistema de extremo 134 segmento 159

número de puerto efímero 158 el software 137

Fast Ethernet 168 fuente a destino de entrega 182

cable de fibra óptica 178 Ethernet estándar 168

Protocolo de transferencia de archivos (FTP) 149 conmutar 134

marco 168 conmutación de WAN 135

dominio genérico 153 conjunto de protocolos TCP / IP 140

Gigabit Ethernet 168 Telnet (red de terminales) 151

medios guiados 178 Protocolo de Control de Transmisión (TCP) 159

de hardware 137 medio de transmisión 178


Redes de ordenadores y de Internet 182

header 158 velocidad de transmisión 169

albergar 134 cable de par trenzado 178

identificador de anfitrión 148 medios no guiados 179

hipertexto 147 localizador uniforme de recursos (URL) 149

HyperText Markup Language (HTML) 148 agente de usuario (UA) 151

Protocolo de transferencia de hipertexto (HTTP) 149 datagrama de usuario 158

ondas infrarrojas 180 Protocolo de datagramas de usuario (UDP) 158

Internet 135 147 página Web

Internet 136 bien conocido número de puerto 158

dirección de Internet 163 red de área amplia (WAN) 134

Protocolo de Internet 163 Interoperabilidad Mundial de Acceso (WiMAX)


173

Protocolo de Internet versión 6 (IPv6) 164 World Wide Web (WWW) 145

6.8.3 Resumen
❑ Una red es un conjunto de dispositivos conectados por enlaces de comunicación. Hoy en día cuando nos

Hablamos de las redes, generalmente nos referimos a dos categorías principales: redes de área local y redes de área
amplia. La Internet de hoy se compone de muchas redes de área amplia y locales unidos por la conexión de
dispositivos y estaciones de conmutación. Un protocolo es un conjunto de reglas que gobierna la comunicación. TCP /
IP es un conjunto de protocolos jerárquica hecho de cinco capas: aplicación, transporte, red, enlace de datos, y físicas.

❑ Aplicaciones en Internet están diseñados utilizando un paradigma cliente-servidor o una


peer-to-peer paradigma. La World Wide Web (WWW) es un repositorio de información vinculados entre sí a partir de
puntos en todo el mundo. El Protocolo de transferencia de hipertexto (HTTP) es el protocolo más utilizado para
acceder a los datos en la World Wide Web (WWW). Protocolo de transferencia de archivos (FTP) es una aplicación
cliente-servidor TCP / IP para copiar archivos de un host a otro. El correo electrónico es una de las aplicaciones más
comunes en Internet. TELNET es una aplicación cliente-servidor que permite a un usuario iniciar sesión en una
máquina remota, dando al usuario el acceso al sistema remoto. El sistema de nombres de dominio (DNS) es una
aplicación cliente-servidor que identifica a cada host en la red con un nombre único

❑ La función principal de un protocolo de capa de transporte es proporcionar proceso a proceso com-

municación. UDP es un protocolo de transporte que proporciona servicio fiable y sin conexión. Protocolo de
Control de Transmisión (TCP) es otro protocolo de capa de transporte que ofrece un servicio fiable y orientado a
la conexión.

❑ La capa de red supervisa el manejo de paquetes por la física subyacente


redes. IPv4 es un poco fiable protocolo sin conexión responsable de fuente-todestination entrega. Los
identificadores utilizados en la capa IP del conjunto de protocolos TCP / IP
6.9 Conjunto de práctica 183

se llaman las direcciones IP. Una dirección IPv4 es de 32 bits de largo. IPv6, la última versión del Protocolo de Internet, tiene un
espacio de direcciones de 128 bits.

❑ La capa de enlace de datos implica redes de área local y amplia (LANs y WANs). LAN
y las WAN puede ser por cable o inalámbrica. Ethernet es el protocolo de red de área local cableada más ampliamente
utilizado. servicio de acceso telefónico, DSL, cable y se utilizan sobre todo para las WAN punto a punto con cable. Las
LAN inalámbricas se formalizaron con Ethernet inalámbrico. Bluetooth es una tecnología LAN inalámbrica que conecta
dispositivos (llamados aparatos) en un área pequeña. WiMAX es una red de acceso inalámbrico que puede sustituir a DSL
y cable en el futuro.

❑ Los datos deben ser transformadas en señales electromagnéticas a transmitir. datos analógico
son continuas y tomar valores continuos. Datos digitales tienen estados discretos y toman valores discretos. Digital a
digital cambia los datos digitales a señal digital. la conversión de digital a analógico es el proceso de cambio de
datos digitales a señal analógica. La conversión de analógico a digital es el proceso de muestreo de datos
analógicos y cambiándolo a señal digital. señal de analógico a analógico significa cambiar datos analógicos a señal
analógica.

❑ Los medios de transmisión están por debajo de la capa física. Un medio de guiado proporciona un físico

conducto desde un dispositivo a otro. cable de par trenzado, cable coaxial, y la fibra óptica son los tipos más populares de los
medios de comunicación guiadas. medios de comunicación sin guía (espacio libre) Transporte ondas electromagnéticas sin el
uso de un conductor físico.

6.9 PRÁCTICA SET

6.9.1 Cuestionarios

Un conjunto de pruebas interactivas de este capítulo se puede encontrar en la página web del libro. Se recomienda
encarecidamente que el estudiante toma las pruebas para comprobar su / su comprensión de los materiales antes de continuar
con el juego de práctica.

6.9.2 Examen de preguntas


P6-1. ¿Cuál es el primer principio hemos discutido en este capítulo para el protocolo de capas que
hay que seguir para hacer la comunicación bidireccional?
Q6-2. En el conjunto de protocolos TCP / IP, ¿cuáles son los objetos idénticos en el remitente y los sitios del
receptor cuando pensamos en la conexión lógica en la capa de aplicación?

Q6-3. Un anfitrión se comunica con otro host mediante el conjunto de protocolos TCP / IP. Que es
la unidad de datos enviada o recibida en cada una de las siguientes capas?

a. capa de aplicación segundo. capa de red do. Capa de enlace de datos

Q6-4. ¿Cuál de las siguientes unidades de datos se encapsula en una trama?

a. un datagrama de usuario segundo. un datagrama do. un segmento


Redes de ordenadores y de Internet 184

Q6-5. ¿Cuál de las siguientes unidades de datos se Decapsulated de un datagrama de usuario?

a. un datagrama segundo. un segmento do. un mensaje


Q6-6. Cuál de las siguientes unidades de datos tiene un mensaje de capa de aplicación más el
Remate de cabeza de capa de 4?

a. un cuadro segundo. un datagrama de usuario do. un poco


Q6-7. ¿Cuáles son los tipos de direcciones (identificadores) que se utilizan en cada una de las siguientes capas?

a. capa de aplicación segundo. capa de red do. Capa de enlace de datos


Q6-8. Durante el fin de semana, Alice menudo necesita acceder a los archivos almacenados en su escritorio de oficina,
desde su ordenador portátil en casa. La semana pasada, se instala una copia del proceso del servidor FTP en su
escritorio en su oficina y una copia del proceso de cliente FTP en su computadora portátil en casa. Estaba
decepcionado cuando ella no podía acceder a sus archivos durante el fin de semana. Lo que podría haber ido mal?

Q6-9. La mayoría de los sistemas operativos instalados en los ordenadores personales vienen con varios
los procesos del cliente, pero normalmente no hay procesos de servidor. Explicar la razón.

Q6-10. Una nueva aplicación debe ser diseñado utilizando el paradigma cliente-servidor. Si sólo una pequeña
mensajes necesitan ser intercambiados entre el cliente y el servidor sin la preocupación por la pérdida de
mensajes o corrupción, qué protocolo de capa de transporte se recomienda?

Q6-11. ¿Por qué el encaminamiento de la responsabilidad de la capa de red? En otras palabras, por qué
no puede el encaminamiento se realiza en la capa de transporte o de la capa de enlace de datos?

Q6-12. Distinguir entre la comunicación en la capa de red y la comunicación a


la capa de enlace de datos.

Q6-13. ¿Qué es la tecnología de acceso telefónico de módem? Enumerar algunas de las normas comunes de módem
discutido en este capítulo y dar a sus velocidades de datos.

Q6-14. ¿Cuál es la razón de que Bluetooth se denomina normalmente un área personal inalámbrica NET
trabajar (WPAN) en lugar de una red de área local inalámbrica (WLAN)?
Q6-15. ¿Cómo podemos encontrar el periodo de una onda sinusoidal cuando se da su frecuencia?

Q6-16. ¿Cuál de las siguientes medidas del valor de una señal en cualquier momento?

a. amplitud segundo. frecuencia do. fase


Q6-17. Definir la transmisión analógica.

Q6-18. ¿Cuál es la posición de los medios de transmisión en el conjunto de protocolos TCP / IP?

Q6-19. Nombre las dos categorías principales de medios de transmisión.

Q6-20. ¿Cuáles son las tres principales clases de medios guiados?

6.9.3 Problemas
P6-1. Contestar las siguientes preguntas sobre la figura 6.5, cuando la comunicación es
de María a Ann:
a. ¿Cuál es el servicio proporcionado por la capa 1 a la capa 2 en el sitio de María?

segundo. ¿Cuál es el servicio proporcionado por la capa 1 a la capa 2 en el sitio de Ann?

P6-2. Contestar las siguientes preguntas sobre la figura 6.5, cuando la comunicación es
de María a Ann:
a. ¿Cuál es el servicio proporcionado por la capa 2 a la capa 3 en el lugar de María?

segundo. ¿Cuál es el servicio proporcionado por la capa 2 a la capa 3 en el sitio de Ann?


6.9 Conjunto de práctica 185

P6-3. Supongamos que el número de ordenadores conectados a Internet en el año 2010 es de cinco
cien millones. Si el número de hosts aumenta sólo el 20 por ciento al año, ¿cuál es el número de hosts
en el año 2020?
P6-4. Supongamos un sistema utiliza cinco capas de protocolo. Si el programa de aplicación crea
un mensaje de 100 bytes y cada capa (incluyendo el quinto y el primer) añade una cabecera de diez bytes a
la unidad de datos, lo que es la eficiencia (la relación de bytes la capa de aplicaciones para el número de
bytes transmitidos) del sistema?
P6-5. Que coincida con el siguiente para una o más capas del conjunto de protocolos TCP / IP:

a. determinación de la ruta

segundo. conexión con medios de transmisión

do. la prestación de servicios para el usuario final

P6-6. Que coincida con el siguiente para una o más capas del conjunto de protocolos TCP / IP:

a. la creación de datagramas de usuario

segundo. responsabilidad para el manejo de tramas entre nodos adyacentes

do. la transformación de bits para señales electromagnéticas

P6-7. capas de protocolo se puede encontrar en muchos aspectos de nuestras vidas como al viajar en el aire. Imagínese que
usted hace un ida y vuelta para pasar algún tiempo de vacaciones en un complejo. Tienes que ir a través de algunos
procesos en su aeropuerto de la ciudad antes de volar. También es necesario pasar por algunos procesos cuando llegue
al aeropuerto recurso. Mostrar el protocolo de capas para la ida y vuelta utilizando algunas capas como la comprobación
de equipaje / alegando, embarque / unboarding, despegue / aterrizaje.

P6-8. En una internet, cambiamos la tecnología LAN a una nueva. ¿Qué capas en la necesidad conjunto de protocolos
TCP / IP que desea cambiar?

P6-9. Comparar el rango de direcciones de 16 bits, de 0 a 65 535, con el rango de 32 bits IP


direcciones, de 0 a 4 294 967 295. ¿Por qué es necesario un gran rango de direcciones IP tales, sino sólo una parte relativamente
pequeña gama de números de puerto?

P6-10. Reescribir las siguientes direcciones IP utilizando notación binaria:

a. 110.11.5.88 segundo. 12.74.16.18 do. 201.24.44.32


P6-11. Reescribir las siguientes direcciones IP utilizando la notación decimal con puntos:

a. 01011110 10110000 01110101 00010101


segundo. 10001001 10001110 11010000 00110001

do. 01010111 10000100 00110111 00001111


P6-12. ¿Cuál es el equivalente hexadecimal de la siguiente dirección de Ethernet?

01011010 00010001 01010101 00011000 10101010 00001111

P6-13. Un dispositivo es el envío de datos a la velocidad de 1000 bps.

a. ¿Cuánto tiempo se tarda en enviar 10 bits?


a. ¿Cuánto tiempo se tarda en enviar un carácter (8 bits)?
segundo. ¿Cuánto tiempo se tarda en enviar un archivo de 100 000 caracteres?
CAPÍTULO 7
Sistemas operativos

Este es el primer capítulo de este libro para hacer frente a los programas informáticos. En este capítulo se explora el papel
del sistema operativo en un ordenador.

objetivos
Después de estudiar este capítulo, el estudiante debe ser capaz de:

❑ Comprender el papel del sistema operativo en un sistema informático.

❑ Dar una definición de un sistema operativo.

❑ Comprender el proceso de bootstrapping para cargar el sistema operativo en la memoria.

❑ Enumerar los componentes de un sistema operativo.

❑ Discutir el papel del administrador de memoria en un sistema operativo.

❑ Discutir el papel del gestor de procesos en un sistema operativo.

❑ Discutir el papel del administrador de dispositivos en un sistema operativo.

❑ Discutir el papel del administrador de archivos en un sistema operativo.

❑ Comprender las principales características de los tres sistemas operativos comunes: UNIX, Linux y
Ventanas.
188 Sistemas operativos

7.1 INTRODUCCIÓN
Un ordenador es un sistema compuesto de dos componentes principales: hardware y software.
hardware del equipo es el equipo físico. El software es el conjunto de programas que permite que el hardware para hacer
su trabajo. Computadora software se divide en dos grandes categorías: la sistema operativo y programas de aplicación ( Figura
7.1). Los programas de aplicación utilizan el hardware del equipo para resolver los problemas de los usuarios. El sistema
operativo, por su parte, controla el acceso a los equipos de los usuarios.

Figura 7.1 Un sistema informático

Sistema
informático

Hardware Software

Los programas de aplicación del

sistema operativo

7.1.1 sistema operativo


Un sistema operativo es complejo, por lo que es difícil dar una definición universal simple. En su lugar, aquí hay algunas
definiciones comunes:

❑ Un sistema operativo es una interfaz entre el hardware de un ordenador y el usuario


(programas o seres humanos).

❑ Un sistema operativo es un programa (o un conjunto de programas) que facilita la ejecución


de otros programas.

❑ Un sistema operativo actúa como un director general supervisión de la actividad de cada com-
Ponent en el sistema informático. Como gerente general, el sistema operativo comprueba que los recursos de
hardware y software se utilizan de manera eficiente, y cuando hay un conflicto en el uso de un recurso, el sistema
operativo media para resolverlo.

Un sistema operativo es una interfaz entre el hardware de un ordenador y el


el usuario (programas o humanos) que facilita la ejecución de otros programas
y el acceso a los recursos de hardware y software.

Dos de las principales metas de diseño de un sistema operativo son:

❑ El uso eficiente de hardware.

❑ Fácil uso de los recursos.

7.1.2 proceso Bootstrap


El sistema operativo, basado en las definiciones anteriores, proporciona soporte para otros programas. Por ejemplo, es
responsable de cargar otros programas en la memoria para su ejecución. Sin embargo, el sistema operativo en sí mismo
es un programa que necesita ser cargado en la memoria y ejecutarse. ¿Cómo se resuelve este dilema?
7.2 Evolución 189

El problema puede ser resuelto si el sistema operativo se almacena (por el fabricante) en la parte de la memoria ROM
utilizando la tecnología. El contador de programa de la CPU (véase el capítulo 5) se puede ajustar en el comienzo de esta
memoria ROM. Cuando el ordenador está encendido, la CPU lee las instrucciones desde la ROM y los ejecuta. Esta
solución, sin embargo, no es muy eficiente, ya que tendría que estar compuesto de ROM de una parte significativa de la
memoria y, por tanto, no podía ser utilizado por otros programas. La tecnología de hoy tiene que asignar sólo una pequeña
parte de la memoria a una parte del sistema operativo.

La solución adoptada hoy es un proceso de dos etapas. Una sección muy pequeña de la memoria está hecha de ROM y tiene un
pequeño programa que se llama el programa de arranque. Cuando el ordenador está encendido, el contador de la CPU se establece en
la primera instrucción de este programa de arranque y ejecuta las instrucciones de este programa. Este programa sólo es responsable de
cargar el sistema operativo en sí mismo, o que parte de ella se requiere para poner en marcha el ordenador, en la memoria RAM.
Cuando se realiza la carga, el contador de programa en la CPU se establece en la primera instrucción del sistema operativo en la
memoria RAM y se ejecuta el sistema operativo. Figura 7.2 ilustra el proceso de arranque.

Figura 7.2 El proceso de arranque

ROM
1

programa de arranque
2 Sistema 3
Hardware UPC
operativo

Disco

1. programa se ejecuta Bootstrap

2. El sistema operativo es cargado

3. El sistema operativo funciona


Memoria

7.2 EVOLUCIÓN
Los sistemas operativos han pasado por una larga historia de la evolución, que resumimos a continuación.

7.2.1 sistemas por lotes


sistemas operativos por lotes fueron diseñados en la década de 1950 para controlar los ordenadores centrales. En ese momento, las

computadoras eran grandes máquinas que utilizan tarjetas perforadas para la entrada, impresoras de línea de salida, y unidades de cinta para
medios de almacenamiento secundario.

Cada programa a ejecutar un trabajo que se llamó. Un programador que deseaba ejecutar un trabajo envió una solicitud a la
sala de operaciones, junto con tarjetas perforadas para el programa y los datos. Las tarjetas perforadas fueron alimentados en el
ordenador por un operador. Si el programa se ha realizado correctamente, una copia impresa del resultado se envía al programador si
no, se envió una copia impresa del error.

Los sistemas operativos durante esta época eran muy simple: sólo se aseguraron de que todos los recursos del
equipo fueron transferidos de un trabajo a otro.
190 Sistemas operativos

7.2.2 Sistemas de tiempo compartido

Para utilizar los recursos del sistema informático de manera eficiente, multiprogramación Fue presentado. La idea es llevar a cabo
varios trabajos en la memoria a la vez, y sólo asignar un recurso a un trabajo que lo necesita con la condición de que el recurso está
disponible. Por ejemplo, cuando un programa está utilizando un dispositivo de entrada / salida, la CPU es libre y puede ser utilizado
por otro programa. Discutimos multiprogramación más adelante en este capítulo.

Multiprogramación trajo la idea de compartir el tiempo: los recursos podrían ser compartidos entre los diferentes puestos de trabajo,
con cada trabajo que se le asigna una porción de tiempo para usar un recurso. Debido a que un equipo es mucho más rápido que un ser
humano, tiempo compartido está oculto por el usuario desde el que cada usuario tiene la impresión de que todo el sistema está sirviendo a
ellos exclusivamente.
Multiprogramación, y, finalmente, tiempo compartido, mejoran la eficiencia de los sistemas informáticos enormemente. Sin
embargo, se requiere un sistema operativo más complejo. El sistema operativo ahora tenía que hacer la programación: la
asignación de recursos a los diferentes programas y decidir qué programa debe utilizar qué recursos, y cuándo. Durante esta
época, la relación entre un ordenador y un usuario también cambió. El usuario puede interactuar directamente con el sistema sin
tener que pasar a través de un operador. Un nuevo término también fue acuñado: proceso. Un trabajo es un programa para ser
ejecutado, mientras que un proceso es un programa que está en la memoria y en espera de recursos.

7.2.3 Sistemas Personales


Cuando se introdujeron los ordenadores personales, había una necesidad de un sistema operativo para este nuevo tipo de
ordenador. Durante esta época, sistemas operativos de usuario único como DOS (Disk Operating System) se introdujeron.

7.2.4 Los sistemas paralelos


La necesidad de una mayor velocidad y eficiencia condujo al diseño de sistemas paralelos: varias CPU en la misma máquina.
Cada CPU se puede utilizar para servir a un programa o una parte de un programa, lo que significa que muchas tareas se pueden
realizar en paralelo en lugar de en serie. Los sistemas operativos necesarios para ello son más complejas que las que soportan
las CPUs individuales.

7.2.5 Los sistemas distribuidos


Redes y conexiones en red, como vimos en el capítulo 6, han creado una nueva dimensión en los sistemas operativos. Un trabajo
que se ha hecho previamente en un ordenador ahora puede ser compartida entre los equipos que pueden estar a miles de millas
de distancia. Un programa puede ejecutarse parcialmente en un equipo y parcialmente en otra si están conectados a través de una
interconexión de redes tales como Internet. Además, los recursos pueden ser distribuidos. Un programa puede necesitar los
archivos ubicados en diferentes partes del mundo. Sistemas distribuidos combinar las características de la generación anterior con
nuevas funciones como el control de la seguridad.

7.2.6 Los sistemas de tiempo real

UNA sistema en tiempo real se espera que haga una tarea dentro de las limitaciones de tiempo específicos. Se utilizan con
aplicaciones en tiempo real, que monitorean, responder a, o controlar procesos externos o ambientes. Los ejemplos se pueden
encontrar en el control del tráfico, la monitorización del paciente, o sistemas de control militares. El programa de aplicación puede
ser a veces un sistema embebido tal como un componente de un sistema grande, tal como el sistema de control en un automóvil.
7.3 componentes 191

Los requisitos para un sistema operativo de tiempo real son a menudo diferentes a las de un sistema de propósito
general. Por esta razón, no hablamos de ellos en este capítulo.

7.3 COMPONENTES
Los sistemas operativos actuales son muy complejas. Un sistema operativo necesita para gestionar los diferentes recursos en un
sistema informático. Se asemeja a una organización con varios directores en el nivel superior. Cada gerente es responsable de la
gestión de su departamento, pero también tiene que cooperar con los demás y coordinar las actividades. Un sistema operativo
moderno tiene al menos cuatro funciones: administrador de memoria, gestor de procesos, administrador de dispositivos, y el
administrador de archivos. Al igual que muchas organizaciones que tienen un departamento que no es necesariamente bajo cualquier
gestor específico, un sistema operativo también tiene un componente de este tipo, que generalmente se llama una interfaz de usuario o
una cáscara. La interfaz de usuario es responsable de la comunicación fuera del sistema operativo. Figura 7.3 muestra los componentes
típicos de un sistema operativo.

Figura 7.3 Componentes de un sistema operativo

Sistema
operativo

Interfaz de
usuario

administrador Gestor de Administrador Administrador


de memoria procesos de dispositivos de archivos

interfaz de usuario 7.3.1


Cada sistema operativo tiene una interfaz de usuario, un programa que acepte peticiones de los usuarios (procesos) y los
interpreta para el resto del sistema operativo. Una interfaz de usuario en algunos sistemas operativos, como UNIX, se
denomina cáscara. En otros casos, se llama una ventana para indicar que es impulsado y tiene un menú GUI (interfaz gráfica
de usuario) componente.

7.3.2 gestor de memoria


Una de las responsabilidades de un sistema informático moderno es gestión de la memoria. Aunque el tamaño de la memoria de
los ordenadores se ha incrementado enormemente en los últimos años, también lo ha hecho el tamaño de los programas y los
datos a procesar. asignación de memoria debe ser manejado para evitar que las aplicaciones se quede sin memoria. Los sistemas
operativos pueden ser divididos en dos categorías amplias de gestión de memoria: monoprogramación y multiprogramación.

monoprogramación
monoprogramación pertenece al pasado, pero es digno de mención, ya que nos ayuda a comprender la
multiprogramación. En monoprogramación, la mayor parte de la capacidad de memoria es
192 Sistemas operativos

dedicado a un solo programa (consideramos que los datos sean procesados ​por un programa como parte del programa): sólo se
necesita una pequeña parte para mantener el sistema operativo. En esta configuración, todo el programa está en la memoria
para su ejecución. Cuando el programa termina de ejecutarse, la zona del programa está ocupado por otro programa (Figura
7.4).

Figura 7.4 monoprogramación

Programa

operativo

Sistema

Memoria

El trabajo del administrador de memoria es sencillo aquí. Se carga el programa en la memoria, lo ejecuta, y la
sustituye por el siguiente programa. Sin embargo, hay varios problemas con esta técnica:

❑ El programa debe caber en la memoria. Si el tamaño de la memoria es menor que el tamaño de la


programa, el programa no se puede ejecutar.

❑ Cuando se ejecuta un programa, ningún otro programa puede ser ejecutado. Un programa,
durante su ejecución, a menudo necesita para recibir datos desde dispositivos de entrada y necesita enviar datos a dispositivos
de salida. Los dispositivos de entrada / salida son lentos en comparación con la CPU, así que cuando las operaciones de
entrada / salida se llevan a cabo, la CPU está inactivo. No se puede servir a otro programa porque este programa no está en la
memoria. Este es un uso muy ineficiente de la memoria y de la CPU tiempo.

multiprogramación
En multiprogramación, más de un programa está en la memoria al mismo tiempo, y que se ejecutan
concurrentemente, con la CPU de conmutación rápidamente entre los programas. La figura 7.5 muestra la memoria
en un entorno de multiprogramación.

Desde los años 1960, multiprogramación ha pasado por varias mejoras que se pueden ver en la taxonomía en
la Figura 7.6.

Figura 7.5 multiprogramación

Sistema
operativo

programa 1

programa 2

programa 3

Memoria
7.3 componentes 193

Discutimos cada esquema muy brevemente en las siguientes secciones. Dos técnicas pertenecen a la
nonswapping categoría, lo que significa que el programa permanece en la memoria durante la duración de la ejecución. Las
otras dos técnicas pertenecen a la intercambio categoría. Esto significa que, durante la ejecución, el programa se puede
cambiar entre la memoria y el disco una o más veces.

Figura 7.6 Categorías de multiprogramación

multiprogramación

Nonswapping intercambiando

particionamiento La demanda segmentación de la

paginación demanda de paginación

particionamiento

La primera técnica utilizada en multiprogramación se llama particionamiento. En este esquema, la memoria se divide en
secciones de longitud variable. Cada sección o compartimiento sostiene un programa. La CPU cambia entre programas. Se
inicia con un programa, la ejecución de algunas instrucciones hasta que o bien se encuentra con una operación de entrada /
salida o el tiempo asignado para ese programa ha expirado. Entonces la CPU guarda la dirección de la posición de memoria
donde se ejecutó y se mueve al siguiente programa de la última instrucción. El mismo procedimiento se repite con el segundo
programa. Después de que todos los programas se han servido, la CPU se mueve de nuevo al primer programa. Los niveles de
prioridad también se pueden utilizar para controlar la cantidad de tiempo de CPU asignado a cada programa (Figura 7.7).

Figura 7.7 particionamiento

Memoria Memoria
Sistema Sistema
operativo operativo

programa 1 programa 1
UPC

UPC
programa 2 programa 2

a. CPU empieza a ejecutar el programa 1 segundo. CPU empieza a ejecutar el programa 2

Con esta técnica, cada programa es completamente en la memoria y ocupar lugares contiguos. Reparto La mejora
de la eficiencia de la CPU, pero todavía hay algunos problemas:
❑ El tamaño de las particiones tiene que ser determinada de antemano por el administrador de memoria.

Si los tamaños de partición son pequeños, algunos programas no se pueden cargar en la memoria. Si los tamaños de partición son
grandes, puede haber algunos 'agujeros' (ubicaciones no utilizadas) en la memoria.

❑ Incluso si la partición es perfecto cuando se inicia el equipo, puede haber algunos agujeros
programas después de terminadas son sustituidos por otros nuevos.
194 Sistemas operativos

❑ Cuando hay muchos agujeros, el administrador de memoria puede compactar las particiones para eliminar

los agujeros y crear nuevas particiones, pero esto crea una carga extra en el sistema.

paginación

paginación mejora la eficiencia de la partición. En la paginación, la memoria se divide en secciones de igual tamaño llamadas marcos.
Los programas también se dividen, en secciones de igual tamaño llamadas
páginas. El tamaño de una página y un marco es generalmente la misma e igual al tamaño del bloque utilizado por el sistema para
recuperar información de un dispositivo de almacenamiento (Figura 7.8).

Figura 7.8 paginación

Un programa de

Página 1

Página 2 operativo 7

fotograma 1

programa B marco 2

Página 1 Frame 3
sistema
Page 2 Frame 4

Page 3 Marco 5

Marco 6
programa C
Trama del
Página 1
Memoria
Página 2

Una página se carga en una trama en la memoria. Si un programa tiene tres páginas, que ocupa tres marcos en la memoria.
Con esta técnica, el programa no tiene por qué ser contiguos en la memoria: dos páginas consecutivas pueden ocupar
cuadros no contiguos en la memoria. La ventaja de megafonía a través de la partición es que dos programas, cada uno con
tres cuadros no contiguos, se pueden sustituir por un programa que necesita seis marcos. No hay ninguna necesidad de
que el nuevo programa que esperar hasta seis marcos contiguos están libres antes de ser cargado en la memoria.

Paginación mejora la eficiencia en cierta medida, pero todo el programa todavía tiene que estar en la memoria antes de
ser ejecutado. Esto significa que un programa que necesita seis marcos, por ejemplo, no se puede cargar en la memoria si
actualmente hay sólo cuatro marcos desocupadas.

paginación por demanda

Paginación no requiere que el programa esté en las posiciones de memoria contiguas, pero sí requiere que todo el programa
esté en memoria para su ejecución. paginación demanda ha eliminado esta última restricción. En paginación por demanda el
programa se divide en páginas, pero las páginas se puede cargar en la memoria de uno en uno, ejecutado, y se sustituye por
otra página. En otras palabras, la memoria puede almacenar páginas de varios programas al mismo tiempo. Además, las
páginas consecutivas de un mismo programa no tienen que ser cargados en el marco de una misma página se puede cargar
en cualquier marco libre. Un ejemplo de paginación por demanda se muestra en la Figura 7.9. Dos páginas de un programa,
una página del programa B, y una página del programa en C están en la memoria.
7.3 componentes 195

Figura 7.9 paginación por demanda

Un programa de

Página 1 Sistema
Página 2 operativo

fotograma 1

programa B marco 2
Página 1 Frame 3

Page 2 Frame 4

Page 3 Memoria

programa C

Página 1

Página 2

segmentación de la demanda

Una técnica similar a la paginación es segmentación. En la paginación, un programa se divide en páginas de igual tamaño, que
no es la forma en que un programador piensa-programador piensa en términos de módulos. Como veremos en los capítulos
siguientes, un programa se compone generalmente de un programa principal y subprogramas. En segmentación de la
demanda, el programa se divide en segmentos que responden vista del programador. Estos se cargan en memoria, ejecutados, y
reemplazados por otro módulo de la misma o un programa diferente. Un ejemplo de segmentación de la demanda se muestra en
la Figura 7.10. Desde segmentos en la memoria son de igual tamaño, parte de un segmento puede permanecer vacío.

Figura 7.10 segmentación de la demanda

Un programa de

Sistema
Programa principal operativo

subprograma B
subprograma El segmento 1

programa B Vacío

Un programa principal segmento 2


Programa principal

subprograma

paginación y la segmentación de la demanda

paginación y la segmentación de la demanda pueden combinarse para mejorar aún más la eficiencia del sistema. Un segmento puede ser
demasiado grande para ajustarse a cualquier espacio libre disponible en la memoria. La memoria puede ser dividida en cuadros, y un módulo se
puede dividir en las páginas. Las páginas de un módulo a continuación, pueden ser cargados en la memoria de uno en uno y ejecutados.
196 Sistemas operativos

Memoria virtual
paginación por demanda y segmentación de la demanda significa que, cuando se está ejecutando un programa, que forma parte del
programa está en la memoria y en parte está en el disco. Esto significa que, por ejemplo, un tamaño de memoria de 10 MB puede ejecutar
diez programas, cada uno del tamaño de 3 MB, para un total de 30 MB. En cualquier momento, 10 MB de los diez programas están en la
memoria y 20 MB están en el disco. Existe, pues, un tamaño real de la memoria de 10 MB, pero una memoria virtual tamaño de 30 MB.
Figura 7.11 muestra el concepto. La memoria virtual, lo que implica una solicitud de paginación, segmentación de la demanda, o ambos,
se utiliza en casi todos los sistemas operativos en la actualidad.

Figura 7.11 Memoria virtual

Sistema operativo

Memoria física
Memoria virtual

Disco

gerente 7.3.3 Proceso


Una segunda función de un sistema operativo es la gestión del proceso, pero antes de discutir este concepto, tenemos que
definir algunos términos.

Programa, trabajo, y el proceso de


Los sistemas operativos modernos utilizan tres términos que se refieren a un conjunto de instrucciones: programa, trabajo,
y proceso. Aunque la terminología es vaga y varía de un sistema operativo a otro, podemos definir estos
términos de manera informal.

Programa

UNA programa es un conjunto no activo de instrucciones almacenadas en el disco (o cinta). Se puede o no convertirse en un trabajo.

Trabajo

Un programa se convierte en una trabajo desde el momento en que se ha seleccionado para su ejecución hasta que haya
finalizado la ejecución y se convierte en un programa nuevo. Durante este tiempo, un trabajo puede o no ser ejecutado. Puede
estar situado en espera de disco para ser cargado en la memoria, o puede ser cargado en la memoria y en espera de ejecución
por la CPU. Puede ser en el disco o en la memoria a la espera de un evento de entrada / salida, o puede estar en la memoria
mientras se ejecuta por la CPU. El programa es un trabajo en todas estas situaciones. Cuando un trabajo se ha terminado de
ejecutarse (ya sea normal o anormal), se convierte en un programa y una vez más reside en el
7.3 componentes 197

disco. El sistema operativo ya no gobierna el programa. Tenga en cuenta que cada trabajo es un programa, pero no todos los
programas es un trabajo.

Proceso

UNA proceso es un programa en ejecución. Es un programa que ha comenzado pero no ha terminado. En otras palabras, un proceso es
un trabajo que se está ejecutando en la memoria. Ha sido seleccionado entre otros trabajos en espera y se carga en la memoria. Un
proceso puede estar ejecutando o se puede espera de tiempo de CPU. Siempre y cuando el trabajo está en la memoria, es un proceso.
Tenga en cuenta que cada proceso es un trabajo, pero no cada trabajo es un proceso.

diagramas de estado
La relación entre un programa, un trabajo y un proceso se hace más claro si tenemos en cuenta cómo un programa se convierte en un
trabajo y cómo un trabajo se convierte en un proceso. Esto se puede ilustrar con una diagrama de estado que muestra los diferentes
estados de cada una de estas entidades. Figura 7.12 es un diagrama de estado usando los límites entre un programa, un trabajo, y un
proceso.

Figura 7.12 diagrama de estados con fronteras entre programas, trabajo, y el proceso de

Inactivos en el disco

convierte en un trabajo Se convierte en un programa

Trabajo Proceso

Sostener Terminado

Entra en la memoria se salidas

Programa de Obtiene acceso a la CPU

Listo Corriendo

El intervalo de tiempo agotado

Esperando
I / O satis fi ed I / O solicitados o
interrumpo

Un programa se convierte en un trabajo cuando seleccionado por el sistema operativo y llevado a la mantener el estado. Se mantiene en
este estado hasta que pueda ser cargado en la memoria. Cuando hay espacio de memoria disponible para cargar el programa total o
parcialmente, el trabajo se mueve a la estado preparado. Ahora se convierte en un proceso. Queda en la memoria y en este estado hasta
que la CPU puede ejecutarlo, se mueve a la estado de ejecución en este momento. Cuando en estado de ejecución, una de las tres cosas
pueden suceder:

❑ El proceso se ejecuta hasta que se necesita E / S recursos

❑ El proceso agota su intervalo de tiempo asignado

❑ Los concluido el proceso de

En el primer caso, el proceso entra en la estado de espera y espera hasta I / O es completa. En el segundo caso,
se va directamente al estado preparado. En el tercer caso, entra en el
198 Sistemas operativos

estado terminado y ya no es un proceso. Un proceso puede moverse entre la ejecución, en espera, y los estados listos muchas
veces antes de que entre al estado terminado. Tenga en cuenta que el diagrama puede ser mucho más compleja si el sistema
utiliza programas de memoria y permutas virtuales dentro y fuera de la memoria principal.

programadores
Para mover un trabajo o proceso de un estado a otro, el gestor de procesos utiliza dos
programadores: el planificador de tareas y el planificador de procesos.

planificador de tareas

los planificador de tareas mueve una tarea en el estado de espera al estado preparado o desde el estado de ejecución al estado
terminado. En otras palabras, un planificador de tareas es responsable de crear un proceso de un trabajo y que termina un proceso.
Figura 7.13 muestra el planificador de tareas.

Figura 7.13 planificador de tareas

planificador de tareas

Sostener horarios Terminado

Proceso

planificador de procesos

los planificador de procesos mueve un proceso de un estado a otro. Se mueve un proceso desde el estado de funcionamiento al
estado de espera cuando el proceso está esperando algún acontecimiento suceda. Se mueve el proceso desde el estado de espera al
estado preparado cuando se ha producido el evento. Se mueve un proceso desde el estado de funcionamiento al estado preparado si
el proceso de Distribución del tiempo ha expirado. Cuando la CPU está listo para ejecutar el proceso, el planificador de procesos
mueve el proceso desde el estado listo para el estado de ejecución. Figura 7.14 muestra el planificador de procesos.

Figura 7.14 planificador de procesos


horarios

Gestor de
procesos Listo Corriendo

Esperando
7.3 componentes 199

otros planificadores

Algunos sistemas operativos utilizan otros tipos de programadores para hacer el cambio entre procesos más eficientes.

hacer cola
Nuestro diagrama de estado muestra un trabajo o proceso de pasar de un estado a otro. En realidad, hay muchos puestos de trabajo y muchos
procesos que compiten entre sí por los recursos de la computadora. Por ejemplo, cuando algunos trabajos están en la memoria, los demás
deben esperar hasta que haya espacio disponible. O cuando un proceso está en ejecución utilizando la CPU, los demás deben esperar hasta
que la CPU está libre. Para manejar múltiples procesos y puestos de trabajo, utiliza el Gestor de procesos colas ( las listas de espera). UNA bloque
de control de trabajos o bloque de control de proceso está asociado con cada trabajo o proceso. Se trata de un bloque de memoria que almacena
información acerca de ese trabajo o proceso. El gestor de procesos almacena el bloque de control de proceso de trabajo o en las colas en lugar
del trabajo o proceso en sí. El trabajo o proceso en sí mismo permanece en la memoria o en el disco, ya que es demasiado grande para ser
duplicado en una cola: el bloque de bloque de control de trabajo o de control de procesos es el representante del trabajo en espera o proceso.

Un sistema operativo puede tener varias colas. Por ejemplo, la Figura 7.15 muestra la circulación de puestos de trabajo y
los procesos a través de tres colas: la cola de trabajos, la cola de preparados, y la cola I / O. La cola de trabajos contiene los
trabajos que están preparados para la memoria. La cola de listos sostiene los procesos que están en la memoria, listos para ser
ejecutados ya la espera de la CPU. La cola I / O tiene los procesos que están esperando para un dispositivo de I / O (no puede
haber varios I / O colas, una para cada dispositivo de entrada / salida, pero mostramos un solo por simplicidad).

Figura 7.15 Las colas para la gestión de procesos

Trabajo

Proceso
Cola de trabajos cola de listos UPC
comienzo a la memoria
Para ejecutarse Hecho
Necesidades I OI / O

El intervalo de tiempo agotado


satis fi ed /

cola I / O

El administrador de procesos puede tener diferentes políticas para seleccionar el siguiente trabajo o proceso de una cola: podría ser el primero

en entrar, primero en salir (FIFO), la más corta longitud en primer lugar, la más alta prioridad en primer lugar, y así sucesivamente.

sincronización de procesos
La idea detrás de la gestión de procesos es sincronizar diferentes procesos con diferentes recursos. Siempre que los
recursos puedan ser utilizados por más de un usuario (o un proceso, en este caso), podemos tener dos situaciones
problemáticas: punto muerto y inanición. Un breve análisis de estas dos situaciones sigue.
200 Sistemas operativos

Punto muerto

En vez de una definición formal de punto muerto, damos un ejemplo. Supongamos que hay dos procesos, A y B. El procedimiento A es
la celebración de un archivo, archivo1 (es decir, archivo1 se asigna a A) y no se suelte hasta que adquiere otro archivo, archivo2 (es
decir, A ha solicitado archivo2). El procedimiento B es la celebración de archivo2 (es decir, archivo2 se asigna a B) y no se suelte hasta
que tiene Fichero 1 (es decir, B ha solicitado Fichero 1). Los archivos en la mayoría de los sistemas no son compartibles-cuando está en
uso por un proceso, un archivo no puede ser utilizado por otro proceso. Si no existe ninguna disposición en esta situación para forzar un
proceso para liberar un archivo, se crea estancamiento (Figura 7.16).

Figura 7.16 Punto muerto

asigna a ha solicitado
UNA

fichero1 fichero2

segundo
Ha solicitado se Se asigna a

Como analogía, figura 7.17 shows punto muerto en un estrecho puente. La situación es similar porque el recurso
(parte del puente) se lleva a cabo por un vehículo que no se abra hasta que se pone la otra parte del puente, que se
celebra por el otro vehículo, y viceversa.

Figura 7.17 Punto muerto en un puente

Interbloqueo se produce si el sistema operativo permite a un proceso empieza a correr sin consultar primero para ver si los
recursos necesarios estén listos, y permite un proceso para mantener un recurso como el tiempo que quiera. Debe haber alguna
disposición en el sistema para evitar un punto muerto. Una solución es no permitir que un proceso para empezar a correr hasta
que los recursos requeridos son libres, pero vamos a ver más adelante que esto crea otro problema. La segunda solución es limitar
el tiempo de un proceso puede contener un recurso.

Interbloqueo se produce cuando el sistema operativo no lo hace


poner restricciones de recursos en los procesos.
7.3 componentes 201

Estancamiento no siempre ocurre. Hay cuatro condiciones necesarias para interbloqueo como se muestra abajo:

❑ Exclusión mutua. Sólo un proceso puede contener un recurso

❑ retención de recursos. Un proceso mantiene un recurso a pesar de que no se puede utilizar hasta otra

los recursos están disponibles

❑ Sin preferencia. El sistema operativo no puede reasignar temporalmente un recurso

❑ de espera circular. Todos los procesos y los recursos implicados forma un bucle, como en la figura 7.16 se requieren las cuatro

condiciones de punto muerto que se produzca. Sin embargo, estas condiciones sólo son condiciones previas necesarias, y no son
suficientes para causar estancamiento de sí mismos, sino que deben estar presentes para punto muerto, pero que podría no ser
suficiente para causar. Si una de estas condiciones no se encuentra, no puede producirse un punto muerto. Esto nos da un método
para prevenir o evitar el estancamiento: no permita que una de estas condiciones a suceder.

Inanición
Inanición es lo contrario de punto muerto. Puede ocurrir cuando el sistema operativo pone demasiadas restricciones de
recursos en un proceso. Por ejemplo, imaginemos un sistema operativo que especifica que un proceso debe tener la
posesión de los recursos necesarios antes de que pueda ser ejecutado.

En la figura 7.18, imaginemos que un proceso necesita dos archivos, archivo1 y archivo2. Archivo1 está siendo utilizado por el proceso
B y Archivo2 está siendo utilizado por proceso E. Proceso B termina primero y libera Archivo1. Un proceso no puede iniciarse, porque
archivo2 todavía no está disponible. En este momento, el procedimiento C, que sólo necesitan un Fichero 1, se le permite correr. Ahora
proceso de E termina y libera archivo2, pero el proceso A todavía no se puede ejecutar porque archivo1 no está disponible.

Figura 7.18 Inanición

UNA UNA
ha ha ha ha
solicitado solicitado solicitado solicitado

segundo Fichero1 fichero2 mi fichero1 fichero2 mi


asignado solicitado asignado asignado
a a asignado a
Ha ha ha
solicitado a solicitado

do re do re

a. Un proceso necesita tanto archivo1 archivo2 y segundo. Un proceso todavía necesita tanto archivo1 archivo2 y

UNA
ha
solicitado

fichero1 solicitado
fichero2

asignado asignado
a que ha

do re

do. Un proceso todavía necesita tanto archivo1 y archivo2 (de hambre)


202 Sistemas operativos

Figura 7.19 El problema de la cena de los filósofos

Arroz

Un problema del hambre clásico es la introducida por Edsger Dijkstra. Cinco filósofos están sentados en una mesa
redonda (Figura 7.19). Cada filósofo necesita dos palillos para comer un plato de arroz. Sin embargo, uno o dos palillos
podrían ser utilizados por un vecino. Un filósofo podría morir de hambre si dos palillos no están disponibles al mismo
tiempo.

Administrador de dispositivos
los administrador de dispositivos, o la entrada / salida de gerente, es responsable de acceso a los dispositivos de entrada / salida. Existen

limitaciones en el número y la velocidad de los dispositivos de entrada / salida en un sistema de ordenador. Debido a que estos dispositivos son
más lentos en la velocidad en comparación con la CPU y la memoria, cuando un proceso de acceso a un dispositivo de entrada / salida, el
dispositivo no está disponible para otros procesos para un período de tiempo. El administrador de dispositivos es responsable del uso eficiente de
los dispositivos de entrada / salida.

Una discusión detallada de los administradores de dispositivos requiere un conocimiento avanzado de los principios del sistema operativo
y está más allá del alcance de este libro. Sin embargo, podemos enumerar brevemente las responsabilidades de un administrador de
dispositivos:

❑ El administrador de dispositivos supervisa todos los dispositivos de entrada / salida constante para asegurar que

el dispositivo está funcionando correctamente. El gerente también necesita saber cuando un dispositivo ha terminado de
cumplir un proceso y está listo para servir el siguiente proceso en la cola.

❑ El gestor de dispositivo mantiene una cola para cada dispositivo de entrada / salida o uno o más
colas para dispositivos de entrada / salida similares. Por ejemplo, si hay dos impresoras rápidas en el sistema, el
administrador puede tener una cola para cada uno o una cola para ambos.

❑ El administrador de dispositivos controla las diferentes políticas de acceso a los dispositivos de entrada / salida.

Por ejemplo, se puede utilizar FIFO para un dispositivo y longitud más corta primero para otro.

7.3.4 gestor de archivos


Los sistemas operativos actuales usan un gestor de archivos para controlar el acceso a los archivos. Una discusión detallada del gestor de

archivos también requiere un conocimiento avanzado de los principios del sistema operativo y los conceptos de acceso a archivos que están más
allá del alcance de este libro. Se discuten algunas cuestiones relacionadas con el acceso de archivos en el capítulo 13, pero esto no es suficiente
para entender el funcionamiento real de un administrador de archivos. He aquí una breve lista de las responsabilidades de un administrador de
archivos:
7.4 Una encuesta de sistemas operativos 203

❑ Los controles del gestor de archivos acceso a los archivos. El acceso sólo se permite por lo permita
aplicaciones y / o usuarios, y el tipo de acceso puede variar. Por ejemplo, un proceso (o un usuario que llama a un proceso)
pueden ser autorizados a leer de un archivo, pero se le permite escribir en él (es decir, cambiar). Otro proceso puede ser
permitido para ejecutar un archivo y un proceso, pero no se le permitió leer su contenido, y así sucesivamente.

❑ El administrador de archivos supervisa la creación, eliminación y modificación de archivos.

❑ El administrador de archivos puede controlar la denominación de los ficheros.

❑ El administrador de archivos supervisa el almacenamiento de archivos: cómo se almacenan, donde están

almacenado, y así sucesivamente.

❑ El administrador de archivos es responsable de archivo y copias de seguridad.

7.4 A SURVEY de sistemas operativos


En esta sección presentamos algunos sistemas operativos populares y le animamos a estudiar más a fondo. Hemos elegido
tres sistemas operativos que son familiares para la mayoría de los usuarios de computadoras: UNIX, Linux y Windows.

7.4.1 UNIX
UNIX fue desarrollado originalmente en 1969 por Thomson y Ritchie del Grupo de Investigación de Ciencias de la Computación
en los Laboratorios Bell. UNIX ha pasado por muchas versiones desde entonces. Ha sido un sistema operativo popular entre los
programadores informáticos y los informáticos. Es un sistema operativo muy potente con tres características sobresalientes. En
primer lugar, UNIX es un sistema operativo portátil que se puede mover de una plataforma a otra sin muchos cambios. La razón
es que está escrito en su mayoría en el lenguaje C (en lugar de un lenguaje de máquina específica a un sistema informático en
particular). En segundo lugar, UNIX tiene un poderoso conjunto de utilidades (comandos) que se pueden combinar (en un
archivo ejecutable llamado guión) para resolver muchos problemas que requieren la programación en otros sistemas operativos.
En tercer lugar, es independiente del dispositivo, ya que incluye los controladores de dispositivo en el propio sistema operativo,
lo que significa que puede ser fácilmente configurado para ejecutar cualquier dispositivo.

UNIX es una, multiprocesamiento, el sistema operativo multiusuario portátil diseñado para facilitar la programación,
procesamiento de texto, la comunicación, y muchas otras tareas que se esperan de un sistema operativo. Contiene cientos
de funciones simples, de un solo uso que se pueden combinar para hacer prácticamente todas las tareas de procesamiento
imaginables. Su flexibilidad se demuestra por el hecho de que se utiliza en tres entornos informáticos diferentes:
independiente entornos personales, sistemas de tiempo compartido, y los sistemas cliente-servidor.

UNIX es una multiusuario, multiproceso, el sistema operativo portátil. Está diseñado para facilitar
la programación, procesamiento de texto, y la comunicación.

estructura de UNIX
UNIX consta de cuatro componentes principales: la núcleo, la cáscara, un conjunto estándar de empresas de servicios públicos,
y programas de aplicación. Estos componentes se muestran en la Figura 7.20.
204 Sistemas operativos

Figura 7.20 Los componentes del sistema operativo UNIX

hardware Usuario Usuario

CÁSCARA

Programas de
Utilidades
aplicación

NÚCLEO

usuario del

el kernel
los núcleo es el corazón del sistema UNIX. Contiene las partes más básicas del sistema operativo: gestión de
memoria, gestión de procesos, gestión de dispositivos y gestión de archivos. Todos los demás componentes de la
llamada al sistema en el kernel para realizar estos servicios para ellos.

La cáscara

La cáscara es la parte de UNIX que sea más visible para el usuario. Se recibe e interpreta los comandos introducidos por el
usuario. En muchos aspectos, esto hace que sea el componente más importante de la estructura de UNIX. Sin duda, es la
parte que los usuarios conozcan mejor. Para hacer cualquier cosa en el sistema, hay que dar a la cáscara de un comando. Si
el comando requiere una utilidad, las solicitudes de concha que el kernel de ejecutar la utilidad. Si el comando requiere un
programa de aplicación, la cáscara pide al kernel para ejecutarlo. Algunos sistemas operativos, como UNIX, tienen varios
proyectiles diferentes.

Utilidades

Hay literalmente cientos de utilidades de UNIX. UNA utilidad es un programa estándar de UNIX que proporciona un proceso de apoyo para
los usuarios. Tres utilidades comunes son editores de texto, programas de búsqueda y programas de ordenación.

Muchas de las utilidades del sistema son en realidad aplicaciones sofisticadas. Por ejemplo, el sistema de correo electrónico de UNIX
se considera una utilidad, al igual que los tres editores de texto comunes, vi, emacs,
y Pico. Los cuatro de estas utilidades son grandes sistemas en sí mismos. Otras utilidades son más cortos, las funciones más simples.
Por ejemplo, la lista ( ls) utilidad muestra los archivos en un directorio del disco.

aplicaciones

Aplicaciones en UNIX son programas que no son una parte estándar de la distribución del sistema operativo. Escrito
por los administradores de sistemas, programadores profesionales, o
7.4 Una encuesta de sistemas operativos 205

usuarios, que proporcionan capacidades extendidas en el sistema. De hecho, muchas de las utilidades estándar
comenzó como aplicaciones hace años y resultó tan útil que ahora son parte del sistema.

7.4.2 Linux
En 1991, Linus Torvalds, un estudiante finlandés de la Universidad de Helsinki en el momento, ha desarrollado un nuevo sistema
operativo que se conoce hoy como Linux. El núcleo inicial, que era similar a un pequeño subconjunto de UNIX, ha crecido hasta
convertirse en un sistema operativo a gran escala en la actualidad. El kernel de Linus 2.0, lanzado en 1997, fue aceptado como un
sistema operativo comercial: tiene todas las características tradicionalmente atribuidas a UNIX.

componentes
Linux tiene los siguientes componentes.

Núcleo

El núcleo es responsable de todas las funciones atribuidas a un núcleo, tales como la gestión de memoria, gestión de
procesos, gestión de dispositivos y gestión de archivos.

bibliotecas del sistema

Las bibliotecas de sistema tienen un conjunto de funciones utilizadas por los programas de aplicación, incluyendo la cáscara, para
interactuar con el kernel.

Utilidades del sistema

Las herramientas del sistema son los programas individuales que utilizan los servicios prestados por las bibliotecas del sistema para llevar a cabo
las tareas de gestión.

Las capacidades de red


Linux compatible con los protocolos estándar de Internet discutidos en el Capítulo 6. Es compatible con tres capas: la interfaz de socket,
controladores de protocolo, y controladores de dispositivos de red.

Seguridad
mecanismo de seguridad de Linux proporciona los aspectos de seguridad definidos tradicionalmente para UNIX, tales como autenticación
y control de acceso.

7.4.3 Ventanas
A finales de 1980, Microsoft comenzó el desarrollo de un nuevo sistema operativo de un solo usuario para reemplazar MS-DOS ( Sistema
operativo de disco de Microsoft). ventanas fue el resultado. Varias versiones de Windows seguidos. Nos referimos a todas estas
versiones como Windows.

Los objetivos de diseño


Los objetivos de diseño son liberadas por Microsoft extensibilidad, la portabilidad, la fiabilidad, la compatibilidad, y
actuación.
206 Sistemas operativos

Extensibilidad

Windows está diseñado como una arquitectura modular con varias capas. El propósito es permitir que las capas superiores que
han de cambiarse el tiempo sin afectar a las capas inferiores.

Portabilidad

Ventanas, como UNIX, es sobre todo está escrito en C o C ++ y el código es independiente del lenguaje de máquina
del equipo en el que se está ejecutando.

Confiabilidad

Windows fue diseñado para manejar condiciones de error incluida la protección contra software malicioso.

Compatibilidad

Windows fue diseñado para ejecutar programas escritos para otros sistemas operativos y las versiones anteriores de
Windows.

Actuación
Windows fue diseñado para tener un tiempo de respuesta rápido a las aplicaciones que se ejecutan en la parte superior del sistema operativo.

Arquitectura
Windows utiliza una arquitectura en capas, como se muestra en la Figura 7.21.

Figura 7.21 La arquitectura de Ventanas

Modo de usuario
subsistemas ambientales

Ejecutivo
monitor de administrador servicio de
administrador Gestor de
referencia de de memoria llamada de
de objetos procesos
seguridad virtual procedimiento local
Entrada
modo de núcleo

gestor /
salida
Núcleo

capa de abstracción de hardware (HAL)

Hardware

HAL

los capa de abstracción de hardware (HAL) esconde las diferencias de hardware de las capas superiores.

Núcleo

El kernel es el núcleo del sistema operativo. Es una pieza orientado a objetos de software que ve cualquier entidad como
un objeto.
7.5 Materiales final del capítulo 207

Ejecutivo
El ejecutivo de Windows proporciona servicios para todo el sistema operativo. Se compone de seis subsistemas: administrador de
objetos, monitores de referencia de seguridad, gestor de procesos, administrador de memoria virtual, Instalación de llamada de
procedimiento local, y el gerente de E / S. La mayoría de estos subsistemas están familiarizados desde nuestras discusiones
anteriores de los subsistemas operativos. Algunos subsistemas, como el administrador de objetos, se agregan a Windows debido a su
naturaleza orientada a objetos. El ejecutivo se ejecuta en modo kernel (privilegiada).

subsistemas ambientales
Estos son los subsistemas diseñados para permitir que Windows ejecute programas de aplicación diseñados para Windows, para
otros sistemas operativos, o para versiones anteriores de Windows. El subsistema nativo que se ejecuta aplicaciones diseñadas
para Windows se llama Win32. Los subsistemas de entorno se ejecutan en el modo de usuario (un modo no privilegiado).

7.5 MATERIALES FIN-CAPÍTULO


7.5.1 Lectura recomendada
Para más detalles sobre los temas tratados en este capítulo, se recomiendan los siguientes libros:

❑ Bic, L. y Shaw, A. Funcionamiento Principios Systems, Upper Saddle River,


Nueva Jersey: Prentice-Hall, 2003

❑ McHoes, A. y Flynn, I. Entender los sistemas operativos, Boston, MA: Curso


Tecnología, 2007
❑ Nutt, G. Sistemas operativos: una perspectiva moderna, Reading, MA: Addison-Wesley, 2001

❑ Silberschatz, Galvin y A., P. Conceptos del sistema operativo, Nueva York: Wiley, 2004

7.5.2 Los términos clave

autentificación 205 particionamiento 193

sistema operativo por lotes 189 Pico 204

bootstrap 188 portabilidad 205

circular en espera 201 portabilidad proceso del planificador 198

punto muerto 200 proceso 197

paginación bajo demanda 194 gestor de procesos 191

paginación y la segmentación de la demanda 195 programa 196

la demanda de segmentación 195 cola 199

Administrador de dispositivos 202 estado preparado 197

sistema distribuido 190 sistema en tiempo real 190

(Continuado)
208 Sistemas operativos

emacs 204 fiabilidad 205

marco 194 la celebración de 201 recursos

interfaz gráfica de usuario (GUI) 191 estado de funcionamiento 197

capa de abstracción de hardware (HAL) 206 planificador 198

mantener un estado a 197 programación 190

trabajo 196 shell 191

planificador de tareas 198 sistema operativo de un solo usuario 190

kernel 204 el software 188

Linux 205 inanición 201

gestión de memoria 191 diagrama de estado 197

Microsoft Disk Operating System (MS-DOS) 205 estado terminado 198

monoprogramación 191 tiempo compartiendo 190

multiprogramación 192 UNIX 203

exclusión mutua 201 interfaz de usuario 191

sin preferencia 201 204 utilidad

sistema operativo 188 VI 204

página 194 la memoria virtual 196

paginación 194 estado 197 de espera

sistema paralelo 190 ventanas 205

7.5.3 Resumen
❑ Un sistema operativo es una interfaz entre el hardware de un ordenador y el
de usuario que facilita la ejecución de los programas y el acceso a los recursos de hardware y software. Dos de las principales
metas de diseño de un sistema operativo son el uso eficiente del hardware y la facilidad de uso de los recursos.

❑ Los sistemas operativos han pasado por una larga historia de la evolución: los sistemas de lotes,
Los sistemas de tiempo compartido, los sistemas personales, sistemas paralelos, y sistemas distribuidos. Un sistema operativo moderno
tiene al menos cuatro áreas funcionales: administrador de memoria, gestor de procesos, Administrador de dispositivos y gestor de
archivos. Un sistema operativo también proporciona una interfaz de usuario.

❑ La primera responsabilidad de un sistema informático moderno es la gestión de memoria.


asignación de memoria debe ser controlado por el sistema operativo. técnicas de gestión de memoria se
pueden dividir en dos categorías: monoprogramación y multiprogramación. En monoprogramación, la mayor
parte de la capacidad de memoria está dedicada a un solo programa. En la multiprogramación, más de un
programa puede estar en la memoria al mismo tiempo.
7.6 Conjunto de práctica 209

❑ La segunda responsabilidad de un sistema operativo es la gestión de procesos. Un pro-


ceso es un programa en ejecución. El gestor de procesos utiliza programadores y colas para gestionar los procesos. La
gestión del proceso consiste en la sincronización de diferentes procesos con diferentes recursos. Esto puede crear
potencialmente estancamiento de recursos o el hambre. Interbloqueo se produce cuando el sistema operativo no pone
restricciones de recursos en los procesos: el hambre puede ocurrir cuando el sistema operativo pone demasiadas
restricciones de recursos en un proceso.

❑ La tercera responsabilidad de un sistema operativo es el dispositivo o la gestión de entrada / salida.

❑ La cuarta responsabilidad de un sistema operativo es la gestión de archivos. un operativo


sistema utiliza un gestor de archivos para controlar el acceso a los archivos. Se permite el acceso exclusivamente por procesos o
usuarios que tienen permiso de acceso a archivos específicos, y el tipo de acceso puede variar.

❑ Dos sistemas operativos comunes con algunas similitudes son UNIX y Linux. UNIX es
un multiusuario, multiprocesamiento, el sistema operativo portátil formados a partir de cuatro partes: el núcleo, la carcasa, un conjunto
estándar de servicios públicos, y programas de aplicación. Linux tiene tres componentes: un núcleo, un sistema de servicios públicos, y
una biblioteca del sistema.

❑ Un popular de la familia de sistemas operativos de Microsoft se conoce como Windows.


Windows es un sistema operativo multi-capa orientada a objetos. Utiliza varias capas, incluyendo una capa
de hardware abstracta (HAL), la capa ejecutiva, y la capa subsistema de entorno.

7.6 PRÁCTICA SET


7.6.1 Cuestionarios

Un conjunto de pruebas interactivas de este capítulo se puede encontrar en la página web del libro. Se recomienda
encarecidamente que el estudiante toma las pruebas para comprobar su / su comprensión de los materiales antes de continuar
con el juego de práctica.

7.6.2 Examen de preguntas


P7-1. ¿Cuál es la diferencia entre un programa de aplicación y un funcionamiento
¿sistema?

Q7-2. ¿Cuáles son los componentes de un sistema operativo?


Q7-3. ¿Cuál es la diferencia entre monoprogramación y multiprogramación?
Q7-4. ¿Cómo está localizando diferente de la partición?

Q7-5. ¿Cómo es la paginación bajo demanda más eficiente que la paginación regular?

Q7-6. ¿Cómo es un programa relacionado con un trabajo? ¿Cómo es un trabajo relacionado con un proceso? ¿Cómo es un
programa relacionado con un proceso?

Q7-7. ¿Dónde reside un programa? ¿Dónde reside un trabajo? ¿De dónde viene un proceso
¿residir?

Q7-8. ¿Cuál es la diferencia entre un planificador de tareas y un planificador de procesos?


210 Sistemas operativos

Q7-9. ¿Por qué necesita un sistema operativo colas?


Q7-10. ¿Cómo funciona un punto muerto diferir de la inanición?

7.6.3 Problemas
P7-1. Un equipo tiene un sistema operativo monoprogramación. Si el tamaño de la memoria es
64 MB y la parte residente en memoria del sistema operativo necesita 4 MB, ¿cuál es el tamaño máximo de
un programa que se puede ejecutar por este equipo?
P7-2. Rehacer Ejercicio 7-1 si el sistema operativo asigna automáticamente 10 MB de miem-
ORY a los datos.

P7-3. Un sistema operativo monoprogramación ejecuta programas que en promedio necesidad


10 microsegundos acceso a la CPU y el acceso 70 microsegundos a los dispositivos de E / S. ¿Qué porcentaje de
tiempo es la inactividad de la CPU?

P7-4. Un sistema operativo de multiprogramación utiliza un esquema de reparto y divide


los 60 MB de memoria disponible en cuatro particiones de 10 MB, 12 MB, 18 MB, y 20 MB. El primer
programa que se ejecute necesita 17 MB y ocupa la tercera partición. El segundo programa necesita
8 MB y ocupa la primera partición. El tercer programa necesita 10,5 MB y ocupa la segunda
partición. Por último, el cuarto programa necesita 20 MB y ocupa la cuarta partición. Lo que se utiliza
la memoria total? Lo que se pierde la memoria total? ¿Qué porcentaje de la memoria se pierde?

P7-5. Problema rehacer P7-4 si todos los programas necesitan 10 MB de memoria.

P7-6. Un sistema operativo de multiprogramación utiliza paginación. La memoria disponible es


60 MB dividen en 15 cuadros, cada uno de 4 MB. El primer programa necesita 13 MB. El segundo programa
necesita 12 MB. El tercer programa necesita 27 MB.
a. Cuántos cuadros son utilizados por el primer programa?

segundo. Cuántos cuadros son utilizados por el segundo programa?

do. Cuántos cuadros son utilizados por el tercer programa?

re. Cuántos cuadros no han sido utilizados?

mi. Lo que se pierde la memoria total?


F. ¿Qué porcentaje de la memoria se pierde?
P7-7. Un sistema operativo utiliza memoria virtual, sino que requiere todo el programa de
estar en la memoria física durante la ejecución (sin paginación o segmentación). El tamaño de la memoria física es de
100 MB. El tamaño de la memoria virtual es 1 GB. ¿Cuántos programas de tamaño de 10 MB se pueden ejecutar al
mismo tiempo por este sistema operativo? ¿Cuántos de ellos pueden estar en la memoria en cualquier momento?
¿Cuántos de ellos debe estar en el disco?

P7-8. ¿Cuál es el estado de un proceso en cada una de las siguientes situaciones?

a. El proceso está utilizando la CPU.

segundo. El proceso ha terminado de imprimir y necesita la atención de la CPU de nuevo.

do. El proceso se ha detenido debido a su intervalo de tiempo ha terminado.

re. El proceso está leyendo datos desde el teclado.


mi. El proceso está imprimiendo datos.
7.6 Conjunto de práctica 211

P7-9. Tres procesos (A, B, y C) se están ejecutando al mismo tiempo. Un proceso ha adquirido
Archivo1, archivo2 pero necesita. Proceso B ha adquirido File3, pero necesita archivo1. Proceso C ha adquirido archivo2,
pero necesita File3. Dibuje un diagrama para estos procesos. ¿Es esta una situación de bloqueo?

P7-10. Tres procesos (A, B, y C) se están ejecutando al mismo tiempo. Un proceso tiene adqui-
Fichero1 roja. Proceso B ha adquirido archivo2, pero necesita archivo1. Proceso C ha adquirido File3, pero necesita
archivo2. Dibuje un diagrama para estos procesos. ¿Es esta una situación de bloqueo? Si su respuesta es 'no', mostrar
cómo los procesos con el tiempo pueden terminar sus tareas.
CAPÍTULO 8
algoritmos

En este capítulo se introduce el concepto de algoritmos, procedimientos paso a paso para resolver un problema. A continuación se
discute las herramientas utilizadas para el desarrollo de algoritmos. Por último, damos algunos ejemplos de algoritmos iterativos y
recursivos comunes.

objetivos
Después de estudiar este capítulo, el estudiante debe ser capaz de:

❑ Definir un algoritmo y relacionarlo con la resolución de problemas.

❑ Definir tres construcciones de secuencia, selección, y la repetición-y describir su uso


en los algoritmos.

❑ Describir los diagramas UML y cómo pueden ser utilizados al representar algoritmos.

❑ Describir pseudocódigo y cómo se puede utilizar la hora de representar algoritmos.

❑ Enumerar los algoritmos básicos y sus aplicaciones.

❑ Describir el concepto de clasificación y entender los mecanismos detrás de tres


algoritmos de ordenación primitivas.

❑ Describir el concepto de la búsqueda y entender los mecanismos detrás de dos


algoritmos de búsqueda común.

❑ Definir subalgoritmos y sus relaciones con los algoritmos.

❑ Distinguir entre los algoritmos iterativos y recursivos.


214 algoritmos

8.1 CONCEPTO
En esta sección definimos un informalmente algoritmo y trabajar sobre el concepto con un ejemplo.

8.1.1 definición informal


Una definición informal de un algoritmo es:

Algoritmo: un método paso a paso para resolver un problema o hacer una tarea.

En esta definición, un algoritmo es independiente del sistema informático. Más específicamente, también hay que
señalar que el algoritmo acepta datos de entrada y crea datos resultantes
(Figura 8.1).

Figura 8.1 definición informal de un algoritmo utilizado en un ordenador

Datos de entrada

Algoritmo

Un método paso a paso para resolver un


problema o hacer una tarea

Datos resultantes

8.1.2 Ejemplo
Vamos a elaborar en esta simple definición con un ejemplo. Queremos desarrollar un algoritmo para encontrar el mayor
número entero entre una lista de números enteros positivos. El algoritmo debe encontrar el entero más grande entre una
lista de cualquier tamaño (por ejemplo 5, 1000, 10 000,
1 000 000). El algoritmo debe ser general y no depende de la cantidad de números enteros. Es obvio que la búsqueda de la
mayor entero entre muchos enteros es una tarea que no se puede hacer en un solo paso, ya sea por un humano o un
ordenador. El algoritmo tiene que probar cada número entero de uno en uno.

Para resolver este problema, necesitamos un enfoque intuitivo. En primer lugar utilizar un pequeño número de enteros (por
ejemplo, cinco), a continuación, extender la solución a cualquier número de enteros. Nuestra solución para cinco enteros sigue los
mismos principios y restricciones para mil o un millón de números enteros. Supongamos, incluso para un caso de cinco enteros, que el
algoritmo se encarga de los números enteros, uno por uno. Se ve en el primer entero sin conocer los valores de los números enteros
restantes. Después de que se encarga de la primera, que se ve en el segundo entero, y así sucesivamente. La figura 8.2 muestra una
forma de resolver este problema.

Llamamos a la FindLargest algoritmo. Cada algoritmo tiene un nombre para distinguirlo de otros algoritmos. El
algoritmo recibe una lista de cinco enteros como entrada y proporciona el mayor entero como salida.
8.1 Concepto 215

Figura 8.2 Encontrar el número entero más grande entre cinco enteros

( 12 8 13 9 11 ) Datos de entrada

más grande 12 12 8 13 9 11 Lista

Paso 1

más grande 12 12 8 13 9 11 Lista

Paso 2

más grande 13 12 8 13 9 11 Lista

Paso 3

más grande 13 12 8 13 9 11 Lista

Etapa 4

más grande 13 12 8 13 9 11 Lista

Paso 5

FindLargest

(13) Datos resultantes

Entrada
El algoritmo acepta la lista de los cinco enteros como entrada.

Tratamiento
El algoritmo utiliza los siguientes cinco pasos para encontrar el mayor entero:

Paso 1

En este paso, el algoritmo inspecciona el primer número entero (12). Ya que no conoce los valores de otros números enteros, se decide
que el número entero más grande (hasta ahora) es el primer entero. El algoritmo define un elemento de datos, llamado más grande, y se
define su valor al primer número entero (12).

Paso 2

El entero más grande hasta el momento es de 12, pero el nuevo número entero puede cambiar la situación. El algoritmo realiza una
comparación entre el valor de la mayor (12) y el valor del segundo número entero (8). Se estima que más grande es mayor que el
segundo número entero, lo que significa que más grande aún se mantiene el mayor entero. No hay necesidad de cambiar el valor
de la Mayor.

Paso 3

El entero más grande hasta el momento es de 12, pero el nuevo número entero (13) es mayor que la Mayor. Esto significa que el valor
de los mayores ya no es válida. El valor de la más grande debe ser sustituido por el tercer número entero (13). El algoritmo cambia el
valor de la Mayor a 13 y se mueve a la siguiente etapa.

Etapa 4

Nada se cambia en este paso porque más grande es mayor que el cuarto número entero (9).
216 algoritmos

Paso 5

Una vez más no se cambia nada, porque grande es más grande que el quinto número entero (11).

Salida
Debido a que no hay más números enteros para ser procesados, el algoritmo emite el valor de más grande, que es 13.

8.1.3 Definición de las acciones

Figura 8.2 no muestra lo que debe hacerse en cada paso. Podemos modificar la cifra para mostrar más detalles. Por ejemplo, en
el paso 1, ajuste más grande al valor de la primera entero. En los pasos 2 a 5, sin embargo, se necesitan medidas adicionales
para comparar el valor de más grande con el número entero actual que se está procesando. Si el número entero actual es mayor
que el más grande, establecer el valor de la mayor al número entero actual (Figura 8.3).

Figura 8.3 Definición de acciones en el algoritmo FindLargest

( 12 8 13 9 11 ) Datos de entrada

Establecer el número más grande a primera.

Paso 1

Si el segundo número es mayor que el más grande, más grande que establecer el segundo número.

Paso 2

Si el tercer número es mayor que el más grande, más grande establecido para el tercer número.

Paso 3

Si el cuarto número es mayor que el más grande, más grande establecido para el cuarto número.

Etapa 4

Si el número quinto es mayor que el más grande, más grande que establecer el número quinto.

Paso 5

FindLargest

(13) Datos resultantes

8.1.4 Refinamiento
Este refinamiento necesidades algoritmo sea aceptable para la comunidad de programadores. Hay dos problemas. En primer
lugar, la acción en el primer paso es diferente a las de los otros pasos. En segundo lugar, la redacción no es la misma en los
pasos 2 a 5. Podemos redefinir fácilmente el algoritmo para eliminar estos dos inconvenientes al cambiar la redacción en los
pasos 2 a 5 para 'Si el número entero actual es mayor que el más grande, más grande fijó a la corriente entero'. La razón por
la que el primer paso es diferente de los otros pasos se debe a que más grande no se ha inicializado.
8.1 Concepto 217

Si inicializamos más grande a - ∞ ( menos infinito), entonces el primer paso puede ser el mismo que los otros pasos, por lo que añadir un
nuevo paso, que calificó de paso 0 para mostrar que se debe hacer antes de procesar cualquier número entero.

Figura 8.4 muestra el resultado de este refinamiento. Tenga en cuenta que no tenemos para mostrar todos los pasos, ya
que ahora son los mismos.

Figura 8.4 FindLargest refinada

( 12 8 13 9 11 ) Datos de entrada

paso 0 Establecer más grande a - ∞

Paso 1 Si el número actual es mayor que el más grande, más grande que establecer el número actual.

Paso 5 Si el número actual es mayor que el más grande, más grande que establecer el número actual.

FindLargest

13 ( ) Datos resultantes

8.1.5 Generalización
¿Es posible generalizar el algoritmo? Queremos encontrar el más grande de norte enteros positivos, donde norte puede ser 1000, 1
000 000, o más. Por supuesto, podemos seguir la Figura 8.4 y repetir cada paso. Pero si cambiamos el algoritmo para un
programa, entonces tenemos que escribir realmente las acciones de norte ¡pasos!

Hay una mejor manera de hacer esto. Podemos indicar al ordenador que repetir los pasos n veces. A continuación se incluye esta
característica en nuestro algoritmo pictórica (Figura 8.5).

Figura 8.5 Generalización de FindLargest

Datos de entrada ( norte enteros)

Establecer más grande a - ∞

Repita el paso siguiente norte veces:

Si el número entero actual es mayor que el más grande, más grande establecido al entero más actual.

FindLargest
Salida
218 algoritmos

8.2 tres construcciones


Científicos de la computación han definido tres construcciones para un programa estructurado o algoritmo. La idea es que un
programa debe estar hecho de una combinación de sólo estos tres constructos:
secuencia, decisión, y repetición ( Figura 8.6). Se ha demostrado que no hay necesidad de tomar otras construcciones.
Utilizando sólo estas construcciones hace que un programa o un algoritmo fácil de comprender, depurar o cambiar.

Figura 8.6 tres construcciones

hacer la acción 1 si una condición es verdadera,

hacer una serie de acciones


hacer la acción 2

mientras que una condición es verdadera,


más

hacer la acción norte hacer otra serie de acciones hacer una serie de acciones

a. Secuencia segundo. Decisión do. Repetición

8.2.1 Secuencia
La primera construcción se denomina secuencia. Un algoritmo, y, finalmente, un programa, es una secuencia de
instrucciones, que puede ser una simple instrucción o cualquiera de los otros dos constructos.

8.2.2 Decisión
Algunos problemas no se pueden resolver con sólo una secuencia de instrucciones simples. A veces tenemos que probar una
condición. Si el resultado de la prueba es verdadera, seguimos una secuencia de instrucciones: si es falso, se sigue una
secuencia diferente de instrucciones. Esto se llama el
decisión (selección) construir.

8.2.3 Repetición
En algunos problemas, la misma secuencia de instrucciones se debe repetir. Se realiza el tratamiento con el repetición o lazo construir.
Encontrar el mayor entero entre un conjunto de números enteros puede utilizar una construcción de este tipo.
8.3 Algoritmo de Representación 219

8.3 ALGORITMO REPRESENTACIÓN


Hasta ahora, hemos utilizado las cifras para transmitir el concepto de un algoritmo. Durante las últimas décadas, las
herramientas han sido diseñadas para este fin. Dos de estas herramientas, UML y pseudocódigo, se presentan aquí.

8.3.1 UML
Unified Modeling Language (UML) es una representación pictórica de un algoritmo. Oculta todos los detalles
de un algoritmo en un intento de dar el 'gran cuadro' y para mostrar cómo fluye el algoritmo de principio a fin.

UML se trata en detalle en el Apéndice B. Aquí sólo mostramos cómo los tres constructos se representan usando UML
(Figura 8.7). Tenga en cuenta que UML nos permite mucha flexibilidad, como se muestra en el Apéndice B. Por ejemplo, la
construcción de la decisión puede simplificarse si no hay acciones por parte falsa.

Figura 8.7 UML para tres constructos

[falso] [cierto]
acción 1

FalseAction 1 TrueAction 1 [cierto]

acción 2
TrueAction 1

FalseAction norte TrueAction norte


Acciónnorte
TrueAction 1

Acción norte

a. Secuencia segundo. Decisión do. Repetición

8.3.2 Pseudocódigo
pseudocódigo es una representación en idioma Inglés-como de un algoritmo. No existe una norma para pseudocode-Algunas
personas utilizan una gran cantidad de detalle, otros utilizan menos. Algunos utilizan un código que está cerca de Inglés, mientras
que otros utilizan una sintaxis como el lenguaje de programación Pascal. Pseudocódigo se trata en detalle en el Apéndice C. Aquí
sólo mostramos cómo los tres constructos pueden ser representados por pseudocódigo (Figura 8.8).
220 algoritmos

Figura 8.8 Pseudocódigo para tres constructos

si (condición)

TrueAction (s)

acción 1
else {
acción 2
{}
{
falseAction (s) Comportamiento)
acción norte
} } While (condición)

a. Secuencia segundo. Decisión do. Repetición

Ejemplo 8.1
Escribir un algoritmo en pseudocódigo que encuentra la suma de dos números enteros.

Solución
Este es un problema sencillo que puede ser resuelto utilizando sólo el constructo de secuencia. Tenga en cuenta también que
denominamos el algoritmo, definir la entrada al algoritmo y, al final, se utiliza una instrucción de retorno para devolver la suma
(algoritmo 8.1).

algoritmo 8.1 El cálculo de la suma de dos números enteros

Algoritmo : SumOfTwo ( primer segundo)

Propósito : Encuentra la suma de dos números enteros

Pre : Dado: dos enteros (primero y segundo)

Enviar : Ninguna

Regreso : El valor de la suma

suma ← primero + segundo

regreso suma

Ejemplo 8.2
Escribir un algoritmo para cambiar una calificación numérica a un / no pase de grado pase.

Solución
Este problema no se puede resolver con sólo la secuencia de constructo. También necesitamos la construcción de
decisiones. El ordenador se le da un número entero entre 0 y 100. Se devuelve 'pase' si el entero es mayor que o igual
a 70, y devuelve 'no pass' si el entero es menos de
70. Algoritmo 8.2 muestra el pseudocódigo para este algoritmo.
8.3 Algoritmo de Representación 221

algoritmo 8.2 Asignación de pase / no pase de grado

Algoritmo : Pasar/ No pase ( Puntuación)

Propósito : Crea un pase / no pase de grado dada la puntuación

Pre : Teniendo en cuenta: la puntuación que se cambió a grado

Enviar : Ninguna

Regreso : El grado

Si ( Puntuación ≥ 70)

grado ← "pasar"
más
grado ← "no pase"
regreso grado

Ejemplo 8.3
Escribir un algoritmo para cambiar una calificación numérica (número entero) a un grado de la letra.

Solución
Este problema se necesita más de una decisión. El pseudocódigo en el algoritmo 8.3 muestra una forma de resolver el
problema, no el mejor, pero nada fácil de entender. Una vez más, se da un número entero entre 0 y 100, y queremos
cambiarlo a un grado de la letra (A, B, C, D, o F).

algoritmo 8.3 La asignación de una calificación

Algoritmo : Grado de la letra ( Puntuación)

Propósito : Encontrar el grado de la letra que corresponde a la puntuación dada

Pre : Teniendo en cuenta: una puntuación numérica

Enviar : Ninguna

Regreso : Un grado de la letra

Si ( 100 ≥ Puntuación ≥ 90)

grado ← 'UNA'
Si ( 89 ≥ Puntuación ≥ 80)

grado ← 'SEGUNDO'

Si ( 79 ≥ Puntuación ≥ 70)

grado ← 'DO'
Si ( 69 ≥ Puntuación ≥ 60)

grado ← 'RE'
Si ( 59 ≥ Puntuación ≥ 0)

grado ← 'F'
regreso grado

}
222 algoritmos

Tenga en cuenta que la construcciones de decisión no necesitan una más sección, porque no hacemos nada si la condición es falsa.

Ejemplo 8.4
Escribir un algoritmo para encontrar el más grande de un conjunto de números enteros. No sabemos el número de enteros.

Solución
Utilizamos el concepto en la figura 8.5 en la página 217 para escribir un algoritmo para este problema (véase el Algoritmo 8.4).

algoritmo 8.4 Encontrar el mayor entero entre un conjunto de números enteros

Algoritmo : FindLargest ( lista)

Propósito : Encontrar el mayor entero entre un conjunto de números enteros

Pre : Teniendo en cuenta: el conjunto de enteros

Enviar : Ninguna

Regreso : El número entero más grande

más grande ← - ∞

mientras ( más enteros para comprobar)

{
corriente ← siguiente entero
Si ( corriente > Más grande)

más grande ← corriente

regreso más grande

Ejemplo 8.5
Escribir un algoritmo para encontrar el más pequeño de los primeros 1000 números enteros en un conjunto de números enteros.

Solución
Aquí tenemos un contador para contar el número de enteros. Inicializar el contador a 1 y el incremento en cada
repetición. Cuando el contador es mayor que 1.000, que la salida del bucle (véase Algoritmo 8.5). Tenga en cuenta que
hay más de 1000 números enteros en la lista, pero que quieren encontrar la más pequeña entre los primeros 1000.

https://sanet.st/blogs/
polatebooks /
8.4 Una definición más formal 223

algoritmo 8.5 Encuentra los números enteros más pequeños entre 1000 enteros

Algoritmo : FindSmallest ( lista)

Propósito : Encontrar y devolver el número entero más pequeño entre los 1000 primeros números enteros

Pre : Teniendo en cuenta el conjunto de los enteros con más de 1000 números enteros

Enviar : Ninguna

Regreso : El número entero más pequeño

pequeñísimo ← + ∞

mostrador ← 1
mientras ( mostrador ≤ 1000)

{
corriente ← siguiente entero
Si ( actual <más pequeño)

pequeñísimo ← contracorriente ←
mostrador + 1
}

regreso pequeñísimo

8.4 una definición formal MÁS


Ahora que hemos discutido el concepto de un algoritmo y se muestra su representación, que aquí hay una definición
más formal. Vamos a elaborar en esta definición.

Algoritmo: un conjunto ordenado de pasos inequívocos que produce


un resultado y termina en un tiempo finito.

8.4.1 bien definidos


Un algoritmo debe ser un bien definido, conjunto ordenado de instrucciones.

8.4.2 pasos inequívocos


Cada paso en un algoritmo debe estar claramente y sin ambigüedad definido. Si un paso es añadir dos números enteros, hay que
definir dos números enteros '', así como la operación de 'añadir': no ​podemos, por ejemplo, utilizar el mismo símbolo para significar
además en un lugar y en otro lugar la multiplicación.

8.4.3 producir un resultado


Un algoritmo debe producir un resultado, de lo contrario es inútil. El resultado puede ser datos devueltos al algoritmo de
llamada, o algún otro efecto (por ejemplo, impresión).
224 algoritmos

8.4.4 Terminar en un tiempo finito


Un algoritmo debe terminar (alto). Si no es así (es decir, que tiene un bucle infinito), no hemos creado un algoritmo.
En el capítulo 17 discutiremos soluble y insoluble problemas, y vamos a ver que un problema soluble tiene una
solución en forma de un algoritmo que termina.

8,5 algoritmos básicos


Varios algoritmos se utilizan en la informática de manera prevalentemente que se les considera 'básico'. Se
discuten los más comunes aquí. Esta discusión es muy general: aplicación depende del idioma.

8.5.1 Suma
Un algoritmo de uso común en la informática es suma. Podemos añadir dos o tres enteros con mucha facilidad, pero ¿cómo
podemos añadir muchos números enteros? La solución es simple: utilizamos el operador complemento en un bucle (Figura
8.9).

Figura 8.9 algoritmo de suma

Teniendo en cuenta: lista


de números enteros

suma 0

[falso]

Condición: más enteros para


[cierto]
añadir

siguiente entero

suma suma + Corriente

Devuelto: suma

Un algoritmo de suma tiene tres partes lógicas:


1. Inicialización de la suma en el comienzo.
2. El bucle, que en cada iteración añade un nuevo número entero a la suma.

3. Retorno del resultado después de salir del bucle.

8.5.2 Producto
Otro algoritmo común es encontrar el producto de una lista de números enteros. La solución es simple: utilizar el operador
de multiplicación en un bucle (Figura 8.10). Un algoritmo de producto tiene tres partes lógicas:
8.5 Algoritmos básicos 225

1. Inicialización del producto desde el principio.


2. El bucle, que en cada iteración multiplica un nuevo número entero con el producto.

3. Retorno del resultado después de salir del bucle.

Figura 8.10 algoritmo de producto

Teniendo en cuenta: lista


de números enteros

producto 1

[falso]

Condición: más enteros que se


[cierto]
multiplican

corriente siguiente entero

producto producto corriente


+

Devuelto: producto

Por ejemplo, el algoritmo anterior se puede utilizar para calcular X norte usando una modificación menor, esto se deja como
ejercicio. Como otro ejemplo, el mismo algoritmo se puede utilizar para calcular el factorial de un número entero, que se
discute más adelante en el capítulo.

8.5.3 menor y mayor


Discutimos el algoritmo para encontrar el más grande entre una lista de enteros al principio de este capítulo. La idea era escribir un
constructo decisión de buscar el mayor de dos números enteros. Si ponemos esta construcción en un bucle, podemos encontrar la
mayor de una lista de números enteros.
Encontrar el número entero más pequeño entre una lista de números enteros es similar, con dos diferencias menores. En primer lugar,
se utiliza un constructo decisión de buscar el menor de dos números enteros. En segundo lugar, inicializamos con un gran número entero en
lugar de uno muy pequeño. La Figura 8.11 muestra el algoritmo para encontrar el más pequeño entre una lista de números enteros. La cifra de
encontrar el más grande es similar y se deja como ejercicio.
226 algoritmos

Figura 8.11 Encontrar el elemento de datos más pequeña

Teniendo en cuenta: lista


de números enteros

pequeñísimo +

8
[falso]

[cierto]
Condición: más enteros para
procesar

corriente siguiente entero

[falso] [cierto]

Condición: Corriente
<menor

pequeñísimo curent

Devuelto: más pequeña

8.5.4 Clasificación

Una de las aplicaciones más comunes en la informática es clasificación, que es el proceso por el cual los datos se disponen de
acuerdo con sus valores. Las personas están rodeadas de datos. Si los datos no se ordenó, se tardaría horas y horas para
encontrar una sola pieza de información. Imagine la dificultad de encontrar el número telefónico de una persona en un directorio
telefónico que no se ordenó.
En esta sección, introducimos tres algoritmos de ordenación: ordenación por selección, ordenamiento de burbuja, y ordenar la
inserción. Estos tres algoritmos de clasificación son la base de algoritmos de ordenación más rápidos utilizados en la informática actual.

tipo de selección
en un ordenación por selección, la lista para ser ordenados se divide en dos sublistas-ordenados y unsorted- que están separados
por una pared imaginaria. Nos encontramos el elemento más pequeño de la lista secundaria sin ordenar e intercambiarlo con el
elemento al principio de la lista secundaria sin clasificar. Después de cada selección y de intercambio, la pared imaginaria entre los
dos sublistas mueve un elemento delante, aumentando el número de elementos ordenados y disminuir el número de los no
ordenados. Cada vez que nos acercamos un elemento de la lista secundaria sin ordenar a la sublista ordenada, hemos completado
una Ordenar pasar. Una lista de norte elementos requiere norte - 1 pasa a reorganizar completamente los datos. Selección tipo se
presenta gráficamente en la Figura 8.12.

Figura 8.12 selección especie

pared
Cambie el más pequeño entre k º a norte º
con los números k número º

1 j k norte

Ordenado sin clasificar


8.5 Algoritmos básicos 227

Figura 8.13 traza un conjunto de seis números enteros a medida que ordenarlos.

Figura 8.13 Ejemplo de selección especie

Intercambiar Intercambiar Intercambiar

78 45 23 8 32 56 8 78 45 23 32 56 8 23 45 78 32 56

Ordenado

lista original Después de pase 1 Después de pase 2

Intercambiar Intercambiar

8 23 32 78 45 56 8 23 32 45 78 56 8 23 32 45 56 78

Ordenado Ordenado Ordenado

Después de pase 3 Después pase 4 Después de pase 5

La figura muestra cómo la pared entre las sublistas ordenados y no ordenados mueve en cada pase. Al estudiar la figura,
veremos que la lista está ordenada después de cinco pases, que es uno menos que el número de elementos en la lista. Por
lo tanto, si utilizamos un bucle para el control de la clasificación, el bucle tendrá uno menos iteración que el número de
elementos a clasificar.

Figura 8.14 algoritmo de ordenación por selección

Teniendo en cuenta:
lista de números enteros

Coloque la pared en la parte más a


la izquierda de la lista

[falso]

[cierto]
Condición: más pasos a
seguir

Esto implica otro Encuentra elemento más pequeño


bucle en la lista sin ordenar

Intercambiar elemento más pequeño


con el primer elemento de la
lista sin ordenar

Mover la pared un
elemento a la izquierda

Devuelto: lista ordenada

Un algoritmo de ordenación por selección

El algoritmo utiliza dos bucles, uno dentro del otro. El bucle exterior se itera para cada pasada: el bucle interior se encuentra el
elemento más pequeño en la lista sin clasificar. Figura 8.14 muestra el UML para el algoritmo de selección de tipo. El bucle interior
no se muestra explícitamente en la figura, pero la primera instrucción en el bucle es en sí mismo un bucle. Dejamos la
demostración del bucle como un ejercicio.
228 algoritmos

tipo burbuja
En el ordenamiento de burbuja método, la lista para ser ordenados también se divide en dos sub-listas-ordenada y sin clasificar. El
elemento más pequeño es burbujeaba en la lista secundaria sin clasificar y se trasladó a la sublista ordenada. Después de que el elemento
más pequeño ha sido movido a la lista ordenada, la pared se mueve un elemento por delante, lo que aumenta el número de elementos
ordenados y disminuir el número de los no clasificados. Cada vez que un elemento se mueve desde la sublista sin ordenar a la sublista
ordenada, se ha completado una pasada de clasificación (Figura 8.15). Dada una lista de norte elementos, ordenamiento de burbuja
requiere hasta norte - 1 pasa a ordenar los datos.

Figura 8.15 Ordenamiento de burbuja

pared
Burbujear

1 j k norte

Ordenado sin clasificar

Figura 8.16 muestra cómo la pared se mueve un elemento en cada pase. En cuanto a la primera pasada, comenzamos con 56
y la comparamos con 32. Desde el 56 no es menor que 32, no se mueve, y paso por debajo de un elemento. No hay
intercambios tienen lugar hasta que comparamos 45 a 8. Desde 8 es menor que 45, se intercambian los dos elementos, y
damos un paso hacia abajo un elemento. Debido a 8 se mueve hacia abajo, ahora se compara con 78, y se intercambian estos
dos elementos. Finalmente, 8 se compara con 23 e intercambiados. Esta serie de intercambios coloca 8 en la primera
ubicación, y la pared se desplaza una posición hacia arriba. El algoritmo debe su nombre a la forma en que los números en
este ejemplo, 8-parecen moverse al inicio, o superior de la lista de la misma manera que ascienden las burbujas a través del
agua.

Note que hemos detenido antes de la pared se mueve al final de la lista, ya que la lista ya está ordenada. Podemos
incluir siempre un indicador en el algoritmo para detener los pases si no hay intercambio de números se producen en un
pase. Este hecho se puede utilizar para mejorar la eficiencia de la burbuja ordenar por reducir el número de pasos.

Figura 8.16 Ejemplo de ordenamiento de burbuja

78 45 23 8 32 56 8 23 78 45 32 56 8 23 32 78 45 56

Ordenado

lista original Después de pase 1 Después de pase 2

8 23 32 45 78 56 8 23 32 45 56 78 8 23 32 45 56 78

Ordenado Ordenada Ordenado

Después de pase 3 Después pase 4 Después de pase 5

La especie de burbuja fue escrito originalmente para 'burbuja abajo' el elemento más alto en la lista. Desde el punto de vista
de la eficiencia, no hace ninguna diferencia si los elementos se mueven altas o bajas elementos se mueven hacia arriba.
Desde el punto de vista de la coherencia, sin embargo, hace que las comparaciones entre los algoritmos de ordenación más
fácil si todos ellos funcionan de la misma manera. Por esa razón, hemos elegido para mover el valor más bajo en cada
pasada.
8.5 Algoritmos básicos 229

Un algoritmo de ordenamiento de burbuja

tipo de burbujas también utilizan dos bucles, uno dentro del otro. El bucle exterior se itera para cada pasada, mientras que cada
iteración del bucle interno intenta burbuja un elemento hasta la parte superior (izquierda). Dejamos el UML y pseudocódigo como
ejercicios.

tipo de inserción
los tipo de inserción algoritmo es una de las técnicas más comunes de clasificación, y que a menudo es utilizado por los jugadores de
cartas. Cada tarjeta de un jugador recoge se inserta en el lugar que le corresponde en su mano de cartas para mantener una secuencia
particular. (Clasificación de cartas es un ejemplo de una especie que utiliza dos criterios para clasificar:. Palo y rango)

Figura 8.17 Tipo de inserción

Inserte primer elemento de la sección no clasificada en el lugar


apropiado en la sección clasificada

1 j k norte

Ordenado sin clasificar

pared

Figura 8.18 Ejemplo de ordenación por inserción

23 78 45 8 32 56 23 78 45 8 32 56 23 45 78 8 32 56

Ordenado Ordenado

lista original Después de pase 1 Después de pase 2

8 23 45 78 32 56 8 23 32 45 78 56 8 23 32 45 56 78

Ordenado Ordenado Ordenado

Después de pase 3 Después pase 4 Después de pase 5

En un tipo de inserción, como en los otros dos algoritmos de ordenación discutidos anteriormente, la lista se divide en dos
partes-ordenada y sin clasificar. En cada paso, el primer elemento de la lista secundaria no seleccionados se transfiere a la sublista
ordenada y se inserta en el lugar apropiado (Figura 8.17). Tenga en cuenta que una lista de norte elementos tendrán norte - 1 pasa a
ordenar los datos.
Figura 8.18 rastros ordenar una inserción a través de nuestra lista de seis números. La pared se mueve con cada paso como un
elemento se elimina de la lista secundaria sin clasificar y se insertan en la lista secundaria ordenada.

algoritmo de ordenación por inserción

El diseño de la ordenación por inserción sigue el mismo patrón visto tanto en la ordenación por selección y ordenación de burbuja.
El bucle exterior se itera para cada pasada, y el bucle interior se encuentra la posición de inserción. Dejamos el diagrama UML y
pseudocódigo como ejercicios.
230 algoritmos

Otros algoritmos de ordenación


Los tres algoritmos de ordenación discutidos aquí son los algoritmos de ordenación menos eficientes, y no debe ser
utilizado si la lista que ser resuelto tiene más de unos pocos cientos de elementos. Hemos discutido estos algoritmos
aquí con fines educativos, pero no son prácticos. Sin embargo, hay varias razones para la discusión de estos
algoritmos de ordenación en un libro de introducción:

❑ Son los algoritmos más simples de entender y analizar.

❑ Son la base de los algoritmos más eficientes como quicksort, pila de clasificación, Shell
ordenar, cubo especie, ordenamiento por mezcla, una especie radix, y así.

La mayoría de este tipo de algoritmos de clasificación avanzada se discuten en libros sobre estructuras de datos.
Podemos preguntarnos por qué hay tantos algoritmos de ordenación. La razón radica en el tipo de datos que tiene que
ser resuelto. Un algoritmo puede ser más eficiente para obtener una lista que se ordena parcialmente, mientras que otro
algoritmo puede ser más eficiente para obtener una lista que está completamente sin clasificar. Para decidir qué algoritmo es el
más adecuado para una aplicación en particular, una medida llamada es necesaria la complejidad de los algoritmos. Se discute
este tema en el capítulo 17, pero requiere un conocimiento profundo cursos adicionales en estructuras de programación y de
datos.

8.5.5 Búsqueda
Otro algoritmo común en la informática es buscando, que es el proceso de encontrar la ubicación de un blanco de entre una lista de
objetos. En el caso de una lista, significa que la búsqueda de un valor determinado, queremos encontrar la ubicación del primer
elemento de la lista que contiene ese valor. Hay dos búsquedas básicas para las listas: búsqueda secuencial y búsqueda binaria.
búsqueda secuencial se puede utilizar para localizar un elemento en cualquier lista, mientras que la búsqueda binaria requiere la
lista primero en ser resuelto.

búsqueda secuencial
búsqueda secuencial Si se utiliza la lista para ser buscado no está ordenada. Generalmente, se utiliza esta técnica sólo
para pequeñas listas o listas que no se buscan a menudo. En otros casos, el mejor enfoque es ordenar primero la lista y
luego buscarla en el uso de la búsqueda binaria se verá más adelante.

En una búsqueda secuencial, que empieza a buscar el objetivo desde el principio de la lista. Continuamos hasta que nos
encontremos, ya sea el objetivo o llegar al final de la lista. Figura 8.19 rastros los pasos para encontrar el valor de 62. El algoritmo de
búsqueda tiene que ser diseñado de manera que la búsqueda se detiene cuando nos encontramos con el objetivo o cuando se llega
al final de la lista.
8.5 Algoritmos básicos 231

Figura 8.19 Un ejemplo de una búsqueda secuencial

Target dado (62); Ubicación quería (5)

62
4
1

1 2 3 4 5 6 7 8 9 10 11 12

4 21 36 14 62 91 8 22 7 81 77 10

21 62
2

1 2 3 4 5 6 7 8 9 10 11 12

4 21 36 14 62 91 8 22 7 81 77 10

36 62 3

1 2 3 4 5 6 7 8 9 10 11 12

4 21 36 14 62 91 8 22 7 81 77 10

14 62
4
1 2 3 4 5 6 7 8 9 10 11 12

4 21 36 14 62 91 8 22 7 81 77 10

62
62
5

1 2 3 4 5 6 7 8 9 10 11 12

4 21 36 14 62 91 8 22 7 81 77 10

Búsqueda binaria
El algoritmo de búsqueda secuencial es muy lento. Si tenemos una lista de un millón de elementos, tenemos que hacer un millón de
comparaciones en el peor de los casos. Si la lista no está ordenada, esta es la única solución. Si la lista es ordenados, sin embargo,
podemos utilizar un algoritmo más eficiente llamada búsqueda binaria. En términos generales, los programadores utilizar una
búsqueda binaria cuando una lista es grande.

Por favor, consulte la siguiente página para ver un ejemplo de una búsqueda binaria.
232 algoritmos

Figura 8.20 Ejemplo de una búsqueda binaria

Target dado (22); Ubicación quería (7)

12

pasada

21 <destino 6
medio

primera 1 2 3 4 5 6 7 8 9 10 11 12

4 7 8 10 14 21 22 36 62 77 81 91

12

pasada

62> target 9
medio

primera 1 2 3 4 5 6 7 8 9 10 11 12

22 36 62 77 81 91

pasada

22 = objetivo 7
medio

primera 1 2 3 4 5 6 7 8 9 10 11 12

22 36

Una búsqueda binaria se inicia mediante pruebas de los datos en el elemento en la mitad de la lista. Esto determina si el objetivo
está en la primera mitad o la segunda mitad de la lista. Si es en la primera mitad, no hay necesidad de comprobar aún más la
segunda mitad. Si es en la segunda mitad, no hay necesidad de comprobar además la primera mitad. En otras palabras,
eliminamos la mitad de la lista de una consideración adicional.

Repetimos este proceso hasta que nos encontremos, ya sea el objetivo o satisfacer a nosotros mismos que no está en la lista. Figura 8.20
muestra cómo encontrar el objetivo, de 22 años, en una lista de 12 números con tres referencias: en primer lugar, a mediados y últimos.

1. Al principio, primero muestra 1 y último muestra 12. Sea medio mostrar la posición media,
(1 + 12) / 2, o 6 si trunca a un número entero. Ahora compare el objetivo (22) con los datos en la posición 6 (21). El
objetivo es mayor que este valor, así que ignore la primera mitad de la lista.

2. Movimiento primero después medio, para posicionar 7. Sea medio mostrar el medio de la segunda mitad,
(7 + 12) / 2, o 9. Ahora compare el objetivo (22) con los datos en la posición 9 (62). El objetivo es menor que este valor,
por lo que ignoran los números enteros de este valor (62) hasta el final.

3. Movimiento última antes medio para posicionar 8. Volver a calcular medio de nuevo, (8 + 7) / 2, o 7. comparar la
objetivo (22) con el valor en esta posición (22). Hemos encontrado el objetivo y puede dejar de fumar.
8.6 subalgoritmos 233

El algoritmo de búsqueda binaria tiene que ser diseñado para encontrar el destino o para detener si el destino no está en
la lista. Se puede demostrar que si el destino no se encuentra en la lista, el valor de último se hace menor que el valor de primero,
una condición anormal que nos ayuda a saber cuándo tiene que salir del bucle.

8.6 subalgoritmos
Las tres construcciones de programación que se describen en la sección 8.2 nos permiten crear un algoritmo para cualquier
problema solucionable. Los principios de la programación estructurada, sin embargo, requieren que un algoritmo se divide
en pequeñas unidades llamadas subalgoritmos.
Cada subalgoritmo está a su vez dividido en subalgoritmos más pequeños. Un buen ejemplo es el algoritmo para el
tipo de selección en la Figura 8.14. Encontrar el número entero más pequeño de la sublista sin ordenar es una tarea
independiente que puede ser considerado como un subalgoritmo. (Figura 8.21). El algoritmo SelectionSort llama al
FindSmallest subalgoritmo en cada iteración.

Figura 8.21 Concepto de un subalgoritmo

comienzo
Inicio

lista
pequeñísimo -
8

la parte más a la [Sin ordenar]


izquierda de la [Más para comprobar]

Llamar algoritmo
corriente número siguiente
FindSmallest, pasando
lista sin ordenar
más pequeña: Lista sin ordenar

el lugar adecuado de la pared en


Intercambiar elemento más pequeño
con el primer elemento de la [Actual <más pequeño]
lista sin ordenar

pequeñísimo corriente

Mover la pared un elemento en

Devueltos: Teniendo en cuenta

parada
Detener

algoritmo FindSmallest
algoritmo SelectionSort
234 algoritmos

Usando subalgoritmos tiene al menos dos ventajas:

❑ Es más comprensible. Mirando el algoritmo SelectionSort, podemos inmediata-


tamente ver que una tarea (encontrar el número entero más pequeño en la lista sin ordenar) se repite.

❑ Un subalgoritmo puede ser llamado muchas veces en diferentes partes del algoritmo principal
sin ser reescrito.

tabla 8.6.1 Estructura


Otro uso es la herramienta programadores diagrama de estructura. Un diagrama de estructura es una herramienta de diseño de
alto nivel que muestra la relación entre los algoritmos y subalgoritmos. Se utiliza principalmente en el nivel de diseño en lugar de a
nivel de programación. Se discute brevemente la carta de estructura en el Apéndice D.

8.7 RECURSION
En general, hay dos enfoques para escribir algoritmos para resolver un problema. Uno de ellos utiliza iteración, los otros usos recursividad.
recursividad es un proceso en el que un algoritmo llama a sí misma.

8.7.1 definición iterativa


Para estudiar un ejemplo sencillo, considere el cálculo de un factorial. El factorial de un número entero es el producto de
los valores integrales de 1 al número entero. La definición es iterativo ( Figura 8.22). Un algoritmo es iterativa cada vez que
la definición no implica el propio algoritmo.

Figura 8.22 definición iterativa de factorial

1 Si n = 0

factorial ( n) =
n (n - 1) ( norte - 2) 3 2 1 Si norte > 0
+

+
+

8.7.2 definición recursiva


Un algoritmo se define de forma recursiva cada vez que aparece el algoritmo dentro de la definición en sí. Por ejemplo, la función
factorial puede definirse de forma recursiva como se muestra en la Figura 8.23.

Figura 8.23 definición recursiva del factorial

1 Si n = 0

factorial ( n) =
norte factorial ( norte - 1) Si norte > 0
+

La descomposición de factorial (3), utilizando la recursividad, se muestra en la Figura 8.24. Si estudiamos la figura
cuidadosamente, notaremos que la solución para un problema recurrente implica una
8.7 La recursividad 235

viaje de dos vías. En primer lugar se descompone el problema de arriba a abajo, y luego lo resolvemos de abajo hacia arriba.

Figura 8.24 Determinación de la solución recursiva al problema factorial

Factorial (3) = 3 Factorial (2) Factorial (3) = 3 2=6

+
+
Factorial (2) = 2 Factorial (1) Factorial (2) = 2 1=2

+
Factorial (1) = 1 Factorial (0) Factorial (1) = 1 1=1
+

+
Factorial (0) = 1

A juzgar por este ejemplo, parece como si el cálculo recursivo es mucho más largo y difícil. Así que ¿por qué
queremos utilizar el método recursivo? Aunque el cálculo recursivo parece más difícil cuando se utiliza papel y
lápiz, a menudo es una solución mucho más fácil y más elegante cuando se utilizan los ordenadores. Además,
ofrece una simplicidad conceptual para el creador y el lector.

solución iterativa
Vamos a escribir un algoritmo para resolver el problema factorial de forma iterativa. Esta solución implica generalmente un bucle tal
como se ve en el algoritmo 8.6.

algoritmo 8.6 solución al problema iteración factorial

Algoritmo : factorial ( norte)

Propósito : Encuentra el factorial de un número mediante un bucle

Pre : Dado: norte

Enviar : Ninguna

Regreso : ¡norte!

F←1
yo ← 1

mientras ( yo ≤ norte)

F ← F × ii ← i + 1

} regreso F

}
236 algoritmos

solución recursiva
La solución recursiva para factoriales se muestra en el algoritmo 8.7. No necesita un bucle, como el propio concepto de
recursividad implica la repetición. En la versión recursiva, dejamos que el algoritmo factorial llama a sí mismo.

algoritmo 8.7 Una solución recursiva del problema factorial

Algoritmo : factorial ( norte)

Propósito : Encuentra el factorial de un número utilizando la recursividad

Pre : Dado: norte

Enviar : Ninguna

Regreso : ¡norte!

Si ( n = 0)
regreso 1

más
regreso norte × factorial ( norte - 1)

8.8 MATERIALES DE FINAL CAPÍTULO

8.8.1 Lectura recomendada


Para más detalles sobre los temas tratados en este capítulo, se recomiendan los siguientes libros:

❑ Aho, A., Hopcroft, J. y Ullman, J. El diseño y análisis de algoritmos informáticos,


Boston, MA: Addison-Wesley, 1974
❑ Cormen, T., Leiserson, C. y Rivest, R. Introducción a los algoritmos, Nueva York:
McGraw-Hill, 2003
❑ Gries, D. La ciencia de la programación, Nueva York: Springer, 1998

❑ Tardos, E. y Kleinberg, J. Algoritmo de diseño, Boston, MA: Addison-Wesley, 2006

❑ Roberts, E. Pensando de forma recursiva, Nueva York: Wiley, 1998

8.8.2 Los términos clave

algoritmo 214 repetición 218

búsqueda binaria 230 buscar 230

ordenamiento de burbuja 228 selección 218


8.8 Materiales final del capítulo 237

la decisión 218 ordenación por selección 226

datos de entrada 214 secuencia 218

ordenación por inserción 229 búsqueda secuencial 230

bucle 218 la clasificación 226

datos de salida 214 diagrama de estructura 234

producto 224 subalgoritmo 233

pseudocódigo 219 suma 224

recursividad 234 Unified Modeling Language (UML) 219

8.8.3 Resumen
❑ Un algoritmo se puede informalmente define como 'un método paso a paso para la solución de un proble-

Lem o haciendo una tarea'. Más formalmente, un algoritmo se define como 'un conjunto ordenado de pasos inequívocos
que produce un resultado y termina en un tiempo finito'.

❑ Científicos de la computación han definido tres construcciones para un programa estructurado o algo-

rithm: secuencia, decisión ( selección), y repetición ( lazo).


❑ Varias herramientas han sido diseñadas para mostrar un algoritmo: UML, pseudocódigo, y
los diagramas de estructura. UML es una representación gráfica de un algoritmo. Pseudocódigo es una representación en
idioma Inglés-como de un algoritmo. Un diagrama de estructura es una herramienta de diseño de alto nivel que muestra
la relación entre los algoritmos y subalgoritmos.

❑ Varios algoritmos se utilizan en la informática de manera prevalentemente que son consi-


Ered básica. Discutimos la más común en este capítulo: suma, producto, la búsqueda de la más pequeña y más grande, la
clasificación, y buscando.

❑ Una de las aplicaciones más comunes en la informática es la clasificación, que es el


proceso por el cual los datos se disponen de acuerdo con su valor. Hemos introducido tres primitivos, pero fundamentales, algoritmos de
ordenación: ordenación por selección, ordenamiento de burbuja, y tipo de inserción.
Estos tres algoritmos de clasificación son la base de los tipos más rápidos utilizados en la informática actual.

❑ Otro algoritmo común en la informática está buscando, que es el proceso de


encontrar la ubicación de un blanco de entre una lista de objetos. Hay dos búsquedas básicas para las listas: búsqueda secuencial y búsqueda
binaria. búsqueda secuencial se puede utilizar para localizar un elemento en cualquier lista, mientras que la búsqueda binaria requiere la
lista para ser ordenados.

❑ Los principios de la programación estructurada requieren que un algoritmo se divide en


pequeñas unidades llamadas subalgoritmos. Cada subalgoritmo está a su vez dividido en subalgoritmos más pequeños.

❑ En general, hay dos enfoques para escribir algoritmos para resolver un problema. Uno
usos iteración, los otros usos recursividad. Un algoritmo es iterativa cada vez que la definición no implica el
propio algoritmo. Un algoritmo se define de forma recursiva cada vez que aparece el algoritmo dentro de la
definición en sí.
238 algoritmos

8.9 PRÁCTICA SET


8.9.1 Cuestionarios

Un conjunto de pruebas interactivas de este capítulo se puede encontrar en la página web del libro. Se recomienda
encarecidamente que el estudiante toma las pruebas para comprobar su / su comprensión de los materiales antes de continuar
con el juego de práctica.

8.9.2 Examen de preguntas


Q8-1. ¿Cuál es la definición formal de un algoritmo?
P8-2. Definir las tres construcciones utilizadas en la programación estructurada.

Q8-3. ¿Cómo es un diagrama UML relacionado con un algoritmo?

Q8-4. ¿Cómo se pseudocódigo relacionada con un algoritmo?

Q8-5. ¿Cuál es el propósito de un algoritmo de ordenación?

Q8-6. ¿Cuáles son los tres algoritmos de ordenación básicos discutidos en este capítulo?

Q8-7. ¿Cuál es el propósito de un algoritmo de búsqueda?

Q8-8. ¿Cuáles son los dos algoritmos de búsqueda básicos discutidos en este capítulo?

Q8-9. Dar una definición y un ejemplo de un proceso iterativo.


Q8-10. Dar una definición y un ejemplo de un proceso recursivo.

8.9.3 Problemas
P8-1. Usando el algoritmo de resumen, hacer una tabla para mostrar el valor de la suma después de
cada número entero de la lista siguiente se procesa:

20 12 70 81 45 13 81

P8-2. Usando el algoritmo de producto, hacer una tabla para mostrar el valor del producto tras
cada número entero de la lista siguiente se procesa:

2 12 8 11 10 5 20

P8-3. Usando el algoritmo FindLargest, hacer una tabla para mostrar el valor de la más grande después de
cada número entero de la lista siguiente se procesa:

18 12 8 20 10 32 5

P8-4. Usando el algoritmo FindSmallest, hacer una tabla para mostrar el valor más pequeño de
después de cada número entero de la lista siguiente se procesa:

18 3 11 8 20 1 2

P8-5. Usando el algoritmo de ordenación por selección, ordenar manualmente la siguiente lista y mostrar su
trabajar en cada pasada utilizando una tabla:

14 7 23 31 40 56 78 9 2
8.9 Conjunto de práctica 239

P8-6. Usando el algoritmo de ordenamiento de burbuja, ordenar manualmente la siguiente lista y mostrar su
trabajar en cada pasada utilizando una tabla:

14 7 23 31 40 56 78 9 2

P8-7. Usando el algoritmo de ordenación por inserción, ordenar manualmente la siguiente lista y mostrar su
trabajar en cada pasada:

7 23 31 40 56 78 9 2

P8-8. Una lista contiene los siguientes elementos. Los dos primeros elementos se han ordenado
usando el algoritmo de ordenación por selección. ¿Cuál es el valor de los elementos de la lista después de tres pases más de
la ordenación por selección?

7 8 26 44 13 23 98 57

P8-9. Una lista contiene los siguientes elementos. Los dos primeros elementos se han ordenado
usando el algoritmo de ordenamiento de burbuja. ¿Cuál es el valor de los elementos de la lista después de tres pases más de la
ordenación de burbuja?

7 8 26 44 13 23 57 98

P8-10. Una lista contiene los siguientes elementos. Los dos primeros elementos se han ordenado
usando el algoritmo de ordenación por inserción. ¿Cuál es el valor de los elementos de la lista después de tres
pases más del tipo de inserción?

3 13 7 26 44 23 98 57

P8-11. Una lista contiene los siguientes elementos. Usando el algoritmo de búsqueda binaria, vestigios
los pasos seguidos para encontrar 88. En cada paso, se muestran los valores de primero último, y medio:

8 13 17 26 44 56 88 97

P8-12. Una lista contiene los siguientes elementos. Usando el algoritmo de búsqueda binaria, vestigios
los pasos seguidos para encontrar 20. En cada paso, muestran los valores de primero último, y medio:

17 26 44 56 88 97

P8-13. Utilizando la figura 8.19 en la sección 8.5.1 (búsqueda secuencial) muestran todos los pasos para intentar
encontrar un objetivo de 11 (que no está en la lista).

P8-14. Utilizando la figura 8.20 en la sección 8.5.5 (búsqueda binaria) mostrar todos los pasos tratan de encontrar una
blanco de 17 (que no está en la lista).
P8-15. Aplicar la definición iterativa del algoritmo factorial para mostrar el valor de F en
cada paso al encontrar el valor de 6! (6 factorial).
P8-16. Aplicar la definición recursiva del algoritmo factorial para mostrar el valor de
Factorial en cada paso al encontrar el valor de 6!
P8-17. Escribir un algoritmo recursivo en pseudocódigo para encontrar el máximo común divisor
(GCD) de dos enteros utilizando la definición en la Figura 8.25. En esta definición, la expresión ' X mod y 'Significa
dividir X por y y utilizando el resto como el resultado de la operación.
240 algoritmos

Figura 8.25 problema P8-17

si y = 0 en otro
mcd ( X , y) = x
mcd ( y , X mod y) caso

P8-18. Utilizando la definición de la figura 8.25, se encontró lo siguiente:

a. gcd (7, 41) do. gcd (80, 4)

segundo. gcd (12, 100) re. gcd (17, 29)


P8-19. Escribir un algoritmo recursivo en pseudocódigo para encontrar la combinación de norte objetos
tomado k a la vez con la definición en la Figura 8.26.

Figura 8.26 problema P8-19

Si k = 0 o n = k
C ( norte , k ) = 1

C ( norte - 1, k) + C ( norte - 1, k - 1) Si norte > k > 0

P8-20. Utilizando la definición de la figura 8.26, se encontró lo siguiente:

a. C (3, 2) do. C (2, 7)

segundo. C (5, 5) re. C (4, 3)


P8-21. La secuencia de Fibonacci, Fib ( norte), se utiliza en la ciencia y las matemáticas como se muestra en
Figura 8.27. Escribir un algoritmo recursivo en pseudocódigo para calcular el valor de Fib ( norte).

Figura 8.27 problema P8-21

0 Si n = 0

Fib ( norte ) = 1 Si n = 1 si norte

Fib ( n) = Fib ( norte - 1) + Fib ( norte - 2) >1

P8-22. Utilizando la definición de la figura 8.27, se encontró lo siguiente:

a. Fib (2) do. Fib (4)

segundo. Fib (3) re. Fib (5)

P8-23. Dibuje un diagrama UML para el algoritmo de ordenación de selección que utiliza dos bucles. los
bucle anidado se utiliza para encontrar el elemento más pequeño de la sublista sin ordenar.

P8-24. Dibuje un diagrama UML para el algoritmo de ordenación burbuja que utiliza dos bucles. los
bucle anidado se utiliza para intercambiar artículos adyacentes en la sublista sin clasificar.
8.9 Conjunto de práctica 241

P8-25. Dibuje un diagrama UML para el algoritmo de ordenación por inserción que utiliza dos bucles.
El bucle anidado se utiliza para hacer la inserción en la sublista ordenada.

P8-26. Dibuje un diagrama UML para el algoritmo de ordenación burbuja que utiliza un subalgoritmo.
El subalgoritmo burbujas de la sublista sin clasificar.
P8-27. Dibuje un diagrama UML para el algoritmo de ordenación por inserción que utiliza un subalgoritmo.
El subalgoritmo se utiliza para hacer la inserción en la sublista ordenada.
P8-28. Escribir un algoritmo en pseudocódigo para el diagrama de UML en la figura 8.9 en
sección 8.5.1 (suma).
P8-29. Escribir un algoritmo en pseudocódigo para el diagrama de UML en la Figura 8.10 en
sección 8.5.5 (producto).
P8-30. Escribir un algoritmo en pseudocódigo para la ordenación por selección usando dos bucles anidados.

P8-31. Escribir un algoritmo en pseudocódigo para la ordenación por selección usando un subalgoritmo
para encontrar el número entero más pequeño de la sublista sin ordenar.

P8-32. Escribir un algoritmo en pseudocódigo para el ordenamiento de burbuja utilizando dos bucles anidados.

P8-33. Escribir un algoritmo en pseudocódigo para el ordenamiento de burbuja utilizando un subalgoritmo hacer
burbujeante en la sublista sin ordenar.

P8-34. Escribir un algoritmo en pseudocódigo para la ordenación por inserción usando dos de bucle anidado.

P8-35. Escribir un algoritmo en pseudocódigo para la ordenación por inserción usando un subalgoritmo a
hacer de inserción en la sublista ordenada.

P8-36. Escribir un algoritmo en pseudocódigo para el algoritmo de búsqueda secuencial. Incluir


la condición para la terminación algoritmo de si el objetivo se encuentra o no se encuentra.

P8-37. Escribir un algoritmo en pseudocódigo para el algoritmo de búsqueda binaria. Incluir la


condiciones para la terminación algoritmo de si el objetivo se encuentra o no se encuentra.

P8-38. Usando el diagrama UML para el algoritmo de producto, dibujar un diagrama para calcular
El valor de X norte, cuando X y norte son dos números enteros dados.

P8-39. Escribir un algoritmo en pseudocódigo para encontrar el valor de X norte, cuando X y norte son dos
enteros dados.
CAPÍTULO 9
Lenguajes de programación

En el capítulo 8 hemos discutido algoritmos. Mostramos cómo podemos escribir algoritmos en UML o pseudocódigo para
resolver un problema. En este capítulo, se examinan los lenguajes de programación que pueden implementar pseudocódigo o
UML descripciones de una solución en un lenguaje de programación. Este capítulo no está diseñado para enseñar a un
determinado lenguaje de programación; está escrito para comparar y contrastar diferentes idiomas.

objetivos
Después de estudiar este capítulo, el estudiante debe ser capaz de:

❑ Describir la evolución de los lenguajes de programación de lenguaje de máquina a


lenguajes de alto nivel.

❑ Entender cómo un programa en un lenguaje de alto nivel se traduce en la máquina


idioma mediante un intérprete o un compilador.

❑ Distinguir entre cuatro paradigmas del lenguaje informático.

❑ Entender el paradigma procedimental y la interacción entre una unidad de programa y


elementos de datos en el paradigma.

❑ Comprender el paradigma orientado a objetos y la interacción entre una unidad de programa


y los objetos en este paradigma.

❑ Definir paradigma funcional y comprender sus aplicaciones.

❑ Definir un paradigma de declaración y comprender sus aplicaciones.

❑ Definir conceptos comunes en las lenguas de procedimiento y orientados a objetos.


Lenguajes de programación 244

9.1 EVOLUCIÓN
Para escribir un programa para un ordenador, debemos usar un lenguaje de programación. UNA lenguaje de ordenador es un conjunto
de palabras predefinidas que se combinan en un programa de acuerdo a reglas predefinidas ( sintaxis). Con los años, los lenguajes de
programación han evolucionado a partir de Lenguaje de máquina a lenguajes de alto nivel.

9.1.1 lenguajes de máquina


En los primeros días de las computadoras, el único lenguajes de programación estaban disponibles lenguajes de máquina. Cada
equipo tiene su propio lenguaje de máquina, que estaba hecha de corrientes de 0s y 1s. En el capítulo 5 se demostró que en una
computadora hipotética primitiva, tenemos que utilizar 11 líneas de código para leer dos números enteros, agregarlos, e imprimir el
resultado. Estas líneas de código, cuando escrito en lenguaje de máquina, hacen 11 líneas de código binario, cada uno de 16 bits,
como se muestra en la Tabla 9.1.

Tabla 9.1 Código en lenguaje de máquina para agregar dos números enteros

hexadecimal Código en lenguaje de máquina

(1FEF) dieciséis 0001 1111 1110 1111

(240F) dieciséis 0010 0100 0000 1111

(1FEF) dieciséis 0001 1111 1110 1111

(241F) dieciséis 0010 0100 0001 1111

(1040) dieciséis 0001 0000 0100 0000

(1141) dieciséis 0001 0001 0100 0001

(3201) dieciséis 0011 0010 0000 0001

(2422) dieciséis 0010 0100 0010 0010

(1F42) dieciséis 0001 1111 0100 0010

(2FFF) dieciséis 0010 1111 1111 1111

(0000) dieciséis 0000 0000 0000 0000

El lenguaje de máquina es el único lenguaje entendido por el hardware del ordenador, que está hecho de conmutadores
electrónicos con dos estados: off (representando 0) y en (que representa (1).

El único lenguaje entendido por un ordenador es el lenguaje de máquina.

Aunque un programa escrito en lenguaje de máquina realmente representa la cantidad de datos es manipulada por el ordenador, que
tiene al menos dos inconvenientes. En primer lugar, es dependiente de la máquina. El lenguaje de máquina de una computadora es
diferente que el lenguaje de máquina de otro equipo si
9.1 Evolución 245

que utilizan un hardware diferente. En segundo lugar, es muy tedioso para escribir programas en este lenguaje y muy difícil de
encontrar errores. La era de lenguaje de máquina está ahora se conoce como la primera generación de lenguajes de programación.

9.1.2 Los lenguajes ensambladores

La próxima evolución en la programación de vino con la idea de sustituir el código binario para la instrucción y direcciones con
símbolos o mnemotécnicos. Debido a que utilizan símbolos, idiomas se conocen por primera vez como lenguajes simbólicos. El
conjunto de estas lenguas mnemotécnicos se refirió más adelante a como lenguajes ensambladores. El lenguaje ensamblador
para nuestro ordenador hipotética para reemplazar el lenguaje de máquina en la Tabla 9.1 se muestra en la Tabla 9.2.

Tabla 9.2 Código en lenguaje ensamblador para agregar dos números enteros

Código en lenguaje ensamblador Descripción

RF CARGA Teclado Cargar de controlador de teclado para registrar F

TIENDA Número1 RF Almacena el Registro M en Número1

RF CARGA Teclado Cargar de controlador de teclado para registrar F

TIENDA Número2 RF Almacena el Registro M en Número2

R0 CARGA Numero 1 Número1 cargar en el registro 0

R1 CARGA Número 2 Número2 cargar en el registro 1

ADDI R2 R0 R1 Añadir registros 0 y 1 con resultado en el registro 2

Resultado TIENDA R2 registradora de la tienda en 2 Resultado

RF CARGA Resultado Resultado de carga en el registro F

Guarde el Monitor de RF Almacena el Registro M en el controlador del monitor

DETENER Detener

Un programa especial llamado ensamblador se utiliza para traducir el código en lenguaje ensamblador a lenguaje de máquina.

9.1.3 Los lenguajes de alto nivel


Aunque los lenguajes de montaje mejorado en gran medida la eficiencia de la programación, que aún se requieren
programadores concentrarse en el hardware que utilizaban. Trabajar con lenguajes simbólicos también fue muy tedioso, ya
que cada instrucción de máquina tenía que ser codificado de forma individual. El deseo de mejorar la eficiencia del
programador y para cambiar el enfoque desde el ordenador al problema que se resuelve condujo al desarrollo de lenguajes
de alto nivel.
Los lenguajes de alto nivel son portátiles en varios equipos diferentes, lo que permite al programador
concentrarse en la aplicación en lugar de las complejidades de la organización del equipo. Están diseñados para
aliviar el programador de los detalles de lenguaje ensamblador.
Lenguajes de programación 246

Los lenguajes de alto nivel comparten una característica con lenguajes simbólicos: deben ser convertidos en lenguaje de
máquina. Este proceso se llama interpretación o Compilacion ( descrito más adelante en el capítulo).

Con los años, varios idiomas, sobre todo BASIC, COBOL, Pascal, Ada, C, C + +,
y Java, se desarrollaron. Programa 9-1 muestra el código para sumar dos números enteros tal y como aparecería en el C + + idioma.
Aunque el programa parece más larga, algunas de las líneas se utilizan para la documentación (comentarios).

programa 9-1 programa de adición en C ++


/* Este programa lee dos números enteros de teclado e imprime su suma. Escrito por: Fecha:

*/
# incluir <iostream> using
namespace std; int main () {

// declaraciones locales

int number1; int


number2;
resultado int;
// declaraciones
cin >> número1; cin >>
number2;
resultado = number1 + number2; tribunal <<
resultado; return 0;

} // principal

9.2 TRADUCCIÓN
Programas de hoy normalmente están escritos en uno de los lenguajes de alto nivel. Para ejecutar el programa en un
ordenador, el programa tiene que ser traducido al lenguaje de máquina del equipo en el que se ejecutará. El programa
en un lenguaje de alto nivel se llama el programa fuente. El programa traducido en lenguaje de máquina se denomina programa
objeto. Se utilizan dos métodos para la traducción: Compilacion y interpretación.

9.2.1 Compilación
UNA compilador normalmente se traduce todo el programa fuente en el programa objeto.

9.2.2 Interpretación
Algunos lenguajes de programación utilizan una Interprete para traducir el programa fuente en el programa objeto.
Interpretación se refiere al proceso de traducción de cada línea de la fuente
9.2 Traducción 247

programa en la línea correspondiente del programa objeto y la ejecución de la línea. Sin embargo, hay que tener en
cuenta dos tendencias en la interpretación: la utilizada por algunos lenguajes Java y antes de la interpretación utilizado
por Java.

Primera aproximación a la interpretación


Algunos lenguajes interpretados antes de Java (como BASIC y APL) utilizaron un tipo de proceso de interpretación
que nos referimos como la primer enfoque a la interpretación, por la falta de cualquier otro nombre. En este tipo de
interpretación, cada línea del programa fuente se traduce en el lenguaje de máquina del equipo que se utiliza y
ejecutado inmediatamente. Si hay algún error en la traducción y la ejecución, el proceso muestra un mensaje y el resto
del proceso se aborta. El programa necesita ser corregido y ser interpretada y ejecutada de nuevo desde el principio.
Esta primera aproximación se considera que es un proceso lento, por lo que la mayoría de los lenguajes que utilizan la
compilación en lugar de interpretación.

En segundo enfoque de la interpretación


Con la llegada de Java, se introdujo un nuevo tipo de proceso de interpretación. El lenguaje Java está diseñado para ser
portátil a cualquier ordenador. Para lograr la portabilidad, la traducción del programa fuente al objeto de programa se realiza en
dos etapas: recopilación e interpretación. Un programa de fuente de Java se compila primero en crear Java código de bytes, que
se parece a un código en lenguaje de máquina, pero no es el código objeto para cualquier equipo específico: es el código
objeto para una máquina virtual, llamada la Máquina Virtual de Java o JVM. El código de bytes a continuación, puede ser
compilado o interpretado por cualquier equipo que ejecuta una JVM emulador, es decir, el equipo que ejecuta el código de
bytes sólo necesita un emulador de JVM, no el compilador Java.

9.2.3 proceso de traducción


Recopilación e interpretación difieren en que la primera se traduce todo el código fuente antes de ejecutarlo, mientras que
la segunda se traduce y ejecuta el código fuente de una línea a la vez. Ambos métodos, sin embargo, siguen el mismo
proceso de traducción se muestra en la Figura 9.1.

Figura 9.1 proceso de traducción del código fuente

símbolos fichas Instrucciones instrucciones codificables Código

analizador analizador analizador Generador


léxico de sintaxis semántico de códigos

Fuente fi Objeto fi
l l

analizador léxico
UNA analizador léxico lee el código fuente, símbolo a símbolo, y crea una lista de fichas en el idioma de origen.
Por ejemplo, los cinco símbolos w, h, yo, l, e se leen y se agrupan juntos como el token mientras en el C, C + +, o
lenguajes Java.
Lenguajes de programación 248

analizador de sintaxis
los analizador de sintaxis analiza un conjunto de fichas para encontrar instrucciones. Por ejemplo, los tokens ' X ' '=', '0' son
utilizados por el analizador de sintaxis para crear la instrucción de asignación en el lenguaje C' x = 0' . Vamos a discutir la función de
un analizador y un analizador de sintaxis en más detalle cuando describimos el reconocimiento del lenguaje en la inteligencia
artificial en el capítulo 18.

analizador semántico
los analizador semántico Comprueba la frases creadas por el analizador de sintaxis para asegurarse de que no contienen ninguna
ambigüedad. Los lenguajes de programación son normalmente no ambigua, lo que significa que esta etapa se omite, ya sea en una traductor,
o su deber es mínima. También se discute el análisis semántico en más detalles en el capítulo 18.

Generador de códigos
Después instrucciones inequívocas son creados por el analizador semántico, cada instrucción se convierte en un conjunto de
instrucciones en lenguaje máquina para el equipo en el que se ejecutará el programa. Esto se hace mediante la generador de
códigos.

9.3 paradigmas de programación


lenguajes informáticos Hoy se clasifican de acuerdo con el método que utilizan para resolver un problema. UNA paradigma, Por
lo tanto, es una manera en la que un lenguaje de programación se ve en el problema a resolver. Dividimos los lenguajes de
programación en cuatro paradigmas: procedimental ( imperativo), orientado a objetos, funcional, y declarativo. Figura 9.2 resume
estos.

Figura 9.2 Categorías de lenguajes de programación

Lenguaje de ordenador
paradigmas

Orientado a
Procesal Funcional Declarativo
objetos

FORTRAN Smalltalk C ++ Esquema Prólogo


Visual Basic C # LISP
COBOL
Java
BÁSICO

CPascal Ada

9.3.1 El paradigma procedimental


En el paradigma procedimental ( o paradigma imperativo) podemos pensar en un programa como una
Agente activo que manipula objetos pasivos. Nos encontramos con muchos objetos pasivos en nuestra
9.3 paradigmas de programación 249

la vida cotidiana: una piedra, un libro, una lámpara, y así sucesivamente. Un objeto pasivo no puede iniciar una acción por sí mismo, pero puede
recibir acciones de agentes activos.
Un programa en un paradigma procedimental es un agente activo que utiliza objetos pasivos que nos referimos como datos o elementos
de datos. Los elementos de datos, como objetos pasivos, se almacenan en la memoria del ordenador, y un programa que manipula. Para
manipular una pieza de información, el agente activo (programa) emite una acción, que se refiere como una procedimiento. Por ejemplo,
pensar en un programa que imprime el contenido de un archivo. Para imprimir, el archivo tiene que ser almacenado en la memoria (o
algunos registros que actúan como memoria). El archivo es un objeto pasivo o una colección de objetos pasivos. Para imprimir el
archivo, el programa utiliza un procedimiento, lo que llamamos impresión. La impresión del procedimiento por lo general se ha escrito con
anterioridad incluir todas las acciones necesarias para decirle a la computadora cómo imprimir cada carácter en el archivo. El programa
invoca o llamadas el procedimiento impresión. En un paradigma de procedimiento, el objeto ( expediente) y el procedimiento ( impresión)

son entidades completamente separadas. El objeto ( expediente) es una entidad independiente que puede recibir el impresión acción, o
algunas otras acciones, tales como borrar, copiar, y así. Para solicitar cualquiera de estas acciones en el archivo, necesitamos un
procedimiento para actuar en el archivo. El procedimiento impresión ( o
dupdo o borrar) es una entidad separada que se escribe y el programa sólo lo activa.
Para evitar la escritura de un nuevo procedimiento cada vez que necesitamos para imprimir un archivo, se puede escribir un
procedimiento general que puede imprimir cualquier archivo. Cuando escribimos este procedimiento, toda referencia al nombre del archivo es
reemplazado por un símbolo, tal como F o archivo, o algo más. Cuando el procedimiento se llama (activa), se pasa el nombre del archivo real
que se va a imprimir con el procedimiento, por lo que podemos escribir un procedimiento llamado impresión pero llamarlo dos veces en el
programa para imprimir dos archivos diferentes. La figura 9.3 muestra cómo un programa puede llamar a diferentes procedimientos predefinidos
para imprimir o eliminar los archivos de objetos diferentes.

Figura 9.3 El concepto del paradigma procedimental

procedimiento
PrintFile
fichero1

PrintFile (Archivo1)

copyFile
fichero2
deleteFile (Archivo2) procedimiento
procedimiento
deleteFile
Programa

Filen
procedimientos definida PREDE
objetos pasivos

Hay que separar el procedimiento de su activación por el programa. El programa no define el procedimiento (como
se explica más adelante), sólo se desencadena o llama al procedimiento. debe existir el procedimiento.

Cuando usamos un lenguaje de alto nivel de los procedimientos, el programa consiste en nada más que una gran cantidad de
llamadas de procedimiento. A pesar de que no es inmediatamente evidente, incluso cuando usamos un simple operador matemático
como el operador de suma (+), estamos usando una llamada de procedimiento a un procedimiento que ya está escrito. Por ejemplo,
cuando utilizamos la expresión A + B y esperamos que la expresión para añadir el valor de dos objetos A y B, que llamamos el
procedimiento
Lenguajes de programación 250

añadir y pasando el nombre de estos dos objetos en el procedimiento. El procedimiento añadir necesita dos objetos para
actuar. Añade los valores de los dos objetos y devuelve el resultado. En otras palabras, la expresión A + B es un atajo
para añadir ( A, B). El diseñador de la lengua ha escrito este procedimiento y podemos llamarlo.

Si pensamos en los procedimientos y los objetos a los cuales hay que actuar, el concepto del paradigma procedimental se hace
más simple de entender. Un programa en este paradigma se compone de tres partes: una parte para la creación de objetos, un
conjunto de llamadas de procedimiento, y un conjunto de código para cada procedimiento. Algunos procedimientos ya se han definido
en el lenguaje mismo. Mediante la combinación de este código, el programador puede crear nuevos procedimientos.

Figura 9.4 muestra estos tres componentes de un programa de procedimiento. También hay elementos extra en el
lenguaje que se utiliza para delimitar o la organización de las llamadas, pero éstos no se muestran en la figura.

Figura 9.4 Los componentes de un programa procedimental

Creación de objetos
(declaración)

Un conjunto de llamadas a procedimientos


(comandos)

Un conjunto de códigos
para cada procedimiento

Un programa procedimental

Algunos lenguajes procedimentales


imperativas (procedimiento) Varios lenguajes de alto nivel se han desarrollado durante las últimas décadas,
como FORTRAN, COBOL, Pascal, C y Ada.

FORTRAN

FORTRAN (Traducción FORmula), diseñado por un grupo de ingenieros de IBM bajo la supervisión de Jack Backus,
se empezó a comercializar en 1957. FORTRAN fue el primer lenguaje de alto nivel. Durante los últimos 40 años
FORTRAN ha pasado por varias versiones: FORTRAN, FORTRAN II, IV FORTRAN, FORTRAN 77, FORTRAN 99, y
HPF (High Performance Fortran). La nueva versión (HPF) se utiliza en sistemas de ordenadores con varios
procesadores de alta velocidad. FORTRAN tiene algunas características que, incluso después de cuatro décadas,
todavía lo hacen un lenguaje ideal para aplicaciones científicas y de ingeniería. Estas características se pueden
resumir en:

❑ la aritmética de alta precisión

❑ Capacidad de manejar números complejos

❑ cálculo de exponenciación ( una segundo)


9.3 paradigmas de programación 251

COBOL

COBOL (Common Business-Oriented Language) fue diseñado por un grupo de científicos de la computación bajo la
dirección de Grace Hopper de la Armada de los Estados Unidos. COBOL tenía un objetivo de diseño específico: para ser
utilizado como un lenguaje de programación de negocios. Los problemas a resolver en un entorno empresarial son
totalmente diferentes a las de un entorno de ingeniería. Las necesidades de programación del mundo de los negocios se
pueden resumir de la siguiente manera:

❑ El acceso rápido a los archivos y bases de datos

❑ actualización rápida de archivos y bases de datos

❑ Grandes cantidades de los informes generados

❑ salida con formato fácil de usar

Pascal

Pascal fue inventado por Niklaus Wirth en 1971 en Zurich, Suiza. Fue nombrado después de Blaise Pascal, matemático
francés del siglo 17 y filósofo que inventó la calculadora Pascaline. Pascal fue diseñado con un objetivo específico en
mente: para enseñar programación a los novatos, haciendo hincapié en el enfoque de la programación estructurada. A
pesar de que Pascal se convirtió en el idioma más popular en el mundo académico, que nunca alcanzó la misma
popularidad en la industria. hoy lenguajes procedimentales debemos mucho a este idioma.

do

los lenguaje C fue desarrollado en la década de 1970 por Dennis Ritchie en los Laboratorios Bell. Fue pensado originalmente
para los sistemas operativos y software de escritura-la mayor parte del sistema operativo UNIX está escrito en C. Más tarde,
se hizo popular entre los programadores por varias razones sistema:

❑ C tiene todas las instrucciones de alto nivel de un lenguaje de programación de alto nivel estructurada

debe tener: oculta los detalles de hardware del programador.


❑ C también tiene algunas instrucciones de bajo nivel que permiten al programador para acceder al hardware

cerámica de forma directa y rápida: C está más cerca de lenguaje ensamblador que cualquier otro lenguaje de alto nivel. Esto hace que
sea un buen idioma para los programadores del sistema.

❑ C es un lenguaje muy eficiente: sus instrucciones son cortos. Esto atrae la concisión pro-
programadores que desean escribir programas cortos.

Ada
Ada lleva el nombre de Augusta Ada Byron, hija de Lord Byron y el asistente de Charles Babbage, el inventor de la máquina
analítica. Fue creado por el Departamento de Defensa (DoD) para ser el lenguaje uniforme utilizado por todos los contratistas del
Departamento de Defensa. Ada tiene tres características que lo hacen muy popular para el Departamento de Defensa y la
industria:

❑ Ada tiene instrucciones de alto nivel como otras lenguas de procedimiento.

❑ Ada tiene instrucciones de permitir el procesamiento en tiempo real. Esto lo hace adecuado para el proceso de

controlar.

❑ Ada tiene capacidades de procesamiento paralelo. Se puede ejecutar en ordenadores centrales con

múltiples procesadores.
Lenguajes de programación 252

9.3.2 El paradigma orientado a objetos


los paradigma orientado a objetos se ocupa de los objetos activos en lugar de objetos pasivos. Nos encontramos con
muchos objetos activos en nuestra vida diaria: un vehículo, una puerta automática, un lavavajillas, y así sucesivamente. Las
acciones a realizar en estos objetos se incluyen en el objeto: los objetos sólo tienen que recibir el estímulo apropiado desde el
exterior para realizar una de las acciones.

Volviendo a nuestro ejemplo en el paradigma procedimental, un archivo en un paradigma orientado a objetos


puede ser embalado con todos los métodos de procedimientos llamados en el paradigma a ser realizada por el
archivo orientado a objetos: imprimir, copiar, borrar, etc. . El programa en este paradigma simplemente envía la
solicitud correspondiente al objeto (imprimir, borrar, copiar, etc.) y el archivo se puede imprimir, copiar o eliminar.
Figura 9.5 ilustra el concepto.

Figura 9.5 El concepto de un paradigma orientado a objetos

método de
Fichero1
copiar el

Estímulo método de
File1.print
impresión

archivo2
File2.delete
Estímulo
borrar
Programa método

Filen

objetos activos

Los métodos son compartidos por todos los objetos del mismo tipo, y también para otros objetos que se heredan de estos
objetos, como veremos más adelante. Si el programa quiere imprimir archivo1, simplemente envía el estímulo necesario para los
objetos activos y será impreso archivo1.
Al comparar el paradigma procedimental con el paradigma orientado a objetos (Figura 9.3 y Figura 9.5),
vemos que los procedimientos en el paradigma procedimental son entidades independientes, pero los métodos
de paradigma orientado a objetos pertenecen al territorio del objeto.

clases
Como muestra la Figura 9.5 muestra, los objetos del mismo tipo (archivos, por ejemplo) necesitan un conjunto de métodos que
muestran cómo un objeto de este tipo reacciona a los estímulos desde fuera del objeto de ' territorios '. Para crear estos métodos,
lenguajes orientados a objetos tales como C + +, Java y C # (pronunciado 'Do sostenido ') utilizar una unidad llamada clase, como se
muestra en la Figura 9.6. El formato exacto de esta unidad de programa es diferente para diferentes lenguajes orientados a objetos
(véase el Apéndice F).
9.3 paradigmas de programación 253

Figura 9.6 Los componentes de una clase

cabecera de la clase

Las declaraciones de variables

Definición de método 1

Definición de método 2

Definición de método N

métodos
En general, los formatos de los métodos son muy similares a las funciones que se utilizan en algunos lenguajes de procedimiento. Cada método
tiene su cabecera, sus variables locales, y su declaración. Esto significa que la mayoría de las características que hemos discutido para las
lenguas de procedimiento se aplican también a métodos escritos para un programa orientado a objetos. En otras palabras, podemos afirmar
que los lenguajes orientados a objetos son en realidad una extensión de las lenguas de procedimiento con algunas nuevas ideas y algunas
nuevas características. El C + + idioma, por ejemplo, es una extensión orientada a objetos del lenguaje C. El C + + idioma, incluso se puede
utilizar como un lenguaje de procedimientos sin o con un uso mínimo de los objetos. El lenguaje Java es una extensión de C + + idioma, pero
es totalmente un lenguaje orientado a objetos.

Herencia
En el paradigma orientado a objetos, como en la naturaleza, un objeto puede heredar de otro objeto. Este concepto se llama herencia.
Cuando se define una clase general, podemos definir una clase más específica que hereda algunas de las características de la clase
general, pero también tiene algunas características nuevas. Por ejemplo, cuando un objeto del tipo GeometricalShapes es definido,
podemos definir una clase llamada Rectángulos. Rectángulos son formas geométricas con características adicionales.

Polimorfismo
Polimorfismo muchas formas significa' '. Polimorfismo en el paradigma orientado a objetos significa que podemos definir
varias operaciones con el mismo nombre que puede hacer cosas diferentes en clases relacionadas. Por ejemplo,
supongamos que definimos dos clases, rectángulos y círculos, tanto heredada de los GeometricalShapes clase. Definimos
dos operaciones de ambas nombradas
zona, uno de cada uno de los rectángulos y en círculos, que calcular el área de un rectángulo o un círculo. Las dos operaciones
tienen el mismo nombre pero hacen cosas diferentes, como calcular el área de un rectángulo y el área de un círculo necesitar
diferentes operandos y operaciones.

Algunos lenguajes orientados a objetos


Varios lenguajes orientados a objetos ha sido desarrollado. Se discuten brevemente las características de dos: C + + y
Java.
Lenguajes de programación 254

C ++

los lenguaje C ++ fue desarrollado por Bjarne Stroustrup en el Laboratorio Bell como una mejora de la lengua C. Usa clases
para definir las características generales de objetos similares y las operaciones que se pueden aplicar a ellos. Por
ejemplo, un programador puede definir una GeometricalShapes clase y todas las características comunes a formas de
dos dimensiones geométricas, tales como centro, número de lados, y así sucesivamente. La clase también puede
definir operaciones (funciones o métodos) que se pueden aplicar a una forma geométrica, como el cálculo y la
impresión de la zona, calcular e imprimir el perímetro, la impresión de las coordenadas del punto central, y así
sucesivamente. Un programa puede ser escrito para crear diferentes objetos de tipo GeometricalShapes. Cada objeto
puede tener un centro situado en un punto diferente y un número diferente de lados. Entonces, el programa puede
calcular e imprimir el área, perímetro, y la ubicación del centro de cada objeto.

Tres principios se utilizaron en el diseño de la C + + idioma: encapsulación, heren- cia, y polimorfismo.

Java

Java fue desarrollado en Sun Microsystems, Inc. Se basa en C y C + +, pero algunas características de C + +, tales como la
herencia múltiple, se eliminan para hacer que el lenguaje más robusto. Además, el lenguaje es totalmente clasista. En C + + se
puede resolver un problema sin definir cada vez una clase, pero en Java cada elemento de datos pertenece a una clase.

Un programa en Java puede ser una aplicación o un applet. Una aplicación es un programa independiente completa que se
puede ejecutar de forma independiente. Un applet, por el contrario, está incrustado en HTML (véase el capítulo 6), almacenado en un
servidor, y está dirigido por un navegador. El navegador puede descargar el applet y ejecutarlo localmente.

En Java, un programa de aplicación (o un applet) es una colección de clases e instancias de esas clases. Una característica
interesante de Java es el biblioteca de clases, una colección de clases. Aunque C + + También proporciona una biblioteca de clases, en
Java, el usuario puede crear nuevas clases basadas en los proporcionados por la biblioteca.

La ejecución de un programa en Java es también único. Creamos una clase y pasarlo a la intérprete, que
llama a los métodos de la clase. Otra característica interesante de Java es el apoyo a multihilo. Un hilo es una
secuencia de acciones ejecutadas una tras otra. C + +
sólo permite roscar-que solo es, todo el programa se ejecuta como un proceso único hilo, pero Java permite la
ejecución concurrente de varias líneas de código.

9.3.3 El paradigma funcional


En el paradigma funcional un programa se considera una función matemática. En este contexto, una función es un cuadro
negro que se asigna una lista de entradas a una lista de salidas (Figura 9.7).

Figura 9.7 Una función en un lenguaje funcional

Función
entradas salidas
(cuadro negro)
9.3 paradigmas de programación 255

Por ejemplo, suma se puede considerar como una función con norte entradas y una sola salida. La función
toma el norte insumos, los agrega, y crea la suma. UNA Idioma funcional hace lo siguiente:

❑ Predefine un conjunto de funciones primitivas (atómicas) que pueden ser utilizados por cualquier programador.

❑ Permite al programador para combinar funciones primitivas para crear nuevas funciones. Por ejemplo, podemos definir una función

primitiva llamada primero que extrae el primer elemento de una lista. También puede haber una función llamada descanso que los
extractos de todos los elementos excepto el primero. Un programa puede definir una función que extrae el tercer elemento de una lista
mediante la combinación de estas dos funciones como se muestra en la Figura 9.8.

Figura 9.8 La extracción del tercer elemento de una lista

(11, 8, 9, 10, 6) (8, 9, 10, 6)

(7, 11, 8, 9, 10, 6) Descanso Descanso primero 8

Tercero

Un lenguaje funcional tiene dos ventajas sobre un lenguaje de procedimientos: fomenta la programación modular y permite al
programador para hacer nuevas funciones de los ya existentes. Estos dos factores contribuyen a un programador crear
programas propensos a errores grandes y menos a partir de programas de prueba ya.

Algunos lenguajes funcionales


Se discuten brevemente LISP y Scheme como ejemplos de lenguajes funcionales.

CECEO

CECEO (Programación de la lista) fue diseñado por un equipo de investigadores del MIT a principios de 1960. Es un lenguaje de
programación Lista de procesamiento en el que todo se considera una lista.

Esquema

El lenguaje LISP sufría de una falta de estandarización. Después de un tiempo, hubo diferentes versiones de LISP
todas partes ;. El estándar de facto es el desarrollado por el MIT en la década de 1970 llamado Esquema.

El lenguaje Scheme define un conjunto de funciones primitivas que resuelve problemas. El nombre de la función y la lista
de entradas de la función se encierran entre paréntesis. El resultado es una lista de salida, que puede ser utilizado como la
lista de entrada a otra función. Por ejemplo, hay una función, coche, que los extractos de la primera elemento de una lista. Hay
una función, llamada CDR, que extrae el resto de los elementos de una lista, excepto la primera. En otras palabras, tenemos:

(Coche 2 3 7 8 11 17 20) → 2 (CDR 2 3 7 8 11 17 20) →


3 7 8 11 17 20
Lenguajes de programación 256

Ahora podemos combinar estas dos funciones para extraer el tercer elemento de cualquier lista:

(Coche (CDR (CDR lista)))

Si aplicamos la función anterior para (2 3 7 8 11 17 20), extrae 7 porque el resultado de los paréntesis más interior es 3 7
8 11 17 20. Este se convierte en la entrada a los paréntesis, medias, con el resultado 7 8 11 17 20. Esta lista se convierte
ahora en la entrada a la función del coche, que se lleva a cabo el primer elemento, 7.

9.3.4 El paradigma declarativo


UNA paradigma declarativo utiliza el principio de razonamiento lógico para responder a las consultas. Se basa en la lógica
formal definido por los matemáticos griegos y más tarde se convirtió en cálculo de primer orden predicado.

El razonamiento lógico se basa en la deducción. se dan algunas declaraciones (hechos) que se supone que es cierto,
y el lógico utiliza reglas sólidas de razonamiento lógico para deducir nuevas declaraciones (hechos). Por ejemplo, la
famosa regla de deducción lógica es:

Si (A es B) y (B es C), entonces (A es C)

El uso de esta regla y los dos hechos siguientes:

Hecho 1: Sócrates es un ser humano → A es B Hecho 2:


Un ser humano es mortal → B es C

podemos deducir un hecho nuevo:

Hecho 3: Sócrates es mortal → A es C

Los programadores estudian el dominio de su objeto, es decir, conocen todos los hechos de este dominio o conseguir los hechos de
los expertos en la materia. Los programadores también tienen que ser experto en la lógica para definir cuidadosamente las reglas. A
continuación, el programa puede deducir y crear nuevos hechos.

Un problema asociado con lenguajes declarativos es que un programa es específico para un dominio particular, debido a la
recogida de todos los datos en un solo programa hace que sea enorme. Esta es la razón por la programación declarativa se limita
hasta el momento a los campos específicos como la inteligencia artificial. Se discute la lógica en el capítulo 18.

Prólogo
Uno de los famosos lenguajes declarativos es Prólogo (Programación en lógica) , desarrollado por A. Colmerauer en Francia
en 1972. Un programa en Prolog se compone de hechos y reglas. Por ejemplo, los hechos anteriores sobre los seres humanos
pueden expresarse como:

humana (Juan)
mortal (humana)
9.4 Conceptos comunes 257

El usuario puede entonces preguntar:

? -Mortal (Juan)

y el programa responderá con sí.

9.4 CONCEPTOS COMUNES


En esta sección llevamos a cabo una navegación rápida a través de algunos lenguajes de procedimientos para encontrar conceptos
comunes. Algunos de estos conceptos están también disponibles en la mayoría de los lenguajes orientados a objetos, ya que, como
explicamos, un paradigma orientado a objetos utiliza el paradigma procedimental al crear métodos.

9.4.1 Identificadores
Una característica presente en todos los lenguajes de procedimientos, así como en otros idiomas, es la
identifier- es decir, el nombre de los objetos. Identificadores nos permiten nombrar objetos en el programa. Por ejemplo, cada pieza de
datos en un ordenador se almacena en una dirección única. Si no existieran identificadores para representar simbólicamente
ubicaciones de datos, tendríamos que conocer y utilizar las direcciones de datos para manipularlos. En su lugar, simplemente damos
nombres de datos y dejar que el compilador realizar un seguimiento de dónde se encuentren físicamente.

9.4.2 Tipos de datos


UNA tipo de datos define un conjunto de valores y un conjunto de operaciones que se pueden aplicar a esos valores. El conjunto de
valores para cada tipo se conoce como el dominio para el tipo. La mayoría de los lenguajes definen dos categorías de tipos de datos: tipos
simples y tipos compuestos.

tipos de datos simples


UNA tipo simple ( a veces llamado Tipo atómica, tipo fundamental, tipo escalar, o tipo incorporado) es un tipo de datos que no
se pueden dividir en tipos de datos más pequeños. Varios tipos de datos simples se han definido en lenguajes imperativos:

❑ Un entero tipo es un número entero, es decir, un número sin una parte fraccionaria. los
rango de valores que puede tomar un número entero que depende del idioma. Algunos lenguajes soportan varios tamaños enteros.

❑ UNA real tipo es un número con una parte fraccionaria.

❑ UNA personaje Tipo es un símbolo en el conjunto de caracteres subyacente usado por el lenguaje, por

ejemplo, ASCII o Unicode.


❑ UNA Boole tipo es del tipo con sólo dos valores, cierto o falso.

tipos de datos compuestos


UNA tipo compuesto es un conjunto de elementos en la que cada elemento es un tipo simple o un tipo de material compuesto (es decir, una
definición recursiva). La mayoría de los idiomas se definen los siguientes tipos de compuestos:

❑ Un formación es un conjunto de elementos cada uno del mismo tipo.

❑ UNA grabar es un conjunto de elementos en la que el elemento puede ser de diferentes tipos.
Lenguajes de programación 258

9.4.3 Variables
Variables son los nombres de las posiciones de memoria. Como se discutió en el Capítulo 5, cada posición de memoria en un
ordenador tiene una dirección. A pesar de que las direcciones son utilizadas por el equipo interno, es muy incómodo para el
programador utilizar direcciones por dos razones. En primer lugar, el programador no conoce la dirección relativa del elemento de
datos en la memoria. En segundo lugar, un elemento de datos puede ocupar más de una ubicación en la memoria. Nombres, como
sustituto de direcciones, liberar al programador a pensar en el nivel en el que se ejecuta el programa. Un programador puede utilizar
una variable, tal como Puntuación, para almacenar el valor entero de una puntuación recibida en una prueba. Dado que una variable
contiene un elemento de datos, que tiene un tipo.

Las declaraciones de variables


La mayoría de los lenguajes de procedimientos orientados a objetos y requiere que las variables se declararán antes de ser utilizados.
Declaración alerta al equipo que una variable con un nombre y un tipo determinado se utiliza en el programa. El ordenador se reserva el
área de almacenamiento requerida y la nombra. Declaración es parte de la creación del objeto que discutimos en la sección anterior. Por
ejemplo, en C, C + +, y Java podemos declarar tres variables de tipo carácter, número entero, y real como se muestra a continuación:

Char C; int num;

doble resultado;

La primera línea declara una variable C a ser de tipo carácter. El segundo declara una variable num ser de tipo entero.
La tercera línea declara un resultado variable llamada a ser de tipo real.

inicialización de variables
Aunque el valor de los datos almacenados en una variable puede cambiar durante la ejecución del programa, la mayoría de
los lenguajes de procedimientos permiten la inicialización de las variables cuando se declaran. Inicialización almacena un
valor en la variable. A continuación se muestra cómo las variables se pueden declarar e inicializar al mismo tiempo:

Char C = 'Z'; int

num = 123;

doble resultado = 256.782;

9.4.4 Los literales


UNA literal es un valor predeterminado utilizado en un programa. Por ejemplo, si tenemos que calcular el área de un círculo
cuando el valor del radio se almacena en la variable r, podemos utilizar la expresión 3.14 × r 2, en el que el valor aproximado de π
( pi) se utiliza como un literal. En la mayoría de los lenguajes de programación que podemos tener entero, real, carácter y
literales booleanos. En la mayoría de los idiomas, también podemos tener literales de cadena. Para distinguir los caracteres y
literales de cadena a partir de los nombres de las variables y otros objetos, la mayoría de lenguajes requieren que los
caracteres literales estar encerrados entre comillas simples, tales como 'A' y cuerdas para ir entre comillas dobles, como
"Anne".
9.4 Conceptos comunes 259

9.4.5 Constantes
El uso de literales no se considera buena práctica de programación a menos que estemos seguros de que el valor del literal no va a cambiar
con el tiempo (por ejemplo, el valor de π en la geometría). Sin embargo, la mayoría de los literales pueden cambiar el valor con el tiempo. Por
ejemplo, si un impuesto sobre las ventas es del 8 por ciento este año, puede que no sea el mismo año siguiente. Cuando escribimos un
programa para calcular el costo de los artículos, no hay que utilizar el literal en nuestro programa:

costo → precio × 1.08

Por esta razón, la mayoría de los lenguajes de programación definen Las constantes. Una constante, al igual que una variable,
es una ubicación con nombre que puede almacenar un valor, pero el valor no se puede cambiar una vez que se ha definido al
comienzo del programa. Sin embargo, si el año que viene queremos usar el programa de nuevo, podemos cambiar una sola línea
al comienzo del programa, el valor de la constante. Por ejemplo, en una C o C + + programa, la tasa de impuestos puede ser
definido al principio y utilizado durante el programa:

const float taxMultiplier = 1,08;


...
costo = precio * taxMultiplier;

Tenga en cuenta que una constante, al igual que una variable, tiene un tipo que debe definirse cuando la constante es declarado.

9.4.6 Entrada y Salida


Casi todos los programas tiene que leer y / o escribir datos. Estas operaciones pueden ser bastante complejos, especialmente cuando nos
leer y escribir archivos de gran tamaño. La mayoría de los lenguajes de programación utilizan una función predefinida para la entrada y
salida.

Entrada
Los datos son entrada ya sea por una declaración o una función predefinida. El lenguaje C tiene varias funciones de
entrada. Por ejemplo, el scanf función lee los datos desde el teclado, formatea, y lo almacena en una variable. Lo siguiente
es un ejemplo:

scanf ( “% d”, & num);

Cuando el programa encuentra esta instrucción, espera a que el usuario escriba un número entero. A continuación, almacena el
valor de la variable num. El% d indica al programa que esperar un entero decimal.

Salida
Los datos son salida ya sea por una declaración o una función predefinida. El lenguaje C tiene varias funciones de salida.
Por ejemplo, el printf función muestra una cadena en el monitor. El programador puede incluir el valor de una variable o las
variables como parte de la cadena. Los siguientes muestra el valor de una variable en el extremo de una cadena literal:

printf ( “El valor del número es:% d”, num);

https://sanet.st/blogs/polatebooks/
Lenguajes de programación 260

9.4.7 Expresiones
Un expresión es una secuencia de operandos y operadores que se reduce a un solo valor. Por ejemplo, la siguiente
es una expresión con un valor de 13:

2*5+3

Operador
Un operador es una ficha específica del idioma que requiere una acción a tomar. Los operadores más conocidos se
han extraído de las matemáticas. Por ejemplo, multiplicar (*) es un del operador indica que dos números son de
multiplicarse juntos. Cada idioma tiene operadores, y su uso se especifica rigurosamente en la sintaxis, o reglas, de
la lengua.

Operadores aritméticos se utilizan en la mayoría de los idiomas. Tabla 9.3 muestra algunos operadores aritméticos utilizados en C, C + +,
y Java.

Tabla 9.3 Operadores aritméticos

Definición del operador Ejemplo

+ Suma Resta 3 + 2 a 4 mayo


- 
Multiplicación Num * 5 Sum /
*  /  Count Count% 4
División (el resultado es el cociente) División
% (el resultado es el resto)

++ - Incremento (añadir 1 al valor de la variable) Decremento (restar 1 Contar ++


- del valor de la variable) conde--

Operadores relacionales comparar los datos para ver si un valor es mayor que, menor que, o igual a otro valor. El resultado
de aplicar operadores relacionales es un valor booleano (verdadero o falso).
C, C + +, y Java utilizan seis operadores relacionales, como se muestra en la Tabla 9.4:

Tabla 9.4 Operadores relacionales

Definición del operador Ejemplo

<<= Menos de menos de o igual a Num1 <5 Num1 <= 5


Mayor que Mayor o igual a Num2> 3 Num2> = 3
> igual a no igual a Num1 == Num2
>= Num1! = Num2
==!
=

Operadores logicos combinar los valores booleanos (verdadero o falso) para obtener un nuevo valor. El lenguaje C utiliza tres
operadores lógicos, como se muestra en la Tabla 9.5.
9.4 Conceptos comunes 261

Tabla 9.5 Operadores logicos

Ejemplo Definición de Operador

! && Y no ! (Num1 <Num2) (Num1 <5) (Num2>


|| O 10) && (Num1 <5) || (Num2> 10)

operando
Un operando recibe la acción de un operador. Para cualquier operador dado, puede haber uno, dos, o más operandos.
En nuestro ejemplo la aritmética, los operandos de la división son el dividendo y el divisor.

9.4.8 declaraciones
UNA declaración causa una acción a realizar por el programa. Que se traduce directamente en una o más instrucciones
ejecutables por ordenador. Por ejemplo, C, C + +, y Java definir muchos tipos de declaraciones. Se discuten algunos de
estos en esta sección.

Las sentencias de asignación


Un sentencia de asignación asigna un valor a una variable. En otras palabras, se almacena el valor de la variable,
que ya ha sido creada en la sección de declaración. Utilizamos el símbolo
← en nuestro algoritmo para definir la asignación. La mayoría de los lenguajes como (C, C + +, y Java) utiliza el símbolo = para la
asignación. Otros lenguajes como Ada o Pascal usan: = para la asignación.

Las sentencias compuestas


UNA declaración compuesta es una unidad de código que consiste en cero o más declaraciones. También se conoce como una bloquear. Una
sentencia compuesta permite que un grupo de instrucciones a ser tratada como una sola entidad. Una declaración de compuesto consta de
una llave de apertura, una sección de declaración opcional, seguido de una llave de cierre. A continuación se muestra la composición de una
sentencia compuesta:

{
x = 1; y =
20; }

Las sentencias de control


UNA sentencia de control es un programa en un lenguaje procesal que es un conjunto de instrucciones. Las instrucciones se
ejecutan normalmente uno tras otro. Sin embargo, a veces es necesario cambiar este orden secuencial, por ejemplo, para
repetir una declaración o un conjunto de sentencias, o dos conjunto diferente de sentencias que se ejecutarán sobre la base de
un valor booleano. La instrucción proporcionada en los lenguajes de máquina de equipos para este tipo de desviación de
ejecución secuencial es la saltar de instrucciones discutimos brevemente en el capítulo 5. Los lenguajes imperativos temprana
utilizó el ir declaración para simular el saltar instrucción. Aunque el ir declaración se puede encontrar en algunos lenguajes
imperativos hoy, el principio de la programación estructurada desalienta su uso. En lugar de ello, la programación estructurada
recomienda encarecidamente el uso de la
Lenguajes de programación 262

tres constructos de secuencia, selección, y repetición, como hemos comentado en el capítulo 8. Las sentencias de control en lenguajes
imperativos están relacionados con la selección y repetición.

❑ La mayoría de los lenguajes imperativos tienen sentencias de selección de dos vías y de múltiples vías. Dos-

selección manera se consigue a través de la if-else declaración, de múltiples vías a través de la selección interruptor ( o caso)
declaración. El diagrama UML y el código de la if-else declaración se muestra en la Figura 9.9.

Figura 9.9 decisiones de dos vías y de múltiples vías

[C = a]
Declaración 1

[C = b]
declaración 2
[falso] [cierto]

[C = C]
Declaración 3
declaración 2 declaración 1

cambiar ( DO)

3; descanso; {
Si ( condición)
Declaración 2; descanso; Caso C: declaración
Caso A: Declaración 1; descanso; Caso B:
sentencia1

más sentencia2;
};

Código Código

en una if-else declaración, si la condición es verdadera, se ejecuta la declaración 1, mientras que si la condición es falsa,
se ejecuta statement 2. Ambos estados 1 y 2 pueden ser cualquier tipo de declaración, incluyendo una declaración nulo
o una sentencia compuesta. Figura 9.9 muestra también el código para el interruptor ( o caso) declaración El valor de C (a,
b, o c) decidir cuál de declaración 1, declaración 2, o la declaración 3 se ejecuta.

❑ Discutimos la repetición construir en el Capítulo 8. La mayoría de los lenguajes imperativos


definir entre uno y tres declaraciones de bucle que pueden lograr la repetición. C, C + +
y Java definen tres sentencias de bucle, pero todos ellos se puede simular el uso de la mientras
bucle (Figura 9.10).
9.4 Conceptos comunes 263

Figura 9.10 Hay tres tipos de repetición

[I < norte]

declaración i
[cierto]
Declaración

Declaración yo i+1
[cierto]

hacer declaración
mientras ( condición) para ( int i = 0; i < n; i ++)

declaración declaración mientras ( condición);

Código Código Código

La principal constructo repetición en el lenguaje C es la mientras lazo. UNA mientras bucle es una antes de la prueba
bucle: se comprueba el valor de una expresión de la prueba. Si el valor es verdadero, el programa pasa a través de una
iteración del bucle y prueba el valor de nuevo. los mientras bucle se considera un bucle controlado por eventos: el bucle
continúa en la iteración hasta que ocurre un evento que cambia el valor de la expresión de prueba de verdadero a falso.

los para bucle es también un bucle de prueba preliminar. Sin embargo, en contraste con el mientras bucle, es un bucle de
contra-controlada. Un contador se establece en un valor inicial y se incrementa o decrementa en cada iteración. El bucle se
termina cuando el valor del contador coincide con un valor predeterminado.

los do-while bucle es también un bucle controlado por eventos. Sin embargo, en contraste con el mientras
bucle, es un bucle posterior a la prueba. El bucle hace una iteración y prueba el valor de una expresión. Si es falsa, se termina,
si es cierto, lo hace uno más iteración y pruebas de nuevo.

9.4.9 Subprogramas
En el capítulo 8 se demostró que un algoritmo de ordenación por selección puede ser escrito como un programa principal y una subprograma.
Todos los procedimientos que se necesitan para encontrar el elemento más pequeño entre una lista sin ordenar se pueden agrupar en
un subprograma. La idea de subprogramas es crucial en las lenguas de procedimiento y, en menor medida, en los lenguajes orientados
a objetos. Le explicamos que un programa escrito en un lenguaje de procedimientos es un conjunto de procedimientos que
normalmente están predefinidas, tales como suma, multiplicación, y así sucesivamente. Sin embargo, a veces un subconjunto de estos
procedimientos para llevar a cabo una única tarea puede ser recogido y colocado en su propia unidad de programa, un subprograma.
Esto es útil porque el subprograma hace que la programación más estructural: un subprograma para realizar una tarea específica se
puede escribir una vez, pero llamó muchas veces, al igual que los procedimientos predefinidos en el lenguaje de programación.
Lenguajes de programación 264

Subprogramas también facilitar la programación: en el programa de desarrollo incremental el programador puede probar
el programa paso a paso mediante la adición de un subprograma en cada paso. Esto ayuda a detectar errores antes de la
siguiente subprograma está escrito. Figura 9.11 ilustra la idea de un subprograma.

Figura 9.11 El concepto de un subprograma

llamada de un subprograma

subprograma

Programa principal

Las variables locales


En un lenguaje de procedimientos, un subprograma, al igual que el programa principal, puede llamar a los procedimientos predefinidos
para operar con objetos locales. Estos objetos locales o las variables locales se crean cada vez que el subprograma se llama y se
destruye cuando el control vuelve desde el subprograma. Los objetos locales pertenecer a a los subprogramas.

parámetros
Es raro que un subprograma actuar sólo sobre los objetos locales. La mayoría de las veces el programa principal requiere un
subprograma para actuar sobre un objeto o conjunto de objetos creados por el programa principal. En este caso, el uso del
programa y subprograma parámetros. Estos se denominan parámetros reales en el programa principal y parámetros formales en
el subprograma. Un programa normalmente puede pasar parámetros a un subprograma en cualquiera de dos maneras:

❑ Por valor

❑ Por referencia

Estos se describen a continuación.

Paso por valor

En pasar por valor, el programa principal y el subprograma crean dos objetos diferentes (variables). El objeto creado
en el programa pertenece al programa y el objeto creado en el subprograma pertenece al subprograma. Dado que el
territorio es diferente, los objetos correspondientes pueden tener los mismos o diferentes nombres. La comunicación
entre el programa principal y el subprograma es de un solo sentido, desde el programa principal para el
subprograma. El programa principal envía el valor del parámetro actual a ser almacenado en el parámetro formal
correspondiente en el subprograma: no hay comunicación de valor de parámetro desde el subprograma al programa
principal.

ejemplo 9.1
Supongamos que un subprograma se encarga de llevar a cabo la impresión para el programa principal. Cada vez que el
programa principal quiere imprimir un valor, se lo envía al subprograma para ser
9.4 Conceptos comunes 265

impreso. El programa principal tiene su propia variable X, el subprograma tiene su propia variable A. Lo que se envía
desde el programa principal al subprograma es la valor de la variable X. Este valor se almacena en la variable A en el
subprograma y el subprograma luego imprimirlo (Figura 9.12).

Figura 9.12 Un ejemplo de paso por valor

Una copia de 5 se envía

de impresión (A) X: parámetros reales A:


5 5 parámetros formales
X UNA

(X) main () {
imprimir el valor de A {

}
de impresión

subprograma
}

Programa principal

Ejemplo 9.2
En el Ejemplo 9.1, ya que el programa principal sólo envía un valor al subprograma, no se necesita tener una variable para
este fin: el programa principal apenas puede enviar un valor literal al subprograma. En otras palabras, el programa principal
puede llamar al subprograma como impresión (X) o de impresión (5).

ejemplo 9.3
Una analogía de paso por valor en la vida real es cuando un amigo quiere pedir prestado y leer un libro valioso que
anotó. Puesto que el libro es precioso, posiblemente fuera de impresión, se hace una copia del libro y pasarlo a su
amigo. Cualquier daño a la copia, por tanto, no afecta a su libro.

Paso por valor tiene una ventaja: el subprograma recibe solamente un valor. No puede cambiar, ya sea
intencional o accidentalmente, el valor de la variable en el programa principal. Sin embargo, la incapacidad de un
subprograma para cambiar el valor de la variable en el programa principal es una desventaja cuando el programa
realmente necesita el subprograma para hacerlo.

Ejemplo 9.4
Supóngase que el programa principal tiene dos variables X e Y que necesitan intercambiar sus valores. El programa
principal llama a un subprograma llamado intercambiar para hacerlo. Se pasa el valor de X e Y para el subprograma, que
se almacenan en dos variables A y B. El intercambiar subprograma utiliza una variable local T (temporal) y intercambia los
dos valores en A y B, pero los valores originales en X e Y siguen siendo los mismos: no se intercambian. Esto se ilustra
en la Figura 9.13.
Lenguajes de programación 266

Figura 9.13 Un ejemplo en el que paso por valor no funciona

Una copia de 7 se envía

Una copia de 5 se envía

swap (A, B) {
5 7 5 7
X Y UNA segundo T

main () { A 5 7 5
UNA segundo T
swap (X, Y)
UNA segundo 5
77
UNA segundo T

segundo T 7 5 5
}
} UNA segundo T

X e Y: parámetros reales A y B:

parámetros formales T: parámetros

locales (temporales)

Pasar por referencia

Pasar por referencia fue ideada para permitir un subprograma para cambiar el valor de una variable en el programa principal.
En pase por referencia, la variable, que en realidad es una ubicación en la memoria, es compartida por el programa principal y
el subprograma. La misma variable puede tener diferentes nombres en el programa principal y el subprograma, pero ambos
nombres se refieren a la misma variable. Metafóricamente, podemos pensar pase por referencia como una caja con dos
puertas: uno se abre en el programa principal, el otro se abre en el subprograma. El programa principal puede dejar un valor
en este cuadro para el subprograma, el subprograma puede cambiar el valor original y dejar un nuevo valor para el programa
en el mismo.

Ejemplo 9.5
Si utilizamos el mismo intercambiar subprograma ¡pero las variables de pasar por referencia, los dos valores en X e Y son realmente
intercambiados, como en la Figura 9.14 espectáculos.

Figura 9.14 Un ejemplo de pase por referencia

swap (RefA, RefB) {


T
X UNA

() { A
Y segundo
swap (reFX, Refy) main
UNA segundo

segundo T
} }

X e Y: parámetros reales A y B:

parámetros formales T: parámetros

locales (temporales)
9.5 Materiales final del capítulo 267

volviendo valores
Un subprograma puede ser diseñado para devolver un valor o valores. Esta es la forma en que los procedimientos predefinidos están
diseñados. Cuando usamos la expresión C ← A + B, que en realidad llamar a un procedimiento añadir ( A, B) que devuelven un valor que
se almacena en la variable C.

Implementación
El concepto de subprograma se implementa de manera diferente en diferentes idiomas. En C y C + +, el subprograma se
implementa como una función.

9.5 MATERIALES DE FINAL CAPÍTULO

9.5.1 Lectura recomendada


Para más detalles sobre los temas tratados en este capítulo, se recomiendan los siguientes libros:

❑ Cooke, DA Concisa Introducción a los Lenguajes, Pacific Grove, CA: Brooks /


Cole, 2003
❑ Tucker, A. y Noonan, R. Lenguajes de programación: principios y paradigmas, Rebaba
Ridge, IL: McGraw-Hill, 2002
❑ Pratt, T. y Zelkowitz, M. Lenguajes de programación, diseño e implementación,
Englewood Cliffs, NJ: Prentice-Hall, 2001
❑ Sebesta, R. Conceptos de lenguajes de programación, Boston, MA: Addison-Wesley, 2006

9.5.2 Los términos clave

parámetro real 264 Java 254

Ada 251 analizador léxico 247

subprograma 254 Lenguaje de lista de programación (LISP) 255

operador aritmético 260 258 literal

ensamblador 245 variable local 264

lenguaje ensamblador 245 operador lógico 260

instrucción de asignación 261 lenguaje de máquina 244

código de bytes 247 método 253

Lenguaje C ++ 254 multithreading 254

lenguaje C 251 lenguaje orientado a objetos 253

la serie 252 paradigma orientado a objetos 252

generador de código 248 programa objeto 246

Common Language Business-Oriented (COBOL) operando 261


251

compilación 246 operador 260

compilador 246 salida 259

(Continuado)
Lenguajes de programación 268

tipo compuesto 257 parámetro 264

declaración compuesto 261 Pascal 251

lenguaje de programación 244 pasar por referencia 266

259 constante paso por valor 264

sentencia de control 261 polimorfismo 253

tipo de datos 257 paradigma procedimental 248

lenguaje declarativo 256 Programación en lógica (PROLOG) 256

paradigma declarativo 256 lenguaje de programación 244

expresión 260 operador relacional 260

parámetro formal 264 esquema 255

TRANslation fórmula (FORTRAN) 250 analizador semántico 248

lenguaje funcional 255 tipo simple 257

paradigma funcional 254 programa de código 246

lenguaje de alto nivel 255 declaración 261

identificador 257 subprograma 263

lenguaje imperativo 257 lenguaje simbólico 245

paradigma imperativo 248 sintaxis 244

herencia 253 analizador de sintaxis 248

de entrada 259 ficha 247

interpretación 246 Traductor 248

intérprete 246 258 variables

9.5.3 Resumen
❑ Un lenguaje de programación es un conjunto de palabras predefinidas que se combinan en un programa

de acuerdo con reglas predefinidas, la sintaxis del lenguaje. Con los años, los lenguajes de programación han
evolucionado a partir de lenguaje de máquina a lenguajes de alto nivel. El único lenguaje entendido por un ordenador es
el lenguaje de máquina.

❑ Los lenguajes de alto nivel son portátiles en varios equipos diferentes, lo que permite al programador

para concentrarse en la aplicación en lugar de las complejidades de la organización del equipo.

❑ Para ejecutar un programa en un ordenador, el programa debe ser traducido en el


lenguaje de máquina nativo del ordenador. El programa en el lenguaje de alto nivel se llama el programa
fuente. El programa traducido en lenguaje de máquina se denomina programa objeto. Se utilizan dos métodos
para la traducción: Compilacion y interpretación. Un compilador traduce todo el programa de origen en el
programa objeto. Interpretación se refiere al proceso de traducción de cada línea del programa fuente en la
línea de programa objeto correspondiente por línea y ejecutarlas.

❑ El proceso de traducción utiliza un analizador léxico, un analizador de sintaxis, un analizador semántico,

y generador de código, y un analizador léxico para crear una lista de fichas.


9.6 Conjunto de práctica 269

❑ Un paradigma describe una forma en la que un lenguaje de programación se puede utilizar para acercarse a una

problema a resolver. Dividimos los lenguajes de programación en cuatro paradigmas: procesal, orientado a objetos, funcional,
y declarativo. Un paradigma procedimental considera un programa como un agente activo que manipula objetos
pasivos. FORTRAN, COBOL, Pascal, C y Ada son ejemplos de lenguajes de procedimiento. El paradigma orientado a
objetos se ocupa de los objetos activos en lugar de objetos pasivos. C + + y Java son lenguajes orientados a objetos
comunes. En el paradigma funcional, un programa se considera como una función matemática. En este contexto, una
función es un cuadro negro que se asigna una lista de entradas a una lista de salidas. LISP y Scheme son los
lenguajes funcionales comunes. Un paradigma declarativo utiliza el principio de razonamiento lógico para responder a
las consultas. Uno de los lenguajes declarativos más conocidos es PROLOG.

❑ Algunos conceptos comunes en las lenguas de procedimiento y orientados a objetos son identificadores,

tipos de datos, variables, literales, constantes, entradas y salidas, expresiones, y declaraciones.


La mayoría de los lenguajes utilizan dos tipos de sentencias de control: decisión y repetición. programación sub- es un
concepto común entre las lenguas de procedimiento.

9.6 PRÁCTICA SET


9.6.1 Cuestionarios

Un conjunto de pruebas interactivas de este capítulo se puede encontrar en la página web del libro. Se recomienda
encarecidamente que el estudiante toma las pruebas para comprobar su / su comprensión de los materiales antes de continuar
con el juego de práctica.

9.6.2 Examen de preguntas


P9-1. Distinguir entre el lenguaje máquina y lenguaje ensamblador.
Q9-2. Distinguir entre lenguaje ensamblador y un lenguaje de alto nivel.
Q9-3. ¿Qué lenguaje de programación está directamente relacionado y comprendido por un ordenador?

Q9-4. Distinguir entre la compilación e interpretación.


Q9-5. Enumerar cuatro pasos en la traducción lenguaje de programación.

Q9-6. Lista cuatro paradigmas lenguaje de programación común.

Q9-7. Comparar y contrastar un paradigma procedimental con un paradigma orientado a objetos.

Q9-8. Definir una clase y un método en un lenguaje orientado a objetos. ¿Cuál es la relación
entre estos dos conceptos y el concepto de un objeto?
Q9-9. Definir un paradigma funcional.
Q9-10. Definir un paradigma declarativo.

9.6.3 Problemas
P9-1. Declare tres variables de tipo enteros en lenguaje C.
P9-2. Definir tres variables de tipo real en lenguaje C y inicializarlas a tres valores.
P9-3. Declarar tres constantes en C de carácter de tipo, número entero, y real respectivamente.

P9-4. Explicar por qué una constante debe ser inicializado cuando se declara.
Lenguajes de programación 270

P9-5. Encuentra cuántas veces las declaración en el siguiente segmento de código en C se ejecuta:

A=5
mientras ( A <8)

declaración; A =
A + 2;
}

P9-6. Encuentra cuántas veces las declaración en el siguiente segmento de código en C se ejecuta:

A=5
mientras ( A <8)

declaración; A =
A - 2;
}

P9-7. Encuentra cuántas veces las declaración en el siguiente segmento de código en C se ejecuta:

for (int i = 5; i <20, i ++)


{

declaración; i =
i + 1;
}

P9-8. Encuentra cuántas veces las declaración en el siguiente segmento de código en C se ejecuta:

A=5
do {

declaración; A =
A + 1;
} mientras ( A <10);

P9-9. Escribir el código en el problema usando P9-6 do-while lazo.

P9-10. Escribir el código en el problema usando P9-7 do-while lazo.

P9-11. Escribir el código en el problema usando P9-7 mientras lazo.

P9-12. Escribir el código en el problema utilizando un P9-8 para lazo.

P9-13. Escribir el código en el problema utilizando un P9-6 para lazo.

P9-14. Escribir un fragmento de código utilizando una mientras bucle que nunca se ejecuta su cuerpo.

P9-15. Escribir un fragmento de código utilizando una hacer bucle que nunca se ejecuta su cuerpo.

P9-16. Escribir un fragmento de código utilizando una para bucle que nunca se ejecuta su cuerpo.

P9-17. Escribir un fragmento de código utilizando una mientras bucle que nunca se detiene.
9.6 Conjunto de práctica 271

P9-18. Escribir un fragmento de código utilizando una hacer bucle que nunca se detiene.

P9-19. Escribir un fragmento de código utilizando una para bucle que nunca se detiene.

P9-20. En el siguiente código, encontrar todos los valores literales:

C = 12 * A + 4 * (B - 5)

P9-21. En el siguiente código, encontrar las variables y literales:

Hola = “Hola”;

P9-22. Cambiar el siguiente segmento de código para utilizar una cambiar declaración:

Si ( A = = 4)
{

sentencia1;
} Else if ( A == 6)

Declaración 2;
} Else if ( A == 8)

Declaración 3;

} Else {

Declaración 4;
}

P9-23. Si el subprograma calcular (A, B, S, P) acepta el valor de A y B y calcula


la suma S y su producto P, la variable que es lo que pasa por su valor y por referencia cuál?

P9-24. Si el subprograma más pequeño (A, B, S) acepta el valor de A y B y encuentra el


más pequeño de los dos, qué variable es lo que pasa por su valor y por referencia cuál?

P9-25. Si el subprograma cubo (A) acepta el valor de A y calcula su cubo (A 3),


en caso de que pasar a A al subprograma por valor o por referencia?
P9-26. Si el subprograma necesita para obtener un valor para A desde el teclado y devolverlo a
el programa principal, en caso de que pasar a A al subprograma por valor o por referencia?

P9-27. Si el subprograma tiene que mostrar el valor de A en el monitor, en caso de que pase
A al subprograma por valor o por referencia?
CAPÍTULO 10
Ingeniería de software

En este capítulo se introduce el concepto de ingeniería de software. Comenzamos con la idea del ciclo de vida del software. A
continuación, muestran dos modelos utilizados para el proceso de desarrollo: la
cascada modelo y el incrementales modelo. Un breve análisis de cuatro fases en el proceso de desarrollo
sigue.

objetivos
Después de estudiar este capítulo, el estudiante debe ser capaz de:

❑ Entender el concepto del ciclo de vida del software en la ingeniería de software.

❑ Describe dos tipos principales de proceso de desarrollo, la cascada e incremental


modelos.

❑ Entender la fase de análisis y describir dos enfoques distintos en el análisis


fase: análisis orientado al procedimiento y análisis orientado a objetos.

❑ Entender la fase de diseño y describir dos enfoques diferentes en el diseño


fase: diseño orientado al procedimiento y el diseño orientado a objetos.

❑ Describir la fase de implementación y reconocer los problemas de calidad en esta fase.

❑ Describir la fase de prueba y distinguir entre las pruebas de caja de vidrio y negro-box
pruebas.

❑ Reconocer la importancia de la documentación en ingeniería de software y distinguir


entre la documentación del usuario, documentación del sistema y documentación técnica. La ingeniería de software
es la creación y el uso de métodos de ingeniería de sonido y principios para obtener software fiable. Esta
definición, tomada de la primera conferencia internacional sobre ingeniería de software en 1969, se propuso 30
años después de la primera computadora fue construida.
Ingeniería de Software 274

10.1 EL CICLO DE VIDA DEL SOFTWARE


Un concepto fundamental en Ingeniería de software es el ciclo de vida del software. Software, como muchos otros
productos, pasa por un ciclo de repetición de fases (Figura 10.1).

Figura 10.1 El ciclo de vida del software

comienzo

Desarrollo

Utilizar Modificación
[cierto]

[falso]

Software aún no
Detener obsoleto?

El software se desarrolla por primera vez por un grupo de desarrolladores. Por lo general, está en uso durante un tiempo antes es
necesario realizar modificaciones. La modificación es a menudo necesaria debido a los errores encontrados en el software, los cambios
en las normas o leyes que regulan su diseño, o cambios en la propia empresa. Por ello, el software debe ser modificado antes de su uso
posterior. Estos dos pasos, utilizar y
modificar, continuará hasta que el software se vuelve obsoleta. Por 'obsoletos', nos referimos a que el software pierde su validez
debido a la ineficiencia, la obsolescencia de la lengua, los principales cambios en las necesidades del usuario, o de otros
factores.

10.1.1 modelos de procesos de desarrollo


Aunque la ingeniería de software involucra a los tres procesos en la figura 10.1, en este capítulo que sólo la
discutimos proceso de desarrollo, los cuales se muestra fuera del ciclo en la figura 10.1. El proceso de
desarrollo en el ciclo de vida del software implica cuatro fases: análisis, diseño, implementación y prueba.
Existen varios modelos para el proceso de desarrollo. Se discuten los dos más comunes aquí: el modelo de
cascada y el modelo incremental.

El modelo de cascada
Un modelo muy popular para el proceso de desarrollo de software se conoce como el modelo de cascada ( Figura
10.2). En este modelo, el proceso de desarrollo fluye en una sola dirección. Esto significa que una fase no puede
iniciarse hasta que se complete la fase anterior.
10.1 El ciclo de vida del software 275

Figura 10.2 El modelo de cascada

Análisis

Diseño

Implementación

Pruebas

Por ejemplo, la fase de análisis de todo el proyecto debe completarse antes de que se inicie la fase de diseño. La
fase de diseño entero debería estar terminado antes de la fase de implementación se puede iniciar.

Hay ventajas y desventajas en el modelo de cascada. Una ventaja es que cada fase se completa antes de
que comience la siguiente fase. El grupo que trabaja en la fase de diseño, por ejemplo, sabe exactamente qué
hacer porque no tienen los resultados completos de la fase de análisis. La fase de prueba puede probar todo el
sistema, ya que todo el sistema en fase de desarrollo está listo. Sin embargo, una desventaja del modelo de
cascada es la dificultad en la localización de un problema: si hay un problema en parte del proceso, todo el
proceso debe ser comprobado.

El modelo incremental
En el modelo incremental, el software se desarrolla en una serie de pasos. Los desarrolladores de primera completan
una versión simplificada de todo el sistema. Esta versión representa todo el sistema, pero no incluye los detalles. La
figura 10.3 muestra el concepto modelo incremental.
En la segunda versión, se añaden más detalles, mientras que algunos se dejaron sin terminar, y el sistema se
prueba de nuevo. Si hay un problema, los desarrolladores saben que el problema es con la nueva funcionalidad. No
añaden más funciones hasta que el sistema actual funciona correctamente. Este proceso continúa hasta que toda la
funcionalidad requerida ha sido añadido.

Figura 10.3 El modelo incremental

funcionalidad

A: Análisis Fase D: Diseño Fase


I: Fase de prueba: Fase de
Implementación T Incremento norte

UNA
re

yo
Valor mínimo de 2 T
UNA
re
Incremento 1 yo
UNA T
re
yo
T
Hora
Ingeniería de Software 276

FASE 10.2 ANÁLISIS


El proceso de desarrollo comienza con la fase de análisis. Esta fase da como resultado un documento de
especificación que shows qué el software hará sin especificar cómo sera hecho. La fase de análisis se puede utilizar
dos enfoques distintos, dependiendo de si la fase de implementación se realiza utilizando un lenguaje de
programación procesal o un lenguaje orientada a objetos. Se discuten brevemente tanto en esta sección.

10.2.1 análisis orientado Procedimiento-


análisis orientado Procedimiento- -también llamado análisis estructurado o análisis- clásica es el proceso de análisis utilizado si la
fase de implementación del sistema utilizará un lenguaje de procedimientos. La especificación en este caso puede utilizar varias
herramientas de modelado, pero hablar sólo unos pocos de ellos aquí.

diagramas de flujo de datos


diagramas de flujo de datos mostrar el movimiento de los datos en el sistema. Ellos usan cuatro símbolos: una caja
cuadrada muestra la fuente o destino de los datos, un rectángulo con esquinas redondeadas muestra el proceso (la acción a
realizar sobre los datos), un rectángulo abierto muestra donde se almacenan los datos, y las flechas muestran la flujo de
datos.
La figura 10.4 muestra una versión simplificada de un sistema de reservas en un pequeño hotel que acepta
reservas de huéspedes potenciales a través de Internet y confirma o rechaza la reserva sobre la base de las vacantes
disponibles.

Figura 10.4 Un ejemplo de un diagrama de flujo de datos

Leyenda

Proceso
almacenamiento
destino de
Datos de origen o de Flujo de datos

Solicitud
cliente reserva Generar Reporte diario Recepción
potencial mango lista escritorio
Respuesta
Las
habitaciones reservadas

disponibles Lista de
habitaciones
habitaciones
registro reservado

Uno de los procesos en este diagrama (reserva mango) comprueba la disponibilidad mediante el archivo de
reserva y acepta o rechaza una reserva. Si la reserva es aceptada, se registra en el archivo de reserva.

diagramas entidad-relación
Otra herramienta de modelado utilizado durante la fase de análisis es la relación diagrama de entidad.
Desde este diagrama también se utiliza en el diseño de la base de datos, lo discutimos en el capítulo 14.
10.2 fase de análisis 277

diagramas de estado
(diagramas de estado véase el Apéndice B) proporcionan otra herramienta útil que se utiliza normalmente cuando el estado
de la entidad en el sistema cambiará en respuesta a eventos. Como un ejemplo de un diagrama de estado, se muestra el
funcionamiento de un ascensor de un pasajero. Cuando se oprime un botón del piso, el ascensor se mueve en el sentido
solicitado. No responde a ninguna otra solicitud hasta que llegue a su destino.

La figura 10.5 muestra un diagrama de estado para este ascensor de estilo antiguo. El ascensor puede estar en uno de tres
estados: Movimiento hacia abajo, o estacionado. Cada uno de estos estados se representa por un rectángulo redondeado en el
diagrama de estado. Cuando el ascensor se encuentra en estado estacionado, se acepta una solicitud. Si el piso solicitado es el
mismo que el piso actual, se ignora la solicitud, el ascensor permanece en el estado estacionado. Si el piso solicitado está por encima
del suelo actual, el ascensor comienza a moverse hacia arriba. Si el piso solicitado es menor que el piso solicitado, el ascensor
comienza a moverse hacia abajo. Una vez en movimiento, el ascensor se mantiene en un estado de movimiento hasta que alcanza el
suelo solicitada.

Figura 10.5 Un ejemplo de un diagrama de estado

RF: Solicitado solado CF:

actual solado

[RF> CF] [RF <CF]


Subiendo Descendiendo

Alcanzado el Alcanzado el
solado solado
[RF = CF] Una solicitud

estacionados

encendido Apagado

10.2.2 análisis orientado a objetos


análisis orientado a objetos es el proceso de análisis utilizado si la aplicación utiliza un lenguaje orientado a objetos. El
documento de especificación en este caso puede utilizar varias herramientas, pero hablar sólo unos pocos de ellos aquí.

diagramas de casos de uso


UNA use el diagrama del caso da vista del usuario de un sistema: muestra cómo el usuario se comunica con el sistema. Un
diagrama de casos de uso utiliza cuatro componentes: sistema, casos de uso, actores, y las relaciones. Un sistema, que se
muestra mediante un rectángulo, realiza una función. Las acciones en el sistema se muestran por casos de uso, que se indican
mediante rectángulos redondeados. Un actor es alguien o algo que utiliza el sistema. A pesar de que los actores están
representados por figuras de palo, que no necesariamente representan los seres humanos.

La figura 10.6 muestra el diagrama de casos de uso para el ascensor de estilo antiguo para que dimos un diagrama de
estado en la figura 10.5. El sistema de esta figura es el ascensor. El único actor es
Ingeniería de Software 278

el usuario del ascensor. Hay dos usos casos: Al pulsar el botón del ascensor (en el pasillo de cada planta) y
pulsando el botón del piso dentro del ascensor. El ascensor tiene un solo botón en cada piso que da la señal al
ascensor para moverse a ese piso.

Figura 10.6 Un ejemplo de un diagrama de casos de uso

Ascensor

Presione un botón
del ascensor

Usuario

Pulse una
buttotn solado

Los diagramas de clases


El siguiente paso en el análisis es crear una diagrama de clase para el sistema. Por ejemplo, podemos crear un diagrama de clases
para nuestro ascensor de estilo antiguo. Para ello, tenemos que pensar en las entidades que participan en el sistema. En el sistema
de ascensor que tenemos dos clases de entidades: los botones y el propio ascensor. A primera vista, por lo tanto, parece que si
tenemos dos clases: una clase de botón y una clase de ascensor. Sin embargo, tenemos dos tipos de botones: los botones de los
ascensores en los pasillos y los botones de las plantas en el interior del ascensor. Parece entonces que podemos tener una clase de
botón y dos clases que heredan de la clase de botón: una clase de botón del ascensor y una clase de botón del piso. Por
consiguiente, el diagrama de primera clase que podemos crear para el problema del ascensor es el que se muestra en la figura 10.7.

Figura 10.7 Un ejemplo de un diagrama de clases

Botón

El botón del botón del


elevador piso
* *
tiene un tiene un
11

Ascensor

Tenga en cuenta que la clase botón del ascensor y la clase botón del piso son subclases de la clase de botón. Sin embargo,
la relación entre la clase ascensor y las dos clases de botón (botón del ascensor y el botón de planta) es una relación de uno
a muchos (véase el Apéndice B). El diagrama de clases para el sistema de ascensor puede por supuesto ser extendido, pero
dejar esto a libros sobre ingeniería de software.
10.3 Fase de Diseño 279

gráfico de Estado
Después de que el diagrama de clases es finalizado, una gráfico de estado se pueden preparar para cada clase en el diagrama de clases. Un
diagrama de estado en el análisis orientado a objetos juega el mismo papel que el diagrama de estado en el análisis orientado al procedimiento.

Esto significa que para el diagrama de clases de la figura 10.7, tenemos que tener un gráfico de cuatro estados.

FASE DE DISEÑO 10.3


los fase de diseño define cómo el sistema va a lograr qué se definió en la fase de análisis. En la fase de diseño,
se definen todos los componentes del sistema.

10.3.1 diseño orientado Procedimiento-


En diseño de procedimientos orientados tenemos ambos procedimientos y datos para el diseño. Discutimos una categoría de métodos
de diseño que se concentran en los procedimientos. En el diseño orientado al procedimiento, todo el sistema se divide en un conjunto de
procedimiento o módulos.

los diagramas de estructura


Una herramienta común para ilustrar las relaciones entre módulos en el diseño orientado al procedimiento es una diagrama de estructura. Por
ejemplo, el sistema de ascensor, cuyo diagrama de estados se muestra en la figura 10.5 puede ser diseñado como un conjunto de módulos
que se muestran en el diagrama de estructura en la figura 10.8. los diagramas de estructura se discuten en el Apéndice D.

Figura 10.8 Un diagrama de estructura

Ascensor

Encender Movimiento Apagar

Ascender Mover
hacia abajo

Modularidad
Modularidad significa romper un gran proyecto en partes más pequeñas que se pueden entender y manejar fácilmente. En otras
palabras, la modularidad significa dividir una tarea de gran tamaño en pequeñas tareas que se pueden comunicar entre sí. El
diagrama de estructura discutido en la sección anterior muestra la modularidad en el sistema de ascensor. Hay dos principales
preocupaciones cuando un sistema se divide en módulos: acoplamiento y cohesión.
Ingeniería de Software 280

Acoplamiento

Acoplamiento es una medida de la fuerza con dos módulos están unidos entre sí. Cuanto más fuertemente acoplado, al menos
independientes que son. Dado que el objetivo es hacer que los módulos lo más independiente posible, queremos que sean
débilmente acoplados. Existen al menos tres razones por las que la articulación flexible es deseable.

❑ Sin apretar módulos acoplados son más propensos a ser reutilizable.

❑ Sin apretar módulos acoplados son menos propensos a crear errores en los módulos relacionados.

❑ Cuando el sistema tiene que ser modificado, módulos de acoplamiento flexible nos permiten modificar

sólo los módulos que necesitan ser cambiados sin afectar a los módulos que no necesitan cambiar.

El acoplamiento entre módulos en un sistema de software debe ser minimizado.

Cohesión

Otra cuestión en la modularidad es la cohesión. Cohesión es una medida de cómo de cerca los módulos en un sistema
están relacionados. Tenemos que tener la máxima cohesión posible entre módulos en un sistema de software.

Cohesión entre módulos en un sistema de software debe ser maximizada.

10.3.2 diseño orientado a objetos


En diseño orientado a objetos, la fase de diseño continúa elaborando los detalles de las clases. Como mencionamos en el
capítulo 9, una clase se hace de un conjunto de variables (atributos) y un conjunto de métodos (funciones). El diseño orientado a
objetos se enumeran los detalles de estos atributos y métodos. La figura 10.9 muestra un ejemplo de los detalles de nuestras
cuatro clases que se utilizan en el diseño del ascensor de estilo antiguo.

Figura 10.9 Un ejemplo de las clases con atributos y métodos

Botón botón del piso El botón del elevador Ascensor

Estado: (encendido,

apagado) Turnon desvío Prender Prender moveUp


apagar apagar moveDown

FASE DE EJECUCIÓN 10.4


En el modelo de cascada, una vez finalizada la fase de diseño, la fase de implementación puede empezar. En esta fase, los
programadores escriben el código de los módulos en el diseño orientado al procedimiento, o escriba las unidades de programa
para implementar clases de diseño orientado a objetos. Hay varias cuestiones a mencionar en cada caso.

You might also like