Apuntes - Universidad de Sevilla

Anuncio
Fundamentos de informática para Ingenierı́a Aeronaútica
Manuel Ruiz Arahal
Sevilla, octubre de 2003
2
Contenido
Índice
3
1 Introducción y fundamentos
1
1.1
1.2
Informática y computadoras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.1
Programas e instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
Estructura funcional de la computadora digital . . . . . . . . . . . . . . . . . . .
3
2 Codificación binaria de la información
2.1
5
Sistema binario de numeración . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
2.1.1
Conversiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.2
Codificación de números enteros . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.3
Codificación de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.4
Otros tipos de información . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.4.1
Números fraccionarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.4.2
Formatos gráficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
3 Estructura de la computadora digital
13
3.1
Esquema funcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.2
La memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
3.2.1
14
Caracterı́sticas de las memorias . . . . . . . . . . . . . . . . . . . . . . . .
3
4
CONTENIDO
3.2.2
Medidas de capacidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
Clases de memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
3.3.1
Estructura matricial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
3.3.2
La unidad de memoria central . . . . . . . . . . . . . . . . . . . . . . . . .
17
3.4
La unidad aritmético-lógica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
3.5
La unidad de entrada y salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
3.5.1
Periféricos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
La unidad de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3.6.1
Funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
Ejecución de instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
3.7.1
Transferencias entre registros . . . . . . . . . . . . . . . . . . . . . . . . .
28
3.7.2
La instrucción de salto . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
3.3
3.6
3.7
4 Lenguajes de programación
4.1
31
Código de máquina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
4.1.1
Código mnemotécnico . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
4.2
Ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
4.3
Sistema de explotación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
4.3.1
Estructura
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
4.3.2
Funciones de los sistemas de explotación . . . . . . . . . . . . . . . . . . .
36
4.4
Lenguajes de alto nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
4.5
Lenguajes interpretados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
4.6
El entorno MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
5 Resolución de problemas
45
c M.R. Arahal 2003 DISA. ESI. US.
°
5
5.1
Algoritmos y pseudocódigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
5.2
Objetos y operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
5.2.1
Fases del proceso de resolución de problemas . . . . . . . . . . . . . . . .
49
Diagramas de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
5.3.1
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
Programación estructurada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
5.4.1
Flujo lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
5.4.2
Análisis descendente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
5.3
5.4
Sı́mbolos
6 Desarrollo de algoritmos básicos
57
6.1
Cálculos en secuencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
6.2
Bifurcaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
6.3
Bucles simples
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
6.4
Bucles anidados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
6.5
Otros procesos iterativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
6.5.1
Sucesiones y series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
6.5.2
Ordenaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
6.5.3
Cálculos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
7 Programación en MATLAB
65
7.1
El entorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
7.2
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
7.2.1
Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
7.2.2
Creación y destrucción . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
7.2.3
Asignación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
6
CONTENIDO
7.3
Operaciones y funciones incorporadas . . . . . . . . . . . . . . . . . . . . . . . .
67
7.3.1
Operaciones elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
7.3.2
Funciones incorporadas . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
7.3.3
Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
7.3.4
Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
7.3.5
Cadenas de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
76
7.3.6
Funciones para el manejo de datos . . . . . . . . . . . . . . . . . . . . . .
77
Codificación de nuevos programas . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
7.4.1
Legibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
80
7.5
Funciones para trazado de gráficas . . . . . . . . . . . . . . . . . . . . . . . . . .
80
7.6
Sentencias de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
7.6.1
La bifurcación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
7.6.2
El bucle ”mientras” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
7.6.3
La sentencia for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
7.4
7.7
Ejemplos de programación I
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8 Programación de funciones en MATLAB
87
89
8.1
Concepto de función . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
8.2
Datos y resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
8.3
Variables locales y globales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
92
8.3.1
Clasificación de las variables . . . . . . . . . . . . . . . . . . . . . . . . . .
94
Fases de la ejecución de una instrucción . . . . . . . . . . . . . . . . . . . . . . .
97
8.4
9 Algunos problemas de ingenierı́a
9.1
Interpolación con segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
99
99
c M.R. Arahal 2003 DISA. ESI. US.
°
7
9.2
Ajuste por mı́nimos cuadrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.3
Cálculo aproximado de áreas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.4
Integración numérica de ecuaciones diferenciales . . . . . . . . . . . . . . . . . . . 104
9.5
9.4.1
Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
9.4.2
El método de Euler
Ecuaciones trascendentes
9.5.1
9.6
9.8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Método de la bisección . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Superficies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
9.6.1
9.7
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Búsqueda de extremos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Tratamiento de textos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
9.7.1
Palabras en orden inverso . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
9.7.2
Palı́ndromo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
9.7.3
Mensaje oculto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
9.7.4
Mensaje oculto II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
9.7.5
Descifrar mensaje
9.7.6
Mensaje oculto II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
9.7.7
Pase a mayúsculas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Tratamiento de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
9.8.1
Agenda telefónica
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
9.8.2
Agenda telefónica II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
9.8.3
Agenda telefónica III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Bibliografı́a
115
8
CONTENIDO
Tema 1
Introducción y fundamentos
En este primer capı́tulo se definen los conceptos fundamentales del cálculo y tratamiento automáticos de la información. Éstas son las tareas que realizan las máquinas llamadas computadoras u ordenadores. Hoy en dı́a los usos de la computadora son bien conocidos por la mayorı́a
de las personas, por lo que algunos aspectos tratados pueden parecer triviales. Sin embargo, es
conveniente definir y delimitar los términos que se manejarán en este texto para evitar confusiones. Junto con tales definiciones se presenta ahora el modelo de computadora que detallará
en el tema 3.
1.1
Informática y computadoras
La informática trata de la adquisición, representación, tratamiento y transmisión de la información. El término procede de la unión de dos palabras: información y automática. La
información aludida puede ser de muy diversos tipos: números, texto, sonido, etc. por lo que el
campo de utilización de la informática es muy amplio como es sabido.
Las máquinas que permiten realizar automáticamente las operaciones citadas se denominan
computadoras y también ordenadores. Se puede definir la computadora como un elemento
capaz de aceptar información, procesarla y proporcionar cierta información resultante. La información ha de ser suministrada de forma adecuada para su tratamiento por parte de la máquina.
El tratamiento ha de realizarse de forma automática; esto es, con poca o ninguna intervención humana y bajo el control de una lista de tareas previamente definida como se representa
gráficamente en la figura 1.1.
Es conveniente observar que la definición dada no explicita la forma de los datos ni tampoco
la clase de tratamiento que han de sufrir para proporcionar los resultados. Veremos que la
computadora digital es un dispositivo que cumple con la definición dada, pero no es el único.
Muchos de los conceptos que se vierten aquı́ se pueden aplicar a otros dispositivos, sin embargo
el objetivo de este libro es la computadora digital.
A fin de ilustrar las interacciones representadas en la 1.1 considérese una calculadora. Los
1
2
TEMA 1. INTRODUCCIÓN Y FUNDAMENTOS
Figura 1.1: La computadora trata la información de entrada (datos) para producir resultados.
datos proporcionados por el operador son números y operaciones a realizar que la calculadora
recibe al ser presionadas ciertas teclas. Los resultados son números que aparecen en el visor.
Los datos se convierten en resultados mediante procesos de cálculo en los que el operador ha
intervenido poco (comparado con realizar los cálculos a mano). Veremos más adelante que es
posible automatizar más aún la tarea del cálculo, de forma que el operador ahorre esfuerzo.
Como es sabido, el cálculo numérico no es la única aplicación de las computadoras. Los
programas para la redacción de texto, los programas de dibujo artı́stico o lineal, los juegos de
acción, las bases de datos, etc. son otros ejemplos de tareas que se realizan con computadoras.
En la actualidad la tecnologı́a electrónica digital domina el tratamiento automático de la
información, pero esto no ha sido siempre ası́. De hecho, las primeras máquinas de calcular
eran mecánicas. También ha habido computadoras neumáticas y en la actualidad se investiga
en posibles usos de la luz para construir ordenadores ópticos.
Los conceptos que se definirán a continuación son de aplicación en todos los ejemplos mencionados anteriormente, verificándose el diagrama de la figura 1.1, el cual tiene por tanto una
validez muy amplia.
1.1.1
Programas e instrucciones
La computadora realiza una lista de tareas llamada programa, la cual está formada por instrucciones. Una instrucción es un conjunto de sı́mbolos que representan una orden de operación o tratamiento de los datos. Por tanto, el programa es un conjunto ordenado de instrucciones que se dan a la computadora de forma que se obtengan los resultados a partir de los
datos.
Es conveniente comprender que un programa es una secuencia de instrucciones en un campo
mucho más amplio que el que se considerará en este libro. Para aclarar estos conceptos considérese el problema de realizar una serie de operaciones en una calculadora de bolsillo, por
3
ejemplo obtener x 6+2 . Para resolverlo basta con pulsar una cierta secuencia de teclas. Esto
puede ser bastante tedioso si se ha de aplicar la misma fórmula una y otra vez con datos dis-
c M.R. Arahal 2003 DISA. ESI. US.
°
3
tintos, es decir, para distintos valores de x. Si la calculadora pudiera pulsar sus propias teclas
bastarı́a con proporcionar únicamente el valor de x. En tal caso el trabajo del operador se ve
reducido a:
1. Proporcionar una lista con las pulsaciones de teclas: xy , 3 , + , 2 , / , 6 , =
2. Introducir cada valor de x y activar la secuencia anterior.
Nótese que el paso 1 sólo se ha de realizar una vez, por lo que el operador ahorra mucho
tiempo y esfuerzo. Esto es, en esencia, lo que realiza una computadora. La lista de teclas a
pulsar hace, en el ejemplo, las veces de programa. Este programa es proporcionado una vez y
puede ser usado en varias ocasiones.
En este ejemplo sencillo vemos que hay dos tipos de acciones que se realizan con la computadora. El primer tipo viene ilustrado por el paso 1 y consiste en proporcionar las instrucciones que
forman el programa. Esta operación recibe el nombre de programación. Programar la máquina
es por tanto proporcionar el programa o lista ordenada de instrucciones que resuelve una tarea o
problema. Una vez programada, la computadora puede ser usada para obtener resultados a partir de datos. A esta tarea se le llama simplemente uso del programa. El mismo programa puede
usarse repetidas veces con datos distintos, ahorrando tiempo al operador, pues son muchas las
instrucciones que pueden realizarse de forma automática con sólo poner en marcha el programa.
Figura 1.2: Una calculadora programable permite realizar cálculos con menor intervención humana.
Las computadoras son máquinas versátiles gracias a que es posible cambiar el programa.
2
Continuando con el ejemplo, si se precisa calcular otra función como 5+x 3 para distintos valores
de x basta con cambiar la secuencia de teclas. La misma máquina realiza ahora operaciones
diferentes al activar el programa.
1.2
Estructura funcional de la computadora digital
El esquema de computadora presentado en la figura 1.1 no indica las partes de que consta. Una
descripción más detallada mostrarı́a los módulos que realizan tareas concretas. En la historia
de las computadoras se han utilizado diversas estructuras funcionales, pero en la actualidad la
4
UAL
Memoria
principal
Unidad de control
unidad de entrada/salida
TEMA 1. INTRODUCCIÓN Y FUNDAMENTOS
Periféfico 1
Periférico n
señales
de control
información
Figura 1.3: Esquema de Von Neumann para la computadora digital.
más usada deriva del modelo ideado en 1945 por J. Von Neumann, que consta de las siguientes
partes:
• Memoria principal. Tiene como misión almacenar información. Consiste en un conjunto
de células cada una de las cuales es capaz de almacenar una unidad de información binaria;
esto es, un cero o un uno. Las células se asocian en bloques para representar informaciones
diversas, como son datos con los que operar, resultados producidos y también las instrucciones que forman el programa.
• Unidad aritmético-lógica. Este módulo incluye un conjunto de circuitos capaces de realizar operaciones aritméticas (suma, resta, etc.) y lógicas (suma lógica, negación, etc.).
La unidad aritmético-lógica (UAL) realiza las operaciones citadas bajo el control de la
unidad de control.
• Unidad de control. Este órgano es el responsable de ordenar a la UAL que realice operaciones con datos tomados de la memoria, de acuerdo con las instrucciones del programa,
las cuales están también en la memoria. La armonización del trasvase de información entre
los distintos módulos también corre a cargo de la unidad de control (UC), por lo que ésta
puede considerarse como el director del sistema.
• Unidad de entrada y salida. Permite obtener o mandar datos del/al exterior. Las vı́as
de comunicación con el mundo externo son los periféricos, que es el nombre genérico
dado a dispositivos como: el teclado, el monitor, la impresora, el disco, etc.
El diagrama de la computadora digital de acuerdo con esta estructura se puede ver en la
figura 1.3. Hay que resaltar, que la comunicación entre bloques es de dos tipos: datos y señales
de control. Dentro de los datos se incluye todo tipo de información adecuadamente representada
incluyendo la información proporcionada (datos en sentido habitual), la información procesada
(los resultados) y otros.
Las señales de control son órdenes que la UC manda a los distintos elementos para que se
realicen las operaciones. La UC y la UAL forman la unidad central de proceso (UCP), que es
el responsable de la ejecución del programa. La memoria tiene un papel pasivo proporcionando
los datos e instrucciones cuando son solicitados por la UCP.
Tema 2
Codificación binaria de la
información
Se ha indicado en el tema introductorio que las computadoras digitales sólo manejan información
en forma de ceros y unos. Sin embargo estamos acostumbrados a ver que las computadoras
permiten utilizar información de muchos tipos: texto, gráficos, sonidos. Para poder representar
la información con ceros y unos es necesario usar un código.
Los dispositivos electrónicos usados para construir las computadoras digitales se diseñan
para trabajar en torno a dos valores de tensión uno de ellos se asocia con el estado 1 y el otro
con el 0. Estos circuitos son capaces de cobijar los valores cero y uno por lo que constituyen
celdas de memoria que almacenan estos valores binarios. En este tema se muestra en qué forma
es posible representar información diversa usando únicamente los valores cero y uno.
2.1
Sistema binario de numeración
Los números se pueden expresar en distintos sistemas de numeración. Como es sabido, el más
usual es el sistema en base 10. En este sistema, llamado decimal, se interpretan las cifras como
coeficientes de un polinomio en potencias de 10:
N |10 = dn · 10n + · · · + d1 · 101 + d0 · 100
donde los dı́gitos dn a d0 constituyen el número en base 10. Para aclarar ideas considérese el
número 1492. En base 10 se interpreta como: un millar más cuatro centenas más nueve decenas
más dos unidades, o lo que es lo mismo:
1492 = 1 · 103 + 4 · 102 + 9 · 101 + 2 · 100
Los dı́gitos o coeficientes del polinomio son las cifras 1, 4, 9 y 2. En el sistema decimal se
trabaja con cifras del 0 al 9. En el sistema binario la base es el 2, por lo que sólo existen dos
5
6
TEMA 2. CODIFICACIÓN BINARIA DE LA INFORMACIÓN
posibles coeficientes: el cero y el uno. La interpretación de un número escrito en base dos es la
misma que en decimal, pero cambiando la base:
N |2 = b n · 2 n + · · · + b 1 · 2 1 + b 0 · 2 0
(2.1)
ası́ el número 01001 en base dos (indicado frecuentemente como 01001 | 2) ) se interpreta como la
cantidad
0 · 24 + 1 · 23 + 0 · 22 + 0 · 21 + 1 · 20 = 9 |10
Obsérvese que se ha indicado la base utilizada mediante un subı́ndice. Habitualmente se
trabaja en base 10, por lo que se omite dicho subı́ndice. A los coeficientes d i de la representación
digital se les llama dı́gitos, a los de la binaria bi se les llama bits1 .
Los sistemas decimal y binario son sólo dos ejemplos de una infinidad de posibles sistemas con
base b . En general, el Teorema Fundamental de la Numeración proporciona el valor decimal de
una cantidad expresada en base b por ciertas cifras. Sean los dı́gitos g p gp−1 · · · g0 .g−1 · · · g−n ,
donde el punto separa la parte entera de la fraccionaria (en la base en cuestión), entonces el
valor decimal es
i=p
X
gi · bi
N |b =
i=−n
Otros sistemas de representación numérica muy usados en informática son el octal, cuya base
es 8 y por tanto usa las las cifras del 0 al 7 y el hexadecimal, de base 16. Este último sistema
plantea un problema a la hora de escribir números y es que son necesarios 16 dı́gitos distintos.
En el sistema decimal sólo hay diez dı́gitos: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. Para obtener los restantes
seis dı́gitos se utilizan las letras A, B, C, D, E y F para representar los valores 10, 11, 12, 13, 14
y 15 respectivamente.
2.1.1
Conversiones
Las conversiones permiten obtener las cifras correspondientes a una misma cantidad en distintas
bases. En informática la conversión más usada es la de decimal a binario y viceversa, por ello
se van a describir con detalle.
Al realizar una conversión hay que tener en cuenta que la cantidad representada no cambia,
lo que se modifica es la forma en que se simboliza dicha cantidad.
Dado un número en base dos, es fácil hallar su equivalente decimal sin más que aplicar la
relación (2.1). Es decir, realizando la suma de potencias de dos. Por ejemplo el número 1 | 2)
equivale a 1 · 20 que es el uno en base 10, por tanto 1 |2) = 1 |10) . Del mismo modo se obtiene
que 101 |2) = 1 · 22 + 0 · 21 + 1 · 20 = 5 |10) .
El paso contrario, es decir, el paso de de decimal a binario, es más elaborado. Una posibilidad
es dividir sucesivamente el número por dos. Los restos de las divisiones dan el número en
binario, leı́dos en sentido ascendente, tal como se muestra en la figura 2.1 donde se obtiene la
representación en base dos del número 214 |10) .
1
del inglés binary digit
7
c M.R. Arahal 2003 DISA. ESI. US.
°
214
0
2
107
1
2
53
1
2
26
0
2
13
1
2
6
0
2
3
1
11010110
2
1
1
2
0
Figura 2.1: Método de la división larga para la conversión de base 10 a base 2.
Resulta interesante conocer las potencias de dos de ciertos números para ası́ realizar conversiones de forma rápida sin usar la regla de la división.
potencia
20
21
22
23
24
25
26
27
28
29
210
decimal
1
2
4
8
16
32
64
128
256
512
1024
binario
1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
10000000000
Ciertas conversiones resultan cómodas de este modo. Por ejemplo, para pasar a binario el
número decimal 18 basta con observar que 18 |10) = 16 + 2 y por tanto igual a 24 + 21 , por lo que
la representación en base dos resulta 10000 |2) +10 |2) = 10010 |2) ; es decir, 18 |10) = 10010 |2) .
2.2
Codificación de números enteros
La memoria de una computadora está formada por muchas células elementales agrupadas en
registros. Cada celda sólo pueden representar los números 0 ó 1, pero al considerar un grupo de
ellas (el registro) se pueden codificar números mayores como veremos.
Para representar un número entero positivo mediante un conjunto de bits se puede usar la
codificación del número en base 2. De este modo, si se dispone de registros de 16 celdas es
posible almacenar los números entre el 0 y el 216 − 1 = 65535. Si el número de celdas es mayor,
digamos 20, es posible ampliar el rango representable desde cero hasta 2 20 − 1 = 1048575.
La computadoras digitales utilizan registros de una anchura determinada, por lo que existen
lı́mites a los números que es posible representar. Este hecho caracterı́stico de los sistemas
digitales no sorprenderá a quien haya utilizado una calculadora.
La representación mostrada que utiliza la base dos es fácil de entender y de usar, por lo que
es largamente utilizada. Ahora bien, ¿y los números negativos?. El signo menos tendrı́a que
8
TEMA 2. CODIFICACIÓN BINARIA DE LA INFORMACIÓN
poder expresarse como un cero o un uno. La idea más simple es usar el bit más a la izquierda
del registro para indicar el signo del número. Ésta y otras posibles representaciones se explican
a continuación.
1. Modo signo-valor absoluto. Se reserva un bit de la palabra (normalmente el izquierdo)
para el signo. Los números positivos tienen un valor 0 para este bit y los negativos un
valor 1. Este sistema queda descrito de forma gráfica del siguiente modo:
...
|{z} | {z }
s
va
donde s simboliza el bit de signo, y va la representación en base dos del valor absoluto.
De este modo, con un registro de 16 unidades se pueden representar los números del 32767 hasta el 32767. En general, para un número de £bits en la palabra igual¤ a n se
pueden representar los enteros comprendidos en el rango −(2n−1 − 1), 2n−1 − 1 .
Como ejemplo considérense los números 5 y −4 codificados en un registro de 8 bits:
5 = 00000101, −4 = 10000100
El número de celdas n del registro afecta a la representación de los negativos, pues el bit
de signo debe quedar a la izquierda. A modo de ejemplo véase la representación de los
números 5 y −4 codificados en un registro de 6 bits
5 = 000101, −4 = 100100
Es indispensable conocer n para saber dónde está el signo.
Otra caracterı́stica de este sistema es que tiene dos ceros: el positivo (0 00 . . . 0) y el
negativo (1 00 . . . 0).
2. Complemento a 1. Nuevamente se reserva el primer bit para el signo. El resto de la
codificación es: el número en base dos si el signo es positivo o el complemento bit a bit
del valor absoluto si es negativo. Es decir, los números positivos se representan igual que
en el sistema anterior, mientras que, los negativos sufren el cambio de los unos por ceros
y los ceros por unos (excepto el bit de signo).
El ejemplo anterior en se expresa en complemento a uno con ocho bits del siguiente modo:
5 = 00000101, −4 = 11111011
Utilizando seis bits resulta:
5 = 000101, −4 = 111011
Este sistema también tiene dos ceros: el positivo (00 . . . 0) y el negativo (11 . . . 1). Para
un número de
£ bits en la palabra igual
¤ a n se pueden representar los enteros comprendidos
en el rango −(2n−1 − 1), 2n−1 − 1 .
3. Complemento a 2. Los dos sistemas anteriormente vistos presentan dificultades a la
hora de realizar sumas y restas mediante circuitos lógicos, por lo que se ha buscado otro
método. El complemento a dos de un número es igual al complemento a uno más uno;
es decir, los números positivos se representan igual que en el sistema signo-valor absoluto,
pero los números negativos se codifican con el bit de signo igual a uno y el resto como 1
más el complemento bit a bit del valor absoluto en base dos. Los números negativos se
representan pues igual que en complemento a 1 sumándoles 1.
El ejemplo habitual con ocho bits queda:
5 = 00000101, −4 = 11111100
9
c M.R. Arahal 2003 DISA. ESI. US.
°
Utilizando seis bits resulta:
5 = 000101, −4 = 111100
Los números que se pueden£ representar usando
¤ un registro de n células son los enteros
comprendidos en el rango: −2n−1 , 2n−1 − 1 . Se observa que en el lado de los negativos
hay un número más. Esto es consecuencia de que sólo existe un cero: (00 . . . 0) que usa el
espacio de un número positivo. El número −2n−1 tiene siempre la representación especial
10 · · · 0 que corresponde al cero negativo en los métodos anteriores.
2.3
Codificación de caracteres
Muchas veces la información que la computadora ha de procesar no son números sino caracteres
textuales tales como:
• Letras mayúsculas y minúsculas.
• Dı́gitos. Para escribir las cifras de un teléfono, o la hora, o números.
• Signos: ? ( ) , { } ♥ [ ] + $ . . .
• Códigos sin representación gráfica, pero con funciones de control, por ejemplo el retorno
de carro de la impresora, el aviso sonoro, los códigos de mensaje recibido, fin de mensaje,
fin de fichero, etc. que se transmiten entre dispositivos.
Para transmitir y almacenar información de este tipo se creó el ASCII (American Standard
Code for Information Interchange), que es un código que asigna arbitrariamente un número
entero a cada signo. Los números son luego representados en base dos para poder ser tratados
por la computadora.
El ASCII usa 7 bits, por lo que se pueden representar 27 = 128 signos distintos. Éstos
incluyen números, el alfabeto inglés en mayúsculas y minúsculas, signos matemáticos y de puntuación y algunos caracteres de control. Una versión posterior de este código es el ASCII
extendido, que usa 8 bits, por lo que se pueden representar 256 signos. Esto pemite incluir la
letra ñ y otras de diversos alfabetos.
El conjunto de signos incluidos en el código recibe el nombre de tabla ascii. En la tabla
2.1 se muestran los códigos ascii correspondientes a algunos caracteres. Obsérvese que las letras
van en orden alfabético a excepción de la letra ñ. Las mayúsculas están colocadas en la tabla
antes que las minúsculas. También es de interés observar que existen códigos sin representación
gráfica, que se han marcado como cc pues son códigos de control.
Los caracteres de control son combinaciones de ocho dı́gitos binarios, al igual que el resto
de la tabla ASCII. Lo que los hace en cierto modo especiales es el modo en que los periféricos
los usan. Al contrario que las letras y signos que aparecen por la pantalla o la impresora, los
códigos de control realizan cierta función sobre el dispositivo. La tabla 2.2 resume algunas de las
funciones más usadas. La primera columna indica el número dentro de la tabla ascii, la segunda
es un nombre abreviado de la función que realiza, la cual se explica en la tercera columna.
10
TEMA 2. CODIFICACIÓN BINARIA DE LA INFORMACIÓN
Nro.
0
1
2
3
..
.
Signo
cc
cc
cc
cc
..
.
.
/
46
47
Nro.
48
49
50
51
..
.
Signo
Nro.
63
64
65
66
67
..
.
0
1
2
3
..
.
9
:
57
58
Signo
?
@
A
B
C
..
.
Z
90
Nro.
..
.
Signo
..
.
Nro.
..
.
Signo
..
.
97
98
99
100
101
102
a
b
c
d
e
f
161
162
163
164
165
166
ı́
ó
ú
ñ
ñ
a
Tabla 2.1: Fragmentos de la tabla ascii.
1
2
3
4
5
6
SOH
STX
ETX
EOT
ENQ
ACK
Transmisiones
comienzo de cabecera
comienzo de texto
fin de texto
fin de la transmisión
petición de transmisión
reconicimiento de transmisión
7
8
9
10
11
13
BEL
BS
HT
LF
VT
CR
Pantalla o impresora
señal audible
retroceso
tabulación horizontal
avance de lı́nea
tabulación vertical
retorno de carro
Tabla 2.2: Algunos códigos de control.
2.4
Otros tipos de información
2.4.1
Números fraccionarios
Los números con decimales también se pueden expresar en binario, usando para ello potencias
negativas de dos. Por ejemplo, el número 101.11 |2 representa la cantidad 1 · 22 + 0 · 21 + 1 · 20 +
1 · 2−1 + 1 · 2−2 = 4 + 1 + 0.5 + 0.25 = 5.75 |10 .
En las computadoras digitales se plantea el problema de representar el punto decimal y de
interpretarlo. A continuación se describen dos posibles soluciones
1. Punto fijo. Se reservan algunos bits del registro para la parte entera del número en
binario y otros para la fraccionaria; es decir, a partir de una posición predeterminada, los
coeficientes multiplican potencias negativas de dos. Este sistema queda descrito de forma
gráfica del siguiente modo:
21
2p
···
20
2−1
2−2
.
2−q
···
donde se han reservado p + 1 celdas para la parte entera y q para la fraccionaria. No se
ha tenido en cuenta el problema del signo.
Considérese a modo de ejemplo que se tiene un registro de ocho celdas, y el punto decimal
se fija antes de los dos últimos bits, entonces el número 000001.10 |2 se interpreta como:
1 · 20 + 1 · 2−1 = 1.5 |10
11
c M.R. Arahal 2003 DISA. ESI. US.
°
y el número 000010.01 |2 como 2.25 |10 .
Los circuitos de la UAL se construyen de forma que cada parte del registro es tratada
correctamente de acuerdo a la posición del punto decimal que es fija. Las operaciones se
realizan adecuadamente en cada parte del registro.
El problema de esta técnica es que hay que fijar el punto decimal en un sitio concreto, por
lo cual no se puede trabajar con números muy dispares (por ejemplo 25000.0 y 0.00052) a
menos que se disponga de un número de bits muy alto. Debido a esto, este sistema se usa
poco en la actualidad.
2. Punto flotante.
El número (N ) a representar se transforma en dos (M, E) de forma que N = M · 2 E . La
primera cantidad, M es llamada mantisa, la segunda E el exponente. Puesto que existen
muchas combinaciones de M y E que cumplen N = M · 2E se eligen adecuadamente
de acuerdo con alguna regla. Las más comunes exigen que 0.5 ≤| M |< 1, por lo que
representación binaria de | M | comienza por 0.1. De este modo queda fijado M y por
tanto N .
Para aclarar el método es mejor pensar en la representación decimal. Un número con
decimales tal y como 340.126 puede expresarse como 3.40126 · 10 2 o como 0.0340126 · 104
o como 0.340126 · 103 .
Se denomina ajuste fraccionario o normalización al proceso de selección de la mantisa y el exponente de forma que cumpla con las especificaciones. Después de la normalización cada número M y N se codifica en un trozo de registro.
Queda por resolver el problema de representar el signo tanto de la mantisa como del
exponente. Para ello basta con utilizar alguno de los métodos vistos, como el signo-valor
absoluto o el exceso a 2n−1 .
Existen varios formatos de punto flotante con sus reglas especı́ficas como IEEE 754. No se
va a describir con detalle ninguno de estos formatos, baste saber que todos ellos son muy
similares al caso comentado, que puede mostrarse de forma gráfica como:
s.
...
s
...
|
{z
}|
{z
}
mantisa
exponente
Dado un número n de celdas el punto flotante permite representar la misma cantidad de
valores que el punto fijo pues las posibles combinaciones con n son las mismas. Ahora bien,
el rango de valores representables es mayor en punto flotante, pues el exponente permite
alcanzar números muy altos si es positivo o muy cercanos a cero si es negativo. Esta es la
gran ventaja del punto flotante frente al fijo y la razón de su uso.
2.4.2
Formatos gráficos
Las imágenes pueden representarse mediante conjunto de puntos con un color o tonalidad de gris
dado. Esta es la idea usada por formatos gráficos denominados matrices de puntos (llamados
en inglés formatos raster y bitmapped). En la figura 2.2 se representa una silueta en blanco y
negro descrita mediante una matriz de unos y ceros. El cero indica un punto luminoso y el uno
un punto oscuro. Resulta imaginable que teniendo una matriz con muchos elementos se pueden
conseguir imágenes de gran calidad.
12
TEMA 2. CODIFICACIÓN BINARIA DE LA INFORMACIÓN
Figura 2.2: Descripción de una imagen (izquierda) usando una matriz de valores binarios
(derecha).
7.500 slw
% Ellipse
n 900 1050 525 300 0 360 DrawEllipse gs col-1 s gr
% Polyline
n 615 270 m 2100 1200 l gs col-1 s gr
Figura 2.3: Descripción de una imagen (izquierda) en forma vectorial mediante PostScript.
Las imágenes resultantes son en blanco puro y negro puro, como siluetas. Para conseguir
grises se puede definir la misma matriz conteniendo números del 0 al 255, de forma que a cada
nivel de gris le corresponde un número, siendo 0 el negro y 255 el blanco. Cada elemento de la
matriz ahora no es un bit, sino un carácter (8 bits). Para obtener el color se puede realizar la
misma operación 3 veces, una para cada color rojo, verde y azul.
Este formato precisa mucha memoria, por ejemplo, para almacenar una imagen en color
de 200 × 200 puntos con ocho bits para cada color se necesitan 200 × 200 × 3 × 256 bits, que
aproximadamente son 3.7 Mc.
Un método alternativo consiste en describir la imagen mediante ecuaciones correspondientes
a lı́neas, superficies, etc, de forma que la unión de las partes produzca (aproximadamente) la
imagen total. Se habla entonces de gráficos vectoriales. La codificación de la imagen se
reduce a la de las ecuaciones de las partes. Estas ecuaciones pueden representarse de muchas
formas. Por ejemplo un segmento queda perfectamente definido por las coordenadas de sus
puntos extremos, una circunferencia por las de su centro y un punto de la misma, etc.
A modo de ejemplo considérese el dibujo de la figura 2.3 consistente en un segmento y una
elipse. Utilizando el formato PostScript estos elementos quedan definidos en la forma en que se
muestra a la derecha.
Los gráficos vectoriales son adecuados para dibujos formados por elementos geométricos
simples. Ambos métodos (matrices de puntos y gráficos vectoriales) se combinan en los formatos
denominados meta archivos (metafiles), usados por muchos programas para poder incluir objetos
formados por lı́neas precisas, como planos y esquemas, junto a otros que quedan mejor descritos
mediante una matriz de puntos como fotografı́as.
Tema 3
Estructura de la computadora digital
3.1
Esquema funcional
Como se avanzó en el tema 1, la computadora digital está formada por varias unidades con tareas
claramente diferenciadas. Recordemos ahora el diagrama de bloques que puede verse en figura
3.1. Hay que resaltar, que la comunicación entre bloques es de dos tipos: información (datos) y
señales de control. Dentro de los datos se incluye todo tipo de información adecuadamente representada incluyendo la información proporcionada (datos en sentido habitual), la información
procesada (los resultados) y otros (direcciones de memoria, estados, etc).
Las señales de control son órdenes que la UC manda a los distintos elementos para que se
realicen las operaciones. La UC y la UAL forman la unidad central de proceso (UCP), que es
el responsable de la ejecución del programa. La memoria tiene un papel pasivo proporcionando
los datos e instrucciones cuando son solicitados por la UCP.
UAL
Memoria
principal
Unidad de control
unidad de entrada/salida
En este tema se va a profundizar en el estudio de las distintas partes funcionales de la computadora, comenzando por la memoria y terminando con la unidad de control. Posteriormente
se explicará en qué forma funciona el conjunto.
Periféfico 1
Periférico n
señales
de control
información
Figura 3.1: Modelo de Von Neumann de la computadora digital.
13
14
3.2
TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL
La memoria
El tratamiento automático de la información requiere el almacenamiento de la misma de forma
más o menos permanente. Para resolver este problema se han propuesto históricamente soluciones diversas muy imaginativas como lı́neas de retraso, tubos de mercurio y núcleos de ferrita.
La memoria en una computadora es un dispositivo capaz de almacenar información. Para
servir a los propósitos del tratamiento automático de la información la memoria ha de ser capaz
de recuperar cualquier información, proporcionándola al exterior sólo cuando sea solicitada.
Como ya se ha dicho, las computadoras digitales trabajan con datos binarios, por lo que
la memoria debe poder guardar variables que toman dos valores: 0 ó 1. Para ello basta con
agrupar celdas elementales formando registros. Los registros se apilan para formar bloques
mayores, como resultado las memorias actuales tienen capacidad para varios millones de bits.
En la arquitectura de Von Neumann (figura 3.1) la memoria es el bloque que almacena tanto
los datos y resultados como las instrucciones. A petición de la unidad de control la memoria es
capaz de realizar dos operaciones:
• Lectura. Consiste en extraer una copia de cierta información. En la mayorı́a de los casos
tal información pueden leerse cuantas veces se desee, pues no es destruida por el proceso
de lectura.
• Escritura. La escritura permite almacenar información dentro de la memoria. Los datos
que se van a almacenar ocuparán algunas celdas de la memoria que previamente contenı́an
otros valores, por lo tanto el proceso de escritura siempre conlleva la desaparición de los
datos que ocupaban el lugar donde se introducen los nuevos.
3.2.1
Caracterı́sticas de las memorias
En la historia de las computadoras se han usado muchos dispositivos para almacenar información.
En la actualidad se usan circuitos integrados, discos magnéticos y discos ópticos. Cualquiera
que sea el soporte de la información la memoria queda definida por ciertas propiedades o caracterı́sticas como son:
• Tiempo de acceso. Es el que transcurre entre el instante en que se ordena la lectura/escritura
de una información y el momento en que está disponible para su procesamiento. Interesa
que sea lo más bajo posible, no obstante este requerimiento entra en conflicto con el coste.
• Capacidad. Es el número de unidades de información que puede almacenar una memoria.
Como suelen ser números muy altos se usan múltiplos como kilo y mega.
• Modo de acceso. Hay varias formas en las que se puede accceder a la información, entre
las que destacan el acceso directo y el secuencial, que se definen a continuación.
Acceso directo. Para llegar a una determinada información no es preciso pasar por las
anteriores. Este modo es también llamado aleatorio. El tiempo invertido en el acceso
15
c M.R. Arahal 2003 DISA. ESI. US.
°
es independiente de donde se encuentre la información. Las memorias que emplean
este tipo de acceso se denominan genéricamenete RAM, del inglés Random Access
Memory.
Acceso secuencial. En este tipo de acceso, para llegar a un dato hay que dejar pasar
la información que le precede. Esto es lo que sucede, por ejemplo, cuando se usa una
cinta magnética.
• Volatilidad. La información almacenada en una memoria es volátil si puede destruirse o
alterarse al cesar el suministro de energı́a al dispositivo que constituye la memoria. Esta
es la situación normal en memorias de semiconductores, que necesitan suministro eléctrico
para conservar los datos. Los discos y cintas son por contra no volátiles.
3.2.2
Medidas de capacidad
Las memorias como se ve pueden ser de muchos tipos, la más importante para nuestro estudio
de la computadora digital es la memoria principal. En los equipos actuales esta memoria está
realizada mediante circuitos semiconductores que forman puertas lógicas. De este modo surge la
celda que da cobijo a la unidad fundamental de información. Éstos y otros conceptos se definen
a continuación.
• Bit. Se denomina bit a la unidad elemental de información binaria. El bit es la información
contenida en una célula de memoria, es decir, un cero o un uno. Cualquier información
binaria puede codificarse mediante una cadena de bits más o menos larga.
• Carácter. Las células de memoria se suelen agrupar formando registros. Una agrupación
muy usada es la formada por ocho células, denominada octeto. La información constituida por ocho bits, y que se puede almacenar en un octeto se llama carácter o, más
popularmente, byte.
• Palabra. Los registros de una computadora están formados por cierto número de bits, los
más usuales son de 16, 32 y 64 unidades. La información almacenada en un registro se
denomina palabra.
Se ha de notar la diferencia entre unidades de información: bit, carácer y palabra, y el
soporte donde se guardan: unidad de memoria, octeto y registro, respectivamente.
Al tratar con memorias la unidad básica suele ser el carácter o byte. En términos informáticos
kilo es un prefijo que equivale a 210 = 1024 unidades, pues es la potencia exacta de dos más
próxima a mil. Del mismo modo, mega equivale a 220 = 1048576 unidades. En la tabla siguiente
se muestran algunos tamaños de memorias expresados de varios modos.
abreviatura
1 Kc
1 Mc
1 Gc
1 Tc
cantidad
kilocarácter
megacarácter
gigacarácter
teracarácter
bits
8 · 210
8 · 220
8 · 230
8 · 240
caracteres
210
220
230
240
16
TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL
3.3
Clases de memoria
Aunque el esquema de la figura 3.1 no lo muestra, el hecho es que existen dentro de la computadora varias clases de memoria, atendiendo cada una a una misión particular. En esta sección se
enumeran algunos de los tipos más habituales de memoria.
• Memoria principal. Es la que contiene el programa en el momento de la ejecución del
mismo. Suele estar constituida por circuitos integrados, que es la forma de almacenamiento
más rápida. En la mayorı́a de los casos es de tipo volátil y de acceso directo. Esta memoria
suele ser expansible a voluntad del operario; para ello basta con añadir más circuitos
integrados a las tarjetas de la computadora.
• Memoria auxiliar. La memoria auxiliar es un dispositivo externo1 que contiene información. Entre otros pueden citarse el disco duro, el disco óptico y los discos flexibles.
Son llamadas también memorias masivas. La velocidad de acceso suele ser menor que la
de la memoria principal, pero la capacidad de almacenamiento mayor. Al ser un periférico,
el trasvase de datos entre la memoria auxiliar requiere un adaptador que es la unidad de
entrada y salida (véase figura 3.1).
3.3.1
Estructura matricial
La memoria principal en los equipos actuales está constituida por circuitos integrados en cuyo
interior residen las células básicas de memoria, organizadas en registros como ya se ha dicho.
Una forma de representar esto es usando una disposición rectangular a base de filas y columnas,
como se muestra en la figura 3.2. Cada fila es un registro de n bits, siendo n el ancho o longitud
de la palabra. El número de filas N suele ser muy alto como puede suponerse sabiendo la
capacidad normal de las memorias actuales que es de varios megacaracteres. Cada registro
puede ser seleccionado mediante un hilo2 . Para acceder a los bits individuales que forman la
palabra contenida en el registro se tienen n hilos llamados de lectura/escritura (abreviadamente
l/e).
La lectura se realiza transmitiendo por los hilos de l/e la información de cada celda del
registro seleccionado. La escritura realiza el proceso inverso, destruyendo la información que
residı́a previamente en el registro seleccionado.
Cada registro de la memoria tiene asignado un número llamado dirección. Es habitual
conceder al registro superior el número 0 y al inferior en número N − 1, siendo N el número
total de registros.
Para acceder a la información de la memoria es preciso conocer la dirección en la que se
encuentra. Conocida dicha dirección se puede seleccionar el registro en cuestión y proceder
posteriormente a la lectura o escritura.
1
Necesita conexión especial para unirse al resto de módulos.
Término heredado de los dı́as en que las memorias eran de núcleos de ferrita ensartados en los nodos de una
red de hilos conductores.
2
17
c M.R. Arahal 2003 DISA. ESI. US.
°
hilos de lectura y escritura
célula de
memoria
N
hilos de
selección
registro
n
Figura 3.2: Estructura matricial de la memoria.
Por tanto, la selección de la información es un paso previo a la lectura o escritura y se hace
actuando sobre el hilo que correspondiente a la dirección dada. Esto lo realiza el decodificador
de direcciones.
La dirección que se proporciona al decodificador es el número de la palabra dentro de la
memoria, pero codificado en binario. Si la memoria tiene N = 2m palabras es necesario darle
al decodificador un número en binario entre 0 y 2m − 1. Para expresar este valor hacen falta
precisamente m dı́gitos binarios; es decir, la dirección es un número binario de m bits.
Para proporcionar al decodificador la dirección se usa un registro llamado de selección de
dirección que puede verse en la la figura 3.3 junto con el decodificador de direcciones.
m
decodificador
de direcciones
0
1
N=2
m
N-1
n
Figura 3.3: Diagrama de la memoria organizada matricialmente incluyendo el registro de selección de direcciones y el decodificador.
3.3.2
La unidad de memoria central
A modo de resumen, y para hacerse una idea de cómo se enlazan los elementos vistos hasta
ahora relativos a las memorias, se analizará la memoria central de una computadora. Ésta está
formada por una matriz celular de elementos de memoria, un decodificador de direcciones y una
pequeña unidad de control que coordina las operaciones necesarias para leer o escribir; todo ello
dentro de un circuito integrado. Los bloques funcionales se pueden ver en la figura 3.4, y se
18
TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL
describen a continuación.
• S. Es el registro selector de direcciones de memoria. Almacena m bits que representan (en
binario, por supuesto) la dirección del registro a seleccionar.
• LECM, ESCM. Son dos señales de control mediante las cuales la UC ordena escribir o leer.
• T. Es un registro tampón o de almacenamiento temporal que realiza la función de antesala
de la memoria. Durante una lectura recibe una copia de los n bits contenidos en la posición
seleccionada. Durante la escritura contiene la información que se va a escribir.
direcciones
LECM
Decodificador
S
m
ESCM
n
datos
T
Figura 3.4: Diagrama de bloques de la memoria central mostrando los registros y señales de
gobierno.
Para realizar una operación de lectura o escritura con la estructura anteriormente descrita,
es necesario seguir un procedimiento que se detalla a continuación.
• Lectura. El objetivo final es obtener una copia del contenido de una dirección particular de
la memoria. Los pasos a seguir son:
• Seleccionar la dirección que contiene la información a recuperar; para ello se ha de
introducir dicha dirección en el registro S.
• Dar la orden de lectura activando LECM; es decir, dando el valor lógico 1 a LECM.
Con esto se consigue que la palabra seleccionada transfiera una copia de sus bits al
registro T.
• Tomar el contenido del registro T, el cual contiene una copia de la palabra buscada.
• Escritura. La escritura consiste en introducir una información dada en una posición de
memoria concreta conocida. Los pasos a seguir son:
• Selecionar la dirección que contiene la información a recuperar; para ello se ha de
introducir dicha dirección en el registro S.
• Copiar en T la información que se quiere escribir en la memoria. Para ello se usan
los hilos de bit que conectan cada palabra de la memoria con el registro T.
• Activar la señal de escritura haciendo ESCM=1.
19
c M.R. Arahal 2003 DISA. ESI. US.
°
3.4
La unidad aritmético-lógica
Utilizando circuitos electrónicos es posible combinar el contenido de dos registros de memoria
de forma que se obtenga un tercer registro que guarde alguna relación con los primeros. Por
ejemplo de forma que el registro resultado sea la suma de los registros iniciales.
La figura 3.5 ilustra esta idea. Puede verse que el registro 1 contiene los bits 010010 que
puede interpretarse como el número binario 010010 |2) que en decimal es 010010 |2) = 18 |10) .
Similarmente, el registro 2 contiene los bits 000011 que puede interpretarse como el número
binario 000011 |2) que en decimal es 000011 |2) = 3 |10) . Es fácil comprobar que el circuito
sumador debe combinar la información de ambos registros de tal modo que el registro resultado
contenga 010101 que es la representación binaria de la cantidad 18 + 3 = 21.
Registro resultado
010101
Sumador
010010
000011
Registro 1
Registro 2
Figura 3.5: Circuito sumador.
Existen circuitos capaces de realizar operaciones aritméticas como la suma, la resta, etc.
También interesan operaciones llamadas lógicas. Como ejemplo de operaciones lógicas se puede
citar la comparación de igualdad. Un circuito comparador produce el valor binario 1 si los dos
registros R1 y R2 son iguales y el valor 0 en caso contrario.
La construcción de la UAL se lleva a cabo hoy en dı́a en una pastilla de silicio, agrupando
una serie de circuitos con puertas lógicas. Estos circuitos son capaces de realizar tareas concretas
como desplazamientos, sumas, comparaciones, etc. La unidad de control que también reside en
la pastilla puede seleccionar la operación a efectuar gracias a las señales de control. La activación
de alguna de estas señales provoca la puesta en marcha de la operación correspondiente.
Los dos operandos provienen de la memoria. Para operar con ellos se saca una copia que se
guarda en registros especiales separados de la memoria central . Frecuentemente, en computadoras y calculadoras, el resultado de las operaciones se almacena en un registro A que recibe
el nombre de registro acumulador. Para reducir el tamaño de la UAL, el acumulador es a
menudo también el soporte de uno de los operandos.
La UAL recibe órdenes de la unidad de control que especifican la operación a realizar con
los datos del acumulador y del registro de operando. El resultado de las operaciones queda en
el acumulador a la espera de ser transferido cuando lo indique la unidad de control.
La figura 3.6 muestra un diagrama de la UAL en el que se detalla el acumulador. El bloque
20
TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL
A
estado
SUMA
MULT
···
primer operando
Señales de
control.
segundo operando
Figura 3.6: Esquema de la Unidad Aritmético Lógica mostrando el acumulador y las señales de
gobierno.
con forma de v invertida contiene los circuitos que realizan las operaciones. Como se ha dicho,
el acumulador contiene el primer operando. El registro para el segundo operando se considera
en el interior de dicho bloque por lo que no se ha dibujado.
3.5
La unidad de entrada y salida
Para poder ser de alguna utilidad, la computadora ha de interaccionar con el exterior. La
recogida de datos y la evacuación de resultados se llevan a cabo mediante dispositivos variados
como son el teclado y la pantalla y que reciben el nombre de periféricos.
El reto que plantea la comunicación de la computadora con el exterior a través de dispositivos
diferentes reside fundamentalmente en la distinta velocidad de transmisión de éstos. En efecto,
considérese un teclado; la información que proviene del mismo no suele superar los 20 caracteres
por segundo, es decir hay 0.05 segundos de espera entre carácter y carácter. Durante estos 0.05
segundos la computadora puede realizar miles de operaciones. Sin embargo otros dispositivos
admiten una velocidad mayor, como por ejemplo los discos y las impresoras. La computadora
ha de adecuar sus operaciones al ritmo de transmisión de datos, so pena de perder información.
Tı́picamente, los periféricos se conectan al enlace de la computadora mediante circuitos que
realizan las adaptaciones necesarias (niveles de tensión, formato de la información, etc.). Ésta es
la situación mostrada en la figura 3.7. En el desarrollo del capı́tulo se van a describir brevemente
algunos periféricos, para pasar posteriormente al problema de la comunicación entre éstos y la
UCP.
3.5.1
Periféricos
Como se ha dicho, los periféricos son dispositivos que permiten el trasvase de información desde
el exterior a la computadora o al contrario. Los más comunes son descritos a continuación:
Teclado Permite tanto introducir texto, números y proporcionar señales para los programas. Se
compone de pulsadores electromecánicos que mandan un código identificador a un espacio
de almacenamiento temporal que la computadora lee y vacı́a periódicamente. Las teclas
que incluye son:
21
c M.R. Arahal 2003 DISA. ESI. US.
°
UCP
Adaptador
Teclado
Teclado
RAM
Adaptador
unidad de disco
Disco
ROM
Adaptador
Adaptador
vídeo
paralelo
Monitor
Impresora
Figura 3.7: Periféricos conectados a los enlaces de la computadora.
• Letras, números y signos de puntuación. Esta parte del teclado se asemeja al de una
máquina de escribir convencional.
• Tecla INTRO. Tiene dos funciones: en primer lugar permite pasar a la siguiente lı́nea
en la escritura. Además, en programas de uso interactivo sirve para dar entrada a la
información tecleada anteriormente de forma que pueda ser procesada. Por ejemplo,
después de introducir un comando hay que pulsar esta tecla, para que la computadora
ejecute la orden. En algunos teclados aparece el sı́mbolo ←| , o la palabra RETURN o
ENTER.
• Teclas de función, Numeradas desde la F1 a la F12 sirven para realizar órdenes dentro
de ciertos programas. No tienen un significado definido, sino que cada programa les
asigna una función, lo cual permite ahorrar tiempo de escritura. Por ejemplo, en
algunos editores la tecla F2 sirve para guardar una copia del texto actual en el disco.
• Teclado numérico. Además de los números, los teclados modernos, suelen traer un
teclado numérico compuesto por los números, el punto decimal y otras, en la parte
derecha del teclado. De esta forma se agiliza la escritura de grandes cantidades de
datos.
• Teclas de bloqueo de mayúsculas, bloqueo de teclado numérico, etc.
• Otras teclas especiales, como flechas, botón de parada, etc.
• Teclas que alteran la función de otras teclas.
– Tecla MAY3 . Pulsada simultáneamente con otra produce la escritura de la letra
en mayúsculas o del signo superior de los dos que aparecen encima en la tecla.
Su función normal es en todo igual a las mayúsculas de una máquina de escribir.
Aplicada a las teclas de función permite activar funciones distintas.
En general cuando se ha de pulsar una tecla conjuntamente con otra se indica mediante el signo +. Por ejemplo, para indicar que se han de pulsar simultáneamente
la tecla MAY y la tecla de función F2 se usa: MAY+F2.
– Tecla ALT. Al igual que la tecla de mayúsculas permite cambiar la función de
las teclas de función. Además sirve para generar los sı́mbolos de la tabla ASCII
manteniendo la tecla pulsada mientras se introduce el código correspondiente
en decimal. En muchas aplicaciones esta tecla tiene significado especial. Por
ejemplo, en los entornos de ventana, sirve para activar funciones dentro de un
menú tecleando ALT+inicial opción del menú.
3
En algunos teclados aparece como Shift, en otros como una flecha vertical ⇑.
22
TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL
– Tecla ALT GR. Permite obtener los signos |, [, ], } y { , u otros dependiendo del
sistema.
– Tecla CONTROL. Pulsada conjuntamente con algunas letras produce caracteres
de control. Es decir, caracteres ASCII no visibles que tienen funciones de control,
como CONTROL+G, que produce el carácter ASCII número 7 que provoca un
zumbido en el altavoz del terminal. Otros caracteres útiles son CONTROL+C
y CONTROL+Z para terminar la ejecución de programas. Usada en conjunción
con las teclas de función permite activar otras funciones distintas dentro de programas.
Una combinación de teclas especialmente útil en sistemas PC es CONTROL+ALT+SUPR
que causa un reinicio del sistema.
Los teclados tienen una velocidad de transmisión baja (10 ó 15 caracteres por segundo).
Si se teclea a una velocidad superior el espacio de almacenamiento temporal se llena y la
computadora emite un sonido de advertencia.
Ratón Es un dispositivo que sirve para posicionar un puntero gráfico sobre la pantalla, de
forma rápida. Este puntero permite realizar acciones pulsando los botones del ratón. Los
entornos de ventana hacen un uso exhaustivo del ratón. Existen diversos tipos, de bola,
óptico, por presión.
Monitor de visualización Es el lugar donde usualmente la computadora envı́a la salida de los
programas, suele ser del tipo TRC (tubo de rayos catódicos), de color o monocromo. Los
equipos portátiles suelen llevar una pantalla de cuarzo llamada de cristal lı́quido (LCD).
La imagen en los TRC se forma por barrido de un haz (monocromo) o de tres haces (color)
de electrones que inciden sobre el fósforo del interior del tubo. La señal para determinar
la intensidad de luz de cada color de cada punto de la pantalla procede de un circuito
electrónico que lee el contenido de una memoria de vı́deo que se puede dividir en planos.
El número de colores o de tonalidades diferentes de gris que se pueden enviar a la pantalla
depende del número de planos.
Para poder usar el monitor, la computadora ha de incorporar un circuito especial llamado
tarjeta de vı́deo. La imagen que se presenta en pantalla está contenida en la memoria de
vı́deo. Un circuito especial de la tarjeta se encarga del refresco de la imagen en el tubo,
consistente en redibujar la imagen un cierto número de veces por segundo de acuerdo con
el contenido de la memoria. La UCP se limita a colocar en la memoria de vı́deo la imagen
y el circuito de refresco la manda a la pantalla.
La cantidad de memoria de vı́deo disponible limita las posibilidades gráficas. Ası́, una
tarjeta con poca memoria compone las imágenes mediante puntos gruesos y con pocos
colores, como se muestra en la figura 3.8 a la izquierda. Al aumentar la memoria disponible
es posible disminuir el tamaño del punto y aumentar la cantidad de colores que pueden
presentarse a un mismo tiempo. De este modo las imágenes resultan mejor definidas como
en la figura 3.8 a la derecha. La capacidad de la tarjeta de vı́deo se indica por los puntos
horizontales y verticales y la cantidad de colores disponibles.
Impresora Es un dispositivo que permite reproducir en papel los dibujos o textos realizados
en una computadora. Hay muchos tipos distintos, dependiendo de la técnica usada para
impregnar el papel. Las más usadas actualmente son las impresoras de chorro de tinta y
las láser.
La tinta en una impresora de chorro o inyección es lanzada gota a gota sobre el papel
formando los caracteres o dibujos. Un mecanismo especial va soltando la tinta (o tintas
c M.R. Arahal 2003 DISA. ESI. US.
°
23
Figura 3.8: Imágenes proporcionadas por dos tarjetas de vı́deo distintas. A la izquierda una
imagen de 201 × 129 puntos; a la derecha una imagen de 402 × 258 puntos, ambas en blanco y
negro.
de diversos colores). Las gotas son dirigidas mediante campos eléctricos para que lleguen
al lugar indicado sobre el papel.
La impresora láser permite copiar páginas enteras de una vez. Se basan en un tambor
cargado electrostáticamente, que al ser expuesto a un rayo láser se descarga en algunas
zonas. La tinta en polvo impregna luego esas zonas del tambor. Al pasar cerca del papel
cargado opuestamente al tambor la tinta se adhiere al papel. Finalmente se aplica calor
para que la tinta en polvo funda sobre el papel. Debido a que el láser es muy fino, la
calidad de impresión es muy alta.
No hay ningún código normalizado para la comunicación ente impresoras y computadoras.
Sin embargo, normalmente no hay que preocuparse por estos detalles pues los programas
(o sistemas de explotación) permiten seleccionar el tipo de impresora a usar mediante
menús, por lo que todo lo que uno debe saber es la marca y modelo de la impresora que
tiene conectada. Entre los muchos lenguajes se pueden destacar los siguentes: PCL 1 a
PCL 5 de Hewlett-Packard y PostScript o lenguaje de descripción de páginas a base de
instrucciones producido por Adobe Systems Inc,
Las impresoras pueden conectarse a la computadora usando diversos adaptadores de entradasalida entre los que destacan: Centronics, RS232, SCSI y las conexiones de red como
Ethernet u otras.
Digitalizador de imágenes Se usan para obtener una versión digital de imágenes sobre el
papel. Para ello la imagen es descompuesta en una matriz de puntos de color y posteriormente almacenada como un archivo en un formato gráfico, como los conocidos GIF y
TIFF.
En ocasiones la digitalización de imágenes tiene por objeto conseguir un fichero conteniendo
el texto impreso en la imagen. Es decir, la imagen puede ser una página de un periódico
y lo que se desea es el texto contenido en dicha página. A partir de la imagen se pueden
usar programas de reconocimiento de caracteres (conocidos como OCR) para obtener el
texto en un fichero. Los programas de reconocimiento de caracteres suelen funcionar sólo
con letra de imprenta.
Discos magnéticos Los dispositivos de almacenamiento masivo como el disco duro, las cintas
magnéticas y el disco óptico permiten guardar grandes cantidades de datos de forma no
volátil.
Los discos llamados flexibles permiten ser extraı́dos de la computadora. Hay discos de
distintos tamaños, siendo los más usados hoy en dı́a los de 10 cm, que pueden contener
24
TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL
Pista
Cabezas
Figura 3.9: Discos magnéticos para almacenamiento de datos.
bits modulados
objetivo
datos
detector
(a)
00100010000100000100
etiqueta
plástico
(b)
Figura 3.10: (a) Esquema del disco óptico. (b) Representación de la información en el mismo.
hasta 1.44 Mc de datos.
Los discos duros están fijos en el interior de la computadora. Su construcción les confiere
mayor rapidez y capacidad. Actualmente los discos duros pueden tener capacidades entre
cientos y miles de Megacaracteres. El principio de funcionamiento es el mismo que en el
caso de los discos flexibles. En la parte derecha de la figura 3.9 se muestra un diagrama
simplificado de un disco duro, mostrando las cabezas que permiten la lectura y escritura.
Disco óptico El CD-ROM como se le conoce popularmente permite guardar gran cantidad
de datos (aproximadamente 700 Mc). La información se guarda en binario en forma de
agujeros o huecos microscópicos en el metal interior del disco. Mediante un rayo láser
se puede obtener una señal eléctrica con un voltaje alto o bajo dependiendo del paso de
depresiones bajo el láser a medida que el disco gira.
El CD-ROM es casi idéntico a los discos compactos para audio que existı́an previamente.
De hecho, ambos discos son compatibles. Los reproductores de discos para audio incorporan una etapa de conversión de digital a analógico para producir el sonido, la cual no es
necesaria en el caso de reproductores para uso de la computadora.
Puesto que el metal que contiene los datos está protegido por una capa de plástico se
consigue un medio menos sensible que los discos flexibles. El disco tiene los datos grabados
en una única pista espiral. La lectura sobre la pista es a velocidad constante, por lo que
el disco gira a distintas velocidades según el tramo leido. Ver figura 3.10 (a). Los datos
se modulan siguiendo la regla ”8 en 14”, que usa 14 bits para codificar cada carácter. Se
incluye un código de detección de errores de tipo CRC. La figura 3.10 (b) muestra la forma
en que los bits quedan grabados en el disco.
Dentro de los discos ópticos hay varias clases: hay discos que sólo admiten lectura, discos
que se pueden grabar una sola vez desde el equipo personal y discos que admiten ser
regrabados varias veces.
c M.R. Arahal 2003 DISA. ESI. US.
°
3.6
25
La unidad de control
La unidad de control es el elemento que ordena a todos los demás. La tarea que tiene encomendada consiste en enviar las señales de control que provocan operaciones de los módulos y también
transferencias de información entre los mismos.
En el esquema de la figura 3.11 se muestran los módulos ya conocidos interconectados por
enlaces. Podemos imaginar que los enlaces son autopistas de varios carriles por las cuales pueden
moverse los bits de forma que pasen de unos registros a otros.
Los elementos con que se va a trabajar y que aparecen en dicha figura son:
1. Un enlace M que une la memoria, la unidad de control y la UAL. La información que se
transmite puede ser de diversas clases: datos y resultados de operaciones, instrucciones
del programa y direcciones de memoria.
2. Otro enlace S que une la unidad de control y el selector de posiciones de memoria. Por él
se transmiten direcciones de memoria.
3. La memoria principal, con organización matricial.
4. La UAL con registro acumulador que almacena uno de los operandos y el resultado de las
operaciones.
5. Los siguientes registros:
• A. Registro acumulador de la UAL.
• S. Registro de selección de memoria.
• T. Registro tampón de comunicación entre la memoria y la lı́nea M.
• P. Contador de pasos de programa. Indica la posición dentro de la memoria de la
instrucción a ejecutar.
• I. Registro de instrucción. Guarda en cada momento la instrucción que se ejecuta en
ese paso.
• E. Registro de comunicación con el exterior. Permite tomar datos del teclado o llevarlos
a la pantalla. Es una forma simple e idealizada de la unidad de control que se ha
descrito anteriormente.
3.6.1
Funcionamiento
El esquema presentado corresponde a una máquina de programa almacenado, por lo que en la
memoria se almacenan tanto datos y resultados como el programa a ejecutar. El funcionamiento
del mismo se describe a continuación.
Para comenzar la explicación se parte de una situación en la que el programa ha sido almacenado previamente en la memoria. El programa se va a ejecutar paso a paso bajo la dirección
de la unidad de control. Ésta debe obtener de la memoria la instrucción a ejecutar, por lo que
26
TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL
INCP
A
EA
S
P
EP
SP
LECM
ES
S
ESCM
MEM
SUMA
MULT
SD
CO MD
D
ESCP
I
SA
EO
E
T
EI
ET
M
LEET
ST
EE
SE
M
Figura 3.11: Esquema de una computadora digital mostrando los enlaces y las señales de gobierno.
necesita disponer de algún medio que le permita conocer en qué posición de memoria se encuentra localizada la misma. El problema se resuelve colocando las instrucciones secuencialmente
en la memoria y dotando a la unidad de control de un registro de dirección de la instrucción
(registro P en la figura anterior). Este registro es un contador que se incrementa en una unidad
cada vez que se realiza una instrucción, pasando ası́ a apuntar a la siguiente.
Una vez localizada la instrucción se extrae de la memoria llevándola al registro I, donde
se ejecuta activando las señales de gobierno necesarias. Esta tarea la realiza un módulo de la
unidad de control que aún no se ha mostrado. Finalmente se incrementa P para poder ejecutar
la siguiente instrucción.
Cada instrucción requiere tres componentes para quedar totalmente definida: la operación,
la forma de direccionamiento y una dirección con la que operar. Estos elementos se codifican en
binario y se guardan en el registro I, que consta de las tres partes que se describen a continuación.
1. Código de operación (CO), es un conjunto de ceros y unos que identifica la operación que
debe realizarse. Las instrucciones como la suma, la resta, etc. tienen cada una un código
distinto.
2. El modo de direccionamiento (MD), que indica la forma en que se ha de interpretar la
dirección que está incluida en la instrucción. En el caso más sencillo (llamado direccionamiento directo) la dirección es la del dato o resultado de la operación.
3. Dirección de memoria (D). Esta dirección puede interpretarse de formas distintas, según
el modo de direccionamiento y la instrucción de que se trate. En un caso simple como la
suma directa, esta dirección es el lugar de la memoria donde reside el dato que se ha de
sumar.
Para aclarar las ideas, considérese la instrucción sumar al acumulador el contenido de la
posición de memoria 8. Supóngase que la codificación de esta instrucción es:
CO
0101
MD
0
D
00000001000
Por lo que el registro I, en el momento de ejecutarse esta instrucción contiene el valor
27
c M.R. Arahal 2003 DISA. ESI. US.
°
4
A
17
P
S
4
8
3
A
17
P
S
17
co | md | 8
co | md | 8
co | md | 8
A)
17
I
co | md | 8
B)
7
A
17
P
S
7
8
3
A
18
P
S
8
4
3
8
17
I
8
3
co | md | 8
I
8
3
8
17
co | md | 8
C)
3
co | md | 8
I
17
co | md | 8
D)
Figura 3.12: Fases de la ejecución de la instrucción suma.
0101000000001000. La primera parte (CO) identifica la operación suma, la segunda parte (MD)
indica que se trata de direccionamiento directo, que será explicado más adelante. Por último, la
dirección 00000001000 es el número 8 codificado en binario, y se interpreta como el lugar donde
reside el número que se ha de sumar al registro acumulador.
3.7
Ejecución de instrucciones
Para cualquier instrucción el proceso de ejecución se divide en cuatro fases: búsqueda de la
instrucción, búsqueda del operando, ejecución de la instrucción y preparación de la instrucción
siguiente. Estas fases conllevan pasos distintos dependiendo de la instrucción de que se trate.
Los casos más sencillos se plantean al considerar instrucciones aritméticas, como la suma.
La figura 3.12 muestra de forma esquemática el desarrollo de las cuatro fases para una
instrucción como la suma directa. Como es sabido los registros contienen los números en binario,
sin embargo, para dar mayor claridad al dibujo se han indicado aquı́ en decimal. Las posiciones
de memoria también se han indicado con su dirección en decimal por idéntico motivo.
La parte A) de la figura representa la búsqueda de la instrucción. Se ha supuesto que ésta se
halla en memoria en la dirección 17 por lo que el contenido de P es precisamente 17. Se observa
también el direccionamiento de la memoria logrado con el registro S. Mediante una lectura se
pasa la instrucción al registro I.
La parte B) corresponde a la búsqueda del operando; éste es el valor contenido en la dirección
de memoria 8, que en este caso es el número 3. Una nueva lectura de memoria permite pasar el
operando al registro de operando de la UAL.
En la parte C) se realiza la suma del acumulador que contenı́a el número 4 con el operando.
El resultado (7 = 4 + 3) pasa al propio acumulador.
28
TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL
En la parte D) se prepara la instrucción siguiente. El registro P se incrementa en una unidad,
de este modo, repitiendo las fases anteriores se consigue ejecutar la instrucción siguiente y ası́
sucesivamente.
Obsérvese que el desarrollo de la instrucción se logra simplemente por la transferencia de
información entre registros y mediante la transformación de ésta en la UAL. La tarea de la
unidad de control es precisamente coordinar tales transferencias.
3.7.1
Transferencias entre registros
El funcionamiento de la computadora se puede describir mediante transferencias de información
entre registros. Para verificar esta afirmación se va a explicar a continuación de forma más
detallada la ejecución de la instrucción del ejemplo anterior, sumar al acumulador un dato
almacenado en una dirección de memoria dada.
1. Búsqueda de la instrucción: consiste en extraer la instrucción que se va a ejecutar de
la memoria. El registro P contiene la dirección de la instrucción a ejecutar, por lo que
habrá de leerse la dirección de memoria indicada por P. Esta fase tiene tres operaciones
elementales:
(a) Direccionamiento: transferir a S el contenido del registro P. Esto se simboliza mediante: (P) → S. Nótese que el contenido anterior del registro S se pierde al ser
sustituido por el contenido de P.
(b) Leer de memoria , obteniéndose en T la información almacenada en la posición
definida por S, lo cual se puede expresar como: M(S) → T
(c) Pasar la instrucción a I: (T) → I, donde debe quedar para poder ser ejecutada.
2. Búsqueda del operando: En CO se ha supuesto la existencia del código de operación (que
identifica a la suma en este ejemplo). El modo de direccionamiento es directo, por lo tanto
la dirección que figura en D se interpreta como la del operando que hay que sumar al
acumulador. Los pasos son los siguientes:
(a) Buscar el operando a sumar. Para ello hay que permitir el paso de D al registro S:
(D) → S. De este modo se direcciona dicho operando.
(b) Leer de memoria: M(S) → T. El registro de la memoria que ha sido seleccionado es
copiado en T, con lo que se tiene el número a sumar en T.
3. Ejecución de la instrucción. En este caso, la suma al acumulador del contenido de T. Esto
puede escribirse como: (T)+(A) → A, puesto que, como ya se ha dicho, el acumulador
guarda el primer operando y recibe además el resultado de las operaciones.
4. Preparación de la siguiente instrucción. En este caso hay que sumar uno al contador de
pasos del programa: (P)+1 → P.
La forma en que se han detallado los pasos a realizar para ejecutar la instrucción suma
consiste en dar las transferencias elementales entre registros. Del diagrama 3.11
resulta claro que para lograr estas transferencias es necesario activar las señales de entrada y
29
c M.R. Arahal 2003 DISA. ESI. US.
°
fase
1a
1b
1c
2a
2b
3
4
transferencias entre registros
(P) → S
M(S) → T
(T) → I
(D) → S
M(S) → T
(A)+(T) → A
(P)+1 → P
señales de gobierno
SP, ES
LECM
ST, EI
SD, ES
LECM
ST, EO, SU M A, EA
IN CP
Tabla 3.1: Fases, transferencias entre registros y señales de gobierno correspondientes a la
instrucción suma.
salida de los registros, tales como: SP, ES, etc. En la tabla 3.1 se muestra de nuevo la secuencia
de operaciones para el mismo ejemplo de la suma, pero incluyendo las señales de gobierno
necesarias.
La activación de las señales de gobierno se realiza de forma automática durante la ejecución
del programa. Es una tarea que corre a cargo de la unidad de control como se explicará más
adelante.
3.7.2
La instrucción de salto
Se ha indicado que el contador de pasos de programa se incrementa en una unidad cada vez que
se ejecuta una instrucción, de forma que pase a señalar la dirección de la siguiente instrucción
en la memoria. Esta forma de proceder es adecuada para muchas situaciones, pero está muy
falta de versatilidad. El llamado salto incondicional permite romper el orden de ejecución de
las instrucciones, de forma que, tras la instrucción de salto situada en la dirección d, se pasa
a ejecutar otra, situada en una dirección distinta de d + 1. Para ello es necesario y suficiente
modificar el registro contador de pasos del programa P. Los pasos necesarios son:
1. Búsqueda de la instrucción: Hay que extraer la instrucción que se va a ejecutar de la
memoria. Esta fase tiene tres operaciones elementales:
(a) Transferir a S el contenido del registro P. Esto se simboliza mediante: (P) → S.
(b) Leer de memoria , obteniéndose en T la información almacenada en la posición
definida por S: M(S) → T
(c) Pasar la instrucción a I: (T) → I. Donde será interpretada.
2. Búsqueda del operando: en la parte D del registro I debe figurar la dirección del salto, que
se debe introducir en P, por lo que no es necesario buscar en memoria.
3. Ejecución de la instrucción. En este caso, pasar el contenido de D al registro contador de
pasos: (D) → P.
4. Preparación de la siguiente instrucción. En este caso no hay que hacer nada pues el
contador de pasos del programa contiene ya la dirección de la siguiente instrucción tras
del salto.
30
TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL
Tema 4
Lenguajes de programación
4.1
Código de máquina
El código de máquina es la forma más básica y primitiva en que se puede programar una
computadora digital. En esencia consiste en colocar en la memoria (de alguna manera) los ceros
y unos que conforman las instrucciones de un programa.
Ya se ha explicado con anterioridad que la unidad de control saca de la memoria las instrucciones una a una y las ejecuta enviando señales de control a las otras unidades de la máquina.
Se ha supuesto que el programa reside en la memoria, pero, ¿cómo ha llegado allı́?
En los sistemas de cálculo automático de los años 1940 y siguientes se disponı́a de medios
primitivos para realizar esta tarea. Las tarjetas perforadas, las cintas agujereadas (de papel o de
celuloide) eran métodos habituales. Posteriormente surgieron las cintas magnéticas y los discos.
Sea cual fuera el método, era preciso que alguna persona diseñara el programa que consistı́a
en una ristra de ceros y unos. A modo de ejemplo considérese la tabla 4.1 que muestra una
serie de instrucciones de una computadora simple. Cada lı́nea está formada por 16 celdas que
contiene una instrucción. A la derecha se ha indicado lo que cada instrucción representa.
El programa realiza una tarea muy simple: lee dos números del teclado y los almacena en
memoria. Tras esto, los suma y guarda en la memoria el resultado. Finalmente el resultado se
presenta por pantalla. Para guardar los números leı́dos se van a usar las posiciones de memoria
con dirección 10 y 11 (que se van a suponer vacı́as o no usadas). El resultado se almacena en la
dirección 12.
En este ejemplo se ha supuesto que las instrucciones del programa se almacenan codificadas
en la memoria principal comenzando en la dirección 20. De este modo el programa queda en
memoria tal y como muestra dicha tabla. Para ejecutarlo basta con introducir en el contador
de pasos de programa (registro P) la dirección de comienzo del mismo, es decir, la dirección 20.
Un programa escrito en la forma vista en el ejemplo anterior se dice que está en c ódigo de
máquina, pues utiliza únicamente las instrucciones de la máquina codificadas con ceros y unos.
31
32
TEMA 4. LENGUAJES DE PROGRAMACIÓN
dirección
.
.
.
CO
MD
D
20
0 1 0 0
0
0 0 0 0 0 0 1 0 1 0
21
0 1 0 0
0
0 0 0 0 0 0 1 0 1 1
22
0 0 1 0
0
0 0 0 0 0 0 1 0 1 0
23
0 1 0 1
0
0 0 0 0 0 0 1 0 1 1
24
0 0 0 1
0
0 0 0 0 0 0 1 1 0 0
25
0 0 1 1
0
0 0 0 0 0 0 1 1 0 0
26
.
.
.
0 0 0 0
0
0 0 0 0 0 0 0 0 0 0
significado
Leer de teclado almacenando el valor
leı́do en la posición de memoria 10
Leer de teclado almacenando el valor
leı́do en la posición de memoria 11
Llevar al acumulador (registro de la
UAL) el número guardado en la
posición de memoria 10
Sumar al acumulador el número
guardado en la posición de memoria 11
Almacenar el contenido del acumulador
en la posición de memoria 12
Escribir en pantalla el valor de la
posición de memoria 12
Parar la máquina
Tabla 4.1: Ejemplo de programa. A la izquierda se presenta una lista de las operaciones a
efectuar, a la derecha se tiene el programa en la memoria. El contenido de los registros de la
memoria se ha separado en tres bloques (CO, MD y D) para facilitar el estudio, dicha separación
no existe en realidad.
Cada UCP tiene su propio juego de instrucciones, por lo que los programas en código máquina
no son necesariamente portables; es decir, no pueden ser ejecutados en otras máquinas.
El programa de la suma que ha servido de ejemplo es muy simple y se puede programar
fácilmente en código máquina. Sin embargo es fácil adivinar la complejidad que tendrı́a el código
de máquina correspondiente a la programación de una tarea con muchas más instrucciones. Para
aliviar este problema surge el código mnemotécnico, que se describe en el punto siguiente.
4.1.1
Código mnemotécnico
Una forma de simplificar la programación es reemplazar la codificación binaria por una más
inteligible. Tal codificación ha de ser equivalente al código máquina, por lo que en cada sentencia
debe aparecer de manera clara los componentes básicos de cada instrucción, que son la operación
a realizar, el modo de direccionamiento y el operando.
Una forma sencilla de facilitar la tarea al programador consiste en escribir cada instrucción
por su nombre y los números en decimal, de forma parecida a
El programa del ejemplo anterior podrı́a codificarse del modo que se muestra en la tabla 4.2
Esta forma de codificar necesita una posterior traducción puesto que en la memoria no se
puede colocar otra cosa que no sea los ceros y unos de las instrucciones y datos. La tarea de
traducir es repetitiva y mecanizable, por lo que se dejaba en manos de personal poco cualificado.
33
c M.R. Arahal 2003 DISA. ESI. US.
°
PROGRAMA
MEMORIA
instrucción
LEER
LEER
CARGAR
SUMAR
ALMACENAR
ESCRIBE
PARAR
..
.
10
11
10
11
12
12
..
.
dirección
..
.
20
21
22
23
24
25
26
..
.
CO
0
0
0
0
0
0
0
1
1
0
1
0
0
0
0
0
1
0
0
1
0
MD
0
0
0
1
1
1
0
0
0
0
0
0
0
0
D
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
0
0
0
0
0
1
1
0
1
1
1
1
0
0
0
0
1
0
1
0
0
0
Tabla 4.2: Ejemplo de programa. A la izquierda se presenta una lista de las operaciones a
efectuar, a la derecha se tiene el programa en la memoria. El contenido de los registros de la
memoria se ha separado en tres bloques (CO, MD y D) para facilitar el estudio, dicha separación
no existe en realidad.
Posteriormente las propias computadoras fueron programadas para que llevaran a cabo la tarea
de traducir programas para otras máquinas o para sı́ mismas.
4.2
Ensamblador
Los programas traductores tomaron la dura tarea de pasar el código mnemotécnico a código de
máquina. Además se les añadieron otras funciones que aliviaban aún más la tarea del programador:
1. Los programas pueden necesitar valores para los cálculos, por ejemplo, el valor dos para
hallar la media. Este valor debe residir en memoria al iniciarse la ejecución del programa,
por lo que resulta de ayuda que el traductor lo coloque en la memoria antes de dicha
ejecución. Esta tarea recibe el nombre de establecimiento de valores iniciales o de datos
numéricos constantes.
2. También resulta preciso que existan direcciones de memoria libres para almacenar en ellas
las variables del programa. Por ejemplo, para almacenar un resultado calculado. Puesto
que en la memoria se almacenan tanto datos como instrucciones es preciso algún mecanismo para dejar huecos libres. Es decir, hay que indicar que una determinada posición
de memoria no va a contener una instrucción sino que ha de dejarse libre para alojar
información.
Se crearon entonces las pseudoinstrucciones. Éstas son anotaciones que el programador
escribe para que el programa traductor realice tareas adicionales durante la traducción, como
por ejemplo dejar espacios vacı́os en medio del programa o colocar valores constantes para que
el programa los use, una vez traducido, durante su ejecución.
El conjunto de instrucciones y pseudoinstrucciones forma el lenguaje ensamblador.
34
TEMA 4. LENGUAJES DE PROGRAMACIÓN
A pesar de ser un gran avance, el lenguaje ensamblador sigue siendo de difı́cil uso. Para
mejorar sus caracterı́sticas se crearon macroinstrucciones, subprogramas y otros desarrollos que
dieron lugar a los modernos lenguajes de programación. Pero antes de avanzar en este punto se
va a describir el sistema de explotación.
4.3
Sistema de explotación
Los sistemas de explotación (SE), conocidos también como sistemas operativos proporcionan el
medio por el cual el usuario puede interaccionar con la máquina y aprovechar sus recursos, por
lo que es muy importante comprender como funcionan.
El SE proporciona el rostro o primera imagen que el usuario percibe al usar el ordenador.
Para comprender su importancia piénsese, que la mayorı́a de las personas que usan las computadoras no ven otra cosa sino aplicaciones y el SE. En efecto, tareas como: poner en marcha programas diversos, acceder a periféricos como discos e impresoras, comunicarse con otros equipos,
etc. caen bajo la responsabilidad del SE.
El SE no sólo es aprovechado por el usuario normal, además ofrece un conjunto de funciones
que son usadas por los programadores para acceder a la circuiterı́a de cada máquina particular,
lo cual es necesario en casos como el acceso a periféricos desde programas. Estas funciones tienen
por objeto ocultar los detalles de cada computadora, de forma que el programador pueda escribir
programas que funcionen en máquinas con equipos distintos, por ejemplo discos o impresoras de
diferentes marcas.
Todo lo dicho anteriormente sitúa al SE como la conexión entre la máquina, que sólo maneja
datos binarios, y el usuario, para el cual los ceros y unos son extremadamente inoperantes.
Las aplicaciones son programas que resuelven un problema concreto para el usuario. Ejemplos de aplicaciones son los procesadores de texto, programas para dibujo o diseño gráfico,
videojuegos, etc. El SE en cambio se dedica a gestionar el uso de la computadora en sı́. Las
aplicaciones se apoyan a menudo en el SE para acceder a las entrañas del sistema: los cirtuitos.
En la figura 4.1 se presenta un esquema en el que se hace patente la situación del SE para
los distintos usuarios del sistema. En primer lugar, el usuario de aplicaciones interacciona con
éstas y no ha de preocuparse por los detalles del SE o del equipo que utiliza. A un nivel
inferior trabaja el programador de aplicaciones, que en muchos casos ha de conocer a fondo el
SE, pero que no necesita saber las particularidades de la circuiterı́a de los distintos equipos.
Finalmente, el programador de sistemas ha de enfrentarse a un hecho importante del mundo
real: las computadoras de distintos modelos o fabricantes tienen circuitos distintos, que han de
ser tratados de forma diferenciada.
A la luz de dicha figura se puede decir que el SE es un conjunto de programas que ofrecen a
los usuarios una forma sencilla, flexible y rápida de acceso a los recursos ocultando los detalles
del equipo. Este hecho, la ocultación, es de gran importancia pues permite desarrollar programas
sin conocer los detalles llamados de bajo nivel, como por ejemplo el modo de acceder a un
disco en particular.
35
c M.R. Arahal 2003 DISA. ESI. US.
°
Usuario
Aplicación
Programador
Sistema de explotación
Programador SE
Circuitos de cada máquina particular
Figura 4.1: El sistema de explotación visto por los distintos usuarios del sistema.
Intérprete de comandos
Nivel intermedio
Núcleo
Figura 4.2: Estructura de los sistemas operativos organizada por niveles.
4.3.1
Estructura
Las tareas de los SE son muy variadas. En principio se puede fijar la atención en programas
como el ensamblador y el cargador, pero hay más: desde rutinas para enviar caracteres a un
dispositivo hasta programas que permiten manejar ficheros enteros. De hecho, el SE cubre el
espacio existente entre el usuario y la circuiterı́a de la máquina mediante una estructura en la
que se pueden distinguir varios niveles.
Un SE se compone de módulos con funciones asignadas. El primero es el núcleo que es un
módulo de servicio para los demás. Los otros se encargan de la memoria, las E/S, memorias
auxiliares, asignación recursos. De este modo, la organización del SE queda como un conjunto
de capas, de forma que las superiores hacen uso de las inferiores como muestra la figura 4.2.
• Núcleo. Es el de más bajo nivel, pues descansa sobre la circuiterı́a de la computadora,
proporcionando servicios a las capas más altas. Entre las funciones que tiene asignada
destacan la gestión de interrupciones, mediante las cuales es posible realizar tareas como
la asignación de trabajo al procesador y la comunicación entre los distintos programas
• Nivel intermedio. Aunque puede estar subdividido en varios niveles, se presenta aquı́ como
uno solo por simplicidad. Las tareas que realiza son : tratamiento de E/S a nivel de ficheros
Memoria virtual, etc
• Intérprete de comandos. Ya se ha indicado que es el responsable de leer las órdenes del
usuario y procesarlas.
El sistema de explotación se divide en numerosos programas que se hacen cargo de las diversas
tareas. Entendido como un conjunto, el SE no tiene que estar en memoria completo, sino que
36
TEMA 4. LENGUAJES DE PROGRAMACIÓN
las distintas partes pueden estar en el disco y ser llamadas en el momento en que se las necesite.
Ahora bien, siempre debe existir una parte en memoria llamada supervisor residente que
incluye al menos las rutinas encargadas de las siguientes tareas:
• Aceptar órdenes del usuario a través del teclado.
• Analizar las órdenes o comandos.
• Buscar el programa necesario para cada comando, por ejemplo, para borrar un fichero o
copiarlo o para usar una aplicación.
• Cargar el programa (de borrado, de copia, aplicación, etc.) y lanzar su ejecución.
• Retomar el control al término de la ejecución.
4.3.2
Funciones de los sistemas de explotación
El SE realiza numerosas funciones, todas encaminadas a ayudar al usuario y a mejorar el
rendimiento de la máquina. A continuación se da una lista no exhaustiva clasificada por el
tipo de tarea.
Entradas y salidas
Los dispositivos periféricos usados para la E/S de datos son muy distintos entre sı́, lo cual
implica la necesidad de desarrollar comunicaciones especı́ficas para cada tipo. El SE debe limar
estas diferencias, de forma que el programador pueda solicitar operaciones de lectura/escritura
de forma parecida, con independencia del dispositivo usado.
La E/S de datos desde periféricos se realiza por medio de programas concretos. El programa
debe mandar señales de control como: puesta en marcha, posicionamiento de partes móviles,
petición de mensajes. Además se ha de coordinar la comunicación para asegurar que sea rápida y
sin errores. Todo ello requiere una programación cuidadosa. Los SE incluyen rutinas que realizan
estas tareas de forma que el programador pueda usarlas. Esto ahorra tiempo al programador y
aumenta la fiabilidad.
Dentro de los procesos de E/S merece ser destacado el problema de la detecci ón de errores. Las operaciones que implican trasvase de información están sujetas a errores provocadas
por ruidos en las lı́neas de transmisión. El sistema de explotación debe detectar estas situaciones
y actuar de acuerdo a la gravedad del problema: bien recuperando automáticamente los datos
corruptos o avisando de la existencia de errores o incluso parando el sistema. Para detectar los
errores en transmisiones existen técnicas que se detallan en el capı́tulo dedicado a la codificación
binaria de la información.
Debido a que los periféricos usan velocidades de transmisión muy diferentes a la de la UCP,
se suelen usar zonas de almacenamiento temporal. En ellas los datos son almacenados hasta que
el dispositivo de destino esté listo para aceptarlos. Se consigue de este modo que la UCP no
37
c M.R. Arahal 2003 DISA. ESI. US.
°
raíz
config
programas
cc
ens
sistema
usuarios
editor
juan
grafic
mateo
carlos
conect
dietas
juegos
ficha
prueba
listin
matriz
ahorcado gusano
Figura 4.3: árbol de directorios en un SE particular.
tenga que espera al periférico. Los periféricos virtuales surgen de esta idea y se explicarán
en una sección posterior.
Sistema de archivos
En los dispositivos de almacenamiento masivo como discos, la información se agrupa en archivos
o ficheros. A su vez, los ficheros pueden agruparse para formar directorios o carpetas que
sirven para organizar la información, del mismo modo que en un fichero convencional se puede
clasificar los asuntos en carpetas y éstas en cajones.
Los directorios pueden a su vez formar parte de directorios mayores, dando lugar a una
estructura arborescente. Esta organización jerárquica es llamada árbol de directorios. En
la figura 4.3 se muestra una de estas estructuras. A partir de la raı́z, que es el directorio superior,
parten otros directorios que a su vez pueden contener archivos (indicados en letra cursiva) y otros
directorios. El objetivo de esta organización es mantener la información estructurada para poder
acceder a ella eficientemente.
Los archivos tienen un nombre que los identifica dentro del directorio, por ejemplo los ficheros
listin y matriz de la mencionada figura 4.3. Los directorios también se identifican mediante un
nombre como es el caso de usuarios y pedro.
Las operaciones que se pueden realizar con archivos son: crear, borrar, renombrar, cambiar
la ubicación dentro del árbol, copiar, añadir información , etc. El SE provee los programas
necesarios para llevar a cabo tales tareas.
Del mismo modo los directorios pueden ser objeto de diversas acciones, como:
• Crear. El directorio nace vacı́o, es decir, sin ficheros en él. Hay que especificar el nombre
con el que se va a denominar.
• Borrar. El directorio ha de ser previamente vaciado borrando los ficheros y subdirectorios
que contiene.
38
TEMA 4. LENGUAJES DE PROGRAMACIÓN
• Listar. Consiste en abrir el directorio y leer los ficheros y subdirectorios que contiene.
• Renombrar. El nombre del directorio se puede cambiar sin afectar a su contenido. Además,
es posible recolocar el directorio dentro del árbol.
Dos archivos distintos pueden tener el mismo nombre si pertenecen a directorios distintos.
Por este motivo, si se quiere hacer referencia a un archivo de forma unı́voca no basta con dar
el nombre. Es necesario especificar el camino de directorios. En el ejemplo de la figura 4.3
mediante raı́z-usuarios-juan-dietas1 se designa el camino absoluto para llegar al fichero
dietas (se llama absoluto porque parte del directorio raı́z).
La gestión del sistema de archivos puede realizarse por medio de comandos u órdenes introducidas por el teclado (como es el caso de UNIX y MS-DOS) o utilizando una pantalla gráfica
cuyos sı́mbolos se activan y manejan con el ratón (como es el caso de los sistemas de ventana).
En ambos casos es el SE correspondiente el que recibe la operación a realizar y la lleva a cabo.
Ejecución de programas
La ejecución de un programa implica que el SE debe ceder parte del control de la máquina al
mismo. Al acabar la ejecución el SE retoma el control. Esta tarea se descompone en varias
operaciones, como son: localizar el programa en el disco, proporcionar un lugar en la memoria
para cargarlo, realizar la carga desde el disco, dar al contador de pasos del programa la dirección
de comienzo y retomar el control al finalizar.
El programa cargador que ha sido aludido numerosas veces tiene por misión colocar en la
memoria el programa que se quiere ejecutar y dar comienzo a su ejecución. Durante la misma,
el control de la máquina pertenece total o parcialmente al programa que se ejecuta. Cuando
éste finaliza, devuelve al SE tal control. En la figura 4.4 se muestra un diagrama del programa
cargador correspondiente a la computadora CESIUS que sirve para ilustrar el proceso descrito.
COMPUTADORA
Programa en
código
máquina
Cargador
COMPUTADORA
resultado
entrada
Programa
Figura 4.4: El programa cargador.
1
En este ejemplo se ha usado el guión como separador de directorios, en MS DOS el separador es la barra
invertida \ y en UNIX es la barra /.
c M.R. Arahal 2003 DISA. ESI. US.
°
39
En algunos sistemas la UCP reparte su tiempo entre varias tareas. En estos sistemas multitarea se suele vigilar el tiempo que cada programa pasa utilizando la UCP y también las
zonas de memoria usadas por cada uno. Estas cuestiones se analizarán más adelante.
Ayuda al usuario
Los usuarios necesitan a menudo acudir al manual del SE para realizar una tarea. Algunos SE
incluyen la posibilidad de consultar el manual en lı́nea; es decir, no una copia en papel sino en
la pantalla.
El manual puede ser mostrado a petición del usuario introduciendo una palabra clave para
identificar la parte del mismo que interesa. Por ejemplo, el nombre de un comando. Esto ahorra
mucho tiempo al usuario y dinero, pues las copias impresas de algunos manuales son gigantescas.
En los entornos gráficos de ventana (McIntosh Systems, Solaris, MS Windows) la ayuda se halla
en tal cantidad que es casi innecesario el manual.
Gestión de recursos
Los recursos de la computadora son la UCP, la memoria principal y los periféricos. En algunos
sistemas se permite que exista más de un programa en ejecución. Esto puede ocurrir porque el
sistema es multiusuario o simplemente multitarea. En tales casos es necesario arbitrar la
adjudicación de los recursos entre los distintos programas y/o usuarios. El sistema de explotación
se hace cargo de esta tarea, para lo cual usa reglas encaminadas a obtener un buen rendimiento
del sistema. Estas reglas deben solventar conflictos surgidos de peticiones simultáneas de un
mismo servicio.
En los sistemas multitarea la simultaneidad de ejecución se consigue dividiendo el tiempo
de trabajo en pequeños intervalos y asignándolos a cada programa. En rigor, sólo un programa
usa la UCP cada instante de tiempo, puesto que (en sistemas monoprocesador) la UCP sólo
ejecuta una instrucción cada vez, la cual pertenecerá a un programa en particular. Ahora bien,
al dividir el tiempo en trocitos y cambiar de programa frecuentemente se consigue el efecto de
que todos avancen su tarea.
En los sistemas de tiempo compartido varios usuarios utilizan una misma computadora
usando terminales remotos. El SE asigna a cada usuario una porción de tiempo para atenderle.
Debido a que el tiempo de proceso de la UCP es mucho menor que el de las acciones humanas,
cada usuario tiene la sensación de que toda la máquina es para sı́2 . Ésta es la forma de uso de
las grandes computadoras centrales a partir de los años 70.
La gestión de la memoria principal se realiza en base a técnicas sofisticadas destinadas a
proveer de recursos a los programas en ejecución manteniendo la confidencialidad de los datos.
En muchos sistemas la memoria instalada es más pequeña que la suma de espacios que ocupan los
programas que se han de ejecutar simultáneamente, por lo que éstos se han de cargar por partes;
2
En teorı́a, claro. La realidad es que cuando el número de usuarios conectados es muy alto se nota una
ralentización desesperante.
40
TEMA 4. LENGUAJES DE PROGRAMACIÓN
es decir, teniendo en memoria en cada instante sólo el trozo que interesa en cada momento. La
forma más común de gestión de memoria es la memoria virtual.
Otras tareas del SE relacionadas con la gestión de recursos son la realización de estadı́sticas
de uso por parte de los distintos usuarios y contabilidad.
Protección
En los sistemas multiusuario es deseable que unos usuarios no puedan interferir en el trabajo de
los otros. El sistema de explotación debe proporcionar mecanismos para mantener la confidencialidad de los datos. Se ha de evitar que ningún usuario pueda leer o modificar la información
que pertenece a otro, esté situada en la memoria principal o en el disco.
Además, en sistemas con posibilidad de acceso remoto3 es indispensable contar con medios
para asegurar que sólo las personas autorizadas acceden al sistema. En la mayorı́a de los casos
esto se resuelve asignando a cada usuario un nombre identificativo y una palabra secreta. Cuando
el usuario se conecta a la máquina el sistema pregunta ambos datos y comprueba la concordancia
usando su base de datos. En la historia de las redes informáticas ha habido casos célebres de
personas que han aprovechado mı́nimos fallos de seguridad para acceder e incluso modificar
información restringida.
Otro tipo de protección concierne al funcionamiento del sistema. Por ejemplo, no es deseable
que un usuario de un sistema de tiempo compartido consiga ejecutar sus programas más rápido
que los demás sin el conocimiento de nadie. Esto pudiera lograrse en algunos sistemas cambiando
la tabla de prioridades para la ejecución de tareas.
Configurar el sistema
Consiste en fijar las opciones por omisión y otros valores que suelen ser constantes durante una
sesión de trabajo. Un ejemplo puede ser elegir el idioma del usuario, de forma que el teclado
produzca los caracteres correctos. En muchos casos el proceso de configuración se produce
automáticamente durante el arranque de la computadora. En todo caso, el SE debe ofrecer
medios para que cada usuario cambie el aspecto del sistema o las opciones por omisión a voluntad.
4.4
Lenguajes de alto nivel
La programación de computadoras serı́a una tarea harto desagradable y pesada si no existiesen
los lenguajes de programación. Considérese por ejemplo el panorama mostrado en el capı́tulo
8, donde se han ilustrado las venjajas de usar un lenguaje simbólico en lugar de programar en
código de máquina. Los códigos mnemotécnicos confieren mayor legibilidad al programa y por
tanto facilitan su depuración.
3
A través de redes de computadoras o usando la lı́nea telefónica y un modem.
c M.R. Arahal 2003 DISA. ESI. US.
°
41
Los lenguajes de programación permiten realizar el paso de algoritmo a programa de computadora.
Lenguajes de alto nivel. Persiguiendo una mayor facilidad de la programación se llegó a la
observación de que es útil disponer de un medio de indicar a la máquina tareas complicadas con
pocas sentencias del programa. Por ejemplo: poder realizar una raı́z cuadrada sin necesidad de
escribir varias páginas de programa. Esto se logra con los lenguajes de alto nivel. La correspondencia entre instrucciones de máquina y sentencias del lenguaje queda rota. Las sentencias del
programa en alto nivel son traducidas y dan lugar a muchas instrucciones de máquina.
Las ventajas de los lenguajes de alto nivel son muchas: mayor legibilidad del programa,
menor tiempo de programación, mayor facilidad para el aprendizaje por parte de personas sin
grandes conocimientos de informática, y sobre todo transportabilidad.
La transportabilidad se consigue gracias a la existencia de programas traductores que construyen las instrucciones de máquina necesarias a partir del programa escrito con el lenguaje de
alto nivel. Para cada máquina distinta existe un programa que realiza la traducción adecuada.
Pero no todo son ventajas, la traducción implica una serie de operaciones que antes no existı́an. Además, al utilizar lenguaje de alto nivel a menudo se produce el efecto de ”matar moscas
a cañonazos”. Ilustremos con un ejemplo esta afirmación. Consideremos la tarea de sumar dos
números que en código de máquina queda resuelta con muy pocas instrucciones. Al usar un
lenguaje de alto nivel se escriben sentencias que son luego traducidas. El traductor proporciona
una serie de instrucciones que realizan la suma, en general aparecen más instrucciones que el
número mı́nimo necesario. Esto es debido a que el traductor no tiene la fineza del programador
humano.
Programar con un lenguaje de alto nivel es equivalente a construir una casa con grandes
bloques de cemento frente a construir con ladrillos: es más rápido, pero se derrocha material.
Como consecuencia, los programas en código de máquina se ejecutan más rapidamente que los
producidos con un lenguaje de alto nivel, pues éstos contienen más operaciones.
Existen lenguajes de programación que contienen elementos de alto y bajo nivel. Un buen
ejemplo es el lenguaje de programación C. En este lenguaje se pueden escribir expresiones que,
al ser traducidas, producen pocas instrucciones, como en los lenguajes de bajo nivel, y otras de
gran potencia cuyo equivalente en código de máquina son muchas instrucciones.
Los lenguajes de bajo nivel quedan bien reflejados mediante el LS-2 explicado en el capı́tulo
8. Como ejemplo de lenguaje de alto nivel se muestra aquı́ un programa en C.
#include < stdio.h >
void main(void)
{
int i;
for(i=0; i<10; i++)
printf(”\n %d %d”, i, i*i );
printf(”\n Fin”);
}
42
TEMA 4. LENGUAJES DE PROGRAMACIÓN
Puede observarse que el programa está escrito usando palabras del idioma inglés y expresiones
parecidas a las habituales en Matemáticas.
4.5
Lenguajes interpretados
Como se ha visto son necesarios traductores para los lenguajes de bajo y alto nivel. Es conocido
del capı́tulo 8 el programa ensamblador de dos pasos. Recordemos que tiene como misión
producir las instrucciones del programa a partir del código escrito en lenguaje simbólico en la
forma que se muestra en la figura 4.5.
COMPUTADORA
Programa
en LS-2
Traductor
Programa en
código
máquina
Figura 4.5: El programa traductor para LS-2.
Cuando se usan lenguajes de alto nivel es posible utilizar intérpretes o compiladores.
Los intérpretes realizan la traducción y ejecución del programa sentencia a sentencia. En cambio,
los compiladores producen un código intermedio que sirve para crear un fichero ejecutable que
puede ejecutarse posteriormente tantas veces como se desee.
La forma de trabajo queda reflejada en la figura 4.6. Los bloques marcados como MF
son trozos de programa escritos en el lenguaje de alto nivel y reciben el nombre de módulos
de código fuente. Estos módulos se almacenan en ficheros llamados ficheros fuente. El
compilador acepta varios de estos módulos para producir los correspondientes bloques de c ódigo
objeto. El código objeto consiste en instrucciones de máquina, pero no está preparado para
funcionar. Es preciso un proceso de montaje, donde se reúnen todas las partes para formar el
programa ejecutable.
Obsérvese que además del código fuente escrito por el programador existen partes del programa que proceden de la biblioteca. Se incluyen ahı́ rutinas de uso frecuente para matemáticas
o para el manejo de periféricos, etc. que facilitan la tarea del programador. La biblioteca se
compone de muchos módulos de código objeto que se venden normalmente con el compilador.
El programador no puede ver o cambiar las rutinas incluidas en la biblioteca, pero recibe información del vendedor para poder usarlas.
El resultado del montaje es un programa ejecutable, consistente en instrucciones de la
máquina que se esté utilizando.
El proceso de creación de programas usando lenguajes de alto nivel involucra según estamos
viendo muchas operaciones. Los programadores cuentan hoy en dı́a con aplicaciones que les
permiten escribir código fuente, compilar, montar e incluso ejecutar paso a paso los programas.
Los pasos que el programador ha de realizar son:
1. Estudio del problema a resolver.
43
c M.R. Arahal 2003 DISA. ESI. US.
°
MF1
MF2
MF3
M F = Módulo en código fuente
Compilador
M O = Módulo en código objeto
MO1
MO2
MO3
Montador
Biblioteca
Fichero ejecutable
Cargador
Ejecutable en memoria principal
Figura 4.6: Compilación y montaje de módulos para crear un fichero ejecutable.
44
TEMA 4. LENGUAJES DE PROGRAMACIÓN
2. Desarrollo y verificación de un algoritmo.
3. Estudio de la codificación del algoritmo.
4. Escritura de los ficheros fuente.
5. Compilación.
6. Si hay errores volver a 4, si no proceder al montaje.
7. Si hay errores volver a 4, si no proceder a la prueba de ejecución.
8. Ejecutar programa.
9. Verificar salida proporcionada por el programa.
Se observa que, cada vez que se modifica alguna parte del código fuente es preciso volver a
compilar y montar. Esto no sucede si se utiliza un intérprete, a pesar de ello los intérpretes son
poco usados pues la ejecución es más lenta.
4.6
El entorno MATLAB
MATLAB es un programa pensado para realizar cálculo numérico. Mediante una ventana permite que el usuario escriba órdenes que son interpretadas y ejecutadas en ese momento. A la
vista de los resultados el usuario puede continuar con otras órdenes hasta que completa la tarea
que precisa realizar.
Las órdenes tı́picas son sentencias como y=cos(3)+x/z que permiten al usuario obtener los
resultados de cálculos complejos.
Además el usuario puede apilar un conjunto de órdenes y enviarlas a la ventana de órdenes
formando un lote. De este modo el usuario puede apartarse un rato de la pantalla y descansar
mientras aparece la respuesta.
EL conjunto de órdenes disponibles en MATLAB permite realizar tares muy diversas, por lo
que constituye un verdadero lenguaje de alto nivel para programar la computadora, aunque hay
que decir que MATLAB no fue creado con este propósito. Se trata de un lenguaje interpretado,
lo cual facilita su uso aunque disminuye la velocidad a la que realiza los cálculos.
En el tema 7 se explicarán las órdenes más comunes y el manejo de MATLAB para que sirva
de banco de pruebas con el cual realizar prácticas de programación.
Tema 5
Resolución de problemas
Una vez que se tiene una idea de cual es la estructura y funcionamiento de la computadora digital
es posible preparar el camino para lograr su programación. En primer lugar hay que dejar claro
que un programa es una realización concreta de un algoritmo que resuelve un problema, por lo
que la tarea difı́cil es en la mayorı́a de los casos la de hallar el algoritmo.
En este tema se van a tratar varios aspectos relacionados con la programación. En primer
lugar se mostrará la forma de exponer los algoritmos usando el lenguaje natural de las personas.
Estas descripciones reciben el nombre de pseudocódigo, y no constituyen un lenguaje de programación o código alguno. Posteriormente se mostrará cómo crear representaciones gráficas de los
algoritmos llamadas diagramas de flujo. Finalmente, se tratan los problemas que aparecen al
tratar de modificar programas previamente escritos. La solución a tales problemas pasa por un
conjunto de reglas que, restringiendo la libertad del programador, permiten producir programas
legibles y fácilmente modificables.
5.1
Algoritmos y pseudocódigo
Un algoritmo1 es un ”conjunto ordenado y finito de operaciones que permite hallar la solución de
un problema”. No debe confundirse algoritmo con programa, este último es la codificación del
algoritmo en algún lenguaje de programación o en instrucciones de la máquina. La resolución
de problemas mediante computadora conlleva dos pasos: hallar un algoritmo y su posterior
codificación. De forma gráfica se ha ilustrado en la figura 5.1.
Algoritmo
Problema
resolución
Programa
codificación
Figura 5.1: Proceso de resolución de problemas mediante computadora.
El pseudocódigo es un modo de especificar la solución de un problema, una expresión de
1
La palabra procede de al-Jwarizmi, sobrenombre del célebre matemático Mohámed ben Musa.
45
46
TEMA 5. RESOLUCIÓN DE PROBLEMAS
un algoritmo dada en lenguaje natural, por ejemplo una receta de cocina. Los algoritmos con
que trataremos aquı́ tienen un carácter más matemático. A modo de ejemplo considérese el
problema consistente en hallar el resto de la división entera de un número a entre otro b. Un
ejemplo de pseudocódigo es el siguiente:
1
2
3
4
Hallar el cociente c de a/b
Tomar la parte entera del cociente, d = [c]
Obtener el resto como a − b ∗ d
Fin
En la tabla anterior se ha usado el operador parte entera, simbolizado como [ . ], por ejemplo
[3.742] = 3.
Las operaciones necesarias para resolver el problema han sido especificadas en lenguaje natural. De este modo el pseudocódigo es una receta válida para todo programador, cualquiera
que sea el lenguaje de programación que vaya a usar. En el ejemplo anterior las operaciones
a realizar vienen dadas en secuencia; esto es, una detrás de otra. Pero éste no es siempre el
caso, como ocurre en el siguiente ejemplo. Considérese la tarea de hallar el valor absoluto de un
número x.
1
2
3
Si x es positivo, el resultado es x
Si no, el resultado es −x
Fin
Muchos algoritmos requieren la repetición de un conjunto de operaciones cierto número de
veces. En tales casos es conveniente disponer de un modo para indicar dicha repetición en lugar
de repetir las sentencias. Por ejemplo, el algoritmo para hallar la norma de un vector v de 10
componentes2 podrı́a ser el indicado en la tabla siguiente.
1
2
3
4
5
Iniciar suma parcial sp a cero
Iniciar ı́ndice i a uno
Hacer:
3.1 Dar a sp el valor sp + vi2
3.2 Incrementar i
3.3 Si i > 10 ir al punto 4, si no ir a 3
√
El resultado es sp
Fin
Los tres ejemplos anteriores presentan tres situaciones muy frecuentes en programación y
que serán tratadas con detalle en este capı́tulo.
Los algoritmos no sirven sólo para operaciones matemáticas; como ha sido el caso de los
ejemplos mostrados, también pueden emplearse en otros contextos como el ejemplo de la receta
2
La norma se calcula como la raı́z cuadrada de la suma de las componentes al cuadrado,
qP
i=10
i=1
vi2 .
c M.R. Arahal 2003 DISA. ESI. US.
°
47
de cocina. Resulta fácil imaginar que si la receta no está bien explicada es posible que no pueda
llegarse con éxito al objetivo. Tomemos como ejemplo una receta para freir un huevo:
1
2
3
4
5
6
7
8
Poner aceite en sartén
Colocar sartén en fuego
Romper huevo haciendo caer el contenido en
sartén
Tirar cáscaras a la basura
Poner sal en yema
Si el huevo está sólido ir a 7, si no esperar
Servir huevo, fregar sartén
Fin
Dejando aparte la habilidad manual necesaria, es obvio que si la persona que lee la receta
desconoce el significado de alguna acción será incapaz de preparar el huevo frito. Esta observación también se puede aplicar a los pseudocódigos de algoritmos matemáticos, por lo que hay
que poner especial cuidado en utilizar sólo aquellos elementos que se suponen conocidos por el
lector.
En la literatura especializada se denomina procesador a la entidad que realiza las operaciones
indicadas por el algoritmo. Las acciones que el procesador conoce se denominan primitivas.
En un algoritmo puede haber operaciones no primitivas siempre y cuando sean definidas usando
acciones primitivas.
5.2
Objetos y operaciones
En la descripción de algoritmos es preciso con frecuencia hacer referencia a objetos que es preciso
manipular. Considérese el ejemplo de hallar el valor absoluto expuesto anteriormente. En el
pseudocódigo hemos utilizado sentencias como ”Si x es positivo, el resultado es x”. En ella hay
un objeto x que, por familiaridad con la notación matemática, hemos identificado sin problema
como un número cualquiera.
En informática se manejan diversos tipos de informaciones, no sólo numéricas. Considérese
por ejemplo el problema de cifrar un mensaje para transmitirlo de forma secreta. Un modo
sencillo de cifrar mensajes es cambiar cada letra por la siguiente en el alfabeto. De este modo,
el mensaje: ”estamos bien” se convierte en ”ftubnpt cjfo”. El pseudocódigo siguiente permite
realizar la tarea de cifrado.
1
2
3
4
5
6
Iniciar ı́ndice i a 1
Tomar li letra i-ésima de la palabra
Reemplazar por li + 1, siguiente en el alfabeto
Si li es la última letra ir a 6
Sumar uno a i
Fin
48
TEMA 5. RESOLUCIÓN DE PROBLEMAS
En este caso se ha identificado cada letra de la palabra por un sı́mbolo l i . Además, se ha
considerado que al sumar uno a una letra se consigue la siguiente letra del alfabeto. Ciertamente,
estos no son usos corrientes de la notación matemática.
Para poder escribir algoritmos de forma cómoda y precisa es conveniente nombrar a distintos
objetos (como números o letras) usando para ello identificadores o nombres. El identificador
simboliza una cantidad que puede ser constante o que puede variar a lo largo de la tarea. Cada
identificador hace referencia a un único objeto que es de un tipo determinado (número entero,
letra, palabra, número real, número complejo, etc.)
En resumen, los objetos tienen un único nombre que lo identifica. Poseen también un tipo
que no varı́a durante el algoritmo. El valor o cantidad representado por el nombre puede variar
durante el algoritmo, en tal caso se dice que el objeto es una variable. Por contra, existen
objetos cuyo valor no cambia, son las llamadas constantes.
Para aclarar los conceptos anteriores considérese el problema de obtener dos números números
enteros a y b y hallarles la media.
1
2
3
preguntar el valor de a y b
la media es m = a+b
2
Fin
La tabla siguiente muestra los atributos de los objetos que aparecen en el algoritmo anterior.
objeto
primer número
segundo número
media
dos
nombre
a
b
m
2
valor
variable
variable
variable
constante
tipo
número
número
número
número
entero
entero
real
entero
Obsérvese que los valores de a y b pasan de ser indeterminados a tener un valor concreto
tras el paso 1. Por este motivo a y b son variables. La única constante es el número dos, que se
ha representado con el identificador 2.
Los objetos son manipulados mediante operaciones como la suma, la resta, etc. o mediante
otras acciones ”romper”, ”vaciar”. Los enunciados en los que se indican las manipulaciones
son llamados expresiones. Las expresiones muestran la forma en que tal manipulación se
realiza, para ello se combinan los nombres de objetos con signos que simbolizan operaciones.
Por ejemplo, al escribir m = a+b
2 se indica que la variable m ha de cambiar su valor tomando el
resultado de sumar a y b y dividir por dos. Las operaciones involucradas son la suma y división
aritméticas.
La descripción de un algoritmo no será de ninguna utilidad si contiene operaciones no conocidas por la persona (o mecanismo) que lo recibe. Los lenguajes de alto nivel ponen a disposición
del programado muchas operaciones diferentes, por lo que escribir el programa resulta fácil. En
c M.R. Arahal 2003 DISA. ESI. US.
°
49
cambio, cuando se usa un lenguaje de bajo nivel es preciso describir cada tarea en función de
operaciones simples, por lo que la escritura es larga y tediosa.
En esta obra, las operaciones que se consideran conocidas por el lector son las corrientes de
la aritmética. Hay que destacar sin embargo el uso especial del signo =. En Matemáticas se
emplea para establecer una relación de equivalencia entre dos términos. Aquı́ sin embargo se ha
usado para asignar valores a variables. De este modo x = 2 significa que la variable x toma
el valor dos en ese momento, pudiendo más adelante alterarse dicho valor mediante una nueva
asignación. Para evitar confusiones se usará el signo ←, de forma que se escribirá x ← 2.
Otra operación que puede parecer poco familiar es la que permite preguntar valores para
asignarlos a variables. Esta operación es llamada lectura y equivale a la entrada de datos
en la computadora. Estos datos pueden provenir de cualquier periférico, la caracterı́stica que
los distingue es que no son conocidos a la hora de programar, por lo que han de ser obtenidos
durante la ejecución.
Los tipos de objetos que se utilizarán son también los habituales de las Matemáticas: números
enteros, reales, vectores y matrices.
Los lenguajes algorı́tmicos tienen reglas para la escritura destinadas a obtener algoritmos
legibles. No hay espacio en este libro introductorio a la informática para describir en detalle
y con rigor un lenguaje algorı́tmico. Sin embargo podemos citar las siguientes restricciones,
algunas de las cuales han sido ya comentadas.
• El lenguaje algorı́tmico debe tener palabras reservadas como ”iniciar”, ”asignar”, ”incrementar”. Los objetos no pueden tomar como nombre ninguna de estas palabras.
• Cada objeto debe tener un identificador.
• Cada acción debe escribirse en una sentencia.
• El conjunto de acciones primitivas ha de ser especificado con total claridad formando un
conjunto pequeño pero suficiente.
5.2.1
Fases del proceso de resolución de problemas
Es difı́cil concretar en proceso de resolución de problemas pues cada problema plantea dificultades especiales. No obstante hay una serie de reglas que conviene observar a la hora de construir
algoritmos.
• Definición del problema, de forma que quede absolutamente claro qué es lo que se pretende
resolver. Además hay que especificar cuáles son los datos y cuáles los resultados buscados.
• Esbozo de la solución. El problema debe partirse en trozos para los cuales se sospecha
que puede haber soluciones conocidas. Es preciso asegurarse que al resolver los trozos se
consigue la solución del problema total.
• Resolución de los subproblemas y prueba de la validez de los mismos.
50
TEMA 5. RESOLUCIÓN DE PROBLEMAS
• Expresión en pseudocódigo de los algoritmos correspondientes a cada parte.
• Prueba de validez del algoritmo que surge de unir todas las partes.
Para seguir estas reglas se dispone de la ayuda de la programación estructurada, que será
tratada más adelante. El tipo de problemas que se resuelve para dar los primeros pasos en programación es muy simple por lo que no es fácil ver la utilidad de las recomendaciones anteriores.
5.3
Diagramas de flujo
Un diagrama de flujo u organigrama es una representación gráfica de las distintas operaciones que
deben ser realizadas por un operador (humano o mecánico) para la resolución de un problema,
indicando el orden lógico de las mismas, las posibles alternativas, etc.
Existen muchos tipos de representaciones gráficas. En este texto se va a usar un conjunto de
sı́mbolos para representar acciones y decisiones, conectados por flechas que indican el orden en
que se realizan. Hay que hacer notar que la representación gráfica de un algoritmo no es exclusiva
de la informática, sino que puede usarse en cualquier entorno que requiera planificación. Más
aún, la representación del algoritmo es independiente de la programación en un lenguaje u otro
o de la máquina en que vaya a ser ejecutado.
5.3.1
Sı́mbolos
La figura 5.2 muestra el conjunto de sı́mbolos que se van a usar para realizar diagramas de flujo.
De izquierda a derecha y de arriba a abajo se tiene:
• Comienzo de módulo. Marca el comienzo de un bloque del programa.
• Proceso. Este elemento indica la realización de operaciones diversas. Equivale a una o más
acciones del pseudocódigo.
• Bifurcación condicional. Permite elegir una de entre dos opciones en función de cierta
condición que se ha de especificar. Permite representar operaciones de decisión como ”si
... , entonces ... ; si no ...”, como se ha visto en el ejemplo del pseudocódigo para
calcular el valor absoluto de un número.
• Operación de entrada o salida. Gracias a este bloque se pueden tomar datos del exterior (entrada) o enviar resultados al exterior de la computadora (salida). Equivale a las
operaciones de lectura y escritura del pseudocódigo.
• Fin de módulo. Marca el final de un módulo.
• Subprograma. Los subprogramas son bloques de código preparados para ser incluidos en
programas, de forma que se ahorre tiempo de preparación de los mismos. Un subprograma
se hace cargo de una parte de la tarea que puede ser repetida en varias partes del programa
o en programas distintos. Por ejemplo, el cálculo de la norma de un vector o el determinante
de una matriz.
51
c M.R. Arahal 2003 DISA. ESI. US.
°
• Módulo. Este sı́mbolo indica que la operación es realizada por un bloque que se detalla
en otro lugar. Un módulo se diferencia de un subprograma en que éste tiene siempre
entidad propia en el código, mientras que el módulo es el resultado de una división en la
representación gráfica y puede no afectar a la codificación.
• Inicio y actualización. Realización de operaciones iniciales de un módulo. Asignación de
valores iniciales y modificación de ı́ndices y contadores, usados sobre todo en bucles.
Inicio de bloque
Proceso
Fin de bloque
Subprograma
Bifurcación
Entrada o salida
Módulo
Actualización
Figura 5.2: Sı́mbolos para la confección de diagramas de flujo.
A modo de ejemplo considérese el problema consistente en ”leer dos números y escribir la
suma”. El pseudocódigo correspondiente a este programa se muestra en la tabla 5.1. Las operaciones de lectura consisten en tomar datos provenientes de un periférico exterior, normalmente
el teclado; es decir, la operación marcada como leer provoca que se obtenga un dato del exterior.
1
2
3
4
5
Leer primer sumando a
Leer segundo sumando b
Hallar la suma de los sumandos c = a + b
Escribir c
Fin
Tabla 5.1: Programa para sumar dos números y escribir el resultado.
La figura 5.3 muestra el diagrama de flujo correspondiente a dicha tarea. Conviene observar
que para asignar su valor a la variable C se ha usado la notación C ← A + B, que significa
introducir en C el valor A+B; esto no debe inducir a pensar que C = A + B en el sentido
matemático dado usualmente a tales ecuaciones. La interpretación correcta es que la variable
C toma en ese instante el valor corrrespondiente a la suma A + B, pudiendo posteriormente
cambiar este valor por otro.
Un ejemplo más complejo es el correspondiente a un programa que tiene que averiguar si
un número entero positivo dado es primo o no. El algoritmo consiste en dividir por todos los
enteros menores que el número y ver si en algún caso el resto vale cero. El pseudocódigo puede
expresarse en la forma indicada por la tabla 5.2
En la figura 5.4 se muestra el diagrama de flujo del programa anterior. Se ha de notar que el
cálculo del resultado se ha detallado en un módulo aparte; de este modo resultan dos diagramas
52
TEMA 5. RESOLUCIÓN DE PROBLEMAS
inicio
leer dato A
leer dato B
calcular
C
A+B
escribir C
fin
Figura 5.3: Diagrama de flujo de un programa para sumar dos números.
1
2
3
4
5
6
Leer número x
Iniciar resultado al valor CIERTO
Iniciar divisor a 2
Hacer:
4.1 Dividir x entre divisor
4.2 Si el resto es cero, hacer resultado igual a
FALSO
4.3 Incrementar divisor una unidad
4.4 Si el divisor es igual a x ir a 5, sino ir a 4
Escribir resultado
Fin
Tabla 5.2: Programa para hallar si un número es primo.
separados. El objetivo de la separación es mejorar la legibilidad del conjunto. En efecto, de un
golpe de vista se puede, a partir del diagrama de la izquierda, reconocer el problema al que se
da solución, mientras que el diagrama de la derecha explica en detalle el proceso seguido.
5.4
Programación estructurada
Es difı́cil hacer un resumen de las ideas de la programación estructurada a lectores que no tienen
cierta experiencia en programación. Esto sucede porque la programación estructurada pretende
evitar cierto tipo de situaciones que aparecen en programas grandes y medianos, pero que no
se advierten en los ejemplos dados a principiantes. Una de estas situaciones es la siguiente: un
programador escribe un diagrama de flujo tal y como aparece en la parte derecha de la figura 5.5.
Transcurrido cierto tiempo, el mismo programador es requerido para realizar una modificación
en el mismo. Éste intenta modificar el diagrama, pero la tarea le resulta ardua. Analizando los
motivos por los que el trabajo no avanza con rapidez se puede observar que:
53
c M.R. Arahal 2003 DISA. ESI. US.
°
inicio cálculo
inicio programa
resultado
divisor
leer x
calcular resultado
(ser x primo)
SI
2
hallar resto de
dividir x por divisor
escribir
resultado
es resto = 0 ?
SI
fin programa
NO
resultado = NO
Incrementar
divisor
NO
divisor = x ?
SI
fin cálculo
Figura 5.4: Diagrama de flujo de un programa que comprueba si el número dado es primo.
Figura 5.5: Diagrama de flujo estructurado (izquierda) y no estructurado (derecha).
54
TEMA 5. RESOLUCIÓN DE PROBLEMAS
• Es difı́cil hallar el punto en el cual hay que eliminar un bloque o insertar uno nuevo, pues
todo está enmarañado.
• Incluso aunque el diagrama tuviera una mejor disposición gráfica, cuesta trabajo ver si
una modificación de una parte dará resultados indeseables en otra, debido al gran número
de interconexiones que hay.
Y los problemas no acaban ahı́. Tras realizar los cambios, el programador deberá probar el
nuevo programa para comprobar su correcto funcionamiento. Cada vez que se detecte un error
deberá volver a repetir el tedioso proceso de modificación. Los problemas descritos no serı́an
tales si el programador hubiera podido escribir el diagrama de flujo de forma parecida a la de
la figura 5.5 (izquierda), en la que se aprecia que no existen cruces de lı́neas y que cada módulo
tiene una entrada y una salida. Sobre estos dos aspectos se insistirá más adelante, por ahora no
es necesario comentar más las ventajas que para cualquier proyecto supone el tener programas
legibles y comprensibles.
5.4.1
Flujo lineal
Los diagramas se dice que tienen flujo lineal cuando no existen conexiones de vuelta atrás o
laterales. El flujo lineal se puede conseguir restringiendo los bloques constructivos a formatos de
entrada única y salida única. Es decir, usando para la confección del diagrama de flujo bloques
a los cuales llega sólo una flecha y de los cuales parte sólo una flecha. La secuencia, la selección
entre alternativas y la iteración forman un conjunto suficiente de módulos constructivos para
describir cualquier algoritmo. Es decir, es posible siempre realizar un diagrama de flujo que
contiene sólo los bloques citados. En la figura 5.6 se tienen tales bloques; se puede ver que son
de entrada única y salida única.
módulo 1
NO
¿
condición
?
SI
cuerpo del bucle
opción 2
condición
?
¿
módulo 2
secuencia
opción 1
bifurcación
bucle
Figura 5.6: Bloques constructivos para programas estructurados.
En lo sucesivo se usarán estos bloques para realizar los diagramas de flujo, pero antes de
pasar a los ejemplos es preciso comentar cómo se va a producir la descomposición del problema
global en los módulos presentados.
5.4.2
Análisis descendente
En ocasiones se presenta la programación estructurada como un conjunto de reglas a seguir. En
realidad no hay una definición exacta de programación estructurada, por lo que las reglas son
55
c M.R. Arahal 2003 DISA. ESI. US.
°
sólo una aproximación. Una idea importante de la programación estructurada es el an álisis descendente o jerarquizado. Consiste éste en identificar las funciones a cumplir por el programa
a nivel global y proceder luego a descomponer estas funciones en otras menores. Éstas a su vez
se vuelven a descomponer en un proceso que termina cuando se alcanza el nivel del lenguaje o
código usado. De este modo, el diseño del programa se realiza por niveles. Se comienza por el
nivel más general y se termina por lo particular o concreto. Antes de pasar al siguiente nivel se
debe comprobar la validez formal de la solución actual.
inicio leer
inicio
inicio calculo
leer datos
fin leer
calcular resultado
escribir
resultado
inicio escribir
fin calculo
fin
fin escribir
Figura 5.7: El análisis descendente aplicado a la confección de diagramas de flujo.
Al confeccionar el diagrama de flujo de un programa o módulo se ha de usar el análisis
descendente. El resultado es un conjunto de diagramas que describen el programa con un nivel
de detalle creciente. En un primer nivel el diagrama de flujo de cualquier programa puede tomar
la forma dada en la figura 5.7. En un segundo nivel, cada uno de los módulos se detalla en un
diagrama aparte. El proceso continua mientras existan bloques que necesiten explicaciones
adicionales. Ésta ha sido la técnica usada en el ejemplo del programa que comprueba si un
número es primo (ver figura 5.4).
56
TEMA 5. RESOLUCIÓN DE PROBLEMAS
Tema 6
Desarrollo de algoritmos básicos
Antes de comenzar a programar es preciso saber desarrollar algoritmos. Como se ha visto en
el tema anterior, un algoritmo es una descripción detallada de los pasos a seguir para resolver
una tarea. Los pasos han de ser operaciones capaces de ser llevadas a cabo por el operador al
cual va dirigido el algoritmo. En este tema se va a suponer que el operador es una persona con
conocimientos matemáticos suficientes como para saber realizar:
• Operaciones aritméticas (suma, multiplicación, etc.)
• Operaciones lógicas (comparación, producto lógico, comprobación de igualdad, etc.)
• Asignación de valores a variables
• Lectura y escritura de valores
• Acceso a vectores y matrices mediante subı́ndices
Por tanto los algoritmos estarán escritos usando estas operaciones elementales, y no otras.
6.1
Cálculos en secuencia
Los cálculos en secuencia no presentan dificultad alguna desde el punto de vista algorı́tmico.
Los diagramas de flujo resultantes son lineales, sin bifurcaciones o bucles, y por tanto de fácil
creación.
Un programa evoluciona de modo lineal cuando realiza toda la secuencia de instrucciones de
forma continua, sin saltos en la ejecución. Este es el caso presentado en el ejemplo de la suma
de dos números (ver figura 6.1). La realización y representación en diagrama de flujo de estos
programas no conlleva ninguna dificultad.
Como ejemplos se propone realizar el diagrama de flujo de algoritmos que resuelvan las tareas
siguientes:
57
58
TEMA 6. DESARROLLO DE ALGORITMOS BÁSICOS
inicio
leer dato A
leer dato B
calcular
C
A+B
escribir C
fin
Figura 6.1: Diagrama de flujo de un programa para sumar dos números.
• Leer dos valores del teclado y escribir media aritmética.
• Leer los coeficientes de una ecuación de segundo grado de la forma x 2 + bx + c = 0 y
escribir las soluciones.
• Leer los coeficientes de un polinomio de grado tres de la forma P (x) = x 3 + ax2 + bx + c.
Leer a continuación un cierto valor para la variable independiente x y escribir P (x).
6.2
Bifurcaciones
Las bifurcaciones permiten tomar un camino o su alternativa. Como es sabido, dentro de un
bloque bifurcación puede situarse otro, creando de este modo bifurcaciones anidadas.
Las bifurcaciones permiten que el programa discurra por un camino o su alternativa en
función de condiciones. Un ejemplo muy simple es el siguiente: leer un número por teclado y
escribir el valor absoluto del mismo. Una forma de resolver el programa es mediante el diagrama
de flujo de la figura 6.2. La idea es hacer que la secuencia de ejecución pase por la escritura del
número o del número cambiado de signo en función de que sea positivo o negativo.
Las bifurcaciones se pueden encadenar para dar solución a situaciones más complejas. Por
ejemplo considérese la función: N C(x, y), con (x, y) ∈ IR2 7→ c ∈ {1, 2, 3, 4}. Esta función devuelve el número de cuadrante en que se encuentra el punto (x, y) de IR2 . El diagrama de la
figura 6.3 presenta una posible solución mediante el uso de bifurcaciones en cascada.
Desarrolle los diagramas de flujo que resuelven los problemas siguientes:
• Leer un número real x y calcular y escribir su valor absoluto (sin usar vabs).
59
c M.R. Arahal 2003 DISA. ESI. US.
°
inicio programa
leer x
¿
es x > 0
SI
?
escribir x
NO
escribir -x
fin programa
Figura 6.2: Diagrama de flujo con ruptura de secuencia.
inicio programa
leer x e y
¿
SI
es x > 0
NO
?
¿
¿
SI
NO
SI
es y > 0
?
Escribir 1
NO
es y > 0
?
Escribir 4
Escribir 2
Escribir 3
fin programa
Figura 6.3: Programa que escribe el cuadrante en el cual se sitúa el punto del plano dado por
(x, y).
60
TEMA 6. DESARROLLO DE ALGORITMOS BÁSICOS
• Leer las componentes de un vector de IR2 (x e y). Escribir el número del cuadrante en que
se halla. Suponga que ninguna componente es nula.
• Leer un número del teclado. Si está en el intervalo (2, 8] escribir en la pantalla un uno, en
caso contrario escribir un cero.
• Leer un valor x del teclado y escribir el valor f (x) siendo f una función definida a trozos
del siguiente modo:
x
x ∈ [−1, 3)
x > 50
resto
6.3
f (x)
10 − x
1
0
Bucles simples
Muchos algoritmos requieren la repetición de operaciones cierto número de veces. Al conjunto
de operaciones que se repite se le llama cuerpo del bucle. El bucle queda completamente definido
por el cuerpo y la condición de parada o salida. Cada vez que el programa en ejecución pasa
por el cuerpo del bucle se dice que ha realizado una iteración.
El bloque constructivo que se ha denominado iteración permite plasmar en diagramas de
flujo este tipo de procesos. La bifurcación al final del bloque hace las veces de control de salida.
En ocasiones es conveniente poner el control de salida en la cabeza del bucle, como se indica en
la figura 6.4. De este modo se puede salir del bucle sin haber realizado ninguna operación.
¿
condición
?
cuerpo del bucle
Figura 6.4: Bucle con control de salida en cabeza.
A modo de ejemplo considérese la tarea de construir un vector v de dimensión N de forma
que la componente i−ésima tenga el valor vi = i2 − 4. Una posible solución viene expresada por
el pseudocódigo siguiente de la tabla 6.1.
Los siguientes ejercicios se pueden resolver con ayuda de bucles.
• Leer n (suponiendo que es entero y positivo) y escribir el factorial n!.
• Leer las 10 componentes de un vector de dimensión 10. Escribirlo luego en la pantalla.
• Leer N (suponer que es un entero mayor que uno). Leer a continuación las N componentes
de un vector de dimensión N. Escribir luego el vector.
61
c M.R. Arahal 2003 DISA. ESI. US.
°
inicio programa
leer dimensión N
1
2
3
4
5
6
7
i
Leer dimensión N
Iniciar ı́ndice i ← 1
Si i > N , ir a 6
v i ← i2 − 4
i←i+1
ir a 4
Fin
v
2
i -4
i
i
NO
1
i+1
¿
i>N
?
SI
fin programa
Tabla 6.1: Ejemplo de algoritmo con un bucle simple.
• Leer las 5 componentes de un vector y escribirlo luego al revés.
• Leer n (que se supone es entero y mayor que uno), construir un vector v ∈ IR n×1 , tal que
el elemento k−ésimo sea vk = k 2 − 3 para k = 1, ..., n.
• Leer N y un vector de dimensión N. Calcular y escribir la componente de mayor valor (no
usar la función de MATLAB max).
• Leer N y un vector de dimensión N. Calcular y escribir la componente de mayor valor y
su ı́ndice dentro del vector. (no usar max).
• Leer v ∈ IRn×1 , hallar y escribir m = v t v, m ∈ IR
• Leer del teclado un número indeterminado de alturas. Dejar de leer cuando se haya
introducido una altura negativa. Escribir la media de las alturas válidas (las no negativas).
• Escribir en pantalla los números del 90 al 100 y los caracteres de la tabla ASCII cuyos
códigos son tales números.
• Hallar el máximo común divisor de dos números enteros positivos a y b dados.
6.4
Bucles anidados
Dentro de un bucle pueden aparecer operaciones diversas, en particular puede haber otro bucle.
En tal caso se dice que los bucles están anidados. En cada iteración del bucle externo se realiza
el bucle interno un cierto número de veces hasta que se produzca la condición de salida del
mismo. Este es el caso cuando se trabaja con matrices. En la figura 6.5 se presenta un diagrama
de flujo que puede utilizarse para recorrer la matriz. Se ha supuesto que la matriz tiene M filas
y N columnas. Obsérvese que cada fila (ı́ndice K) se recorre variando el ı́ndice de columnas J
desde 1 a N en el bucle interior. El bucle exterior permite variar K de 1 a M .
62
TEMA 6. DESARROLLO DE ALGORITMOS BÁSICOS
iniciar índice de
filas K a 1
iniciar índice de
columnas J a 1
Operar con el
elemento a KJ
Incrementar J
no
¿ J > N ?
sí
Incrementar K
no
¿ K > M ?
sí
Figura 6.5: Bucles anidados para trabajar con una matriz.
63
c M.R. Arahal 2003 DISA. ESI. US.
°
Los ejercicios que se proponen a continuación se pueden resolver con un par de bucles anidados.
• Lectura de una matriz m × n. Se han de leer del teclado las dimensiones m y n (suponga
que son números enteros positivos). A continuación se han de leer los elementos a kj de
una matriz A de m filas y n columnas. Finalmente se presentará en la pantalla la matriz
leı́da.
• Construir una matriz A m × n cuyo elemento genérico akj viene dado por akj = k 2 − j
• Dada una matriz A de dimensiones m × n, se quiere anular (poner a cero) los elementos
de su diagonal principal y escribir la matriz resultante.
• Suma de matrices. Dadas dos matrices A ∈ IRm×n y B ∈ IRm×n se quiere calcular y
escribir la matriz C obtenida como suma de las anteriores C = A + B. (realice la suma
elemento a elemento, sin utilizar la suma matricial que ofrece MATLAB).
• Matriz traspuesta. Dada una matriz A ∈ IRm×n calcular su traspuesta B = At (ha de
hacerse mediante bucles, sin usar la apóstrofe de MATLAB).
• Submatriz triangular. Dada una matriz A ∈ IRm×n se desea mostrar en pantalla los
elementos de su submatriz triangular inferior. Es decir, deben aparecer en la pantalla sólo
los elementos de A que están por debajo de la diagonal principal. Se supone que tanto m
como n son números mayores que uno.
• Algoritmo para obtener la multiplicación de A ∈ IRm×n por B ∈ IRn×p dadas A y B.
6.5
Otros procesos iterativos
6.5.1
Sucesiones y series
• Se quiere construir y escribir un vector v de dimensión n cuyas componentes siguen la ley
vk = 3 ∗ vk−1 − k. Tanto n como v1 son cantidades que han de leerse del teclado.
• Dado un número x mayor que uno se ha de determinar si es primo. Para ello ha de
comprobar si x es divisible por algún entero en el intervalo (1, x).
P
• Se desea calcular la suma nk=1 1/ak siendo los valores ak los elementos de la sucesión
dada por ak = ak−1 + ak−2 con a1 = 1 y a2 = 1. El lı́mite n ha de leerse del teclado y se
supone mayor que dos.
6.5.2
Ordenaciones
• Dado un vector v de dimensión n cuyas componentes son todas positivas o cero se desea
reordenar sus componentes de mayor a menor. Por ejemplo, si
v = [2 3 8 5 4]
el resultado ha de ser un nuevo vector:
w = [8 5 4 3 2]
64
TEMA 6. DESARROLLO DE ALGORITMOS BÁSICOS
• Repetir el ejercicio anterior pero sin usar un vector auxiliar como w. El resultado que se
pretende conseguir es que el propio vector v tenga sus componentes ordenadas.
• Igual que el anterior pero suponiendo que v contiene cantidades positivas y negativas, por
ejemplo:
v = [−7 3 8 − 9 5 4 0 − 1]
ha de dar como resultado el propio vector reordenado ası́:
v = [8 5 4 3 0 − 1 − 7 − 9]
• Un fabricante de automóviles dispone de un modelo de vehı́culo en cinco colores. Para
saber la aceptación de cada color realiza una encuesta usando un programa en su ordenador
portátil. El programa ha de ayudarle a contar los votos de los encuestados. El encuestador
tecleará el número del color elegido (de uno a cinco) cada vez que pregunte a una persona
nueva. Cuando no quiera preguntar a nadie más introducirá el valor -1. En ese momento
el programa le indicará el número de votos que cada color ha obtenido. Posteriormente se
han de ordenar los colores según los resultados de la votación.
6.5.3
Cálculos
• Dada una cantidad positiva N calcular la raı́z cuadrada entera aproximada r. Se ha de
cumplir que
r · r ≤ N ≤ (r + 1) · (r + 1)
.
Por ejemplo, si N = 24 se tiene que r = 4 pues 4 · 4 = 16 < 24 < 25 = 5 · 5
• Se han medido las longitudes de tornillos procedentes de un mismo lote de fabricación. Se
han dispuesto en un vector v de dimensión N > 2. Diseñe un algoritmo para calcular la
media y la varianza de las longitudes.
Tema 7
Programación en MATLAB
MATLAB es una aplicación informática que surgió para servir de herramienta en operaciones
matemáticas, especialmente en operaciones con matrices.
Con los años ha ido incorporando funciones distintas y hoy en dı́a contiene herramientas
para gran cantidad de aplicaciones ingenieriles: visión artificial, análisis estadı́stico, diseño de
controladores, etc.
El usuario de MATLAB suele ser una persona que necesita algo más que una calculadora
pero que no quiere ”mancharse las manos” con un lenguaje de programación. Por eso el entorno de trabajo es sencillo de manejar, casi tan fácil como una calculadora. Además permite
crear gráficos de muchos tipos y presenta grandes ventajas a la hora de trabajar con números
complejos.
Una incorporación temprana fue la programación. Es posible crear nuevas funciones de
MATLAB mediante un lenguaje que es muy parecido a lenguajes de programación como BASIC
o C. Esto permite que el usuario pueda agrupar sentencias que utiliza frecuentemente dentro
de un programa que puede ser invocado posteriormente. De este modo se ahorra tiempo y
esfuerzo en sucesivas sesiones pues no es necesario escribir todas las sentencias de nuevo como
se mostrará.
Pero no todo son ventajas. Como principal inconveniente hay que señalar el hecho de que
MATLAB no ha sido concebido como lenguaje de programación por lo que carece de elementos
o caracterı́sticas necesarias para una buena práctica de la programación.
7.1
El entorno
El programa MATLAB se maneja (en su mayor parte) escribiendo sentencias dentro de una
ventana llamada de órdenes. Por ejemplo, si se escribe
sqrt(16)
65
66
TEMA 7. PROGRAMACIÓN EN MATLAB
el programa realiza la operación indicada y responde en la pantalla con el resultad.
Desafortunadamente todo está en inglés. Se proporcionará una lista de órdenes y funciones
debidamente traducida.
7.2
7.2.1
Variables
Tipos
En MATLAB todas las variables son matrices. Un escalar no es más que una matriz 1 × 1.
Además, cada elemento se considera que es un número complejo a + bi siendo i =
Cuando se trabaja con números reales MATLAB considera simplemente que b = 0.
√
−1.
Finalmente, todos los números son tratados en formato de punto flotante. Esto quiere decir
que son números con parte entera, parte decimal y un exponente (véase tema 2).
Estas caracterı́sticas hacen que MATLAB desperdicie memoria con respecto a otros lenguajes
en los cuales las variables pueden ser de otros tipos más pequeños.
A pesar de que MATLAB trata a todas las variables del mismo modo se va a continuar con la
sana costumbre de indicar en los diagramas de flujo y en los comentarios el tipo de las variables.
De este modo se facilita la detección de errores.
7.2.2
Creación y destrucción
Las variables pueden crearse en cualquier momento. Para ello basta con asignarles un valor en
la forma que veremos.
Hay que tener en cuenta que las variables ocupan un espacio en la memoria. Cada vez
que se crea una nueva variable el programa MATLAB pide al SE un trozo más de la memoria
disponible. A partir de ese momento el trozo en cuestión no puede ser usado para otros fines.
Si se quiere liberar el espacio ocupado por una variable se ha de utilizar la orden clear,
por ejemplo clear k o clear matriz a. Esto causa la destrucción completa de la variable y
la liberación del trozo de memoria ocupado por la misma. Una vez que una variable ha sido
eliminada no es posible recuperar su valor.
7.2.3
Asignación
La asignación se consigue por medio del signo igual =. No hay que olvidar que asignar es una
operación consistente en copiar un cierto valor en la memoria ocupada por una variable. Por
c M.R. Arahal 2003 DISA. ESI. US.
°
67
tanto no es lo mismo asignar que igualar en el sentido matemático. Lamentablemente el uso del
signo = en ambos casos no ayuda nada a clarificar la cuestión.
Debido a que la asignación es una operación distinta de la igualdad matemática se ha insistido
en temas anteriores en que se utilice un signo diferente ←. En los diagramas de flujo que vendrán
en adelante se mantendrá el uso del sı́mbolo ← para la asignación.
7.3
Operaciones y funciones incorporadas
La mejor manera de aprender a realizar operaciones con MATLAB es probar el programa con
ejemplos simples y explorar su comportamiento. En este punto se van a mostrar ejemplos en
varias categorı́as de dificultad creciente. Es muy aconsejable no estudiar de memoria los ejemplos
sino probarlos en el entorno MATLAB.
7.3.1
Operaciones elementales
La forma más simple de usar MATLAB es como una calculadora. En lugar de pulsar teclas se
ha de escribir la operación a realizar y pulsar Intro para que ésta se lleve a cabo.
Por ejemplo si se escribe
6+8
y se pulsa Intro se obtiene en la pantalla:
>> 6+8
ans =
14
>>
Como ya se ha dicho, el sı́mbolo >> sirve para indicar al usuario que puede escribir ahı́ su
orden. A menudo recibe el nombre de sı́mbolo inductor pues induce al usuario a escribir.
Puede verse que el resultado viene precedido de ans=. Estas letras son la abreviatura de
answer (respuesta, resultado).
El programa MATLAB admite operaciones con paréntesis, como por ejemplo 2 · (5 + 3).
68
TEMA 7. PROGRAMACIÓN EN MATLAB
>> 2*(5+3)
ans =
16
>>
Nótese que la multiplicación se indica por medio del asterisco *. También es posible realizar
operaciones menos elementales, como por ejemplo logaritmos en base 10
>> log10(100)
ans =
2
>>
o raı́ces cuadradas
>> sqrt(36)
ans =
6
Si uno desea dar nombres simbólicos a los números que ha de manejar debe crear variables.
Para ello basta con asignar un valor mediante una expresión del tipo:
nombre_de_la_variable = valor_que_se_asigna
por ejemplo:
x=22.3
el programa responde con un mensaje que indica que se ha creado la variable y que ha
tomado el valor adecuado
c M.R. Arahal 2003 DISA. ESI. US.
°
69
>> x=22.3
x =
22.3000
>>
Es importante saber que estas expresiones hacen dos cosas: crear la variable (tomando cierta
cantidad de memoria para almacenar su valor) y dar un valor inicial a la variable.
Esta facilidad para crear variables conlleva algunos peligros que trataremos de minimizar
mediante una programación cuidadosa.
Las variables pueden usarse en otras expresiones como si se tratase de números, por ejemplo:
>> x+10
ans =
32.3000
>>
Para saber el valor que contiene una variable basta con escribir su nombre y pulsar Intro.
>> x
x =
22.3000
>>
Si uno desea conocer cuántas variables tiene en un momento dado puede usar la orden who.
En el ejemplo anterior se obtiene:
>> who
Your variables are:
ans
>>
x
70
TEMA 7. PROGRAMACIÓN EN MATLAB
Observe que ans (la respuesta) es una variable. Puede comprobar que su valor coincide con
el de la última respuesta dada por MATLAB.
Además de las operaciones aritméticas de sobra conocidas existen operaciones lógicas, como
por ejemplo la comprobación de igualdad. Considere el ejemplo siguiente consistente en una
expresión de comprobación de igualdad:
>> x==7
ans =
0
>>
La expresión x == 7 equivale a preguntar ¿Es el valor de x igual a 7?. La respuesta obtenida
es cero, lo cual indica que x no es igual a 7. De forma equivalente la sentencia x == 22.3 produce
un valor 1 al ser evaluada.
>> x==22.3
ans =
1
>>
De estos ejemplos se desprende que las comprobaciones que el valor lógico verdadero es
representado en MATLAB mediante el valor numérico ”1”, mientras que el valor lógico falso es
representado por ”0”.
Otras operaciones lógicas son ”mayor que” >, ”menor que” <, ”mayor o igual que” >= ,
”menor o igual que” <=, ”distinto a” ∼=. A modo de ejemplo considere las expresiones siguientes
y las respuestas proporcionadas por MATLAB.
>> x<10
ans =
0
>> x>=22.3
ans =
c M.R. Arahal 2003 DISA. ESI. US.
°
71
1
>> x ~= 8
ans =
1
>>
En la tabla siguiente se muestran las operaciones aritméticas y lógicas que MATLAB puede
realizar.
>> help elfun
Las operaciones que dan como resultado un valor lógico se pueden combinar utilizando la
suma lógica (operación ”o”), el producto lógico (operación ”y”) y la negación (operación ”no”).
Por ejemplo, para saber si x < 100 y al mismo tiempo x > 5; es decir, para comprobar si
5 < x < 100 se usará la expresión x<100 & x > 5
>> x<100 & x>5
ans =
1
>>
Como era de esperar el resultado es 1. Eso quiere decir que es cierto que ”x es menor que
100 y mayor que 5”.
Las operaciones que se han comentado se indican en la tabla siguiente de forma más resumida.
72
TEMA 7. PROGRAMACIÓN EN MATLAB
Expresión en MATLAB
+
*
/
<
>
<=
>=
==
=
&
|
∼
Operación
suma aritmética
resta aritmética o cambio de signo
multiplicación aritmética
división
relación "menor que"
relación "mayor que"
relación "menor o igual que"
relación "mayor o igual que"
relación "igual que"
relación "distinto que"
producto lógico (operación "y")
suma lógica (operación "o")
negación (operación "no")
No es preciso aprender ahora mismo de memoria esta tabla. El uso frecuente deberı́a bastar
para aprenderla por lo que se recomienda que se practiquen los ejemplos indicados y se exploren
las posibilidades que ofrecen.
7.3.2
Funciones incorporadas
De todas las órdenes de MATLAB ninguna debiera ser más útil para el usuario aprendiz que la
función de ayuda. Se comentará más adelante como usar la función help, de momento se va a
usar ahora para conocer la lista de funciones ”elementales”.
>> help elfun
El resultado de esta orden es una larga lista de funciones que se muestra en la tabla 7.1 (que
está en inglés como puede verse por lo que habrá que acostumbrarse).
La forma de uso de estas funciones es simple e intuitiva, por ejemplo a = sin(1) asigna a
la variable a el valor del seno de un radián, o sea sen(1).
>> a = sin(1)
a =
0.8415
7.3.3
Vectores
Los vectores se introducen en MATLAB como una colección de valores. Por ejemplo un vector
fila es
73
c M.R. Arahal 2003 DISA. ESI. US.
°
Trigonometric.
sin
sinh
asin
asinh
cos
cosh
acos
acosh
tan
tanh
atan
atan2
atanh
sec
sech
asec
asech
csc
csch
acsc
acsch
cot
coth
acot
acoth
Exponential.
exp
log
log10
log2
Sine.
Hyperbolic sine.
Inverse sine.
Inverse hyperbolic sine.
Cosine.
Hyperbolic cosine.
Inverse cosine.
Inverse hyperbolic cosine.
Tangent.
Hyperbolic tangent.
Inverse tangent.
Four quadrant inverse
tangent.
Inverse hyperbolic tangent.
Secant.
Hyperbolic secant.
Inverse secant.
Inverse hyperbolic secant.
Cosecant.
Hyperbolic cosecant.
Inverse cosecant.
Inverse hyperbolic cosecant.
Cotangent.
Hyperbolic cotangent.
Inverse cotangent.
Inverse hyperbolic cotangent.
Exponential.
Natural logarithm.
Common (base 10) logarithm.
Base 2 logarithm and dissect floating point number.
pow2
realpow
reallog
realsqrt
sqrt
nextpow2
Complex.
abs
angle
complex
conj
imag
real
unwrap
isreal
cplxpair
Rounding and
remainder.
fix
floor
ceil
round
mod
rem
sign
Base 2 power and scale
floating point number.
Power that will error out
on complex result.
Natural logarithm of real
number.
Square root of number
greater than or equal to
zero.
Square root.
Next higher power of 2.
Absolute value.
Phase angle.
Construct complex data
from real and imaginary
parts.
Complex conjugate.
Complex imaginary part.
Complex real part.
Unwrap phase angle.
True for real array.
Sort numbers into complex conjugate pairs.
Round towards zero.
Round towards minus infinity.
Round towards plus infinity.
Round towards nearest
integer.
Modulus (signed remainder after division).
Remainder after division.
Signum.
Tabla 7.1: Funciones elementales de MATLAB
74
TEMA 7. PROGRAMACIÓN EN MATLAB
>> v=[ -1 2 -3 4 -5]
v =
-1
2
-3
4
-5
>>
Para acceder a las componentes individuales del vector se usan paréntesis indicando el ı́ndice
de la componente como se muestra en las dos sentencias del ejemplo siguiente.
>> v(3)
ans =
-3
>> v(1)*8
ans =
-8
Es decir que en MATLAB la expresión v(k) equivale a la notación matemática v k .
También se pueden construir vectores columna. Para ello se separan las filas mediante punto
y coma como se muestra a continuación
>> u=[0; 1; 0; 1; 0]
u =
0
1
0
1
0
En el ejemplo siguiente se ilustra que el producto escalar de dos vectores se obtiene fácilmente.
>> v*u
ans =
6
75
c M.R. Arahal 2003 DISA. ESI. US.
°
Los vectores son tratados por MATLAB como matrices con la peculiaridad de tener una sola
fila o columna. Por este motivo no merece la pena dedicar más espacio a los vectores y debemos
pasar ya a las matrices.
7.3.4
Matrices
En MATLAB una matriz es una variable como otra cualquiera y no precisa mecanismos complicados para su creación y uso. A modo de ilustración considere que pretendemos sumar las dos
matrices:
A=
µ
0 2 4
1 1 1
¶
,B =
µ
3
3
3
−1 −1 −1
¶
El primer paso es introducir las matrices en variables. Comenzando con la matriz A escribimos la sentencia
A = [ 0 2 4; 1 1 1]
en la pantalla se obtiene:
>> A = [ 0 2 4; 1 1 1]
A =
0
1
2
1
4
1
>>
Como puede verse, los elementos de una misma fila se separan por espacios (o comas) y una
fila se separa de la siguiente mediante el punto y coma.
Se procede del mismo modo con la matriz B, obteniéndose:
>> B = [ 3 3 3; -1 -1 -1]
B =
3
-1
3
-1
3
-1
76
TEMA 7. PROGRAMACIÓN EN MATLAB
Para realizar la suma se procede igual que si A y B fuesen variables escalares; es decir, se
escribe A+B
>> A+B
ans =
3
0
5
0
7
0
Con la misma facilidad se calcula el producto de matrices o funciones de matrices. Por
ejemplo, para calcular el valor absoluto de los elementos de la matriz B se escribe:
>> abs(B)
ans =
3
1
3
1
3
1
Como puede observarse el resultado es una nueva matriz cuyos elementos son el valor absoluto
de los elementos de la matriz B.
7.3.5
Cadenas de caracteres
Las cadenas de caracteres son conjuntos de sı́mbolos tomados de la tabla ASCII. Tienen gran
utilidad para trabajar en problemas donde se precisa manipulación de texto.
Un ejemplo de cadena de caracteres es: clase de 3 a 5 atrasada!!. Este conjunto de
caracteres incluye letras, números y signos como el espacio o la admiración. Es posible introducir
la cadena en una variable de MATLAB:
>> texto = ’clase de 3 a 5 atrasada!!’
texto =
clase de 3 a 5 atrasada!!
Obsérvese que el conjunto de sı́mbolos ha de ir encerrado por dos apóstrofes. Son las
apóstrofes las que diferencian una sentencia como a=barco de a=’barco’. Vea en el ejemplo el
efecto de cada una de ellas.
c M.R. Arahal 2003 DISA. ESI. US.
°
77
>> a=barco
??? Undefined function or variable ’barco’.
>> a=’barco’
a =
barco
En el primer caso MATLAB muestra en la pantalla un mensaje de error pues ha interpretado
a=barco como una asignación en la cual el término de la derecha (la variable barco) no existe.
En cambio, en la segunda expresión, ’barco’ es un valor definido que se asigna a la variable a
por lo que la expresión es tan correcta como hubiera sido x = 8.
Las cadenas de caracteres no sirven para cálculos matemáticos propiamente dichos y fueron
introducidas en MATLAB para facilitar la programación, el depurado y el uso de programas.
No obstante proporcionan interesantes posibilidades para desarrollar algoritmos y practicar el
arte de programar.
7.3.6
Funciones para el manejo de datos
Puesto que MATLAB está pensado para ser usado de forma interactiva es frecuente que el
usuario necesite saber qué variables ha creado, cuáles son sus caracterı́sticas, cuánto espacio
ocupan, etc. Para ello se dispone de ciertas funciones que se van a explicar a continuación.
Informes . Se ha comentado anteriormente que la orden who proporciona una lista de variables.
Vea como ejemplo la secuencia de órdenes y respuestas siguiente:
>> x=8
x =
8
>> y=x+2
y =
10
>> who
Your variables are:
x y
Existe una modalidad que proporciona los tamaños de las variables y que es de utilidad
cuando se trabaja con matrices. La orden es whos como puede verse en el ejemplo.
>> A=[1 2 3; 3 4 6]
78
TEMA 7. PROGRAMACIÓN EN MATLAB
A =
1
3
2
4
>> whos
Name
3
6
Size
A
x
y
Bytes
2x3
1x1
1x1
48
8
8
Class
double array
double array
double array
Grand total is 8 elements using 64 bytes
Dimensiones A veces es necesario conocer el tamaño o dimensiones de una única variable,
por ejemplo para saber el número de filas de una matriz y disponer de este número para
posteriores cálculos. Para estos casos se puede usar la función size.
>> size(A)
ans =
2
3
En el caso de manejar vectores resulta más conveniente la función length que proporciona
el número de elementos.
>> v=[ -1 2 -3 4 -5]
v =
-1
2
-3
4
-5
>> length(v)
ans =
5
Almacenamiento MATLAB permite almacenar en el disco variables. De este modo es posible
parar una sesión de trabajo y continuar en otro momento sin volver a repetir cálculos. La
orden más simple para guardar es save que puede usarse de varias maneras. En la tabla
siguiente se presenta un resumen.
Orden
save
save nombrearchivo
save nombrearchivo x y z
Operación realizada
Crea el archivo de nombre matlab.mat en la carpeta
actual. Dicho archivo contiene todas las variables que
existen en ese momento en el entorno MATLAB.
Crea el archivo de nombre nombrearchivo.mat en la
carpeta actual. Dicho archivo contiene todas las variables que existen en ese momento en el entorno MATLAB.
Crea el archivo de nombre nombrearchivo.mat en la
carpeta actual. Dicho archivo contiene únicamente las
variables x, y y z.
79
c M.R. Arahal 2003 DISA. ESI. US.
°
Recuperación Las variables almacenadas en el disco pueden ser usadas en una sesión diferente.
Para ello es preciso que MATLAB las lea del disco mediante la orden load. En la tabla
siguiente se muestran tres posibilidades.
Orden
load
save nombrearchivo
save nombrearchivo x y z
Operación realizada
Lee todas las variables del archivo de nombre matlab.mat de la carpeta actual. Si alguna de las variables del disco tiene nombre coincidente con otra que
previamente existe en MATLAB se producirá la destrucción de la variable existente para dejar su sitio a
la variable del disco.
Igual que en el caso anterior, pero leyendo del archivo
nombrearchivo de la carpeta actual.
Igual que el anterior pero leyendo únicamente las variables x, y y z.
Resulta útil la orden what pues muestra los archivos que existen en la carpeta actual y
que contienen variables o programas utilizables por MATLAB.
7.4
Codificación de nuevos programas
Una de las caracterı́sticas del entorno MATLAB es que permite que las órdenes puedan ser
tomadas de un archivo en lugar de ser introducidas por el teclado.
La idea es simple: si el usuario va a repetir a menudo un conjunto de órdenes puede escribirlas
en un archivo de texto. Posteriormente le indica a MATLAB que lea dicho archivo ejecutando
las órdenes una por una. El efecto es el mismo que si el usuario hubiese escrito las órdenes en
el entorno de MATLAB. Ahora bien, puesto que el archivo de texto se puede guardar en disco
no es preciso volver a escribir las órdenes nunca más. Cada vez que el usuario desee ejecutar
de nuevo el conjunto de órdenes podrá indicar nuevamente a MATLAB que lea el archivo. Esto
supone un gran ahorro de tiempo en muchos casos.
Es costumbre dar a los archivos que contienen órdenes de MATLAB una extensión predeterminada que los diferencia de otros archivos de texto. Esta extensión es .m. Por ejemplo si un
archivo contiene las órdenes para dibujar un vector se le puede llamar dibuvector.m.
Los archivos que contienen órdenes de MATLAB serán llamados desde ahora archivos M.
Para escribir el archivo de texto se puede usar cualquier programa como la libreta de notas, el
editor de MS-DOS, etc. MATLAB incorpora su propio programa para redacción llamado M file
Editor, o sea redactor de archivos M.
A modo de ejemplo considere las siguientes órdenes de MATLAB que convierten una cantidad
en pesetas a euros.
pesetas=input(’Escriba la cantidad en pesetas : ’)
euros = pesetas/166.386
80
TEMA 7. PROGRAMACIÓN EN MATLAB
Supongamos que se introducen este texto dentro de un archivo al cual se le da el nombre de
cpe.m (el nombre viene de convertidor de pesetas a euros). La forma de indicar a MATLAB que
utilice el archivo es simple: se escribe su nombre en el entorno MATLAB. Se obtiene el resultado
que se muestra a continuación.
>> cpe
Escriba la cantidad en pesetas : 1000
pesetas =
1000
euros =
6.0101
7.4.1
Legibilidad
Frecuentemente el usuario de MATLAB escribe archivo M que le resultan de utilidad. Pasado
un tiempo sin usar un archivo es posible que uno olvide qué tarea realiza exactamente. En tal
caso es necesario mirar el contenido del archivo y repasar su contenido. Es en este punto cuando
se agradece (o se echa en falta) una buena práctica de programación que haga que el código sea
legible.
Los siguientes consejos ayudarán sin duda al usuario de MATLAB a conseguir programas
legibles.
• Elegir nombres de variables indicativos de lo que representan.
• No usar una misma variable para representar más que una cosa.
• Incluir comentarios en el código para ayudar a seguir la secuencia del programa.
• Dividir el código en trozos, de forma tal que sea posible abarcar cada trozo de un vistazo
en una ventana mediana. La división no ha de ser arbitraria, sino que los trozos deben
tener cada uno cometidos claros. Normalmente los diagramas de flujo desarrollados con
anterioridad a la codificación indican cómo realizar esta división.
A pesar de haber dado estos consejos hemos de ser conscientes de que la buena programación
sólo se logra mediante un proceso de aprendizaje por prueba y error.
7.5
Funciones para trazado de gráficas
Uno de los motivos por el que MATLAB ha sido un entorno favorecido por el público es la
facilidad con la que se pueden realizar gráficos de muy distintos tipos. En este punto se va a
81
c M.R. Arahal 2003 DISA. ESI. US.
°
indicar la forma de realizar algunas representaciones gráficas que pueden ser muy útiles para
ilustrar posteriormente otros ejercicios.
La orden de dibujo más simple es plot. Esta función puede ser utilizada de muchas maneras.
En primer lugar puede usarse para representar las componentes de un vector. Por ejemplo,
supongamos que el vector:
>> v=[ 15.6 16.2 18 17 16.5 15 ]
está formado por las temperaturas (en grados Celsius) medidas cada cuatro horas en una estación
meteorológica. Si se escribe lo siguiente en el entorno MATLAB
>> v=[ 15.6 16.2 18 17 16.5 15 ]
v =
15.6000
16.2000
18.0000
17.0000
16.5000
15.0000
>> plot(v)
se observa que aparece una nueva ventana conteniendo una gráfica con el aspecto que muestra
la figura 7.1. Puede observarse que en el eje vertical MATLAB ha representado los valores v 1 ,
v2 , etc. mientras que en el horizontal aparece el subı́ndice correspondiente.
18
17.5
17
16.5
16
15.5
15
14.5
14
1
1.5
2
2.5
3
3.5
4
4.5
5
5.5
6
Figura 7.1: Gráfica obtenida con la orden plot
Continuando con el ejemplo supongamos ahora que se conoce la hora a la que se realizó cada
medida y que deseamos que aparezca en el eje horizontal. Sea t = [4812162024], la orden que
necesitamos es simplemente:
>> t= [ 4 8 12 16 20 24 ]
t =
4
8
12
16
20
24
>> plot(t,v)
que produce un cambio en la ventana, de forma que ahora se obtiene lo que muestra la figura
7.2. Se observa que el eje horizontal está ahora marcado con las componentes del vector t.
Puede ser interesante ahora añadir unos letreros indicativos de qué es lo que se está representando. Esto se consigue de manera simple con las órdenes siguientes:
82
TEMA 7. PROGRAMACIÓN EN MATLAB
18
17.5
17
16.5
16
15.5
15
14.5
14
4
6
8
10
12
14
16
18
20
22
24
Figura 7.2: Gráfica obtenida con la orden plot usando una variable para el eje horizontal y otra
para el vertical.
>> xlabel(’hora’)
>> ylabel(’temperatura’)
>> title(’Datos estación meteorológica’)
El resultado final se muestra en la figura 7.3.
Datos estación meteorológica
18
17.5
17
temperatura
16.5
16
15.5
15
14.5
14
4
6
8
10
12
14
hora
16
18
20
22
24
Figura 7.3: Gráfica con tı́tulo y letreros en los ejes.
7.6
7.6.1
Sentencias de control
La bifurcación
Ya se ha visto en los diagramas de flujo realizados que las bifurcaciones son imprescindibles para
llevar a cabo ciertas tareas. En MATLAB es posible realizar la bifurcación básica mediante la
sentencia if-else. La forma de uso se muestra en el código que aparece a continuación.
if condición
sentencias bloque S
else
sentencias bloque N
end
En esta construcción, La condición es una expresión que da como resultado un valor lógico
(por ejemplo x > 2) que puede ser verdadero o falso. En caso de que la evaluación de la expresión
arroje un resultado verdadero se procede a ejecutar las sentencias del bloque S. En caso contrario
83
c M.R. Arahal 2003 DISA. ESI. US.
°
se ejecutan las sentencias del bloque N. Al terminar uno u otro bloque se pasa a las sentencias
posteriores a end.
De la explicación anterior debe resultar evidente que al usar la bifurcación se ejecutan las
sentencias S o las N pero no ambas.
El diagrama de flujo de la figura 7.4 a) corresponde a una bifurcación genérica. Dentro de los
bloques S y N se puede colocar cualquier conjunto de sentencias, incluyendo nuevas bifurcaciones
como se verá más adelante.
inicio
Leer x
no
no
sí
sí
¿ x < 0 ?
condición
Bloque N
va
Bloque S
x
va
-x
Escribir va
fin
x
Variable real
va
Variable real
a)
Dato
Resultado. Valor
absoluto de x
b)
Figura 7.4: a) Diagrama de flujo correspondiente a una bifurcación genérica. b) Diagrama de
flujo correspondiente al ejemplo de bifurcación
Como ejemplo sencillo considere el siguiente trozo de código:
x=input(’Introduzca valor de x’)
if x < 0,
va = -x;
else
va=x;
end
disp(El valor absoluto es)
va
Este programa serı́a de utilidad en caso de que no dispusiésemos en MATLAB de otros
medios para calcular el valor absoluto.
Un ejemplo igualmente simple es:
84
TEMA 7. PROGRAMACIÓN EN MATLAB
a=input(’Coeficiente a?’) %coeficientes de a x^2 + b x + c = 0
b=input(’Coeficiente b?’)
c=input(’Coeficiente c?’)
if b*b-4*a*c < 0,
disp(’Las raı́ces son complejas’)
else
disp(’Las raı́ces son reales’)
end
Es fácil ver que este programa toma como datos los coeficientes a, b y c de una ecuación de
segundo grado ax2 + bx + c = 0, los analiza y escribe en la pantalla si las raı́ces (soluciones de
la ecuación) serán reales o complejas (con parte imaginaria).
7.6.2
El bucle ”mientras”
El bucle ”hacer mientras que la condición sea cierta” se construye en MATLAB mediante un
conjunto de lı́neas de código que tienen la forma siguiente:
while condición
sentencias del cuerpo del bucle
end
En la figura 7.5 a) se muestra el diagrama de flujo correspondiente al bucle. La condición
es una expresión que da como resultado un valor lógico, por ejemplo x > 2. El cuerpo del bucle
son sentencias cualesquiera.
Examinando el diagrama de flujo de la figura 7.5 a) es fácil deducir que mientras la condición
se cumpla se repetirá el bucle una y otra vez. Es decir, si al evaluar la expresión lógica de la
condición se obtiene un resultado verdadero se pasa a ejecutar el cuerpo del bucle, en caso
contrario se termina el bucle.
Como ejemplo sencillo considere el siguiente trozo de código:
x=0; suma=0;
while x<10,
suma = suma + x;
x = x+2;
end
suma
Es fácil adivinar qué ocurre al ejecutar este programa, sobre todo si se dibuja el diagrama
de flujo equivalente (véase figura 7.5 b).
85
c M.R. Arahal 2003 DISA. ESI. US.
°
inicio
Iniciar x a 0
y suma a 0
no
no
¿ x < 10 ?
¿ condición ?
sí
sí
suma
suma + x
cuerpo
x
x + 2
Escribir suma
fin
x
suma
Variable entera
Variable entera
Contador de 0 a 10
Suma de los valores de x
b)
a)
Figura 7.5: a) Diagrama de flujo correspondiente a un bucle genérico del tipo ”repetir mientras
la condición sea cierta”. b) Diagrama de flujo correspondiente al ejemplo de uso del bucle
”mientras”
Para mejorar la legibilidad de los programas es muy aconsejable incluir comentarios y ordenar
la apariencia en la pantalla de las sentencias. De este modo el ejemplo en cuestión resulta más
fácil de interpretar.
x=0;
suma=0;
% variable contador para el bucle
% variable suma parcial
while x<10,
suma = suma + x;
x = x+2;
end
suma
7.6.3
% condición bucle
%
% actualización
% escritura resultado
La sentencia for
En muchas situaciones es preciso repetir una tarea un número conocido de veces. Para ello se
puede disponer un bucle con un contador. En cada pasada o repetición el contador se incrementa
y se comprueba que no se ha sobrepasado el lı́mite. Estas tareas se realizan fácilmente en
MATLAB con el uso de la sentencia for.
Los bucles que utilizan for tienen en MATLAB el aspecto siguiente:
for contador = valorinicial:valorfinal,
86
TEMA 7. PROGRAMACIÓN EN MATLAB
sentencias del cuerpo del bucle
end
En la figura 7.6 a) se muestra el diagrama de flujo correspondiente al bucle anterior. En él
se observa que contador es una variable que sirve para controlar el bucle. Esta variable toma
inicialmente el valor especificado por valorinicial. La variable se incrementa al final de cada
pase o repetición en una unidad. La condición de salida del bucle consiste en que el contador
no sobrepase el lı́mite fijado por el valor valorfinal.
inicio
Asignar al
contador el valor
inicial
Iniciar k a 1
no
¿ k
no
6 ?
¿ contador dentro
de límites?
sí
Escribir k
sí
cuerpo
k
k + 1
Incrementar el
contador
fin
k
a)
Variable entera
Contador de 1 a 6
b)
Figura 7.6: a) Diagrama de flujo correspondiente a un bucle genérico del tipo ”para”. b)
Diagrama de flujo correspondiente al ejemplo de uso del bucle ”para”
A fin de aclarar las ideas se muestra el siguiente ejemplo de bucle usando la sentencia for.
for k = 1:6,
k
end
En la figura 7.6 b) se presenta el diagrama de flujo correspondiente a este ejemplo. Es fácil
ver que el bucle no realiza cálculo alguno, simplemente escribe en la pantalla los valores sucesivos
que va adquiriendo la variable k.
Este ejemplo revela porqué se le llama bucle ”para”. Se observa que para cada valor de k
entre 1 y 6 se escribe k en la pantalla, que es lo que literalmente dice la sentencia for k=1:6,.
c M.R. Arahal 2003 DISA. ESI. US.
°
87
Los valores iniciales y finales no necesariamente son constantes, pueden ser variables como
en el programa siguiente.
% valores inicial y final para bucle
v_inicial = input(’Introduce valor inicial’)
v_final = input(’Introduce valor final’)
% bucle
for k = v_inicial:v_final,
k %escritura en pantalla
end
El incremento de la variable contador puede ser distinto de uno. Por ejemplo para realizar
una cuenta atrás (mediante decremento del contador) o para saltar de dos en dos, etc. La forma
de indicar un incremento en la sentencia for es muy simple:
for contador = valorinicial:incremento:valorfinal,
sentencias del cuerpo del bucle
end
A modo de ejemplo considere el programa:
for k=1:2:20,
k
end
7.7
Ejemplos de programación I
• Leer las 5 componentes de un vector y escribirlo luego al derecho y al revés.
• Crear un vector x de dimensión 100, cuyas componentes son los valores x k = −1.001 +
0.01 ∗ k. Calcular a continuación un vector y cuyas 100 componentes vienen dadas por
k)
yk = sen(x
xk . Representar gráficamente y frente a x.
• Leer una cadena de caracteres. Cifrarla para que pueda ser enviada de forma secreta. La
regla de cifrado es: sumar al código de cada carácter la posición que ocupa dentro del
texto al cuadrado. El mensaje cifrado consiste en la lista de números obtenidos separados
por espacios.
• Descifrar un mensaje codificado según la regla anterior.
• Leer del teclado un par de abcisas x1 y x2 . Representar gráficamente la función y =
x − sen(x) utilizando cien puntos equiespaciados entre x1 y x2 .
88
TEMA 7. PROGRAMACIÓN EN MATLAB
• Utilizar el programa anterior para calcular gráficamente la solución de la ecuación sen(x) =
x (calculando el paso por cero de la función y = x − sen(x) mediante llamadas sucesivas al
programa con valores de x1 y x2 que estén a izquierda y derecha de dicho pase por cero).
Tema 8
Programación de funciones en
MATLAB
Las funciones son fundamentales para realizar programas de cierta envergadura. Por un lado
permiten desarrollar un código modular lo cual mejora la legibilidad, pero además descargan el
trabajo del programador pues cada función constituye un nuevo bloque constructivo en el que
apoyarse.
8.1
Concepto de función
Una función es un conjunto de órdenes que lleva a cabo una tarea precisa. La función es utilizada
dentro de un programa como si de una orden se tratara. La función puede calcular resultados
utilizando los datos que se le suministran explı́citamente.
Un ejemplo de función es sin. Observemos que cumple las condiciones que hemos impuesto:
• Es un conjunto de órdenes aunque en las modernas versiones de MATLAB no podamos
verlo.
• Realiza una tarea concreta consistente en calcular el seno del número indicado.
• Calcula resultados a partir de datos suministrados.
Las funciones pueden interpretarse como módulos con los cuales es posible construir programas. Son similares a los módulos que se han utilizado en los diagramas de flujo. Además poseen
una caracterı́stica que las hace muy útiles: las funciones pueden usarse una y otra vez con datos
distintos. Desde este punto de vista la función es una máquina capaz de producir resultados a
partir de datos que se le suministran. Este aspecto es ilustrado por el diagrama de la figura 8.1.
89
90
TEMA 8. PROGRAMACIÓN DE FUNCIONES EN MATLAB
Argumentos
Función
Resultados
Figura 8.1:
8.2
Datos y resultados
En matemáticas una función f calcula un valor (y variable dependiente) a partir de otro dado
(x variable independiente). Tanto x como y pueden ser escalares, vectores o matrices. Con las
funciones de MATLAB ocurre otro tanto. El papel de la variable independiente es representado por los datos que se le suministran a la función, llamados normalmente argumento. Se
dice habitualmente que la función ”devuelve” un resultado que es el equivalente a la variable
dependiente.
Para aclarar las ideas consideremos la sentencia de MATLAB y = sin(x). Hemos de recordar que la ejecución de esta sentencia provoca lo siguiente:
1. El cálculo mediante la función sin del seno del dato proporcionado, que en este caso es el
valor de x.
2. La asignación a la variable y del valor calculado por la función sin (que es, lógicamente
sen(x)).
Es muy conveniente no perder de vista estos pasos en las explicaciones que se darán posteriormente.
Además de las funciones existentes en MATLAB hay mecanismos para que el usuario escriba
funciones nuevas. Para ello sólo tiene que preparar en un archivo de texto las órdenes de MATLAB que realizan un determinado cálculo y posteriormente añadir una cabecera que permita a
esas órdenes trabajar como debe hacerlo una función.
Se va a ilustrar el procedimiento con un ejemplo. Supongamos que se necesita una función
que calcule el factorial de un número dado n. Escribimos en un archivo las órdenes:
c M.R. Arahal 2003 DISA. ESI. US.
°
91
producto=1;
for multiplicador=2:n,
producto = producto*multiplicador;
end
factorial = producto;
y con esto tenemos resuelto parte del problema. Ahora bien, si queremos utilizar este trozo
de código debemos recordar siempre que hemos de usar la variable n para el dato. Dicho de otro
modo, este trozo de código no sirve si se pretende calcular el factorial de x o de q. Lo que se
necesita es añadir una cabecera para que el trozo de código se convierta en una función.
function [factorial] = mi_fact(n)
producto=1;
for multiplicador=2:n,
producto = producto*multiplicador;
end
factorial = producto;
Se ha de guardar este texto en un archivo M cuyo nombre ha de ser mi fact. Este nombre
se ha escogido para recalcar que es una función mı́a y que calcula el factorial.
Para probar mediante ejemplos que este archivo M es una función escribimos en la ventana
de órdenes de MATLAB lo siguiente:
>> mi_fact(5)
ans =
120
Cada vez que se utiliza una función se dice que se hace ”una llamada” a la misma, o que se
la ”invoca”. Nótese que esta invocación, uso o llamada produce un efecto interesante: el valor
que se le proporciona (el valor 5 en el ejemplo) es copiado en la variable n de la función, de
modo que las órdenes que se habı́an escrito y que calculan el factorial de n están en realidad
calculando el factorial del dato escrito entre paréntesis. A este fenómeno se le suele llamar ”pase
de argumento”.
Por otra parte, el resultado que se calcula y que almacena en la variable factorial aparece
tras la llamada en el entorno de MATLAB. Si esto no se entiende del todo considere este otro
ejemplo:
92
TEMA 8. PROGRAMACIÓN DE FUNCIONES EN MATLAB
>> y=0
y =
0
>> y=mi_fact(4)
y =
24
>> y
y =
24
Ahora debe ser obvio que el valor de factorial ha sido asignado a la variable y. A este
fenómeno se le da el nombre de ”devolución de resultados”.
Con esta explicación ya tiene sentido una frase habitual entre programadores como ”le pasé
a la función el valor 4 y me devolvió en y el factorial de 4”.
La sintaxis para la escritura de funciones es simple. En primer lugar debe aparecer una lı́nea
en la que se indica:
• el nombre de la función (en el ejemplo anterior es mi fact).
• el nombre de la variable resultado (en el ejemplo anterior es factorial).
• el nombre de los argumentos (en el ejemplo anterior hay un único argumento de nombre
n).
A continuación se escribirán sentencias de MATLAB incluyendo todo tipo de cálculos. Es
obligatorio que en algún punto se le de valor a la variable resultado pues de otro modo la función
no sabrá qué devolver al ser invocada y generará un error.
8.3
Variables locales y globales
Continuando con el ejemplo anterior es instructivo utilizar la orden who para ver qué variables
se están utilizando:
>> who
Your variables are:
y
93
c M.R. Arahal 2003 DISA. ESI. US.
°
el resultado obtenido quizá debiera sorprender, porque, ¿dónde está la variable producto?,
¿y factorial?, ¿y multiplicador?, ¿y n?. La única variable que parece existir (según indica
el resultado de who) es y.
La respuesta es que estas variables no son visibles desde el entorno de MATLAB pues están
ocultas dentro de la función mi fact. Esta caracterı́stica es muy útil pues de este modo cada
función puede usar variables con el nombre que quiera sin que haya que preocuparse porque esta
variable ya exista previamente en otra función.
Este hecho se produce con las funciones, pero no con cualquier archivo M. El siguiente
ejemplo puede contribuir a aclarar esta afirmación. Considere los dos archivos M que se indican
a continuación.
function [y] = f_recta(x)
a = 8; % pendiente
b = 2; % ordenada en el origen
y = a*x + b; %valor de la recta en x
Archivo f recta.m
Este primer archivo M contiene una función. Es fácil ver que la función calcula la ordenada
sobre la recta y = 8x + 2 correspondiente a un punto de abcisa x que es el dato proporcionado
a la función.
a = 8; % pendiente
b = 2; % ordenada en el origen
y = a*x + b; %valor de la recta en x
Archivo m recta.m
Este otro archivo no es una función, es simplemente un conjunto de órdenes de MATLAB
que se han escrito y guardado en disco.
Se va a mostrar mediante ejemplos las diferencias de uso de ambos archivos.
>> a=-2
a =
-2
94
TEMA 8. PROGRAMACIÓN DE FUNCIONES EN MATLAB
>> f_recta(1)
ans =
10
>> a
a =
-2
Ejemplo de uso de la función f recta en el que se observa que la variable a permanece inalterada.
>> a=-2
a =
-2
>> x=1
x =
1
>> m_recta
>> y
y =
10
>> a
a =
8
Ejemplo de uso del archivo M m recta en el que se observa que la variable a cambia de valor.
8.3.1
Clasificación de las variables
Las variables pueden clasificarse de varias maneras. Atendiendo al campo donde pueden ser
vistas y utilizadas se distinguen dos grupos:
Globales Estas variables pueden ser vistas y utilizadas desde cualquier fichero M y desde el entorno
de MATLAB.
Locales Son variables que sólo pueden ser vistas y utilizadas dentro de alguna función. Fuera de
la misma no son visibles y por tanto no son utilizables.
Por otra parte, atendiendo a la durabilidad de la variables se pueden hacer dos grupos.
95
c M.R. Arahal 2003 DISA. ESI. US.
°
Persistentes Estas variables existen desde el momento en que son creadas hasta que se las destruye
explı́citamente mediante la orden clear. Las variables globales son de este tipo. También
se las suele llamar variables estáticas.
Estas variables no pierden su valor por culpa de llamadas a funciones u otros acontecimientos. Tan sólo se ven afectadas por órdenes de asignación.
Efı́meras Son variables que son creadas por una función y desaparecen al terminar la función. Las
variables locales suelen ser efı́meras. Debido a esto las variables que están dentro de una
función no conservan su valor de una llamada a otra de la función. Existe un procedimiento
para convertir las variables locales en persistentes mediante la orden persistent.
Las caracterı́sticas de disponibilidad (global o local) y durabilidad (persistente o efı́mera)
pueden combinarse dando lugar a varias situaciones. El mejor modo de poner de manifiesto
todo esto es utilizando ejemplos como los que se proporcionan a continuación.
Ejemplo 1. Las variables del entorno de MATLAB son locales.
Para poner de manifiesto esta afirmación considere la función f1 cuyas órdenes se guardan
en el archivo f1.m.
function [y] = f1(x)
a = 8; % pendiente
y = a*x + b; %valor de la recta en x
Archivo f1.m
Puede verse que el valor de b no es asignado dentro de la función, por lo que intentaremos
hacerlo desde el entorno. Para ello creamos la variable y le damos un valor:
>> clear all
>> b=4
b =
4
y a continuación utilizamos la función f1
>> f1(9)
??? Undefined function or variable ’b’.
Error in ==> f1.m
On line 3 ==> y = a*x + b; %valor de la recta en x
96
TEMA 8. PROGRAMACIÓN DE FUNCIONES EN MATLAB
Aparece un mensaje de error que nos indica que la variable b no es conocida dentro de la
función f1. La explicación es simple: la variable b pertenece al entorno de MATLAB. No es una
variable global. No puede ser utilizada en el interior de funciones.
Ejemplo 2. Las variables interiores de una función son locales y no pueden ser accedidas
desde otras funciones o desde el entorno de MATLAB.
Retomamos la función f recta
function [y] = f_recta(x)
a = 8; % pendiente
b = 2; % ordenada en el origen
y = a*x + b; %valor de la recta en x
Archivo f recta.m
Haremos una llamada a la función y luego intentaremos averiguar desde el entorno de MATLAB cuánto vale la variable a que es la pendiente de la recta.
>> clear all
>> ordenada2 = f_recta(2)
ordenada2 =
18
>> a
??? Undefined function or variable ’a’.
Obtenemos un mensaje de error que era esperable pues a es una variable local de la función
f recta y no es accesible fuera de esta función.
Ejemplo 3. Las variables globales son accesibles desde cualquier función.
Para crear una variable global es preciso escribir global nombrevariable en las funciones
que la vayan a usar, incluyendo la ventana de órdenes de MATLAB en caso necesario.
En este ejemplo comenzamos por tanto escribiendo:
>> global b
que no produce respuesta alguna, pero que crea la variable b aunque sin valor asignado. Para
poner esto de manifiesto usamos la orden whos.
97
c M.R. Arahal 2003 DISA. ESI. US.
°
>> whos
Name
b
Size
0x0
Bytes
0
Class
double array (global)
Grand total is 0 elements using 0 bytes
La función que vaya a utilizar la variable global ha de contener también la orden global b.
Creamos la función f2 que es una modificación de f1 (véase ejemplos anteriores).
function [y] = f2(x)
global b
a = 8; % pendiente
y = a*x + b; %valor de la recta en x
Archivo f2.m
Ahora intentamos asignar un valor a b y veamos si la función f2 es capaz de utilizar dicho
valor.
>> b=-5
b =
-5
>> f2(1)
ans =
3
La respuesta obtenida es la deseada, con lo que queda probado que las variables globales
pueden ser usadas dentro y fuera de funciones.
8.4
Fases de la ejecución de una instrucción
De los ejemplos anteriores es posible sacar conclusiones generales acerca de cómo utiliza MATLAB las funciones. A continuación se indican las fases de la ejecución de una instrucción.
Conviene comprenderlas bien pues se trata de los pasos que MATLAB realiza cada vez que
se invoca a una función. El éxito o fracaso de las funciones que uno escriba estará sin duda
influenciado por el buen conocimiento de estas fases.
98
TEMA 8. PROGRAMACIÓN DE FUNCIONES EN MATLAB
1. Creación de variables locales para argumentos formales.
2. Recogida del valor de los argumentos de la llamada por parte de las variables locales.
3. Cálculos incluidos en el cuerpo de la función.
4. Envı́o de valores de las variables resultados a las variables de la sentencia llamante.
Resulta un ejercicio interesante comprobar en los ejemplos anteriores que dichas fases tienen
lugar y que son necesarias para el desempeño de las tareas encomendadas a una función.
Tema 9
Algunos problemas de ingenierı́a
9.1
Interpolación con segmentos
Suponga que se conocen los valores que una función f desconocida toma sobre ciertos puntos
{x1 , x2 , · · · , xn }. Se pretende proporcionar valores aproximados de f en cualquier punto x ∗
interpolando los valores conocidos.
Para precisar se va a llamar X = {xk } al conjunto de los valores de x para los cuales se
conoce el valor de f . De forma equivalente se denominará Y = {f (xk )} a las ordenadas de
dichos puntos.
Para poder obtener aproximadamente f (x∗ ) mediante interpolación es necesario que existan
dos valores xi y xd pertenecientes a X tales que xi ≤ x∗ ≤ xd .
En tal caso la interpolación produce un valor aproximado fˆ(x∗ ) que se calcula utilizando la
recta que pasa por (xi , yi ) y (xd , yd ) como se muestra en la figura 9.1. La ecuación de esta recta
es:
y − yi =
yd − y i
(x − xi )
xd − x i
y ∗ = yi +
yd − y i ∗
(x − xi )
xd − x i
y en el punto x∗ toma el valor
En caso de que x∗ no caiga entre dos valores conocidos no es posible realizar la interpolación.
El problema que se pretende resolver puede enunciarse como: dado un conjunto de abscisas
X = {xk } y sus imágenes mediante f denotadas por Y = {f (xk )}, siendo f una función
99
100
TEMA 9. ALGUNOS PROBLEMAS DE INGENIERÍA
1.4
(xi, yi)
1.2
(xd, yd)
1
0.8
0.6
0.4
0.2
x*
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
Figura 9.1: Ilustración de la interpolación de funciones. La función desconocida a interpolar es
la lı́nea de puntos. Los valores conocidos se indican con marcas +. Dado el valor x ∗ , la recta
que interpola es la lı́nea continua.
desconocida, calcular mediante interpolación una aproximación fˆ para nuevos valores de x proporcionados por el usuario por teclado.
Es importante tener en cuenta que los valores en X no están ordenados, es decir no se cumple
que xk ≤ xk+1 para todo k.
9.2
Ajuste por mı́nimos cuadrados
Hay ocasiones en ingenierı́a en las que se dispone de un conjunto de medidas o datos observados
de dos variables y se quiere hallar la relación entre ambas. Por ejemplo, la relación entre altitud
y temperatura media en la estratosfera.
Mediante un globo se puede medir la temperatura en distintas épocas del año y la altura
correspondiente. Suponga que el resultado de tales mediciones se ha incluido en dos vectores T
de temperaturas (en grados Celsius) y A de alturas (en Kms).
Para realizar este ejemplo se va a suponer que los vectores citados tienen como componentes:
A = [ 21
23
25
26
28
30
31
35
40
45
49]
T = [−50 − 51 − 45 − 44 − 39 − 40 − 39 − 28 − 20 − 15 − 8]
La gráfica que se muestra en la figura 9.2 muestra en el eje vertical (eje y) la altura y en
el horizontal (eje x) la temperatura. Como puede verse, parece existir una relación entre las
observaciones de ambas variables. Más aún, esta relación es lineal pues se asemeja a una recta.
Una vez hecha esta observación es posible preguntarse si alguna recta del tipo y(x) = ax + b
proporciona una relación válida a la vista de las mediciones disponibles.
101
c M.R. Arahal 2003 DISA. ESI. US.
°
Datos observados
50
45
altitud (Kms)
40
35
30
25
20
−60
−50
−40
−30
−20
o
temperatura ( C)
−10
0
Figura 9.2: Mediciones realizadas con globo en la estratosfera.
Dada una observación consistente en el par (xk , yk ) se denomina error de ajuste a la diferencia
entre el valor observado yk y el valor dado por la recta para el valor de x observado y(xk ) =
axk + b. La desviación cuadrática es es cuadrado de dicho error (yk − y(xk ))2 .
El método de los mı́nimos cuadrados permite obtener los valores de a y b que producen el
mejor ajuste posible en cierto sentido1 .
Las fórmulas para obtener los valores de a y de b son de sobra conocidas:
n
a=
n
P
x k yk −
k=1
n
P
n
k=1
b=
n
P
x2k −
k=1
n
P
xk
n
P
k=1
µ n
P
xk
n
P
xk
yk − a
n
k=1
yk
k=1
¶2
k=1
Siendo n el número de observaciones. Aplicadas a los datos de altitud y temperatura se
obtienen los valores
a=
1
11(−10840) − (−379)(353)
= 0.6242
11 · 15177 − 143641
La recta de mı́nimos cuadrados, como indica su nombre, es la que hace mı́nima la suma de las desviaciones
cuadráticas.
102
TEMA 9. ALGUNOS PROBLEMAS DE INGENIERÍA
b = (353 − a ∗ (−379))/11 = 53.6
En la figura 9.3 se muestran de nuevo los datos de temperatura y altitud incluyendo además
la recta de ajuste obtenida con las fórmulas anteriores y = 0.624x + 53.6.
Datos observados y recta de ajuste
50
45
altitud (Kms)
40
35
30
25
20
−60
−50
−40
−30
−20
o
temperatura ( C)
−10
0
Figura 9.3: Recta de ajuste de los datos experimentales.
El problema que se pretende resolver puede enunciarse como: dado un conjunto de medidas
consistentes en pares (xi , yi ) hallar la resta de ajuste por mı́nimos cuadrados.
9.3
Cálculo aproximado de áreas
Como es sabido, la integral definida de una función equivale al área que queda bajo la curva de
dicha función
R entre los lı́mites de integración. Por ejemplo, la integral indefinida (o primitiva)
de y = 1 es 1dx = x, por tanto la integral definida entre las abscisas 1 y 5 es:
Z
5
1
1dx = (5 − 1) = 4
Este resultado puede comprobarse de manera inmediata sin más que trazar la gráfica de
y = 1 y observar que el área del rectángulo es igual al producto de la base por la altura 4 · 1 = 4.
Según lo anterior, parece claro que para calcular el área
R de y =f(x) entre dos abscisas x i ,
xf basta con hallar la primitiva de f(x), digamos g(x) = f(x)dx y luego obtener la diferencia
g(xf )−g(xi ).
Este método presenta un inconveniente, y es que existen funciones para las cuales no se
2
conocen primitivas. Este es el caso, por ejemplo de la función f(x) = e−x .
103
c M.R. Arahal 2003 DISA. ESI. US.
°
El cálculo aproximado de integrales consiste en hallar un valor numérico h(x i , xf ) que sea lo
más parecido posible al área que se desea calcular g(xf )−g(xi ).
Un método muy simple consiste en dividir el área en rectángulos como los que se muestran
en la figura 9.4. Obsérvese que se ha dividido el intervalo [xi , xf ] en n trozos iguales, resultando
los subintervalos: [x1 , x2 ], [x2 , x3 ], ... [xn , xn+1 ], siendo x1 = xi y xn+1 = xf . La altura de
cada rectángulo se calcula mediante el valor de la función. Ası́, para el primer rectángulo la
altura es f(x1 ), para el segundo rectángulo f(x2 ) y para el último rectángulo (el n) es f(xn ).
f(x)
f(x1)
xi
x1 x2
xf
xk
xn xn+1
Figura 9.4: Cálculo aproximado del área bajo la curva f mediante suma de rectángulos
El área bajo la curva es aproximadamente igual a la suma de las áreas de los n rectángulos.
Se va a indicar mediante h(xi , xf , n) el valor de dicha suma. Puesto que la base de todos ellos
es igual a d = (xf − xi )/n se tiene que:
h(xi , xf , n) = d
n
X
f(xk )
(9.1)
k=1
La suma anterior puede llevarse a cabo mediante un programa de computador. Nótese que la
fórmula (9.1) sólo contiene variables y funciones conocidas. Se supone que aunque no se conoce
la expresión analı́tica de la función primitiva g(x) sı́ se conoce la de f(x) y también se supone
que los valores de f(x) se pueden calcular para cualquier x ∈ [xi , xf ].
El problema que se pretende resolver puede enunciarse como: dados dos valores x i , xf
(xi < xf ) y una función f(x), hallar el área bajo la curva f de forma aproximada.
Resulta evidente que el resultado de (9.1) depende del número de rectángulos que se utilicen.
Si se toma un valor demasiado bajo para n es resultado será poco aproximado pues la ”escalera”
de rectángulos será demasiado tosca. Por contra un valor demasiado alto de n producirá resultados finos a costa de un tiempo de cálculo elevado. En el algoritmo que se va a realizar se
dejará que n sea una variable a elegir por el usuario.
104
9.4
9.4.1
TEMA 9. ALGUNOS PROBLEMAS DE INGENIERÍA
Integración numérica de ecuaciones diferenciales
Introducción
Un problema clásico en ingenierı́a es el cálculo de soluciones aproximadas de ecuaciones diferenciales usando métodos numéricos.
Una ecuación diferencial es aquella en la que aparecen la incógnita y sus derivadas. Por
ejemplo la ecuación
dx
+x=0
dt
En esta ecuación x no representa un número sino una función del tiempo x(t). La solución
de la ecuación es una función tal que derivada respecto al tiempo y sumada a sı́ misma produzca
el valor cero.
En algunos casos es posible obtener la solución utilizando herramientas del cálculo. En el
ejemplo mostrado es simple pasando dt al segundo miembro y tomando integral.
dx
+x=0
dt
dx
= −x
dt
−
dx
=1
xdt
dx
= dt
x
Z
Z
dx
−
= dt
x
−
La integral de la izquierda es el logaritmo neperiano de x, la integral de la derecha es t,
si suponemos que en el instante t = 0 se conoce el valor de x al cual simbolizamos mediante
x(0) = x0 se tiene que:
−
Z
t
0
dx
=
x
Z
t
dt
0
−(ln x − ln x0 ) = (t − 0)
−(ln
(ln
x
)=t
x0
x
) = −t
x0
105
c M.R. Arahal 2003 DISA. ESI. US.
°
x
= e−t
x0
x(t) = x0 e−t
Sin embargo hay ocasiones donde no se conocen maneras para calcular soluciones manipulando las ecuaciones como en el ejemplo anterior. Tal es el caso de ecuaciones diferenciales en
las cuales aparecen términos que no son lineales.
Como ejemplo considere el problema de un paracaidista cayendo en la atmósfera. La caı́da
está gobernada por la acción de la fuerza de gravedad y la fuerza de rozamiento con el aire.
Fg − F r = m
dv
dt
donde Fg es la fuerza de la gravedad que atrae al paracaidista hacia el suelo, F r es la fuerza
de rozamiento que se opone a la caı́da, v es la velocidad vertical hacia abajo con la que viaja el
móvil y m es su masa.
Se sabe que Fg = mg siendo g = 9.8m/s2 , por otra parte la resistencia aerodinámica depende
de muchos factores. Simplificando mucho se puede considerar que Fr = kv 2 . Es decir, la
resistencia es proporcional al cuadrado de la velocidad.
La ecuación diferencial queda entonces:
mg − kv 2 = m
dv
dt
dividiendo por m y reagrupando términos se obtiene:
dv
= g − Bv 2
dt
siendo B = k/m.
9.4.2
El método de Euler
Una forma simple de resolver ecuaciones como la anterior es el método de Euler.
Sea la ecuación dx
dt = f(t) con condición inicial x(0) = x0 .Por tanto, en el instante de tiempo
t = 0 se sabe que x(t) = x0 . Además se sabe que
ẋ(0) = f (0) = lim
t−→0
x(t) − x0
x(h) − x0
≈
t−0
h
tomando un valor h = ∆t suficientemente pequeño. Es decir, que el valor de x(t) en un instante
h próximo a cero es aproximadamente x(h) ≈ x0 + hf (0). Del mismo modo, para el instante
106
TEMA 9. ALGUNOS PROBLEMAS DE INGENIERÍA
2h se puede escribir x(2h) ≈ x(h) + hf (h), como x(h) no es conocido se puede utilizar su valor
aproximado x̂(h) = x0 + hf (0). Queda claro que de este modo se puede obtener una secuencia
de valores aproximados {x̂(kh)}, k = 0, 1, 2, · · · . Nótese que este método equivale a hacer una
extrapolación lineal con la derivada en cada punto.
Para ilustrar el método de Euler se parte de la situación mostrada en la figura 9.5 (a). El eje
horizontal representa la variable t, en el eje vertical se ha colocado el valor x(0) = x 0 . A partir
de este punto se traza una recta con pendiente f (0). Sobre esta recta se halla el punto de abcisa
h y ordenada x̂(h) = x0 + hf (0). La nueva situación es la mostrada en 9.5 (b): ahora se toma
x̂(h) como punto de partida para trazar una nueva recta de pendiente f (h) y obtener sobre ella el
punto de abcisa 2h y ordenada x̂(2h) = x̂(h)+hf (h). En la figura 9.5 (c) se muestra el resultado
obtenido al repetir los pasos anteriores 50 veces con h = 0.1, siendo f (t) = cos(t) y x(0) = 0.
Se observa que la solución proporcionada por la integración numérica es un conjunto de valores
{x̂(kh)}, k = 0, 1, 2, · · · 50. Estos valores se han representado uniendo mediante segmentos los
puntos (kh, x̂(kh)), de forma que se obtiene una aproximación mediante trozos rectos. En la
citada figura se muestra también con trazo punteado la solución exacta obtenida resolviendo
dx
dt = cos(t), con x(0) = 0 que da como resultado x(t) =sen(t).
1
0.9
0.8
^x(2h)
^x(h)
^x(h)
0.7
0.6
x0
x0
0.5
0.4
0.3
0.2
t
t
0
h
(a)
0
h
(b)
2h
0.1
0
0
0.5
1
1.5
2
2.5
3
(c)
Figura 9.5: El método de Euler para integración numérica
El problema que se pretende resolver puede enunciarse como: dada una ecuación diferencial
de primer orden en la forma dx
dt = f(t) con condición inicial x(0) = x0 calcular de forma
aproximada mediante el método de Euler los valores de la trayectoria x(t) para t = h, 2h, · · · , N h
siendo h el paso de integración dado y N el número de pasos (también dado).
9.5
Ecuaciones trascendentes
Existen ecuaciones cuyas soluciones no pueden hallarse con lápiz y papel intentando despejar la
variable buscada. Éste es el caso de ecuaciones como cos(x) = x.
El problema se puede replantear como la búsqueda del punto de corte con el eje horizontal
de la función y = cos(x) − x. Para calcular (de forma numérica) el paso por cero de y(x) se
pueden aplicar diversos métodos. Uno de ellos se comenta a continuación.
107
c M.R. Arahal 2003 DISA. ESI. US.
°
9.5.1
Método de la bisección
Se quiere resolver el problema de hallar el paso por cero (o raı́z) de una función y = f(x) dentro de
un cierto intervalo [xi , xf ]. Se sabe que f es continua y también que en los extremos del intervalo
toma valores de distinto signo. Sin pérdida de generalidad se puede suponer que f(x i ) > 0 y
f(xf ) < 0 (en caso contrario basta con buscar el corte por cero de −f(x)).
La situación comentada aparece descrita en la figura 9.6. De la propiedad de continuidad de
la función f se obtiene que debe existir al menos un paso por cero en el intervalo citado. Interesa
calcular ese valor x∗ que cumple f(x∗ ) = 0 aunque sea de modo aproximado.
f(x)
xi
x*
xf
Figura 9.6: Función con un pase por cero en el intervalo mostrado.
El método de la bisección consiste en dividir el intervalo en otro más pequeño que siga
conteniendo el punto de corte. Este procedimiento se repite varias veces hasta que el intervalo
es lo bastante pequeño. Llegado este momento se puede tomar como valor aproximado del cero
el punto medio del último intervalo.
Para realizar la bisección se toma el punto medio del intervalo actual x m = (xi + xf )/2. Se
evalúa la función en dicho punto, pueden darse tres casos:
• a) la función en xm es del mismo signo que f(xi ). En tal caso se toma como nuevo intervalo
el [xm , xf ] y se repite el proceso.
• b) la función en xm es del mismo signo que f(xf ). En tal caso se toma como nuevo intervalo
el [xi , xm ] y se repite el proceso.
• c) f(xm ) = 0 en tal caso no es preciso buscar más, se ha hallado un pase por cero de la
función.
El método de la bisección termina o bien cuando se halla un punto en el que la función vale
cero o cuando el intervalo es lo suficientemente pequeño. Por ejemplo, si se necesita conocer el
pase por cero con dos decimales nada más el método ha de aplicarse hasta que el intervalo tenga
una longitud menor o igual a 0.01.
En la figura 9.7 se muestra cómo actuarı́a el método de la bisección con la misma función de
la figura 9.6. Se han representado tres etapas con los pasos descritos anteriormente (indicadas
mediante un número encuadrado situado en la parte superior de cada gráfica). La longitud
108
TEMA 9. ALGUNOS PROBLEMAS DE INGENIERÍA
1
2
f(x)
xi
xm
3
f(x)
xf
xi
xm
f(x)
xf
xi xm xf
Figura 9.7: Funcionamiento del método de la bisección.
del intervalo, que se ha indicado en la parte inferior, disminuye a la mitad en cada etapa con
respecto a la anterior.
Para ilustrar el método se va a considerar la función cos x−x. El intervalo en el que existe un
pase por cero se obtiene fácilmente recordando que cos 0 = 1, por lo que f (0) = cos 0 − 0 = 1 > 0
y por otra parte cos π/2 = 1, por lo que f (π/2) = cos π/2 − pi/2 = 0 − π/2 < 0.
Por tanto el primer intervalo considerado es [xi , xf ] = [0, π/2]. El punto medio de este
intervalo es xm = (xi + xf )/2 = π/4. Al evaluar la función se obtiene que f(xm ) = −0.0783 < 0,
por lo que se trata del caso b). El nuevo intervalo ha de ser [0, π/4].
Repitiendo el proceso varias veces se obtienen los valores que figuran en la tabla siguiente:
Intervalo
[0, π/2]
[0, π/4]
[π/8, π/4]
[3π/16, π/4]
[7π/32, π/4]
[15π/64, π/4]
[15π/64, 31π/128]
[15π/64, 61π/256]
[15π/64, 121π/512]
Punto medio xm
π/4
π/8
3π/16
7π/32
15π/64
31π/128
61π/256
121π/512
245π/1024
Valor de f(xm )
-0.0783
0.5312
0.2424
0.0858
0.0046
-0.0366
-0.0159
-0.0056
-0.0211
Longitud intervalo
1.5708
0.7854
0.3927
0.1963
0.0982
0.0491
0.0245
0.0123
0.0061
La columna de la derecha indica la longitud del intervalo considerado; es decir x f − xi .
Puede observarse que el valor en cada etapa es la mitad que en la anterior. Esta cantidad tiene
gran importancia en el método. Obsérvese que si se toma xm como valor aproximado de x∗
el error cometido no será nunca mayor que la longitud del intervalo. Por tanto, si se desea la
solución aproximada con un decimal exacto ésta se puede tomar como 15π/64; si se precisan dos
decimales exactos entonces hay que tomar 245π/1024.
La figura 9.8 muestra la función f(x) = cos x − x. Los cı́rculos y las lı́neas verticales indican
los valores de xm en las cuatro primeras etapas. Los números que figuran encima de los cı́rculos
indican la etapa en la que han sido obtenidos. Puede comprobarse que en la primera etapa se
obtiene (por casualidad) un valor muy cercano al paso por cero.
El problema que se pretende resolver puede enunciarse como: dada una función f(x) y un
109
c M.R. Arahal 2003 DISA. ESI. US.
°
cos(x)−x
1
2
0.5
3
4
0
y
1
−0.5
−1
−1.5
0
0.5
1
1.5
x
Figura 9.8: Ejemplo de uso del método de la bisección.
intervalo inicial [xi , xf ] tales que f(xi ) · f(xf ) < 0 aplicar el método de la bisección hasta que el
intervalo resultante tenga una longitud menor que cierto valor dado ∆. El algoritmo dará como
resultado el intervalo final.
9.6
Superficies
Una superficie z = f(x, y) definida en un rectángulo [xi , xf ] × [yi , yf ] puede representarse mediante un conjunto discreto de alturas medidas en algunos puntos del dominio. Por ejemplo, si se
toma una rejilla en el rectángulo con nx × ny puntos, las alturas de los puntos (xj , yi ) serán los
valores zij = f (xj , yi ) para i = 1, · · · , ny y j = 1, · · · , nx que se pueden incluir en una matriz
Z ∈ IRny ×nx .
A modo de ejemplo considere la función z = f (x, y) = x2 +y 2 en el rectángulo [−1, 1] × [−2, 2].
Si se toma una rejilla de ancho 0.5 se obtienen los valores siguientes:
x = {−1, −0.5, 0, 0.5, 1}

5.00
4.25

Z=
4.00
4.25
5.00
y = {−2, −1.5, −1, −0.5, 0, 0.5, 1, 1.5, 2}
3.25
2.50
2.25
2.50
3.25
2.00
1.25
1.00
1.25
2.00
1.25
0.50
0.25
0.50
1.25
1.00
0.25
0.00
0.25
1.00
1.25
0.50
0.25
0.50
1.25
2.00
1.25
1.00
1.25
2.00
3.25
2.50
2.25
2.50
3.25

5.00
4.25

4.00

4.25
5.00
La figura 9.9 muestra la rejilla en el rectángulo considerado y la superficie z = f(x, y) calculada en los puntos de la rejilla.
Una superficie cualquiera, como por ejemplo la formada por las montañas y valles del terreno,
puede ser representada aproximadamente por una matriz. Usando esta representación es posible
110
TEMA 9. ALGUNOS PROBLEMAS DE INGENIERÍA
superficie f(x,y)
5
4
rejilla
1.5
3
1
2
y
0.5
1
0
0
1
−0.5
−1
0
−1.5
−2
−1
0
x
1
2
−1
y
2
1
0
−1
−2
x
Figura 9.9: Ejemplo de uso del método de la bisección.
resolver algunos problemas de ingenierı́a.
9.6.1
Búsqueda de extremos
Dada una matriz de alturas como la descrita en 9.6 con ny filas y nx columnas se desea determinar
los máximos y mı́nimos. El problema es equivalente a buscar las cimas y depresiones de un
terreno.
Para concretar más lo expuesto considérese la superficie mostrada en la figura 9.10 y su
correspondiente gráfico de curvas de nivel. Puede observarse que existe más de una cumbre y
más de una depresión. El objetivo no es hallar la cumbre más alta o la sima más profunda sino
indicar en qué lugares existe alguna de estas caracterı́sticas del terreno.
55
superficie
50
25
45
40
20
35
30
i
20
30
15
25
10
20
10
15
50
60
40
50
40
30
30
20
10
i
20
10
5
5
10
10
j
20
30
j
40
50
60
Figura 9.10: Terreno con múltiples cumbres y simas (izquierda) y mapa con curvas de nivel
(derecha). La barra de la derecha indica la correspondencia entre tonos de gris y altura.
Para solucionar el problema se puede usar la idea de que una cumbre es un punto del terreno
que sobresale de los puntos vecinos. Este hecho será visible en la matriz de alturas pues la
111
c M.R. Arahal 2003 DISA. ESI. US.
°
cumbre corresponderá a algún elemento ai,j con la propiedad de ser mayor que sus vecinos.
Por ejemplo, en la matriz siguiente

0
0

0

0

0

0
0
0
0
0
1
0
0
0
1
2
2
1
1
1
1
2
2
2
2
1
1
1
2
2
2
3
2
2
2
1
2
2
1
1
1
1
0
1
1
1
1
1
0
0
0
0
0
0
0
0

0
0

0

0

0

0
0
hay una sola cumbre, correspondiente al elemento a4,5 . Puede verse que los elementos adya-centes tienen menor valor.
Ha de tenerse en cuenta que los vecinos que hay que comprobar son: el de arriba, el de
abajo, el de la izquierda, el de la derecha y también los cuatro situados en las diagonales; es
decir, arriba a la izquierda, arriba a la derecha, abajo a la izquierda y abajo a la derecha.
Los elementos que están situados en los bordes de la matriz (los de las filas primera y última
y los de las columnas primera y última) no pueden ser comprobados porque no tienen todos sus
vecinos, por ello se dejan fuera del análisis.
El algoritmo para detectar cumbres deberá analizar cada uno de los elementos interiores de
la matriz y comprobar si se cumple o no la condición de ser mayor que los vecinos.
9.7
Tratamiento de textos
9.7.1
Palabras en orden inverso
El problema consiste en leer una frase del teclado y escribirla luego al revés. Por ejemplo, si se
lee la frase Hola amigo. se ha de escribir en la pantalla .ogima aloH que es la frase escrita de
derecha a izquierda.
9.7.2
Palı́ndromo
Problema Leer una palabra y decidir si es palı́ndromo. El final de la palabra es indicado con
el punto. Para ser palı́ndromo debe ocurrir que exista un eje de simetrı́a en la palabra. La
palabra puede tener un número par o impar de caracteres; en este último caso el eje de simetrı́a
contendrá el carácter central.
Ejemplos: abba, abcba.
112
TEMA 9. ALGUNOS PROBLEMAS DE INGENIERÍA
9.7.3
Mensaje oculto
Una frase puede cambiarse para que resulte irreconocible. Una forma muy simple consiste en
cambiar cada carácter por el siguiente del alfabeto. Por ejemplo, la palabra IBM se convierte en
HAL.
El programa que se desea construir ha de codificar, mediante esta técnica simple, una frase
que se leerá del teclado. Considere que la frase leı́da consiste únicamente en una palabra formada
por letras (sin números ni otros caracteres).
Para simplificar no tenga en cuenta el caso de letras con tilde o diéresis.
9.7.4
Mensaje oculto II
Se puede expandir el programa anterior para que opere también con frases que contienen caracteres que no son letras, tales como los números y signos de puntuación. Los únicos caracteres
que se han de modificar son las letras.
Por ejemplo, si la frase que se introduce es >Quedamos a las 6h? el resultado ha de ser
>Rvfebnpt b mbt 6i?
Para simplificar no tenga en cuenta el caso de letras con tilde o diéresis.
9.7.5
Descifrar mensaje
Se trata ahora de resolver el problema inverso: dado un mensaje codificado proporcionar la frase
original.
El programa ha de leer del teclado una frase codificada, como por ejemplo >Rvfebnpt b
mbt 6i?. Como resultado el programa ha de escribir en la pantalla el mensaje sin codificar
>Quedamos a las 6h?.
Para simplificar no tenga en cuenta el caso de letras con tilde o diéresis.
9.7.6
Mensaje oculto II
En los dos problemas anteriores se ha ignorado el caso de la letra z. Esta letra plantea un
problema para ser codificada pues no existe otra letra posterior. Una forma de resolver este
problema es ”asignar” de forma artificial la a como letra siguiente a la z. De este modo una
frase como zona 3 se codifica en apob 3.
Para simplificar no tenga en cuenta el caso de letras con tilde o diéresis.
113
c M.R. Arahal 2003 DISA. ESI. US.
°
9.7.7
Pase a mayúsculas
Se desea cambiar una frase de forma que todas las letras queden en mayúsculas. El programa
leerá una frase del teclado y escribirá como resultado la misma frase pero con las letras cambiadas
de forma que todas estén en mayúsculas. Por ejemplo, la frase Tengo clase a las 16h en la
planta E-2 ha de transformarse en TENGO CLASE A LAS 16H EN LA PLANTA E-2.
Obsérvese que las letras que ya estaban en mayúsculas se quedan igual. Los caracteres que
no son letras no se ven afectados.
Para simplificar no tenga en cuenta el caso de letras con tilde o diéresis.
9.8
9.8.1
Tratamiento de archivos
Agenda telefónica
Se desea crear una agenda telefónica. Esta agenda consiste en un archivo de texto en el que
aparecen nombres, apellidos y números de teléfono.
Esta tarea puede realizarse con la libreta de notas, pero en lugar de eso queremos desarrollar
un programa en MATLAB que recoja los datos de la agenda y los introduzca en un archivo.
El programa ha de preguntar al usuario el nombre, apellidos y número de teléfono de una
persona. Posteriormente preguntará si desea añadir otra persona a la agenda o grabar los datos.
Si escoge añadir el programa ha de volver a preguntar el nombre, apellidos y número de teléfono,
en caso contrario el programa escribirá los datos en un archivo de texto.
El archivo de texto ha de tener el formato siguiente: los dos primeros caracteres son un
número de orden, a continuación viene un espacio. Los 15 caracteres siguientes se reservan para
el nombre. A continuación debe aparecer una coma. Los 30 espacios siguientes se dejan para
los dos apellidos. Después ha de aparecer la palabra Tel y un espacio en blanco. Finalmente se
escribe el teléfono y se pasa a la lı́nea siguiente.
En el recuadro siguiente se puede observar un ejemplo de dicho archivo de texto.
01
02
03
04
Pedro,
Ana,
Juan,
Antonio,
Pérez Repitre
Regues Dı́az
Borda Ruiz
Garcı́a Wrkczy
Tel
Tel
Tel
Tel
56
11
34
21
90
32
43
32
02
45
78
43
114
9.8.2
TEMA 9. ALGUNOS PROBLEMAS DE INGENIERÍA
Agenda telefónica II
Para consultar la lista de teléfonos confeccionada con el programa anterior es posible usar la
libreta de notas. En lugar de eso se quiere crear un programa en MATLAB que lea el archivo y
presente en la pantalla la información que contiene.
El programa no recibe dato alguno. Su misión consiste en leer el archivo que contiene la
agenda y mostrar en la pantalla la lista de nombres, apellidos y teléfonos exactamente en la
misma forma en la que aparece en el archivo.
9.8.3
Agenda telefónica III
En una agenda es frecuente que haya que añadir nuevos teléfonos o borrar alguno existente .
Se ha de realizar un programa que lea el archivo (creado con el programa de 9.8.1), presente su
contenido en pantalla y pregunte al usuario si desea añadir o eliminar algo. En caso de que se
desee añadir el programa preguntará al usuario los datos del mismo modo que en el programa de
9.8.1. Si se desea eliminar una entrada de la agenda (una lı́nea de datos) el programa preguntará
qué número de lı́nea se desea eliminar. El programa concluye escribiendo un nuevo archivo con
los cambios realizados.
Bibliografı́a
• P. Anasagasti, Fundamentos de los computadores. Paraninfo, 1990.
• M. R. Arahal, Fundamentos de informática. Escuela Superior de Ingenieros, Universidad
de Sevilla, 1999.
• T. Aranda, Notas sobre MATLAB. Universidad de Oviedo, Servicio de Publicaciones,
1999.
• J. Mathews, Métodos numéricos con MATLAB. Prentice Hall, 2000.
• C. Pérez López, Matemática informatizada con MATLAB, Ra-Ma, 1996.
• K. Sigmon , Introducción a MATLAB. University of Florida, 1992. (Traducción de Celestino Montes. Escuela Superior de Ingenieros, Universidad de Sevilla).
• M. J. Soto Prieto, Álgebra lineal con MATLAB y MAPLE. Prentice-Hall Internacional,
1995.
• G. Brassard y P. Bratley, Fundamentos de algoritmia. Prentice Hall, 1997.
Descargar