Nothing Special   »   [go: up one dir, main page]

Introducción A La Programación Sistemática

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 230

PROGRAMACIÓN

SISTEMÁTICA
Una Introducción

NIKLAUS WIRTH
Eid,genossische Technische Hochschule Zürich,
Suiza

PRENTICE-SALA, Inc.
ENGLEWOOD ACANTILADOS, NEW JERSEY
Biblioteca de Catalogación de Congreso en Publica/Dato de ión

W1RTH, NIKLAUS

Programación sistemática

(Prentice•Serie de sala en computación automática)


l. Ordenadores digitales electrónicos-Programando
l. Título
QA76.6.W5713 001.6º42 73-567824 º
ISBN 0-13-880369-2

© 1973
Por PRENTICE-SALA, Inc.
Englewood Acantilados, New Jersey.

Ali derechos reserv ó. Ningún par/ de este


libro puede ser reproducido en cualquier
forma o por cualquier medio sin permiso en
escribir del editor.

20 l 9 18 17 16 15 14 l 3 12 ll

Imprimido en los Estados Unidos de América

PRENTICE-La SALA INTERNACIONAL, Inc., Londres PRENTICE-SALA


DE AUSTRALIA, PTY., LTD., Sydney PRENTICE-SALA DE CANADÁ,
LTD., Toronto
PRENTICE-SALA DE INDIA PRIVADA LIMITADO, Nueva Delhi
PRENTICE-SALA DE JAPÓN, Inc., Tokyo
Dedicado a la memoria de George
E. Forsythe
CONTENIDOS

Prefacio Xl

1. Introducción
2
2. Ideas fundamentales
8
3. La estructura de ordenadores. 12
4. Programando ayudas y sistemas.
5. Sorne Programas sencillos 26
6. Finiteness De programas. 29
7. Lenguajes de programación y notación 44
secuenciales. 58
8. Tipos de dato 68
9. Los programas basaron en recurrence 80
relaciones 1O. La estructura de dato del 92
archivo 103
l l. La estructura de dato de la variedad 110
12. Subrutinas, procedimientos, y funciones. 125
13. Transformaciones de representaciones de número
14. Procesamiento del texto que utiliza variedad y 155
estructuras de archivo 163
15. Stepwise Desarrollo de programa
165
Un ppendices 169
A. El PASCAL de lenguaje de programación
B. El ASCII código de carácter

Índice Subject
Índice de programas de muestra
"Atl ...Sistemas nuevos ofnotation es tal que uno puede cumplir nada por medios
ofthem cuál no también ser cumplido sin ellos; pero la ventaja es que cuándo tal
sistema de notación corresponde al innermost esencia de frecuentemente ocurriendo
necesidades, uno puede solucionar los problemas que pertenecen en aquella categoría,
de hecho puede mechanically solucionarles en casos tan complicados que sin tal una
ayuda incluso el genio deviene impotente. Por ello es con la invención ofcalculating
por letras en general; por ello sea con el cálculo diferencial *

"lt Es el carácter de matemática moderna que a través de nuestra lengua de


señales y nomenclatura, poseemos una palanca por qué la mayoría de complicó los
argumentos pueden ser reducidos a un mecanismo particular. La ciencia ha así
obtuvo un casi infinito richness, belleza, y solidez. Pero, en el día-a-uso de día de este
también1, la ciencia ha perdido casi tanto como lo ha obtenido. Qué a menudo es
que la palanca aplicó sólo mechanically, a pesar de que la autorización para él
generalmente implica seguro tácito
Hipótesis. Reclamo que en cada uso ofa sistema de notación y en cada uso de un
concepto particular, cada usuario ser consciente de las condiciones originales y
nunca re- gard como su propiedad cualquier pmdocts de el mecanismo allende su
autorización clara."

* De theletters ofC. F. Gauss a Schumacher ofMay 15, 1843 y septiembre 1, 1850.


PREFACIO

Mi motivación primaria es para introducir programando como el arte o


tecnología­ nique de construir y formulando algoritmos en una manera
sistemática, reconociendo que es una disciplina en su derecho propio.
Algoritmos, en el sentido más general, es recetas para clases de los datos que
procesan y procesos de control. Tienen que ser concebidos como las
estructuras sólidas que constan de lógicamente, reliably, y suitably diseñó
construir bloques.
El estudiante tendría que ser educado para proceder concertadamente y
sistema­ atically en el diseño de algoritmos a través de la manifestación de
problemas y técnicas que es propio de programar pero independiente de el
área de aplicación. Por esta razón, ninguna área concreta de aplicación es
empha­ sized como un fin en él; los ejercicios y los ejemplos han sido
seleccionados como manifestaciones de generalmente métodos y problemas
válidos de solución. En el mismo espíritu, la notación o el lenguaje de
programación es deemphasized; la lengua es nuestro demasiado! Pero no
un fin en él. El objetivo primario de programar­ ming los cursos no tendrían
que ser para enseñar perfección en el conocimiento y uso de ali características
e idiosincrasias de una lengua concreta. Bastante, la lengua tiene que espejo
los conceptos fundamentales y más importantes de algoritmos en un
obvios, naturales, y fácilmente understandable manera. También tenga que
tener en cuenta las propiedades inherentes y limitaciones de ordenadores
digitales.
Con respeto previsto a el problema de fiabilidad de programa,
también he probado para incorporar las ideas básicas y técnicas de
verificación de programa. Después de que ali, el objetivo en programar es
para formular clases enteras de procesos computacionales como algoritmos.
Un diseñador concienzudo, aun así, tiene que ser capaz de demostrar que bis
el producto actúa según sus especificaciones bajo ali circunstancias
posibles. Pero el generalmente utilizó métodos de testaje de programa
(depuración) investiga sólo computaciones individuales y no la clase entera
de computaciones que puede ser actuado por el programa
xi
XÍÍ PREFACIO

Debajo "escrutinio." Para hacer generalmente aserciones válidas sobre el


programa él, una técnica de verificación analítica es indispensable.
El tratamiento de métodos de verificación elemental necessitates una
capacidad para abstracción en la parte del estudiantil a un grado un poco
más alto que es habitual en programar cursos. Sorne Reservas sobre la
cordura de incluir este tema en un elemental textbook por tanto ha sido
hecho. Pero he venido a la condena firme que los conceptos básicos
trataron en este libro-una restricción a las ideas de aserciones e
invariantes-es de tal importancia fundamental que pertenecen en ninguna
otra parte de un curríc­ ulum otro que en su muy principio. Yo también
oppose el argumento que este tema tendría que ser reservado para el más
teóricamente importado-programar reli­ la capacidad es importante en
práctica, no en teoría. Los conceptos de verificación de programa son de
hecho el cornerstone para cualquier más profundos entendiendo de los
algoritmos sin qué el programador tendrían no otro demasiado! Además su
intuición insuficiente propia.
Este texto es tailored a las personas quiénes ven un curso en la
construcción sistemática de algoritmos cuando parte de su formación
matemática básica más que a quienes desean ser capaces a
ocasionalmente codificar un problema y entonces entregarlo a su
ordenador para una solución de instante.
El lenguaje de programación ALGOL 60 es la base para la notación em­
ployed durante este textbook. Pero no he utilizado una adopción literal de
ALGOL 60 porque hoy en día el ordenador-y con él programando­ tiene
una mucha área más ancha de aplicación que hace 12 años, y un introduc­
tion a la programación no tendría que ser exclusivamente orientado a una
área de aplicación. ALGOL 60 estuvo diseñado principalmente para
matemática numérica. Consiguientemente, deja la formulación de
programas para otras áreas de aplicación, donde estructuración diferente
principies puede ser más apropiado y donde otros conceptos domínate, a
menudo sólo por torcer y misusing la lengua. Pero el uso de herramientas
para propósitos f6r cuál ellos wern no en­ tendidos siempre tendría que ser
evitado en enseñar y tener que ciertamente no ser alabado como un valor
de ejemplo que imita.
Mi deseo fuerte de enseñar que utiliza una notación en qué estructuras
de pro­ cesses y el dato emerge claramente y sistemáticamente restos en la
observación que la mayoría de personas enganchan para siempre a la
lengua que primero aprendieron. Esta tendencia es prevista no sólo a el
oft-inercia citada de la mente humana pero también a el hecho que la
primera "" lengua representa un marco conveniente a través de qué
pensamiento abstracto puede obtener forma concreta. Con la primera
lengua, uno no sólo adquiere un vocabulario y un conjunto de reglas
gramaticales, pero uno también abre las puertas a un reino nuevo de pensó.
La elección de esta lengua por tanto tendría que ser hecha judiciously. lt
Es una lástima que el más ordenador utilizado ampliamente las lenguas
conocen los requisitos de lógicos y sistemáticos enseñando tan mal.
PREFACIO xjjj

El prerequisites para este curso es matemática elemental . En particu- lar, el


estudiante está esperado para ser familiar con los elementos de lógica
proposicional y la idea de inducción matemática. La familiaridad con cálculo
es difícilmente necesario---excepto sorne ejemplos y ejercita que podría ser
skipped.
lt Es importante que el estudiantil activamente comprometer en la solución
de los ejercicios. La programación es esencialmente un constructivo y
synthesizing dis- cipline, donde la perfección nunca va a ser conseguida por
mero contempla- tion. Mi preferencia líes en problemas sencillos---unos aquello
es claramente formu- lated sin un overspecification de detalles. El propósito y la
forma deseada del resultado tendría que ser evidente sin el uso de intrincado
mathe- matical formalismos. Los ejercicios tienen que !et El estudiantil devenido
familiar con la aplicación de los conceptos y las técnicas habladas; no le tendrían
que afrontar con un rompecabezas ingenioso cuya solución requiere mucho
tiempo y experiencia. Los ejercicios al final de cada capítulo sirve tan ejemplos
y puede ser diverso y aumentado en muchas maneras.
El éxito de un curso de programación depende en gran medida en la
organización del centro de computación disponible. Si seguro mínima!
Requiere- ments no es conocido, el curso puede fácilmente resultado en
decepción y frustra- tion. Primero, una facilidad de ordenador tendría que ser
disponible aquello es capaz de regresar- ing trabajos cortos en tiempo a escaso.
Los trabajos que ocupan un procesador para único un par de segundos y
produciendo sólo unas cuantas líneas de docena de la producción nunca tendría
que tomar más larga que un trimestre de una hora para ser regresada.
Segundamente, el sistema de compilador tiene que producir respuestas
inteligibles debajo todas las circunstancias. Particu- larly Cuándo utilizado por
novatos, estas respuestas raramente serán el esperados com- putation resultados;
bastante, probablemente pueden ser la información aproximadamente detectó
equivocaciones. El sistema tiene que formular estos mensajes tampoco en
lengua natural o en el ser de notación de la programación utilizó. Nunca tendría
que ocultar o mensajes de sistema operativo no motivados o---incluso peores---
octales o hexa- los vertederos decimales aparecen. Órdenes al sistema operativo
local también tiene que ser reducido a un mínimo.
Este libro emergido de notas de conferencia utilizaron en cursos en Stanford
Universidad y en el Instituto Federal de Tecnología (ETH) en Zürich. lt Es
por tanto bastante imposible de reconocer ali contribuciones y stimu- lating
ideas. Mi especial gracias va, aun así, a mi col!eagues E. W. Dijkstra
(Eindhoven), C. Un. R. Hoare (Belfast), y P. Naur (Copenhague), cuyas
contribuciones han no sólo influyó este texto pero el tema entero de programar.
Con agradecimiento particular, yo un!Así que recuerda mis discusiones con H.
Rutishauser; Cuando el originator de la idea de lenguajes de programación y
cuando el coautor de ALGOL 60, ha probablemente tuvo la influencia más
grande de todo en este trabajo. Mi gracias también ir a Señora Un. Forsythe Para
su lectura prudente del manuscrito. Finalmente, soy indebted a mis
colaboradores
xiv PREFACIO

U. Ammann, E. Marmier, y R. Schild Para su valiant esfuerzo en imple- menting un


compilador para el PASCAL de lenguaje de programación. Este esfuerzo demonstated que
la notación utilizada en este libro es bien convino no sólo para expresar algoritmos
abstractos pero también para producir eficaz y fiable pro- gramos de verdad
ordenadores.
La sexta impresión toma cuenta de una revisión del lenguaje de programación
Pascalt aquello se preocupa el manejando de textfiles. La definición de textfiles ya
no depende de la existencia de caracteres de control de línea explícitos. Este
cambio no necesariamente implica un conceptual simplifica- tion, pero representa
una adaptación a ampliamente aceptó convenciones.

NIKLAUS WIRTH

t K. Jensen y N. Wirth, PASCAL-Manual de Usuario e Informe, Notas de


Conferencia en Informática, Vol. 18, Edición de Estudio del Salmer, Berlín, Heidelberg,
Nueva York, 1974.
SVSTEMATIC PROGRAMACIÓN
Una Introducción
1 INTRODUCCIÓN

Durante la última década, el ordenador ha devenido un indispensable


también! De empresarial, industria, y búsqueda científica en actuar tareas
cuyo tratamiento sería imposible sin él. El ordenador es un autómata que
ejecuta procesos computacionales según precisamente especificó reglas.
Normalmente posee sólo un repertorio limitado de instrucciones elementales
que "entiende" y es capaz de obedecer, pero estas instrucciones están
ejecutadas con enormes expediency y fiabilidad. La esencia del poder del
ordenador y wideapplicability mentiras en su capacidad de ejecutar
extremadamente secuencias largas de las instrucciones que contienen una
combinación casi infinita de acciones elementales. El acto de incorporar tales
secuencias de instrucción a las "recetas que" representan las clases seguras
de procesos computacionales se apellida programar. Pero las ideas
fundamentales detrás diseñando los programas pueden ser explicados y
entendidos sin cualquier referencia a el ordenador.
La programación es una disciplina con muchas aplicaciones-un aquello
es abierto
A métodos sistemáticos del análisis matemático que implica abundancia de
no­ problemas triviales, y uno aquello es encima ali un reto intelectual. Pero
la programación de razón como técnica metódica ha sido poco analizado es
porque dirige a aplicaciones interesantes y problemas desafiantes, los cuales
requieren una fundación teórica sólida y una aproximación sistemática, sólo
cuándo los programas logran una complejidad segura y longitud (i.e., cuándo
son com­ posados de miles o incluso millones de instrucciones). Antes del
advenimiento de el ordenador, no había "ningún esclavo" dispuesto o
capaz de reliably ejecutando tales secuencias largas de órdenes con
obediencia absoluta , desconsiderada; así que el incentivo para ingeniar tales
programas era ausentes. Sólo el ordenador digital moderno ha hecho
programando ambos desafiante y pertinente..
1
2 IDEAS FUNDAMENTALES

Este capítulo introducirá sorne de las ideas básicas importantes de


programar. Porque son fundamentales, estos conceptos pueden no para-
mally ser definidos en plazos de otros conceptos. En cambio, serán
explicados a través del uso de ejemplos..
La idea más importante es que de acción. En este contexto, una acción
está entendida para tener una duración finita y para tener un pretendido
y bien- definido ejfect. Cada acción requiere la existencia de sorne el objeto
en qué la acción está ejecutado y en de quién cambios ofstate su efecto puede
ser recog- nized. Cada acción también tiene que ser descriptible en plazos
de una lengua o un sistema de fórmulas; su descripción se apellida una
declaración.
Si la acción puede ser descompuesta a partes, entonces se apellida un
proceso o una computación. Si estos separa estrictamente seguir cada cual
otro en los tiempos y ningún dos están ejecutados simultáneamente,
entonces el proceso se apellida secuencial. Conse- quently, una declaración
que describe un proceso puede ser roto arriba a partes; es entonces llamó
un programa. Un programa así consta de un conjunto de declaraciones
cuyo textuales ordenando no es, en general, idéntico con el ordenando en
tiempo de las acciones correspondientes.
La fuerza de conducción que de hecho ejecuta las acciones según el
especificó las declaraciones se apellida un procesador. Esto palabra bastante
neutra no da ninguna pista cuando a si el agente es un ser humano o un
autómata. De hecho, los programas tienen significar sin referencia a un
procesador concreto siempre y cuando la lengua subyacente es precisamente
definió. En general, el programador no es interesado en la identidad de el
procesador. Necesite sólo ser asegurado que entiende la lengua de sus
programas, para los programas están supuestos para constituir las reglas de
comportamiento de el procesador. El programador allí- fore necesidades de
saber las clases de declaraciones que su procesador disponible es capaz de
understandinP- �nd ejecutando, y tenga que adaptar su lengua
consiguientemente.
2
IDEAS FUNDAMENTALES 3

Cada acción requiere una cantidad segura de trabajo, dependiendo de el


pro- cessor. Esta cantidad puede ser expresada como el tiempo que toma el
procesador para ejecutar la acción. Estos tiempos abarcan, en vuelta,
normalmente puede ser más o menos directamente traducido a una
medida de costado. Un programador experimentado siempre tendrá en
cuenta las capacidades de los procesadores disponibles a él y tben
seleccionar la solución con el menos ensuing coste.
Desde este texto es principalmente preocupado con el diseño de
programas para ser ejecutados por procesadores automáticos (ordenadores), el
resto de este capítulo perfilará sorne las características básicas comunes a
ali ordenadores digitales. Precediendo este pájaro es-vista de ojo de
ordenadores, aun así, nos gustarían introducir dos ejemplos sencillos para
ilustrar las ideas justo definieron.
Ejemplo: Multiplicación
Estamos dar la declaración :
Multiplicar los dos números naturales x y y y denotar su
producto por z.
lf El procesador disponible entiende esta declaración, aquello es, si sabe
qué está significado por "número natural" y por "multiplicación," entonces
más lejano elaboration es innecesario.
Por el bien de argumento, aun así, supondremos que el procesador
disponible
(a) No entiende frases en lengua natural, aceptando fórmulas seguras
únicas, y
(b) No puede multiplicar pero sólo añadir.
Primer de ali, notamos que los objetos de computación son números
naturales. El programa, aun así, no es supuesto para especificar estos
números; bastante tenga que especificar un patrón general de comportamiento
para los procesos que multiplican arbi- trary pares de números naturales. En
sitio de números, por tanto, sencillamente utilizamos los nombres generales
que denotan objetos variables, llamó variables. A principios de cada
proceso, los valores concretos tienen que ser asignados a estas variables.
Esta asignación es la acción más fundamental en los procesos
computacionales ejecutaron por ordenadores.
Una variable es comparable a una pizarra: su valor puede ser
inspeccionado ("leído") cuando muchas veces tan deseado, y pueda ser
borrado y overwritten. Overwriting, aun así, causa el valor anterior para ser
perdido. Asignación de un valor w a un variable v posteriormente será
denotado por

V:= W (2.1)
El símbolo : = se apellida el operador de asignación.
Formalmente, declaración (2.1) ahora puede ser escrito cuando
z:=x*y (2.2)
4 CHAP. 2. IDEAS FUNDAMENTALES

Si esta declaración está descompuesta a una secuencia de las adiciones que


siguen cada otro en tiempo, entonces la acción de multiplicación deviene un
proceso secuencial, y declaración (2.3) supone la forma de un programa.
De momento, este programa será formulado informa!ly Cuando
Paso 1: z := O
U:= X

Paso 2: repetir las (2.3)


declaraciones
z := z + y
u := u - 1
hasta que
u= O.
El proceso que está evocado por este programa cuándo los valores concretos
están dados para x y y puede ser visualizado por grabar los valores asignaron a
=
las variables u y zas los progresos de computación en tiempo. Con x 5 y
y= 13, obtenemos la mesa en (2.4).

Valores de Variables
Paso z u

1 o 5
2 13 4
2 26 3 (2.4)
2 39 2
2 52 1
2 65 o
=
El proceso rescinde, según declaración 2, apenas u O. En este tiempo, z ha
=
adquirido el resultado final 65 5 * 13. Tal mesa es ca!Dirigido un rastro.
Nota que el listado secuencial de valores <loes no significar que estos
valores están retenidos; en cambio, cada variable ha a la vez exactamente
uno valor solo. Esto se debe a el hecho que una asignación overwrites el valor
anterior de una variable.

Los objetos de esta computación son números. Para actuar operaciones en


números concretos, es necesario de representar estos números por una
notación concreta. Una elección de notación es por tanto inevitable en ejecutar
un com- putation. (El programa, aun así, es genera!ly Válido sin
considerar a representación o notación concretas de sus objetos.) Es
también esencial de distinguir entre objetos-incluso si son objetos
abstractos como num- bers y su representación. En ordenadores, para
caso, los números son normalmente representados por los estados de
elementos de almacenamiento magnético, pero es altamente deseable de
ser capaz de formular los procesos que tratan números que puede ser
obedecido por ordenadores sin referencia a tales estados magnéticos.
IDEAS FUNDAMENTALES 5

Para ilustrar estas ideas y para demostrar cómo el mismo proceso


computacional puede ser descrito por varias notaciones, la mesa en (2.5)
sencillamente reemplaza los valores en (2.4) con números Romanos.

Valores de Variables.
Paso z u

o V
2 XIII IV
2 XXVI III (2.5)
2 XXXIX II
2 LII y
o
2 LXV o

Ejemplo: Divisió n
Estamos dar la instrucción :
Dividir el número natural x por el número natural y y denotar el cociente de entero
como q y el resto como r.

Más específicamente, las relaciones siguientes tienen que aguantar.


x=q* y +r YO � r<y (2.6.1)
Introduciendo el operador de división div, la computación puede ser descrita
por la declaración de asignación formal siguiente.
(q, r) : = x div y (2.6.2)
Para demostrar otra vez la descomposición de esta declaración a un
pro­ gramo, suponemos que el programa es para ser especificado para un
procesador incapaz de división, aquello es, sin el operador div.
Consiguientemente, la división tiene que ser descompuesta a una
secuencia de sustracciones de el divisor y del dividendo x, y el número de
sustracciones posibles deviene el cociente deseado q.

Paso l: q := O
r:= X
(2.7)

Paso 2: mientras r �y repite


q := q + 1
r:=r-y

x Y y otra vez denotar constantes que representa valores fijos dados en el


principio; q y r denotar variables con valores integrales. El proceso prescribió
6 CHAP. 2. IDEAS FUNDAMENTALES

=x
Por programa (2.7), habiendo los valores 100 y y 15, está
listado en el rastro en (2.8).

=
Valores de Variables
Paso q r

o 100
2 1 85
(2.8) 2 2 70
2 3 55
2 4 40
2 5 25
2 6 10
El proceso está rescindido apenas r < y. Los resultados son q=6 y r 1O, por
ello satisfaciendo las relaciones (2.6. l):
100 = 6 * 15 + 10 y O� 10 < 15 = (2.9)
Estos dos ejemplos son descripciones de los procesos secuenciales en
qué las asignaciones individuales están actuados estrictamente en orden
secuencial en tiempo. De ahora en adelante, nuestras discusiones serán
restringidas a procesos secuenciales, donde el proceso "de palabra" siempre
será entendido para ser una abreviatura de proceso secuencial. Esta
omisión deliberada de nonsequential los procesos es hizo no sólo porque los
ordenadores convencionales operan sequentially pero principalmente
porque el diseño de nonsequential programas o sistemas de secuenciales
pero programas interdependientes para ser ejecutados al mismo tiempo-es
una tarea sutil y difícil, requiriendo como base una maestría minuciosa de
el arte de diseñar algoritmos secuenciales.
Estos dos ejemplos también muestran que cada programa describe una
secuencia
De transformaciones estatales de el conjunto de sus variables. lf El
mismo programa está obedecido dos veces con valores iniciales diferentes (x
y y), entonces sea una equivocación para decir que los dos procesos o las
computaciones eran igual. Aun así, sin duda siguen el mismo patrón
ofbehavior. La descripción de tal patrón de comportamiento sin la referencia
a un procesador particular es normalmente llamó un algoritmo. El
programa de plazo es correctamente utilizado para los algoritmos
diseñaron de modo que pueden ser obedecidos o seguidos por un tipo de
procesador concreto. La diferencia entre un general (a veces llamado
abstracto) algoritmo y un programa de ordenador líes principalmente en el
hecho que el último tiene que especificar las reglas de comportamiento en
cada poco detalle y tiene que ser compuesto según estricto notational reglas.
Las razones para este es la máquina está limitada conjunto de
instrucciones, el cual es capaz de comprensivo y ejecutando, y su
obediencia absoluta, basado en su carencia total de una actitud crítica.
Estas características de el ordenador están criticadas por más novatos en el
arte de
IDEAS FUNDAMENTALES 7

Programación como las razones detrás de la necesidad para atención y precisión


pedantes para detallar cuándo tratando ordenadores. De hecho, incluso una
equivocación trivial en escribir puede dirigir a totalmente unintended y
comportamiento "" de máquina sin sentido. Esta ausencia obvia de cualquier
"sentido común" al cual un programador puede apelar (siempre que los sentidos
propios suyos fallan) ha sido criticado por profesionales también, y los esfuerzos
han sido emprendidos para remediar esta deficiencia de parecer. El programador
experimentado, aun así, aprende para apreciar este servile actitud del ordenador
debido a qué deviene posible a incluso requerir "patrones" inusuales de
comportamiento. Para este es precisamente qué es imposible de preguntar
cuándo tratando (humano) procesadores quiénes están acostumbrados a acabar
cada instrucción a la interpretación más cercana que es ambos verosímil y
complaciendo a ellos..
3 LA ESTRUCTURA DE ORDENADORES

Para diseñar los programas ejecutables por ordenador automático, el


programador primero tiene que saber su demasiado!. El más precisamente
sabe su procesador, el mejor es capaz a sastre sus algoritmos a los programas
que utilizan las capacidades particulares de aquel procesador. Por otro
lado, el más un algoritmo es tailored y puesto "a punto" a un procesador,
el más grande el esfuerzo gastó para desarrollar el programa. Bajo
circunstancias normales, una solución tiene que ser encontrada aquello
mantiene el programa-esfuerzo de desarrollo dentro de límites razonables
mientras todavía cediendo suficientemente buenos (i.e., eficaces)
programas. Para encontrar tal solución, el programador tiene que saber las
clases de adaptaciones que es bastante fácil de actuar pero que, al mismo
tiempo, cosecha una mejora relativamente grande. Con este fin, es
esencial de saber el más importante, generalmente características válidas
de ordenadores mientras ignorando las idiosincrasias y peculiari­ lazos
(llamados presenta) de máquinas individuales.
En ali ordenadores digitales modernos, podemos distinguir entre dos
componentes principales.
l. La tienda (memoria llamada a menudo). La tienda contiene los objetos
que está manipulado en forma codificada. Estos codificaron los objetos
se apellidan dato. El rendimiento de una tienda está medido por su
capacidad (medida) y por la velocidad con qué dato puede ser
depositada y recuperó. De todas formas, la tienda tiene una capacidad
finita.
2. El procesador (aritmética-unidad lógica). Esta unidad actúa adiciones,
multiplicaciones, comparaciones, etc. el dato está recuperado (leído) de
la tienda para procesar, y los resultados están depositados (escritos) a la
tienda.
En cada momento, el procesador contiene sólo el dato para ser
procesado inmediatamente-aquello es, muy pocos operandos. lts
Elementos de almacenamiento propio se apellidan registros. Ali dato que
no es inmediatamente necesitado está entregado encima a la tienda,
el cual entonces juega la función de una "caja de hielo."
8
LA ESTRUCTURA DE ORDENADORES 9

Ejemplo: Evaluación ofan expresión


Para evaluar una expresión de aritmética con severa! Operandos y
resultados intermedios, aplicamos otra vez la técnica de descomponer un
com­ plicated tarea a una secuencia de tareas más sencillas. Esto causa
operaciones de aritmética individual para tomar operandos de los registros
del procesador y para reemplazarles por los resultados. La evaluación de
la expresión
ª*b+c*d (3.1.1)
Está roto abajo a instrucciones más sencillas:
Rl := Un
R2 := b (3.1.2)
Rl := Rl * R2
z := Rl
Rl := e
R2 := d
Rl Rl * R2
:=z
R2 :=
Rl := Rl + R2
Rl Y R2 denota los registros del procesador, y z designa el resultado intermedio
temporalmente depositado en la tienda. El resultado final está hecho
disponible en registro R1.

La evaluación de la expresión así ha sido transformada al programa a


escaso que consta de tres clases de instrucciones o declaraciones;.

(a) Instrucciones fetching operandos de la tienda,


(b) (Aritmética) operaciones exclusivamente accediendo registros de
procesador, y
(c) Las instrucciones que depositan resultados en la tienda.
Este método de descomponer declaraciones a pasos más elementales y
entonces temporalmente salvando los resultados intermedios en la tienda
es la razón que los mismos procesos computacionales pueden ser ejecutados
por relativamente sencillos así como ordenadores muy sofisticados-el
anteriores meramente requerir más tiempo. El método de descomposición
es el muy esencia de programación de ordenador digital, y es la base
para la aplicación de relativamente mecanismos sencillos a problemas de
complejidad enorme. Un precondition para el éxito de una computación
que consta de miles de millones de pasos solos (de quién oper­ ands es
siempre el resultado de pasos anteriores) es, naturalmente, un procesador con
una velocidad razonablemente alta y una fiabilidad absoluta. La realización
de tales procesadores es una de los triunfos ciertos de tecnología
moderna.
El ejemplo de la evaluación de una expresión un!Tan espectáculos el
necessity de una interconexión cercana entre procesador y tienda, desde la
cantidad de
10 CHAP. 3. LA ESTRUCTURA DE ORDENADORES.

Flujo de información entre las dos unidades es bastante alto. La tienda


contiene objeta que tiene que ser accesible a través de nombres distintos
(p. ej., un, b, z,.. .). Consiguientemente, tiene que haber un orden en la
tienda como aquel encontrado en un conjunto de cajas de oficina del correo.
Los objetos son por tanto contenidos en un conjunto de singularmente
células de almacenamiento identificable, cada cual del cual tiene una dirección
única. Cada acceso a la tienda tiene que ser acompañado por una
especificación de la dirección de la célula para ser referenced.
Las células en una tienda de ordenador se parecen a cajas de
almacenamiento utilizaron en vida diaria insofar cuando contienen y
preservar un objeto. Pero esto es donde los fines de analogía. La capacidad
de tiendas de ordenador para preservar el dato no es basado en el hecho
que ellos físicamente puerto un objeto, pero en cambio que un seguro
codificando del objeto está reflejado por el estado de la célula. La célula por
tanto tiene que ser capaz de suponer un número seguro de estados
discretos. Es difícil de darse cuenta los componentes capaces de suponer y
manteniendo muchos claramente distinguir- estados capaces sobre un tiempo
arbitrariamente largo. Es factible, aun así, para construir tales elementos de
almacenamiento habiendo sólo dos estados distintos; estos se apellidan binary
elementos de almacenamiento. lf Un grupo de n células de almacenamiento
binario está combinada, este grupo puede suponer 2n combinaciones diferentes
de estados. lf El grupo está considerado como una unidad indivisible,
entonces representa una célula de almacenamiento con 2 n estados posibles.

Ejemplo: Codificando objetos a grupos de binary dígitos


Escogemos la representación posicional de números naturales
(incluyendo O). Un número x está codificado en la secuencia siguiente de
n binary dígitos (llamó bits), aquello es, zeroes y unos,.
x:bn _ 1 . . . b 1b 0 (3.2.1)
Dónde la regla de codificar está dada por
(3.2.2)
x = bo + 2b¡ + ... + 2n -lbn -l
Esta regla es de ninguna manera el único uno posible, pero en muchos
aspectos, es el más apropiado. Después de que ali, es la misma regla en qué
la representación de arabic (decimal) los números está basado; aquello es,
(3.3.1)
Y
X= + lO*d ¡ + 102 *d2 + ... + 10m -l *dm -1 (3.3.2)
Sorne Ejemplos de binarios y decimales encodings (representaciones) de los
números son
Binario Decimal
1101 13
10101 21
111111 63
(3.4)
1101011 107
LA ESTRUCTURA DE ORDENADORES 11

El rnost irnportant lección para ser aprendida frorn este exarnple es que
células de almacenamiento finito-aquello es, las células capaces a assurne sólo
un finitos nurnber ofdiscernible estados (ningún otros existen en realidad}-es
capaz ofstoring nurnbers único frorn afinite gama ofvalues. En un cornputer el
nurnber ofbinary almacenamiento elernents agrupó a una célula de
almacenamiento direccionable sola (palabra) es normalmente llamó el
wordlength. Las capacidades del arithrnetic la unidad está adaptada a este
rneasure. Cornrnon Valores ofwordlengths n es 8, 16, 24, 32, 48 y 64 con
conjuntos correspondientes de2 n valores distintos.
La consecuencia del básico requirernent que el cornputer rnust ser capaz
de obedecer un dado prograrn es que él rnust tener "acceso" fácil a aquel
prograrn. Dónde, entonces, es el rnost sitio apropiado para aguantar un
prograrn? Sea el brillante-y hoy en día seerningly trivial-idea de John von
Neumann para poner el prograrn a la tienda. Consiguientemente, el sarne la
tienda suele control tanto los objetos y la receta "" ofthe cornputing procesos,
aquello es, el dato y el prograrn.
Evidentemente, este concepto de el ordenador de programa almacenado
requiere que instrucciones también ser codificados. En nuestro exarnple de
una evaluación de expresión cada instrucción es representable por un
código de operación (para especificar lectura, escritura, añadiendo, rnultiplying,
etc.) y, en sorne casos, por un operando. Si los operandos están
representados por almacenamiento-direcciones de célula y si estas direcciones
están escogidas para ser la totalidad nurnbers O, 1, 2, , entonces el problern
ofencoding
prograrns Es esencialmente solucionó; cada prograrn puede ser
representado por secuencias ofnurnbers (o grupos ofnurnbers) y por tanto
puede ser depositado en un cornputer tienda.
Otra consecuencia de el almacenado-prograrn la aproximación es que
cada prograrn ocupará un seguro nurnber de células de almacenamiento,
aquello es, un seguro arnount de espacio de almacenamiento. El nurnber
ofoccupied células, los cuales son ya no disponibles de aguantar dato, es
proporcional a la longitud del prograrn texto. El prograrnrner rnust por
tanto airn para mantener su prograrns como conciso como posible.
El siguiente, irnportant capacidades ofthe rnodern digitales cornputer está
basado en el concepto ofsharing la tienda entre el prograrn y el dato.
1. Apenas ejecución ofa seguro prograrn P es terrninated, un nuevo prograrn Q
puede ser aceptado en la tienda para ejecución subsiguiente (flexibilidad,
aplicabilidad ancha).
2. Un cornputer rnay generar (según un seguro prograrn) una secuencia de
nurnbers que lo posteriormente considerará e interpretar cuando
codificó instrucciones. El dato generado en el primer paso becorne el
prograrn obedeció en el segundo paso.
3. Un cornputer X rnay ser instruido para considerar secuencias de
nurnbers de hecho representando prograrns como datos para ser
transforrned (según sorne traducción prograrn) a secuencias de
nurnbers representando prograrns codificados para un diferentes
cornputer Y.
4 PROGRAMANDO
SISTEMAS.
sida Y

Hasta el tardío 1950s, la programación constó de el detallado codificando


de secuencias largas de instrucciones-inicialmente escritos en sorne notación
simbólica­ a números en binarios, octales, o forma hexadecimal. Esta
actividad se apellida codificación en contraste a programación, el cual
abarca la tarea más difícil de diseñar algoritmos. El inadequacies de este
pesado proce­ dure devenía más y más aparente con el advenimiento de
ordenadores más rápidos habiendo tiendas más grandes.

1. El coder estuvo forzado a sastre sus programas a el particulares


characteris­ tics de su ordenador disponible. Por tanto tenga que
considerar ali detalles de la máquina, incluyendo su organización de
procesador y su conjunto de instrucción. El intercambio de los programas
entre varias máquinas era imposibles, e incluso el conocimiento más
minucioso de métodos de codificación encima una máquina era
bastante inútil cuándo aplicado a otro ordenador. Cada instituto diseñó
programas de su propios y estuvo forzado para colocar de ellos y al
código nuevo unos siempre que un ordenador nuevo reemplazó el viejo
un. Devenga evidente que la adaptación y poniendo a punto de
algoritmos a las características extrañas de un ordenador concreto
representaron un unwise inversión de intelecto humano.
2. El cercano atando de el programador a un tipo de ordenador no sólo
habilitado pero incluso animó la invención y aplicación de ali clases de
trucos para obtener rendimiento de máquina máxima. Mientras este
"trickology" era todavía consideró la esencia de programación buena, el
programador gastó tiempo considerable en la construcción de optima! ""
Códigos, cuya verificación era generalmente muy difícil. Sea
prácticamente imposible de descubrir el principies de un programa
diseñado por un colega y a menudo tan difícil de explicar aquellos de
uno es programas propios ! Este arte de codificación ha ahora perdió la
mayoría de su gloria. El programador experimentado
12
PROGRAMANDO sida ANO SISTEMAS 1 3

Conscientemente evita el uso de trucos, escogiendo soluciones sistemáticas y


transparentes en cambio.
3. El tan-código de máquina llamada contuvo sólo una cantidad mínima de
redun- dancy en la base del cual errores de codificación formal podrían ser
detectados. Como.
Resultado, incluso escribiendo errores, el cual podría tener devastar efectos
cuándo el programa estuvo ejecutado, era difícil y el tiempo que consume
para descubrir.
4. La representación de un programa complejo como un unstructured, la
secuencia lineal de órdenes era una la mayoría de forma inapropiada para el
inspector humano a comprehend y para expresar. Mostraremos más tarde
que la presencia y la aplicación de estructura es el principal también! En
ayudar el programador a synthesize sistemáticamente y para mantener un
global comprehension de complicó programas.
Estos shortcomings dirigidos al desarrollo del tan-llamado "alto leve!"
Lenguajes de programación. Tales lenguas devenían el medio a través de qué
para instruir un ordenador idealizado, hipotético que es diseñó no según las
limitaciones de tecnología actual pero según los hábitos y las capacidades de
hombre para expresar sus pensamientos. En esta situación, aun así, somos
confrontedwith una máquina Un, whichis económicamente realizable pero
tampoco conveniente ni animando para utilizar, y un ordenador B, el cual está
convenido a necesidades humanas pero existe sólo encima papel. El vacío entre
estas dos clases de objetos es ahora bridged por una entidad software llamado.
(En contraste, la máquina física se apellida hardware.) Un sistema de software
es un programa C que, cuándo ejecutado por el ordenador de existir Un,
habilita Un para traducir los programas escritos para la máquina hipotética B a
programas de su propios. Programa C se apellida un traductor o compilador;
habilita Un para aparecer como la máquina idealizada B.
La utilización de compilador C por ello alivia el programador de la carga de
considerar el particular, detalló características de su ordenador Un. Pero no le
libere del deber de ser constantemente consciente que es máquina Un aquello
finalmente ejecutará sus programas y que Un tiene sorne limitaciones
definitivas, impuestos por su velocidad finita y capacidad de almacenamiento.
Normalmente, un sistema de software de hardware combinado los procesos
programa P
En dos pasos distintos, los cuales siguen cada cual otro en tiempo. Durante el
primer paso, P está traducido por el compilador C a una forma interpretable
por Un; este paso se apellida recopilación. En el segundo paso, el programa
traducido está ejecutado; este paso se apellida ejecución.
Recopilación: compilador de programa C
Programa de dato de la entrada = P en lengua B
Programa de dato = de la producción P en lengua Un
Ejecución: Programa = P en lengua Un
Argumentos de dato = de la entrada de computación X
Dato de producción = resultados computacionales Y
5 ALGUNOS PROGRAMAS SENCILLOS

Capítulo 4 mostró claramente por qué un programa tiene que constar de las
declaraciones formularon en una notación que el ordenador "entiende." A
pesar de que no sabemos aún así qué clases de declaraciones y fórmulas un
lenguaje de programación contiene, sabemos que estas declaraciones
precisamente especificarán el pretendió acciones. Este incuestionable necessity
para la precisión probablemente constituye la diferencia principal entre
comunicación entre humanos y comunicación con máquinas. El trabajo con
ordenadores requiere ambos preci- sion y claridad. Vagueness Y la ambigüedad
es estrictamente prohibida.
Un generalmente utilizado y fácilmente comprehended notación para
expresar pro- los gramos es el tan-llamados fiow-esquema o flowchart. Programa
(2.3) está descrito en (5.1) como flujo-esquema.

z:=0
u:=x

z: = z + y
u:= u - 1

14
ALGUNOS PROGRAMAS SENCILLOS 15

Esta representación pictórica claramente muestra la secuencia posible de pasos


por visually ilustrando dos clases de instrucciones :

(a) La asignación de valores a variables, denotados por rectángulos, y


(b) Las decisiones, denotados por diamantes.
Un paso de decisión tiene más de uno sucesor posible. Si la relación
especificada o la condición está satisfecha, entonces el camino denotado
por la + señal está seguida ; otherwise el denotado por el - la señal está
tomada. Una repetición se manifiesta por un bucle, aquello es, una secuencia
cerrada que consta de declaraciones y al menos una decisión que determinará
la terminación de la repetición. En la misma moda, programa (2.7) está
representado por flujo-esquema (5.2).

q:=0
r:=x

(5.2)

r:= r -
Un programa determina un ypatrón de comportamiento para un
unspecified, a menudo número infinito de procesos posibles. Los procesos
individuales son dis­ tinguished por los valores de las variables implicaron
en intervalos de tiempo relacionado y, en particular, por los valores iniciales
o argumentos. Pero cómo puede aseguramos que ali procesa ejecutable
según un programa dado computará el especificó resultados? Esta
cuestión de el correctness ofprograms es uno de el más central, crucial, y
asuntos inevitables de programar. El correctness de programas (2.3) y (2.7)
estuvo demostrado en mesas (2.4) y (2.8) para un par fijo de valores x y y. Este
método de establecer correctness se apellida testaje de programa; consta
de seleccionar argumentos (x y y), ejecutando el proceso con estos
seleccionó argumentos, y com­ paring el computó resultados con los
resultados correctos anteriormente sabidos. Este testaje experimental está
repetido con severa! Argumentos, utilizando el ordenador como el ideal
también!. No obstante, este método convencional es
16 CHAP. 5. ALGUNOS PROGRAMAS SENCILLOS

Caro, el tiempo que consume, y pesado. Al final, es también unsatis­ fábrica,


desde entonces para sacar ali dudas sobre el correctness de un programa,
sea necesario de ejecutar ali computaciones posibles-notjust un seleccionados
pocos. Pero si los resultados de ali los procesos tienen que ser sabidos por
adelantado, difícilmente habría cualquier propósito en escribir un
programa de ordenador. En todo caso, en práctica, tal un testaje
exhaustivo de un programa es bastante imposible. Por ejemplo: Supone
que un ordenador dado toma 1 µsec para la adición de dos números (según
su programa) y que es capaz de representar números hasta un valor
absoluto de 2 60. Entonces 22*6º adiciones diferentes son posibles, tomando
22* 6º * 10- 6 sec == 3.2 * 10 yr
22

Desde esta clase de testaje experimental exhaustivo es ambos senseless e im­


posible, podemos formular una regla de tierra importante.
Testaje experimental ofprograms puede soler mostrar la presencia de errores
pero nunca para probar su ausencia.
Consiguientemente, es necesario a abstracto de procesos individuales y al
postulado seguro generalmente condiciones válidas que puede ser
derivado del patrón de comportamiento. Este método analítico de probar
se apellida verificación de programa. En contraste para programar probando
donde las propiedades de indi­ vidual los procesos están investigados-
verificación de programa está preocupada con las propiedades de el
programa.
Verificación de programa emplea el mismo principies como empírica!
Testaje y por tanto podría ser considerado análogo con verificación de
proceso. Pero en vez de grabar los valores individuales de variables en una
mesa de rastro, nosotros postulado generalmente gamas válidas de valores y
relaciones entre variables después de cada declaración. "Generalmente
válido" tendría que ser entendido para significar "válido para cada proceso
ejecutable según el programa dado y válido en el punto de anotación
irrespective de las declaraciones anteriormente obedecieron." Podemos
ahora postulado cuatro reglas básicas ofanalytic verificación de programa.

1. Precediendo y teniendo éxito cada declaración, uno o severa! Las


condiciones están especificadas aquello está satisfecho antes de que y
después de cada ejecución de el estatal­ ment. El anotó las condiciones se
apellidan aserciones; los precediendo una declaración S se apellida sus
antecedentes P; y los siguiendo se apellide consecuencias o consequents
Q.

- - - P (Antecedente)

(5.3)

-- - Q
(Consiguiente)
ALGUNOS PROGRAMAS SENCILLOS 1 7

2. lf severa! Caminos de un flujo-el esquema fusiona delante de una


declaración T, entonces el consequents Q; de ali precediendo
declaraciones S; el mosto lógicamente implica el antecedente P de
declaración T. Así

Qz-- ---
- Qn
(5.4.1)
-P

Q; ::::i P Para i 1 ... n =


(Q ::::i Pis verbalized Cuando "Q implica P.")

Ejemplo:

(-10 < x < O ) (5.4.2)


----( - 10 < X < 10)

T
18 CHAP. 5. ALGUNOS PROGRAMAS SENCILLOS

3. Si una aserción P aguanta preceder una decisión con condición B,


entonces el dos consequents es

(5.5.1)

PYo\B ------------------------------ Pl\-,B

(P /\ Bis verbalized Un "s P und B," P /\ ,B un "s P und no B.")

Ejemplo:
----lO<< x 10

(5.5.2)

-lO<<x O --Ü �X<


10

4. Si una aserción Pcontroles después de la asignación de el valor w a el


variable v, el antecedente de la asignación está obtenido por sustituir w
para ali ocurrencias libres de v en P.
---P':.,

(5.6.1)

---P
(Esta regla bien puede ser considerada como la definición de el efecto de
asignar- ment.)

Ejemplos:
--x+y= 10 ---x+ 1 = 10 - - f(x) = u

x:=x+ 1
--z=IO ----x = 10 - X= U

(5.6.2)
ALGUNOS PROGRAMAS SENCILLOS 1 9

-----y = x2, d = 2x-1, d+2 = 2x+yo

- - - - - - y = x 2, d = 2x+1, y+d =(x+ 1)


2

-------y=(x+1)2, d=2x+1, d+2=2(x+l)+yo

------ y = (x+1)2, d = 2(x+1)+ 1, y+d = (x +2)


2

-- ---- y = (x+2) 2, d = 2(x+2) - 1


(5.7)
Ahora aplicaremos estas reglas básicas en verificar el correctness de pro­
gramos (5.1) y (5.2), los cuales computan el producto y cociente de dos
números naturales, respectivamente. Primero, establecemos los resultados
intermedios siguientes por aplicar el derivation regla para la declaración de
asignación.
_ -{ Z+U*y = Z +y+(u - 1) *y = X*y
.....--�-�
u>O

-----z+(u- l)*y = x*y, u-1 �O (5.8)

---- - Z + U*y = X*y, U�0

-----{r + q *y = r - y+(q + 1)* y = x

....---�--, r- y�O

(5.9)

----- r+q* y = x, r � O
20 CHAP. 5. ALGUNOS PROGRAMAS SENCILLOS

Los dos programas completos con las aserciones pertinentes están mostrados en
esquemas­ de flujo (5.10) y (5.11)..

- - - - -- X > O, y >
o
z:=O
u:=x
------z = O, u = X
u>O
------z + u * y = X * Y,
(5.10)
z:= z + y
u:=u-1

+ U * y =X
* y, u�O
------ Z

------z =X* y, U= 0

----- X > 0, y > Ü

q:=0
r:= X

r =x
.------- (5.11)
r�O
+
1
1 -q *y+ r = X, O�r<y
--------
1
1
1
r:=r - y
1
q:=q ¡

La determinación +de aserciones en una secuencia de declaraciones,


basados en reglas (5.3H5.7), es generalmente un asunto sincero, cuándo
cualquiera el ante­ cedent de la primera declaración o el consiguiente de la
última declaración está dada. Una dificultad seria surge, aun así, apenas el
flujo-el esquema contiene caminos circulares cerrados, aquello es, si el
programa contiene repeticiones. En este caso, la aproximación mejor es
para cortar el bucle en sorne sitio y entonces postulado una hipótesis H en el
corte. Empezando con la hipótesis, las aserciones pueden ser
ALGUNOS PROGRAMAS SENCILLOS21

Derivado a través del ahora linearized secuencia, yendo cualquier delantero o


atrás­ ward. La aserción resultante Pn al final (i.e., en el corte) tener que
entonces lógicamente implicar (o ser implicado por) H de modo que el corte
puede ser cerrado. lfthis No es satis­ fied, otra hipótesis tiene que ser supuesta,
y el proceso tiene que ser repetido, cuando mostrado en (5.12).

() n (5.12)

H => p�

Es ventajoso de colocar el corte que precede la condición B según qué la


repetición está rescindida. La combinación lógica de condiciones H y B
entonces constituirá el consiguiente ofthe grupo de declaración repetitivo
entero.
Tal una aserción, aguantando independientemente de el número de
anteriormente ejecutó repeticiones, se apellida un bucle-invariable o
sencillamente una invariante, desde entonces representa una condición que
<loes no cambiar mientras los progresos de proceso. En programas (5.10) y
(5.11), las dos invariantes son, respectivamente,
(z + u * y = x * y) /\ (u � O)
Y (q * y + r = x) /\ (r � O)
Desde las repeticiones o los bucles son electores fundamentales en ali
computa­ tional procesos y programas de ordenador, podemos formular estas
instrucciones como reglas ofderivation. Estas reglas especifican el consiguientes ofa
repetitivos estatales­ ment, dados su antecedente y dado las aserciones para
la declaración que está repetido.
l. Dado una aserción P aquello
es invariable encima declaración S
aquello es,
ifgiven como su antecedente, es también su consiguiente-y está
representado por
----P /\ B

s (5.13.1)
----P
22 CHAP. 5. ALGUNOS PROGRAMAS SENCILLOS

Podemos hacer la aserción siguiente sobre la declaración repetitiva S':


---P
r ------------------ �
S''1

_,
Yo yo
Yo yo
(5.13.2)
i (P /\ -.B )

s
L --------------------------------------------------------------------- 1

2. Dado el dos preconditions aproximadamente declaración S,


(Un) ---- p (b) - - - (º /\ --,lJ)

Y (5.14.1)

----Q ----------------------- Q
Podemos hacer la aserción siguiente sobre la declaración repetitiva S":
---P

S"
s
(5.14.2)

L_ __ ______________ J

Nota que para esta segunda forma de repetición, dos preconditions


tiene que ser satisfecho para aplicar el derivation regla. Esta forma
puede justly apellidarse el más "peligroso," desde entonces programando
los errores frecuentemente pueden ser localizados directamente atrás al
descuido del programador de uno de el dos preconditions
[normalmente (un)]. En casos de duda, la primera forma, donde la
condición de terminación B precede la declaración S, está recomendado.
ALGUNOS PROGRAMAS SENCILLOS23

Estas directrices tendrían que ser consideradas esencialmente como una


aproximación informal al problema de verificación analítica de las
propiedades de programas. Es particularmente importante de darse cuenta
las dificultades implicaron en el problema de encontrar invariantes. La lección
que cada programador tendría que aprender es que la indicación explícita de
la invariante pertinente para cada repetición representa el más valuab/e elemento en
cada documentación de programa. Pero incluso si un programa está pretendido
para el uso exclusivo de su autor, el explícito disuade- mination de las
invariantes pueden ayudar en impedir muchos errores, el cual otherwise sería
descubierto sólo por testaje extenso, y a menudo incluso quedar una
característica "permanente" de el programa presuntamente correcto. Tan
importante, aun así, es la indicación explícita de las variables' gamas de
valores, particu- Iarly aquellos para los valores iniciales para qué el programa
declarado control de propiedades. Finalmente, figuras (5. 15) y (5.16)
demuestra qué constituye ambos un necesarios y una documentación de
programa adecuada. Es importante de recordar que un programa puede ser
overdocumented. Un programa que contiene tantos comentarios que las
declaraciones reales son difíciles al sitio es inútil !
Multiplicación de números naturales

Argumentos: x, y
Resultado: z
Variable auxiliar: u

z: = 0
u:=x
,----...-,--- (z + u * y = x * y) /\ (u > O)

z:=z+y (5.15)
u:= u - 1

----Z=X*Y

División de números naturales

Argumentos: x, y
Resultados: q (cociente de entero), r (resto)
24 CHAP. 5. ALGUNOS PROGRAMAS SENCILLOS

q: = o
r: = X

'(q *y + r = x) Un (r �O)
(5.16)

--(q *y+ r = x) Un (O�r < y)(q,


r:= r - y r) = x div y

EJERCICIOS
5.1 El programa siguiente computa el producto z •= x * y, donde sólo las operaciones de
adición, plegando, y halving está empleado. Los argumentos x y y es números
naturales; u y v es (auxiliar) variables de entero. El predicado extraño(u)

z:= O
u:=x
v:= Y

-------------------------------------- (z + u * v = x * y) /\ (u � 0)

(5.17)
Z =X* y

11:= udiv 2
v:=2•v
EJERCICIOS 25

Está satisfecho si u es un número extraño. Determinar los antecedentes pertinentes y


consequents de cada declaración que puede ser derivado por aplicar reglas
(5.3H5.6) de la invariante dada.

5.2 El programa siguiente computa el más grande común divisor (GCD) de dos
números naturales x y y; un y b es variables de entero cuyo valor final representa el
resultado deseado.

Un:
=x
b:=y
· · GCD(Un,b) = GCD(x,
y)
(5.18)
1
1
'-Un= b =
GCD(x,y)

Un: =un b:=b -


Un
-b

Cuando en Ejercicio 5.1, determinar las aserciones necesarias por utilizar estas
relaciones sabidas de la función GCD:

(a) u > v: GCD(u, v) = GCD(u - v, v)


(b) GCD(u, v) = GCD(v, u)
(c) GCD(u, u) = u

5.3 Siguiendo el patrón en programa (5.Yo 7), diseño un programa para computar z = x
v para los números naturales dados x y y. Incluir las aserciones necesarias para
verificar el correctness de vuestro programa.
6
FINITENESS DE
PROGRAMAS

La estructura de bucle es el elemento más característico en cada programa


de ordenador porque implica la repetición de una acción, y automata es
particularmente bien convenido a tareas repetitivas. La capacidad del ordenador
a principal- tain exactitud y fiabilidad después de los miles de repeticiones es
particularmente valiosos. Por otro lado, es precisamente este untiring e
indiscriminate "obediencia" a un programa que requiere una amonestación
aumentada en la parte del programador. Consiguientemente, uno la propiedad
importante requerida de cada programa es que rescinde después de afinite
número de repeticiones. Unfortun- ately, procesa aquello no termínate es un
fenómeno bastante común y costoso en instalaciones de ordenador en todas
partes. Estos pueden ser evitados, aun así, a través de un aumentados
meticulousness durante diseño de programa y verificación. Para explicar las
precauciones necesarios de asegurar terminación, podemos utilizar la
estructura de bucle fundamental mostrada en (6.1).

(6.1)

Un mínima! El requisito para terminación es que declaración S tiene que


cambiar el valor de uno o más variables de tal manera que después de que un
número finito de pases, condición B ya no puede ser satisfecho. En general, el
finiteness de un.
26
EJERCICIOS 27

repet1t1encima puede ser formalmente derivado por postulating una función


de entero N,
Dependiendo de variables seguras del programa, y por mostrar que

(a) Si B está satisfecho, entonces N > O y


(b) Cada ejecución de Sdecreases el valor de N..

La aplicación de esta regla es trivial en el caso de programa (5.2). Declaración


Sis
r := r - y

Y condición B es
r�y
Dónde r, q, y y es números naturales. Escogemos N = r - y. Desde
entonces

(a) r �y Implica N �O y
(b) La ejecución de Sdecreases el valor de r y por tanto de N, finiteness es
evidentemente guaranteed. Nota, en particular, el necessity de la
condición inicial y > O.

Como segundo ejemplo, podemos utilizar la aplicación de el derivation


regla para programar (5.18). lts Declaración Sconsists de dos alternativas,
Un : = un - b si un > b, o b : = b - un si b > un
Y condición B es un = h. Otra vez, un y b es números naturales con valores
iniciales un > O, b > O, y un -:f. b. Una elección adecuada para N(un, b)
resulta= para ser N max(un, b). El efecto de Supon N tiene que ser
considerado en dos casos separados. Si un > b, entonces b queda sin
cambios y un es decreased por b. Desde un > O, b > O, y un -:/- b
inicialmente, las primeras dos relaciones quedan sin cambios (invariables)
yN= disminuciones.
= Si b > un, entonces unos restos= sin cambios y b
max(un, b) N decreased por un. Así desde N max(un, b) disminuciones
= min(un, b) queda positivo, sigue
durante cada repetición y, por otro lado,
que en sorne tiempo, max(un, b) min(un, b), y por lo tanto un -:f. b Es ya no
satisfecho. Esto rescinde la repetición..

EJERCICIOS

6.1 Determinar la gama de valores ofx y y aquello garantizará el finiteness de los


programas en Ejercicios 5.1 y 5.3..

6.2 Para qué gama de valores de x y y es el programa siguiente finito?


CHAP. 6. FINITENESS DE PROGRAMAS

Un:
=x
b:=y

+ Un:= un
- b
(6.2)

+
b:= b -
Un

6.3 En qué casos <loes programa (6.2) computa el más grande común divisor de x y
y? Determinar las aserciones necesarias y suficientes.
LENGUAJES DE PROGRAMACIÓN

7 Y NOTACIÓN SECUENCIALES

7.1 ENCUESTA

Cuándo los programas están a punto para ser procesados por un


ordenador, no tienen que ser en la forma de flujo-esquemas. Estos
bidimensional, pictórico repre­ sentations no puede ser aceptado por
dispositivos de entrada convencional. Programas en la forma de flujo-los
esquemas por tanto tienen que ser traducidos a máquina­ forma legible
antes de que pueden ser ejecutados. Desde tal traducción es una fuente
probable de errores, es altamente deseable de representar el programa en
una forma que no es máquina única-legible pero también bien definido y
conveniente para el programador para trabajar con. En tan haciendo, esta
representación sirve como la forma original en qué un programa está
concebida, así evitando la cuestión crucial del cual representación (esquema
o traducción) constituye la definición válida de el algoritmo.
El dato más extendido dispositivos de entrada están pegados lectores de
tarjeta y typewriters (cuál a veces utiliza cinta de papel pegado). En ambos
casos, el dato dado toma la forma de una secuencia lineal de caracteres
imprimibles, aquello es, la forma de un secuencial o texto de serial. Las
notaciones textuales para programas son normalmente llamó lenguajes de
programación. Están diseñados según reglas seguras, el cual precisamente
define el conjunto ofcorrect frases o declaraciones. El conjunto de tales reglas se
apellida una sintaxis. Desde los programas formularon en estas lenguas son
para ser leídos y entendidos por automata con una gama relativamente
estrecha de comprensivo, una aplicación estricta de estas reglas de sintaxis no
está sorprendiendo. Para aprender un lenguaje de programación por tanto
requiere ambos un comprehension de el significado de las formas
disponibles de frases y un conocimiento detallado de las reglas sintácticas
que gobiernan el Ianguage. El Iatter normalmente supone una proporción más
grande de atención que es consuetudinario en aprender lenguas naturales,
desde los programas tienen que no sólo ser leídos y entendidos pero, más
importantly, ser inventados y formuló..

29
30 CHAP. 7. LENGUAJES DE PROGRAMACIÓN Y NOTACIÓN SECUENCIALES.

Desatendiendo problemas de programación trivial, el esfuerzo


principal en con- structing unas mentiras de programa en la concepción y
verificación de el algoritmo subyacente-el esfuerzo requirió para formular
él en una notación concreta es com- paratively pequeño. El desarrollo de un
algoritmo es a menudo un complejo y proceso que consume tiempo durante
qué la solución final está aproximada en pasos. En cada paso, el programa está
especificado con más detalle. Evidentemente, la notación utilizó tendría que
ser convenido a el problema tanto como sea posible, pero necesite no
suponer la máquina-aspecto legible de una lengua formal. Pueda muy bien
tomar la forma de un flujo-esquema, una fórmula matemática, o incluso una
lengua natural. Aun así, el paso final tiene que producir un programa aquello
ha sido formulado en un lenguaje de programación, un objetivo que
necesariamente influye la dirección del paso entero-por-proceso de
desarrollo del paso. Consiguientemente, es esencial que tal notación ser
introducido en el principio de un curso de programación.
La codificación de un algoritmo en un código de máquina seguro es una
tarea compleja, pero pueda ser bien mecanizó. Herramientas para
automatizar codificación de máquina es allí- fore altamente deseable.
Particularmente útil es una lengua que contiene ali el fundamental y más
frecuentemente encontró conceptos de programar, dejando la expresión de
estos conceptos en una manera clara y natural, y que también permite un
ordenador económico y eficaz procesamiento. Esfuerzos para diseñar tales
lenguas tanto el programador y la máquina orientados-era a menudo
influido por una área concreta de aplicación, un tipo disponible de com-
puter, o ambos. El tema de matemática numérica era predestined para el
diseño de tal lengua, desde entonces deje en gran medida la adopción de
tradicional y notaciones formales probadas de matemáticas. Estas ideas
eran primero perseguidas y formulados en 1952 por H. Rutishauser, pero
encontraron uso y aceptación extendidos sólo después de que 1957,
cuándo IBM publicó un lenguaje de programación llamó FORTRAN y liberó
un compilador (Traductor de Fórmula) aquello tradujo programas
automáticamente a código de máquina. Esto hizo el uso de tal lengua tanto
teóricamente interesando y prácticamente factible. Aun así, la forma de
FORTRAN era evidentemente orientado a un tipo seguro del ordenador
fabricado por IBM. La lengua era por tanto
Organizado y definido en una manera que habitación izquierda para
mejora.t
En 1958 las ideas originales de H. Rutishauser Estuvo tomado arriba por
un inter- grupo nacional de expertos y condensados a la definición de un
programa- ming lengua. se apellide ALGOL (para Lengua Algorítmica) y
devenía el predecesor de la lengua ALGOL 60, el cual era posteriormente
ampliamente utilizado en aplicaciones científicas. ALGOL 60 estuvo definido
en 1960 por un inter- grupo nacional de 13 científicos y editados a un
informe por P. Naur. 1 Un de

t U.S.A. FORTRAN Estándar, Estándares de EE.UU. Inst., Nueva York, 1966.


1
P. Naur, "Informe Revisado en la Lengua Algorítmica ALGOL 60," Comm. ACM 6 (1963), 1-17;
Comp. J. 5 (1962-1963), 349-367; Numer. Matemática. 4 ( 1963), 420-453.
R. Baumann, M. Feliciano, F. L. Bauer, y K. Samelson, "Introducción a ALGOL ", Prentice-
Sala, Inc., 1964.
SEC. 7.1 ENCUESTA 31

Las características que favorably distingue ALGOL de FORTRAN es que el


anterior es precisamente y concisely definió por un documento relativamente
corto; y en vez de ser orientado hacia un ordenador concreto, ALGOL adopta
en gran parte la notación matemática ya familiar a científicos e ingenieros.
Para definir el syntactical reglas, un formalismo estuvo introducido aquello
deja uno para determinar algorithmically si un seguro construye es una frase
legal de la lengua. Esta notación, sabido como Backus-Naur-Formalismo
(BNF), era más tarde utilizado en la definición de otros lenguajes de
programación..
Esfuerzos similares a postulado un problema común-la lengua orientada
estuvo emprendida en el área de procesamiento de dato comercial. Bajo los
auspicios del U .S. Departamento de Defensa, el lenguaje de programación
COBOL (Negocio común Lengua orientada) estuvo desarrollado en 1962.tt
sea tailored a las necesidades, áreas de problema, y hábitos de expresión de
programa- mers en procesamiento de dato comercial. Hoy, COBOL es
un-si no el- más lengua utilizada frecuentemente, pero los rangos incluso más
bajos que FORTRAN en tales aspectos como definición precisa, estructura
sistemática, y aplicabilidad general. Un resultado negativo de el spread
rápido de estas lenguas tempranas era la división de programar a
aplicaciones científicas y comerciales. Porque la programación estuvo
considerada para consistir principalmente de algoritmos de codificación en una
lengua concreta, la idea que tan-llamado programadores científicos y
comerciales tendrían que ser entrenados por separado devenía ali demasiado
común. De hecho, aun así, las ideas fundamentales de diseño de programa y
el elemental
Objetos para ser procesados es bastante independiente de cualquier área de
aplicación.
Un esfuerzo para "reunir" los dos campamentos por una lengua común
estuvo hecho por IBM entre 1964-1967: una lengua estuvo definida y
posteriormente apoyado aquello estuvo supuesto para ser no sólo
independiente de cualquier ordenador particular pero también
uniformemente aplicable a cualquier área de problema. Devenga sabido
como PL/1. La lengua él así como su descripción ha supuesto dimensiones
notables, y PL/ parece para ser enfermo convenido como introducción básica a
programación debido a su sheer medida (impidiendo la posibilidad de
maestría completa) y su carencia de una estructura sistemática con un
unificando concepción subyacente.
Siguiendo la idea que un curso de programación principalmente tendría
que enseñar el diseño de algoritmos y únicos secondarily ser preocupados
con aspectos de codificación, escogemos aquí una notación que no es idéntico
a cualquiera de el anteriormente mencionó lenguas. Esté diseñado
específicamente a espejo el más funda- conceptos mentales de programas en
un naturales, perspicuous, y forma concisa. Además, sus reglas sintácticas
son sencillas, sistemáticos, y propio para coche- matic procesamiento. La
notación está diseñada y definido como cercano approxima- tion a ALGOL 60,
así que apropiadamente se pueda apellidar una extensión de ALGOL
60.2 introduciremos elementos concretos de la lengua en orden lógico-

tt U.Estándar de S.A. COBOL, Estándares de EE.UU. lnst., Nueva York, 1968.


2
N. Wirth, "El PASCAL de Lenguaje de programación," Acta lnformatica, 1 (1971), 35-63.
32 CHAP. 7. LENGUAJES DE PROGRAMACIÓN Y NOTACIÓN SECUENCIALES.

Siempre que los conceptos correspondientes devienen pertinentes a el ser


subject hablado. Consiguientemente, sólo las reglas generales que definen el
sintácticos struc- ture de las lenguas serán habladas aquí.
Cada lengua está basada en un vocabulario. Frases en este caso,
programas-está compuesto por concatenar símbolos básicos de este vocabu-
lary según las reglas sintácticas de la definición de lengua. El vocabulario3
normalmente consta de letras, dígitos, y símbolos especiales (p. ej.,
+, - , * ). Because the set De símbolos especiales is normalmente dejare
large in pro- gramming lenguas, las palabras inglesas naturales son a menudo
utilizadas para denotarles para aumentar readability. Para hacerlo claro, aun
así, que estas palabras (palabra llamada-delimitadores) no es una secuencia
normal de letras pero un símbolo básico, normalmente aparecen en tipo de
negrita (p. ej., empieza, fin).
La sintaxis (ve Apéndice Un) está formulado en una manera que deja uno
para verificar fácilmente si una secuencia dada de símbolos es una frase
correcta de la lengua. Las reglas toman la forma de flujo-esquemas y se
apellida sintaxis-esquemas. Los caminos posibles representan las secuencias de
símbolo posibles. Empezando con el esquema labeled "programa," un
camino es traversed cualquiera por transferir a otro esquema, si un
rectángulo está encontrado, o por leer el símbolo básico S, si un círculo que
encierra S está encontrado. Por ejemplo:.

Letra

(7.1) Letra

Dígito
Identificadores

De esquema (7.1), las secuencias siguientes de letras y dígitos (entre


muchos otros) emerge identificadores tan posibles.
Un
abcdef
un15
q2p9
Appollo
En cambio, el siguiendo claramente no puede ser clasificado como
identificadores,
Palabra-delimitador
J. F. Kennedy
7x
3
El vocabulario completo para la notación de PASCAL está listado en Apéndice Un.
SEC. 7.2 EXPRESIONES Y DECLARACIONES 33

7.2 EXPRESIONES ANO DECLARACIONES

La sintaxis de una lengua define segura oracional construye. Entre el más


importante es la expresión y la declaración, los cuales son presentes en
prácticamente ali lenguajes de programación..
Una expresión es una fórmula o regla de computación que siempre
especifica un va/ue o resultado. Una expresión consta de operandos y
operadores. Los operandos son cualesquier constantes (p. ej., números),
variables, o los valores generaron por funciones. Los operadores son
normalmente clasificados como monádicos o diádicos, habiendo un o dos
operandos, respectivamente. Si severa! Los operadores ocurren en una
expresión, la secuencia de su ejecución tiene que ser especificada. Esto
puede ser hecho cualquiera por paréntesis explícitos o por reglas
implícitas de la lengua. En más Ianguages, los operadores diádicos son más
lejanos subdivided a (al menos) dos clases: aditivo y multiplicative
operadores. El último está dado una prioridad más alta o fuerza obligatoria.
Además, supondremos que secuencias de operadores de la prioridad igual
siempre será ejecutada en orden de izquierdo a correcto. Estas reglas
sencillas están ilustradas por los ejemplos siguientes.

x+y+z = (x +y)+ z
X* y+Z = (x *y)+ z
X+Y* z = X+ (y* z)
x - y* z - w = (x - (y* z)) - w (7.2)
X*Y-Z*W = (x *y) - (z * w)
-X+y/z = (-x)+ (y/z)
X* y/z = (x *y)/z
x/y *z = (x/y) *z

La forma más elemental de declaración es la declaración de


asignación. Está representado por

V:= E (7.3)

Dónde Vdenota un variable y E una expresión. Mientras que una expresión


tiene un valor, una declaración tiene un efecto.
Secuencias de declaraciones (declaraciones compuestas), condicionales, y
repeti- tive las declaraciones están expresadas por construye llamado estructuró
declaraciones.Introduciremos seis formas básicas de frecuentemente
ocurriendo composite declaraciones. Su significado está descrito por el flujo
equivalente-esquemas.
34 CHAP. 7. LENGUAJES DE PROGRAMACIÓN Y NOTACIÓN SECUENCIALES.

Declaraciones
compuestas
Empieza SI; S2;... ; Sn (7.4)
Fin

-0-0- ... -GJ-


El separator ";" es un sequencing operador; causa el subsiguiente estatal-
ment para ser ejecutado sólo después del precediendo un está rescindido.
Los símbolos básicos empiezan y el fin representa "paréntesis" gordos o el tan-
paréntesis de declaración llamada. Desde secuencias de las declaraciones a
menudo suponen una longitud textual considerable, es apropiado de utilizar
altamente paréntesis visibles para enfatizar la agrupación de las declaraciones
de componente.

Declaraciones condicionales

Si B entonces SI más S2 si Bthen S

(7.5)

La segunda forma puede ser considerada para ser una abreviatura de el


primer en qué el alternativo S2 es vacío.
La función de los paréntesis de declaración está ilustrada por el
ejemplo siguiente:

Si B entonces SI; S2 (7 .6.1)

Denota el mismo programa cuando

Empezar si B entonces SI fin; S2 (7.6.2)

Pero no igual cuando

Si B entonces empezar SI ; S2 fin (7 .6.3)


SEC. 7.2 EXPRESIONES Y DECLARACIONES 35

Declaraciones repetitivas
Mientras B hacer S repetir S hasta B

Nota: Desde los dos símbolos básicos repiten y hasta que ya constituir un
par de paréntesis, la forma.
Repite SI; S2; .......... ; Sn hasta B
Es admisible sin un adicional empieza par de fin.
Declaraciones selectivas
Caso i de LI :SI; L2:S2; .......... ; Ln:Sn fin

(7.8)

En caso la expresión i tiene el valor Lk , la declaración Sk está seleccionado y


ejecutó ; L ¡ # Li for i # j. Nota: Si S ¡ = Si = • • • = Sk , we nose the notación L¡,
Li, Lk:S como n abreviatura.
36 CHAP. 7. LENGUAJES DE PROGRAMACIÓN Y NOTACIÓN SECUENCIALES.

Cuando en flujo-notación de esquema, anotación de un programa por


comentarios y aserciones tendría que ser fácil. Para este propósito,
introducimos la convención que cualquier texto encerrado por curly tirantes
{ y } tendría que ser considerado un comentario­ no ejecutable y por tanto
puede ser ignorado por un procesador. Ahora deviene posible de expresar la
verificación elemental derivation reglas en plazos de programa schemas en
notación lineal.4 La forma común es
{P} S {Q}
Dónde P es el antecedente y Q el consiguiente de declaración S.

en notación lineal
Reglas de verificación
1. Declaración de asignación
{Pq v:= w {P}
(Ve 5.6.1.)
2. Declaración compuesta
Preconditions: {P} SI {Q} (7.10)
{Q} S2 {R}
Consecuencia: {P} SI; S2 {R}
3. Declaraciones
condicionales
Preconditions: {P /\ B} SI {Q} (7.11)
{ P /\ -.B} S2 {Q}
Consecuencia: {P} Si B entonces Sl más S2 {Q}
Preconditions: {P /\ B} S {Q} (7.12)
(P /\ -.B) => Q
Consecuencia: {P} Si B entonces S {Q}
4. Declaraciones
(7.13)
repetitivas {P /\ B} S {P}
Precondition:
Consecuencia:
{P} Mientras B S {P /\ -.B}
{Q}
{P} S (7.14)
Preconditions: {Q /\ -,B} s {Q}
Consecuencia: {P} Repite S hasta B {Q /\ B}
5. Declaración selectiva {P /\ (i = Ld} sk {Q} Para ali
Preconditions:
Consecuencia: {P} k caso i de (7.15)
LI :SI;
L2:S2;

Ln:Sn Fin {Q}


(Los controles de consecuencia sólo si i = Lk para sorne k.)
4
C. Un. R. Hoare, "Una Base Axiomática para Programación de Ordenador," Comm. ACM 12
(Oct. 1969), 576---583.
SEC. 7.3 PROGRAMAS SENCILLOS EN NOTACIÓN SECUENCIAL 37

7.3 PROGRAMAS SENCILLOS EN NOTACIÓN


SECUENCIAL

El notational los dispositivos introdujeron tan lejos ahora puede soler


expresar los programas hablados en capítulos anteriores en plazos de
programa secuencial­ ming lengua.
Multiplicación de dos números
naturales (cf. 5.15)
beginz:=O;u:=x;
Repite { z + u * y = x * y, u > O}
z:= z+y;u:= u-1 (7.16)
untilu = O
Fin

lnteger División de dos números


naturales (cf. 5.16)
Empieza q=:O; r : = x;
mientras r � y
hacer = y}
Empieza { q * y + r x, r � (7.17)
r:=r-y;q:= q+ 1
fin
Fin

Multiplicación de dos números


naturales (cf. 5.17)
beg En z := O; u:= x;v := y;
whileu# O Hacer
Empieza{z + u* v = x * y, u > O}
:
si extraño(u) entonces z=z+ (7.18)
v; = =
u : u div 2 ; v : 2* v
Fin
{z = x*y}
Fin

Computación del más grande común divisor (cf.


5.18)
Empieza = x; b = y; Un: :
Mientras un# b hacer
Si un > b entonces un := un - b más
b:= b - un (7.19)
{GCD(Un,b) = GCD(x,y)}
{GCD(x,y) = un = b}
Fin
Nota que con la ayuda de convenciones de sangría adecuada, la
estructura del algoritmo deviene visiblemente aparente en el programa.
En particular,
38 CHAP. 7. LENGUAJES DE PROGRAMACIÓN Y NOTACIÓN SECUENCIALES.

Las declaraciones que pertenecen a la misma entidad estructural tendría que


ser indented por la misma cantidad, y por la misma técnica, la
correspondencia de de apertura y cerrando los paréntesis tendrían que ser
hechos fácilmente reconocibles.
Programas (7.16) y (7.18) computa los mismos resultados pero diferir
en la cantidad de computacional ejfort necesitó llegar en aquellos resultados.
Una medida de este esfuerzo puede ser obtenida por contar el número de
operaciones principales necesarias de cada tipo. Programa (7.16) requiere
dos adiciones y dos asignaciones para cada repetición. Si denotamos el
esfuerzo de una adición por un y el para una asignación por z, entonces el
esfuerzo total necesario para la multiplicación según (7.16) es
2z + 2(z + un)* x (7.20)
Para cada repetición, programa (7.18) requiere uno plegando, un halving,
una prueba para incluso o extraño, y cualquiera dos o tres plus de
asignaciones un addi- tion. Esta separación de dos casos hace una
especificación exacta de el esfuerzo como función de los operandos bastante
difíciles. Es fácil, aun así, para indicar el peor y los casos mejores y, más
importantly, para observar que debido a el halving de u durante cada
repetición, el número máximo de repeticiones es registro2 (x) + l
(redondeado arriba). El total (caso peor) el esfuerzo entonces deviene
3z + registro2 (x)* (3z + un + 2h) (7.21)
Desde los ordenadores que utilizan un binarios interna) la
representación de números puede ejecutar multiplicaciones y divisiones por
2 y pruebas para incluso/extraños muy deprisa (i.e., h S un), programa (7.18) es
superior a (7.16) incluso para pequeño x. Es allí- fore preferido en ali
practica) aplicaciones.
Programa (7.22) representa una mejora sobre el algoritmo de división
(7.17), el cual está basado en el mismo principie. Con la ayuda de las
invariantes dadas, el correctness del algoritmo mejorado fácilmente puede
ser estab- lished, y al mismo tiempo, el modo de operación deviene
evidente. q, r, y w es variables con números naturales como valores.
Programa para dividir el número natural x por y

Empieza=
r : x; q : = O; w : y;
Mientras w� r w : = 2* w;
{w=2n *y>x}
=
Mientras w # yhacer
Empieza {q* w + =
r x, r � O} (7.22)
q : = 2* q; w : w div 2;
if w �r entonces
Empieza r : = r - w; q : =q +
=yo
Fin
Fin
{q* y+ r = x, O�r < w; q = xdiv y}
Fin.
SEC. 7.3 PROGRAMAS SENCILLOS EN NOTACIÓN SECUENCIAL 39

La reducción de computar el esfuerzo es otra vez debido a la técnica de


ingeniar un paso que necesidades de ser repetidas únicos logz(x/y) + 1 en vez
de x/y tiempo.
Por reemplazar repitió sustracciones por divisiones, programa (6.2), el
cual computa el más grande común divisor, también puede ser modificado
a una versión más eficaz. Para simplificar la notación, introducimos el
operador mod, cediendo el resto de la división de entero con los mismos
operandos x y y; aquello es,

(x di v y)* y + (x mod y) = x (7.23)


'---v----' '---v----'
Resto de cociente

La sustracción repetida

Mientras un � b un : = un - (7.24.1)
b

Entonces puede ser reemplazado por la asignación


(7.24.2)
sencilla

Un: = un mod b

Programa (6.2) escrito en notación de serial cuando indicado en (7.25), es


así transformado a programa (7.26).

Empezar=
un: = x; b: y;
Repetir {un> O, b > O}
Mientras un > b un := un - b;
Mientras b > un b : = b- (7.25)
Hasta un
un;
=b
Fin. {Un= b = GCD(x,y)}

Empezar=
un : = x; b: y; u
O
b ={un> n
Repetir O, b > O}
t
= un :
Si un � b entonces un mod b;
i
{O�Un<b
} l

i
f Un > O entonces b: = b modun más
Excambio(un, b)
{Un = GCD(x,y)} (7.26)
Fin.
40 CHAP. 7. NOTACIÓN SECUENCIAL ANO PROORAMMING LENGUAS

Esta versión de computar el más grande común divisor estuvo inventado por
Euc/id y es uno de los ejemplos sabidos más tempranos de un matemáticos algo-
rithm. Es normalmente citado en el equivalente foi:m (7.27).

Empezar un:= x; :=b y;


Repetir un : = un mo d b; Intercambio(un, b)
Hasta = que b (7.27)
O
Fin. {Un=
GCD(x,y)}

La verificación es fácil utilizando relación (7.28).

x > y: GCD(x, y) = GCD(x mod y, y) (7.28)

EJERCICIOS

Determinar cuál de las secuencias de símbolo siguientes constituye números,


con- stants, variables, factores, plazos, expresiones, o declaraciones según la
sintaxis-los esquemas dados en Apéndice Un. Nota la clasificación de operadores
a tres conjuntos con prioridades diferentes.
Operadores relacionales =# <� �>
operadores aditivos + - V
multiplicative operadores * / div mod /\

Números 0.31 + 237.2 3.5 - 0.005


4.555 3+5 3E5 Dos
33,75 .389 IEOO 15
Yo0E-4 1.5 + 2 00037 3,250
Constantes 100 cierto + 15.5 Rojo
'U Nueve 9/5 '*'
Factores n'
X Un[i] x+y B[i,j]
de B[i, j] pecado(x) p pVq
variables X *Y x-y exp(y * ln(x))
Plazos (x) x-y (x - y)
Declaracione X 2 un=b +X*Y
(x) (x� y) /\ (y < z) p<q/1.r<s Cierto
s de

expresiones Un : = b un := 2 2 :=
=
unpecado(x * y) empieza un : 1
fin
Si un= 2 entonces un := un + 1 más P(x, y)
whilea > 0doa := un - acabo
if x < y Entonces; z := cierto; else z: = falso
repeatz := z + 1.5, y:= u- yo untily = O
EJERCICIOS 41

7.2 Evaluar las expresiones siguientes.

2*3-4*5
15div4*4 80/5/3
2/3* 2

Entonces describir las expresiones siguientes en el Ianguage definió por la sintaxis en


Apéndice Un.

Un z - e+ ª
b*c + -c -
d + <!_
f

-b + jb2 -
4ac 2un

Yo 1
� +b
c+d

7.3 Ejecutar los programas indicaron con el especificó valores de x y y y establecer una mesa
de rastro.

Programas (7.16) y (7.18):


(x, y) = (3, 5), (2, 11), (10, 8), (19, 2)

(b) Programas (7.17) y (7.22):


(x, y) = (83, 15), (117, 9), (23, 27), (1191, 37)
(c) Programas (7.19), (7.25), y (7.27):
(x, y) = (84, 36), (36, 84), (770,441), (15, 15)

7.4 Determina superior y más bajo bounds para el número de operaciones necesarias (como
funciones de x y y) en programa 7.22. Entonces determinar las aserciones necesarias y
suficientes para verificación de el programa.
42 CHAP. 7. LENGUAJES DE PROGRAMACIÓN Y NOTACIÓN SECUENCIALES.

7.5 Traduce flujo-esquema (7.29) a notación de serial. Nota que el programa com-
putes el más grande común divisor GCD(x,y) y dos multipliers e y d de modo que.

e* x + d• y= GCD(x,y)
Determinar las aserciones necesarias y suficientes para verificación de programa.

Un •= x e •= O u •=
bl •= y d •= l V •= o
q•= un div h r •= un
mod h

---------------· --- Un= q•b


+r

- -b = GCD(x,y)
+
=c*x+d*y

Un,= b b •=
r

t •= u u •= e e •= t - q * e

t •= V V •= d d •= t - q * d

(7.29)
q•= Un div b r •= un mod
b
7.6 Construir un programa, anotado con las aserciones necesarias para verificación,
aquello computa GCD(x, y) sólo en la base de las relaciones siguientes.
(Un) GCD(2 * m, 2 * n) = 2 * GCD(m, n)
(b) Extraño(n): GCD(2 * m, n) = GCD(m, n)
(c) m > n: GCD(En - n, n) = GCD(m, n)
(d) GCD(n, m) = GCD(m, n)
(e) Extrañ o(m) /\ extraño(n): ,extraño(m-n)

Uso sustracción única, comparación, halving y plegando operaciones.


EJERCICIOS 43

7.7 Entre las condiciones P, Q, y R, exactamente uno está satisfecho en ali tiempo. ( se
apellidan mutuamente condiciones exclusivas.) La probabilidad que P es satisfecho es
W p. (WQ Y W R está definido análogamente.) Determina el valor esperado de neces- sary
evaluaciones de P, Q, R como funciones de W p, WQ, WR en el siguientes estatales-
ments:

(a) Si P entonces Un más si Q entonces B más C


(b) Si Q entonces B más si R entonces C más Un
(e) Si R entonces C más si P entonces Un más B

Cuál de las tres declaraciones equivalentes está seleccionado si Wp > WQ > WR?

Ejemplo: P = (x > y ), Q = (x = y), Wp y )


= 0.5, WQ = 0.3, WR
R
= (x < ;
0.2
=
Generalizar la regla obtenida al caso con n mutuamente condiciones exclusivas
8 TIPOS de DATO

En Capítulo 5 hablamos cómo la especificación explícita de ali variables


en el encabezando de un programa-una parte esencial de su
documentación- contribuye significativamente al programa readability. La
introducción de una variable nueva, en particular, tendría que ser
acompañado por la especificación de su gama de valores posibles. hay
severa! Razones importantes para estas recomendaciones.

l. Conocimiento de la gama de los valores de variables es esenciales en


comprensivos un algoritmo. Sin especificación explícita, es
normalmente difícil de determinar la clase de objetos que una variable
representa, por ello haciendo el descubrimiento de programar
equivocaciones más tediosos.
2. En más casos, la conveniencia y el correctness de un programa es depen-
abolladura en la gama de valores de sus argumentos. Por lo tanto la
especificación de gamas de valor es tanta una parte de
documentación de programa cuando es una explicación de los
resultados.
3. El número de unidades de almacenamiento necesitó representar una
variable en un ordenador depende de la medida de su gama de valor.
(Por ejemplo, si la medida de aquella gama es n, entonces registro 2 (n) los
bits están necesitados.) Para actuar el almacenamiento necesario
un!Ubicación, un compilador tiene que saber las variables' gama de
valores..
4. Los operadores que aparecen en las expresiones son normalmente
definidas sólo para gamas de valor seguro de sus argumentos.
Utilizando especificó gamas de valores, un compilador puede
comprobar si especificó las combinaciones de operadores y operandos
son permisibles, así detectando errores de programación. Al respecto, la
indicación de gamas de valor representa una redundancia que puede
soler control propiedades seguras del programa.
5. La implementación de los operadores a menudo depende de la gama de
valores de sus argumentos permisibles. En tales casos, conocimiento de
la gama de valores es absolutamente necesario en obtener un
apropiado, eficaz

44
El DATO ESCRIBE 45

Representación del programa. La representación de números y la


implementación de operadoras de aritmética es un ejemplo típico; la
elección de instrucciones de máquina para ejecutar una operación de
aritmética normalmente depende de si su gama de argumentos sobre
números reales o sólo sobre enteros.

El conjunto de valores que una variable puede suponer juegos tal una
función importante en la caracterización de el variable que se apellida su
tipo. Por tanto recomendamos que ali variables ser declarados en el
encabezando de un programa. Tal variable declaration está denotado por

var v: T (8.1)

Dónde v es el identificador de la variable nueva y T es su tipo. Si severa! vari­


ables De el mismo tipo está declarado, la forma corta

(8.2)

Dónde v1 , • • • , vm es los identificadores variables declarados, es aplicable.


Declarando ali identificadores en el encabezando de un programa tiene
la ventaja adicional de habilitador un compilador para comprobar si cada
identificador en el programa ha sido declarado. Si no (debido a keypunch
errores, misspellings, etc.), el compilador puede hacer el programador
consciente de esta equivocación en vez
de introducir otra variable con el misspelled nombre. Otra vez, la
redundancia de el texto de programa suele seguridad de programación del
aumento. Dos cuestiones ahora surgen: cómo puede un tipo de dato ser
apropiadamente intro­ duced a un programa, y cómo puede tipos de dato
ser oportunamente representados en tiendas de ordenador? El primer paso es
para distinguir clases seguras de tipos de datos. El más importante, la
distinción sola es si los valores de un tipo están estructurados. Si un valor es
unstructured (i.e., no decomposable a com­ ponents), entonces se apellida
un mar/ar. En este capítulo introduciremos tipos escalares únicos, deferring
la idea de estructuró tipos a Capítulos 10 y 11..
La forma general de una definición de tipo es

Tipo t = T (8.3)

Dónde t es el identificador nuevamente introducido y T es una descripción de


aquel tipo. Un tipo escalar está descrito por una enumeración de sus
componentes. El nota­ tion

(8.4)
46 CHAP. 8. TIPOS de DATO

Está utilizado para este propósito. Tal definición introduce el identificador


de tipo, t, un s well un s the n identificadores constantes, w 1 ,
• • • , wn - Ejemplos of

scalar definiciones de tipo son


Color de tipo= (rojo, amarillo, verde, azul)
Traje de tipo = (diamante, corazón, pala, club)
formade tipo= (triangular, rectangular, circular)
estado de tipo = (así que/id, /iquid, gaseoso)

Nota que si las variables son de un tipo cuyo explícito nombrando es


superfluous, entonces el tipo puede quedar anónimo por combinar el variable
declaration (8.2) y la definición de tipo (8.4) a
(8.5)
En nuestra notación de programación, elementos de conjuntos de valores
no sólo ser distintos pero también ordenó. Los axiomas siguientes son
postulated para cualquier tipo escalar, t, cuando definido por (8.4).

l. w; -:/- wi for i -:/- j (distinctness)


2. w; < wi for i < j (Ordenando) (8.6)
3. Único w1 , . . . , wn es valores de tipo t.
La existencia de ordenar lo hace ambos posible y deseable de introducir el
sucesor y funciones de predecesor.
succ(w;) = W;+ 1 Para i = 1, ..., n
(8.7)
pred(w¡) = W;_ 1 -1
for i = 2, ..., n

Si un programa requiere la inclusión de severa! Definiciones de tipo


escalar, entonces adheriremos a la regla que cada identificador constante ser
declarado sólo una vez, así habilitándonos a singularmente inferir from cada
identificador constante el tipo de valorar que denota. Combinaciones de
definiciones de tipo de la clase
Tipo warmcolor = (rojo, amarillo, verde) (8.8)
coldcolor = (verde, azul)

Tendría que ser evitado porque dejan el tipo de sorne constantes (en este
caso, el verde de color) ambiguamente definió.*
Los tipos escalares seguros están utilizados tan frequently que ambos
ellos y su.
Los operadores son presentes en cada sistema de ordenador. Estos tipos, tipos
estándares llamados, necesita no ser definido en un programa porque está
supuesto que son sabidos por cada procesador. Incluyen los valores de
verdad lógicos, la totalidad.
• Las ideas de la unión y la intersección de tipos han sido evitadas intencionadamente.
SEC'. 8. J ESCRIBE BOOLEANO 47

Y los números reales, y un conjunto de (imprimible) caracteres. Están


utilizados tan frecuentemente que sus constantes (excepto los valores lógicos,
ve Sección 8.1) es denotó no por identificadores pero por syntactically
distintos construye. Ahora hablaremos los cuatro tipos estándares
principales.

8.1 El TIPO BOOLEANO

El tipo Booleano denota la gama de logica! mlues Aquello consta de el


twoelements, cierto y.Falso. Está nombrado después de theoriginator de Iogical
cálculo,
George Boole (1815-1864), y está definido cuando
Abucheo de tipo/ean = (falso, cierto) (8.9)
Los operadores estándares siguientes están definidos en argumentos de este
tipo.
V Iogical inclusive O
/\ Iogical ANO
, Iogical NO
Argumentos Booleanos dados p y q , los valores de las expresiones p V q,
p /\ q, y , p está definido en mesa (8.10).

p q pVq p /\ ,p

q
.Falso
.Fals .Falso .Fals Cierto
(8.10) o
o
Cierto .Fals Cierto .Fals .Fals
o o o
De esta mesa, podemos derivar relaciones (8.11)-(8.14). Estas relaciones son
.Fals Cierto Cierto .Fals Cierto
útiles en muchos casos,
o particularmente cuándo
o un más sencillos pero la
forma equivalente quieta de una expresión dada está.Fals
Ciert Cierto Cierto Cierto buscada.
o o
l.pVq=qVp
Commutative Leyes (8.11)
p /\ q= q /\ p
2. (p V q) V r = p V (q V r) (8.12)
Associative Iaws
(p /\ q) /\ r = p /\ (q /\ r)
3. (p /\ q) V r = (p V r) /\ (q V r) Distributive Leyes (8.13)
(p V q) /\ r = (p /\ r) V (q
/\ r) de las leyes de
4. ,(p V q) = ,p /\ ,q (8.14)
, (p /\ q) = , p V , q Morgan
48 CHAP. 8. TIPOS de DATO

Cuando definido, el operador V tiene menos prioridad que Un, el cual, en


vuelta, tiene menos prioridad que 7. Por ejemplo, 7p V q Un r está leído
cuando (7p) V (q Un r).
Ali los operadores relacionales ceden un resultado de escribir Booleano. La
expresión x = y, por ejemplo, tiene el valor cierto si x equalsy otherwise,
falso. Los operadores relacionales comunes son =, -:f., <, � , �, >, pero el
últimos cuatro son evidentemente aplicables únicos a ordenados (i.e.,
escalares) tipos. El siguiente rela­ tionships control entre estos operadores.
7(x = y)
x� y +-+ (x < y) V (x = y)

x� y 7(x < y) (8.15)


x> y +-+ 7(x < y) Un 7(x = y)

Con la ayuda del lógico connectives Un, V, y 7, los seis operadores


relacionales por tanto pueden ser expresados en plazos de = y sólo.. <

8.2 ENTERO de TIPO

Este tipo representa el conjunto de números enteros. Los operadores


siguientes están definidos y supuestos para ser disponibles en un sistema de
programación dado.
+
Sustr
acción de
adición
* Multiplicación
div División de entero
mod Resto de división de entero
Cada sistema de ordenador especifica un subconjunto seguro de los
números enteros (i.e., los que Iie dentro de límites seguros) de modo que
pueden ser directamente y efficiently procesó por su unidad de aritmética.
Consiguientemente, entero de tipo denota el conjunto de números que está
definido por un ordenador dado. Naturalmente, estos Iimits variará de un
ordenador a otro. Más importantly, los axiomas de aritmética normales no
pueden ser aplicados en general a ordenador arith­ metic. No aguantan en
casos donde el resultado cierto de unas mentiras de operación fuera de la
gama finita dada de valores. Para caso, si un sistema seguro especifica
entero de tipo como el conjunto de números enteros con valor absoluto
!xi � max Y si denotamos el ordenador-adición implementada por EB, entonces

xEBy=x+y

Controles sólo si !x + y¡ � max. Consiguientemente, el normal associative ley


de la adición no es generalmente válido para adición de ordenador.

(x EB y) EB z = x EB (y EB z)
SEC. 8.3 TIPO CHAR 49

Está satisfecho sólo si ambos Jx EB yJ �max y Jy EB zJ �max. Por sustituir


valores y encuadre max = 100, vemos que p. ej.
60 EB (50 EB (-40)) = 60 EB 10 = 70
Mientras que el resultado de evaluar
(60 EB 50) EB (-40)
No es definido. Al principio mirar esta situación parece bastante
desesperada. Pero recordar que la gama de números enteros encima más
los ordenadores es bastante grandes comparados con los requisitos de más
problemas, así que el caso de demasiado grande y por tanto undefined
resultados (desbordamiento llamado) raramente ocurre. Nunca- theless, un
requisito mínimo para cada sistema de ordenador es para proporcionar un
aviso signa! Aquello rescinde la computación si un desbordamiento
ocurre- continuación con resultados sin sentido difícilmente sentido de
marca. Aparte de el fenómeno de desbordamiento, aun así, ali operaciones en
los argumentos de entero de tipo están supuestos para ser exactos.
En muchos casos, las variables seguras supondrán valores sólo dentro de
un intervalo concreto. Esta información entonces tendría que ser reflejada en
la definición del tipo de la variable por explícitamente indicando el intervalo
pretendido. Tal tipo, llamó un subrange tipo, está definido cuando
Tipo t = min .. max (8.16)
Las constantes min y max denotar los límites de el intervalo o subrange.
Subrange Las definiciones a menudo realzan considerablemente el
perspicuity de pro- gramos. Naturalmente, el entero de tipo él es un
subrange; sus límites están definidos por el ordenador particular o ser de
sistema del compilador utilizaron.

8.3 TIPO CHAR

Este tipo denota un finito, ordenó puesto ofcharacters. Tan define una
gama segura de processable números, cada sistema de ordenador también
define un conjunto de caracteres a través de qué comunica con el mundo
exterior. Estos caracteres son disponibles en su entrada (lectores) y
producción (impresoras) equipamiento. Una estandarización de conjuntos de
carácter es altamente deseable, (incluso indispensable, si varios sistemas de
ordenador son para ser conectados para comunicación mutua, transmisión de
dato, procesamiento de dato remoto, etc.). A pesar de que coordinación
completa en la estandarización de conjuntos de carácter parece para ser un
objetivo esquivo, ha sido generalmente estado de acuerdo que conjuntos de
carácter para ser utilizados por sistemas de ordenador comprenderán las
26 letras latinas, el 10 árabe decimal dígitos, y un número seguro de
caracteres especiales como marcas de puntuación. Además, un carácter pone
definido por la Organización de Estándares Internacional (ISO) y su variante
americana ASCII (Estándar americano
50 CHAP. 8. TIPOS de DATO

Código para Intercambio de Información) ha obtenido uso y aceptación


extendidos.
El ASCII el conjunto consta de 128 caracteres. Desde entonces 128 = 27 ,
cada carácter puede ser representado o codificado como combinación
única de 7 bits. El mapeo de mordió combinaciones al conjunto de
caracteres se apellida un código; por ello el ASCII el código se apellida un
siete-mordió código (ve Apéndice B).
El ASCII los caracteres están clasificados como control y caracteres
imprimibles caracteres. Los caracteres imprimibles son más lejanos
subdivided a mayúsculas, lowercase letras, dígitos, y caracteres especiales.
Una distinción más lejana está hecha entre el lleno y el restringido ASCJ l
conjuntos. El último, el cual excluye lowercase letras, está utilizado encima
muchos comercialmente dispositivos disponibles. El significado de los
caracteres de control está explicado en Apéndice B; su importancia
principal líes en transmisión de datos. Aquí mencionaremos sólo dos: cr
(retorno de carro) y lf (la línea alimenta). Cuándo el dato está transmitido a
una terminal de impresión, estos caracteres signa! El mecanismo de
impresora a re-.
Posición a principios de una línea nueva.

MESA DE ASCII CARACTERES

o 2 3 4 5 6 7

o nul Da o @ p p
1 soh do 1 U Q U q
2 stx del 2 nB R n r
3 etx dc2 # 3 e s b s
4 eot dc3 $ 4 D e t
T
enq u d u
5 dc4 % 5 E
e V
6 ack nak & 6 F V
f w
7 Bel syn 7 G w G
8 io etb 8 H X
X

bs h
9 lata 9 1 y y
10 ht em * j z j
z
11 lf sub + K [ k {
vt
12 ese < L \ 1 1

13 ff fs M ] m
14 cr qs > N n 7
15 tan rs / ? o o del
si nos

Dos funciones estándares (cuáles dependen de el conjunto de carácter


subyacente) deja el mapeo de conjuntos de carácter a subconjuntos de
números naturales y
SEC. 8.4 TIPO REAL 51

Viceversa. Estas funciones, funciones de transferencia llamada, tiene las


definiciones siguientes.
ord(c) Es el número ordinal de el carácter e en el conjunto de carácter
ordenado. (Utilizando el ASCII mesa,
= ord(c) 16 * x + y si x y y
denotar las coordenadas de el carácter e).
chr(i) Es el valor de carácter con el número ordinal i.
Consiguientemente, las relaciones
chr(ord(c)) = e Y ord(chr(i)) = i (8.17)
control, y el ordenando de el conjunto de carácter está
definido por
(8.18)

Para denotar una constante de tipo char, es consuetudinario a endose el


carácter en apóstrofos (o marcas de mención). Por ejemplo, si un signo de
interrogación está asignado a un variable e de tipo char, entonces esto
está expresado cuando
'?'
e.·-
- .

En los programas en capítulos subsiguientes, no haremos ninguna


referencia a un conjunto de carácter concreto. Aun así, los programas harán
sentido y actuar según sus especificaciones sólo si están aplicados a
conjuntos de carácter con las propiedades mínimas siguientes.

l. El conjunto de carácter tiene que contener el Ietters A-z y los dígitos 0-9.
2. Los subconjuntos de letras y dígitos tienen que ser ordenados y
coherentes. Aquello es, e es una letra sólo si 'Un' � e y e� 'Z', y e es
un dígito si y sólo si 'O' � e y e � '9'.
3. El conjunto de carácter tiene que contener un espacio (espacial), una línea
separator (denotado por eol-significando fin de Iine), y severa! Otros
caracteres, como comas y periodos, los cuales no son especificados en
detalle..

8.4 El TIPO REAL

El hecho que ordenador-las gamas representables de valores son siempre


conjuntos finitos ha particularmente stringent y noticeable consecuencias en el
tratamiento de números reales. En el caso de enteros, sea razonable a
postulado que operaciones de aritmética generan resultados exactos en cada
circunstancia (exceptúa en situaciones de desbordamiento), pero esta
reclamación es imposible de hacer para aritmética con números reales. La
razón es que cada intervalo arbitrariamente pequeño en el eje de números
reales contiene infinitamente muchos valores; el eje real forma un tan-
llamado continuum. En programar, por tanto, el tipo real <loes no
52 CHAP. 8. TIPOS de DATO

Representar un infinito, uncountable puesto de números reales; en cambio,


es un conjunto finito de representantes de intervalos en el reales continuum.
Los efectos de por- formar computaciones con aproximados en vez de los
valores exactos dependen en gran parte en el problema para ser solucionado
y el algoritmo aquello ha sido escogido. En mejor, el computó los resultados
serán aproximaciones , con un error inherente, de los resultados ciertos.
La valoración (una tarea muy difícil) de tales errores, los cuales están
causados por la sustitución de el real continuum por un conjunto finito de
representantes, es el tema de Matemática Numérica. Computaciones en
datos de escribir real se apellida procesos numéricos. En un sentido,
"numérico" es sinónimo con inexact, "" sin cualquier derogative
connotaciones.
Pero es senseless para hacer computaciones sin habiendo sorne knowl-
borde sobre la naturaleza y el grado de imprecisión para ser esperada. A
comprehend e incluso para derivar tales medidas, es necesario de saber la
clase de representación utilizó de verdad números con un número finito de
dígitos. En ordenadores digitales modernos, ha devenido consuetudinario de
utilizar el tan-llamado fioating-representación de punto en qué un número real, x,
está expresado por dos enteros, e y m, cada cual con un número finito de
dígitos, de modo que.

-E<e<E -M<m<M (8.19)

En esta declaración, mis llamó el coeficiente (o mantisa); e se apellida la expo-


nent; y B, E, M es constantes que es característica de la representación. B se
apellida la base de la representación de punto flotante y es normalmente
no 1O, pero un poder pequeño de 2. Un valor dado, x, puede ser denotado por
muchos pares
<m, e). Un canónico o normalizedform está definido por la relación adicional

(8.20)

Si la forma normalizada está utilizada exclusivamente, entonces la densidad de


representantes de intervalos en el reales-numerar disminuciones axiales
aproximadamente exponentially con crecientes lxJ. El intervalo [0.1 : 1 ], para
caso, contiene aproximadamente cuando muchos representantes tan hace
=
el intervalo [10000: 100000]-y exactamente cuando muchos si B 10. La
influencia precisa de esta distribución desigual de representa- tives es
difícil de determinar para un programa dado, !et Sólo en general. Las
operaciones elementales en argumentos de escribir real es por tanto definió
no en plazos exactos, pero en la forma de condiciones mínimas, los cuales
siempre tienen que ser satisfechos independientemente de el subyacentes
aritmética de punto flotante concreta. Estas condiciones pueden ser
declaradas en la forma de axiomas..

Al. El tipo real (denotado por R) es afinite subconjunto de el conjunto R de


números reales.

RcR
SEC'. 8.4 TIPO REAL 53

Un2. Cada número x E R está asociado con un número .x E R Llamó el repre-


sentatiue de x.."
Un3. Cada .x E R Representa muchos x E R, pero el conjunto de representó los
valores es un intervalo coherente en el eje de número real. Aquello es, si
= xr1
< x 2 , .x 1
und .x 2 = r, el n .x = r for ali x 1 � x�x 2. Además,
x E R Implica .x = x
En particular, O y estoy representado exactamente. Aquello es, O E R y yo E
R; por lo tanto=O O e i = l.
Un4. Allí existe un valor, max, tal que los representantes de ali x con Jxl � max es
undefined. La gama de números Jxl � max se apellida la gama de
desbordamiento U. R - U Es coherente.

De Axiomas Un yo-Un4 sigue aquello


X<y implica x~=
< y~
x=y Implica x=y (8.21)
x> y x~=
> y~

Implica

CUANDO. R Es symmetric con respetar a O;


(8.22)
aquello es,

(-x)~ = -(.x)
Axiomas Un6-Un9 postulado un conjunto de propiedades mínimas que tiene que
ser cumplido por la aritmética de un ordenador antes de que se pueda apellidar
"utilizable" sin reserva­ tions. Las operaciones de aritmética básicas habladas es
adición, sustracción, multiplicación, und división, denotad by the símbolos EB,
0, ® und 0,respectivamente. Siempre supondremos x, y E R.
Un6. Commutativity De adición y multiplicación

X EB y=y EB X, x®y=y®x (8.23)


Un7. X � y � o > (x e y) EB y = X (8.24)
Un8. Symmetry De las operaciones básicas con respetar a O
X ey= xE B (- y) =-(y ex)
(8.25)
(-x)®y=x®(-y)=-( x®y)
( -x)0y=x0(-y)= -(x0y)
Un9. Monotonicity De las operaciones básicas
O � x �Un y O � y � b
Implica
xEBy �UnEBb x0b�un0y
(8.26)
x®y�un®b x0b�un0y
54 CHAP. 8. TIPOS de DATO

Como consecuencia de Un9, es enteramente posible que para seguro x


yy
such that O �x< Un und O�y< b,
xE By=Un Et> b or x ® y=un ® b
Pero es imposible aquello
xEB y > Un Et> b o x ® y > un ® b

De Axiomas Al-Un9, los teoremas siguientes, representando


propiedades básicas importantes de una aritmética, puede ser derivado.
y�0 ----> xEf)y� x
x�y ---->
xGy� 0 (8.27)
(x � O) /\ (O �y � 1)
---->
---->
x@y� x
0<x�y x0y� l
xex=O
xEB0=x80=x
x@0=0
x@l=x01=x x0x=l
Nota que el normal associative y distributive las leyes de aritmética son
conspicuously ausentes de axiomas Un yo-Un9. Hay razones buenas para
esta omisión. Primero, mirada en este ejemplo numérico, el cual viola el
associative ley de adición. Está basado en una representación de número
con cuatro dígitos decimales. (El exponente e está implicado en la posición
de el punto decimal.)

X= 9.900 y= 1.000 Z= -0.999


l. (xE By)EBz=10.90EB( -0.999)=9.910 2.
x EB (y Et> z )=9.900EB0.001=9.901

Entonces mirada en este ejemplo numérico (también basado en un


cuatro-dígito aritmética decimal), el cual viola el distributive ley.

X= 1100. y= -5.000 z=5.001


l. (x ® y)EB(x ® z)= - 5500.EB550 l. = 1.000 2.
x ® (yEBz)=1100. ® 0.001=1.100

Las "operaciones" peligrosas son adición y sustracción . Dan aumento a


errores significativos, particularmente si dos valores casi iguales están
restados. En aquel caso, la mayoría de dígitos significativos se cancelan, y la
diferencia resultante pierde un número o posiblemente ali de los dígitos
significativos. Este fenómeno se apellida anulación.
SEC. 8.4 TIPO REAL 55

Pero la operación de división también representa una fuente potencial de


pitfalls. En el caso de pequeño divisors, el resultado puede fácilmente caída
dentro de la gama de desbordamiento. Por tanto, división por cero y la división
por valores "cierra" a cero siempre tendría que ser evitado. Para caso, una relación
de la forma ahs(t/x) � eps no tendría que ser usedin un programa; insteadit tendría
que ser replacedby la división­ forma libre ahs(t) � eps * ahs(x).
Una medida de la precisión de un dado aritmética de punto flotante está
encontrada en la cantidad 1;, el cual está definido como sigue:
,; = min (x 1 (l + x)~ #- 1) (8.28)
x> O
Aquello es, 1; es el número menos positivo tal que los representantes de yo y 1 + 1:
difiere. lf, por ejemplo, un ordenador representa números reales por n dígitos
decimales, su ¡; es aproximadamente 10- 11•
A pesar de que en el sentido matemático los enteros son un subconjunto de
los números reales, es consuetudinario y apropiado de considerar el entero de
tipos y real como disjunto. Para satisfacer el notaiional regla de tierra que el tipo
de una constante tendría que ser aparente de su denotación, supondremos que
un número es de entero de tipo si y sólo si su denotación contiene tampoco un
punto decimal ni un factor de escala (ve Capítulo 7). Ali numera denotado con
cualquier un punto decimal o un factor de escala están supuestos para ser de
escribir real. En programar con objetos reales, hemos adoptado las convenciones
siguientes, adicionales.
1. En un real-expresión valorada, cualquier real-el operando valorado puede ser
reemplazado por un entero-operando valorado. Una función de transferencia
explícita de entero de tipo para escribir real es por tantoinnecesario. No obstante,
el programador tiene que ser consciente del hecho que un compilador tiene
que automáticamente insertar instrucciones de conversión implícita en cada tal
ocurrencia, si el ordenador utiliza diferente interna! Representaciones para
valores de los dos tipos (la mayoría com­ puters ).
2. Si un real-el argumento valorado está utilizado dónde sólo un entero es legal,
entonces una función de transferencia explícita tiene que ser indicada. Como
transferencia estándar func­ tion, hemos adoptado el cuya realización es más
sincera encima existiendo ordenadores, concretamente,
trunc(x)
Cuál representa el entero obtenido por truncar la parte fraccionaria de
x. Los ejemplos son
trunc (5.8) = 5, trunc (4.3) = 4
La función de redondear es ahora expresable cuando

round (x) = { trunc (x + 0.5) para X� 0

- trunc (0.5 - x) para x < O


56 CHAP. 8. TIPOS de DATO

Ejemplo: Solucionando una ecuaci ón cuadrática


Este ejemplo ayudará para hacer los programadores conscientes de las
clases de pitfalls pueden encontrar cuándo tratando aritmética real y a
demonio- strate cómo estos pitfalls puede ser vencido.
El problema consiste ofcomputing las dos soluciones, x yo y x 2 , ofthe
ecuación cuadrática
Un * x2 + b * x + e = O un c;ic (8.29.1)
O
Una traducción literal ofthe fórmula bien sabida
(8.29.2)
-b ± Jb2 -
= X¡ ·2 4ac 2u
n
Cosechas las declaraciones de programa siguientes.
d:=sqrt(sqr(b) - 4* un*e);
x 2 := -(b + d)/(2* un); x 1 :=(d - b)/(2*un)
Un ejemplo numérico con los valores un = 1.000, b = -200.0, y e = 1.000,
ejecutado con un cuatro-dígito aritmética decimal, cosechas
d = sqrt( 40000 - 4.000) = 200.0
X 1 = 400.0/2.000 = 200.0 (8.30)
X2 = 0.000/2.000 = 0.000
Los resultados correctos, aun así, are x=1 200.0 und = x2 0.005. Si
nuestra escala de medir para la calidad de este programa está basada en
exactitud relativa, el n the result x2 mosto be rejected un s being completely
injusticia.
Un algoritmo que tiene en cuenta el pitfalls ofusing una aritmética de
punto flotante con exactitud finita está basada en la relación
x 1 * x 2 = e/un (Vieta) (8.31)
Utilizando (8.29.2), ahora computamos sólo una solución-el con el
valor absoluto más grande. La segunda solución es entonces obtenida,
según (8.31 ), by using only multiplication und division-operacións that
preserva los argumentos' exactitud relativa. Las declaraciones de programa
resultantes son
d := sqrt(sqr(b) - 4 *un* e);
Si b � O entonces xi := -(b + d)/(2* (8.32)
un)
Más xl := (d - b)/(2 * un);
x2 : = c/(xl * un)
Este problema es un ejemplo ofthe relativamente caso frecuente en qué
los métodos matemáticos generalmente enseñados de la solución no puede
ser adoptada sin escrutinio y examen más lejanos, ifthe las soluciones son
para ser obtenidos con la ayuda ofa ordenador.
EJERCICIOS 57

EJERCICIOS

8.1 Cuáles de las expresiones siguientes son syntactically correctos (i.e., "tipo com­ patible")?
Qué es sus tipos? Supone que las variables siguientes están declaradas.

var x, y, z: real; i,j,k: entero

X+Y*i i i mod (j+y) i + j- k


div j + x x+y<i+j
k - trunc(x * i)
i*x+j*y x<y/\y<z X=Í

Indica en cada caso el número de entero necesario , implícito-a-operaciones de


transferencia real.
8.2 programas Completos (7.16), (7.17), (7.18), (7.19), (7.22), y (7.25) por añadir el necesario
variable declarations.

8.3 Design un programa que computa la suma.

1 - 1/2+ 1/3 - 1/4+ · · ·+1/9999 - 1/10000


En las maneras siguientes:
(a) Adición de plazos de izquierdos a correctos,.
(b) Adición de plazos de correctos a a la izquierda,
(c) Adición separada de plazos positivos y negativos, cada cual de izquierdo a correcto,.
(d) Adición separada de plazos positivos y negativos, cada cual de correcto a izquierdo..
Prueba desarrollar severa! Programas para computar las cuatro sumas y pesar su respec­ tive
ventajas y desventajas. Comparar los cuatro resultados obtuvieron por utilizar un
ordenador y explicar sus diferencias.
Pista: Declaraciones de la forma un : = b * ( - yo) tendría que ser expresado en cambio
cuando
Un : = -b. La suma con exactitud de 30 dígitos es

0.693097183059945296917232371458
8.4 Diseño un programa que repetidamente multiplica el complejo variable z por el com­
plex constante e = 0.6 + 0.8i. Un número complejo z = x + iy (i = j"=yo) tendría que
ser representado por dos real-valoró variables, x y y.
Nota: El valor absoluto de e es l. Si el programa incluye una computación de

!zl = sqrt(x2 + y2)


Entonces la diferencia entre el final y los valores iniciales de !z[ Puede ser utilizado como
medida de la precisión de la aritmética de punto flotante del ordenador. Escoge n =
500 y un valor inicial !zl = 1.
8.5 Espectáculo que para cada aritmética de punto flotante con base y precisión finitas
B > 2, allí existir números x tal aquello

(x EB x)/2 # x
Pista: Primero encontrar tal un x por utilizar un dos-dígito representación decimal.
9
Los PROGRAMAS BASARON EN
RECURRENCE RELACIONES

9.1 SEOUENCES

Teniendo introducido sorne estructuras de programa fundamental y


tipos de dato básico en los capítulos anteriores, ahora investigaremos en
detalle pro- gramos que consiste esencialmente de uno declaración repetida,
aquello es, aquellos de la forma general
Mientras B S
Dónde B es una expresión Booleana y S es una declaración. Primero,
observamos que la repetición termínate sólo si declaración S influye B de tal
manera que después de que un número finito de ejecuciones de S,
expresión B deviene falso. Pero esto implica que tiene que haber al menos
una asignación dentro de S a un variable aquello ocurre en B. Si
introducimos V cuando denotando el conjunto entero de las variables que
ocurren en el programa-por ello considerando cada variable como
componente de V-entonces declaración (9.1) puede ser representado en
la forma general (9.2), el cual es un ejemplo de un tan-programa llamado
schema.

V:= v0 ;
Mientras p( V) V : = f( V) (9.2)

Aquí p denota una condición (expresión Booleana) y fa función. (9.2) se


apellida un schema porque por sustituciones adecuadas de V, p, y f,
muchos los programas concretos diferentes pueden ser construidos, ali
habiendo idénticos bajo- lying estructuras y patrones de comportamiento..
Si denotamos el valor de la variable V después del ith ejecución de S por
v;, entonces Vsucesivamente supone la secuencia de valores
V o, V 1,··· , Vn (9.3)
58
SEC. 9.1 SECUENCIAS 59

Cuáles tienen las propiedades siguientes.


l. V¡ = f(v¡ _ 1) for ali i > O
2. V¡ i= v1 para ali i i= (9.4)
j
3. ,p(vn )
4. p(v¡) Para ali i <
n
Regla sigue from la definición de asignación (7. 9), regla 2 from las
consideraciones encima, y gobierna 3 y 4 de la definición de la
declaración de rato en (7.13). Nota que V tiene que tener un bien-definido
initia/ valor v0 ; el fracaso de observar esta regla fundamental es una de la
programación más frecuente errores. La iteración rescinde, si allí existe un n
tal aquella condición 3 está satisfecho.
La lección para ser aprendida es que la declaración con la cláusula de rato
es la forma apropiada en qué para expresar programas cuyo propósito y el
objetivo está especificado por un recurrence re/ation (9.4.1.).

Examp/e: Computaci ó n de factoria/s


La función
f(n) = n! = 1 * 2 * ·•·* n n�O (9.5)
Puede ser computado según un programa derivado de schema (9.2) por
utilizar el recurrence relaciones
f (i) = i * f (i - 1)
(9.6)
f(O) =1
En el programa, introducimos dos variables F y K cuyos valores después del
ith la ejecución de la declaración repetida es f (i) e i, respectivamente;
aquello es, su recurrence las relaciones son
/; = k¡*h-1
} Para > i O (9.7)
= k;_ 1 + 1

Y sus valores iniciales son
1, fo k0 = O
=

El programa derivado por sustituir recurrence relaciones (9.7) en schema (9.2)


es
varF,K: entero; { n � O}
begin F : = 1 ; K : = O;
mientras K i= n
empieza { F K !}
= (9.8)
K:=K+l;F:=K*F
Fin
{F = n!}
Fin
60 CHAP. 9. PROGRAMAS llASED EN RECURRENCE RELACIONES

Desde K progresos a través de la secuencia de números naturales y desde


n � O, el programa rescinde. lt Es particularmente digno de mención que el
orden en qué el dos repitió las declaraciones están ejecutadas es pertinente. Si
eran interchanged a
(9.9.1)
Entonces el correspondiente recurrence las relaciones
serían (9.9.2)

J; = k;-1*Íi-1
k; = k;_ 1 + l
cuáles difieren ligeramente pero
significativamente de (9.7)..
Ejemplo: Computación de 1/x.
Dejado dos secuencias de números reales un0 , un 1, ••• y e 0,e1, ••• ser
especificado por el recurrence relaciones
Un; =ª;- i * (l +e¡_¡)
} Para > i O (9.10)
e¡ = ef-1
y los valores iniciales
ªº = 1, eo = 1 - X O<<x l
Por manipulación algebraica de fórmulas, pueda ser mostrado que
1 - en (9.11)
"
X

Und sinceen = ef und le01 <1, it follows aquello


. 1
l1 m ª" = - (9.12)
n-oo X

Pista: para derivar (9.11) de (9.10), uso las relaciones


Unn = (l +en -1)* · *(1 +e1)*(1 +eo)
1 +e¡ -¡ J
1 - e¡ l - e¡_ 1
Por sustituir recurrence relaciones (9.10) en schema (9.2), obtenemos
programa (9.13), el cual computa una aproximación de 1/x por utilizar
adiciones y multiplicaciones sólo.
var Un, C: real; {O<< x
l} empieza Un: = 1; C: = 1 -
x; mientras abs(C) > e hacer
Empezar {Un• x yo - C, O< < C !} (9.13)
=
Un: = Un• (yo + C); C: = sqr(C)
Fin
{(l - e)/x �Un <yo/x}
Fin.
SEC. 9.1 SECUENCIAS 61

Program (9.13) terminales when C logra un value en �e. Desde entonces


cr,
!col<1 (cf. 9.10) anden = la existencia de un valor n tal thaten � e es
guaranteed for arbitrarily small e. For al! i<n, aun así, C; > e (cf. 9.4).

Ejemplo: Computaci ó n de raíces cuadradas


Le t the two Secuencias of real numera un 0 , un 1 , ••• unde0 ,e 1 , .•. be Dado
por el recurrence relaciones
Un; = ª;-1 * (1 +½e;-1)
Para > (9.14)
}
1

C¡ = e2_¡
¡
* ¡1 (3 + C¡_ ¡) O
Y los valores iniciales
Uno = X, eo = 1 - X O<<x l
Por manipulación adecuada de fórmulas, pueda ser
mostrado que (9.15)

Qn = ✓* (1 - en )
X

Since eo! > O,


lim e" = O Y lim ª" Jx (9.16)
=
n-oo n-oo

Pista: para derivar (9.15) de (9.14), uso las relaciones


Unn = (1 +½en _¡}* (1 +½cn _2)*· ··* (1 +½e0 )* X

Y
X 1
=----- ---
(1 +}c0 )···(1 +½en -1)

Jx
El programa obtenido por sustituir recurrence relaciones (9.14) en
programa schema (9.2) es
var Un, C: real; {O<<x 1} (9.17)
beginA := x; C := 1 - x;
Mientras abs(C) > e hacer
Empezar {Un 2 = x*(l - C), C �O}
Un : = Un* (1 + 0.5* C);
C: = sqr(C) * (0.75 +0.25* C)
Fin

Fin. {x* (1 - e) �Un 2 <x}


62 CHAP. 9. Los PROGRAMAS BASARON EN RECURRENCE RELACIONES

El programa rescinde debido a relación (9.16.1), el cual garantiza la existencia de


un n tal que en � i; para arbitrariamente pequeño i:.

9.2 SERIE

La forma repetitiva básica de una declaración es adecuada de computar


no secuencias únicas pero también serie de números. Dado la secuencia de
plazos.
to , t t' t2,... (9.18)
La serie de sumas
Tan,S1,S2,· ..
(9.19)
parciales está definida
S¡ = to + t 1 + · · · + t¡ (9.20)
tal aquello

Si la secuencia está dada por el recurrence relación


t; =f(t;- 1) fori>O (9.21)
entonces la serie está determinada por
s; = s;_ 1 +t; fori>O (9.22)
s o = lo

Figura (9.23) muestra el programa schema aquello-después de


adecuado substitu­ tions fuera y t0-las cosechas programa que asignará
al variable S el valor s; en theith repetición.

T: = t0 ; S : = T;
Mientras p(S, 7) (9.23)
Empieza T: = f(7); S: = S
Fin
+T
De la definición de la declaración de asignación y la declaración
repetida que utiliza la cláusula de rato, las relaciones siguientes pueden
ser derivadas como las propiedades básicas de este programa schema.
l. l ¡ =f(t ¡ _ ¡) fori>
2. t¡ e/- tj O fo ri
3. S¡ = S¡_ ¡ + t; e/- j (9.24)
fori>
4. ,p(sm tn) O
5. p(s;, t;)
for alii < n
SEC. 9.2 SERIE 63

Examp/e: Aproximació n de exp (x)


Los plazos de las sumas
x2 x;
S¡ = l+x+-+··•+-
.,
(9.25)
2 1. l.

Está definido por el recurrence relación

j>O (9.26)

Y el valor inicial t0 = 1. El límite de la serie es sabido de ser.


lim sn = exp (x) (9.27)
n-oo

La serie converge a un límite para ali números reales x; aquello es, la


disminución de plazos tal que su suma converge a un límite fijo. Este hecho
está utilizado por programa (9.28), el cual estuvo obtenido por sustituir
recurrence relación (9.26) en programa schema (9.23).
var T, S: real; K: entero;
Empieza T= : 1 ; S : = T; K : = O;
Mientras T> ¡; hacer (9.28)
Empieza {S = 1 + x + ... + xK /K!, T= xK /K! > i;}
K : = K + 1 ; T : = T * x/K; S : = S + T
Fin
Fin.
El "error" por qué el valor final de S difiere de la suma de límite cierta es
¿;: K + 1 (x;/i!) Cuáles pueden ser hechos arbitrariamente pequeños por escoger
K suficientemente grande. Es consuetudinario a termínate el summation
dependiendo de el magni- tude de los plazos relativos a la suma total más
que el valor absoluto del.
Último plazo. Esta estrategia requiere, aun así, un análisis más lejano de
el con- vergencia de la serie, particularmente si sus plazos tienen alternar
señales. El siguiente es un ejemplo de tal caso.

Ejemplo: Aproximación ofsin (x) Los


componentes de la serie s
x 2 -1
S· =X- x3
- . * �.x-
+ -s - + (- 1)2 ,-1 ; (9.29)
... - 1) !
1
3! 5! (2'
Consta de los plazos definieron por el recurrence relaciones
xz
tí = -tJ-1*
(9.30)
kJ*(kJ- 1)
k1 = k1 _ 1 + 2
64 CHAP. 9. Los PROGRAMAS BASARON EN RECURRENCE RELACIONES

Para j > O y los valores iniciales t 0= x y k0 = 1. El límite de s es sabido a


Ser
lim sn = Pecado (x) (9.31)
n- oo

El programa que resulta de la sustitución de recurrence relaciones


(9.30) en schema (9.23) es
var S, T: real; K: entero;
begin T : = x; K : = 1 ; S : = T;
Mientras > ¡; * abs(S) (9.32)
Empieza
abs(T) = K: K + 2; T: = - T* sqr(x)/(K* (K - !)); S
:= S + T
Fin
Fin.
Es particularmente digno de mención que en programas (9.13), (9.17) ,
(9.28), y (9.32), el número de plazos necesarios y el número de repeticiones
de com­ putations no es fácilmente determinó. Dependen de el valor e, el
toler­ ated error en la condición de terminación, y también en el índice
ofconvergence de la serie. El uso de tal recurrence relaciones en programar por
tanto requiere cuidado grande---incluso si garantías de análisis matemático
(definitivos) convergencia-porque la convergencia rápida es altamente
deseable para practica! Propósitos (cf. Ejercita 9.3 y 9.8)..
En (9.25) el índice de convergencia es alto sólo para valores positivos
pequeños de x. Consiguientemente, recomendamos utilizar relaciones
exp(-x) = 1/exp(x) para x < O (9.33. l)
Y
exp(i + y) = exp(i) * exp(y) Para x > l (9.33.2)
Por el cual =
i trunc (x) y y = x - i. El valor exp(i) es entonces
computado sencillamente por multiplicación repetida de la base del
natural logarithms.
Los plazos en (9.2 9) tiene alternar señales, y la suma converge
rápidamente sólo para valores pequeños de x. El uso de las relaciones
siguientes es por tanto recomendado para valores más grandes de x..
Pecado (x) = pecado (x - 2nn)para 2nn � !xi < 2n(n + l)
Pecado (x) = - pecado (x - n) para n � !xi < 2n
Pecado (x) = pecado (n (9.34)
- x)
Para < n jxj <
Pecado (x) = cos (� - n 4 2
x) Para X < Ü
Pecado (x) = -pecado (
-x)
EJERCICIOS 65

Por aplicación adecuada de estas fórmulas, programa (9.32) tendrá que ser
aplicado sólo a valores de x satisfaciendo O � lxl � n/4. En este
intervalo, qué­ nunca, el índice de convergencia es satisfactorio para practica!
Propósitos, y el número de plazos para ser computados queda suficientemente
pequeño de mantener los efectos de redondear y errores de truncamiento
(debido a computación con un finito arith­ metic) dentro de límites
tolerables.
Finalmente, programa (9.32) pide la aplicación de otra regla básica de
programar: dentro de la declaración repetida, el valor x2 tiene que ser
computado. Esto cuadrando está actuado repetidamente, a pesar de que x
nunca es cambiado en ali. Esta lata de esfuerzo computacional innecesaria
y tiene que ser eliminado por computar x2 una vez-aquello es, antes de
empezar las repeticiones en la declaración de rato-y por asignar el resultado
a una variable auxiliar, el cual es entonces sustituido sistemáticamente para
cada ocurrencia de x 2 . Este procedimiento puede ser formulado como la
regla de tierra siguiente.
lf Una expresi ó n f(x) está evaluado dentro de una declaraci ó n repetitiva S y si el
argumento x no cambia durante las repeticiones, entonces un auxiliar
Variable h tiene que ser introducido al cual el valor f (x) está asignado una vez befare
la ejecución de S y cuál está sustituido para cada ocurrencia de f (x) dentro de S;
aquello es, el construir
Mientras P hacer
Empieza .. . f(x)... Fin (9.35.1)

Est á
reemplazado
h :=f(x);
por
Mientras P hacer
(9.35.2)
begin ... h ...Fin

EJERCICIOS

9.1 Reescribe programas (9.28) y (9.32)----utilizando fórmulas (9.33) y (9.34) ---------de modo
que.
Las funciones exp (x) y pecado (x) está computado efficiently (y más con exactitud).
9.2 Diseño un programa para computar una aproximación de cos (x) con una exactitud relativa
c. Programa de uso schema (9.23) y
x2
cos (x) = 1 - - +-
x4 -· · ·

2! 4!
9.3 Programa de uso schema (9.23) para desarrollar un programa para computar una
aproximación a la integral
x3 xs x1
S: exp( - u2 ) du x- + - +···
3•1! 7•3!
66 CHAP. 9. Los PROGRAMAS BASARON EN RECURRENCE RELACIONES

Pista: Observa que el índice de convergencia es abajo para x > 1. Qué es el conse­
quences de el uso de un ordenador con precisión finita y una gama finita de valores? (Por
ejemplo, rastro los plazos computaron para los casos x = 1, 2, 3 ...).
9.4 Construir un programa según schema (9.2) para computar el Fibonacci num­ bers por
dos métodos diferentes:

(a) Según el recurrence relación


/; +¡ =_(; +f;_¡ i >o

fo = O,
(b) Utilizando la fórmula.

Dónde e = (1 + fi)/2.
En sitio de fi uso el valor aproximado 2.236068 y determinar el menos i para qué el dos
computó valores de/; difiere.
9.5 Verificar los resultados en programas (9.13) y (9.17) por encontrar las aserciones
necesarias y suficientes después de cada declaración derivada de el indicó invariantes.
9.6 Diseño un programa basado en schema (9.2) para computar el logarithm a la base 2 de un
número real. Uso las relaciones

Registro(x) = -registro(l/x) foro< x <

Registro (x) = n + registro (x/2") para x > 2"


Para 1 � x < 2, uso el recurrence relaciones
Si un¡_ 1 < 2

ifa¡ 1 �2

ifa¡_ ¡ < 2 ifa¡


=
{S;-1
¡�2
·\ S;- ¡ + b;
Para > i O, y un 0 = x, b0 = 1, s0 = O. La computación tendría que ser rescindida con
h,, � 1: para un dado suficientemente pequeño 1:. Encontrar la invariante de la
repetición, verificar el resultado

lim s.
n-,
= Registro (x)

Y establecer que el algoritmo rescindirá.


9.7 Investigar las consecuencias de reemplazar la cantidad pequeña 1: por cero en programas
(9.13), (9.17), y de reemplazar la condición de terminación en (9.28) y (9.32) por s = s +
t. Hacer los programas resultantes todavía termínate, si el uso de una aritmética de
punto flotante con precisión finita está supuesta?
EJERCICIOS 67

9.8 Ejecuta programas (9.13), (9.17), (9.28), y (9.32) en un ordenador y aumentarles


por introducir un contador para el número de repeticiones actuó. Disuade- mina
experimentalmente el índice de convergencia de estos programas para varios valores
de su argumento x.
9.9 El programa siguiente estuvo diseñado para computar la suma s de el primer n
plazos del sine serie (9.29) para argumentos x tal que O :e; x :e; n/4. Es el
programa correcto? Qué tendría que ser criticado aproximadamente lo?
var i, v: entero; h, u, s: real;
begini:=O;u:=x;P:= Yo;
h := sqr(x); s := u;
Repite i : = i + 2 ; u : = - u * h;
v : = v * i * (i + Yo); s : = s + u/v
Hasta que i > 2 * n
Fin.

9.10 Dado un ordenador capaz de representar números reales con una exactitud relativa
6
e= yo0- (10- 10, yo0- 14), determinar cuántos plazos de la serie (9.25) y (9.29)
es necesario-en el caso peor- para obtener el maximumpossible exactitud de exp
(x) para O :e; x < 1 y pecado (x) para O :;;; x < n/4 (cf. 8.28).
LA ESTRUCTURA
10 de DATO del
ARCHIVO

10.1 LA IDEA DE Un ARCHIVO

Las dos propiedades más características de el dato escribe habladas tan lejos
es la indivisibilidad de sus valores y la existencia de un ordenando entre ellos.
Por ello se apellidan escalares. Por ejemplo, cada valor de entero de tipo (i.e.,
cada número entero) es una unidad o una entidad sin componentes, y el conjunto
de enteros está ordenado. Por ello no hace sentido para referir al ith dígito
(componente) de un entero, pero es sensato de hablar sobre el ith dígito de una
representación decimal de un entero que él no es un entero pero una secuencia
de caracteres. En este caso, por tanto, es evidentemente conveniente de ser
capaz de referir a la representación de el número globalmente, a pesar de que
consta de dígitos individuales. Esta capacidad de dar un nombre colectivo a un
conjunto entero de elementos es de valor grande en los datos que procesan en
general. Tales conjuntos de los valores o las variables con un nombre colectivo
solo están dichos para ser struc- tured. Allí existir severa! Métodos de estructurar,
cada señalado por la manera en qué componentes individuales es accesible y por
tanto también por su denotación.
Las variables que constan de severa! Los componentes se apellidan estructuró
variables. Para definir el tipo (gama de valores) de una variable estructurada, es
necesario de especificar

(a) Su método de estructuración, y


(b) El tipo(s) de sus componentes.

En muchas maneras, el método de estructuración más sencillo es la secuencia


. Quizás el ejemplo sabido mejor de una variable con una estructura de
secuencia es la cubierta de tarjeta. En la profesión de procesamiento del dato, el
archivo secuencial es el plazo generalmente aceptado utilizó para describir una
secuencia. Aquí sencillamente utilizaremos la palabra.

68
SEC. 1 Ü. Yo LA IDEA DE Un ARCHIVO 69

file, dejando el atributo "secuencial" de ser implicado. Para definir un tipo F,


aquello es , una gama de valores qué es secuencias de componentes de tipo T,
utilizamos la notación.

Tipo F = archivo de T (10.1)

Ali componentes de las secuencias es así definido para ser del mismo
Tipo T.

Ejemplo:
Archivo de texto = del tipo de char.
Tal�gama notablemente�infinita de valores puede ser definida formalmente con la
ayuda de la operación de concatenación: la concatenación de dos archivos
rJ. = <x1, X 2···xm> und /3 = <Y1,Y2···Yn>

Está denotado por


(10.2)
Entonces la gama de valores F denotados por (10.1) es rigurosamente definido por
los axiomas siguientes:

l. < > Es un F (la secuencia vacía),


2. iffis Un F, y t es un T, thenf• <t> es un F,
3. No otros valores son Fs.

Una variable de archivo f está declarado según las convenciones


adoptaron m Capítulo 8:

var f: F or varf: file of T (10.3)

lts El valor es por definición siempre un F. Para razones para ser explicadas en
sección 10.2, supondremos que con cada declaration de una variable de archivo f,
un addi- tional variable de escribir Tis automáticamente introdujo. Esta variable
es para apellidarse buffer variable y denotado por f j. lt Está utilizado tampoco
para anexar componentes nuevos al archivo, o para elegir sus componentes para
inspección.
Los archivos juegan una función esencial en cada sistema de ordenador. Son
la estructura apropiada para datos para ser almacenados en dispositivos con
mechanically partes emotivas para qué el acceso secuencial de componentes es a
menudo el único posible un, porque los elementos de almacenamiento están
dirigidos pasado una lectura o escribiendo dispositivo en estrictamente orden
secuencial. Las operaciones exactas qué un sistema de ordenador puede actuar
en un dispositivo de almacenamiento seguro depende de su diseño físico. Los
dispositivos siguientes son ampliamente utilizados, y el dato almacenó encima les
es normalmente considerado para ser archivos secuenciales.
70 CHAP. 10. LA ESTRUCTURA de DATO del ARCHIVO

1. Cintas magnéticas, discos, y tambores. Lectura, escritura, y borrando (por


re- posicionamiento y overwriting) es posible.
2. Lectores de tarjeta y perforadoras, papertape lectores y perforadoras. En el
caso de lectores, sólo lectura secuencial (ni siquiera recolocando) es
posible. Un archivo representado por una cubierta de tarjeta o un
papertape cargado en un lector es allí- fore llamó un archivo de entrada.
Análogamente, una cubierta de tarjeta o papertape para ser generado
por una unidad de perforadora se apellida un archivo de producción.
3. Impresoras de línea. El archivo correspondiente cuyos componentes están
supuestos a
Ser los caracteres imprimibles es un archivo de producción .
La asignación de un archivo a una clase concreta de dispositivo y las
restricciones resultantes en su estado de procesamiento están especificadas
por su tan-talante llamado. Pero desde entonces no somos preocupados con
la representación física de datos, no hay ninguna necesidad para una
notación para especificar un talante.
El concepto de el archivo sirve como una abstracción de datos
almacenó en cualquier de estos dispositivos de almacenamiento y nos dejo
para formular su común characteris- tics y operaciones en una manera
general. El archivo más importante los operadores están descritos en las
secciones siguientes.

10.2 GENERANDO Un ARCHIVO

El declaration de una variable de archivo determina su identificación, su


struc- ture y su tipo. Además, el número inicial de componentes es O. Él
se apellida la longitud del archivo; un archivo con cero longitud se
apellida vacío y denotado por < ). La longitud está aumentada por
dinámicamente anexando compo- nents por el operador de archivo estándar
puso. Definimos el operador (procedimiento)
Puesto(f) cuando anexando a el archivo J uno componente solo. Su valor
está copiado del buffer variable aquello es implícitamente introducido por el
declaration de th e file J(10.2). The effect of Ejecutando the la declaración
puesta(f) can be formally describió como sigue.
{(f=Un)/\(fi=x )} puesto(f)
{f=a·<x)} (10.4)
Para hacer implementaciones eficaces de archivos en los ordenadores reales
posibles, es ventajoso no para hacer uso de el valor de el buffer variableJi
después de la ejecución de puesto(f). Por tanto especificamos que la
operación puesta(f) deja el valor Ji undefined.

Ejemplo: Generando afile


Un archivo de enteros es para ser generado aquello tiene un ith
componente con el valor i2 y aquello contiene ali plazas de números
naturales menos de n. (Nota
El recurrence relaciones

Un; = ª;-1 + Para > i


(10.5)

b;} 1

b; = b;_ 1 + 2
SEC. 10.3 INSPECCIONANDO Un ARCHIVO 71

De un 1 = b 1 = 1, por tanto sigue un;= i2.)

var Un, B: entero;


.f: Archivo de entero;.
beginA := !; B:= !; (10.6)
Repetir {Un = (B + 1)2/4}
Ji : = Un; puesto(f);
B:=B+2;
Un:=Un+B
Hasta Un � n
Fin.

10.3 INSPECCIONANDO Un ARCHIVO

Después de un archivo ha sido generado, está a punto para inspección.


Esta inspección procede estrictamente sequentially, empezando con el
primer componente en el archivo. Durante inspección, el archivo está
caracterizado por una posición, el cual divide el archivo a la parte aquello ya
ha sido inspeccionado y la parte que es todavía para ser leído. Por ejemplo,
si un archivo es físicamente representado por cinta magnética, entonces esta
posición corresponde a el pariente de posición de la cinta a la cabeza de
lectura de la unidad­ de cinta.
En generación de archivo, la posición de archivo es implícitamente dada
porque los componentes nuevos están anexados al final, pero en
inspección de archivo, la posición de archivo
Mosto necessarily be explicit . Un convenient explícito representation is obtuvo
Por denotar las dos partes de archivo cuando ], la parte yaJ, La parte
leída, y para ser leído. Su concatenación es siempre el archivo
entero:

J=l] (10.1)

El componente actualmente siendo inspeccionado entonces puede ser


J,
designado como el primer elemento de dónde.
Abetost((x i ,x2, . • • ,xn )) = x 1

We Ahora introduce the estándar file operator (procedimiento)


reset(f), el cual causa el filefto suponer una posición de empezar para
inspección. Su efecto puede ser formalmente descrito por
{f = C(} reinicialización(f) {(.1 = <
)) /\ (] = C() /\ (Ji = first(]))} (10.8)

Este defi nition implica que the buffer variablef i supone the value of el
primer componente de archivo-si hay uno. Para proceder a el componente
próximo, nosotros introduce the standard file operador (procedimiento) get(f).
Estos movimientos de operador
72 CHAP. 10. LA ESTRUCTURA de DATO del ARCHIVO

La posición de archivo una unidad a la derecha y asigna el valor de el


próximo com­ ponent a Ji. Pueda ser formalmente definido por

{(] = Un) /\ <] = <x) · /3)} consigue(f)


{(]=Un· <x)) /\ <] = /3) /\ (fj = first(]))} (10.9)

Nota que la igualdad


Ji = _Primero(])

Es una consecuencia de ambas la reinicialización y conseguir


J
operadores. Aun así, esta función está definida sólo si consta de en Ieast
un componente, aquello es, si no es vacío. Es por tanto importante de
J
tener una facilidad disponible de probar whether] is vacío. We Postulado
this facility in el form of el predicado estándar (función Booleana) ede (f), el
cual significa fin de archivo..

eof(f) = J=O (10.10)

Consiguientemente, la reinicialización de operaciones(f) y conseguir(f) deja


f j definió sólo si
,eof(f).
Yon adición a las operaciones puestas, reconjunto, consigue, und the
function eof, ahora introducimos el cuarto y fi nal file operador
(procedimiento), reescribe(f). Yot suele discard el valor de una variable de
archivo para permitir la generación de un archivo nuevo. Con el mismo
nombre. Su efecto puede ser formalmente descrito por

Reescribe(f) {f = < ) } (10.11)

Las secuencias posibles de las operaciones en un archivo están mostradas


en (10.12). Esto graph claramente exhibe el hecho que, en general, las "fases" de
generación de archivo e inspección de archivo alternan.

(10.12)
SEC. 10.3 INSPECCIONANDO Un ARCHIVO 73

En muchos casos, la estructura secuencial de afile marcas el estado


repetitivo- ment el apropiado construir para expresar el proceso offile
inspección. Después de cada inspección de afile componente por una
declaración S, la operación J?et(f) Asigna tofj el value of el nex t component
und el n undvanees la posición de archivo. Esto está representado por
programa schema (10.13).

Mientras ,eof(f)
empieza S; (10.13)
consigue(f)
fin

Sólo si está afirmado que fes inicialmente no vacío, entonces poder utilizamos
schema (10.14), el cual bajo esta condición es equivalente a (10.13).

Repite S;
(10.14)
consigue(J)
until eof(f)

Ejemplo: Contando offile componentes


La longitud offilefis para ser determinado y entonces asignado a la
= +
variable L. Utilizando schema (10.13) como base y sustituyendo L: L 1 para
S, obtenemos programa (10.15).

var L: entero;
Empieza L := O;
Mientras ,eof(f)
Empieza { L = número de componentes (10.15)
leyó}
L : = L + l ; consigue(J)
Fin
Fin.

En general, está recomendado para ignorar la existencia de un buffer


variable y para utilizar exclusivamente los procedimientos estándares leídos y
escribir definido abajo en plazos del primitives conseguir y puesto. Aun así,
a veces es muy con- venient para tener el buffer variable disponible como
lookahead dispositivo. Pero en muchos lenguajes de programación y
computando sistemas el buffer la variable es inaccesible.
74 CHAP. 10. LA ESTRUCTURA de DATO del ARCHIVO

Leído(f,x) posiciones para x:=Ji;


consigue(f) escribe(f,x) posiciones para
fi: = x; puesto(f)

Programa schemata (10.13) y (yo0.14) es entonces reemplazado por el schemata

Mientras ,eof(f)
Empieza leído(f,x); (10.15)
S(x)
Fin

Repite leído(f,x); S(x) (10.16)


Hasta que eof(f)

Desde el leído y escribir las operaciones ocurren muy frecuentemente,


utilizaremos las abreviaturas siguientes:
Leído(f, x 1 ,•• • , xn ) posiciones para
Leído(f, x 1 );••• ; leído(f, xn
) escribe(f, x1,.•., xn ) está for
escribir(f,x 1); .•. ; Escribe(f, Xn)

Ejemplo: varianza y valor Malos


Dado una serie de n > O medidas x i representó como archivo f de
números reales, computar su valor malo m y su desviación estándar s por
aplicar las fórmulas
Yo 1
m = - ¿X¡ s2 = - "
. (x; - m) 2
L
, ni

n;
Utilizando schema (10.14), obtenemos programa
(10.17).
var/: Archivo de real;.
m,s,x: real; n: entero;
Empieza m:= O; n:= O; reinicialización(f); (10.17)
repeatn:= n+ 1; leído(f,x); m:= m+x
Hasta que eof(f) ;
m:= m/n; s:= O; Reinicialización(f);
Repite leído(f,x); s:= s + sqr(x-m)
Hasta que eof(f);
s:= sqrt(s/n); ...
Fin.
SEC. 7.4 TEXTFILES 75

10.4 TEXTFILES

Un archivo cuyos componentes son caracteres imprimibles se apellida


un textfile. Textfiles Juega una función fundamental en los datos que
procesan, desde la entrada y dato de producción de más los programas son
textfiles. Pegado papertapes preparó en un typewriter, las cubiertas de
tarjetas prepararon en keypunch máquinas, computó los resultados
imprimieron en papel continuo, y corrientes de dato que emanan de o
dirigidos a typewriter terminales-todo de estos está considerado para ser
textfiles. Un proceso computacional que utiliza muy de estos medios de
comunicación como transportista de datos es con- sidered para ser una
transformación, convirtiendo un textfile entrada llamada a otro textfile
producción llamada.

Entrada de archivo )

Ordenad Program
or a

Producción de
archivo

lt Es por tanto apropiado de introducir un tipo estándar y dos variables


estándares. Están supuestos para ser predefined en cada sistema de
ordenador, aquello es, declaró implícitamente cuando
Archivo de texto = del
tipo de char. (10.18)

var Entrada,
producción: texto

Las dos variables están supuestas para denotar la dos entrada estándar y
medios de comunicación de producción de cualquier sistema de
ordenador dado. lt Es por tanto sensato de someterles a las restricciones
siguientes.
l. La entrada sólo puede ser inspeccionada pero no recolocado o regeneró.
Sólo la operación consigue es aplicable. Su generación (cf. 10.12) ocurre
con anterioridad a la iniciación del programa.
2. La producción sólo puede ser generada pero no recolocado o releído.
Sólo la operación puesta es aplicable. Su inspección (cf. 10.12) ocurre
después de la terminación del programa.
76 CHAP. 10. LA ESTRUCTURA de DATO del ARCHIVO

Normalmente, un texto es partitioned a !ines. De ahí, la cuestión surge


tan a cómo esta estructura de línea es para ser representado en plazos de
nuestro concepto de archivo. Allí existir dos métodos esencialmente
diferentes:

1. El conjunto de caracteres definió por el tipo char contiene un elemento que


denota el fin de una línea. Esto es entonces un caso de un tan-
llamado (que imprime no) carácter de control. De ahí, la estructura de
línea es implícita.

2. Cada línea está considerada como secuencia de caracteres, y el texto él es


una secuencia de líneas. De ahí, la estructura de línea es explícita.

Caso requiere no explicaciones más lejanas. Pero desde entonces


mucho carácter de uso de instalaciones de ordenador conjuntos devoid de
caracteres de control explícito, caso 2 méritos sorne atención. Uno está tentado
para considerar un texto como archivo de archivo de char, pero esto dirigiría
a formulaciones bastante tediosas de ópera de procesamiento del texto- tions.
Un tratamiento excepcional de el texto de tipo es por tanto aceptable y
deseable. Consta de el uso de operadores estándares adicionales para la
generación y reconocimiento de fines de línea. Nosotros postulado les
como sigue:.

writeln(f) Rescinde línea actual en filef readln(f)

skip a el principio de la línea

próxima

eoln(f) Una función Booleana; cierto después de leer.


El último carácter de una línea, falso otherwise.

Para facilitar la lectura de textos donde la estructura de línea, a pesar de


que presente, es insignificante, nosotros postulado la convención siguiente: a
leer, cada fin de línea deviene manifestar como carácter de espacio, i.e.
=
= ' '.
siempre que eoln(f) cierto, entonces fj
Para readln y writeln aceptamos el mismo notational abreviaturas en
cuanto a leídos y escribir. Además, desde los dos archivos estándares
están utilizados más frecuentemente, suponemos aquello

1. Si el parámetro de archivo falta en una declaración leída, entonces la


entrada de archivo está supuesta por default.

2. Si el parámetro de archivo falta en un escribir declaración, entonces la


producción de archivo está supuesta por default.
SEC. 7.4 TEXTFILES 77

Ejemplo: representación Gráfica de una función


Un real-función valorada f está representado graphically con la ayuda de
una impresora de línea. Esto es posible, para caso, por imprimir un
asterisco en las posiciones que corresponden a las coordenadas (x0, y 0), . • .
, (x m Yn), donde x 0 , • . . , x n es abscisas equidistantes. Nosotros Jet el x-

carrera axial a lo largo del papel de forma continua y escoger una escala
tal aquel d = X¡ - X¡ _ 1 corresponde a el dis- tance entre dos líneas en el
papel imprimido. La posición del asterisco en coordenada
= X¡ está obtenido
por computar y ¡ f(x¡), multiplicando y ¡ por un factor de escala s, y
redondeando el producto a el entero próximo. Representa el número de
espacios que tiene que preceder el asterisco en la línea. En programa (10.21),
los valores siguientes están utilizados como un ejemplo.

f(x) = exp(-x) * Pecado(2nx) O �x<4


d = l/32 (32 líneas para intervalo [x, x + 1])
s = 50 (50 character anchos for intervalo [y, y+ 1])
h = 65 (distancia de x-axial de borde de papel, cuando expresado en
posición de carácter)

const d = 0.03125; s 50; h 65; e= 6.28318; lim = 128;


varx,y:real; i,n:entero;
Empieza i:= O;
=
Repite x:= i * d; y:= exp( -x) * pecado(c*x);
n:= Ronda(s *y)+ h (10.21)
repetir escribir(' '); n:= n
- hasta que n = O;
writeln('*'); i:= i + 1
Hasta que i = lim
Fin.

Textfiles Es subdivided a líneas solas. Esto es un ejemplo típico de la


subdivisión frecuentemente encontrada ofa archivo a secciones lógicas.
Theindividual Sección (aquí bien) puede constar de números diferentes de
componentes (aquí caracteres). Nat1..Rally, la subdivisión de un archivo a
secciones lógicas tiene una influencia en la estructura de un programa
que inspecciona el archivo. La estructura adecuada de un programa de
inspección correspondiente es el nested repetición. La repetición "" exterior
procesa una sección a la vez, y la repetición "" interior procesa uno
archiva componente a la vez. Estas ideas están reflejadas por programa
schema (10.22) para el caso concreto donde las secciones son líneas en un
textfile.
78 CHAP. 10. LA ESTRUCTURA de DATO del ARCHIVO

Mientras ,eof(f)
empieza SI;
Mientras ,eoln(f)
Empieza leído(f,ch); (10.22)
S2(ch)
Fin;
S3; readln(f)
Fin
En este schema, S2 especifica las acciones para ser tomadas para cada
carácter. SI Y S3 especifica, respectivamente, las acciones para ser ejecutadas
al principio y al final de cada línea.
Si está afirmado que el archivo consta de al menos una línea y cada
línea contiene al menos un carácter, entonces schema (l 0.23) puede ser
utilizado en vez de (10.22).

Repite SI;
Repite leído(f,ch); S2(ch)
(10.23) Hasta que eoln(f);
S3; readln(f)
Hasta que eof(f)

Ejemplo: Inserción ofprinter-control chara cters


En conexión con impresoras de línea, es bastante consuetudinario de
tratar el primer carácter en cada línea como carácter de control más que tan
uno para ser imprimido. El carácter está interpretado cuando especificando la
acción de el papel-alimentar mech- anism. La razón para esta convención
surge de la técnica frecuentemente utilizada de temporalmente
almacenando dato de producción en un buffer (hasta una impresora es
disponible, por ejemplo). El dato obtenido por la impresora de el buffer
la tienda tiene que contener la información de control de impresora
necesaria, y su inser- tion en el archivo de dato en la forma de un carácter
extra a principios de cada línea tiene ventajas obvias. Sorne De los
caracteres de control usua!ly Utilizó
Es
' ' (espacio) el papel normal
alimenta 'O' el espacio doble
alimenta
Alimenta hasta página próxima
En este ejemplo, el programa wi! Copio la entrada de archivo a la
producción de archivo por meramente insertando el necesario un espacio en
cada línea que las señales normales espaciando. Programa (10.24) está
obtenido de schema (10.22) por sustituir el apropiado escribir declaraciones
en sitio de Sl, S2, y S3..
EJERCICIOS 79

var ch : char;
Empieza
Mientras -,eof(entrada)
Empezar escribir(' '); {control de impresora}
Mientras ,eoln(entrada) (10.24)
Empieza leído(ch); escribe(ch)
Fin;
writeln; readln
Fin
Fin.

EJERCICIOS

10.1 Dado dos archivos de entrada/andg conteniendo el ordenó secuencias de enteros

Tal
aquello fi +1 � /1 und gi+1 � gi for al! i,j
Diseño un programa que fusiona los dos archivos a uno archivo ordenado h tal que
hk+yo � hk para k = yo, ... , m + n - yo

10,2 Extiende programa (10.21) de tal manera que además de la función/(x), el x-axial es
también imprimió.

10.3 Escribir un programa que copias un texto/a un fileg, por el cual las secuencias de
espacios están condensadas a un espacio solo, exceptúa si estando a principios de
una línea.

10.4 Dado un textfile entrada sobre un carácter puesto con dos distinto separators
(llamado eop y eol) cuál subdivide el archivo a párrafos (eop) y los párrafos a líneas,
diseño un programa schema para inspeccionar aquel archivo, ejecutando las
declaraciones

S1 a principios de cada párrafo S2 a


principios de cada línea
S3 para cada carácter leído dentro de una
línea S4 al final de cada línea
S5 al final de cada párrafo.
Supone que eop los caracteres ocurren sólo inmediatamente después de un eol u otro
eop Carácter y que el archivo está rescindido por un eop carácter.

10.5 Dado es un archivo/de números x1. Un sub-secuencia x1 ...x k se apellida una


cuerda, si sus miembros están ordenados (x1 � xi+ 1 �• • · �xk - l �xk ). Es una
cuerda máxima,si también x1 _ 1 > x1 y x > k xk+ 1• El valor k - i + se apellida la
longitud de la cuerda.
Escribir un programar cuál determina la longitud de la cuerda máxima más larga en
el archivo dado f.
LA ESTRUCTURA de
11 DATO de la VARIEDAD

Como un archivo, una variable con una estructura de variedad es una


colección de variables de componente del mismo tipo. Pero las características
siguientes de una variedad crean una distinción definitiva entre las dos
clases de estructuras..

1. Cada componente solo de una variedad es explícitamente denotable y


directamente accesible.
2. El número de sus componentes está definido cuándo la variable de
variedad es intro­ duced y queda sin cambios después.

Estas características hacen particulares notational las convenciones


necesarias
(a) Para denotar componentes de variedad individual y
(b) Para definir variedad-estructuró tipos.

Los componentes están denotados por el nombre de la variable de


variedad y un índice­ tan llamado, el cual singularmente designa el elemento
deseado. El hecho que este índice puede ser un computable el objeto
distingue la variedad en particular de muchos otras estructuras de dato.
Estos índices por tanto tienen que ser de uno de los tipos de dato
disponibles, el cual es entonces llamó el tipo de índice de la variedad.
Restringimos tipos de índice a los que son escalares de modo que un
lineales ordenando existe entre los componentes de variedad, y nosotros
postulado el siguiente notational convenciones.

1. La definición de un tipo de variedad incluye especificaciones de el tipo


de componente así como el tipo de índice. Allí existe un mapeo único
entre
80
LA ESTRUCTURA de DATO de la VARIEDAD 81

Componentes de variedad y valores de índice. La definición ofan tipo de


variedad toma la forma
Tipo Una = variedad [TI] de T2 (11.1)

Dónde Un es el identificador de tipo nuevo, TI denota el tipo de índice,


y T2 denota el tipo de componente. Ejemplos de variedad-variable
declarations (con tipos anónimos) es

var x: Variedad [1 .. 20] de


(11.2)
real.
var y: Variedad [color] de
color.

Según estos declarations, x consta de 20 componentes de escribir real con


inde x valor s 1, 2, ..., 20, und y has four componentes of type color (cf. 8)
con rojo de valores del índice, amarillo, verde, y azul..
2. El componente de una variable de variedad Un correspondiente a el valor
de índice i está denotado por Un[i] o Un ¡ . Ejemplos (cf. 11.2) es

x[!0] x[i + j]
(11.3)
y[Rojo] y[y[Amarillo]
]

Dos variedades están definidas como iguales si y sólo si son de el mismo


tipo y ali los componentes correspondientes son iguales. Así

u=v ._. u ¡ = v¡ Para todo i (11.4)


El requisito que cada componente de una variedad ser explícitamente
identifi­ capaz tiene la consecuencia natural que cada componente ser igualmente
accesible (en una tienda de ordenador). Esto, aun así, restringe
considerablemente la selección de medios de comunicación de
almacenamiento apropiado para representar variables de variedad. En
particular, dispositivos de almacenamiento secuencial como papertapes, cintas
magnéticas, y discos magnéticos (a un grado menor) es ali inadecuado.
Dispositivos de almacenamiento donde el tiempo de acceso es igual para todas
células de almacenamiento son altamente deseables. Los representantes
sabidos mejores de esta clase son la tienda de núcleo magnética y la tienda
de semiconductor integrada, los cuales tienen no mechanically partes
emotivas. Son tan-llamados tiendas de acceso aleatorio, donde cualquier célula
escogida al azar puede ser inmediatamente accedió. Pero el coste ofsuch las
tiendas es significativamente más altas que el coste de dispositivos
secuenciales, así que el últimos es siempre utilizado para aguantar
volúmenes grandes de datos. Si, aun así, la medida de un conjunto de
dato es tal que lo acceso quietas a la tienda directamente accesible de un
ordenador-el tan-tienda primaria llamada
-Entonces la variedad es normalmente la estructura apropiada para este
conjunto de dato. En contraste a la tienda primaria, el volumen grande
tiendas secuenciales de un com­ puter el sistema se apellida tiendas
secundarias.
82 CHAP. 11. LA ESTRUCTURA de DATO de la VARIEDAD

Ejemplo: Buscando un componente de variedad


Da n un array con componentes Un[l], ..., Un[n] und un value x, conjunto
qa
Falso, si hay no k tal que Un[k] = x; otherwise conjunto q a cierto e i a k..

var i: O ..n; q: Booleano; {n > O}


Un: variedad [yo .. n] De T;.
Empieza {asignación ofvalues a Un} (11.5)
i := O;
Repite i : = i + yo ; q : = Un[z] =
x =
{ Un[J] # x para j 1...i - 1}
Hast q V (i = n)
Fin. a
que

La condición de terminación de este programa de búsqueda es la unión


lógica de las condiciones q (el componente deseado está= encontrado) e i
n (ali los componentes difieren de x). Una técnica consuetudinaria para
simplificar este composite condición y así para solicitar el algoritmo es el
siguiente;

l. La variedad Un está extendido por un componente,


2. El componente nuevo está asignado el valor x, y actos como sentinel para el
fin de la búsqueda.

El programa resultante está mostrado en


(11.6). var i:O ..nl; { =
n1 : n +
l}
Un: variedad [l ..n l] De T; (11.6)
Empieza {asignación ofvalues a Un[!]
...Un[n]} i := O; Un[nl] := x;
Repite i := i + yo hasta Un[z] = x;
{ Un[J] # x para = j l ...i - 1}
Fin.

Ejemplo: Buscando un componente en una variedad ordenada


El problema aquí es el mismo tan en el ejemplo de preceder. Aun así,
los componentes de variedad están ordenados tal que Un[i] < AU] para
ali i < j. Al­ aunque programa (11.5) es también aplicable en este caso,
recomendamos una búsqueda más eficaz que aprovechará la variedad está
ordenando. Un método mejorado está basado en la idea siguiente.
Considerar los componentes de la variedad para ser los nodos de un
árbol que tiene (como máximo) dos ramas en cada nodo (y es por tanto
llamó un árbol binario). Figura (11.7) espectáculos un "ingenio" de árbolh n = 15
nodos.
= índice
Si seleccionamos primero el componente en el medio con + k (1
n)/2 y comparar él con x, entonces tres posibilidades existen.
LA ESTRUCTURA de DATO de la VARIEDAD 83

Un8

Un4 Un12

Un2 Un6

Un10
/ Un14 (11.7)

/\ /\ /\
/\
Un1 Un3 Un s Un7 Un11 Un¡3 Un¡5

l. Un[k] = x-el componente deseado está encontrado.


2. Un[k] < x-ningún componente en la rama izquierda puede ser igual a
x, desde entonces ali sus índices j es menos de k y por tanto también
Un[j] < Un[k]. Una búsqueda más lejana entonces tendría que ser
restringida a la derecha rama.
3. Un[k] > x-para razones análogas, una búsqueda más lejana aquí
tendría que ser re­ stricted a la izquierda rama.
Estas consideraciones Iead para programar (11.8).
var i, j, k: entero; q: Booleano;
Un: variedad [yo .. n] De T;. (11.8)
Empieza {asignación de valores a
Un} i := 1 ; j := n; q := falso;
repeat k: = (i + j) div 2;
SiUn[k] x entonces q : cierto más
= =
ifA[k]<xtheni:=k+ lelej:=k-1
Hasta que q V (i > J)
Fin.

La estrategia de búsqueda descrita por (11.8) se apellida búsqueda binaria.


Nota que el número de comparaciones necesarias es (en el mediano)
considerablemente Iower que que para una búsqueda lineal-
concretamente, como máximo registro2 n cuando comparado a n en
(11.6). El valor malo esperado es menos aún que registro 2 n. Naturalmente, la
búsqueda binaria es aplicable sólo si los componentes están ordenados. (Ve
también (11.32).)

Ejemplo: Mar/ar productos


Dado los números x 1, •.., x n y y 1, ••.,Yn, computar el producto escalar
n Ü
s =LX¡ *Y¡
i= 1

La definición de esta suma en plazos del recurrence relación


S¡ S¡_ ¡ + X¡ * y=
¡, So =
(11.9)

(11.1O)
84 CHAP. 11. LA ESTRUCTURA de DATO de la VARIEDAD

Cosechas el programa dado en (11.11) como sigue:


var s: Real; i: entero;
x, y: variedad [yo . . n]
Empieza {asignación ofinitial valora a x y y}
De real;. (11.11)
s := O; i := O;

Repite { s = j x[J] *
t
JÜ]}
i := i + l ; s := s + x[1] * y [z]
Hasta que i = n
Fin.
Cuando en ejemplo (11.6), las variedades están escaneadas estrictamente
sequentially, pero en contraste a (11.6), ali los componentes están
considerados en todo momento. La secuencia en qué están accedidos, aun
así, es irrelevante-el n las multiplicaciones incluso podrían ser actuadas al
mismo tiempo.
Este caso ocurre tan frecuentemente en el procesamiento de variedad
estructura que una notación especial es apropiada. Otra vez, expresaremos
él en la forma de una cláusulaMientras
repetitivarepite
similar a el y cláusulas.
Si Sis la declaración para ser repetida, V es una variable escalara (llamado el
controlado variable), anda y b es expresiones de el mismo tipo cuando V,
entonces la declaración.
Para V:= un a b S (11.12)
especifica que las dos declaraciones
V:= x;S (11.13)
Es para ser repetido, una vez para cada valor x en el intervalo un a b.
Siguiendo la tradición de frecuentemente utilizó lenguajes de programación,
las repeticiones están ejecutadas sequentially con valores x seleccionados en
orden ascendente de un a b. Declaración (11.12) entonces puede ser
considerado como equivalente a la secuencia de declaraciones (11.14)
Empieza V:= v 1 ; S; V:= v2 ; S; . . . ; V:= vn ; Envía (11.14)
Dónde v = 1 un, v=n b, y V¡= succ(v;_ ¡) para =i 2, ... , n. (lt Sigue que la
función de sucesor tiene que ser definida en el tipo de V, los cuales por tanto
no pueden ser reales.) Declaración (11.14) puede ser representado en una
forma cerrada por programa schema (11.15).

Si un�b
Empieza V :=
entonces
(11.15) un; while
S; V< b do
b e gin V: = succ( V); S
end
Fin
LA ESTRUCTURA de DATO de la VARIEDAD 85

Thi schemun reveun ls (Unm ong ot r detunl ils) thunt f r stun t em


o
no Uns ction if un > b . Fo r un ; b, the comp exity of the schem un is
ent spec ifi es
unn indicuntor o the complexity of the corr esponding ve rificunt ion rule, undded Sue
sunfke of completeness. Let P unnd Q( V) be unrbit runry condit ions.
for el

El preconditions es
Un {(V= un)/\ P] S {Q(un )] (11.16. l)
(b ) {Q(pre d(x))) S {Q (x ) } for ali un< x;;;;
b

Las consecuencias son


Unb){ (Un ;;;; b)/\ P} para V: = un a b S {Q(b)}
( ) (11.16.2)
{(Un> b)/\ P} para V:= un a b do·S
{P}
The un plicun tion of this inductive verificatión rule can be ilustrad por
rewritinG pprog runm (11.11) in the of rm
begins := O;
f r i : = lToneladas: = s + x[i]
o * y[i] (11.17)
Fin
i
We substitute s =O for P, und s = ¿ x j * yj for Q(i) in (11.16.1) und obtiene
j =1
two precondloions.

(Un) {(i = 1) /\ (s =O)} s := s + x[i] *Y[i] {s =J/ *Y }j j


(11.18.1)
1
(b) { s =;_Y
o, x j * yj } s := s + x[i] * y[i] {s = _"yo= x j * Yj }
;= 1 ; 1

Condition (b) holds of r unli i = 2, . .. , n unnd is eunsily verified. El n el


consequence derived by th e sunme substitut ion in (11 .16.2) is

{s=O} fori:= ltondos:=s+x[i]*y[i] o, x j *Yj} (11.18.2)


{s=_Y
;= 1

Obviously, condition Q( V) supones the función of the invariante in the


fication rules for t he whi e unnd repeunc t stuntements (7 .1 3) uns nd (7.1 4).
Nunca,
veri- un explicit identificunltio n of the ont rolled vunriunble i necessunry ,
How-
since unFno
ment: n unLal ssprueba
ignm enthatot othis
be vdaunr
n iof
unbterminación.
le is b imp l Enicit cambio,
ly sp ifiedél in
is the for
o en
f r s tate- ly , we sh ould n ote un c o ns iderun le u
n dv u
n ntu
nge of ered by the
cláusula.
provide d by
the fUnf ct thunt the s t of vunf lues un, . .. , b is finito.
O cou rse, the use o the
involvi ng unm rrunl y t structures . The f ollowin rule s um marizes the
Para la declaración no es restringida a
which Un for u un ion using un for clUnuse is ung ppropriunte.
Casos en programas
86 CHAP. JI. LA ESTRUCTURA de DATO de la VARIEDAD

Si una declaración es para ser repetido, el uso ofa para la declaración está
recomendada cuándo el número de las repeticiones necesarias es
sabidas a priori. Si su número deviene sabido sólo mientras las
repeticiones están siendo actuadas, entonces el rato y repetir las cláusulas
son las formulaciones apropiadas .

El siguiente tres ejemplos demostrarán el uso apropiado de estructuras de


variedad y para declaraciones.

Ejemplo: Encontrando el valor m áximo xU]


Encontrar el indexj tal que x j = max (xm , ... , xn )-
var j, k : m .. n;
x: Variedad [m .. n] De T;. (11.19)
beginj := m;
Para k : m +=1 a n hacer
Si x[k] > xU] thenj : =k
Fin

La condición Q(k)utilizó para la verificación es (11.20)


xU] ;::; x[i] Para ali i = m, ... , k
Ejemplo: Ordenando ofan variedad
Los componentes de una variedad son permuted de tal manera que
aparecen en un orden de decrecimiento de valor. Para cumplir esta
permutación ,

(a) Determinar el elemento máximo x j según programa (11.19),


(b) Intercambio x j y x 1, y
(c) Repite pasos (un) y (b), considerando los conjuntos Xz, ..., x m x 3 , ..., x m
etc., hasta único x n queda..

Esta receta puede ser formulada por la declaración

Para h=: 1 a n - 1 (11.21)


empieza {Q(h - l ),si h >
!}
1 : Encontrar el elemento más grande x j = max
(xh , ... , xn ); 2: Intercambio x h y x j
{ Q (h)}
Fin

Declaración está dado en detalle en (11.19), y declaración 2 puede ser


expresado como secuencia de tres asignaciones que utilizan un auxiliares
variables u.
u :=x[h];x[h] := xU];x[j] := u (11.22)
LA ESTRUCTURA de DATO de la VARIEDAD 87

Las condiciones utilizaron en verificar el programa es


P: empty (i.e., cierto) (11.23)
Q( h): x 1 � x2 � · · · � xh � X¡ para ali i > h
Por sustituciones adecuadas en (11.21), finalmente obtenemos el programa de
ordenar (11.24).

var h,j, k: l ..n;


x: Variedad [yo ..n] of T; u: T;
begin . ..
Para h=: yo a n - l
beginj:= h;
Para k := h + l a n hacer
(11. 24)
Entoncesj: = k;s ix[k] >
xUJ ] := xU];xUJ := u
u := x[h];x[h
Fin
Fin.

Este programa contiene un para declaración nested dentro de otro para


estatal- ment. El principio de declaración con si "x[k] > xUJ entonces . .
"Está ejecutado (n -
n j
1) + (n - 2) + • • • + 2 + 1 = n - 1) (11. 25)

Tiempo. El esfuerzo computacional expended con este primitivo


ordenando el método crece aproximadamente con la plaza de el número de
componentes para ser ordenados. Para aplicaciones con grandes n, el uso de
más sofisticado ordenando los métodos es por tanto recomendados.

Los componentes de variedades necesitan no ser scalars-ellos ellos


puede ser estructurado. Si son otra vez variedades, entonces la variedad
original Un se apellida multi- dimensional. Si los componentes de las
variedades de componente son scalars, entonces Un se apellida una
matriz. El declaration de una variable de variedad multidimensional sigue
el patrón formulado en (11.1). Por ejemplo, en el declaration
varM: Variedad[un .. b]De variedad[c .. d]De T
(11.26)
M está declarado para constar de b - un + yo componentes (a menudo
filas matriciales llamadas) con índices un, ... , b, cada cual del cual es una
variedad de d - e + 1 compo- nents de typ e Twith indices e, ..., d. To
Denota the ith componente (fila matricial) de M, la notación convencional
M[i] un�i�b
Está utilizado, y su jth componente de tipo T está
denotado por
][j] un � i �b, e � j �d (11.27.1)

(11.27.2)
88 CHAP. 11. LA ESTRUCTURA de DATO de la VARIEDAD

Es consuetudinario y conveniente de utilizar las abreviaturas siguientes, el


cual are enteramente equivalent to (11.26) y (11.27.2 ), respectivamente.

varM: Variedad[un .. (11.28)


b,c..d]De T.
M[i,j]

Ejemplo: Multiplicaci ó n ofmatrices


Da n the two real-valoró matrices Un (m x p ) y B (p x n ), computa the matrix
producto C (m x n), un s defi ned por

cij =L Un¡k* Bkj


(11.29
k=yo

for i =1, ..., m y j =1, ..., n.


El formulation de programa (11.30) follows de (11.29 ) en una manera­ de
delantero recta.

var i : 1 ..m ; j : 1 ..n ; k : 1 ..p ; s : Real;


Un: variedad[l ..m, yo ..p] De real;.
B: Variedad[l ..p, l ..n] De real;.
C: variedad[! ..m, l ..n] De real;.
begió {Asignación de valores iniciales a Un y B}
Para = i : 1 a m hacer
Para j = : 1a n (11.30)
Empieza s:= O;
Tenedor := l superior dos:= s +
Un[i,k]*B[k,j]; C[i,j] : =s
Fin
Fin.

Este programa es un ejemplo de una imbricación múltiple de declaraciones


repetitivas. Desde tales programas invariablemente implican relativamente
Iarge cantidades de com­ putation, un análisis más cercano de el ensuing el
esfuerzo es apropiado. Es evidente que la repetición en i está ejecutado m
tiempo, el en j m * n tiempo, y th e en e on k m * n * p tiempo. AssuminG que
m, n, y p are large ( » 1 ), el esfuerzo expended en la declaración

s := s+ Un[i,k]*B[k,j]
Domina completamente. De este, aprendemos el sencillos pero lección
importante que el "innermost" la declaración repetida tendría que ser
formulada con el cuidado más grande para minimizar computación y
maximize eficacia. El esfuerzo gastado en una multiplicación matricial crece
con el tercer poder de n, suponiendo que m =n =p [cf.Exercise (11.8)].
EJERCICIOS 89

EJERCICIOS

11.1 Dejado el matricial Un ser dado cuando

(a) Ejecutar la declaración. (11.31)


fori := 1 a3
forj:= 1 a3doC[i,J] := Un[Un[i,J], UnU, 1]
Cuál es el valor resultante C?
(b) Es el orden en qué los índices i andj está escogido pertinente?
(c) En (11.31), reemplazar la variable C por Un . Qué es el valor resultante de Un ?
(d) Repite parte (c) por tomar el siguiendo secuencia invertida de pares de índice para i
andj.
(3,3), (3,2) ... (1,2), (1,1)

Comparar el resultando Un con el obtenido en (c).

11.2 Verificar la versión siguiente de el programa de búsqueda

binario

i := m;j := n; (11.32)
Repite k : = (i + 1) div 2;
Si Un[k] 2 x entonces
i:= k+ l; si Un[k] � x
en ton c es j := k - l
Hasta que i > j

Comparar el número de comparaciones necesarias con aquellos en programa (11.8),


notando que la condición de terminación es más sencilla en (11.32).
11.3 Un complejo-valorado matricial Z está representado por un par (X, Y) de real-valoró
matrices tal aquel Z = X+ iY. Diseño un programa para computar el producto de dos
complejo valoró matrices (Un, B) y C, < D); aquello es,
X+ iY =(Un+ iB)• (C + iD) (11.33)
Pista:
(Un+ iB)•(C+ iD) = (AC- BD) + i(ANUNCIO + (11.34)
BC)

Computar las tres matrices


R = Un• S = B• C, T = (Un + B) * (C - D)
D,
Y entonces X = T+ R - S y Y =R+S
Determinar el número de requirió adiciones y multiplicaciones (como función de
la medida matricial n) y compararles con aquellos obtenido cuándo utilizando (11.33)
directamente.
90 CHAP. 11. LA ESTRUCTURA de DATO de la VARIEDAD

Yo 1.4 Un polinomio

(11.35)
Está representado por la variedad de coeficientes un. Diseño una informática de
programa Pn(x) para un dado x. Pista: factorización de Uso según Horner;
aquello es,
P.(x) = (· · · (Un0 x + un1 )* x + · · · + unn_ 1 )* x + ª• (11.36)

11.5 Diseño un programa que encuentra el más grande y el valor más pequeño en una
variedad de n números
var Un: array [! ..n]De entero.

Pista: yot is possible to do this using less than ( 3/2)n comparaciones.

11.6 Dado una variable de variedad


var M: arruny [yo ..n, 1 ..n]of Entero

Construir un programa que asigna los números naturales 1, 2, ..., n2 a el com­ ponents de
M tal que forma una plaza mágica; aquello es,

f M[i,kJ f
=k=yoM[k, 1] = e
i = 1, .. . ,n
k=Yo

f M[k, k]= f M[k, n-k+ 1]= e


k=Yo k=yo

Dónde C = (n/2)(n2 + 1). Supone n para ser extraño. Pista: Asignar los números 1,
..., n2 sequentially a componentes de M, empezando con 1 en M[i,j] = M[(n+ 1)/2,
n], entonces aumentando i andj por 1 (modulo n) cada vez para n - 1 pasos, y
decreasingj por 1 y dejando i sin cambios en cada nth paso.

11.7 Dado el problema para computar el primer n + 1 plazos en la serie que representa el sine
función [cf. (9.29)] para argumentos x tal que O � x � n/4, el programa siguiente
estuvo diseñado. (s Es presuntamente el resultado.)

var i: Entero; h, s: real;


t: array [O . .n] De real;. (11.37)
Empieza t[O] := x; h := sqr(x); s := x;
Para i : = 1 a n hacer
t[i] := -t[i-l]•h/(2•i •(2•i+ l));
Para i : = 1 tonelada dos : = s + t[1]
Fin.

Es el programa correcto? Qué tendría que ser criticado?


11.8 Dado es dos real-valoró matrices X y Ywith 2n filas y columnas. Construir un
programa para computar el producto matricial Z = X• Y, utilizando la
relación siguiente (debido a Winograd) para computar los productos escalares
necesarios [cf. (11.29)].
+ Yzk-1)* (x2k-1 + Y2k)
2n n
L Xk* Yk =L (x2k
k=y o
k=Yo
(11.38)
n n

-¿ k=Y o
Xzk* Xzk-1 - L
k=yo
Y2k* Y2k-1

'-----v----' '-----v----'

x y
Pista: El problema requiere la computación de 4n 2 productos escalares de la
forma

Y
2n

X¡k* Ykj
k=Yo

o
Utilizando (11.38), sólo 2n valores x y y está necesitado.
El método habitual de multiplicación matricial (11.30) requiere 8n3 adiciones y
multiplicaciones. Determinar el número ofoperations requirió por vuestro
programa como función de n..
SUBRUTINAS,

12 PROCEDIMIENTOS, Y
FUNCIONES.

12.1 CONCEPTO Y TERMINOLOGÍA.

Frecuentemente, una secuencia segura ofstatements tiene que ser repetido en


varios sitios dentro de un programa. Para salvar el programador el tiempo y el
esfuerzo necesitaron a recopy estas declaraciones, más los lenguajes de
programación ofrecen una subrutina (subprogram) facilidad. Este dispositivo lo
hace posible para asignar un nombre libremente escogido a la secuencia
ofstatements y entonces para utilizar aquel nombre como una abreviatura
wherever que la secuencia de declaraciones ocurre. Siguiente ALGOL
terminología, llamaremos tal nombró secuencias de declaraciones pro- cedures.
Si los procedimientos también representan un valor resultante y poder allí­ fore
ser utilizado dentro de expresiones, son calledfunctions. La definición ofthe la
abreviatura se apellida procedimiento declaration o función declaration. Su uso en
el programa se apellida una declaración de procedimiento o procedimiento cal!.
Una función especificada dentro de una expresión se apellida afunction
designator o función cal!. La notación particular utilizada para procedimiento
declarations y declaraciones de procedimiento pueden ser encontradas en los
esquemas de sintaxis en Apéndice Un y en el
Ejemplos en este capítulo.

Ejemplo: Procedimiento declaration y declaraci ó n


La secuencia ofstatements
t:=rmodq; r:=q; q:=t (12.1)
Puede ser abreviado por utilizar el procedimiento declaration en
(12.2). (12.2)
Procedimiento
P;
begin t : = r modq; r : = q;q: = Tiende
La secuencia, wherever ocurre, entonces puede ser reemplazado por la declaración
de procedimiento
p (12.3)
92
SEC.12.1 CONCEPTO Y TERMINOLOGÍA 93

Un procedimiento declaration consta de dos partes: el procedimiento que


encabeza y el cuerpo de procedimiento. El encabezando (primero Iine, 12.2)
contiene el identificador de el procedimiento. El cuerpo (línea de segundo en 12.2)
consta de la declaración(s) para ser abreviado.

No haríamos un asunto fuera de tal sencillo notational convenciones, a no ser


que sorne conceptos importantes , básicos estuvieron implicados. De hecho, el
proce- dure es uno de las pocas herramientas fundamentales en el arte de
programar de quién maestría tiene una influencia decisiva en el estilo y la
calidad de un programa- mer trabajo. El procedimiento sirve como dispositivo
para abreviar el texto y, más significativamente, como medios a partición y para
estructurar un programa a lógicamente coherente, cerró componentes.
Partitioning Es esencial en debajo- estando un programa, particularmente si es
tan complejo que el texto supone una longitud que es imposible a encuesta en
una mirada. La estructuración a subrutinas es indispensable ambos en
documentar y en verificar el programa. Allí- fore, es a menudo deseable de
formular una secuencia de declaraciones como procedimiento
---Incluso cuándo ocurre sólo una vez y la motivación de acortar el texto es por
tanto ausente. Información adicional sobre variables (aquel ser inspeccionado o
aquellos alterados por el procedimiento) o sobre condiciones que tiene que ser
satisfecho por los argumentos, puede ser proporcionado oportunamente en el
encabezando del procedimiento.
Dos otros conceptos de programación básicos enfatizan la utilidad del
procedimiento, particularmente su función en programa estructurar.
Frecuentemente, objetos o variables seguros (a menudo variables auxiliares
llamadas) utilizó dentro de una secuencia dada de declaraciones tiene ninguna
importancia cualquier cosa fuera de aquellos estatal- ments. El perspicuity de un
programa es sin duda realzado por claramente exhi- mordiendo el alcance de
importancia de tales objetos. El procedimiento aparece para ser la unidad textual
natural por qué para delinear el seope ofvalidity de tan-llamó.
Objetos locales.
Igualmente frecuente es el caso donde una secuencia segura de
declaraciones aparece en varios sitios de el programa en no exactamente idéntico
pero altamente forma similar. Particularmente importante es la situación donde
la diferencia entre las ocurrencias individuales de las declaraciones pueden ser
eliminadas por sustituciones sistemáticas de identificadores o expresiones. En
este caso, el estatal- ments para ser abreviado puede ser abstracted a un
procedimiento schema. Las entidades todavía para ser sustituidos para las
ocurrencias individuales se apellidan proce- dure parámetros.

12.2 LOCALITY

Si un objeto-una constante, una variable, un procedimiento, una función, o


un tipo- es significativo sólo dentro de una parte segura del programa, se
apellida local. En tales casos, es apropiado de dar aquella sección de el
programa un nombre (i.e.,
94 CHAP. 12. SUBRUTINAS, PROCEDIMIENTOS, Y FUNCIONES.

Para formular él como procedimiento). Los objetos locales son entonces


declarados en el encabezando del procedimiento. Desde procedimientos
ellos puede ser definido localmente, procedimiento dec!arations Puede ser
nested.
Ejemplo: Procedimiento declaration con local variable declaration
Procedimiento P;
var t: Entero; (12.4)
Empieza t : = r mod q; r : = q; q : = t fin
Dentro del cuerpo de procedimiento, dos clases ofobjects está utilizado;
objetos locales (t) y nonlocal objetos. El último está declarado en el entorno
ofthe procedimiento declaration. Ifthey Está definido en general programa,
se apellidan globales, e ifthey está definido en la lengua (i.e., en el contexto
en qué el pro­ el gramo es "embedded"), se apellidan estándares. El alcance
ofvalidity oflocal objeta is the entero text ofthe procedimiento. This implies that
Unf ter terminación de el proceso descrito por un procedimiento, el espacio
de almacenamiento utilizado para las variables locales deviene disponibles
otra vez y puede ser utilizado para otras variables. Evidentemente, en una
activación más tardía (llamada) ofthe procedimiento mismo, los valores ofits las
variables locales son otra vez undefined, tan eran en la primera activación.
En la identificación oflocal objetos, es esencial que los nombres pueden
ser libremente escogidos sin considerar a el entorno. Pero una situación
entonces puede surgir en qué el identificador (dice, x) aquello estuvo
escogido para una variable local en procedimiento P es idéntico con aquel
ofan objeto en el entorno de P. Naturalmente, estas marcas de situación
notan únicas ifthe nonlocal x es ofno importancia a P. Por tanto adoptaremos
la convención básica que en un caso ofa conflicto ofnames, x dentro de P
denotará la variable local, y x exterior de P denotará el nonlocal objeto.
Ejemplo:Procedimiento con aparente confiict ofidentifiers (d)
vara, b, d,e: entero; {gl�bal procedimiento} de
variables Multiplica; {procedimiento global}
vare, d: entero; {variables locales}
begin { e : = Un * b,cf. (7. 18)} (! 2.5)
c:=Un;d:=b;e:=0;
Mientras d =/: O
hacer
Empezar si extraño(d) entonces e
: = e + e;
e : = 2 * e; d : = d div 2
Fin
Fin;
Empieza {programa principal} un: = 5; b : = 7; d : = 10;
Multiplica
{Un = 5,b = 7,d=10,e = 35}
Fin.
Es conveniente de considerar el programa principal como procedimiento
sin un nombre. Su entorno es el sistema operativo de el ordenador, donde
ali los objetos estándares son predefined. Esta vista también explica por qué los
identificadores pueden
SEC. 12.3 PARÁMETROS de PROCEDIMIENTO 95

Ser escogido sin respetar a el postulated nombres estándares. Siempre y


cuando un objeto estándar no es utilizado en el programa, cualquier uso
accidental o intencionado de su identificador como el nombre para un
objeto local tiene no efecto adverso whatso­ nunca.

12.3 PARÁMETROS de PROCEDIMIENTO

lf Una secuencia particular de operaciones está aplicada a operandos


diferentes en partes diferentes de un programa, la secuencia está formulada
como procedimiento, y los operandos devienen parámetros. Los
identificadores introdujeron en el proce­ dure dirigiéndose a denota los
operandos son calledformal parámetros. Están utilizados sólo dentro del
cuerpo de procedimiento y es local a él. Los objetos para ser sustituidos
para los parámetros formales se apellidan parámetros reales. Están
especificados en cada declaración de procedimiento o función designator. El
tipo de el parámetro real está determinado por el tipo de el parámetro
formal, cuando especificado en el procedimiento que encabeza. Además
especificando el tipo de el parámetro, también es necesario de indicar la
clase de sustitución deseó, desde cualquier el valor actual o la identidad de
la variable real o expres­ sion puede ser sustituido. lt Es consuetudinario de
distinguir tres clases de sustituciones de parámetro.
l. El parámetro real está evaluado, y el valor resultante está sustituido para el
parámetro formal correspondiente. Esto se apellida sustitución de valor. Es
el más situación encontrada generalmente.
2. El parámetro real es una variable ; los índices posibles están evaluados; y el
variable así identificado es entonces sustituido para su formal corre­
spondence. Esto se apellida variable (referencia) sustitución. 1t está utilizado
si el parámetro representa un resultado de el procedimiento.
3. El parámetro real está sustituido literalmente, y ninguna evaluación
ocurre. Esto se apellida sustitución-por-nombre. Ocurre raramente en
practica! applica­ tions.
Ejemplo:
Los efectos de las tres clases de sustituciones de parámetro están
demostradas por programa (12.6). Investigamos las consecuencias de la
declaración de procedimiento P(un[i]).
var i: Entero;
[
Un: variedad 1 .. 2] de entero;.
Procedimiento P(x: entero); (12.6)
begini:=i+ 1; x :=x+2
fin;
Empieza {programa Principal}
Un[!]:= 10; un[2] := 20; i:= 1;
P(Un[i])
Fin.
96 CHAP. J 2. SUBRUTINAS, PROCEDIMIENTOS, Y FUNCIONES.

Caso 1: Sustitución de Valor


x Es una variable con valor inicial
10. Valor final de un = (10, 20).
Caso 2: Sustitución Variable
x = Un[l]
Declaración x :=x+ 2 ahora significa un[l] +
:=un[l] 2. Final valor of un = (12, 20).
Caso 3: Sustitución-por-Nombre
X = un[i]

Declaración x : = x + 2 ahora significa un[i] : =


un[i] + 2. Valor final de un = (10, 22).

Para distinguir las clases diferentes de sustitución, nosotros


postulado el siguiente notational reglas.
l. V alue la sustitución es la forma más frecuente de sustitución, y está
tomado por default, a no ser que un especificador explícito está
suministrado.
2. La sustituci ón variable está indicada por el símbolo var delante de el
parámetro formal(s).
3. Refrenamos de introducir una notación para sustitución-por-nombre,
porque las situaciones equivalentes están tratadas en Sección 12.4.

Según estas convenciones, podemos reescribir programa (12.5) en la forma


de un procedimiento con tres parámetros cuando mostrados en (12.7).

Ejemplo: Procedimiento con parámetros


vara, b,e, d,e,f: entero;
El procedimiento Multiplica(x, y: entero; var z: entero);
{ x,y, z es los parámetros formales}
Empieza z :=O;
Mientras x -:/- O hacer (12.7)
Empezar si extraño(x) entonces
= +
z: z y;
y :=2 * y; x :=x di v 2
Fin
Fin;
Empieza { programa Principal}
Un:=5; b:=7; d:=11; e:=13;
Multiplica(un, b, e); Multiplica(d - b,e - un,f)
{Un= 5,b =7,c=35,d= 11,e=13,f= 32}
Fin.
Programa (12.7) muestra que en el caso de sustitución de valor, el
parámetro formal denota un local variable aquello inicialmente ha sido asignado
el resultado
SEC. i 2.3 PARÁMETROS de PROCEDIMIENTO 97

De la evaluación de el parámetro real correspondiente. Después de esta


inicial assignment,however, there no longer existe cualquier "conexión"
between el real y los objetos formales. Esto nos dejo para formular dos reglas
generales que gobiernan la elección de sustituciones..

l. lf Un parámetro es un argumento más que un resultado de un


procedimiento (func­ tion),el n un value substitution is (normalmente)
apropiado.
2. lf Un parameter
substitution es actos un s resultado of un procedimiento,el n un variable
Necesario.
Seguro pitfalls es inherente en el método de sustitución variable. Surgen
porque la misma variable puede ser hecha accesible debajo más de una
identificación. Esto es particularmente peligroso cuándo tratando variable
estructuradas such un s variedades. Yon such casos,it is imperativo that the el
programador adhiere estrictamente a la regla importante siguiente de
programar disciplina: Every mosto de parámetro variable be disjoint from ali other
parámetros; that is, ningún parámetro tendría que denotar el entero o un
componente de cualquier otro param­ eter. Los peligros potenciales en
violar esta regla está mostrada en el ejemplo siguiente de un
procedimiento de multiplicación matricial sencillo.

Ejemplo: Pitfalls de parámetros variables


Tipo matrix = variedad [! .. 2,1 .. 2] of entero;
Procedimiento mult (var x, y, z: matrix); (12.8)
beginz[Yo, !] := x[Yo, l ]*y[yo, !] +
x[l,2]*y[2,!];
z[l,2] := x[yo, l ]*y[l ,2] + x[l ,2]*y[2,2];
z[2,1] := x[2, 1]* y[ 1,1] + x[2, 2]* y[2, 1];
z[2,2] := x[2, 1]*y[ 1,2] + x[2, 2]* y[2, 2];
Fin

Dado las matrices

Un = ( _ �:) yB = (: - :)

Podemos investigar los efectos de las declaraciones de procedimiento


siguientes.
. 70
l. mult(Un, B, C) y1 eIds C -- ( ).
0 7
-
2. mult(Un, B, Un) cede Un = (:
: · )

3. mult(Un, B, B) cosechas B = (
7
º)·
-4 6
98 CHAP. 12. SUBRUTINAS, PROCEDIMIENTOS, ANO FUNCIONES

No t e thunt t correct results in stun te ent yo cunn be lobtuni ed in unli three Casos,
if x Unnd y unh re specifi ed uns vunlue_p unrum
nmeter s [see un so Exnercise 11.1].

12.4 FUNCIONES Y PROCEDIMIENTOS


PARAMÉTRICOS

Un pro cedbu
is to e re ted durinGFthise exusod
orufunción
comp ecutioun
n los fun parameter o un
Divertidoc tion G , if F G, unf n d
different procedures or functions in diff erent cun ls of G. Nosotrosll-sabidos
proc dure or
f F rep
iLos resents son algoritmos para computar un G integral de una función
ejemplos
F.

Ejemplo: Simpson integraci ón


Para aproximar la integral

s = rf(x)dx (12.9)

Computamos
h la suma de un número finito de valores de muestra ¡;.
= Uo + 4f¡ + 2f2 + 4J3 + 2f4 + · · · + 4fn-3 + 2fn -2 + 4fn-1 + fn)
Sk

3
(12.10)
k
where ;¡ = f(Un+ i * h), h = (b - un)/n, Y = n 2 . The number of Muestra
poi nts is n + 1, unnd h is the distancia between uny two adyacente sample puntos.
The integrUn l vun lue s Es entonces aproximado por la secuencia s , s •••,,s
w hic cconverges i,1f th2e 3s function is sufficiently well behaved (Liso) y si.
Unn exh un t unrithmetic is un sumed.

(12.11)

-- ------+--+----+----+--+----+-----11---
Un b
•x
k=
Yo

k=2

k=3
SEC. 12.4 PROCEDIMIENTOS PARAMÉTRICOS Y FUNCIONA 99

En cada paso, el número de puntos de muestra está plegado.


Naturalmente, un programa­ bien diseñado evitará evaluar la función 2k
tiempo en cada kth paso; en cambio, él reutilización el ¡; los valores
computaron en pasos más tempranos. La suma sk es por tanto
representado por los tres plazos
(12.12)
Qué denotar las sumas de los puntos de muestra con pesos 1, 2, y 4, respec­
tively. Pueden ser definidos en plazos del recurrence relaciones en (12.13),
para k > yo, y los valores iniciales en (12.14).
s¡ 1> = ½sl 1�1
(12.13)
4h
sl4 > = �f(un + h) + f(un + 3h) + · · · + f(un + (n - l)h)

s\ 1> = �f(un) + f(b))


s\ 2 > = O (12.14)

s\4 > = :h (ª; b)


J
Cuando apropiadamente sustituido en programa schema (9.23), estos
rela­ tions ceder el programa de integración (12.15), el cual está formulado
como funcionar withfas parámetro.
Función Simpson (un, b: real;functionf: real): real;
var i, n: entero;
s, ss, si, s2, s4, h: real;
{f(x) Es un real-función valorada con un solo, real-
parámetro valorado. La función tiene que ser bien-
definido en el intervalo un � x � b}
Empieza n = : = 2; h : (b - un)*0.5;
si :=h *(f(Un)+f(b)); s2:=0;
s4 := 4*h*f(un + h); s:=si+ s2 + s4; (12.15)
repeat ss : = s; 11 : = 2 * 11; h : = h/2;
s1 : = 0.5 *sl; s2 : = 0.5 * s2 + 0.25 * s4;
s4:=0;i := 1;
Repite4 := s4 +.f(Un + i*h); i := i + 2
Hasta que i > n;
: 4 *h *s4; s : si + s2 + s4
Hastas4que
= < r.;
abs(s-ss) =
Fin Simpson : = s/3
100 CHAP. 12. SUBRUTINAS, PROCEDIMIENTOS, Y FUNCIONES.

La función Simpson ahora puede ser utilizada como un operando en


cualquier real expres- sion. Para caso, la declaración.

u : = Simpson (O, n/2, pecado) (12.16)

Denota la asignación.
n/2 f
0
u = Pecado(x) dx

Aun así, sólo un identificador de función puede ocurrir como un tercer


parámetro real. En más lenguajes de programación, el uso de una expresión
no es dejada. (La excepción notable es ALGOL 60 con el tan-nombre

n/2
f
llamado-facilidad de parámetro.) Para caso, para computar

dx
u= 2 - - �- - -
( 12.17)
0
-
Un( c os x + b sin_2x __
_2_ _ _ _ )½

Utilizando el Simpson función, otra función, F, tiene que ser explícitamente


declaró. Así

Función F(x: rea{): real; (12.18)


Empieza F: = 1/sqrt(sqr(un * cos(x)) + sqr(b * pecado(x)))
fin

(12.19)
Sólo entonces es posible de expresar (12.17) por la declaración
u : = Simpson(O, n/2, F)

EJERCICIOS

12.1 Formula programas (7.18), (7.22), (9.17), (9.28), (10.21 ), ( 11.24), y (11.30)
Cuando procedimientos o funciones con suitably parámetros escogidos.

12.2 Considerar la función declaration

functionj(x,y: real): real;


Empezar si x � y entonces/: = (x + y)/2 más (12.20)
f := f(.f(x + 2,y - 1),j(x + l,y - 2))
Fin

Qué es el valor fuera(!, 10)?


Cómo puede f(un, b) ser representado y computado en una manera
más sencilla?
EJERCICIOS 1 01

12.3 Ejecutar el siguiente tres programas y determinar los valores de los parámetros
reales del escribir declaraciones.

(a) vara, b, e: entero;


Procedimiento P(x,y: entero; var z: entero);
Empieza z:= x +y+ z; escribe(x,y, z)
Fin; (12.21)
Empezarun:= 5; b := 8; e:=3;
P(Un,b,c); P(?,un+b+c,un); P(un*b,adivb,c)
fin.

(b) var i,j, k: entero;


Procedimiento P(var i: entero);
Empieza i :=i + 1; escribe(i,j, k)
Fin {P};
(12.22)
Procedimiento Q(h: entero; varj: entero);
var i: Entero;
procedimiento R;
begini:=i+ 1 fin
{R};
Empieza i: =j;
Si h = O entonces P(j) más si=h yo entonces P(1)
más R; escribe(i,j, k)
Fin {Q};
Empiezai:=O;j:=l;k:=2; Q(O,k); Q( l,i); Q(2j)
fin.

(e) Procedimiento P(procedimiento R; b: Booleano);


var x: Entero;
procedimiento (12.23)
Q; beginx :=x+
yo
Fin{Q};
Empieza x:=O; sib entonces P(Q,falso) más R;
escribe(x)
Fin {P};
empieza P(P, cierto)
fin.

12.4 Según Gauss, el elliptic integral (ve 12.17)

2 r 12 dx
f = 1t Jo (un2 cos 2 X+ b2 pecado2 x)½

Es igual a el límite de cualquier de las dos secuencias


convergentes
1 02 CHAP. ) 2. SUBRUTINAS, PROCEDIMIENTOS, Y FUNCIONES.

Cuando definido por el recurrence relaciones para > i O. Así

S¡ = (s¡ - ¡ + l¡_ 1 )/2


l¡ = Js¡ -¡ *t¡ -¡

Y s 0 = un 10 = b. El cálculo ofthe dos secuencias se apellida la aritmética­ método


,
malo geométrico. Formular una función adecuada declaration.

12.5 El Romberg método de integración aproxima la integral.

f1(x) dx
Por la secuencia
lo.o, l1,0, 12,0, • • •
Cuál es convergente para suficientemente bien-behaved (liso) funciona f Los plazos
están definidos por el recurrence relación
1
m _ (4 * l
m
l =- -l )
m,k
4 ¡ m-1,k+yo m-1,k

Para > m O, y por las funciones iniciales

_ b -Un 1
lo.k - ( do+ f1 + •·· + Í. -1 + z1 f.)
n
Dónde n = 2k y ¡; = f(un + i * (b - un)/n). Formular una función declaration con
parámetros un, b, y f y aproximar la integral (según Rom­ berg) a una exactitud
relativa especificada r.. Pista: El programa tiene que evaluar la función f sólo una vez
en cada punto de muestra. En cada paso, el número de punto de muestras is plegó.
Nose Unn array variable T such that unf ter el kth paso

T[¡] = lk - i,i i =O, ...,k


En caso de convergencia mala, la iteración tendría que ser rescindida después, como
máximo,
p Pasos; aquello es, k =O, ... , p.

12.6 Dejado un "cero" ofa real-función valorada f(x) ser definido como el valor x0 tal aquello

(f(x0 - e) < O) = (f(x0 + 1:) > O)


ife is Escogión arbitrarily pequeño.Design Un function program ingenioh parámetros un, b,
andfthat Determina un cero de/(x) en el intervalo un� x� b ifthe relación

(f(Un) < O) = (f(b) > O)


Es guaranteed para aguantar. Hinl: Uso el método ofrepeated halving ofthe el intervalo
que contiene el cero. Nota la semejanza de este método, llamó biseclion a binario
,
buscando (ve 11.32). Cuántas evaluaciones offare necesarios siun, b, ande está dado?
TRANSFORMACIONES DE
REPRESENTACIONES de
13 NÚMERO

La idea abstracta de un número es independiente de su posible representa­


tions. Las operaciones en números pueden ser precisamente definidos por
conjuntos de axiomas generales. Si estas operaciones son para ser actuados
en números concretos, qué­ nunca, entonces una representación particular
tiene que ser escogida de modo que el resultado será reconocible.
La razón para definir operaciones en números por generalmente válidos
algo­ rithms sin referencia a una representación concreta Iies en el deseo
de habilitar el procesador cobrado con la ejecución de operaciones de
aritmética para escoger la representación más adecuado a sus capacidades.
Ordenadores digitales modernos, dados esta libertad de elección,
representaciones de uso basaron en el alfabeto binario. Su notación, aun así,
es inadecuado para humanos, quiénes han sido entrenados de tempranos
childhoodto utilizar el sistema decimal. Entrada y dispositivos de producción de
ordenadores son por tanto equipados con conjuntos de carácter con­ taining
dígitos decimales (cuál, naturalmente, es internamente codificado en
plazos de bits). A recibir y emitting dato numérico, los ordenadores son
entonces instruidos para transformar el externally representación utilizada a su
forma internamente utilizada y viceversa. Las características de la
representación de número­ decimal común son

(a) La notación posicional de dígitos weighted por poderes de un tan-base


llamada
B, y
(b) La elección de 10 cuando el número de dígitos distintos y cuando la
base.
La generalización de el problema de conversión de representación
algo­ rithms a sistemas con base arbitraria B ( > 1) no introduce cualquier
addi­ tional complicaciones. El tratamiento de algoritmos de conversión ,
qué­ nunca, ser restringidos a sistemas de número posicional. Por ello la
elección B 10 representa el sistema decimal como caso concreto. Número=
posicional

103
104 CHAP. )3. TRANSFORMACIONES DE REPRESENTACIONES de NÚMERO

Los sistemas tienen la propiedad común que la secuencia <>n= d 1 • • • dn de n.


Los dígitos denota el número
b = L d;* Bn -i = ( .. ·(d * B + d )* B + .. + ª 1)* B + un
n

(13.1)
n ¡ 2 n- n
i= 1

Dónde d; es el valor numérico representado por el carácter (dígito) d; y B es la


base de el sistema de número. Cada número x(O �x < B n) es singularmente
representado, si hay exactamente B dígitos distintos con valores O, 1, .. . ,
B-1 disponible. lf El primer i los dígitos que representan un número está =
denotado por <>;
d1 • • • d;, entonces recurrence relación (13.2) inmediatamente sigue de (13.1)
Con J 0 = O.
Ji= Ji_ 1 * B + d; (13.2)
De (13.2), también sigue aquello
b¡ _ 1 = b; div B y J; = <i; mod B [cf.También 7.23] (13.3)
En programas subsiguientes, la función de representación J será escrito como
num(d) con un ámbito restringió a caracteres solos (dígitos). En el mismo
Tiempo, su inverse será denotado por rep(x) tal aquello
rep(num(d)) = d Y num(rep(x)) = x (13.4)
Estas funciones son dependientes en el conjunto de carácter concreto
utilizó. Para el ASCII conjunto de carácter, por ejemplo, pueden ser
expresados en plazos de las funciones de transferencia estándares
primitivas chr y ord:.

rep(x) = chr(x + ord('O')) Y num(d) = ord(d) - ord('O') (13.5)


El inverse algoritmo para computar una secuencia de dígitos d1 • • . d=n <>n -
El propósito de los programas aquí es para extender esta transferencia
primitiva func- tions a los números más grandes que B y a secuencias enteras
de dígitos, respectivamente.

13.1 ENTRADA ANO PRODUCCIÓN DE


ENTEROS NO NEGATIVOS EN
FORMA POSICIONAL

Un programa para computar el número que está representado por una


secuencia de dígitos en un textfile D está obtenido por aplicar recurrence
relación (13.2) para programar schema (9.2) y utilizando un repetir
declaración en vez de un rato estatal- ment. El programa está formulado
como procedimiento en (13.6), el cual supone que encima entrada el buffer
variable Dj representa el primer dígito d 1• 1t más allá supone que los dígitos
están seguidos por un carácter que no es un dígito y él procederán para
leer D hasta aquel carácter ha sido asignado a Dj..
SEC. 13.1 ENTRADA Y PRODUCCIÓN DE ENTEROS NO NEGATIVOS 105

Este esquema es más apropiado cuándo un archivo de entrada tiene que ser
leído, donde las secuencias de dígitos son embedded dentro de un texto
general (en un programa, por ejemplo).

El procedimiento leído(var x: entero);


Empieza x := O; (13.6)
Repite x : = B * x +
num(Dj);consigue(D)
Hasta que
,dígito(Dj)
Fin

El dígito de función Booleano(d) depende, como num(d), en el subyacente charac­


ter conjunto char. Para el ASCII conjunto de carácter, para caso, está
expresado cuando
Dígito(d) = ('O' � d) /\ (d � '9') (13.7)
El inverse algoritmo para computar una secuencia de dígitos d1 • • • d=n bn
Representando un número <\ en el sistema de número posicional con base
B es
Obtenido por aplicar ecuaciones (13.3) para programar schema (9.2), y por
otra vez utilizando un repetir en vez de un rato declaración. Dado un
número b¡, su último dígito en aquella representación está obtenido por
dividir él por B y por aplicar­ ing la función de transferencia primitiva rep(x)
a el resto resultante. El remainingdigits está obtenido por aplicar el mismo
algoritmo a el cociente. Si los dígitos d 1 , • • • , dn es para ser anexado a un
archivo de producción D, entonces el hecho que el algoritmo les genera en
orden inverso (el último dígito está generado primero) es inconveniente.
Requiere un buffer tienda, más oportunamente representado por una
variable de variedad d. Esto cede programa (13.8), el cual es
Otra vez formulado como procedimiento.
El procedimiento escribe(x: entero);
var u: Entero;i: O ..n; (13.8)
d: Variedad [l ..n] De char;.
Empieza {O � x < sn} u=: x;i : = n;
Repite d[i] := rep(u mod B);u := u div B;
i := i - 1
Hasta que i O; =
Repite {dígitos de producción en orden
inverso}
i := i + l; Dj := d[i];Puesto(D)

Fin
Hasta que i =n
Este programa puede ser fácilmente mejorado en dos respetos.

l. Para suprimir Ieading zeroes, la condición de terminación de el primer


repeti­ tion está cambiado de i = O a u = O. Nota que un dígito es
todavía emitido, incluso si x = O.
106 CHAP. 13. lRANSFORMATIONS DE REPRESENTACIONES de NÚMERO

2. Por introducir una variable auxiliar v, las dos declaraciones que implican el
(normalmente caros) div y mod las operaciones están reemplazadas por

v := u div B; d[i] := rep(u - B* v); u:= v

13.2 PRODUCCIÓN DE
FRACCIONES EN FORMA
POSICIONAL

En sistemas de número posicional, los números reales están representados


por una parte de entero y una fracción, separado por un (decimal) punto.
Desde el problema de convertir un número natural a una secuencia de
dígitos estuvo hablada en Sección 13.1, podemos restringir cualquier
discusión más lejana a el desarrollo de un algoritmo para convertir fracciones
puras x (O� x < 1). Otra vez, un sistema de número con base B está
supuesto.
Dado es una secuencia de dígitos <>= d 1 • • • d" denotando una fracción. Con
El punto a su izquierdo, el valor ó está definido cuando
J = ¿d
n .
1 1 1
ª + • .. + -un .•
¡ * B-· = -( Un l + -( n) ) (13.9)
B
2
i=l B B

Dónde d¡ = num(d;) y O� d¡ < B para ali i. Denotando las secuencias d ¡


...dn by <>¡ , recurrence relacións ( 13.10) follow immediately from (13.9).

O� Ó¡ < 1

J¡ = trunc(B * ó¡)
(13.10)
ó¡+ 1 = B• ó¡ - d¡

El algoritmo obtenido por sustituir (13.10) en programa schema (9.2) está


mostrado en la forma de un procedimiento en (13.11). El variable u supone la
secuencia de valores S1 , S2 , • • • , y la condición de terminación no es (cuando
podría ser esperado) u = O, desde entonces esto implicaría una
representación exacta de la fracción x = ó, los cuales no pueden existir. El
algoritmo es por tanto rescindido cuándo un número dado n de los dígitos
ha sido generados. En cada paso, la fracción está multiplicada por la base B.
La parte de entero del producto, aplicado a la función primitiva rep(_x), cede
el dígito próximo, y el mismo algoritmo aplicó a la parte de fracción del
producto cede los dígitos restantes. Afortunadamente, este procedimiento
genera los dígitos en el orden deseado; de ahí
SEC. )3.3 TRANSFORMACIÓN DE REPRESENTACIONES de PUNTO FLOTANTE 107

Intermedio almacenando en un buffer puede ser evitado. Los dígitos son


otra vez para ser anexados a una producción textfile D.

El procedimiento escribe (x: real); {O :o::; x < 1}


var i: O.. n;u: Real;v: entero; {n > O}
Empieza u:=x;Dt := '.';Puesto(D);i := O;
Repite u:= B* u;v := trunc(u); (13.11)
Dt := rep(v);puesto(D);
u:=u-v;i:=i+yo
Hasta que i = n
Fin

13.3 TRANSFORMACIÓN DE
REPRESENTACIONES- de PUNTO
FLOTANTE

Cuando mencionamos en Sección 8.4, los ordenadores frecuentemente


utilizan el tan-llamados forma de punto flotante para representar números
reales. Un número x es entonces repre- sented por un par de scaled enteros
<m, e)8 tal aquello

(13.12)

Dónde B se apellida la base del sistema de punto flotante. Ejemplos que


tendría que hacer el plazo "flotante-punto" self-explicativo es
<0.34567, 2) = 34.567
<0.34567, 4) = 3456.7 B = 10 (13.13)
<0.34567, - 2) = 0.0034567
Es ventajoso de escoger un poder pequeño de 2 (dice, 2k) como la base
para representaciones dentro de ordenadores. Creciente o decrecimiento el
exponente e por 1 entonces corresponde a multiplicar o dividiendo el
coeficiente m por 2\ cuáles pueden ser actuados en este caso por
sencillamente cambiando m por k mordió posiciones a la izquierda o
correctos,
= respectivamente. Desde entonces, aun así, es consuetudinario
de utilizar B 10 en las representaciones externas a ordenadores, una base
de exponente trans- formación (además de el radix transformación) deviene
necesario cuándo inputting u outputting números de punto flotante.
El método más sincero de transformar la representación.
<m 1 ,e 1 )8, into la representación <m 2 ,e 2 )82 is para multiplicar m 1 by Bf' y
después para normalizar, aquello es, para repetir dividiendo (o
multiplicando), el producto por B2, hasta que 1/B2 �m < 1 está satisfecho.
El número de divisiones esentonces el exponente resultante e2• Pero los
productos intermedios pueden devenir muy grandes y superar la capacidad
de una célula de almacenamiento, desde m está representado
108 CHAP. ]3. TRANSFORMACIONES DE REPRESENTACIONES de NÚMERO

Como scaled entero. Por tanto imponemos la restricción que las condiciones

(13.14)

Ser satisfecho en cualquier tiempo-aquello es, después de cada paso


intermedio de computación. En una transformación de un sistema con
basar B yo a un sistema con base B2 , multiplicaciones de m por B1 y
divisiones por B2 mosto por tanto necesariamente alterna. El programa
resultante para B2 > B, está mostrado en (13.15). Para razones evidentes,
una distinción está hecha entre los casos e, �O y e 1 < O.Nota la importancia
de la invariante especificada en la verificación de el programa.
El procedimiento convierte(var m: real; varel,e2: entero);
Empieza e2=: O;
Si el �O entonces (13.15)
Mientras el e/- O hacer
Empieza {x= m*B� 1 * B22 , 1/B2 � m < yo}
m:=B 1 *m;el :=el -1;
ifm � l El n begin m : = m/ B2 ; e2 : = e2+ 1 fin
Fin
Más repetir {x = m * Bf * B22 , 1/B2 �m < yo}
m:=m/B1 ;el :=el+ l;
ifm < 1/B2 entonces empezar m := B2 * m;e 2 := e2 - 1 fin
hasta el = O
Fin
Considerando que en números de ordenadores reales pueden ser
representados sólo por un número finito de dígitos, este algoritmo tiene la
desventaja de ser ambos inefficient para exponentes grandes e, e inexactos,
debido a la acumulación de redondear y errores de truncamiento en la
secuencia larga de ópera de aritmética- tions. Una posibilidad de mejorar
este algoritmo Iies en almacenar una mesa de multipliers B� en th e para m
de pares de scaled enteros < u, u) k such aquello

(13.16)

Y entonces computando
m: = m* Ue¡, e2: = Vel (13.17)
Seguido posiblemente por postnormalization. Aun así, la medida de tal
mesa puede ser intolerably grande, si la gama de el exponente es grande.
Un aceptar- capaz compromise, requiriendo ligeramente más
computaciones pero basados en una mucha mesa más pequeña, consta de
tabular pares de exponente del coeficiente sólo para
1
- B< 21">
U k * B"2" - -$;u k <l (13.18)
B2 -
EJERCICIOS 1 09

Y entonces descomponiendo el exponente el a una serie ofpowers de2, análogo al


algoritmo de multiplicación (7.18). El resultante m y e2 está obtenido como
productos y sumas de las entradas de mesa correspondientes u k y vk, respec- tively
[cf. Ejercicio 13.3].

EJERCICIOS
13.1 Formula dos procedimientos que
(a) Leído un número decimal representado por una señal, una parte de entero, un
punto decimal, y una fracción de el textfile entrada y assi gn su valor a la
variable paramétrica real v [cf. (13.6)], y
(b) Escribir una representación decimal de un parámetro real x a la producción de
archivo [cf. (13.8) y (13.1 !)]. Supone que lxl �max y que el entero ypartes de fracción
de x está representado por m y n dígitos, respectivamente. Principal zeroes
tendría que ser reemplazado por espacios.

13.2 Escribe dos procedimientos a transforrn representaciones de punto flotante


(a) Con base 2para basar 10, y
(b) Con base 10 para basar 2.
Ambos tendrían que ser similares de programar (13.1 5).

13.3 Design un procedimiento a transforrn una representación de punto flotante con base 2a
una representación con basa yo O, utilizando una mesa de n pares de exponente del
coeficiente según ( yo 3.18). Supone aquello
X= m * 2et O :e; el < 2n
Para un dado n (dice,
10).
13.4 Construir un programa que genera representaciones decimales exactas de el frac-
tions 1/n para n = 2, 3, . . . , 50 cuando describió abajo y escribir las secuencias de
dígito resultantes a la producción de archivo.
(a) Cada secuencia de dígito tiene que termínate apenas el primer periodo de la
fracción decimal está completado.
(b) Un espacio tendría que ser insertado inmediatamente precediendo el primer
dígito de el periodo.
(c) Ningún real-valoró las variables tendrían que ser utilizadas en este programa.
Imprimiendo el textfile resultará en el cuadro siguiente:
.5 O
.3
.25 O
.20
.1 6
.1428 57

.020
Pista: Primero desarrollar un programa que ignora condición (b).

13.5 Diseño un procedimiento para escribir al textfile producción el valor del parámetro
de entero x como número Romano. Supone x > O. (' Yo' = 1, 'V' = 5, 'D' = 10, 'L' = 50,
'C' = 100, 'D' = 500, soy' = 1000.)
PROCESAMIENTO DEL TEXTO
que UTILIZA ARRAV
14 Y ESTRUCTURAS de ARCHIVO

En este capítulo investigaremos sorne problemas cuya característica


común única es el hecho que el dato computado es estructura ofprintable
caracteres, aquello es, textos. Estos ejemplos, propio de muchos otro
relacionó problemas, puede un!Así que sirve tan ejercicios en la aplicación
ofconcepts y tecnología- niques aquello ya ha sido introducido.

14.1 AJUSTANDO LA LONGITUD DE


UNES EN Un TEXTFILE

Yof un textfile f consistes of sub-secuencias of carácters that are delinead por


cualesquier espacios o fin-de-caracteres de línea, dejados cada cual tal sub-
secuencia, el cual no él contener cualesquier espacios o eol caracteres,
apellidarse una palabra. El número de los caracteres en una palabra es
entonces llamó el wordlength w. El número de los caracteres en una línea
se apellida el linelength L.
Un programa será desarrollado aquello lee un archivo f y entonces genera
un g de archivo que consiste ofthe mismo unsplit palabras en la misma
secuencia pero teniendo líneas que es como máximo Lmax caracteres mucho
tiempo.* El número total ofcharacters en el tw o files be the mismo. Ali
palabras in f will be oflength w �wmax < Lmax para dado iwnax y Lmax.
Supone que archivo fconsiste ofat menos una palabra y por tanto al menos
una línea, rescindido por un eol carácter.
File gis obtained by Copiando fund reemplazando certain espacios by eol
charac- ters y viceversa. Desde las palabras individuales no pueden ser
partidas, y desde los archivos pueden ser generados únicos sequentially, una
palabra puede ser anexada a gonly cuándo es sabido si es para ser
precedido por un espacio o por un eol carácter.

* P. Naur, "Programando por Grupos de Acción," MORDIÓ 9 (1969), 250-258.


110
SEC. 14.1 AJUSTANDO LA LONGITUD DE LÍNEAS EN Un TEXTFILE 111

Esto, aun así, puede ser decidido sólo después de la longitud de la palabra
es sabida. Por tanto sigue que copiando la palabra es posible sólo a través
de inter- mediar buffering. Como buffer, una variable de variedad con
wmax los componentes es la elección apropiada (suponiendo que wmax es
moderadamente pequeño).
Desde file f consistes of una secuencia of palabras y separator caracteres, la
estructura apropiada del programa es una declaración repetitiva. En cada
repetición, una palabra W y su teniendo éxito separator S está leído de archivo
f, y la misma palabra y su precediendo separator es entonces producción para
archivar g, cuando mostrado en figura (14.1).

(14.1)
f { w s 1 w s 1 w ,. s 1
G l w1 s1 w1 s1w1 s }
Paso i : Paso i+ 1

Un caso en qué severa! separators Sigue una palabra (i.e., espacio múltiple
o severa! Líneas de espacio) está manejado por suponer que las palabras
pueden ser vacías y que unas mentiras de palabra vacías entre cada dos
inmediatamente adyacente separators. De este modo, el carácter estrictamente
alterno de la palabra/separator la secuencia es (hipotéticamente) mantuvo.
La declaración repetida está obtenida de programa schema (10.13).
Herramientas tan auxiliares, primero introducimos dos informalmente
definió procedimientos.
l. Readword Lee una palabra al buffer variable Z. Después de que
ejecución de readword, ch representa el separator siguiendo la palabra
justo leída y almacenado en Z. La variable de entero w está asignado el
wordlength.
2. Writeword Anexa la palabra de longitud w almacenó en Z para archivar g.

Desde la longitud de la línea actualmente generada evidentemente juega una


función importante, una variable L está introducido para representar la
longitud actualmente lograda.
La declaración para ser ejecutada en cada paso entonces puede ser
formulado cuando

Empieza readword;
Si L + w < Lmax entonces
Empezar escribir(' '); L : = L +
Fin más (14.2)
Empieza writeln; L : =
O
Fin Fin;
writeword
112 CHAP. 14. PROCESAMIENTO DEL TEXTO que UTILIZA VARIEDAD Y ESTRUCTURAS de ARCHIVO

Befare Especificando los dos procedimientos en detalle más grande,


dibujamos nuestra atención a otro problema, concretamente, la situación
en el inicio y el fin oC el proceso. Figura (14.3) indica que es aparentemente
necesario de proporcionar sorne declaraciones al principio y al final de el
programa que no cabe el patrón de declaración(14.2)..

f w 1.-s i w yo ¡ 1 s
.-
w
'
s
(14.3)

g w Yos¡ !
w í s w 1s 1
Paso O¡ ¡ Paso n
En el paso inicial, uno más el carácter está leído que está escrito, y en el paso
final, uno más está escrito que está leído. El programa final está mostrado en
(14.4). El lector se tendría que convencer que los dos procedimientos
auxiliares procesan palabras vacías correctamente. (La entrada de archivos
estándar y la producción están utilizadas en cambio fueray g).
var w: O.. wmax; {wordlength} L:
O .. Lmax; {linelength}
ch: char; {Último carácter leyó}
Z: Variedad [l .. wmax] De char; {buffer}
Procedimiento readword;
Empieza :=
w O;
Mientras hacer
Empieza w: = w + 1; Z[w] : = ch; leído(ch)
Fin
Fin;
Procedimiento writeword;
var i: l .. wmax; (14.4)
=i:
Empieza para l a w escribe (Z[i]); L : =
L+w
Fin;
Empieza L:= O; leído(ch); readword;
writeword;
Mientras ,eof(entrada)
Empieza leído(ch); readword;
Si L + w < Lmax entonces
Empezar escribir(' '); =
L : L+1
Fin más
Empieza writeln; L := O
Fin;
writeword
Fin;
writeln
Fin.
SEC. J 4.2 EDITANDO Un UNE DE TEXTO 113

De este ejemplo, aprendemos dos lecciones.

l. Si una secuencia de patrones de datos está transformada a una


secuencia. De corre- sponding patrones, entonces el paso general de
transformar un patrón solo tendría que ser formulado primero. La
declaración resultante es entonces sometida a un repetir o mientras la
cláusula que caracteriza la repetición y las condiciones de terminación.
Las situaciones de frontera son finalmente expresadas por las
declaraciones adicionales que preceden y teniendo éxito la repetición..
2. Para expresar unidades lógicas de operaciones, el tan-grupos de acción
llamada, traje- los procedimientos capaces están introducidos de quién
especificación detallada puede ser deferred hasta más tardío. La
definición de una estructura de dato concreta para vari- ables aquello
está utilizado sólo dentro de estos procedimientos también pueden ser
retrasados- concretamente, hasta las razones concretas son disponibles
de justificar la elección de una estructura sobre el otros.

14.2 EDITANDO Una LÍNEA DE TEXTO.

Considerar el problema siguiente. Dado es un Iine de texto z representó


por la secuencia de carácter
n>O ( 14.5)
Una secuencia x (normalmente dentro de z), el cual es para ser
reemplazado,
k>O
Y una secuencia y, el cual es para ser sustituido para x
Y =
Y1Y2 · · · Ym m�
O
El valor cierto es para ser asignado a una variable Booleana q, si y sólo si x
está contenido en z y una sustitución de y es posible. Para definir
singularmente la acción deseada en el caso donde x ocurre más de una vez
dentro de z, nosotros intro- duce una posición buena p. En cualquier tiempo,
el texto z es para ser buscado sequentially de izquierdo a correcto,
empezando en posición p. Si x no es encontrado entre p y el fin, la búsqueda
continuará a principios de z hasta p. La línea es así considerada para
envolver alrededor, y la búsqueda se apellida circular. Por ejemplo, si x AB
= =
y y U V W, entonces z-antes de que y después del proceso de sustitución-
sería

Antes de que: EFABGH Después de que: EFUVWGH


1
EFABC DABCD EFABCDUVWCD
1 1
EFABCDABCD EFUVWCDABCD
1 1
114 CHAP. )4. PROCESAMIENTO DEL TEXTO que UTILIZA VARIEDAD ANO ESTRUCTURAS de
ARCHIVO

Esta clase de sustitución de texto es a menudo encontrado en el texto


que edita los sistemas utilizaron remotely a través de terminales, donde los
programas y el dato están almacenados perma­ nently dentro del sistema
de ordenador como textfiles.
El problema puede ser roto arriba a dos partes relativamente
independientes:

(a) La búsqueda fo r texto x t o be reemplazad so that z =axp, y


(b) El substitution of x b y y so that z =ayp.
Parte 1 : Un índice i está determinado tal aquello
xi=Z¡+i-l forj=l, ...,k (14.6)
Un programa que asigna a q el valor "x estuvo encontrado e i es el índice
deseado" está mostrado en (14.7).

¡ :=p;
Repite { Q(i)}
q :=X= (z¡ ...Z;+k- 1); (14.7)
i : = i + l ; Si i > n entonces i :
= yo hasta q V (i = p)

La aserción invariable Q(i) es

xd-:/- (zj···zj+k-i)
(x 1 • • •

r1o un ¡¡ J. = P, ..., i - 1 Si i � p
{
p, ... , n y 1, ..., i - 1 si ¡ < p
Ahora más allá descomponemos la comparación de dos secuencias de
caracteres a una secuencia de comparaciones de caracteres solos.

j := !;
Repite { P(j)}
q :=(x[j] =z[i+j-1]); j :=j + 1 (14.8)
Hasta que ,q V (j > k)

La aserción invariable P(j) es igual a

Q(i) /\ (x h =Z;+h-1) for al!h=1, ...,j - 1


Pero este programa es incompleto porque él <loes no correctamente
manejar la situación siguiente. Supone aquello
x h =
Z;+ h -t forh=l, ...,h' (14.9)
i+h'-1 = n h' < k
SEC. 14.2 EDITANDO Una LÍNEA DE TEXTO 115

En este caso, los caracteres próximos para ser comparados es xh+ 1 y z n+ 1•


Qué- nunca, zn+ 1 no es definido. Este hecho también revela que la
formulación de el problema es incompleta, desde entonces no contiene
ninguna especificación de el comportamiento del programa para = esta
situación. Shouldthe El algoritmo rescinde con q falso, o tener que el texto x 1
• • • x k también ser considerado para envolver alrededor? lf z Está

considerado para ser una línea, el último <loes no normalmente sentido de


marca. Suponiendo que la declaración de problema intencionadamente deja
la elección abierta, optamos para la interpretación anterior.

j := l;
Repetir si i + j > n entonces = q : falso (14.10)
más
q : = x[j] = z[i + j- 1]; j := j + 1
Hasta que ,q V (j >
k)

A menudo, una técnica concreta está aplicada para simplificar este


programa: testaje explícito para el fin-de-el-la línea está hecha superfluous
por anexar un sentinel carácter que ocurre tampoco dentro de z = ni dentro de x
(p. ej., zn+ 1 eol). Bajo estas circunstancias, el programa más sencillo (14.8) puede
ser utilizado. [Cf. también (11.6)].
Parte 2.: Los caracteres Z; . . . Z;+k- Soy ahora reemplazado por y 1 • • • Ym ·
Esta operación otra vez podría ser partida a dos pasos: (un) acortando = z
hacha[J =a z' un{J (por cambiar fJ a la izquierda por k posiciones) y (b)
insertando=y para obtener z" ay{J (por primero cambiando fJ a la derecha
por m posiciones). Desde este
El proceso puede ser simplificado a cambiar fJ sólo una vez, aun así, una
distinción tiene que ser hecha entre los casos siguientes.
l. m < k-La secuencia nueva es más corta que el viejo un; fJ está cambiado a
la izquierda por k-m posiciones.
2. m > k-La secuencia nueva es más larga que el viejo un; fJ está
cambiado a la derecha por m-k posiciones.
3. m = k-Las secuencias nuevas y viejas tienen la misma longitud, no
cambiar es necesario.
El programa entero, constando de la búsqueda y los pasos de sustitución, está
mostrado en (14.11).

Sustituto de procedimiento;
vari,j: l ..n+l; q:Booleano; d:entero;
begin { step Yo: find x i n line z}
i :=p;
repeEn j : = yo ;
repeatq: =(x[j] = z[i+j-1]); j :=j + 1
Hasta que ,q V (j > k);
i:=i+ l;ifi>ntheni:= Yo hasta
q V (i = p);
116 CHAP. 14. PROCESAMIENTO DEL TEXTO que UTILIZA VARIEDAD Y ESTRUCTURAS de ARCHIVO

Si q entonces
Empieza {paso 2: sustituto y para
x} d : = m - k; p : = i;
ifd<Othen
begin j: =p + k;
whilej �n Hacer
Empieza z[j+d]=: z[j];j: =
j+ 1 (14.11)
Fin
Fin más si d
> O entonces
beginj: = n;
Mientras j � p + k Hacer
Empieza z[j + d] : = z[JJ; j : = j - 1
Fin
Fin;
n:=n+d;j:=1;
whilej � m Hacer
begin z[p] := y[j];p := p + 1 ;j:= j + l
Fin
Fin
Fin

14.3 RECONOCIMIENTO DE
PATRONES REGULARES DE
SÍMBOLOS.

El reconocimiento de los patrones de texto es un problema


frecuentemente encontrado, comunes a ali los programas diseñaron para
interpretar o para procesar texto en maneras seguras. En general, un
patrón está definido por un conjunto de compositioa- reglas. La
complejidad global de un programa diseñó para reconocer los patrones
evidentemente depende de la complejidad o generalidad de las reglas de
formación. Los conjuntos de tales reglas son generalmente llamó una
sintaxis, y la tarea de reconocer los patrones construyeron según las
reglas se apellida análisis sintáctico.
Introduciremos una clase de reglas sencillas, aquello es, un schema de
reglas. Cada regla diseñada según el schema define un conjunto de tan-
llamó frases, los cuales pueden ser reconocidos por un algoritmo de análisis
sencillo. Las reglas de sintaxis generaron por el schema exhibición una
regularidad segura de estructura y es por tanto expresiones regulares
llamadas. Análogamente, el conjunto de frases que puede ser generado
según una expresión regular se apellida una lengua regular.
Nuestra tarea concreta es para proporcionar sorne la construcción general
gobierna indicar cómo para construir sistemáticamente un reconocimiento
programa aquello corresponde a una regla sintáctica dada. Introducimos el
siguientes notational convenciones.
SEC. 14.3 RECONOCIMIENTO DE PATRONES REGULARES DE SÍMBOLOS 117

l. Las letras latinas pequeñas denotan símbolos de el vocabulario básico


V. Ali sen­ tences es secuencias de símbolos de V..
2. Las mayúsculas denotan expresiones regulares o el conjunto de frases
(la lengua regular) definió por la expresión regular.
3. Griego Ietters denotar secuencias de símbolos sobre el vocabulario V.
i Denota la secuencia vacía.
4. El conjunto de las secuencias de símbolos obtuvieron por concatenar o
yuxtaponiendo una frase de Un y una frase de B se apellida el producto de
Un y B..
AB = {Un/3; un E Un y /3 E B} (14.12)
5. La suma o unión de Un y B está denotado por
(14.13)
Un¡ B = {y: yE Un o yE B}
6. El conjunto de secuencias obtuvo por concatenar frases de Un un
número arbitrario de tiempo está denotado por Un*.
Un* = {i[Un[AA[AAA .. .} (14.14)
Las reglas de formación para expresiones regulares son el siguientes.

l. Cada símbolo básico un E Vis una expresión regular.


2. Cada producto de dos expresiones regulares es una expresión regular.
3. Cada unión de dos expresiones regulares es una expresión regular.
4. Si Un es una expresión regular, entonces Un* es una expresión regular.
5. Las expresiones únicas obtuvieron by reglas 1-4 are regular.
El siguiente es ejemplos de expresiones regulares sobre el vocabulario V=
{ un b e d). Los paréntesis están utilizados como bracketing símbolos en la
manera habitual.

l. Un
2. (ab[bc)(d[Un) (14.15)
3. ab*c 4.
Un((b[c)un)
*

Los conjuntos de frases definieron por estas expresiones son el siguientes.

1. Un
2. abd aba bcd bca (14.16)
3. ac abe abbc abbbc ...
4. Un aba aca ababa abaca acaba acaca ...

Nuestra tarea ahora puede ser reformulated: dado una expresión regular Un
definiendo un conjunto de frases sobre el vocabulario Vand dado cualquier
secuencia un ofsymbols
118 CHAP. 14. PROCESAMIENTO DEL TEXTO que UTILIZA VARIEDAD Y ESTRUCTURAS de ARCHIVO

Encima V, construir un algoritmo &>(Un) aquello determina si r:x. Es una frase de


Un (i.e.,r:x. E Un).

La posibilidad de representar expresiones regulares en plazos de un graph


es ambos obvio y atractivo. Cada cual de las reglas de formación
elementales de expresiones regulares traduce inmediatamente a un patrón
gráfico como sigue:.

---..•�0 �
Expresión Graph
Un

AB
--0----0- (14.17)
Un

IB

Un*

Por ejemplo, la aplicación de estas correspondencias a expresión 4 en


(14.15) resultados en el siguientes graph.

(14.18)

El graphs inmediatamente sugerir una forma de el algoritmo que puede


reconocer frases, si el traversa! De un circled símbolo básico en el graph está
interpretado como el reconocimiento de aquel símbolo en la secuencia r:x. Para
ser analizado, y si el traversa! De el entero graph está interpretado como la
aceptación de la frase entera.
Dejado nos ahora suponer que la secuencia r:x. Para ser analizado está
representado por el textfile entrada, implicando que los símbolos básicos
son caracteres y que sólo el acceso secuencial es posible. Nuestro objetivo
es para construir un algoritmo para analizar frases sin respaldar arriba y sin
la ayuda de intermedio buffering (así que-mirada llamada adelante) como
sustituto para posterior-arriba. Brevemente, el
SEC. 14.3 RECONOCIMIENTO DE PATRONES REGULARES DE SÍMBOLOS 119

El algoritmo tendría que ser tal que cada decisión (representado por un
tenedor de caminos en el graph) puede ser tomado por inspeccionar el
carácter solo próximo sólo. Así describimos un esquema por qué un algoritmo
de análisis puede ser método- ically construyó de una expresión dada. Aun así,
las reglas de construcción aplican sólo si la expresión es determinista, aquello
es, si contiene no con-
stituents De las formas
AIB Y Un*B (14.19)

Tal que Un y B tiene símbolos iniciales comunes. Cualquier símbolo inicial


s de una frase de Un se apellida un símbolo inicial de Un. Ejemplos de
regulares expres- sions y sus equivalentes deterministas (suponiendo que
Un y B tiene no símbolos iniciales comunes) es

aAlaB = Un(AIB)
(aA)*aB = un(Aa)*B (14.20)
Y
(aA)*Unl (aB)*un =
un((Unun)*l(Ba)*)

Las reglas de construcción están dadas abajo, donde 37'(X) denota el


programa schema correspondiendo a la expresión regular X. Suponemos
que hay un variables ch al cual el símbolo próximo para ser inspeccionado
es siempre asignado y que allí existe una prueba de procedimiento(x)
verificando la igualdad ch = x.

Reglas de
construcción
Prueba(un); leído(ch)
l. 37'(un) 37'(Un); 37'(B) (14.21)
2. 37'(AB) Si ch= un entonces
3. 37'(aAIB) Empieza leído(ch); 37'(Un)
acaba más 37'(8)
= un hacer
Mientras ch
4. &((UnUn)*) Empieza leído(ch); 37'(Un)
fin

Para obtener un programa completo que corresponde a una expresión Un


seguido por una frase terminator (p. ej. un periodo), el schema 37'(Un) es
embedded en el marco "siguiente."

var ch: char; E


Fin.
mpieza leído(ch); 37'(Un); {ch = '•
'} (14.22)
1 20 CHAP. 14. PROCESAMIENTO DEL TEXTO que UTILIZA VARIEDAD ANO ESTRUCTURAS de
ARCHIVO

Los ejemplos de programas de análisis generaron de dados las expresiones


regulares deterministas según estas reglas de construcción siguen.
l. &'(ab*c) =
· Prueba(un); leído(ch);
Mientras ch = b lee (ch); (14.23)
prueba(c); leído(ch)

2. &'(Un(b(cld))*e) =
Prueba(un); leído(ch);
Mientras ch = b hacer
Empieza
leído(ch);
Si ch = c entonces leído(ch)
más empezar prueba(d);
leído(ch)
Fin
Fin;
Prueba(e); leído(ch)

3. P((ab*c)*d) =
Mientras ch = un
empieza
leído(ch);
Mientras ch = b lee (ch);
prueba(c); leído(ch)
Fin;
Prueba(d); leído(ch)

El propósito de la prueba de procedimiento(x) estuvo especificado como la


verificación de la igualdad ch = x. Si la relación no es satisfecha, la secuencia
de inspeccionó los caracteres no es una frase del Ianguage especificó por la
expresión regular subyacente, y el proceso de análisis también puede ser
rescindido (abortado). Por ejemplo, esta acción puede ser especificada por
agoto declaración (salto) de la forma
goto L (14.24)

Dónde L es una etiqueta que marca el destino de el salto. Cualquier


declaración en un programa puede ser marcada por prefijar la declaración
con la etiqueta y un colon. El goto la declaración tendría que ser reservada
para situaciones que es "un- habitual" o uncommon ""-aquello es, donde la
estructura natural de un algo- rithm tiene que ser roto (p. ej., la detección
de una formación de dato de entrada que viola las especificaciones dadas).
Una regla buena es para evitar el uso ofjumps para expresar iteraciones
regulares y ejecución condicional de declaraciones, desde entonces con la
introducción de saltos explícitos, la estructura de una computación es no
Ionger reflejado por la estructura textual de su programa. Además, esta
carencia de la correspondencia entre estructura textual y computacional es
extremadamente
EJERCICIOS 121

detrimental A la claridad de programas y hace la tarea de la verificación


mucho más difícil.
Algoritmos para el análisis de patrones textuales es la base de programas
que el proceso estructuró textos (p. ej., compiladores, los cuales traducen o
interpretar programas). Son esencialmente programa constructedby insertando
las declaraciones adicionales dentro del programa estructura actuar el análisis
sintáctico. Estos otras declaraciones computan un texto traducido del texto
inspeccionado. Con su adición, el proceso de análisis mero (generando una
respuesta Booleana) deviene un proceso de traducción, donde encontrando
un enfermo-entrada estructurada tex.t Puede no, en general, ser
satisfactoriamente conocido por un aborto sencillo con ajump a el fin de
programa. No obstante, un algoritmo que sirve como marco para
procedimientos de traducción superpuesta significativamente realzarán la
fiabilidad y trustworthiness de un traductor, si está construido
concertadamente y sistemáticamente según un conjunto dado de reglas.

EJERCICIOS

14.1 Determinar si los programas siguientes correctamente solucionan el problema en


Sección 14.1.
(a) var i, L, w: entero; ch: char;
Z : variedad [yo .. wmax] (14.25)
SuplicainL := O;
of char; Repite w : = O; leído
(ch);
1
Mientras ch ::f. ' hacer
Empieza w : = w + 1; Z[w] : = ch; leído(ch)
Fin;
ifw > Othen
Empezar si L + w < Lmax entonces
:=L
Empezar escribir (' '); L+ 1
endelse
Empieza writeln; L := O
Fin;
fori:= 1 towdowrite(z[1]); L:= L+ w
Fin
Hasta que
Fin.
eof(entrada)

(b) var i, L, w: entero; ch: char;


Z: Variedad [yo ..wmax] De
char; empieza L : = Lmax;
Repetir si ch = entonces leído(ch)
1 1

más empezar w := O;
Repite w := w + 1; Zfw] := ch; leído(ch)
Hasta que ch= 1 1
122 CHAP. 14. PROCESAMIENTO DEL TEXTO que UTILIZA VARIEDAD ANO ESTRUCTURAS de
ARCHIVO

Si L + w < Lmax entonces


Empezar escribir(' '); L : = L + yo
Fin más
Empieza writeln; L: = O
Fin;
Fin fori := Yo a w do escribe(Z[1]); L := L + w
Hasta que eof(entrada);
writeln
Fin.
14.2 En una línea imprimida de Iength L, los caracteres seguros están marcados. Las
marcas están representadas por un carácter concreto (dice, '•') imprimió bajo cada
tal carácter. Las posiciones (índices) de los caracteres marcados están dados en
la forma de una variedad
P1, P2, · · · ,Pn n � O,
Con las
relaciones p, � pj for alii< j

Examp/e: p = (3, 6, 9, yo 9, 22), n = 5


Línea de texto: Thes broplem es peenuds.
Línea de marcas: * * * * *

Investigar las propuestas siguientes. Qué unos son correctos? Jndicate Las
condiciones bajo qué el incorrect unos fallan.

(a) k := Yo;
fori:= Yo toLdo
begin ifi = p[k]
entonces
Empezar escribir('*'); k := k + yo
Fin
Más escribir(' ')
Fin

(b) k : = Yo ; p[n + l] : = O;
fori : = yo a L empieza
ifi = p[k] entonces
Empezar escribir('•');
Repite k : = k + yo untili#- p[k]
Fin
Más escribir(' ')
Fin

(c)i:=l;
Para k := 1 a n hacer
Empezar repetir escribir(' ');i := i
+ hasta i = p[k];
Escribe('*'); i : = i +
Fin
EJERCICIOS 1 23

(d) i: = 1; k : = 1;
Repite
Mientras i < p[kJ hacer
Empezar escribir(' '); i := i +
Fin;
Si i= p[k] entonces
Empezar escribir('•');i := i + 1
Fin;
k := k + 1
Hasta que k > n

(e) i : 1; k : = 1; =
whilek::; n Hacer
Empezar mientras i < p[k]
Empezar escribir(' '); i:= i+
Fin;
whilep[k] = idok := k + 1;
Escribe('•')
Fin
14.3 Diseño un programa que cuentas el número ofoccurrences ofeach carácter en el
archivo f Representar el resultado por un variable N, declarado cuando

var N: Variedad [char] de entero.


Tal que N[c] denota el número ofoccurrences ofthe carácter e inf Más allá- más, una
variable D tendría que indicar el número de las cuentas no iguales a cero..

14.4 Dado es dos variedades Un y B de tan-llamó palabras, aquello es, secuencias


ofletters. Específicamente, para i = 1, ... , M,

Un;, 1 , •• Un;,m, y B;, 1 •• • B;.•, m;,n; < N


Es letras, y
Uni,m, + 1 .• • Un i,N y B;,n,+ 1 •.• Bi,N
Es espacios.
También dado es una entrada de archivo que consta de palabras (secuencias ofletters)
separó por espacios y/o fin-de-caracteres de línea.
Diseño un programa que lee la entrada de archivo y genera una producción de
archivo por reemplazar ali las palabras iguales a sorne Un; por la palabra
correspondiente B;, Pista: El buffer para ser utilizado tiene que constar de como
máximo N caracteres. Uso el procedimiento Transmitword, el cual compara la palabra
en el buffer Z con Un y anexa a
Producción tampoco B; (ifZ = Un;) o Z (ifthere es no Un; = Z). Ser prudente cuándo
adoptando el siguiente unverified procedimiento. (Z = Z1 ••. Zk)

Procedimiento Transmitword;
var i: O ..M ; j: O .. N ; f: Abucheo/ean;
Empieza i: = O; {Z[k + 1] = ' ', O < < k N}
Repite i: = i + 1; j : = O;
124 CHAP. 14. PROCESAMIENTO DEL TEXTO que UTILIZA VARIEDAD Y ESTRUCTURAS de ARCHIVO

repeatj : = j + 1;f: = Z[¡] # Un[i,¡]


untilf V (j = k)
until-f V (i = M);
iffthen Emit(Z) Más Emit(Bf_1])
Fin
14.5 Dado una variedad S de tan-palabras claves llamadas, Jet S;, 1, • • • , S;,n, ser
letras y yo :e; n; < N. Cuando en Ejercicio 14.4, una entrada de archivo está dada
constando de palabras
(Secuencias de letras) separó por espacios y/o fin-de-caracteres de línea. Cada
línea contiene como máximo L caracteres.
Diseño un programa que genera una producción de archivo que consta de las
mismas líneas cuando entrada pero rotated de modo que el principio de unas
mentiras de palabra claves en una posición fija k. Si hay no palabra clave en una
línea, entonces esta línea no aparece en el archivo de producción; si una línea
contiene n palabras claves, entonces esta línea aparece n tiempo, cada vez siendo
de manera diferente rotated. Un buffer variable con como máximo L caracteres
tendrían que ser utilizados.

14.6 Desarrollar un programa según las reglas de construcción (14.21) y (14.22) para
el análisis de expresiones de aritmética. El vocabulario es

V=()c+-*I·}

Dónde Je posiciones para cualquier letra. La estructura de la entrada está dada por
la expresión regular

).((*1/)J.)*(( + 1- )).((*!/)),)*)*.
15 STEPWISE
PROGRAMA
DESARROLLO de

Nuestros ejemplos en los capítulos de preceder claramente han mostrado que


programa- ming-en el sentido de diseñar y formulando algoritmos-es en
general un proceso complicado, requiriendo la maestría de detalles numerosos
y técnicas concretas. Es también obvio que sólo en los casos excepcionales
allí serán una solución buena sola. Normalmente, tantas soluciones existen
que la elección de un optima! El programa requiere un análisis minucioso
no sólo de los algoritmos disponibles y ordenadores pero también ofthe
manera en qué el programa más frecuentemente ser utilizado. Si la
programación era un proceso estrictamente determinista obedeciendo un
conjunto fijo de reglas, entonces haya sido automatizado mucho tiempo
hace.
Cuando en otras disciplinas de ingeniería, la construcción de un
producto-en este caso, un algoritmo-consta de una secuencia de
deliberaciones, investiga- tions, y decisiones de diseño. En las etapas
tempranas, la atención está dirigida principalmente hacia los problemas
globales, y el primer borrador de una solución puede pagar poca atención a
detalles. Cuando los progresos de proceso del diseño, el problema está
partido arriba a subproblems, y gradualmente más la consideración está
dada a los detalles de especificación de problema y a las características del
disponibles tooIs. En programar, la naturaleza abstracta de los productos
diseñó es partic- ularly intrigante. En contraste a otras áreas de ingeniería, los
productos pueden ser diseñados (y probados) sin gastos materiales, y son
libres de los efectos de lado físicos de envejecer y materiales de calidad
inferior. Consiguientemente, los programadores tendrían que ser
particularmente entusiastas de desarrollar muchas versiones de algoritmos y
a cuidadosamente comparar y analizarles antes de hacer una elección final.
Quizás la programación más general la estrategia implica partitioning un
proceso a acciones individuales y el programa correspondiente a individ- ual
declaraciones. En cada tal paso ofdecomposition, uno tiene que ser seguro
aquello

(a) Las soluciones de los problemas parciales implican la solución del


problema total,
125
126 CHAP. i 5. STEPWISE DESARROLLO de PROGRAMA

(b) La secuencia escogida de acciones de componente es significativa, y


(c) El .Declaraciones de cosechas de descomposición seleccionadas que, en
sorne sentido, es más cercano a la lengua en qué el programa finalmente
será formulado.

Es precisamente este último requisito que las marcas progresan en línea


recta de el problema original a el programa definitivo imposible. Cada
decom- paso de posición está seguido por la tarea de formular programas
parciales, durante qué la elección de descomposición puede resultar para
ser unfortunate en uno nota u otro sencillamente porque las subrutinas no
pueden ser oportunamente expresados en plazos de la herramienta
subyacente. Uno o más de el anteriormente tomado da un paso mosto
entonces ser reconsiderado.
Si uno ve el stepwise descomposición de el problema y el simul- taneous
desarrollo y refinamiento de el programa como progresión gradual a
profundidad más grande y más grande, pueda ser caracterizado como el
superior-abajo acercarse al problema que soluciona. Inversely, es también
posible a postulado una aproximación por el cual el programador primero
considera su ordenador y/o lenguaje de programación y entonces agrupa
secuencias de instrucción segura juntas a primi- tive procedimientos o
grupos "de acción," el cual típicamente ocurrirá en el problema de fondo.
Los procedimientos primitivos son entonces utilizados dentro de la jerarquía
próxima de procedimientos. Esta aproximación-de las profundidades de
máquina primitiva , atómica instrucciones a el problema en la
superficie-se apellida el inferior-arriba método. En práctica, el desarrollo de
un programa nunca puede ser actuado cualquiera en un estrictamente
superior-abajo o un puro inferior-arriba dirección. En general, aun así, el
superior-abajo la aproximación es dominante, cuándo un nuevo algo- rithm
está concebido. Por otro lado, la tarea de adaptación de un programa a
ligeramente cambió las especificaciones a menudo pueden ser solucionadas por
siguientes un principalmente inferiores-arriba aproximación.
En ambas aproximaciones, las ventajas de desarrollo a programas con una
estructura inherente (como opposed a secuencias lineales amorfas de
declaraciones o instruc- tions). lt Es extremadamente importante que la
lengua de objetivo claramente espejo esta estructura. Sólo entonces es el
producto de fin una formulación resoluta, dejando verificación sistemática y
proporcionando idea a su historia de desarrollo. Pero unstructured
formulación, cuando representado en el extremo por la masa de dígitos
binarios en una tienda de ordenador, es un producto bare de la
información que sólo habilita la mente humana para distinguir un mensaje
de ruido..
Si un programa inacabado está descompuesto a subrutinas, entonces
la introducción de las variables nuevas a menudo deviene necesarias de
representar los resultados y argumentos de las subrutinas, así estableciendo
communica- tion entre las subrutinas. Tales variables tendrían que ser
entendidas y expresadas cuando perteneciendo a el desarrollo da un paso
aquello les hizo necesario. Además, el refinamiento de las especificaciones
de un proceso pueden tener que ser acompañadas por un refinamiento en la
especificación de la estructura de utilizó variables. La lengua de objetivo
por tanto tendría que ser capaz de expresar dato cuando
SEC. 15.1 SOLUCIONANDO Un SISTEMA DE ECUACIONES LINEALES 127

Estructuras jerárquicas, también. Theimportant Función oftheconcepts


ofprocedures, locality de objetos, y estructurando de los datos tendrían
que ser vistos en este contexto ancho de sistemático, stepwise desarrollo
de programa.
Los cuatro ejemplos que fol!ow Está supuesto para ilustrar estos bastante
Deliberaciones abstractas. Ellos no-quizás con la excepción ofthe primero
-Representar los problemas normalmente encontrados en los datos que
procesan. Son bien convenidos, aun así, a aplicar y demostrando el método
ofstepwise desarrollo en una manera resoluta sin construir programas que
es unduly largo y complejo. No obstante, la cantidad de texto necesario de
describir su desarrollo prudente es un recordatorio fuerte que el construc-
tion de los algoritmos dista mucho de triviales.

15.1 SOLUCIONANDO Un SISTEMA DE


ECUACIONES LINEALES

Supone que un programa está desarrollado para computar los valores


desconocidos x 1, • • • , x n de el sistema de ecuaciones lineales

Lªij*Xj = b ¡ i = 1, ... , n (15.1)


j�
1

ifall Unij y b ¡ está dado. Un ejemplo ofsuch un sistema con n = 3 es

(15.2)

De los varios métodos de solución, escogemos el desarrollado y


extensamente utilizado (sin ordenador) por C. F. Gauss: el método ofsuccessive
eliminación de unknowns. En el primer paso, expresamos el primer
desconocidos x 1 en plazos de ecuación (15.1) con i = l.

(15.3)

Entonces x está sustituido en el restante n - 1 ecuaciones, así obteniendo un


sistema de n - 1 ecuaciones lineales con el n - 1 unknowns x2, ••• , xn .
Este proceso es cal!ed Un e/imination paso. lf Está repetido n - 1 tiempo,
un sistema reducido de una ecuación con uno desconocido está obtenido,
y es fácilmente solucionó.
128 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

Para derivar un programa que expresa este proceso más precisamente,


primero formulamos el kth paso de eliminación en una forma general.
Dado es un sistema de n - k + 1 ecuaciones lineales.
n
"L._i dk) * X. = W > i = k, ...,n (15.4)
j=k
1
l) J

De este sistema, coeficientes nuevos un\r 1 > y b \k+ 1 > está computado tal que
forman un sistema de n - k ecuaciones.
= (k + 1)
n
dk + 1) *
" b i = k+ l,... ,n (15.5)
XJ.
+
1
L,, k
j=
lj

Estos coeficientes están


1 obtenidos de combinaciones lineales de el kth y el ith
ecuaciones (filas), específicamente
Un\, + 1 > = un\,> - (eno/ / en1) * un\Z>
(15.6)

for i,j = k + 1, .. ., n. The kth equation is subtracted from El loh ecuación


después de ser multiplicado por un factor escogido tal aquello para j = k y
ali i

(15.7)
Esto significa precisamente que en el sistema nuevo, ali coeficientes de el
desconocidos x k es cero, así eficazmente eliminando xk . Nota que es por
tanto unneces­ sary a de hecho computar los coeficientes un\Z + 1 >.
Después de que n - 1 pasos, el sistema reducido
(15.8)
Emerge de qué x n puede ser determinado inmediatamente. El remammg
unknowns está computado por sustituir el ya obtenido unknowns en el
anteriormente computó ecuaciones. Para caso, x n - 1 está obtenido por sub­
stituting Xn en
(15.9)
Este proceso se apellida un atrás-paso de sustitución. El kth el paso está
expresado en la forma general

(15.10)

Para arbitrario i tal que k �i � n. (Para razones que será aparente más
tarde, i =
k es normalmente seleccionó.) Observa, aun así, que la secuencia
en qué el atrás-pasos de sustitución están ejecutados está fijado por el
hecho que para la computación de x k , los valores xk + 1, • • • , x n tiene que
ser sabido.
SEC. 15.1 SOLUCIONANDO Un SISTEMA DE ECUACIONES LINEALES 1 29

Este proceso de solución entero está demostrado por utilizar ejemplo


(15.1). Las ecuaciones están representadas por sus coeficientes, escritos en la
forma de una matriz.

Eliminación:

l.

._J
2 5 4 *3/1 *-2/1

3 4 11 b"' ,_j
-2 5 9 -7

2.
- --
¡- --
Un<2> 1 -5 -11 -1 b<2> *9/-5
--
1 9 19
/
3.

.----
- -4/5
t -4/5

Atrás-sustitución:

l. X3 = (-4/5)/(-4/5) = 1 -�
2. x2 = ( - l + 11* l)/( -5) = - 2 ---------------------------------- �
3. X ¡ = ( +4 - 5* l - 2*(-2))/1 = 3--- �

Para diseñar un programa adecuado que expresa este proceso, el


reconocimiento de una propiedad del algoritmo descrito es decisiva: cuándo
computando los coeficientes un<k+ 1 > und b <k+ 1 >, only coefficients un <> =h y b <h>
ingenioh h k está necesitado-ninguno está necesitado con < h k. Es
posible, por tanto, para utilizar sólo dos variables Un y B para representar ali
d k) y b <kl? Para contestar esta cuestión, tenemos que investigar qué
coeficientes son significativos en los pasos de sustitución- posteriores más
tardíos. Pero allí ya hemos visto que cualquier ecuación con inde x i = k,
... , n poder be utilizó. Yof the kth is escogido (i
=k) to computa x k ,
entonces exactly those rema of Un und B aquello contiene the coeficientes un\,l
und h¡k > para i = k + 1, , n es libremente disponible, y pueden ser
reemplazados por un¡,+ i¡
130 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

Y W+ 1), respectivamente. Sigue que precisamente uno Un y un B es suffi-


. to represent Éxito1.ve1y the coefficients .un;<i1 >, un < 2 >, ..., un;<ni> unnd b;0 >, ...,
cient
ii
b\n> _ La cantidad de almacenamiento necesitó es así reducido de
1
n2 + (n - 1) 2 + • • • + 22 + 12 = -(2n 3 + 3n 2 + n)
6
(yo> <n>
Unidades of storage for un , ..., un y
n + (n - 1) + • · • + 2 + 1 = ½(n2 + n)
Unidades of storage for b 0> , ..., b<n> to un mero n 2 + n unidads for both Un
y B. En más casos, este ahorro es de importancia decisiva y es también el
clave a hacer el método Gaussiano de la eliminación económicamente
aplicable a ordenadores disponibles. (Nota que consideraciones similares
revea! Aquello los valores x i y b; podría también almacenamiento de
participación, por ello haciendo la introducción ofa variable
X innecesario.)
Siguiendo estas consideraciones, declaramos

var Un: variedad [l .. n, 1.. n] De real;.


B, X: variedad [l .. n] De real (15.11)

Y formular el programa

VERSIÓN 1: empieza "asignación ofvalues a Un y B";


Para k := 1tonelada- 1 (15.12)
<k <un k>
Empezar "computar un H 1 > y b<
+ 1 > de y b <k>
según (15.6)"
Fin;
k := n;
Repite "computa x k según (15.10)";
k := k - 1
Hasta que k = O
Fin

Versión 2 está obtenido por refinado la declaración "computa . . .


(15.6)" y puede ser descrito cuando

VERSIÓN 2: para i=: k + 1a n hacer


Empezar "computar el ith fila de <un
H1
> y H k+ 1 > según (15.6)"
Fin (15.13)

Al llegar a este punto, tenga que ser observado que para la computación
de un\r 1 >
(Und W + 1)) según t o (15.6), the factor ai1 / ai�(bt> / ait respectively ) es
SEC. ]5.1 SOLUCIONANDO Un SISTEMA DE ECUACIONES LINEALES 131

Independiente de el controlado variable i. Obedeciendo la regla básica


que la evaluación repetida de expresiones cuyos electores quedan la
constante tendría que ser evitada, extraemos la división por un¡� de el para
declaración. Pero dónde tener que los cocientes resultantes ser
almacenados? ser posible a
simply replace Unk<k;) und b<kk> by unk<k;>¡unkk<k> und bk<k >¡un<
kk >, respectivamente?· Again, el
k

Influencia de tal medida al atrás-pasos de sustitución tiene que ser


investigados. Pero sabemos en general que la multiplicación ofali coeficientes
ofan ecuación por el mismo factor <loes no cambiar los valores ofthe unknowns.
Además, la división por un¡�cosechas, en este caso, un valor 1 para aW él;
por lo tanto la división en el atrás-paso de sustitución deviene superfluous.
La sustitución propuesta es ahora no sólo admisible pero incluso beneficia!.
Esto cede Versión 3 ofthe eliminación-programa de paso.
VERSION 3: for k : = 1 ton- 1
beginp := 1/Un[k, k]; (15.14)
forj := k+l tondoA[k,j] := p*Un[k,j];
B[k] := p * B[k];
for i := k+1 a n hacer +1

Empezar "computar un\ k+ 1


>y > Según (15.6)"
Fin bj.
Fin

El refinement de la declaración "computa .. .(15.6)" está obtenido por


con­ sidering que Un[k,j] representa el valor ai1/al� (en el kth paso).

VERSIÓN 4: for i := k+1 a n do (15.15)


begin for j := k + 1 a n doUn[i,j] := Un[i,j] - Un [i, k] * Un[k,j];
B[i] : = B[i] - Un[i, k] * B[k]
Fin

Ahora el mismo proceso ofrefinement será aplicado a el atrás-substitu­


tion fase de( 15.12). Está expresado como sucesión ofsubtractions según (15.10).
Nota que la división por un¡� ya ha sido actuado en la fase de eliminación.

VERSIÓN 5: empieza t : = B[k] (15.16)


; for j := k + 1 tondo t : = t - Un[k,j] *
X[j];
X[k]:=t
Fin

Nota que aquí el uso está hecho de la regla que declara que el para
la declaración no causa ninguna acción si el límite especificado es menos
de el valor inicial de la variable controlada.
132 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

El programa entero para solucionar un sistema de ecuaciones lineales es


ahora reescrito en (15.17). Observa que ahora n (en vez de único n - 1) pasos
de eliminación están ejecutados. El nth step is necesario porque it contiene
una división of b�n>por un��-

(Solucionando un sistema ofn ecuaciones lineales por eliminación


Gaussiana]
var i,j, k: yo .. n;
p,t:real; ( 15.17)
Un: variedad [! .. n, 1 ..n] De
real ; B, X: variedad [l ..n] De
real;.
Empieza {asignación de valores a Un y B}
Para k = : 1 a n
beginp := l.0/Un[k ,k];
forj := k+Yo tondoUn[k,j] :=
p*Un[k,j]; B[k] := p* B[k] ;
for i : = k+1 to n hacer
Empieza for j : = k+ 1 to 11
Un[i,j] : = Un[i,j] - Un[i , k] *
Un[k,j];
B[i] : = B[i] - Un[i, k] * B[k]
Fin
Fin;
k := n;
Repite t : = B[k];
forj := k+ 1 tonelada do t := t - Un[k,j] * X[i.];
X[k] : = t; k : = k - 1
= k O
Hasta que
{X[!] ... X[n] es las soluciones}
Fin

La atención especial tiene que ser pagada a la operación de división,


desde el algoritmo falla si un divisor pasa para ser cero. El hecho es
especialmente signifi- cant porque con el uso de una aritmética con precisión
finita, incluso divisors cercano a cero puede causar fracaso o al menos grossly
distorsionó resultados. El hecho que una permutación arbitraria de filas
(ecuaciones) o columnas de Un y B, el cual está actuado antes de cada
paso de eliminación, deja los resultados ciertos un- cambió permisos una
selección de permutaciones tal aquello cero divisors puede (en general) ser
evitado. El divisors se apellida pivote. Por incluir un pivote
Búsqueda (pivoting), podemos seleccionar el componente disponible un\? Con el
más grande
Valor absoluto. Evidentemente, el algoritmo él así beneficios en complejidad.
Pero pivoting es generalmente indispensable, ifsatisfactory la exactitud y la
fiabilidad está esperada. Si en sorne la eliminación da un paso no nonzero
candidato de pivote puede ser encontrado, entonces el sistema de ecuaciones
se apellida singular; aquello es, tiene no único
SEC. 15.2 ENCONTRANDO EL MENOS NÚMERO 133

Solución. Y si ningún candidato puede ser encontrado aquello es


significativamente diferente de cero, entonces el sistema se apellida i/1-
conditioned [cf. (Ejercicio 15.2)].
Un análisis breve del algoritmo muestra que el innermost operación

Un[i,j] := Un[i,j] - Un[i, k] * Un[k,j] (15.18)

Está ejecutado

(n - 1)2 + (n - 2)2 + · • · + 22 + 12 = i{2n3 - 3n2 + n) (15.19)

Tiempo. La cantidad de aumentos de computación aproximadamente con el


tercer poder de n..

15.2 ENCONTRANDO EL MENOS NUMERAR


AQUELLO ES EOUAL A DOS SUMAS
DIFERENTES DE DOS NÚMEROS
NATURALES LEVANTARON Al TERCER
PODER

La solución a este problema demostrará el método de stepwise refinamiento


de especificación de programa para un proceso de selección cuyos criterios son
su,cessively refined. El problema consta de encontrar el menos numerar x tal
aquello
x = Un3 + b3 = c 3 + d3 (15.20)

Dónde un, b, e, d es números naturales tal que un # e y un # d.


Sin reliance en número más profundo conocimiento teórico, parece sensato a
Iook para una solución por considerar candidatos (en un orden de magnitud
creciente) y entonces rescindiendo, apenas dos candidatos consecutivos son
iguales. Cuando candidatos, escogemos ali las sumas de dos números naturales
levantaron a el tercer poder. La primera versión de tal programa puede ser
expresada cuando

VERSIÓN yo: x:=2;{2=1 3 +1 3}


Repite min : = x; (15.21)
x : = "Suma más alta próxima de dos
poderes"
Hasta x = min

El problema es así reducido a el refinamiento de la declaración que especifica el


buscar el candidato más alto próximo. Para encontrar una pista para organizar
esta búsqueda, recomendamos computar el primeros pocos miembros de esta
secuencia "a mano. " Este método está ilustrado aquí, utilizando candidatos que es
sumas
1 34 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

De dos plazas en vez de cubos. Mesa (15.2 2) contiene tales sumas en un un­
ordered arreglo tal that Sii = i2 + /.
j 2 3 4 5 6 7 8 .. .

2
2 5 8
3 10 13 18
(15.2 2) 4 17 20 32
5 26 29 34 41 50
6 37 40 45 52 61 72
78 50
65 68 758
3 65
80 789
4 85
100 113 1 28
9 82

La mesa muestra
aquello 50 = 12 + 72 = 52 + 52
65 = 12 + 8 2 = 42 + 72
85 = 2 2 + 92 = 6 2 + 72
Y que 50 es por tanto el deseado menos número. La tarea principal ahora es
para encontrar un método de búsqueda que cede los candidatos en arder de
crecientes magni­ tude; aquello es,
2, 5, 8, 10, 13, 17, ..., 45, 50, 50
Los hechos siguientes son útiles y determinará los desarrollos futuros.

l. Sii > S;k for ali i Y ali j > k.


2. Sii > ·ski for ali j Y al i i > k.
3. S ii = Si;; it suffices to Considera único Sii withj �i.

De declaración 1, sigue que es innecesario de almacenar una fila entera de


candidatos a la vez; basta para proceder en cada línea de izquierdo a
correcto y para retener el último candidato generó. Consiguientemente, la
mesa puede ser representada por la variable
var S: Variedad [yo .. ?] De entero (15.23)
para facilitar la computación de el candidato próximo en una fila, una variable
más lejana
var j: Variedad [yo .. ?] De entero (15.24)
SEC. ]5.2 ENCONTRANDO EL MENOS NÚMERO 135

Está introducido tal que su kth el elemento representa el índice ofthe último
gener­ comiód candidate in el kth row ofel table;aquello es,
S[k] = k3 + j[k] 3 ( 15.25)
Ifthe Índice i ofthe último candidato considerado está utilizado en cambio
ofthe candidato x itselfand ifa función p(k) = k 3 está introducido, entonces
una segunda versión ofthe el programa puede ser formulado.

VERSIÓN 2: i: =1;
Para k =
: l a ? Hacer
beginj[k] : = 1; S[k] : = p(k) + l (15.26)
end;
Repite min : = S[i];
l : "increment j[i] Y reemplazar S[i] por el candidato
próximo en el ith fila"
2: "determinar un valor nuevo de i como el índice de la
fila con el Ieast candidato"
Hasta que S[i] = min

Esta versión es inaceptable como solución final porque un número


indefinido de componentes S[k] tiene que ser inicializado con . k 3 + 13
Más allá­ más, declaración 2 implica una selección entre un número indefinido
de candi­ fechas. Aun así, ifwe considera condición 2, entonces selección (e
inicialización) puede ser restringido a componentes S[k] con k �ih, siih está
definido como el Ieast índice tal que j[ih] = 1 (i.e., j[k] > 1 para ali k < ih).
Estas consideraciones Iead a

VERSIÓN 3: i:=l;ih:=2; (15.27)


J[Yo] := l ;S[l] := 2;)[2] := l;S[2] :=p(2) + !;
Repite min : = S[i];
1: ifj[i] = l entonces "increment ih e inicializar S[ih]"
2: "increment j[i] y reemplazar S[i] por el candidato
próximo en fila i"
3: "determina i tal que S[¡J = min(S[yo].............. S[ih])"
Hasta que S[i] = min

Durante un refinamiento más lejano ofthe tres labeled declaraciones,


mantiene en importar aquella generación de candidatos (en fila i) tiene que
ser rescindido apenas j[i] = i. Esto es ventajoso porque la simetría de la
mesa de candi­ las fechas deja for un limitation of the search to los Iower Ieft
triangle, und it es también necesario porque otherwise pares ofvalues un 3 + b3
y b 3 + un 3 sería generado y reconocido como igual. El hecho que indicesj[i]
puede lograr un límite-por ello eficazmente eliminando el ith fila de una
búsqueda más lejana-marcas
136 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

La introducción de un Iower límite de el índice de fila i necesario; lo


llamamos i/. La selección de candidatas es therebyfurther restringido en un
la mayoría de deseable wayto filas con índices entre il e ih. il Es incremcnted
siempre que una fila está eliminada.
VERSIÓN 4: i := l;i/:= l;ih:=2;... (15.28)
Repite min : = S[i];
ifj[i]= iEntonces i/:=+ i/ 1
más begin yo:= ifj[ i]
yoentonces
"increment ih Und inicializa S[ih]" 2:
"increment j[i]y reemplazar S[i]..."
Fin;
3: "determina isuch que S[i] = min(S[il] ...S[ih])"
until S[i] = Min
Posteriormente, declaraciones labeled 1-3 tiene que ser más lejano
refined. Si, en declaración 3, min está determinado bya búsqueda lineal
sencilla entre S;1, •• • , S;h [cf.(11.1 9) ], el n we obtiene the following partial
programa.
3: i:=il;k:=i;
Mientrask < ih hacer (15.29)
Empieza {S[i]=min(S[il] ... S[k])} k :=k + 1;
Si S[k] < S[i]el n i := k
Fin

Así mismo , declaraciones 2y puedo ser formulado en una manera sincera.


2: j[i] :=j[i] + yo; S[i]:=p(i) + p(j[i]) (15.30)
Yo: ifj[i]= yo entonces
Empieza ih := ih + 1 ;j[ih] := yo;S[ih] := p(ih) + (15.31 )
yo
Fin
El programa así obtenido maynow ser más allá mejorado, si la evaluación
repetida de p(i) para computar las sumas S[i]está evitado. Tal una mejora es
fácil de darse cuenta porque un tercer poder nuevo tiene que ser computado
cuándo y onlywhen ih es incremented. Este hecho facilita significantlythe
incorpora­ tion de tal refinamiento. El computó los poderes están
representados por una variable
var p: Variedad [yo..?]De entero (15.32)

Y la función designators p(i) es meramente reemplazado por p[i]. La


enmienda única al programa de existir es la inclusión de
p[ih] := ih* ih* ih (15.33)
in Declaración 1 en (15.31).
SIENTA. 15.3 DHF.RMINE THF. PRIMER II PRIMF. �UMBERS 137

Esta ventaja de consideraciones a la versión completa final ofthe programa,


mostrado en ( yo5.34). Este programa determina el deseado menos numerar cuando
1729 = 103 + 9 3 = 12 3 + 1 3
Después de examinar 61 candidatos. Los límites de índice finales son il = 1 O e ih = 12, y
la relación S[k] < S[i] está evaluado 107 tiempo.

var i, i/, ih, min, un, b, k: entero; (15.34)


j, p, S: variedad [ l ..12] of entero;
{p[k] = k 3, S[k] = p[k] + p[j[k]] for k = 1 .............. ih}
Sergin i := yo; il:= 1; ih : = 2;
j[ l]:= Yo; p[ l]:= 1 ; S[ yo] := 2; }[2] : = yo; p[2] := 8; S[2]:= 9;
Repite min: = S[i]; un:= i; b:= j[i];
ifj[i] = i Entonces i/:= i/ + yo más
=1
Empezar si j[i]
entonces p[ih]:= ih * ih * ih;
Empieza ih := ih +
yo;
j[ih]:= 1; S[ih] := p[ih] + l
Fin;
j[i]: = j[i] + 1; S[i]: = p[z] + p[j[i] ]
Fin;
i:= i/; k : = i;
Mientras k < ih hacer
begink:= k + Yo;
if S[k] < S[i] Entonces i := k
Fin
Hasta que S[i] = min;
writeln(min, un, b, i, j[i])
Fin.

Por cambiar la expresión en (15.33) y sorne valores iniciales de S y p, el


mismo programa también puede soler computar el menos numerar representable
cuando dos sumas diferentes de dos cuartos poderes. Aun así, la cantidad
necesaria de aumentos de computación drásticamente. El resultado es ob­ tained
cuando
634318657 = 1344 + 1334 = 1584 + 594
Después de examinar 11660 candidatos.

15.3 DETERMINAR EL PRIMER n NÚMEROS


PRIM OS

Cuando en la sección anterior, un programa diseñó para encontrar el primer n


los números primos tiene que sean el conjunto ofnatural números en orden
ascendente y entonces.
1 38 CHAP. J 5. STEPWISE DESARROLLO de PROGRAMA

Selecciona miembros conociendo criterios seguros. En este caso, la


condición para ter- mination es incluso más sencillo, y uno está inclinado a
inmediatamente proponer el programa siguiente.

VERSIÓN 1: var i, x: entero; (15.35)


Empieza X:= 1;
Parai : = 1 a n hacer
Empieza x : = "número primo próximo";
escribe(x)
Fin
Fin.

= lejano es "x
La declaración única que necesidades el refinamiento más
: número primo próximo." Es también el único uno refiriendo a el hecho
que somos para generar números primos en cambio ofany otro amables
ofnumbers. Introduciendo una variable Booleana prim, pueda ser
expresado cuando

VERSIÓN 2: repite x : = x + 1; (15.36)


prim : = "x es un número
Hastaprim
que
primo"

Considerando el hecho que con la excepción ofthe primero, ali los números
primos son extraños, el esfuerzo computacional deprisa puede ser halved.
lfthe Número 2 está tratado como caso especial , entonces x puede ser
incremented en pasos de 2. La tarea próxima es a refine la declaración.

prim : = "x Es un número primo"

Por tanto tenemos que tener en cuenta la definición de un número


primo: x es primo si y sólo si x es divisible sólo por 1 y él, aquello es,
ifdivision por 2, 3, ... , x - 1 siemprecede un nonzero resto. Este testaje sucesivo
dicta una iteración más lejana, cediendo un nested estructura de declaración
repetitiva.

VERSIÓN 3: repite x : = x + 2; k : =2; (15.37)


Repite {x no es divisible por 2, 3 ...k}
k : = k + 1; prim : = "x no es divisible por k"
Hasta que ,prim V (k � lim)
Hasta que prim

Evidentemente, el valor limitativo para k puede ser tomado cuando

x x
lim = x - l. Pero es suficiente y más económico de escoger lim = yx,
desde entonces si x era divisible por un número k > yx, entonces podría
ser expresado como = k * j, el cual implica que x también sería divisible
por < j yx. Pero esto ya ha sido probado no para ser el caso.
SEC. 15.3 DETERMINA EL PRIMER n NÚMEROS PRIMOS 1 39

Igualmente decisivo en el desarrollo más lejano de el algoritmo y el


ahorro de esfuerzo computacional es el reconocimiento ofthe hecho que es
perfectamente suficiente de probar divisibility de x por números primos sólo.
Para si x era divisible por un nonprime k, entonces también sea divisible
por los factores primos de k. lt Por tanto aparece sensato de retener el
aiready computó números primos en una mesa p, donde Pk es el kth número
primo. Tomando estos desarrollos a cuenta, obtenemos

VERSIÓN 4: repite x : = x + 2; k := 2; prim : = cierto;


Mientras prim /\ (k < lim) (15.38)
Empieza prim := "x no es divisible por
p[k]" k := k + 1
Fin
hasta prim;
p[i] := X

Ahora tenemos que redetermine el valor lim como el índice de el


número primo más grande para qué divisibility tiene que ser probado, de
modo que.
' \

p[lim] >
Jx Y p[ lim - yo] ;::;
Jx (15.39)
Tan lejos, siempre supusimos que los valores p¡,... , Pi;m era sabido, aquello es,
anteriormente computó. Pero esta condición será satisfecha sólo si el candidato
x para ser probado es siempre menos de Piim , aquello es si, en cada caso,
p[i] < p[i - 1] 2 (15.40)
Afortunadamente, esta relación es una de los resultados más profundos de
teoría de número y controles para ali números primos. Notamos que el
índice lim tiene que ser redeter­ mined siempre que x es incremented y
también tiene que ser aumentado siempre que Piim ;::; x. Aumentando de lim
por 1 es suficiente porque x había sido incremented por único 2 desde la
última prueba y porque p¡+ 1 > p¡ + 2 para ali i. Estos con­ siderations Iead a
versión 5-escrito como programa completo-cuál summarizes los
desarrollos hicieron tan lejos.

VERSIÓN 5: índice de tipo 1 ..n;=


var x: Entero;
i, k, lim: índice; prim: Boofean;
p: Variedad [índice] de entero; {p[i]= ith número primo}
Empieza p[yo]=: = 2; escribe(2);
= x : 1; lim : 1;
Para i =: 2 a n hacer
Empieza
Repite x : x + 2; =
Si sqr(p[lim]) ;::; x entonces lim
=: lim + 1 ;
k := 2;prim := cierto; (15.41)
140 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

Mientras prim /\ (k < lim)


beginprim := "xis No divisible byp[k]";
k := k + 1
Fin
hasta prim;
p[i] := x; Escribe(x)
Fin
Fin.

Finalmente, la declaración
prim : = "x No es divisible por p[k]"
Tiene que ser sometido a refinamientos más lejanos. Con los operadores
introdujeron en Sección 8.1, el encima la declaración fácilmente puede ser
expresada tan tampoco
prim := (x mod p[k]) i= O (15.42.1)
O
prim : = (x d iv p[k]) * p[k] i= x (15.42.2 )
Esto bien puede ser considerado como el paso final en la construcción de un
programa para encontrar números primos. Dejado nos, aun así , supone que
el programa es para ser desarrollado sin la disponibilidad de un operador
de división explícito. En este caso, el stepwise proceso de refinamiento tiene
que ser llevado en más lejano. Evidentemente, la división puede ser
reemplazada por una secuencia de sustracciones y expresados por otra
declaración repetitiva.
r := x; (15.43)
Repite r: = r - p[k] hasta r � O;
prim := r < O
Aun así, desde esta declaración será ejecutada bastante frecuentemente y
el proceso de la sustracción repetida por tanto puede ser bastante costosa,
parece para ser particularmente apropiado de buscar potencialmente
más económico solu­ tions. Uno solución apropiada y al mismo tiempo
sencilla consta de tabular ningún t only the prime números p 1, • • • , Pum but
also their múltiplos Vk = m * Pk tal aquello
x � V[k] < x + p[k] para k = 2, ... , lim (15.44)
En este caso, el divisibility de x porP k sencillamente puede ser
determinado por com­ parison of x ingenio h Vk. Yof ingenioh due respeto
to the extremely frequent evalua­ tion de Pl m- introducimos una variable
auxiliar llamó cuadrada cuyo valor es
Cuadrado = p[lim] 2 (15.45 )
Entonces obtendremos la versión final del programa.t
t E. W. Dijkstra, "programación Estructurada", EWD249, T. H. Eindhoven (1969).
SEC. 15.3 DETERMINA EL PRIMER n NÚMEROS PRIMOS 141

VERSIÓN 6:
Índice de tipo = 1 .. n;
var x, plaza: entero;
i, k, lim: índice; prim: Booleano;
p: variedad [índice] de entero;.
V: variedad [yo ..JnJ De entero;.
beginp[Yo] : = 2; escribe(2); x: = 1; lim : = 1; cuadrado: = 4;
Para i : = 2 a n
Empieza
hacerRepite x : = x + 2;
Si cuadrado � x
entonce
s ( 15.46)
Empieza V[lim] := cuadrado;
lim : = lim + 1 ; cuadrado : = sqr(p[lim])
Fin;
k := 2;prim := cierto;
Mientras prim /\ (k < lim)
empieza si V[k] < x
entonces
V[k] : = V[k] + p[k];
prim := (x # V[k]); k := k + 1
Fin
hasta prim;
p[i] : = x; escribe(x)
Fin
Fin.

Este ejemplo claramente demuestra que por ser forzado para trabajar con
un más sencillo también! (Un ordenador sin construido-en división), el
programador está dado el incentivo para buscar una solución que
finalmente resulta para ser superior. No es uncommon para encontrar que
la disponibilidad ofvery los ordenadores potentes con tiendas grandes
desalenta programadores de refinado sus algoritmos a la mayoría de
adecuados, pertinentes, y versión económica.
La mesa siguiente muestra la frecuencia ofexecution ofthe cuatro
declaraciones diferentes en (15.46), dependiendo de el número n ofprime
numera para ser computado.

n= 10 20 50 500 1000

X:=:=X+/im2+ 114 611 1785 3959


3
prim=: (x # 1V[k])
lim
13
6 11 17 23
V[k] : + p[k] 268 2340 9099 25133
= V[k] 8 156 1151 3848 9287

(15.47)
142 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

15.4 Un ALGORITMO HEURÍSTICO

El programa desarrollado en esta sección es un sencillo pero ejemplo


típico de una clase de algoritmos que determina una solución no en una
manera sincera pero en una moda heurística-aquello es, por probar,
comprobando, y retrying. La característica esencial de el método heurístico
es que los candidatos para una solución están generados stepwise según un
patrón dado; entonces están sometidos a pruebas según los criterios que
caracterizan la solución. Ifa El candidato resulta para ser inaceptable,
entonces otro candidato está generado en qué caso severa! Los pasos
anteriormente emprendidos puede tener que ser anulado. La tarea ofthe
algoritmo para ser diseñado es:
Generar una secuencia de N caracteres, escogidos de un alfabeto de tres
elementos (p. ej., 1, 2, 3), tal que ningún dos inmediatamente adyacente sub- las
secuencias son iguales.
Para caso, la secuencia oflength N = 5 con los caracteres "12321" es
aceptable, pero tampoco "12323" ni ''12123" es.
Ifone Está afrontado con un problema ofthis clase, es aconsejable a
!et Una secuencia oflength N crece sistemáticamente (empezando con la
secuencia vacía) por anexar un carácter en cada paso. Desde entonces no hay
ningún sentido en dejar una secuencia crece aquello no conoce los criterios, la
consecuencia lógica es para probar la secuencia en cada paso y para anexar un
carácter ifit conoce el declaró criterios-----otherwise cambio la secuencia. En la
primera versión ofthe programa, introducimos uno variable cada cual para
denotar la longitud y la calidad de la secuencia construyó tan lejos. El
anterior es oftype entero y está denotado como m; el último tampoco puede
ser definido sobre una gama oftwo valora bueno y malo o ser declarado de
Abucheo de tipo/ean y dado un nombre apropiado. Las dos posibilidades
son
var q: (Bueno, malo)
Y var Bueno: Booleano
Escogemos la segunda opción con los significados
Bueno = cierto: la secuencia satisface la condición
Bueno = falso: la secuencia no satisface la condición
Por ello formulamos
VERSIÓN 1: var m: O.. N; Bueno: Abucheo/ean; S: Secuencia;
(15.48)
Empieza m : = O; bueno : = cierto; { la secuencia vacía es bien}
Repetir si bien entonces "extender la secuencia S"
Más "cambiar la secuencia S"
Bueno : =
"S es una secuencia buena"
Hasta bueno /\ (m= N);
Impresión (S)
Fin.
SEC. 15.4 Un ALGORITMO HEURÍSTICO 143

El cambio aquí significa la alteración de componentes seguros o su


extracción, pero ningún aumento en la longitud de la secuencia. Para
garantía termina- tion, los cambios tienen que ser actuados en tal manera
que una secuencia que una vez estuvo determinado cuando no bien nunca será
generado otra vez. Esto implica que los cambios tienen que ser hechos según
un patrón sistemático y que entre los candidatos posibles allí existe un
seguros ordenando, el cual está seguido durante el proceso de generarles.
El encima elección de nombres para los tres caracteres (concretamente, 1, 2,
y 3) aiready sugiere un posible ordenando: if un sequence S = s 1 s 2 s 3 •.. is
Consideró un s un decimal fracción
O.s El Yo = ordenando
n the 12 . • .,
relation -<
is def ined byingenioh value

s! S S -< S' !SYo < !S'Yo


+-> (15.49)
Ahora los algoritmos para cambiar y extendiendo una secuencia es
esencialmente determinada también. Una extensión tiene que ser escogida
tal que representa el candidato menos posible de modo que un cambio más
tardío posible nunca causará cualquier candidato para quedar
unconsidered. Suponiendo el ordenando '1'-< '2'-< '3', cada extensión
siempre tiene que anexar un T.
Para describir las dos operaciones con más detalle y en plazos de
declaraciones en nuestro lenguaje de programación, es necesario a refine más
allá la descripción de la estructura de el variable S. Porque sus
componentes son continuamente reinspected e incluso alterados, la estructura
de archivo tiene que ser rechazada inmediatamente tan inapropiado. El
declaration es por tanto
var S: Variedad [! .. N] De char (15.50)
Cuándo especificando los detalles de el cambio de operación, recuerda que
el componente S[m] no puede ser a ciegas reemplazado por su valor de
= lf S[m] '3', no hay ningún sucesor. Esto es exactamente un caso en
sucesor.
qué la secuencia tiene que ser acortada. El segundo a el último componente,
aun así, otra vez puede tener el valor '3'. La acción de acortar la secuencia y,
en general, de dejar una solución intentada se apellida retroceder. El lector
es en- couraged para probar para generar candidatos por él utilizando este
algoritmo. El primeros diez están mostrados en (15.51), donde el aceptables
unos están marcados con un.
+ Señal.
+l
11
+ 12
+ 121
1211 (15.51)
1212
+ 1213
+ 12131
121311
+ 121312
1 44 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

Si formulamos las operaciones de extender, cambiando, y comprobando una


secuencia como procedimientos, el programa resultante es
VERSIÓN 2: var S: variedad [yo .. N] De char;.
m: O ..N; Bueno: Booleano;
El procedimiento extiende; (15.52)
Empieza m=: m + 1 ; S[m] : 'yo' fin;
cambio de procedimiento;
Empezar si S[m] =
'3' entonces
< S[m] :
= succ(S[m]) más
empezar m := m - 1; (acorta S]
Si m > O entonces
= : succ(S[m])
Si S[m] < '3' entonces S[m]
= m:
más empezar m - 1;
{secuencia vacía}
Si m > O entonces S[m] : = succ(S[m])
Fin
Fin
Fin;
Empieza m : = O; bueno: = cierto;
Repetir si bien entonces extender más
cambio; control
Hasta bueno /\ (m = N) V (m O);
Impresión(S)
Fin.
=
Esta versión tiene en cuenta el p0ssibility que un truncamiento de S puede
dirigir a una secuencia de longitud del cero por incluir el=
plazo m O en la
condición de terminación. Además, es digno de mención que el cambio de
procedimiento proporciona para un acortamiento de S por como máximo 2
componentes. Esto es permisible porque theproposed los candidatos son
siempre generados por anexar un carácter solo a una secuencia buena (cuáles
nunca pueden contener dos caracteres iguales adyacentes).
Antes de proceder con el proceso de refinamiento del programa, una
variante de la versión actual tendría que ser considerada aquello encarna
un ligeramente solución más eficaz. Notamos primero de ali que las tres
operaciones extienden, cambio, y el control siempre alterna según el patrón
siguiente.

(15.53)
Cont
rol
SEC. 15.4 Un ALGORITMO HEURÍSTICO 145

Es para ser esperado que camino Un será seleccionado más frecuentemente


que camino B. Versión 2' deja la repetición de cambiar para ser formulado
con una terminación ligeramente más sencilla condición, haciendo uso de
un nested estructura de declaración.
VERSIÓN 2': repite extiende; control;

wbile, good /\ ( m > O) (15.54)


empieza cambio; fin de
control
Hasta que (m = N) V (m = O)
Esta variante de Versión 2 corresponde a patrón (15.55), el cual muestra que
las secuencias posibles de operaciones son el mismo tan en (15.53).

U Extien
n de
Cambio
(15.55)

Contr
ol
Contr
ol

Mirando en la Versión completa 2, es principalmente la complejidad del


cambio de operación y la terminación condiciona aquello está
perturbando. El anterior, aun así, puede ser reducido por un truco
bastante "común." El com­ plexity de raíces de cambio de su
consideración de una situación que ocurre raramente si nunca: la
reducción de S a la secuencia vacía. En este caso, una asignación a el
nonexisting elemento S[O] tiene que ser impedido. El "truco" consta de
introducir un dummy componente S[O] y admitiendo una asignación posible
a S[O]. El cambio de procedimiento entonces puede ser simplificado a
Cambio de procedimiento;
Empezar mientras S[m] = '3' dom : = m - l;
S[m] : = succ(S[m]) (15.56)
Fin
Si, aun así, la existencia de una secuencia deseada de longitud N está
asegurado-­ posiblemente en la base de combinatoria! Análisis-entonces
(15.56) puede ser utilizado
146 CHAP. 15. STEPWISE PROGRAMA DF.VELOPMENT

Incluso sin un elemento S[O], y el programa principal (15.54) puede ser fu rther
simplificó a
Repite extiende;
control; mientras
, bien hacer
ltegill Cambio; control etNI
U11til m = N

El programa entero es ahora formulado en el lenguaje de


programación de objetivo con la excepción de el control de operación,
cuya definición [cf. (15.48)] está dado cuando
Bueno : = "Sis una secuencia aceptable"

lt Es digno de mención que hasta este punto, ninguna referencia ha sido


hecha a los criterios que caracteriza una solución. (El uso era meramente
hecho de la propiedad que ninguna solución podría ser obtenida por extender
secuencias inaceptables). Pero esto significa que el programa desarrolló tan lejos
es de generalidad considerable.
En el problema posado, el control de procedimiento tiene que determinar si
S es libre de equat adyacente sub-secuencias. El sub-secuencias para ser
comparadas varía en longitud de 1 a m/2. Desde una comparación de dos
secuencias de longitud L requiere L comparaciones de caracteres, el
número total de comparaciones elementales es (como máximo).

N(m) = (m - 1) * 1 + (m - 3) * 2 + • • • + 3 * (m/2 - yo) + 1 * (m/2)

= _! (m 3 + 3 * m 2 + 2 * m) ( 15.58)
24
para incluso m y
N(m) = (m - !) * 1 (m - 3)
+ (m - 3) * 2 + · · · + 4 * - - + 2 * �-- (m- 1 )
2 2
= -1 (m 3+ 3 * m 2- m - 3) (15.59)
24

Para extraño m. Para grande m, N(m) aparentemente crece con thc tercer
poder de m y hace la utilidad de este programa dudoso. Aun así, su eficaz­
ness puede ser drásticamente mejorado después de sorne deliberaciones
más lejanas. Cada candidato Swas generó por anexar un elemento solo a
una secuencia certificó tan bueno. Consiguientemente, basta para comparar
sólo aquellos adyacente sul>-secuencias que incluye el último carácter
anexado, aquello es, ali pares

(15.60)
SEC. 15.4 Un ALGORITMO HEURÍSTICO 147

Con L= 1, ..., m/2. El (máximo) número de comparaciones elementales


Así reduce a
m 2 (15.61)
N(m) = 1 + 2 + • • • + - = ½(m + 2m)
2
Según estas consideraciones, el control de procedimiento puede ser formulado
como sigue
Control de procedimiento;
var L: entero;
Empieza bien: =cierto; ( l5.62)
Para L 1 a (m div 2) ) ( ))
= :
Buen Bueno /\ ((Sm -2L+ ¡ . . . sm -L f= Sm-L+ ¡ . . . Sm
Fin o:
Pero una variante más eficaz está obtenida por hacer qué es obvio; termi­
nating comparaciones apenas dos sub-las secuencias están reconocidas como
iguales. [Nota que, en general, programa schema (9.2) no tendría que ser
adoptado un­ cambió siempre que el recurrence relación V; f(v;_ ¡} supone
la forma V; = (v;_ 1 /\ q;).] La versión mejorada=de(15.62) está mostrado en
(15.63). Desde el número de repeticiones necesarias es ya no sabido por
adelantado, el para la declaración está reemplazada por un rato estructura.
Control de procedimiento;
var L, mhalf: entero; (15.63)
Empieza bien: = cierto; L := O; mhalf: m div 2;
mientras bueno /\ (L < mhalj)
beginL:=L+ !; =
Bueno := (Sm-2L+l · · · sm-L) f= (Sm-L+yo · · · Sm)
Fin
Fin
Por utilizar el mismo principio-esto cronometra aplicar un repetir cláusula,
desde al! sub-Las secuencias consisten ofat menos un carácter la comparación
ofsequences ofcharacters está reemplazado por una secuencia ofcomparisons
ofcharacters. (15.64) muestra la versión final del control de procedimiento. Ali
operaciones es ahora formulado en plazos ofour notación de
programación básica.
Control de procedimiento;
var i, L, mhalf: entero; (15.64)
Empieza bien= : cierto; L := O; mhalf: m div 2;
Mientras bueno /\ (L < mhalj)
= i : =O;
Empieza L : =L + 1;
Repite bien: =S[m - i] t= S[m - L- i] ; i : = i +1
Hasta bueno V (i =L)
Fin
Fin
148 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

El problema inicialmente posado es ahora completamente solucionado,


asdescribed en (15.52), (15.56), (15.57), y (15.64)..
Finalmente, utilizaremos el problema de nonrepeating sub-secuencias
como un ejemplo para ilustrar un practica! Situación que ocurre bastante
frecuentemente: el problema original es tampoco extendido o ligeramente
modificó. Consiguientemente, el programa de existir tiene que ser
adaptado.
La extensión de problema para ser considerado en nuestro ejemplo es:
En vez de una secuencia sola, arbitraria de longitud N, encuentra ali
secuencias oflength N aquello contiene no igual adyacente sub-secuencias.
Afortunadamente, el programa desarrolló es suficientemente partitioned de
modo que muchos de las partes individuales pueden ser retenidos
unaltered. En general, el más claramente y apropiadamente un programa
está estructurado, el más fácil su adaptación a ligeramente cambió tareas- es
más sencillo de aislar los componentes que tiene que experimentar una
modificación. En el caso presente, no sólo el claro decom­ posición del
programa pero también el sistemático principie de generar los candidatos
resultan para ser más beneficia!. La ventaja de consideraciones siguiente a
una solución inmediata [cf. (15.52)].
l. lf m Logra N, entonces S está reconocido como resultado y está
imprimido. Subse­ quently, está sometido a un cambio más que una
extensión.
2. La condición para terminación puede ser simplificada porque la relación
m = N Es ya no pertinente. Sólo el plazo m = O está retenido.
El lector está instado para lo convencer que los asuntos de algoritmo
resultantes sólo secuencias aceptables y que lo <loes generar ali soluciones
posibles. (15.65) muestra el generó candidatos para el caso N = 3; las
soluciones están marcadas con una + señal.
1 2 3
12 21 31
+ 121 + 212 + 312
+ 123 + 213 + 313 (15.65)
13 23 32
+ 131 + 231 + 321
+ 132 + 232 + 323
De esta mesa, es aparente que entre el 12 solutionssevera! Es similar en el
sentido que pueden ser obtenidos de cada otro por cyclic permutación del
básico charactcrs.

,, 1""' �
3 2 2 3 (15.66)

'-._./
SEC. ) 5.4 Un ALGORITMO HEURÍSTICO 149

De hecho, hay sólo dos soluciones significativamente diferentes,


representados por "123" y 121. "" Un programa que genera sólo un
miembro solo de cada grupo de 6 soluciones similares está obtenido por
rescindir el proceso de generar apenas un intento está hecho para cambiar
S[2]. (Consiguientemente, el dummy componente S[0] no es necesitado
aquí tampoco.) Por ello obtenemos la solución final de el problema
extendido, presentado en (15.67) como programa completo.

var S: Variedad [l .. N] De
char; m: entero; bueno:
Booleano; (15.67)
El procedimiento extiende;
Empieza m=: m + 1 ; S[m] : = '!' Fin;
cambio de procedimiento;
Empieza {cf. (15.56)} fin;
control de procedimiento;
Empieza {cf. (15.64)} fin;
impresión de procedimiento;
var i: Entero;
Empieza para i: = 1 a N escribe (S[i]);
writeln
Fin;
begin m : = 2; S[l ] : = 'l'; S[2] : = '2'; good: = cierto;
Repetir si bien entonces
Si m = N entonces empezar impresión;
fin de cambio más extiende
Más cambio;
control
Hasta que m = 2
Fin.

Mesa (15.68) muestra el número K de soluciones como función de su


longitud N. El factor de reducción 6 es ya incorporó.

N K(N) N K(N) N K(N)


3 2 9 18 15 103
4 3 10 24 16 133
174 5 5 11
6 7 12 44 18 232 (15.68)
7 10 13 19 305
8 13 14 20 398
150 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

EJERCICIOS

15.1 El programa para solucionar un sistema de las ecuaciones lineales dadas en (15.17)
puede ser simpli- fied, si el variable Bis representó como una columna adicional de
matricial Un; aquello es,

(""
ª12

Un ª22 ª2• h2
= ��'.
Unn l ª•2 ª·· b.

Escribir el programa correspondiente que incorpora ali ensuing simplificaciones.


(Nota que ambos programas representan el mismo algoritmo.)
15.2 Extiende programa (15.17) para solucionar un sistema de ecuaciones lineales de
modo que incluye pívotíng.
Varían/ 1 : En el kth paso de eliminación, selecciona como el pivote el elemento
ªh1 con el valor absoluto más grande en el kth columna (columna pívotíng);
aquello es,

l Unh11 � lun[t > yo for í = k, · · ·, n


Hínt: Después de determinar the pivot ªh1, fila de intercambios ªhk> con ª kk> und
también bhk> ingenioh bkk >.
Varían/ 2: En el kth paso de eliminación, selecciona como el pivote el elemento
ªh� con el valor absoluto más grande en el kth columna y el kth fila (total
pívotíng); aquello es,
lUnh �1 � lun\?Yo for í,j = k, · · · , n
Pista: después de seleccionar the pivote ªh�, the filas en> un d en> (hhk> und W>) are
inter- cambió. El n the columnas un�k! Und un�k/ are interchanged, por el cual the
intercambio de columna <m. k) Tiene que ser grabado porque el último implica
una permutación
Del unknowns -'m y x k , los cuales tienen que ser considerados en el atrás-pasos
de sustitución. Finalmente, si no hay ningún elemento un\? Con el valor absoluto
más grande que ¡; (escoge, por ejemplo, t: = 10-8), entonces el sistema es
enfermo condicionado, y el.
El programa especificará un salto de salida a sorne predefined declaración [cf. (14.24)].
15.3 Extiende programa (15.17) para solucionar un sistema de las ecuaciones lineales que
utilizan los métodos siguientes.

Varían/ 1: yon the kth paso de eliminación, ali componentes of row un\k> are
multiplicó con el mismo scalingfactor st> (í = k, . . . , n). Nota que las solucionesj
ciertas x no es afectado por tal multiplicación. Aun así, exactitud del computado
resulta x puede ser mejorado. Escoge
j

j�k
s\k> = 1 /f un\? Para i = k•... , n
EJERCICIOS 1 51

Variante 2: En el kth paso de eliminación, todos los componentes del jth la columna
está multiplicada con el mismo scalingfactor s/> (j = k, ..... , n). El computó resultados
xj Tiene que ser reajustado consiguientemente en el atrás-fase de sustitución. Escoge

�)
sj = l
Yo i�k
n
unw ij ...................... for J
.
= k, ,n

15.4 Diseño un programa para solucionar el sistema siguiente de n ecuaciones lineales, dados
los coeficientes un;j y b;..

ª11*X1 +un12*X2 = b1

for k = 2, . . . ,n - 1

ª•·•- i * x._ i + ª•• * x. = b.

Si los coeficientes un;j está arreglado en la forma de una matriz, entonces el siguiente
tridiagonal La forma está obtenida.

Un,._ ,. -1

ª"·"
Pista: En el kth paso de eliminación, sólo el siguiente dos coeficientes tienen que ser
computados.

Todos otros coeficientes quedan igual. El tridiagonal la matriz está representada por la
variable de variedad

var Un: variedad [yo ..n, - l .. l] De real.

Dónde los coeficientes un\;1 está denotado como[i,j - 1]. De este modo, coeficientes que,
por definición, es idéntico a cero, no ocupa cualquier almacenamiento.
152 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

15.5 Desarrollar un programa para solucionar el sistema siguiente de n ecuaciones lineales.


¡

¿ Un, * x = b,
Para i = 1, ... ,
j= 1 j j

n
En este caso especial, el no-cero coeficientes un,j forma la matriz triangular

ª11

Un ª··
Aviso que el algoritmo Gaussiano nl de eliminación puede ser significativamente
simplificado y que único ½n(n + 1) los coeficientes tienen que ser almacenados. El
matricial un,j es por tanto representado por la variable de variedad

Un: variedad [yo .. m] De real m = ½n(n + 1)

Y los coeficientes un,j está denotado por Un[i * (i - 1) div 2 + JJ.

15.6 Extiende programa (15.34) de tal manera que él generales no sólo el menos pero el 1O
los números más pequeños representables cuando dos sumas diferentes de dos
terceros poderes de números naturales. Estos diez pares de sumas <un,, b;) es para
ser seleccionado tal que sus plazos son linearly independientes; aquello es, tiene que
haber ningún multiplier n tal aquello
Un, = n * unj y b; = n * bj i# j

15.7 Considerar el programa siguiente para solucionar el problema en Sección 15.2.

var i,j, m, n, x: entero; p: variedad [O .. 13] of entero;


Empieza m=: O; p[O] := O;
whilem < 13
beginm := m + 1;p[m] := m* m* m; n := O; (15.69)
whilen < m Hacer
Empieza n=: n + l; x: =p[m] + p[n]; i: = m - 1;
{x Es el candidato
próximo} mientras 2 * p[1] >
x beginj: = i - 1;
while p[1] + pu] > x d oj: = j - l ;
Sip[1] + p[¡] = x entonces ir a 99 más i : = i - 1
fin
Fin
Fin;
99: escribe(x, m, n, i,j) fin.
EJERCICIOS 1 53

Determinar la historia de desarrollo y las condiciones de verificación en qué este


programa está basada.
A pesar de que el programa computa el resultado correcto yo 729, la posibilidad <loes
Existe que su autor ha hecho uso de una condición que es difícil de probar y que él
tacitly supuesto para ser cierto. (Cuál?) El programa es así un ejemplo de una solución
correcta obtenida por incorrect razonamiento.
Comparar la cantidad de la computación prescrita por este programa con aquel en
programa (15.34), ambos alterado a el caso de cuartos poderes (x4 = un 4 + =b4
c4 + d4).
15.8 Diseño un programa que computa el menos diez números X¡ cuyos poderes de tercio
son sumas de tres terceros poderes.
x¡ = Un¡ + b¡ + e¡ para i = yo, . , IO
Los plazos son para ser Iinearly independientes; aquello es, tiene que haber ningún
multiplier n

Tal aquello para cualquier i # j, un¡ = n * un1 , b¡ = n * b;, y e¡ = n * c1.


15.9 Determina analíticamente (i.e., sin la ayuda de un ordenador) el efecto de cambiar la
cláusula.
ifsquare 2 x (15.70)
A
entonces si
En programa(15.46). cuadrado < x
entonces

15.10 Por cambiar programa (15.46) según (15.70) y por cambiar la cláusula.
Mientras n < lim hacer (15.71)
A mientras n 2 lim hacer

El programa deviene falso. Cuál es la invariante ignorada y así violada ? Reteniendo los
dos cambios, cómo puede el programa ser fácilmente corrigió? Es la versión
resultante más o menos eficaz que el algoritmo de (15.46)?.

15.11 La conclusión.
x#Un "x" no es divisible por " p

en programa (15.46) está justificado sólo si el prerequisites

x 2 un < x + p y un = n * p

Es ambos satisfecho. Verifica por inserción de las aserciones pertinentes que estos condi-
tions es invariantes de el programa parcial siguiente [extraído de (15.46)], si p es un
número natural más grande que 2.

x:=l;Un:=0;
Repite x : = x + 2 ;
=
Si un < x entonces un :
un + p ;
{x 2 un < x + p, un = n* p}
Hasta
P (15.72)
1 54 CHAP. 15. STEPWISE DESARROLLO de PROGRAMA

15.12 Desarrollar un programa que genera en orden ascendente el menos 100 números del
conjunto M, donde M está definido como sigue..

(a) El número es en M.
(b) Ifx Es en M, entonces y = 2 * x + 1 y z = 3 * x + 1 es también en M.
(c) No other Números are in M. (M = {!, 3, 4, 7, 9, yoO ... })

15.13 Figura (15.73) muestra un anillo de 2 3 zeroes y unos en qué cada cual de el 2 3 posible
sub-las secuencias de 3 dígitos binarios ocurre exactamente una vez.

(15.73)
1

\
Diseño un algoritmo que generales tal anillo, constando de 2" dígitos que contienen cada
posibles sub-secuencia de n dígitos exactamente una vez. Seguir el principie de
stepwise refinamiento de programa.

15.14 Dado es un (n x n) matricial R de relaciones. Construir un algoritmo que computa


números naturales X¡ y Y; (i = 1, ... , n) tal aquello
(a) X; < Y;, if R;1 = menos,
(b) x, = y,, si RiJ = igual,
(c) X¡ > Y;, si R, 1 = más grande,
ifsuch Los números existen, y otherwise asigna el value.fi:Jlse a un Booleano variable q.
APÉNDICE Un
EL LENGUAJE DE
PROGRAMACIÓN
PASCALt

SÍMBOLOS BÁSICOS

Un ... Z,un... z Dígito


0123456789 s de
+ - * / div mod letras
VA, Operadores de
=c;ic<��>En () aritmética operadores
[] lógicos paréntesis de
{} operadores
begin Fin
relacionales
Tirantes de
comentario de
paréntesis de índice
i operador de

}
Si entonces más caso de con asignación de
Mientras repite hasta que para a
const Tipo var archivo de variedad de paréntesis de
función de procedimiento conjunto declaración cita marca
separators
récord
Símbolo de puntero
Cero
goto Etiqueta Declaración separators
Estructura de
especificadores de clase de
objeto especificadores de
clase null puntero
Operador de salto, !abe! declarator

Tipos:
IDENTIFICADORES ESTÁNDARES

Constantes: falso, cierto Booleano,


entero,char,real, texto

(8.1)
(8.1-8.4)

t Versión revisada de definición en Acta lnformatica, l, 35-63, (1971 ).

155
1 56 APÉNDICE Un

Variables: Entrada, (10.4)


Funciones: producción
abs,sqr, (8)
extraño (8.3)
(8.4, 10.3)
succ,pred
Procedimiento ord, chr (10.2-10.3)
s: trunc, eof, eoln
Pecado, cos, exp, En, sqrt, (10.4)
arctan
OPERADORES
consigue,puesto,reinicializaci
ón,reescribe
Leído, escribe, readln, writeln
Operadores relacionales (menos
prioridad): (8.3)
= =Yo= operandos arbitrarios, Abucheo de
resultado/ean
< ;;;;; � > Operandos escalares, el resultado (8.2, 8.4)
Booleano (8.1)
Operadores aditivos:
+ Adición, sustracción (8.2, 8.4)
V unión lógica (O) (8.4)
Multiplicative Operadores: (8.2)
• (8.2)
Multiplicación
(8.1)
/ División, el resultado real
div División, entero de resultado
(8.1)
mod Resto de división de entero
/\ Disyunción lógica (ANO)
Operador monádico:
, negación lógica (NO)

ESTÁNDAR REPBESENTATION DE PROGRAMAS de PASCAL CON EL


RESTRINGIDOS ASCII el CARÁCTER PUSO

1. Las mayúsculas únicas están utilizadas.


2. Ningún espacio puede ocurrir dentro de identificadores, delimitadores de palabra,
o números..
3. Símbolos básicos que está representado por palabras inglesas [así que-
delimitadores de palabra llamada, está deletreado fuera sin caracteres de
escapada circundante. No pueden ser utilizados como identificadores, y si
están precedidos o seguidos por otro delimitador de palabra o por un
identificador, al menos un carácter de espacio tiene que ocurrir en entre.
4. Símbolos de PASCAL no contenidos en el restringidos ASCII el conjunto está
traducido como sigue..
PASCAL Símbolo que Corresponde ASCII Carácter(s)

V /\ , O ANO NO
=Yo= ;;;;; � < > <= >e:
{ } (• •)
APÉNDICE Un 157

SINTAXIS
IDENTIFICA Letra
DOR
Letra

UNSIGNED ENTERO

..
t·® l
UNSIGNED NÚMERO

u_nsigned
Entero

UNSIGNED CONSTANTE
-----------.....-- constant identifier ----.----------

Carácter t-----.--

CONSTANT
E Constante
identifier

unsigned Número

---------------------- Carácter
1 58 APÉNDICE Un

TIPO SENCILLO

-- Constante

TIPO

Empaq
uetado

LISTA de CAMPO

Lista de
campo
APÉNDICE Un 1 59

VARIABLE

vUnriu
n ble
id
e nt ifier expression

field
identifier

Identificador
de campo

FACTOR

unsigned Constante

function
1---------------' variable identifier

Expresión
PLAZO

ac

4�$
----<•Myo f A rf �----,r---------,----,------. ----- �--•

�f�A,1•<>


1 60 APÉNDICE Un

EXPRESIÓN SENCILLA

EXPRESIÓN

COLA COMPUESTA

LISTA de PARÁMETRO

Identific Tipo
Identifica
ador dor

Procedimiento t---�---1--i identificador ___ _,


APÉNDICE Un 1 61

DECLARACIÓ
N
Identific
ador de
función

Expresión
Variable

Empieza t----� compound tail 1------------

Expresión

Mientras expresión

Repite Hasta que expresión

Identific
ador Expresión
variable

Declaración

goto unsigned Entero


1 62 APÉNDICE Un

BLOQUE

const Identific Constante ------------ --..


ador

Identific
ador

Lista de
parámetro

Función Identific Lista de Identific


ador parámetro ador

Empi Cola compuesta ---------------------------�


eza

PROGRUnM

---- ----------,.,""11 t--0 block ---------- - <•�


APÉNDICE B
EL ASCII CÓDIGO de CARÁCTER

b6 o o o o 1 1 1 1
oo o1 1o
o o1 1 1
bb4s 11 o o 1
3-bo b
0000 nul Dado o @ p p
0001 soh del ! 1 Un Q Un q
" b
0010 stx dc2 2 B R r
0011 etx dc3 # 3 e s e s
0100 eot dc4 $ 4 D T d t
0101 enq nak '.i� 5 E u e u
0110 ack syn & 6 F O111 V f V
belio etb 7 G 1000 w G w
bs puede ( 8 H X h X
1001 ht em ) 9 1 y i y
1010 lf sub * J
z z

ll
jk
1011 vt ese + K t[
1100 ff fs < L
\ 1
1101 cr qs - = M ] m
1110 así que rs > N - n
1111 SI nos / ? o o del

Caracteres de control los caracteres

gráficos Restringieron ASCII el carácter

Puso
t Undefined En el Estándar de ISO. Los símbolos varían entre versiones nacionales
diferentes; esto es el ASCII versión.
163
164 APÉNDICE B

EL SIGNIFICADO DE CARACTERES de CONTROL


PARA TRANSMISIÓN de DATOS

Caracteres de

• ••••••
1 diseño: bs
ht backspace
Tabulación
-
> ••••••••
••
•• •••
,-.,
N
'-
horizontal lf
alimenta
vt
la línea
Tabulación vertical
'

•• ••••••X
tf La forma
:>
::> • • •• ••
• ••
alimenta
Ignora caracteres:
cr Retorno de
1-
• • • •• carro.
nul null Caracteres
•••
(/)
O::

w uon. • •••••••G
Puede
sub Sustituto
cancel
z
• ••• del Elimina
Q.

• ••
_J
¿ ar
.
Un: � e:(
• •• •
••• •••••••
w Separator Caracteres:
fs Archivo separator
J

:rQ.
e:(
gs Grupo separator
Q.

e
•• • rs Récord separator

• •••• •
'.L.
w
:e � f..J nos Unidad separator
o o
• •
ü
2

• •••• ••
C!'.l

-
::::>
•••••••<Y
Caracteres
escapada:
de
Tan cambio-fuera
o:
Q. �
C'•
2
o Yo\
••••• • • si cambio-en
••••
11

•••
••••• • •
2 V
ese
o
:¡ Escapa
.
e:(
,X)
r-

••
•••• •• Caracteres
da de control del
medio: campana de
e2
1./'l
n
w anillo del belio
••••• •
w dcl-dc4 control de dispositivo
•• • em Fin de medio

•••• •••• •••


,q-
Un: (")
(

••
Q.

'
w \
U j Caracteres de control de la
. •• •••
n soh Inicio de encabezar.
comunicación:
•• • stx Inicio de texto.

• •• •
:
*+
etx Fin de texto.
,.... eot Fin de transmisión.
...... • ••• enq Consulta
• •• •
• •• ••
Un,!\ ack acknowledgment

1Un
nak Negativo acknowledgment
Escapada de enlace
• ••• •
-11:
de dato de dado syn
síncrono idle
e
t
b Fin de bloque de transmisión
ÍNDICE SUBJECT

Un Conjunto de carácter 49
chr(x) 51
Parámetro real 95 Código 50
Dirección 10 Codificación 12
Algoritmo 6 Fase de recopilación 13
Antecedente 16 Compilador 13
Aritmética-geométrico malo 102 Esfuerzo computacional 3, 38
Variedad 81 Declaración condicional 34
Aserción 16 Consiguiente 16
Asignación 3 Constante 5
ALGOL 60, 30 Identificador constante 46
ASCII 49 continuum 51
Carácter de control 50
B
Variable controlada 84
Convergencia 64
Copia de seguridad 118 COBOL 31
Backus-Naur Formalismo (BNF) 31
símbolo básico 32
Empieza 34 D
Búsqueda binaria 83
Dato 8
Árbol binario 82
Bisección 102 Tipo de dato 45
Mordió 10 derivation Regla 21, 36, 85
Expresión determinista 119 estado
Boole, G. 47
discreto l O
Tipo de dato booleano 47, 142 div 5, 37
Inferior-arriba 126 Operador diádico 33

e E

Anulación 54 Editando 113


Caso 35 Más 34
char 49 Codificando 10

165
166 ÍNDICE

Fin 34 Entrada 74
Entorno 94 Archivo de entrada 70
eof(f) 72 Instrucción 9, 55
Fase de ejecución 13 Entero 48
Parámetro explícito 98 Invariable 21, 23
Función exponencial 63 ISO 49
Expresión 33
L

F Lengua 29
Línea 110
Factorial 59 Local 93
Falso 41 Sección de archivo lógico 76
Fibonacci Número 66 valor lógico 47
fde 69 Bucle 15,26
Talante de archivo 70 LR-Descomposición 15.47
fin de archivo
indicador 72 longitud
de archivo 70 M
Posición de archivo 71
Estado de procesamiento del Código de máquina 13
archivo 68-69 base de punto
flotante 52 Plaza mágica 90
Coeficiente de punto flotante 52 Matricial 87
Exponente de punto flotante 52 Multiplicación matricial 88,97
Representación de punto flotante 52 mod 39
Transformación de punto flotante 107 Operador monádico 33
Flujo-esquema 14 monotonicity 53
Para 84 multi-Variedad dimensional 87
Parámetro formal 95
Función 92 N
Función designator 92
FORTRAN 30 Naur,P. 30
Neumann,John von 11
G Forma normal 52
Numérico 52
Gauss,C. F. 101, 127
Consigue(f) 71
Global 94
o
goto 120
Código de operación 11
graph 118
Más grande común divisor (GCD) 25,37, ord(x) 51
39,42 Producci ón 14
Archivo de producción 70
Desbordamiento 49, 53
H

Hardware 13
Heurístico 142 p
Horner 90
Procedimiento paramétrico 98
Variable paramétrica 97
Pivote 132,150
Sistema de número posicional 103
Si 34 pred(x) 46
Parámetro implícito 98 Tienda primaria 81
Índice 80 Número primo 138
Valor inicial 15
ÍNDICE 167

Carácter de impresión 50 Estatal 2


Impresora-carácter de control 77 Declaración 2, 33
Procedimiento 92 Paréntesis de declaración 34
Cuerpo de procedimiento 93 Célula de almacenamiento 10
Procedimiento declaration 92 Tienda 8
El procedimiento que encabeza 93 Declaración estructurada 33, 126
Declaración de procedimiento 92 subrange Tipo 49
Proceso 2, 6 Subrutina 92
Procesador 2, 8 succ(x) 46
Programa 2, 6 Análisis sintáctico 116
Programa correctness 15 Regla sintáctica 32
Desarrollo de programa 125 Sintaxis 29, 116
Documentación de programa 23 Sintaxis-esquema 32
Programa schema 58, 62, 73, 77, 84
Testaje de programa 15
Verificación de programa 16 T
Lenguaje de programación 13, 29
Puesto(f) 10 textfile 74
PASCAL 31 tkeR 34
PL/1 31 Superior-abajo 126
Rastro 4
Función de transferencia 51
R tri-Matriz diagonal 151
Matriz triangular 152
Tienda de acceso aleatorio 81 Cierto 41
Leído(x) 15, 105 trunc(x) 55
Real 51
recurrence Relación 59 Definición de tipo 45
Registro 8
Identificador de tipo 46
Expresión regular 116
Lengua regular 116
Operador relacional 48 u
Repite 35
untit 35
Declaración repetitiva 35
Reinicialización(f) 71
Romberg (Integración) 102
V
Ronda(x) 55
Rutishauser, H. 30 VII' 45
Variable 3, 5, 74
s Variable declaration 45
Varianza 73
Producto escalar 83 Vocabulario 32
Tipo escalar 45
scaling 150
Alcance 93 w
Tienda secundaria 81
Declaración selectiva 35 Mientras 35
Frase 116 Winograd, S. 91
Secuencia 68 Palabra-delimitador 32
Archivo secuencial 68 wordlength 11, 11O
Proceso secuencial 2, 6 Escribe(x) 15, l 05
Simpson (integración) 98
sine Función 63
Software 13
z
Ordenando 86 Cero (de una función) l 02
Raíz cuadrada 61
Tipos estándares 46
ÍNDICE DE PROGRAMAS de MUESTRA

Multiplicación de números naturales 37 169


(7.16)
(7.18) (12.7)
División de entero de números naturales
37, 38 (7.17) (7.22)
Más grande común divisor 37, 39-40 (7.19)
(7.25-7.27)
Solucionando una ecuación cuadrática 56
(8.32)
Informática factorials 59 (9.8)
División por multiplicación repetida 60
(9.13)
Computando la raíz cuadrada 61 (9.17)
La función exponencial 63 (9.28)
El sine función 64 (9.32)
Generando un archivo 71 (10.6)
Combinando componentes de archivo 73
(10.15)
Malo y varianza 74 (10.17)
Eliminando espacios redundandos 75
(10.20) Plotting una función por una
impresora 76 (10.21)
Inserción de impresora-caracteres de
control 78 (10.24)
Buscando una variedad 82 (11.5) (11.6)
Búsqueda binaria 83, 89 (11.8) (11.32)
Computando un producto escalar 84, 85
(11.11)
(11.17)
Encontrando el valor máximo 86 (11.19)
Ordenando una variedad 87 (11.24)
Multiplicación de matrices 88 (11.30)
Integración por Simpson 99 (12.15)
Conversión de entrada de entero 105 (13.6)
Conversión de producción de entero 105
(13.8)
Conversión de producción de fracción 107
(13.11)
Transformación de representación de punto
flotante 108 (13.15)
Ajustando longitudes de línea en un
textfile 112 (14.4)
Sustitución en una línea de texto
115-116 (14.11)
Reconocimiento de expresiones regulares
120 (14.23)
Solucionando un sistema de ecuaciones
lineales por eliminación Gaussiana
132 (15.17)
Encontrando el menos numerar igual a
dos sumas diferentes de cubos 137
(15.34)
Computando el primer n números primos
141 (15.46)
Generando nonrepeating secuencias de
tres caracteres 149 (15.67)

También podría gustarte