Professional Documents
Culture Documents
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.
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.
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.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.
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?
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-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?
Q6-18. ¿Cuál es la posición de los medios de transmisión en el conjunto de protocolos TCP / IP?
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?
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?
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
P6-6. Que coincida con el siguiente para una o más capas del conjunto de protocolos TCP / IP:
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?
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 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.
Sistema
informático
Hardware Software
sistema operativo
❑ 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.
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.
ROM
1
programa de arranque
2 Sistema 3
Hardware UPC
operativo
Disco
7.2 EVOLUCIÓN
Los sistemas operativos han pasado por una larga historia de la evolución, que resumimos a continuación.
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
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.
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.
Sistema
operativo
Interfaz de
usuario
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).
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:
❑ 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.
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.
multiprogramación
Nonswapping intercambiando
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).
Memoria Memoria
Sistema Sistema
operativo operativo
programa 1 programa 1
UPC
UPC
programa 2 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).
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 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
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.
Un programa de
Sistema
Programa principal operativo
subprograma B
subprograma El segmento 1
programa B Vacío
subprograma
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.
Sistema operativo
Memoria física
Memoria virtual
Disco
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
Trabajo Proceso
Sostener Terminado
Listo Corriendo
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:
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.
planificador de tareas
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.
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).
Trabajo
Proceso
Cola de trabajos cola de listos UPC
comienzo a la memoria
Para ejecutarse Hecho
Necesidades I OI / O
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).
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.
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.
Estancamiento no siempre ocurre. Hay cuatro condiciones necesarias para interbloqueo como se muestra abajo:
❑ retención de recursos. Un proceso mantiene un recurso a pesar de que no se puede utilizar hasta otra
❑ 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.
UNA UNA
ha ha ha ha
solicitado solicitado solicitado 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
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.
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.
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
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.
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.
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.
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.
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.
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
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).
❑ Silberschatz, Galvin y A., P. Conceptos del sistema operativo, Nueva York: Wiley, 2004
(Continuado)
208 Sistemas operativos
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.
❑ 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 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.
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?
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-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:
❑ Describir los diagramas UML y cómo pueden ser utilizados al representar algoritmos.
8.1 CONCEPTO
En esta sección definimos un informalmente algoritmo y trabajar sobre el concepto con un ejemplo.
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).
Datos de entrada
Algoritmo
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
Paso 1
Paso 2
Paso 3
Etapa 4
Paso 5
FindLargest
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.
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).
( 12 8 13 9 11 ) Datos de entrada
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
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.
( 12 8 13 9 11 ) Datos de entrada
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).
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
hacer la acción norte hacer otra serie de acciones hacer una serie de acciones
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.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.
[falso] [cierto]
acción 1
acción 2
TrueAction 1
Acción norte
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
si (condición)
TrueAction (s)
acción 1
else {
acción 2
{}
{
falseAction (s) Comportamiento)
acción norte
} } While (condició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).
Enviar : Ninguna
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
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).
Enviar : Ninguna
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).
Enviar : Ninguna
más grande ← - ∞
{
corriente ← siguiente entero
Si ( corriente > 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
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
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.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).
suma 0
[falso]
siguiente entero
Devuelto: suma
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
producto 1
[falso]
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.
pequeñísimo +
8
[falso]
[cierto]
Condición: más enteros para
procesar
[falso] [cierto]
Condición: Corriente
<menor
pequeñísimo curent
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.
pared
Cambie el más pequeño entre k º a norte º
con los números k número º
1 j k norte
Figura 8.13 traza un conjunto de seis números enteros a medida que ordenarlos.
78 45 23 8 32 56 8 78 45 23 32 56 8 23 45 78 32 56
Ordenado
Intercambiar Intercambiar
8 23 32 78 45 56 8 23 32 45 78 56 8 23 32 45 56 78
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.
Teniendo en cuenta:
lista de números enteros
[falso]
[cierto]
Condición: más pasos a
seguir
Mover la pared un
elemento a la izquierda
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.
pared
Burbujear
1 j k norte
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.
78 45 23 8 32 56 8 23 78 45 32 56 8 23 32 78 45 56
Ordenado
8 23 32 45 78 56 8 23 32 45 56 78 8 23 32 45 56 78
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
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)
1 j k norte
pared
23 78 45 8 32 56 23 78 45 8 32 56 23 45 78 8 32 56
Ordenado Ordenado
8 23 45 78 32 56 8 23 32 45 78 56 8 23 32 45 56 78
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.
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
❑ 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
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
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.
comienzo
Inicio
lista
pequeñísimo -
8
Llamar algoritmo
corriente número siguiente
FindSmallest, pasando
lista sin ordenar
más pequeña: Lista sin ordenar
pequeñísimo corriente
parada
Detener
algoritmo FindSmallest
algoritmo SelectionSort
234 algoritmos
❑ Un subalgoritmo puede ser llamado muchas veces en diferentes partes del algoritmo principal
sin ser reescrito.
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.
1 Si n = 0
factorial ( n) =
n (n - 1) ( norte - 2) 3 2 1 Si norte > 0
+
+
+
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.
+
+
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.
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.
Enviar : Ninguna
Regreso : ¡norte!
Si ( n = 0)
regreso 1
más
regreso norte × factorial ( norte - 1)
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-
❑ 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
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.
Q8-6. ¿Cuáles son los tres algoritmos de ordenación básicos discutidos en este capítulo?
Q8-8. ¿Cuáles son los dos algoritmos de búsqueda básicos discutidos en este capítulo?
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
si y = 0 en otro
mcd ( X , y) = x
mcd ( y , X mod y) caso
Si k = 0 o n = k
C ( norte , k ) = 1
0 Si n = 0
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-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:
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.
Tabla 9.1 Código en lenguaje de máquina para agregar dos números enteros
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).
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.
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
DETENER Detener
Un programa especial llamado ensamblador se utiliza para traducir el código en lenguaje ensamblador a lenguaje de máquina.
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).
*/
# incluir <iostream> using
namespace std; int main () {
// declaraciones locales
} // 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.
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.
Lenguaje de ordenador
paradigmas
Orientado a
Procesal Funcional Declarativo
objetos
CPascal Ada
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.
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.
Creación de objetos
(declaración)
Un conjunto de códigos
para cada procedimiento
Un programa procedimental
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:
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:
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
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 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
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
cabecera de la clase
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.
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.
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.
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.
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:
Ahora podemos combinar estas dos funciones para extraer el tercer elemento de cualquier 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.
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)
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
? -Mortal (Juan)
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.
❑ 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 personaje Tipo es un símbolo en el conjunto de caracteres subyacente usado por el lenguaje, por
❑ 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.
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:
num = 123;
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:
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:
Tenga en cuenta que una constante, al igual que una variable, tiene un tipo que debe definirse cuando la constante es declarado.
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:
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:
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.
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:
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
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.
{
x = 1; y =
20; }
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.
[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.
[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 ++)
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.
llamada de un subprograma
subprograma
Programa principal
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
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).
(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
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:
locales (temporales)
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.
() { A
Y segundo
swap (reFX, Refy) main
UNA segundo
segundo T
} }
X e Y: parámetros reales A y B:
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.
(Continuado)
Lenguajes de programación 268
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
❑ 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,
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.
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:
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-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.
C = 12 * A + 4 * (B - 5)
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-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:
❑ Describir la fase de prueba y distinguir entre las pruebas de caja de vidrio y negro-box
pruebas.
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.
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
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.
funcionalidad
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
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.
actual solado
Alcanzado el Alcanzado el
solado solado
[RF = CF] Una solicitud
estacionados
encendido Apagado
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.
Ascensor
Presione un botón
del ascensor
Usuario
Pulse una
buttotn solado
Botón
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.
Ascensor
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 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.
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.
Estado: (encendido,