Fundamentos de inform atica para Ingenier a Aerona ut …jaar/Datos/FIA/FIA.pdf · programas para...

169
Fundamentos de inform´ atica para Ingenier´ ıa Aerona´ utica Manuel Ruiz Arahal Sevilla, septiembre de 2008

Transcript of Fundamentos de inform atica para Ingenier a Aerona ut …jaar/Datos/FIA/FIA.pdf · programas para...

Fundamentos de informatica para Ingenierıa Aeronautica

Manuel Ruiz Arahal

Sevilla, septiembre de 2008

2

Contenido

Contenido 2

1 Introduccion y fundamentos 11

1.1 Informatica y computadoras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

1.1.1 Programas e instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

1.2 Estructura funcional de la computadora digital . . . . . . . . . . . . . . . . . . . 13

2 Codificacion binaria de la informacion 15

2.1 Sistema binario de numeracion . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2.1.1 Conversiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2.2 Codificacion de numeros enteros . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

2.3 Codificacion de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

2.4 Numeros fraccionarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

2.4.1 Punto fijo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

2.4.2 Punto flotante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.5 Otros tipos de informacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.5.1 Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.5.2 Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.5.3 Formatos graficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3

4 CONTENIDO

2.6 Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3 Estructura de la computadora digital 29

3.1 Esquema funcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3.2 La memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

3.2.1 Caracterısticas de las memorias . . . . . . . . . . . . . . . . . . . . . . . . 30

3.2.2 Medidas de capacidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

3.2.3 Clases de memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3.2.4 Estructura matricial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3.2.5 La unidad de memoria central . . . . . . . . . . . . . . . . . . . . . . . . . 34

3.3 La unidad aritmetico-logica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.4 La unidad de entrada y salida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

3.4.1 Perifericos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3.5 La unidad de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

3.5.1 Funcionamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

3.6 Ejecucion de instrucciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

3.6.1 Transferencias entre registros . . . . . . . . . . . . . . . . . . . . . . . . . 44

3.6.2 La instruccion de salto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

3.6.3 Saltos condicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3.7 Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

4 Lenguajes y Sistemas 47

4.1 El codigo binario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

4.2 Codigo mnemotecnico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

4.3 Ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50

c© M.R. Arahal 2009 DISA. ESI. US. 5

4.4 El sistema de explotacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4.4.1 Estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

4.4.2 Funciones de los sistemas de explotacion . . . . . . . . . . . . . . . . . . . 56

4.5 Lenguajes de alto nivel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

4.5.1 Lenguajes compilados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

4.5.2 Lenguajes interpretados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

4.6 El entorno MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

4.7 Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

5 Algoritmos 67

5.1 Algoritmos y pseudocodigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

5.2 Objetos y operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

5.3 Lenguaje algorıtmico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

5.3.1 Objetos usables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

5.3.2 Nombres de los objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

5.3.3 Operaciones primitivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

5.3.4 Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

5.4 Diagramas de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

5.4.1 Bloques constructivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

5.4.2 Tabla de objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

5.4.3 Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

5.5 Fases del proceso de resolucion de problemas . . . . . . . . . . . . . . . . . . . . 81

5.6 Programacion estructurada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

5.6.1 Flujo lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

5.6.2 Analisis descendente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

6 CONTENIDO

6 Desarrollo de algoritmos basicos 85

6.1 Calculos en secuencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

6.1.1 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

6.2 Estructuras selectivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

6.2.1 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

6.3 Estructuras cıclicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

6.3.1 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

6.4 Ciclos dobles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

6.5 Ejercicios tematicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

6.5.1 Sucesiones y series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

6.5.2 Ordenaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

6.5.3 Calculos con enteros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

6.5.4 Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

6.5.5 Leyes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

6.6 Correccion de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

6.6.1 Pruebas con datos controlados . . . . . . . . . . . . . . . . . . . . . . . . 97

6.6.2 Razonamientos por induccion . . . . . . . . . . . . . . . . . . . . . . . . . 98

6.6.3 Modularidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

6.7 Analisis de la estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

7 Funciones 101

7.1 Concepto de funcion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

7.1.1 Datos y resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

7.1.2 Variables locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

7.2 Diagramas de flujo con funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

c© M.R. Arahal 2009 DISA. ESI. US. 7

7.3 Ejemplos de diagramas de flujo con funciones . . . . . . . . . . . . . . . . . . . . 106

7.3.1 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

8 MATLAB 113

8.1 El entorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

8.2 Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

8.2.1 Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

8.2.2 Identificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

8.2.3 Creacion y destruccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

8.2.4 Asignacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

8.3 Operaciones y funciones incorporadas . . . . . . . . . . . . . . . . . . . . . . . . 116

8.3.1 Operaciones elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

8.3.2 Funciones incorporadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

8.3.3 Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

8.3.4 Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

8.3.5 Cadenas de caracteres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

8.3.6 Funciones para el manejo de datos . . . . . . . . . . . . . . . . . . . . . . 122

8.4 Codificacion de nuevos programas . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

8.4.1 Legibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

8.5 Funciones para trazado de graficas . . . . . . . . . . . . . . . . . . . . . . . . . . 126

8.6 Sentencias de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

8.6.1 La bifurcacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

8.6.2 El bucle ”mientras” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

8.6.3 La sentencia for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

8.7 Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

8 CONTENIDO

8.8 Puesta a punto y mantenimiento de programas . . . . . . . . . . . . . . . . . . . 135

8.8.1 Tipos de error . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

8.8.2 Pruebas de los programas . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

8.8.3 Documentacion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

8.9 Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

8.10 Variables locales y globales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

8.10.1 Clasificacion de las variables . . . . . . . . . . . . . . . . . . . . . . . . . . 142

8.10.2 Fases de la ejecucion de una instruccion . . . . . . . . . . . . . . . . . . . 145

8.11 Ejemplos con funciones en MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . 145

8.11.1 Cola de montaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

8.11.2 Reordenacion de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

8.11.3 Ejercicios propuestos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

9 Algunos problemas de ingenierıa 151

9.1 Interpolacion con segmentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

9.2 Ajuste por mınimos cuadrados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

9.3 Calculo aproximado de areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

9.4 Integracion numerica de ecuaciones diferenciales . . . . . . . . . . . . . . . . . . . 156

9.4.1 Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

9.4.2 El metodo de Euler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

9.5 Ecuaciones trascendentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

9.5.1 Metodo de la biseccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

9.6 Superficies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

9.6.1 Busqueda de extremos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

9.7 Transporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

c© M.R. Arahal 2009 DISA. ESI. US. 9

9.8 Tratamiento de textos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

9.8.1 Palabras en orden inverso . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

9.8.2 Palındromo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

9.8.3 Mensaje oculto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

9.8.4 Mensaje oculto II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

9.8.5 Descifrar mensaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

9.8.6 Mensaje oculto II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

9.8.7 Pase a mayusculas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

9.9 Tratamiento de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

9.9.1 Agenda telefonica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

9.9.2 Agenda telefonica II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

9.9.3 Agenda telefonica III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

Bibliografıa 169

10 CONTENIDO

Tema 1

Introduccion y fundamentos

En este primer capıtulo se definen los conceptos fundamentales del calculo y tratamiento automaticosde la informacion. Estas son las tareas que realizan las maquinas llamadas computadoras u or-denadores. Hoy en dıa los usos de la computadora son bien conocidos por la mayorıa de laspersonas, por lo que algunos aspectos tratados pueden parecer triviales. Sin embargo, es conve-niente definir y delimitar los terminos que se manejaran en este texto para evitar confusiones.Junto con tales definiciones se presenta ahora el modelo de computadora que detallara en eltema 3.

1.1 Informatica y computadoras

La informatica trata de la adquisicion, representacion, tratamiento y transmision de la in-formacion. El termino procede de la union de dos palabras: informacion y automatica. Lainformacion aludida puede ser de muy diversos tipos: numeros, texto, sonido, etc. por lo que elcampo de utilizacion de la informatica es muy amplio como es sabido.

Las maquinas que permiten realizar automaticamente las operaciones citadas se denominancomputadoras y tambien ordenadores. Se puede definir la computadora como un elementocapaz de aceptar informacion, procesarla y proporcionar cierta informacion resultante. La infor-macion ha de ser suministrada de forma adecuada para su tratamiento por parte de la maquina,por ejemplo mediante pulsaciones de teclas.

El tratamiento ha de realizarse de forma automatica; esto es, con poca o ninguna inter-vencion humana y bajo el control de una lista de tareas previamente definida como se representagraficamente en la figura 1.1. El dibujo muestra a la computadora como un ente que toma datosy los convierte en resultados segun una receta predeterminada.

Es conveniente observar que la definicion dada no explicita la forma de los datos ni tampocola clase de tratamiento que han de sufrir para proporcionar los resultados. Veremos que lacomputadora digital es un dispositivo que cumple con la definicion dada, pero no es el unico.Muchos de los conceptos que se vierten aquı se pueden aplicar a otros dispositivos, sin embargoel objetivo de este libro es la computadora digital.

11

12 TEMA 1. INTRODUCCION Y FUNDAMENTOS

Figura 1.1: La computadora trata la informacion de entrada (datos) para producir resultados.

A fin de ilustrar las interacciones representadas en la figura 1.1 considerese una calculadora.Los datos proporcionados por el operador son numeros y operaciones a realizar que la calculadorarecibe al ser presionadas ciertas teclas. Los resultados son numeros que aparecen en el visor.Los datos se convierten en resultados mediante procesos de calculo en los que el operador haintervenido poco (al menos en comparacion con realizar los calculos a mano). Veremos masadelante que es posible automatizar mas aun la tarea del calculo, de forma que el operadorahorre esfuerzo.

Como es sabido, el calculo numerico no es la unica aplicacion de las computadoras. Losprogramas para la redaccion de texto, los programas de dibujo artıstico o lineal, los juegos deaccion, las bases de datos, etc. son otros ejemplos de tareas que se realizan con computadoras.

En la actualidad la tecnologıa electronica digital domina el tratamiento automatico de lainformacion, pero esto no ha sido siempre ası. De hecho, las primeras maquinas de calculareran mecanicas. Tambien ha habido computadoras neumaticas y en la actualidad se investigaen posibles usos de la luz para construir ordenadores opticos.

Los conceptos que se definiran a continuacion son de aplicacion en todos los ejemplos men-cionados anteriormente, verificandose el diagrama de la figura 1.1, el cual tiene por tanto unavalidez muy amplia.

1.1.1 Programas e instrucciones

La computadora realiza una lista de tareas llamada programa, la cual esta formada por ins-

trucciones. Una instruccion es un conjunto de sımbolos que representan una orden de ope-racion o tratamiento de los datos. Por tanto, el programa es un conjunto ordenado de instruc-ciones que se dan a la computadora de forma que se obtengan los resultados a partir de losdatos.

Es conveniente comprender que un programa es una secuencia de instrucciones en un campomucho mas amplio que el que se considerara en este libro. Para aclarar estos conceptos con-siderese el problema de realizar una serie de operaciones en una calculadora de bolsillo, por

c© M.R. Arahal 2009 DISA. ESI. US. 13

ejemplo obtener x3+26 . Para resolverlo basta con pulsar una cierta secuencia de teclas. Esto

puede ser bastante tedioso si se ha de aplicar la misma formula una y otra vez con datos dis-tintos, es decir, para distintos valores de x. Si la calculadora pudiera pulsar sus propias teclasbastarıa con proporcionar unicamente el valor de x. En tal caso el trabajo del operador se vereducido 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.

Notese que el paso 1 solo se ha de realizar una vez, por lo que el operador ahorra muchotiempo y esfuerzo. Esto es, en esencia, lo que realiza una computadora. La lista de teclas apulsar hace, en el ejemplo, las veces de programa. Este programa es proporcionado una vez ypuede ser usado en varias ocasiones.

En este ejemplo sencillo vemos que hay dos tipos de acciones que se realizan con la compu-tadora. El primer tipo viene ilustrado por el paso 1 y consiste en proporcionar las instruccionesque forman el programa. Esta operacion recibe el nombre de programacion. Programar lamaquina es por tanto proporcionar el programa o lista ordenada de instrucciones que resuelveuna tarea o problema. Una vez programada, la computadora puede ser usada para obtenerresultados a partir de datos. A esta tarea se le llama simplemente uso o ejecucion del pro-grama. El mismo programa puede usarse repetidas veces con datos distintos, ahorrando tiempoal operador, pues son muchas las instrucciones que pueden realizarse de forma automatica consolo poner en marcha el programa.

Figura 1.2: Una calculadora programable permite realizar calculos con menor intervencion hu-mana.

Las computadoras son maquinas versatiles gracias a que es posible cambiar el programa.Continuando con el ejemplo, si se precisa calcular otra funcion como 5+x

2

3 para distintos valoresde x basta con cambiar la secuencia de teclas. La misma maquina realiza ahora operacionesdiferentes 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. Unadescripcion mas detallada mostrarıa los modulos que realizan tareas concretas. En la historia

14 TEMA 1. INTRODUCCION Y FUNDAMENTOS

UALprincipal

Unidad de control

unid

ad d

e en

trad

a/sa

lida

Periféfico 1

Periférico n

Memoria

información

señalesde control

Figura 1.3: Esquema de Von Neumann para la computadora digital.

de las computadoras se han utilizado diversas estructuras funcionales, pero en la actualidad lamas usada deriva del modelo ideado en 1945 por J. Von Neumann, que consta de las siguientespartes:

• Memoria principal. Tiene como mision almacenar informacion. Consiste en un conjuntode celulas cada una de las cuales es capaz de almacenar una unidad de informacion binaria;esto es, un cero o un uno. Las celulas se asocian en bloques para representar informacio-nes diversas, como son datos con los que operar, resultados producidos y tambien lasinstrucciones que forman el programa.

• Unidad aritmetico-logica. Este modulo incluye un conjunto de circuitos capaces de reali-zar operaciones aritmeticas (suma, resta, etc.) y logicas (suma logica, negacion, etc.). Launidad aritmetico-logica (UAL) realiza las operaciones citadas bajo el control de la unidadde control.

• Unidad de control. Este organo es el responsable de ordenar a la UAL que realice opera-ciones con datos tomados de la memoria, de acuerdo con las instrucciones del programa,las cuales estan tambien en la memoria. La armonizacion del trasvase de informacion entrelos distintos modulos tambien corre a cargo de la unidad de control (UC), por lo que estapuede considerarse como el director del sistema.

• Unidad de entrada y salida. Permite obtener o mandar datos del/al exterior. Las vıasde comunicacion con el mundo externo son los perifericos, que es el nombre genericodado 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 lafigura 1.3. Hay que resaltar, que la comunicacion entre bloques es de dos tipos: datos y senalesde control. Dentro de los datos se incluye todo tipo de informacion adecuadamente representadaincluyendo la informacion proporcionada (datos en sentido habitual), la informacion procesada(los resultados) y otros.

Las senales de control son ordenes que la UC manda a los distintos elementos para que serealicen las operaciones. La UC y la UAL forman la unidad central de proceso (UCP), que esel responsable de la ejecucion del programa. La memoria tiene un papel pasivo proporcionandolos datos e instrucciones cuando son solicitados por la UCP.

Tema 2

Codificacion binaria de la

informacion

Se ha indicado en el tema introductorio que las computadoras digitales solo manejan informacionen forma de ceros y unos. Esto es ası porque los dispositivos electronicos usados para construirlas computadoras digitales se disenan para trabajar en torno a dos valores de tension. Uno deellos se asocia con el estado 1 y el otro con el 0. Estos circuitos son capaces de cobijar los valorescero y uno por lo que constituyen celdas de memoria que almacenan estos valores binarios.

Sin embargo estamos acostumbrados a ver que las computadoras permiten utilizar infor-macion de muchos tipos: texto, graficos, sonidos. Se mostrara en este tema que para poderrepresentar la informacion con ceros y unos es necesario usar un codigo.

2.1 Sistema binario de numeracion

Los numeros se pueden expresar en distintos sistemas de numeracion. Como es sabido, el masusual es el sistema en base 10. En este sistema, llamado decimal, se interpretan las cifras comocoeficientes de un polinomio en potencias de 10:

D |10)= dn · 10n + · · ·+ d1 · 101 + d0 · 100

donde los dıgitos dn a d0 constituyen el numero en base 10. Para aclarar ideas considerese elnumero 1492. En base 10 se interpreta como: un millar mas cuatro centenas mas nueve decenasmas 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 setrabaja con cifras del 0 al 9. En el sistema binario la base es el 2, por lo que solo existen dosposibles coeficientes: el cero y el uno. La interpretacion de un numero escrito en base dos es la

15

16 TEMA 2. CODIFICACION BINARIA DE LA INFORMACION

misma que en decimal, pero cambiando la base:

B |2)= bn · 2n + · · ·+ b1 · 21 + b0 · 20 (2.1)

ası el numero 01001 en base dos (indicado frecuentemente como 01001 |2)) se interpreta como lacantidad

01001 |2)= 0 · 24 + 1 · 23 + 0 · 22 + 0 · 21 + 1 · 20 = 9 |10)

Observese que se ha indicado la base utilizada mediante un subındice. Habitualmente setrabaja en base 10, por lo que se omite dicho subındice. A los coeficientes di de la representaciondigital se les llama dıgitos, a los de la binaria bi se les llama bits1.

Los sistemas decimal y binario son solo dos ejemplos de una infinidad de posibles sistemascon base b . En general, el Teorema Fundamental de la Numeracion proporciona el valor deci-mal de una cantidad expresada en base b por ciertas cifras. Pero antes de presentar la formulageneral conviene considerar algunos casos particulares. Por ejemplo, la cantidad 23.75 es inter-pretada como dos decenas mas tres unidades mas 7 decimas mas cinco centesimas. En notacionmatematica esto se expresa mediante

23.75 = 2 · 101 + 3 · 100 + 7 · 10−1 + 5 · 10−2

A menudo una cantidad como 23.75 se descompone en dos: la llamada parte entera (23) y laparte fraccionaria (.75). La parte entera queda a la izquierda del punto usado como separadory representa unidades completas. La parte fraccionaria queda a la derecha del punto y repre-senta una cantidad menor que una unidad, de ahı el nombre de fraccionaria. La parte enteracontiene los coeficientes que multiplican a potencias no negativas. La parte fraccionaria abarcalos coeficientes de potencias negativas.

En otros sistemas de numeracion tambien pueden usarse potencias positivas y negativas dela base. Por ejemplo en binario o base dos la cantidad 10.11 |2) tiene parte entera 10 |2) y partefraccionaria .11 |2). La cantidad representada en decimal es

1 · 21 + 0 · 20 + 1 · 2−1 + 0 · 2−2 = 2 + 0 +1

2+

1

4= 2 + 0.5 + 0.25 = 2.75 |10)

Observese que la parte entera es 2 y la parte fraccionaria es .75 y que por otro lado 10 |2)=2 |10) y .11 |2)= .75 |10). Es decir las cantidades indicadas por las partes entera y fraccionariano se modifican al cambiar de base.

Ahora ya se puede dar el salto a una formula general. Sean los guarismos gi que representanun numero G en base b de tal modo que

G |b)= gpgp−1 · · · g0.g−1 · · · g−n,

donde el punto separa la parte entera de la fraccionaria (en la base en cuestion), entonces segunel Teorema Fundamental de la Numeracion el valor decimal es

D |10)=i=p∑

i=−n

gi · bi (2.2)

1del ingles binary digit

c© M.R. Arahal 2009 DISA. ESI. US. 17

Como ejemplo tomese 32.6 |5), es decir, el numero 32.6 en base 5. La cantidad que representadicho numero expresada en el sistema decimal es

D |10)= 3 · 51 + 2 · 50 + 6 · 5−1 = 15 + 2 +6

5= 18.2 |10)

De este modo se puede concluir que 32.6 |5)= 18.2 |10).

El funcionamiento de las computadoras actuales esta basado en el uso del sistema de nume-racion binario. Otros sistemas que han tenido cierta importancia son el octal, cuya base es 8 ypor tanto usa las las cifras del 0 al 7 y el hexadecimal, de base 16. Este ultimo sistema planteaun problema a la hora de escribir numeros y es que son necesarios 16 dıgitos distintos. En elsistema decimal solo hay diez dıgitos: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. Para obtener los restantes seisdıgitos se utilizan las letras A, B, C, D, E y F para representar los valores 10, 11, 12, 13, 14y 15 respectivamente. De este modo 3E.1 |16) representa la siguiente cantidad expresada en elsistema decimal

3 · 161 + 14 · 160 + 1 · 16−1 = 48 + 14 +1

16= 62.0625 |10)

2.1.1 Conversiones

Las conversiones permiten obtener las cifras correspondientes a una misma cantidad en distintasbases. En informatica la conversion mas usada es la de decimal a binario y viceversa, por ellose van a describir con detalle.

Al realizar una conversion 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 numero en base dos, es facil hallar su equivalente decimal sin mas que aplicar larelacion (2.2). Es decir, realizando la suma de potencias de dos. Por ejemplo el numero 1 |2)equivale a 1 · 20 que es el uno en base 10, por tanto 1 |2)= 1 |10). Del mismo modo se obtieneque 101 |2)= 1 · 22 + 0 · 21 + 1 · 20 = 5 |10).

El paso contrario, es decir, el paso de de decimal a binario, es mas elaborado y por ello sevan a tratar en primer lugar las cantidades enteras. Una posibilidad es dividir sucesivamenteel numero por dos. Los restos de las divisiones dan el numero en binario, leıdos en sentidoascendente, tal como se muestra en la figura 2.1 donde se obtiene la representacion en base dosdel numero 214 |10). Una vez obtenida la representacion binaria resulta facil comprobar que elresultado es el correcto sin mas que aplicar la formula 2.2 lo cual debe dar como resultado elnumero original. Compruebe que este es el caso para el ejemplo de la figura 2.1.

Resulta interesante conocer las potencias de dos de ciertos numeros para ası realizar conver-siones de forma rapida sin usar la regla de la division.

18 TEMA 2. CODIFICACION BINARIA DE LA INFORMACION

22

22

22

2

11010110 12

214107

5326

136

301

01

10

1 10

Figura 2.1: Metodo de la division larga para la conversion de base 10 a base 2.

potencia decimal binario20 1 121 2 1022 4 10023 8 100024 16 1000025 32 10000026 64 100000027 128 1000000028 256 10000000029 512 1000000000210 1024 10000000000

Ciertas conversiones resultan comodas de este modo. Por ejemplo, para pasar a binario elnumero decimal 18 basta con observar que 18 |10)= 16+2 y por tanto igual a 24 +21, por lo quela representacion en base dos resulta 10000 |2) +10 |2)= 10010 |2); es decir, 18 |10)= 10010 |2).

Los numeros fraccionarios tambien pueden pasarse con facilidad de base 10 a base 2. En talcaso se han de calcular los coeficientes de una suma de potencias con exponentes negativos. Paraello en lugar de la division se usa el metodo de la multiplicacion. El metodo se presenta facilmentecon la ayuda de un ejemplo. Considere el numero en decimal 0.6875 |10). Si se multiplica por dosresulta 0.6875 |10) ·2 = 1.375 |10) que tiene parte entera igual a 1. Esto significa que el numero0.6875 |10) contiene a la primera potencia negativa de dos que es 2−1 |10)= 0.5 |10). Este 1 setoma como parte de la expresion binaria. El proceso continua tomando la parte decimal restantey volviendo a multiplicar por dos. Esto se repite hasta que desaparezcan todos los decimales.La tabla siguiente muestra el resultado para la cantidad tomada como ejemplo

cantidad cantidad × 2 parte entera parte fraccionaria0.6875 1.375 1 0.3750.375 0.75 0 0.750.750 1.5 1 0.50.5 1 1 0

Los coeficientes fraccionarios de la representacion binaria se obtienen de la tercera columna.De este modo se puede afirmar que 0.6875 |10)= 0.1011 |2). En efecto, basta con comprobar quela suma de potencias 0 · 20 + 1 · 2−1 + 0 · 2−2 + 1 · 2−3 + 1 · 2−4 es igual a la cantidad 0.6875 |10).

La relacion del metodo de la multiplicacion con el metodo de la division es evidente con ladiferencia de que en lugar de los restos se van tomando las partes enteras resultantes.

c© M.R. Arahal 2009 DISA. ESI. US. 19

Dado que el metodo de la division permite pasar a binario cantidades decimales enteras yel de la multiplicacion cantidades decimales fraccionarias se esta ya en condiciones de pasar abinario cualquier cantidad representada en sistema decimal. Tomese por ejemplo la cantidaddecimal 278.5625 |10), la parte entera se puede expresar como 278 |10)= 100010110 |2), mientrasque la parte fraccionaria es .5625 |10)= .1001 |2) por lo que 278.5625 |10)= 100010110.1001 |2).

Para finalizar conviene llamar la atencion sobre el numero de coeficientes fraccionarios en lasdistintas representaciones de una cantidad. En los ejemplos mostrados no se necesitan infinitoscoeficientes para expresar las cantidades consideradas. Esto no siempre es ası y un simpleejemplo lo deja bien claro. Considere el numero 0.1 |3) es decir 0.1 en base 3. Pasando a decimalse tiene que

0.1 |3)= 0 · 30 + 1 · 3−1 = 0 +1

3|10)

como es sabido la cantidad 13 expresada en el sistema decimal tiene infinitos decimales por

lo que no es posible representarla a menos que se use algun truco como escribir 1.33. En lacomputadora lo normal es escribir tantos decimales como sea posible dentro de la memoria.Este problema se tratara mas adelante en este tema.

2.2 Codificacion de numeros enteros

La memoria de una computadora esta formada por muchas celulas elementales agrupadas enregistros. Cada celda solo pueden representar los numeros 0 o 1, pero al considerar un grupo deellas (el registro) se pueden codificar numeros mayores.

Para representar un numero entero positivo mediante un conjunto de bits se puede usar lacodificacion del numero en base 2. De este modo, si se dispone de registros de 16 celdas esposible almacenar los numeros entre el 0 y el 216 − 1 = 65535. Si el numero de celdas es mayor,digamos 20, es posible ampliar el intervalo representable desde cero hasta 220 − 1 = 1048575.

La computadoras digitales utilizan registros de una anchura determinada, por lo que existenlımites a los numeros que es posible representar. Este hecho caracterıstico de los sistemasdigitales no sorprendera a quien haya utilizado una calculadora.

La representacion mostrada que utiliza la base dos es facil de entender y de usar, por lo quees largamente utilizada. Ahora bien, ¿y los numeros negativos?. El signo menos tendrıa quepoder expresarse como un cero o un uno. La idea mas simple es usar la celda mas a la izquierdadel registro para indicar el signo del numero. Esta y otras posibles representaciones se explicana continuacion.

1. Modo signo-valor absoluto. Se reserva una celda del registro (normalmente la que estamas a la izquierda) para el signo. Los numeros positivos tienen un valor 0 para el bit queocupa esa celda y los negativos un valor 1. Este sistema queda descrito de forma graficadel siguiente modo:

20 TEMA 2. CODIFICACION BINARIA DE LA INFORMACION

︸︷︷︸s

. . .︸ ︷︷ ︸va

donde s simboliza el bit de signo, y va la representacion en base dos del valor absoluto.

De este modo, con un registro de 16 unidades se pueden representar los numeros del−32767 hasta el 32767. En general, para un numero de bits en la palabra igual a n sepueden representar los enteros comprendidos en el intervalo

[−(2n−1 − 1), 2n−1 − 1

].

Como ejemplo considerense la codificacion en un registro de 8 celdas de los numeros 5 y -4:5 = 00000101 , -4= 10000100

El numero de celdas n del registro afecta a la representacion de los negativos, pues el bitde signo debe quedar a la izquierda. A modo de ejemplo vease la representacion de losnumeros 5 y −4 codificados en un registro de 6 celdas

5 = 000101 , -4= 100100

Otra caracterıstica de este sistema es que tiene dos ceros: el positivo 0 00 . . . 0 y el

negativo 1 00 . . . 0 , que, logicamente, representan la misma cantidad, cero.

2. Complemento a 1. Nuevamente se reserva el primer bit para el signo. El resto de lacodificacion es: el numero en base dos si el signo es positivo o el complemento bit a bitdel valor absoluto si el signo es negativo. Es decir, los numeros positivos se representanigual que en el sistema anterior, mientras que, los negativos sufren el cambio de los unospor ceros y los ceros por unos (excepto el bit de signo).

Si se utilizan ocho celdas, los numeros 5 y -4 se representan en complemento a uno delsiguiente modo:

5 = 00000101 , -4= 11111011

Utilizando seis celdas resulta:5 = 000101 , -4= 111011

Este sistema tambien tiene dos ceros: el positivo 00 . . . 0 y el negativo 11 . . . 1 . Paraun numero de celdas del registro igual a n se pueden representar los enteros comprendidosen el intervalo

[−(2n−1 − 1), 2n−1 − 1

].

3. Complemento a 2. Los dos sistemas anteriormente vistos presentan dificultades a lahora de realizar sumas y restas mediante circuitos logicos, por lo que se ha buscado otrometodo. El complemento a dos de un numero es igual al complemento a uno mas uno;es decir, los numeros positivos se representan igual que en el sistema signo-valor absoluto,pero los numeros negativos se codifican con el bit de signo igual a uno y el resto como 1mas el complemento bit a bit del valor absoluto en base dos. Los numeros negativos serepresentan pues igual que en complemento a 1 sumandoles 1.

El ejemplo habitual con ocho celdas queda:5 = 00000101 , -4= 11111100

mientras que utilizando seis celdas resulta:5 = 000101 , -4= 111100

Los numeros que se pueden representar usando un registro de n celulas son los enteroscomprendidos en el intervalo:

[−2n−1, 2n−1 − 1

]. Se observa que en el lado de los negativos

c© M.R. Arahal 2009 DISA. ESI. US. 21

hay un numero mas. Esto es consecuencia de que solo existe un cero: 00 . . . 0 que usa elespacio de un numero positivo. El numero −2n−1 tiene siempre la representacion especial10 · · · 0 que corresponde al cero negativo en los metodos anteriores.

2.3 Codificacion de caracteres

Muchas veces la informacion que la computadora ha de procesar no son numeros sino caracterestextuales tales como:

• Letras mayusculas y minusculas.

• Dıgitos. Para escribir las cifras de un telefono, o la hora, o numeros.

• Signos: ? ( ) , { } ♥ [ ] + $ . . .

• Codigos sin representacion grafica, pero con funciones de control, por ejemplo el retornode carro de la impresora, el aviso sonoro, los codigos de mensaje recibido, fin de mensaje,fin de archivo, etc. que se transmiten entre dispositivos.

Para transmitir y almacenar informacion de este tipo se creo el ASCII (American StandardCode for Information Interchange), que es un codigo que asigna arbitrariamente un numeroentero a cada signo. Los numeros son luego representados en base dos para poder ser tratadospor la computadora.

El ASCII usa 7 bits, por lo que se pueden representar 27 = 128 signos distintos. Estos inclu-yen numeros, el alfabeto ingles en mayusculas y minusculas, signos matematicos y de puntuaciony algunos caracteres de control. Una version posterior de este codigo es el ASCII extendido, queusa 8 bits, por lo que se pueden representar 256 signos. Esto pemite incluir la letra n y otras dediversos alfabetos.

El conjunto de signos incluidos en el codigo recibe el nombre de tabla ascii. En la tabla2.1 se muestran los codigos ascii correspondientes a algunos caracteres. Observese que las letrasvan en orden alfabetico a excepcion de la letra n. Las mayusculas estan colocadas en la tablaantes que las minusculas. Tambien es de interes observar que existen codigos sin representaciongrafica, que se han marcado como cc pues son codigos de control.

Los caracteres de control son combinaciones de ocho dıgitos binarios, al igual que el restode la tabla ASCII. Lo que los hace en cierto modo especiales es el modo en que los perifericoslos usan. Al contrario que las letras y signos que aparecen por la pantalla o la impresora, loscodigos de control realizan cierta funcion sobre el dispositivo. La tabla 2.2 resume algunas de lasfunciones mas usadas. La primera columna indica el numero dentro de la tabla ascii, la segundaes un nombre abreviado de la funcion que realiza, la cual se explica en la tercera columna.

22 TEMA 2. CODIFICACION BINARIA DE LA INFORMACION

Nro. Signo

0 cc

1 cc

2 cc

3 cc...

...

46 .47 /

Nro. Signo

48 049 150 251 3

......

57 958 :

Nro. Signo

63 ?64 @65 A66 B67 C

......

90 Z

Nro. Signo...

...

97 a98 b99 c

100 d101 e102 f

Nro. Signo...

...

161 ı162 o163 u164 n

165 N166 a

Tabla 2.1: Fragmentos de la tabla ASCII. Los signos indicados como cc son caracteres noimprimibles.

Transmisiones Pantalla o impresora1 SOH comienzo de cabecera 7 BEL senal audible2 STX comienzo de texto 8 BS retroceso3 ETX fin de texto 9 HT tabulacion horizontal4 EOT fin de la transmision 10 LF avance de lınea5 ENQ peticion de transmision 11 VT tabulacion vertical6 ACK reconicimiento de transmision 13 CR retorno de carro

Tabla 2.2: Algunos codigos de control.

2.4 Numeros fraccionarios

En el sistema decimal de numeracion las cantidades no enteras se indican mediante potenciasnegativas de la base. De este modo la cantidad 3.2 |10) es interpretada como 3 unidades mas dosdecimas.

Los numeros con parte no entera tambien se pueden expresar en binario, usando para ellopotencias negativas de dos. Por ejemplo, el numero 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 fraccionario yde interpretarlo. A continuacion se describen dos posibles soluciones.

2.4.1 Punto fijo

Se reservan algunas celdas del registro para la parte entera del numero en binario y otras parala fraccionaria; es decir, a partir de una posicion predeterminada, los coeficientes multiplicanpotencias negativas de dos. Este sistema queda descrito de forma grafica del siguiente modo:

2p 21 20 2−1 2−2 2−q

· · · . · · ·

c© M.R. Arahal 2009 DISA. ESI. US. 23

donde se han reservado p + 1 celdas para la parte entera y q para la fraccionaria. No se hatenido en cuenta el problema del signo.

Considerese a modo de ejemplo que se tiene un registro de ocho celdas, y el punto decimalesta colocado antes de las dos ultimas celdas, entonces el registro

00000110

se interpreta como el numero 000001.10 |2) que representa la cantidad dada por

1 · 20 + 1 · 2−1 = 1.5 |10)

Del mismo modo, el registro00001001

representa el numero 000010.01 |2) que corresponde a la cantidad decimal 2.25 |10).

Los circuitos de la UAL se construyen de forma que cada parte del registro es tratadacorrectamente de acuerdo a la posicion del punto decimal que es fija. Las operaciones se realizanadecuadamente en cada parte del registro.

En una computadora de punto fijo el numero de coeficientes fraccionarios q es fijo por lapropria construccion de los circuitos y no se puede cambiar. Esto es un problema pues no sepuede trabajar con numeros muy dispares (por ejemplo 25000.0 y 0.0003). Para comprenderesta afirmacion piense que n = p + q + 1 es un numero prefijado por la tecnlogıa del momento.Hace anos se utilizaban computadoras con n = 8 de forma casi exclusiva. Con el paso del tiempose ha avanzado pasando por n = 16, n = 32 y recientemente n = 64. En cualquier caso si sedecide incrementar q eso conlleva un decremento de p y viceversa. Debido a esto, este sistemade punto fijo se usa poco en la actualidad.

2.4.2 Punto flotante

El numero (N) a representar se transforma en la pareja (M, E) de forma que N = M · 2E .La primera cantidad, M es llamada mantisa, la segunda E el exponente. Puesto que existenmuchas combinaciones de M y E que cumplen N = M · 2E se eligen adecuadamente de acuerdocon alguna regla. Las mas comunes exigen que 0.5 ≤|M |< 1, por lo que representacion binariade |M | comienza por 0.1 |2). De este modo queda fijado M y por tanto E.

Para aclarar el metodo es mejor pensar en la representacion decimal. Un numero en basediez con decimales tal y como 340.126 puede expresarse como 3.40126 ·102 o como 0.0340126 ·104

o como 0.340126 · 103.

Se denomina ajuste fraccionario o normalizacion al proceso de seleccion de la mantisay el exponente de forma que cumpla con las especificaciones. La normalizacion tiene por objetoelegir una de las muchas posibles parejas de mantisa y exponente. Una normalizacion muyusada consiste en imponer que la mantisa tenga parte entera nula y que su primer coeficientefraccionario no lo sea. Aplicando esta regla al ejemplo decimal anterior se tiene que 0.340126·103

es la representacion correcta pues la mantisa cumple las normas establecidas.

24 TEMA 2. CODIFICACION BINARIA DE LA INFORMACION

2

-1

5

Figura 2.2: Representacion de un vector de enteros en la memoria

Una vez que el ajuste fraccionario o normalizacion se ha llevado a cabo cada numero M y Ese codifica en un trozo de registro. Queda por resolver el problema de representar el signo tantode la mantisa como del exponente. Para ello basta con utilizar alguno de los metodos vistos,como el signo-valor absoluto o complemento a dos.

Existen varios formatos de punto flotante con sus reglas especıficas como IEEE 754. No se vaa describir con detalle ninguno de estos formatos, baste saber que todos ellos son muy similaresal caso comentado, que puede mostrarse de forma grafica como:

S . ...︸ ︷︷ ︸

mantisa

S ...︸ ︷︷ ︸

exponente

Dado un numero n de celdas el punto flotante permite representar la misma cantidad devalores que el punto fijo pues las posibles combinaciones con n son las mismas. Ahora bien,el intervalo de valores representables es mayor en punto flotante, pues el exponente permitealcanzar numeros muy altos si es positivo o muy cercanos a cero si es negativo. Esta es la granventaja del punto flotante frente al fijo y la razon de su uso.

2.5 Otros tipos de informacion

2.5.1 Vectores

Los vectores son conjuntos de elementos del mismo tipo. Por ejemplo un vector de numerosenteros de dimension tres no es mas que un trıo de numeros enteros. Para representar unvector en la computadora se pueden usar varias tecnicas. La mas simple consiste en colocar loselementos del vector en la memoria de forma individual, pero ocupando registros consecutivoss.De este modo el vector de enteros v = (2,−1, 5) se representa simplemente colocando en tresregistros de la memoria los numeros enteros 2, -1 y 5 como se indica en la figura 2.2.

Para manejar los vectores basta con saber cual es el primer registro utilizado y cual es ladimension del vector. Con estos dos datos es posible acceder a cada uno de los elementos delvector.

2.5.2 Matrices

Las matrices con conjuntos bidimensionales de elementos del mismo tipo. Se pueden considerarcomo vectores cuyos elementos son vectores. La forma mas simple de representar las matricesen una computadora consiste en colocar los elementos por filas. Cada fila es considerada un

c© M.R. Arahal 2009 DISA. ESI. US. 25

1

0

-2

4

5

6

Figura 2.3: Representacion de una matriz de enteros 2× 3 en la memoria

Figura 2.4: La imagen de la izquierda puede describirse usando una matriz de valores binarioscomo la de la derecha.

vector y por tanto sus elementos son colocados en registros consecutivos de la memoria. La filasiguiente ocupa un espacio consecutivo a la fila anterior. A modo de ejemplo considere la matriz:

A =

(1 0 −24 5 6

)

En la figura 2.3 puede verse la matriz A2× 3 (dos filas y tres columnas) de enteros colocadaen la memoria.

2.5.3 Formatos graficos

Las imagenes pueden representarse mediante conjunto de puntos con un color o tonalidad de grisdado. Esta es la idea usada por formatos graficos denominados matrices de puntos (llamadosen ingles formatos raster y bitmapped). En la figura 2.4 se representa una silueta en blanco ynegro descrita mediante una matriz de unos y ceros. El cero indica un punto luminoso y el unoun punto oscuro. Resulta imaginable que teniendo una matriz con muchos elementos se puedenconseguir imagenes de gran calidad.

Las imagenes resultantes son en blanco puro y negro puro, como siluetas. Para conseguirgrises se puede definir la misma matriz conteniendo numeros del 0 al 255, de forma que a cadanivel de gris le corresponde un numero, siendo 0 el negro y 255 el blanco. Cada elemento de lamatriz ahora no es un bit, sino un caracter (8 bits). Para obtener el color se puede realizar lamisma operacion 3 veces, una para cada color rojo, verde y azul.

Este formato precisa mucha memoria, por ejemplo, para almacenar una imagen en colorde 200 × 200 puntos con ocho bits para cada color se necesitan 200 × 200 × 3 × 8 bits, queaproximadamente son 117 kilocaracteres (Kc o Kilobytes Kb).

26 TEMA 2. CODIFICACION BINARIA DE LA INFORMACION

7.500 slw% Ellipsen 900 1050 525 300 0 360 DrawEllipse gs col-1 s gr

% Polylinen 615 270 m 2100 1200 l gs col-1 s gr

Figura 2.5: Descripcion de una imagen (izquierda) en forma vectorial mediante PostScript.

Un metodo alternativo consiste en describir la imagen mediante ecuaciones correspondientesa lıneas, superficies, etc, de forma que la union de las partes produzca (aproximadamente) laimagen total. Se habla entonces de graficos vectoriales. La codificacion de la imagen sereduce a la de las ecuaciones de las partes. Estas ecuaciones pueden representarse de muchasformas. Por ejemplo un segmento queda perfectamente definido por las coordenadas de suspuntos extremos, una circunferencia por las de su centro y un punto de la misma, etc.

A modo de ejemplo considerese el dibujo de la figura 2.5 consistente en un segmento y unaelipse. Utilizando el formato PostScript estos elementos quedan definidos en la forma en que semuestra a la derecha.

Los graficos vectoriales son adecuados para dibujos formados por elementos geometricossimples. Ambos metodos (matrices de puntos y graficos vectoriales) se combinan en los formatosdenominados meta archivos (metafiles), usados por muchos programas para poder incluir objetosformados por lıneas precisas, como planos y esquemas, junto a otros que quedan mejor descritosmediante una matriz de puntos como fotografıas.

2.6 Ejercicios propuestos

Los siguientes ejercicios sirven para consolidar las ideas mas importantes de este tema.

1. Escriba todos los numeros enteros que se pueden representar mediante el sistema signo-valor absoluto utilizando registros de cuatro celdas. Indique la cantidad representada porcada numero.

2. Repita el ejercicio anterior usando el sistema de representacion en complemento a dos paralas cantidades negativas.

3. En la tabla siguiente los numeros de cada fila representan una misma cantidad y en cadacolumna un mismo sistema de representacion. En todos los casos las representacionesbinarias emplean 8 celdas. Complete la tabla indicando los valores adecuados.

c© M.R. Arahal 2009 DISA. ESI. US. 27

Decimal Signo-Valor Absoluto Complemento a uno Complemento a dos

-31

1 0 0 0 1 0 1 1

0 1 0 0 1 0 1 0

1 0 1 0 1 0 1 1

4. En la tabla de siguiente los numeros de cada fila representan una misma cantidad y encada columna un mismo sistema de representacion. En todos los casos las representacionesbinarias emplean 10 celdas. Para el punto fijo se utiliza el sistema signo-valor absoluto.Para ello ha de tomarse 1 celda de signo mas 5 celdas de parte entera y 4 celdas de partefraccionaria. Para el punto flotante tenga en cuenta que la mantisa es un numero de puntofijo con 1 celda de signo, 0 celdas de parte entera y 5 de fraccionaria. El exponente esun numero entero expresado en complemento a dos usando en total 4 celdas. El ajustefraccionario de la mantisa se lleva a cabo de tal modo que el coeficiente de la primerapotencia fraccionaria sea 1. Complete las casillas vacıas de la tabla indicando los valoresadecuados.

Decimal Complemento a dos Punto fijo Punto flotante

23

1 0 0 0 0 0 0 1 0 0

0 1 1 0 0 0 0 1 1 1

1 1 1 0 1 1 0 0 1 0

-8.625

28 TEMA 2. CODIFICACION BINARIA DE LA INFORMACION

Tema 3

Estructura de la computadora digital

En este tema se va a profundizar en el estudio de las distintas partes funcionales de la compu-tadora, comenzando por la memoria y terminando con la unidad de control. Posteriormente seexplicara en que forma funciona el conjunto.

3.1 Esquema funcional

Como se avanzo en el tema 1, la computadora digital esta formada por varias unidades contareas claramente diferenciadas como puede verse en el diagrama de bloques de la figura 3.1.Observe que las flechas que unen los bloques son de dos tipos. La razon de esta diferencia esresaltar, que la comunicacion entre bloques es de dos tipos: informacion y senales de control. Laprimera categorıa, la informacion, abarca los datos, los resultados y otras informaciones comodirecciones de memoria, estados, etc. La segunda categorıa, las senales de control son ordenesque la UC manda a los distintos elementos para que se realicen las operaciones.

Se vera mas adelante que la UC y la UAL forman la unidad central de proceso (UCP), que esla responsable de la ejecucion del programa. La memoria tiene un papel pasivo proporcionandolos datos e instrucciones cuando son solicitados por la UCP.

UALprincipal

Unidad de control

unid

ad d

e en

trad

a/sa

lida

Periféfico 1

Periférico n

Memoria

información

señalesde control

Figura 3.1: Modelo de Von Neumann de la computadora digital.

29

30 TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL

3.2 La memoria

El tratamiento automatico de la informacion requiere el almacenamiento de la misma de formamas o menos permanente. La memoria en una computadora es un dispositivo capaz de almace-nar informacion. Para servir a los propositos del tratamiento automatico de la informacion lamemoria ha de ser capaz de recuperar cualquier informacion, proporcionandola al exterior solocuando sea solicitada. Para resolver este problema se han propuesto historicamente solucionesdiversas muy imaginativas como lıneas de retraso, tubos de mercurio y nucleos de ferrita.

Como ya se ha dicho, las computadoras digitales trabajan con datos binarios, por lo quela memoria debe poder guardar variables que toman dos valores: 0 o 1. Para ello basta conagrupar celdas elementales formando registros. Los registros se apilan para formar bloquesmayores, como resultado las memorias actuales tienen capacidad para varios millones de bits.

En el esquema funcional de Von Neumann (vease la figura 3.1) la memoria es el bloque quealmacena tanto los datos y resultados como las instrucciones. A peticion de la unidad de controlla memoria es capaz de realizar dos operaciones:

• Lectura. Consiste en extraer una copia de cierta informacion. En la mayorıa de las compu-tadoras tal informacion pueden leerse cuantas veces se desee, pues no es destruida por elproceso de lectura.

• Escritura. La escritura permite almacenar informacion dentro de la memoria. Los datosque se van a almacenar ocuparan algunas celdas de la memoria que previamente contenıanotros valores, por lo tanto el proceso de escritura siempre conlleva la desaparicion de losdatos que ocupaban el lugar donde se introducen los nuevos.

Esta memoria es llamada hoy en dıa memoria interna y es la que contiene el programadurante su ejecucion. En la actualidad se compone de circuitos integrados y por este motivo seles llama memorias de silicio por ser este elemento la base de los dichos circuitos electronicos.Ademas de la memoria interna existen dispositivos de memoria auxiliares como el disco duro ylos discos opticos (CD, DVD, etc.).

3.2.1 Caracterısticas de las memorias

En la historia de las computadoras se han usado muchos dispositivos para almacenar informacion.En la actualidad se usan circuitos integrados, discos magneticos y discos opticos. Cualquieraque sea el soporte de la informacion la memoria queda definida por ciertas propiedades o carac-terısticas como son:

• Tiempo de acceso. Es el que transcurre entre el instante en que se ordena la lectura/escriturade una informacion y el momento en que esta disponible para su procesamiento. Interesaque sea lo mas bajo posible, no obstante este requerimiento entra en conflicto con el coste.

• Capacidad. Es el numero de unidades de informacion que puede almacenar una memoria.Como suelen ser numeros muy altos se usan multiplos como kilo y mega.

c© M.R. Arahal 2009 DISA. ESI. US. 31

• Modo de acceso. Hay varias formas en las que se puede accceder a la informacion, entrelas que destacan el acceso directo y el secuencial, que se definen a continuacion.

Acceso directo. Para llegar a una determinada informacion no es preciso pasar por lasanteriores. Este modo es tambien llamado aleatorio. El tiempo invertido en el accesoes independiente de donde se encuentre la informacion. Las memorias que empleaneste tipo de acceso se denominan genericamenete RAM, del ingles Random AccessMemory.

Acceso secuencial. En este tipo de acceso, para llegar a un dato hay que dejar pasarla informacion que le precede. Esto es lo que sucede, por ejemplo, cuando se usa unacinta magnetica.

• Volatilidad. La informacion almacenada en una memoria es volatil si puede destruirse oalterarse al cesar el suministro de energıa al dispositivo que constituye la memoria. Estaes la situacion normal en memorias de semiconductores, que necesitan suministro electricopara conservar los datos. Los discos y cintas son por contra no volatiles.

3.2.2 Medidas de capacidad

Las memorias como se ve pueden ser de muchos tipos, la mas importante para nuestro estudiode la computadora digital es la memoria principal. En los equipos actuales esta memoria estarealizada mediante circuitos semiconductores que forman puertas logicas. De este modo surge lacelda que da cobijo a la unidad fundamental de informacion. Estos y otros conceptos se definena continuacion.

• Bit. Se denomina bit a la unidad elemental de informacion binaria. El bit es la informacioncontenida en una celula de memoria, es decir, un cero o un uno. Cualquier informacionbinaria puede codificarse mediante una cadena de bits mas o menos larga.

• Caracter. Las celulas de memoria se suelen agrupar formando registros. Una agrupacionmuy usada es la formada por ocho celulas, denominada octeto. La informacion cons-tituida por ocho bits, y que se puede almacenar en un octeto se llama caracter o, maspopularmente, byte.

• Palabra. Los registros de una computadora estan formados por cierto numero de bits, losmas usuales son de 16, 32 y 64 unidades. La informacion almacenada en un registro sedenomina palabra.

Se ha de notar la diferencia entre unidades de informacion: bit, caracer y palabra, y elsoporte donde se guardan: unidad de memoria, octeto y registro, respectivamente.

Al tratar con memorias la unidad basica suele ser el caracter o byte. En terminos informaticoskilo es un prefijo que equivale a 210 = 1024 unidades, pues es la potencia exacta de dos masproxima a mil. Del mismo modo, mega equivale a 220 = 1048576 unidades. En la tabla siguientese muestran algunos tamanos de memorias expresados de varios modos.

32 TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL

abreviatura cantidad bits caracteres

1 Kc kilocaracter 8 · 210 210

1 Mc megacaracter 8 · 220 220

1 Gc gigacaracter 8 · 230 230

1 Tc teracaracter 8 · 240 240

3.2.3 Clases de memoria

Aunque el esquema de la figura 3.1 no lo muestra, el hecho es que existen dentro de la compu-tadora varias clases de memoria, atendiendo cada una a una mision particular. En esta seccionse enumeran algunos de los tipos mas habituales de memoria.

• Memoria principal. Es la que contiene el programa en el momento de la ejecucion delmismo. Suele estar constituida por circuitos integrados, que es la forma de almacenamientomas rapida. En la mayorıa de los casos es de tipo volatil y de acceso directo. Esta memoriasuele ser expansible a voluntad del operario; para ello basta con anadir mas circuitosintegrados en el interior de la computadora.

• Memoria auxiliar. La memoria auxiliar es un dispositivo externo1 que contiene infor-macion. Entre otros pueden citarse el disco duro, el disco optico y los discos flexibles.Son llamadas tambien memorias masivas. La velocidad de acceso suele ser menor que lade la memoria principal, pero la capacidad de almacenamiento mayor. Al ser un periferico,el trasvase de datos entre la memoria auxiliar requiere un adaptador que es la unidad deentrada y salida (vease figura 3.1).

3.2.4 Estructura matricial

La memoria principal en los equipos actuales esta constituida por circuitos integrados en cuyointerior residen las celulas basicas de almacenamiento, organizadas en registros como ya se hadicho. Una forma de representar esto es usando una disposicion rectangular a base de filas ycolumnas, como se muestra en la figura 3.2. Cada fila es un registro de n celdas, siendo n elancho del registro llamado tambien longitud de la palabra. El numero de filas N suele ser muyalto como puede suponerse sabiendo la capacidad normal de las memorias actuales que es devarios megacaracteres. Cada registro puede ser seleccionado mediante un hilo2. Para accedera los bits individuales que forman la palabra contenida en el registro se tienen n hilos llamadosde lectura/escritura (abreviadamente l/e).

La lectura se realiza transmitiendo por los hilos de l/e la informacion de cada celda delregistro seleccionado. La escritura realiza el proceso inverso, destruyendo la informacion queresidıa previamente en el registro seleccionado.

Cada registro de la memoria tiene asignado un numero llamado direccion. Es habitualconceder al registro superior el numero 0 y al inferior en numero N − 1, siendo N el numero

1Necesita conexion especial para unirse al resto de modulos.2Termino heredado de los dıas en que las memorias eran de nucleos de ferrita ensartados en los nodos de una

red de hilos conductores.

c© M.R. Arahal 2009 DISA. ESI. US. 33

registro

célula dememoria

hilos deselección

hilos de lectura y escritura

N

n

Figura 3.2: Estructura matricial de la memoria.

total de registros. Para acceder a la informacion de la memoria es preciso conocer la direccionen la que se encuentra. Conocida dicha direccion se puede seleccionar el registro en cuestion yproceder posteriormente a la lectura o escritura.

Por tanto, la seleccion de la informacion es un paso previo a la lectura o escritura y se haceactuando sobre el hilo que correspondiente a la direccion dada. Esto lo realiza el decodificador

de direcciones.

La direccion que se proporciona al decodificador es el numero de la palabra dentro de lamemoria, pero codificado en binario. Si la memoria tiene N = 2m palabras es necesario darleal decodificador un numero en binario entre 0 y 2m − 1. Para expresar este valor hacen faltaprecisamente m dıgitos binarios; es decir, la direccion es un numero binario de m bits.

Para proporcionar al decodificador la direccion se usa un registro llamado de seleccion dedireccion que puede verse en la la figura 3.3 junto con el decodificador de direcciones.

m mN = 2

n

10

de d

irec

cion

esde

codi

fica

dor

N-1

Figura 3.3: Diagrama de la memoria organizada matricialmente incluyendo el registro de se-leccion de direcciones y el decodificador.

De la figura 3.3 queda claro que la memoria contiene n · 2m celdas por lo que su capacidades n · 2m bits o bien n · 2m/8 caracteres.

34 TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL

3.2.5 La unidad de memoria central

A modo de resumen, y para hacerse una idea de como se enlazan los elementos vistos hastaahora relativos a las memorias, se analizara la memoria central de una computadora. Esta estaformada por una matriz celular de elementos de memoria, un decodificador de direcciones y unapequena unidad de control que coordina las operaciones necesarias para leer o escribir; todo ellodentro de un circuito integrado. Los bloques funcionales se pueden ver en la figura 3.4, y sedescriben a continuacion.

• S. Es el registro selector de direcciones de memoria. Almacena m bits que representan (enbinario, por supuesto) la direccion del registro a seleccionar.

• LECM, ESCM. Son dos senales de control mediante las cuales la UC ordena escribir o leer.

• T. Es un registro tampon o de almacenamiento temporal que realiza la funcion de antesalade la memoria. Durante una lectura recibe una copia de los n bits contenidos en la posicionseleccionada. Durante la escritura contiene la informacion que se va a escribir.

S

T

Dec

odif

icad

orm

n

LECM

ESCM

direcciones

datos

Figura 3.4: Diagrama de bloques de la memoria central mostrando los registros y senales degobierno.

Para realizar una operacion de lectura o escritura con la estructura anteriormente descrita,es necesario seguir un procedimiento que se detalla a continuacion.

• Lectura. El objetivo final es obtener una copia del contenido de una direccion particular dela memoria. Los pasos a seguir son:

• Seleccionar la direccion que contiene la informacion a recuperar; para ello se ha deintroducir dicha direccion en el registro S.

• Dar la orden de lectura activando LECM; es decir, dando el valor logico 1 a LECM.Con esto se consigue que la palabra seleccionada transfiera una copia de sus bits alregistro T.

• Tomar el contenido del registro T, el cual contiene una copia de la palabra buscada.

• Escritura. La escritura consiste en introducir una informacion dada en una posicion dememoria concreta conocida. Los pasos a seguir son:

c© M.R. Arahal 2009 DISA. ESI. US. 35

• Selecionar la direccion que contiene la informacion a recuperar; para ello se ha deintroducir dicha direccion en el registro S.

• Copiar en T la informacion que se quiere escribir en la memoria. Para ello se usanlos hilos de bit que conectan cada palabra de la memoria con el registro T.

• Activar la senal de escritura haciendo ESCM=1.

3.3 La unidad aritmetico-logica

Utilizando circuitos electronicos es posible combinar el contenido de dos registros de memoriade forma que se obtenga un tercer registro que guarde alguna relacion con los primeros. Porejemplo 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 quepuede interpretarse como el numero binario 010010 |2) que en decimal es 010010 |2)= 18 |10).Similarmente, el registro 2 contiene los bits 000011 que puede interpretarse como el numerobinario 000011 |2) que en decimal es 000011 |2)= 3 |10). Es facil comprobar que el circuitosumador debe combinar la informacion de ambos registros de tal modo que el registro resultadocontenga 010101 que es la representacion binaria de la cantidad 18 + 3 = 21.

010010 000011 Registro 1 Registro 2

Sumador

010101

Registro resultado

Figura 3.5: Circuito sumador.

Existen circuitos capaces de realizar operaciones aritmeticas como la suma, la resta, etc.Tambien interesan operaciones llamadas logicas. Como ejemplo de operaciones logicas se puedecitar la comparacion de igualdad. Un circuito comparador produce el valor binario 1 si los dosregistros R1 y R2 son iguales y el valor 0 en caso contrario.

La construccion de la UAL se lleva a cabo hoy en dıa en una pastilla de silicio, agrupandouna serie de circuitos con puertas logicas. Estos circuitos son capaces de realizar tareas concretascomo desplazamientos, sumas, comparaciones, etc. La unidad de control que tambien reside enla pastilla puede seleccionar la operacion a efectuar gracias a las senales de control. La activacionde alguna de estas senales provoca la puesta en marcha de la operacion correspondiente.

Los dos operandos provienen de la memoria. Para operar con ellos se saca una copia que seguarda en registros especiales separados de la memoria central . Frecuentemente, en computa-doras y calculadoras, el resultado de las operaciones se almacena en un registro A que recibe

36 TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL

Señales decontrol.

A

segundo operando

MULTSUMA

estado

···primer operando

Figura 3.6: Esquema de la Unidad Aritmetico Logica mostrando el acumulador y las senales degobierno. Las lıneas que unen los registros consisten en realidad en uniones de n vıas, siendo nel numero de celdas de los registros.

el nombre de registro acumulador. Para reducir el tamano de la UAL, el acumulador es amenudo tambien el soporte de uno de los operandos.

La UAL recibe ordenes de la unidad de control que especifican la operacion a realizar conlos datos del acumulador y del registro de operando. El resultado de las operaciones queda enel 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 bloquecon 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 consideraen el interior de dicho bloque por lo que no se ha dibujado.

Para realizar una operacion con dos operandos, como por ejemplo la suma, se procede delsiguiente modo:

1. El primer operando se lleva a la entrada de la UAL

2. Se pasa el primer operando al acumulador mediante la senal de control CARGA

3. Se lleva el segundo operando a la entrada de la UAL

4. Se realiza la operacion activando la senal correspondiente en este caso SUMA

5. El resultado aparece en el acumulador desde donde puede llevarse a otros lugares de lacomputadora

3.4 La unidad de entrada y salida

Para poder ser de alguna utilidad, la computadora ha de interaccionar con el exterior. Larecogida de datos y la evacuacion de resultados se llevan a cabo mediante dispositivos variadoscomo son el teclado y la pantalla y que reciben el nombre de perifericos.

El reto que plantea la comunicacion de la computadora con el exterior a traves de dispositivosdiferentes reside fundamentalmente en la distinta velocidad de transmision de estos. En efecto,

c© M.R. Arahal 2009 DISA. ESI. US. 37

Teclado Monitor ImpresoraDisco

vídeo

Adaptador

paraleloAdaptadorAdaptadorAdaptador

Teclado unidad de disco

UCP RAM ROM

Figura 3.7: Perifericos conectados a los enlaces de la computadora.

considerese un teclado; la informacion que proviene del mismo no suele superar los 20 caracterespor segundo, es decir hay 0.05 segundos de espera entre caracter y caracter. Durante estos 0.05segundos la computadora puede realizar miles de operaciones. Sin embargo otros dispositivosadmiten una velocidad mayor, como por ejemplo los discos y las impresoras. La computadoraha de adecuar sus operaciones al ritmo de transmision de datos, so pena de perder informacion.

Tıpicamente, los perifericos se conectan al enlace de la computadora mediante circuitos querealizan las adaptaciones necesarias (niveles de tension, formato de la informacion, etc.). Esta esla situacion mostrada en la figura 3.7. En el desarrollo del capıtulo se van a describir brevementealgunos perifericos, para pasar posteriormente al problema de la comunicacion entre estos y laUCP.

3.4.1 Perifericos

Como se ha dicho, los perifericos son dispositivos que permiten el trasvase de informacion desdeel exterior a la computadora o al contrario. Los mas comunes son descritos a continuacion:

Teclado Permite tanto introducir texto, numeros y proporcionar senales para los programas. Secompone de pulsadores electromecanicos que mandan un codigo identificador a un espaciode almacenamiento temporal que la computadora lee y vacıa periodicamente. Las teclasque incluye son:

• Letras, numeros y signos de puntuacion. Esta parte del teclado se asemeja al de unamaquina de escribir convencional.

• Tecla INTRO. Tiene dos funciones: en primer lugar permite pasar a la siguiente lıneaen la escritura. Ademas, en programas de uso interactivo sirve para dar entrada a lainformacion tecleada anteriormente de forma que pueda ser procesada. Por ejemplo,despues de introducir una orden hay que pulsar esta tecla, para que la computadoraejecute la orden. En algunos teclados aparece el sımbolo ←

|, o la palabra RETURN oENTER.

• Teclas de funcion, Numeradas desde la F1 a la F12 sirven para realizar ordenes dentrode ciertos programas. No tienen un significado definido, sino que cada programa les

38 TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL

asigna una funcion, lo cual permite ahorrar tiempo de escritura. Por ejemplo, enalgunos editores la tecla F2 sirve para guardar una copia del texto actual en el disco.

• Teclado numerico. Ademas de los numeros, los teclados modernos, suelen traer unteclado numerico compuesto por los numeros, el punto decimal y otras, en la partederecha del teclado. De esta forma se agiliza la escritura de grandes cantidades dedatos.

• Teclas de bloqueo de mayusculas, bloqueo de teclado numerico, etc.

• Otras teclas especiales, como flechas, boton de parada, etc.

• Teclas que alteran la funcion de otras teclas.

– Tecla MAY3. Pulsada simultaneamente con otra produce la escritura de la letraen mayusculas o del signo superior de los dos que aparecen encima en la tecla.Su funcion normal es en todo igual a las mayusculas de una maquina de escribir.Aplicada a las teclas de funcion permite activar funciones distintas.En general cuando se ha de pulsar una tecla conjuntamente con otra se indica me-diante el signo +. Por ejemplo, para indicar que se han de pulsar simultaneamentela tecla MAY y la tecla de funcion F2 se usa: MAY+F2.

– Tecla ALT. Al igual que la tecla de mayusculas permite cambiar la funcion delas teclas de funcion. Ademas sirve para generar los sımbolos de la tabla ASCIImanteniendo la tecla pulsada mientras se introduce el codigo correspondienteen decimal. En muchas aplicaciones esta tecla tiene significado especial. Porejemplo, en los entornos de ventana, sirve para activar funciones dentro de unmenu tecleando ALT+inicial opcion del menu.

– Tecla ALT GR. Permite obtener los signos |, [, ], } y { , u otros dependiendo delsistema.

– Tecla CONTROL. Pulsada conjuntamente con algunas letras produce caracteresde control. Es decir, caracteres ASCII no visibles que tienen funciones de control,como CONTROL+G, que produce el caracter ASCII numero 7 que provoca unzumbido en el altavoz del terminal. Otros caracteres utiles son CONTROL+Cy CONTROL+Z para terminar la ejecucion de programas. Usada en conjuncioncon las teclas de funcion permite activar otras funciones distintas dentro de pro-gramas.

Una combinacion de teclas especialmente util en sistemas PC es CONTROL+ALT+SUPR

que causa un reinicio del sistema.

Los teclados tienen una velocidad de transmision baja (10 o 15 caracteres por segundo).Si se teclea a una velocidad superior el espacio de almacenamiento temporal se llena y lacomputadora emite un sonido de advertencia.

Raton Es un dispositivo que sirve para posicionar un puntero grafico sobre la pantalla, deforma rapida. Este puntero permite realizar acciones pulsando los botones del raton. Losentornos de ventana hacen un uso exhaustivo del raton. Existen diversos tipos, de bola,optico, por presion.

Monitor de visualizacion Es el lugar donde usualmente la computadora envıa la salida delos programas. Solıa ser del tipo TRC (tubo de rayos catodicos), de color o monocromo.Hoy en dıa se imponen las pantallas planas formadas por matrices de transistores.

Para poder usar el monitor, la computadora ha de incorporar un circuito especial llamadotarjeta de vıdeo. La imagen que se presenta en pantalla esta contenida en la memoria de

3En algunos teclados aparece como Shift, en otros como una flecha vertical ⇑.

c© M.R. Arahal 2009 DISA. ESI. US. 39

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 numero de veces por segundo de acuerdo conel contenido de la memoria. La UCP se limita a colocar en la memoria de vıdeo la imageny el circuito de refresco la manda a la pantalla.

La cantidad de memoria de vıdeo disponible limita las posibilidades graficas. Ası, unatarjeta con poca memoria compone las imagenes mediante puntos gruesos y con pocoscolores, como se muestra en la figura 3.8 a la izquierda. Al aumentar la memoria disponiblees posible disminuir el tamano del punto y aumentar la cantidad de colores que puedenpresentarse a un mismo tiempo. De este modo las imagenes resultan mejor definidas comoen la figura 3.8 a la derecha. La capacidad de la tarjeta de vıdeo se indica por los puntoshorizontales y verticales y la cantidad de colores disponibles.

Figura 3.8: Imagenes proporcionadas por dos tarjetas de vıdeo distintas. A la izquierda unaimagen de 201 × 129 puntos; a la derecha una imagen de 402 × 258 puntos, ambas en blanco ynegro.

Impresora Es un dispositivo que permite reproducir en papel los dibujos o textos realizadosen una computadora. Hay muchos tipos distintos, dependiendo de la tecnica usada paraimpregnar el papel. Las mas usadas actualmente son las impresoras de chorro de tinta ylas laser.

La tinta en una impresora de chorro o inyeccion es lanzada gota a gota sobre el papelformando los caracteres o dibujos. Un mecanismo especial va soltando la tinta (o tintasde diversos colores). Las gotas son dirigidas mediante campos electricos para que lleguenal lugar indicado sobre el papel.

La impresora laser permite copiar paginas enteras de una vez. Se basan en un tamborcargado electrostaticamente, que al ser expuesto a un rayo laser se descarga en algunaszonas. La tinta en polvo impregna luego esas zonas del tambor. Al pasar cerca del papelcargado opuestamente al tambor la tinta se adhiere al papel. Finalmente se aplica calorpara que la tinta en polvo funda sobre el papel. Debido a que el laser es muy fino, lacalidad de impresion es muy alta.

No hay ningun codigo normalizado para la comunicacion ente impresoras y computadoras.Sin embargo, normalmente no hay que preocuparse por estos detalles pues los programas(o sistemas de explotacion) permiten seleccionar el tipo de impresora a usar mediantemenus, por lo que todo lo que uno debe saber es la marca y modelo de la impresora quetiene conectada. Entre los muchos lenguajes se pueden destacar los siguentes: PCL 1 aPCL 5 de Hewlett-Packard y PostScript o lenguaje de descripcion de paginas a base deinstrucciones producido por Adobe Systems Inc,

Las impresoras pueden conectarse a la computadora usando diversos adaptadores de entrada-salida entre los que destacan: Centronics, RS232, SCSI y las conexiones de red como

40 TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL

Pista Cabezas

Figura 3.9: Discos magneticos para almacenamiento de datos.

Ethernet u otras.

Digitalizador de imagenes Se usan para obtener una version digital de imagenes sobre elpapel. Para ello la imagen es descompuesta en una matriz de puntos de color y posterior-mente almacenada como un archivo en un formato grafico, como los conocidos GIF yTIFF.

En ocasiones la digitalizacion de imagenes tiene por objeto conseguir un archivo conte-niendo el texto impreso en la imagen. Es decir, la imagen puede ser una pagina de unperiodico y lo que se desea es el texto contenido en dicha pagina. A partir de la imagense pueden usar programas de reconocimiento de caracteres (conocidos como OCR) paraobtener el texto en un archivo. Los programas de reconocimiento de caracteres suelenfuncionar solo con letra de imprenta.

Discos magneticos Los dispositivos de almacenamiento masivo permiten guardar grandes can-tidades de datos de forma no volatil. Los dispositivos mas usados han sido de soportemagnetico como el disco duro, las cintas magneticas y los discos flexibles hoy ya casidesaparecidos.

Los discos duros estan fijos en el interior de la computadora. Su construccion les confieremayor rapidez y capacidad. Actualmente los discos duros pueden tener capacidades demiles de Megacaracteres. En la parte derecha de la figura 3.9 se muestra un diagramasimplificado de un disco duro, mostrando las cabezas que permiten la lectura y escritura.

Disco optico Los discos con soporte optico como los populares CD-ROM, CDR, DVD-ROM

y DVD-RAM permiten guardar gran cantidad de datos (de 700 Mc a varios Gc). Lainformacion se guarda en binario en forma de agujeros o huecos microscopicos en el metalinterior del disco. Mediante un rayo laser se puede obtener una senal electrica con unvoltaje alto o bajo dependiendo del paso de depresiones bajo el laser a medida que el discogira.

El CD-ROM es casi identico a los discos compactos para audio que existıan previamente.De hecho, ambos discos son compatibles. Los reproductores de discos para audio incorpo-ran una etapa de conversion de digital a analogico para producir el sonido, la cual no esnecesaria en el caso de reproductores para uso de la computadora.

Puesto que el metal que contiene los datos esta protegido por una capa de plastico seconsigue un medio menos sensible que los discos flexibles. El disco tiene los datos grabadosen una unica pista espiral. La lectura sobre la pista es a velocidad constante, por lo queel disco gira a distintas velocidades segun el tramo leido. Ver figura 3.10 (a). Los datosse modulan siguiendo la regla ”8 en 14”, que usa 14 bits para codificar cada caracter. Seincluye un codigo de deteccion de errores de tipo CRC. La figura 3.10 (b) muestra la formaen que los bits quedan grabados en el disco.

c© M.R. Arahal 2009 DISA. ESI. US. 41

objetivo

detector

(a) (b)

plástico

etiqueta

datos

00100010000100000100

bits modulados

Figura 3.10: (a) Esquema del disco optico. (b) Representacion de la informacion en el mismo.

Dentro de los discos opticos hay varias clases: hay discos que solo admiten lectura, discosque se pueden grabar una sola vez desde el equipo personal y discos que admiten serregrabados varias veces.

3.5 La unidad de control

La unidad de control es el elemento que ordena a todos los demas. La tarea que tiene enco-mendada consiste en enviar las senales de control que provocan operaciones de los modulos ytambien transferencias de informacion entre los mismos.

En el esquema de la figura 3.11 se muestran los modulos ya conocidos interconectados porenlaces. Podemos imaginar que los enlaces son autopistas de varios carriles por las cuales puedenmoverse 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 informacion que setransmite puede ser de diversas clases: datos y resultados de operaciones, instruccionesdel programa y direcciones de memoria.

2. Otro enlace S que une la unidad de control y el selector de posiciones de memoria. Por else transmiten direcciones de memoria.

3. La memoria principal, con organizacion matricial.

4. La UAL con registro acumulador que almacena uno de los operandos y el resultado de lasoperaciones.

5. Los siguientes registros:

• A. Registro acumulador de la UAL.

• S. Registro de seleccion de memoria.

• T. Registro tampon de comunicacion entre la memoria y la lınea M.

• P. Contador de pasos de programa. Indica la posicion dentro de la memoria de lainstruccion a ejecutar.

42 TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL

SPEP

INCP

P

DCO MD

ET ST

S

MEM

LECM

ESCM

TEE SE

EA

SA

SUMAMULT

EO

A

MEI

SD

ES

I

S

LEETESCP

E

M

Figura 3.11: Esquema de una computadora digital mostrando los enlaces y las senales de go-bierno.

• I. Registro de instruccion. Guarda en cada momento la instruccion que se ejecuta enese paso.

• E. Registro de comunicacion con el exterior. Permite tomar datos del teclado o llevarlosa la pantalla. Es una forma simple e idealizada de la unidad de control que se hadescrito anteriormente.

3.5.1 Funcionamiento

El esquema presentado corresponde a una maquina de programa almacenado, por lo que en lamemoria se almacenan tanto datos y resultados como el programa a ejecutar. El funcionamientodel mismo se describe a continuacion.

Para comenzar la explicacion se parte de una situacion en la que el programa ha sido alma-cenado previamente en la memoria. El programa se va a ejecutar paso a paso bajo la direccionde la unidad de control. Esta debe obtener de la memoria la instruccion a ejecutar, por lo quenecesita disponer de algun medio que le permita conocer en que posicion de memoria se encuen-tra localizada la misma. El problema se resuelve colocando las instrucciones secuencialmenteen la memoria y dotando a la unidad de control de un registro de direccion de la instruccion(registro P en la figura anterior). Este registro es un contador que se incrementa en una unidadcada vez que se realiza una instruccion, pasando ası a apuntar a la siguiente.

Una vez localizada la instruccion se extrae de la memoria llevandola al registro I, dondese ejecuta activando las senales de gobierno necesarias. Esta tarea la realiza un modulo de launidad de control que aun no se ha mostrado. Finalmente se incrementa P para poder ejecutarla siguiente instruccion.

Cada instruccion requiere tres componentes para quedar totalmente definida: la operacion,la forma de direccionamiento y una direccion con la que operar. Estos elementos se codifican enbinario y se guardan en el registro I, que consta de las tres partes que se describen a continuacion.

1. Codigo de operacion (CO), es un conjunto de ceros y unos que identifica la operacion quedebe realizarse. Las instrucciones como la suma, la resta, etc. tienen cada una un codigodistinto.

c© M.R. Arahal 2009 DISA. ESI. US. 43

2. El modo de direccionamiento (MD), que indica la forma en que se ha de interpretar ladireccion que esta incluida en la instruccion. En el caso mas sencillo (llamado direcciona-miento directo) la direccion es la del dato o resultado de la operacion.

3. Direccion de memoria (D). Esta direccion puede interpretarse de formas distintas, segunel modo de direccionamiento y la instruccion de que se trate. En un caso simple como lasuma directa, esta direccion es el lugar de la memoria donde reside el dato que se ha desumar.

Para aclarar las ideas, considerese la instruccion sumar al acumulador el contenido de laposicion de memoria 8. Supongase que la codificacion de esta instruccion es:

CO MD D0101 0 00000001000

Por lo que el registro I, en el momento de ejecutarse esta instruccion contiene el valor0101000000001000. La primera parte (CO) identifica la operacion suma, la segunda parte (MD)indica que se trata de direccionamiento directo, que sera explicado mas adelante. Por ultimo, ladireccion 00000001000 es el numero 8 codificado en binario, y se interpreta como el lugar dondereside el numero que se ha de sumar al registro acumulador.

3.6 Ejecucion de instrucciones

Para cualquier instruccion el proceso de ejecucion se divide en cuatro fases: busqueda de lainstruccion, busqueda del operando, ejecucion de la instruccion y preparacion de la instruccionsiguiente. Estas fases conllevan pasos distintos dependiendo de la instruccion de que se trate.Los casos mas sencillos se plantean al considerar instrucciones aritmeticas, como la suma.

La figura 3.12 muestra de forma esquematica el desarrollo de las cuatro fases para unainstruccion como la suma directa. Como es sabido los registros contienen los numeros en binario,sin embargo, para dar mayor claridad al dibujo se han indicado aquı en decimal. Las posicionesde memoria tambien se han indicado con su direccion en decimal por identico motivo.

La parte A) de la figura representa la busqueda de la instruccion. Se ha supuesto que esta sehalla en memoria en la direccion 17 por lo que el contenido de P es precisamente 17. Se observatambien el direccionamiento de la memoria logrado con el registro S. Mediante una lectura sepasa la instruccion al registro I.

La parte B) corresponde a la busqueda del operando; este es el valor contenido en la direccionde memoria 8, que en este caso es el numero 3.

En la parte C) se realiza una nueva lectura de memoria que permite pasar el operando alregistro de operando de la UAL. Despues se efectua la suma del acumulador que contenıa elnumero 4 con el operando. El resultado (7 = 4 + 3) pasa al propio acumulador.

44 TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL

A SP

II

S

SP

I

A SP

I

P

8

17

3

7

8

8

173

3

8

co | md | 8co | md | 8

co | md | 8co | md | 8

178 3

co | md | 817co | md | 8

17

8

17 co | md | 8

3

co | md | 8

17

B)

A

A

A)

D)C)

4 4 17

18

8

34

7

Figura 3.12: Fases de la ejecucion de la instruccion suma.

En la parte D) se prepara la instruccion siguiente. El registro P se incrementa en una unidad,de este modo se consigue ejecutar la instruccion siguiente y ası sucesivamente.

Observese que el desarrollo de la instruccion se logra simplemente por la transferencia deinformacion entre registros y mediante la transformacion de esta en la UAL. La tarea de launidad de control es precisamente coordinar tales transferencias.

3.6.1 Transferencias entre registros

El funcionamiento de la computadora se puede describir mediante transferencias de informacionentre registros. Para verificar esta afirmacion se va a explicar a continuacion de forma masdetallada la ejecucion de la instruccion del ejemplo anterior, sumar al acumulador un datoalmacenado en una direccion de memoria dada.

1. Busqueda de la instruccion: consiste en extraer la instruccion que se va a ejecutar dela memoria. El registro P contiene la direccion de la instruccion a ejecutar, por lo quehabra de leerse la direccion de memoria indicada por P. Esta fase tiene tres operacioneselementales:

(a) Direccionamiento: transferir a S el contenido del registro P. Esto se simboliza me-diante: (P) → S. Notese que el contenido anterior del registro S se pierde al sersustituido por el contenido de P.

(b) Leer de memoria , obteniendose en T la informacion almacenada en la posicion defi-nida por S, lo cual se puede expresar como: M(S) → T

(c) Pasar la instruccion a I: (T) → I, donde debe quedar para poder ser ejecutada.

2. Busqueda del operando: En CO se ha supuesto la existencia del codigo de operacion (queidentifica a la suma en este ejemplo). El modo de direccionamiento es directo, por lo tantola direccion que figura en D se interpreta como la del operando que hay que sumar alacumulador. Los pasos son los siguientes:

c© M.R. Arahal 2009 DISA. ESI. US. 45

fase transferencias entre registros senales de gobierno

1a (P) → S SP, ES

1b M(S) → T LECM

1c (T) → I ST, EI

2a (D) → S SD, ES

2b M(S) → T LECM

3 (A)+(T) → A ST, EO, SUMA, EA

4 (P)+1 → P INCP

Tabla 3.1: Fases, transferencias entre registros y senales de gobierno correspondientes a lainstruccion suma.

(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 escopiado en T, con lo que se tiene el numero a sumar en T.

3. Ejecucion de la instruccion. En este caso, la suma al acumulador del contenido de T. Estopuede escribirse como: (T)+(A) → A, puesto que, como ya se ha dicho, el acumuladorguarda el primer operando y recibe ademas el resultado de las operaciones.

4. Preparacion de la siguiente instruccion. En este caso hay que sumar uno al contador depasos del programa: (P)+1 → P.

La forma en que se han detallado los pasos a realizar para ejecutar la instruccion sumaconsiste en dar las transferencias elementales entre registros. Del diagrama 3.11resulta claro que para lograr estas transferencias es necesario activar las senales de entrada ysalida de los registros, tales como: SP, ES, etc. En la tabla 3.1 se muestra de nuevo la secuenciade operaciones para el mismo ejemplo de la suma, pero incluyendo las senales de gobiernonecesarias.

La activacion de las senales de gobierno se realiza de forma automatica durante la ejecuciondel programa. Es una tarea que corre a cargo de la unidad de control. Para no enmaranar eldibujo de la figura 3.11 no se muestra la forma en la que la UC activa dichas senales. Bastedecir que existe un modulo o bloque adicional que maneja todas las senales de control de formaparecida a como el centro de control de trafico puede manejar los semaforos de una ciudad.

3.6.2 La instruccion de salto

Se ha indicado que el contador de pasos de programa se incrementa en una unidad cada vez quese ejecuta una instruccion, de forma que pase a senalar la direccion de la siguiente instruccionen la memoria. Esta forma de proceder es adecuada para muchas situaciones, pero esta muyfalta de versatilidad. El llamado salto incondicional permite romper el orden de ejecucion delas instrucciones, de forma que, tras la instruccion de salto situada en la direccion d, se pasaa ejecutar otra, situada en una direccion distinta de d + 1. Para ello es necesario y suficientemodificar el registro contador de pasos del programa P. Los pasos necesarios son:

46 TEMA 3. ESTRUCTURA DE LA COMPUTADORA DIGITAL

1. Busqueda de la instruccion: Hay que extraer la instruccion que se va a ejecutar de lamemoria. 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 , obteniendose en T la informacion almacenada en la posicion defi-nida por S: M(S) → T

(c) Pasar la instruccion a I: (T) → I. Donde sera interpretada.

2. Busqueda del operando: en la parte D del registro I debe figurar la direccion del salto, quese debe introducir en P, por lo que no es necesario buscar en memoria.

3. Ejecucion de la instruccion. En este caso, pasar el contenido de D al registro contador depasos: (D) → P.

4. Preparacion de la siguiente instruccion. En este caso no hay que hacer nada pues elcontador de pasos del programa contiene ya la direccion de la siguiente instruccion trasdel salto.

3.6.3 Saltos condicionales

La instruccion de salto condicional permite realizar el salto de una instruccion a otra dependiendode una condicion, por ejemplo si el acumulador es positivo. De este modo se puede obtener unprograma que a partir de un punto realiza unas instrucciones u otras dependiendo de que elacumulador sea positivo o no. Esto es realmente importante (como se vera mas adelante) pararealizar las llamadas bifurcaciones.

3.7 Ejercicios propuestos

Los siguientes ejercicios sirven para consolidar las ideas mas importantes de este tema.

1. La UAL de una computadora utiliza registros de n = 16 celdas y complemento a dospara representar los numeros enteros. Indique cual sera el contenido del acumulador trasproporcionarle el operando 0000000000111001, activar la senal CARGA, proporcionar eloperando 1111111110110111 y activar la senal SUMA.

2. Indique las senales de gobierno que se activan en la computadora elemental descrita eneste tema al ejecutarse la instruccion de resta al contenido del acumulador. Las senales degobierno han de escribirse en el orden cronologico correcto correspondiente cada una delas fases de ejecucion de la instruccion.

Tema 4

Lenguajes y Sistemas

En este capıtulo se presentan los lenguajes de programacion y los sistemas de explotacion. Paraello se expondran en primer lugar los problemas derivados de la programacion de la maquinausando los codigos binarios. La solucion de dicho problema ha dado lugar historicamente a lacreacion de codigos de mayor nivel que dieron lugar a los lenguajes y de programas de ayuda alprogramador que contribuyeron a formar los sistemas de explotacion.

4.1 El codigo binario

En el capıtulo anterior se ha indicado la manera en que se indican mediante un codigo binario lasoperaciones que la computadora puede realizar. Tambien se ha dicho que programar la maquinaconsiste en colocar dichos codigos binarios de forma oportuna en la memoria de la computadora.Un programa escrito de esta forma se dice que esta realizado en el codigo de la maquina llamadoa veces codigo de maquinas e incorrectamente ”codigo maquina”.

El codigo binario es la forma mas basica y primitiva en que se puede programar una compu-tadora digital pues en esencia consiste en colocar en la memoria (de alguna manera) los ceros yunos que conforman las instrucciones de un programa.

Ya se ha explicado con anterioridad que la unidad de control saca de la memoria las instruc-ciones una a una y las ejecuta enviando senales de control a las otras unidades de la maquina.Se ha supuesto que el programa reside en la memoria, pero, ¿como ha llegado allı?

En los sistemas de calculo automatico de los anos 1940 y siguientes se disponıa de mediosprimitivos para realizar esta tarea. Las tarjetas perforadas, las cintas agujereadas (de papel o deceluloide) eran metodos habituales. Estas tarjetas y cintas podıan ser leıdas por un dispositivoperiferico que convertıa el codigo binario de los agujeros en impulsos electricos que podıan serenviados a la memoria. Posteriormente surgieron las cintas magneticas y los discos en los queel medio magnetico sustituyo a las perforaciones, permaneciendo la idea central del proceso.

Sea cual fuera el metodo, era preciso que alguna persona disenara el programa que consistıaen una ristra de ceros y unos. A modo de ejemplo se tomara una computadora ficticia llamada

47

48 TEMA 4. LENGUAJES Y SISTEMAS

direccion CO MD D significado...

20 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 Leer de teclado almacenando el valor

leıdo en la posicion de memoria 10

21 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 Leer de teclado almacenando el valor

leıdo en la posicion de memoria 11

22 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 Llevar al acumulador (registro de la

UAL) el numero guardado en la po-

sicion de memoria 10

23 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 1 Sumar al acumulador el numero guar-

dado en la posicion de memoria 11

24 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 0 Almacenar el contenido del acumulador

en la posicion de memoria 12

25 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 Escribir en pantalla el valor de la po-

sicion de memoria 12

26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Parar la maquina...

Tabla 4.1: Ejemplo de programa en la computadora CESIUS. A la izquierda se presenta unalista de las operaciones a efectuar, a la derecha se tiene el programa en la memoria. El contenidode los registros de la memoria se ha separado en tres bloques (CO, MD y D) para facilitar elestudio, dicha separacion no existe en realidad.

CESIUS. Se trata de una computadora que usa registros de 16 celdas. El codigo de operacionse indica con cuatro bits, el modo de direccionamiento con un bit y las direcciones de memoriacon 11 bits.

La tabla 4.1 muestra una serie de instrucciones de esta computadora simplificada. Cadalınea esta formada por 16 celdas que contiene una instruccion. A la derecha se ha indicado loque cada instruccion representa.

Una vez sea ejecutado el programa realizara una tarea muy simple: leer dos numeros delteclado y almacenarlos en memoria. Tras esto, los sumara y guardara en la memoria el resultado.Finalmente el resultado se presentara por pantalla. Para guardar los numeros leıdos se van ausar las posiciones de memoria con direccion 10 y 11 (que se van a suponer vacıas o no usadas).El resultado se almacena en la direccion 12.

En este ejemplo se ha supuesto que las instrucciones del programa se almacenan codificadasen la memoria principal comenzando en la direccion 20. De este modo el programa queda enmemoria tal y como muestra dicha tabla. Para ejecutarlo basta con introducir en el contadorde pasos de programa (registro P) la direccion de comienzo del mismo, es decir, la direccion 20.

Un programa escrito en la forma vista en el ejemplo anterior se dice que esta en codigo

binario, pues utiliza unicamente las instrucciones de la maquina codificadas con ceros y unos.Cada UCP tiene su propio juego de instrucciones, por lo que los programas en codigo binariono son necesariamente transportables; es decir, no pueden ser ejecutados en otras maquinas.

c© M.R. Arahal 2009 DISA. ESI. US. 49

PROGRAMA MEMORIA

instruccion...

LEER 10LEER 11CARGAR 10SUMAR 11ALMACENAR 12ESCRIBIR 12PARAR

...

direccion CO MD D...

20 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 021 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 122 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 023 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 124 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 025 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 026 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0...

Figura 4.1: Ejemplo de programa. A la izquierda se presenta una lista de las operaciones aefectuar, a la derecha se tiene el programa en la memoria. El contenido de los registros de lamemoria se ha separado en tres bloques (CO, MD y D) para facilitar el estudio, dicha separacionno existe en realidad.

El programa de la suma que ha servido de ejemplo es muy simple y se puede programarfacilmente en codigo binario. Sin embargo es facil adivinar la complejidad que tendrıa el codigode maquinas correspondiente a la programacion de una tarea con muchas mas instrucciones.Para aliviar este problema surge el codigo mnemotecnico, que se describe en el punto siguiente.

4.2 Codigo mnemotecnico

Una forma de simplificar la programacion es reemplazar la codificacion binaria por una mas in-teligible. Tal codificacion ha de ser equivalente al codigo maquina, por lo que en cada sentenciadebe aparecer de manera clara los componentes basicos de cada instruccion, que son la ope-racion a realizar, el modo de direccionamiento y el operando. Por ejemplo, si se escribiera cadainstruccion por su nombre y los numeros en decimal el programador verıa muy simplificada sutarea. En tal caso el programa del ejemplo anterior podrıa codificarse del modo que se muestraen la figura 4.1

Esta forma de codificar necesita una posterior traduccion puesto que en la memoria no sepuede colocar otra cosa que no sea los ceros y unos de las instrucciones y datos. La tarea detraducir es repetitiva y mecanizable, por lo que se dejaba en manos de personal poco cualificado.Posteriormente las propias computadoras fueron programadas para que llevaran a cabo la tareade traducir programas para otras maquinas o para sı mismas. Surgieron de este modo losprogramas traductores cuya tarea consiste en tomar un programa en codigo mnemotecnico(o ensamblador como se vera luego) y producir los ceros y unos correspondientes al programaen codigo binario.

Los programas traductores pueden colocar el programa traducido en la memoria o dejarlosen un archivo en disco. En este ultimo caso es preciso utilizar posteriormente un programacargador que permita tomar el programa del disco, pasarlo a la memoria y ejecutarlo.

Conviene indicar que los nombres de las instrucciones suelen acortarse pues de este modo se

50 TEMA 4. LENGUAJES Y SISTEMAS

ahorra espacio y trabajo a la hora de realizar la traduccion. Es habitual que cada instruccionquede descrita por un codigo mnemonico de (por ejemplo) tres letras. Ası la instruccion CAR-GAR se acorta a CAR, la instruccion ALMACENAR a ALM. En la tabla 4.2 se presenta unalista de las instrucciones de la computadora ficticia CESIUS.

4.3 Ensamblador

Los programas traductores tomaron la dura tarea de pasar el codigo mnemotecnico a codigo demaquina. Ademas se les anadieron otras funciones que aliviaban aun mas la tarea del progra-mador. A fin de ilustrar estos anadidos considere los problemas siguientes:

1. Los programas pueden necesitar valores para los calculos, por ejemplo, el valor dos parahallar la media. Este valor debe residir en memoria al iniciarse la ejecucion del programa,por lo que resulta de ayuda que el traductor lo coloque en la memoria antes de dichaejecucion. Esta tarea recibe el nombre de establecimiento de valores iniciales o de datosnumericos constantes.

2. Tambien resulta preciso que existan direcciones de memoria libres para almacenar en ellaslas variables del programa. Por ejemplo, para almacenar un resultado calculado. Puestoque en la memoria se almacenan tanto datos como instrucciones es preciso algun meca-nismo para dejar huecos libres. Es decir, hay que indicar que una determinada posicionde memoria no va a contener una instruccion sino que ha de dejarse libre para alojarinformacion.

Se crearon entonces las pseudoinstrucciones. Estas son anotaciones que el programadorescribe para que el programa traductor realice tareas adicionales durante la traduccion, comopor ejemplo dejar espacios vacıos en medio del programa o colocar valores constantes para queel programa los use, una vez traducido, durante su ejecucion.

El conjunto de instrucciones y pseudoinstrucciones forma el lenguaje ensamblador que yano es un mero codigo, sino un lenguaje simbolico. El programa traductor que se necesita paraproducir el codigo binario a partir del codigo simbolico debe ser ahora mas complejo, pero enesencia realiza la misma mision como muestra la figura 4.2.

COMPUTADORA

Traductor

Programa en código binario

Programa en ensamblador

Figura 4.2: El programa traductor produce codigo binario a partir de un programa escrito enlenguaje simbolico.

El lenguaje ensamblador tambien difiere de una maquina a otra, es decir, no es portable. Suunica ventaja es que facilita la tarea del programador gracias a las pseudoinstrucciones. Como

c© M.R. Arahal 2009 DISA. ESI. US. 51

CO MD Codigo Operacion TransferenciasEnsamblador realizada entre registros

0000 0 ALT Parar la maquina0001 0 ALM Almacenar el contenido del (A)→M(D), P → (P ) + 1

acumulador en la memoria0001 1 ALM I Almacenar indirectamente (A)→M(M(D)), P → (P ) + 10010 0 CAR Cargar de la memoria M(D)→ A, P → (P ) + 1

al acumulador0010 1 CAR I Cargar indirectamente M(M(D))→ A, P → (P ) + 10011 0 ESC Escribir un entero M(D)→ E, P → (P ) + 1

en la pantalla0011 1 ESC I Escribir indirectamente M(M(D))→ E, P → (P ) + 1

un entero en la pantalla0100 0 LEE Leer un entero (E)→M(D), P → (P ) + 1

del teclado0100 1 LEE I Leer indirectamente (E)→M(M(D)), P → (P ) + 10101 0 SUM Sumar al acumulador (A) + M(D)→ A, P → (P ) + 10101 1 SUM I Sumar indirectamente (A) + M(M(D))→ A, P → (P ) + 10110 0 RES Restar al acumulador (A)−M(D)→ A, P → (P ) + 10110 1 RES I Restar indirectamente (A)−M(M(D))→ A, P → (P ) + 10111 0 MUL Multiplicar por A (A) ·M(D)→ A, P → (P ) + 10111 1 MUL I Multiplicar indirectamente (A) ·M(M(D))→ A, P → (P ) + 11000 0 DIV Dividir el acumulador (A)/M(D)→ A, P → (P ) + 1

entre el operando1000 1 DIV I Dividir indirectamente (A)/M(M(D))→ A, P → (P ) + 11001 0 MOD Modulo del acumulador (A) mod M(D)→ A, P → (P ) + 1

y el operando1001 1 MOD I Modulo realizado (A) mod M(M(D))→ A,

indirectamente P → (P ) + 11010 0 SAL Salto incondicional (D)→ P1010 1 SAL I Salto incondicional M(D)→ P

indirecto1011 0 SAN Salto si A (D)→ P si (A) < 0,

es negativo si no P → (P ) + 11011 1 SAN I Salto indirecto si M(D)→ P si (A) < 0,

A es negativo si no P → (P ) + 11100 0 SAC Salto si A (D)→ P si (A) = 0,

es cero si no P → (P ) + 11100 1 SAC I Salto indirecto si M(D)→ P si (A) = 0,

A es cero si no P → (P ) + 11101 0 SAP Salto si A (D)→ P si (A) > 0,

es positivo si no P → (P ) + 11101 1 SAP I Salto indirecto si M(D)→ P si (A) > 0,

A es positivo si no P → (P ) + 11110 0 ECA Escribir caracter M(D)→ E, P → (P ) + 1

en la pantalla1110 1 ECA I Escribir caracter M(M(D))→ E, P → (P ) + 1

indirectamente1111 0 LCA Leer caracter (E)→M(D), P → (P ) + 11111 1 LCA I Leer caracter (E)→M(M(D)), P → (P ) + 1

indirectamente

Tabla 4.2: Las columnas indican el codigo de operacion, modo de direccionamiento, el codigomnemotecnico y una somera explicacion para cada una de las instrucciones de CESIUS.

52 TEMA 4. LENGUAJES Y SISTEMAS

PROGRAMA MEMORIA

etiqueta instruccionORG 9SAL INI

DATOA: ESP 1DATOB: ESP 1RESUL: ESP 1

INI: LEE DATOALEE DATOBCAR DATOASUM DATOBALM RESULESC RESULALTFIN

direccion CO MD D...

09 1 0 1 0 0 0 0 0 0 0 0 0 1 1 0 110111213 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 014 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 115 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 016 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 117 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 018 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 019 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0...

Figura 4.3: Ejemplo de programa. A la izquierda aparece el programa escrito en ensambladorutilizando mnemonicos para las instrucciones y etiquetas para las direcciones, a la derecha setiene el programa, una vez traducido, en la memoria. El contenido de los registros de la memoriase ha separado en tres bloques (CO, MD y D) para facilitar el estudio, dicha separacion en larealidad no es fısica.

ejemplo considere las siguientes:

ORG Sirve para indicar en que direccion de memoria comenzaran a colocarse las instruccionesy espacios para datos y resultados al realizarse la traduccion. Permite al programadorindicar de forma simple donde va a ir ubicado su programa dentro de la memoria.

ESP Sirve para dejar un espacio en la memoria en el cual no habra ninguna instruccion. Estetipo de espacios se utiliza para datos y resultados.

CTE Es similar a ESP pero ademas deja un valor en el espacio. Permite tener constantes queel programa vaya a necesitar, por ejemplo el numero dos en caso de se necesite realizaruna media, etc.

FIN Indica al traductor que cese la traduccion. No debe confundirse con ALT que es lainstruccion de parada de la maquina.

A modo de ejemplo se presenta en la figura 4.3 el programa de la suma en lenguaje ensam-blador. Puede verse que las posiciones de memoria reservadas para datos se indican mediantela pseudoinstruccion ESP que significa ”dejar un espacio libre durante la traduccion”. Las po-siciones de memoria quedan identificadas mediante una etiqueta que es un nombre elegido deforma que recuerde al programador que objeto va a ir almacenado en dicha posicion. Observeseque la lectura del codigo resulta mucho mas comprensible incluso para alguien no iniciado en laprogramacion. Por ejemplo, la secuencia ”CAR DATOA”, ”SUM DATOB”, ”ALM RESUL” selee como ”cargar dato a”, ”sumar datob” y ”almacenar resul”, por lo que no necesita muchasexplicaciones.

c© M.R. Arahal 2009 DISA. ESI. US. 53

PROGRAMA MEMORIA

ORG 0A: ESP 1 ’primer datoB: ESP 1 ’segundo dato

MEDIA: ESP 1 ’mediaDOS: CTE 2 ’constante

LEE A ’lectura datosLEE BCAR ASUM B ’operaciones para mediaDIV DOSALM MEDIAESC MEDIA ’escritura resultadoALTFIN

0123 0000 0 000000000104 0100 0 000000000005 0100 0 000000000016 0010 0 000000000007 0101 0 000000000018 1000 0 000000000119 0001 0 00000000010

10 0011 0 0000000001011 0000 0 00000000000

Tabla 4.3: Ejemplo de programa en ensamblador para CESIUS y contenido de la memoria trasla traduccion.

etiqueta instruccionORG 0SAL INI

DATOX: ESP 1RESUL: ESP 1

INI: LEE DATOXCAR DATOXMUL DATOXMUL DATOXMUL DATOXALM RESULESC RESULALTFIN

Figura 4.4: Programa en lenguaje ensamblador que lee un numero y escribe su cubo.

En la figura 4.3 se muestra otro programa y su traduccion a codigo de maquina. En estaocasion se han incluido comentarios. Los comentarios se separan del codigo mediante algunsigno (en este caso la apostrofe). Los comentarios son ignorados por el traductor por lo que noson traducidos y no pasan a la memoria de ninguna forma. Se colocan para que otras personasque lean el programa puedan seguir la pista a las instrucciones y saber que es lo que el programarealiza durante su ejecucion y porque.

Otro ejemplo de programacion se muestra en la figura 4.4. Aun sin saber para que ha sidodisenado este programa la lectura del codigo permite averiguar que el numero leıdo es elevadoal cubo y este resultado se escribe en la pantalla. Esta interpretacion es mucho mas difıcil si elprograma se hubiese presentado en codigo binario.

En la figura 4.5 se presenta un ultimo ejemplo de programa en lenguaje ensamblador. Setrata de un programa que calcula y escribe el valor absoluto de un numero previamente leıdo.

54 TEMA 4. LENGUAJES Y SISTEMAS

etiqueta instruccionORG 0SAL INI

DATOX: ESP 1CMUNO: CTE -1RESUL: ESP 1

INI: LEE DATOXCAR DATOXSAP POSITMUL CMUNO

POSIT: ALM RESULESC RESULALTFIN

Figura 4.5: Programa en lenguaje ensamblador para CESIUS que calcula y escribe el valorabsoluto de un numero previamente leıdo.

El dato residira en la memoria en el espacio marcado por la etiqueta DATOX, mientras que elresultado se almacenara en el espacio reservado por la etiqueta RESUL. Observese el uso de lapseudoinstruccion CTE que indica al traductor que deje un espacio en el cual se ha de guardarla constante -1 para ser usada en los calculos. Observe tambien el uso del salto condicional SAPque realiza el salto solo si el acumulador es positivo.

En temas posteriores se mostrara como disenar la estructura de los programas como los quese han mostrado en los ejemplos anteriores. Esta tarea tiene especial importancia en casos enque existen saltos o bifurcaciones.

A pesar de ser un gran avance, el lenguaje ensamblador sigue siendo de difıcil uso. Paramejorar sus caracterısticas se crearon macroinstrucciones, subprogramas y otros desarrollos quedieron lugar a los modernos lenguajes de programacion. Pero antes de avanzar en este punto seva a describir el sistema de explotacion.

4.4 El sistema de explotacion

Los sistemas de explotacion (SE), conocidos tambien como sistemas operativos proporcionan elmedio por el cual el usuario puede interaccionar con la maquina y aprovechar sus recursos, porlo que es muy importante comprender como funcionan.

El SE proporciona el rostro o primera imagen que el usuario percibe al usar el ordena-dor. Para comprender su importancia piensese, que la mayorıa de las personas que usan lascomputadoras no ven otra cosa sino herramientas y el SE. En efecto, tareas como: poner enmarcha programas diversos, acceder a perifericos como discos e impresoras, comunicarse conotros equipos, etc. caen bajo la responsabilidad del SE.

El SE no solo es aprovechado por el usuario normal, ademas ofrece un conjunto de funcionesque son usadas por los programadores para acceder a la circuiterıa de cada maquina particular,lo cual es necesario en casos como el acceso a perifericos desde programas. Estas funciones tienen

c© M.R. Arahal 2009 DISA. ESI. US. 55

Herramienta

Sistema de Explotación

Circuitos de cada máquina particular

Usuario

Programador

Programador de SE

Figura 4.6: El sistema de explotacion visto por los distintos usuarios del sistema.

por objeto ocultar los detalles de cada computadora, de forma que el programador pueda escribirprogramas que funcionen en maquinas con equipos distintos, por ejemplo discos o impresoras dediferentes marcas.

Todo lo dicho anteriormente situa al SE como la conexion entre la maquina, que solo manejadatos binarios, y el usuario, para el cual los ceros y unos son extremadamente inoperantes.

Las herramientas (tambien llamadas aplicaciones) son programas que resuelven un problemaconcreto para el usuario. Ejemplos de aplicaciones son los procesadores de texto, programaspara dibujo o diseno grafico, videojuegos, etc. El SE en cambio se dedica a gestionar el uso de lacomputadora en sı. Las herramientas se apoyan a menudo en el SE para acceder a las entranasdel sistema: los cirtuitos.

En la figura 4.6 se presenta un esquema en el que se hace patente la situacion del SE paralos distintos usuarios del sistema. En primer lugar, el usuario de aplicaciones interacciona conestas y no ha de preocuparse por los detalles del SE o del equipo que utiliza. A un nivelinferior trabaja el programador de aplicaciones, que en muchos casos ha de conocer a fondo elSE, 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 mundoreal: las computadoras de distintos modelos o fabricantes tienen circuitos distintos, que han deser tratados de forma diferenciada.

A la luz de dicha figura se puede decir que el SE es un conjunto de programas que ofrecen alos usuarios una forma sencilla, flexible y rapida de acceso a los recursos ocultando los detallesdel equipo. Este hecho, la ocultacion, es de gran importancia pues permite desarrollar programassin conocer los detalles llamados de bajo nivel, como por ejemplo el modo de acceder a undisco en particular.

4.4.1 Estructura

Las tareas de los SE son muy variadas. En principio se puede fijar la atencion en programascomo el ensamblador y el cargador, pero hay mas: desde rutinas para enviar caracteres a undispositivo hasta programas que permiten manejar archivos enteros. De hecho, el SE cubre elespacio existente entre el usuario y la circuiterıa de la maquina mediante una estructura en laque se pueden distinguir varios niveles.

56 TEMA 4. LENGUAJES Y SISTEMAS

Intérprete de órdenes

Nivel intermedio

Núcleo

Figura 4.7: Estructura de los sistemas de explotacion organizada por niveles.

Un SE se compone de modulos con funciones asignadas. El primero es el nucleo que es unmodulo de servicio para los demas. Los otros se encargan de la memoria, las E/S, memoriasauxiliares, asignacion recursos. De este modo, la organizacion del SE queda como un conjuntode capas, de forma que las superiores hacen uso de las inferiores como muestra la figura 4.7.

• Nucleo. Es el de mas bajo nivel, pues descansa sobre la circuiterıa de la computadora,proporcionando servicios a las capas mas altas. Entre las funciones que tiene asignadadestacan la gestion de interrupciones, mediante las cuales es posible realizar tareas comola asignacion de trabajo al procesador y la comunicacion entre los distintos programas

• Nivel intermedio. Aunque puede estar subdividido en varios niveles, se presenta aquı comouno solo por simplicidad. Las tareas que realiza son : tratamiento de E/S a nivel dearchivos Memoria virtual, etc

• Interprete de ordenes. Ya se ha indicado que es el responsable de leer las ordenes delusuario y procesarlas.

El sistema de explotacion se divide en numerosos programas que se hacen cargo de las diversastareas. Entendido como un conjunto, el SE no tiene que estar en memoria completo, sino quelas 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 queincluye al menos trozos de programa encargados de las siguientes tareas:

• Aceptar ordenes del usuario a traves del teclado.

• Analizar las ordenes.

• Buscar el programa necesario para cada orden, por ejemplo, para borrar un archivo ocopiarlo o para usar una aplicacion.

• Cargar el programa (de borrado, de copia, aplicacion, etc.) y lanzar su ejecucion.

• Retomar el control al termino de la ejecucion.

4.4.2 Funciones de los sistemas de explotacion

El SE realiza numerosas funciones, todas encaminadas a ayudar al usuario y a mejorar el ren-dimiento de la maquina. A continuacion se da una lista no exhaustiva clasificada por el tipo de

c© M.R. Arahal 2009 DISA. ESI. US. 57

tarea.

Entradas y salidas

Los dispositivos perifericos usados para la E/S de datos son muy distintos entre sı, lo cualimplica la necesidad de desarrollar comunicaciones especıficas para cada tipo. El SE debe limarestas diferencias, de forma que el programador pueda solicitar operaciones de lectura/escriturade forma parecida, con independencia del dispositivo usado.

La E/S de datos desde perifericos se realiza por medio de programas concretos. El programadebe mandar senales de control como: puesta en marcha, colocacion de partes moviles, peticionde mensajes. Ademas se ha de coordinar la comunicacion para asegurar que sea rapida y sinerrores. Todo ello requiere una programacion cuidadosa. Los SE incluyen programas que realizanestas tareas de forma que el programador pueda usarlas. Esto ahorra tiempo al programador yaumenta la fiabilidad.

Dentro de los procesos de E/S merece ser destacado el problema de la deteccion de erro-

res. Las operaciones que implican trasvase de informacion estan sujetas a errores provocadaspor ruidos en las lıneas de transmision. El sistema de explotacion debe detectar estas situacionesy actuar de acuerdo a la gravedad del problema: bien recuperando automaticamente los datoscorruptos o avisando de la existencia de errores o incluso parando el sistema. Para detectar loserrores en transmisiones existen tecnicas que se detallan en el capıtulo dedicado a la codificacionbinaria de la informacion.

Debido a que los perifericos usan velocidades de transmision muy diferentes a la de la UCP,se suelen usar zonas de almacenamiento temporal. En ellas los datos son almacenados hasta queel dispositivo de destino este listo para aceptarlos. Se consigue de este modo que la UCP notenga que espera al periferico. De esta idea surgen los perifericos virtuales.

Sistema de archivos

En los dispositivos de almacenamiento masivo como discos, la informacion se agrupa en archivoso ficheros. A su vez, los archivos pueden agruparse para formar carpetas que sirven paraorganizar la informacion, del mismo modo que en un archivo convencional se puede clasificar losasuntos en carpetas y estas en cajones.

Las carpetas pueden a su vez formar parte de carpetas mayores, dando lugar a una estructuraarborescente. Esta organizacion jerarquica es llamada directorio. En la figura 4.8 se muestrauna de estas estructuras. A partir de la raız, que es la carpeta primera colocada en la posicionsuperior, parten otras carpetas que a su vez pueden contener archivos (indicados en letra cursiva)y otros subarboles. El objetivo de esta organizacion es mantener la informacion estructuradapara poder acceder a ella eficientemente.

Los archivos tienen un nombre que los identifica dentro de la carpeta, por ejemplo los archivoslistin y matriz de la mencionada figura 4.8. Las carpetas tambien se identifican mediante unnombre como es el caso de usuarios y pedro.

58 TEMA 4. LENGUAJES Y SISTEMAS

raíz

config programas sistema

cc ens editor

conectgrafic

juan mateo carlos

usuarios

dietas juegos ficha prueba listin matriz

ahorcado gusano

Figura 4.8: Directorio o arbol de carpetas en un SE particular.

Las operaciones que se pueden realizar con archivos son: crear, borrar, renombrar, cambiarla ubicacion dentro del arbol, copiar, anadir informacion , etc. El SE provee los programasnecesarios para llevar a cabo tales tareas. Del mismo modo las carpetas pueden ser objeto dediversas acciones, como:

• Crear. La carpeta nace vacıa, es decir, sin archivos en el. Hay que especificar el nombre conel que se va a denominar.

• Borrar. La carpeta ha de ser previamente vaciada borrando los archivos y subcarpetas quecontiene.

• Listar. Consiste en abrir la carpeta y leer los archivos y subcarpetas que contiene.

• Renombrar. El nombre de la carpeta se puede cambiar sin afectar a su contenido. Ademas,es posible recolocar la carpeta dentro del arbol.

Dos archivos distintos pueden tener el mismo nombre si pertenecen a carpetas distintas.Por este motivo, si se quiere hacer referencia a un archivo de forma unıvoca no basta con darel nombre. Es necesario especificar el camino en el directorio que es la lista de carpetas quees preciso recorrer. En el ejemplo de la figura 4.8 mediante raız-usuarios-juan-dietas1 sedesigna el camino absoluto para llegar al archivo dietas (se llama absoluto porque parte de lacarpeta raız).

La gestion del sistema de archivos puede realizarse por medio de ordenes introducidas por elteclado (como es el caso de UNIX y MS-DOS) o utilizando una pantalla grafica cuyos sımbolosse activan y manejan con el raton (como es el caso de los sistemas de ventana). En ambos casoses el SE correspondiente el que recibe la operacion a realizar y la lleva a cabo.

1En este ejemplo se ha usado el guion como separador de carpetas, en MS DOS el separador es la barrainvertida \ y en UNIX es la barra /.

c© M.R. Arahal 2009 DISA. ESI. US. 59

Ejecucion de programas

La ejecucion de un programa implica que el SE debe ceder parte del control de la maquina almismo. Al acabar la ejecucion el SE retoma el control. Esta tarea se descompone en variasoperaciones, como son: localizar el programa en el disco, proporcionar un lugar en la memoriapara cargarlo, realizar la carga desde el disco, dar al contador de pasos del programa la direccionde comienzo y retomar el control al finalizar.

El programa cargador que ha sido aludido anteriormente tiene por mision colocar en lamemoria el programa que se quiere ejecutar y dar comienzo a su ejecucion. Durante la misma,el control de la maquina pertenece total o parcialmente al programa que se ejecuta. Cuandoeste finaliza, devuelve al SE tal control. En la figura 4.9 se muestra un diagrama que sirve parailustrar el proceso descrito.

COMPUTADORA

Cargador

Programa en código binario

COMPUTADORA

Programa

Proceso de carga

Proceso de ejecución

datos resultados

Figura 4.9: El programa cargador coloca un programa en la memoria para su posterior ejecucion.

En algunos sistemas la UCP reparte su tiempo entre varias tareas. En estos sistemas mul-

titarea se suele vigilar el tiempo que cada programa pasa utilizando la UCP y tambien laszonas de memoria usadas por cada uno.

Ayuda al usuario

Los usuarios necesitan a menudo acudir al manual del SE para realizar una tarea. Algunos SEincluyen la posibilidad de consultar el manual en lınea; es decir, no una copia en papel sino enla pantalla.

El manual puede ser mostrado a peticion del usuario introduciendo una palabra clave paraidentificar la parte del mismo que interesa. Por ejemplo, el nombre de una orden. Esto ahorramucho tiempo al usuario y dinero, pues las copias impresas de algunos manuales son gigantescas.En los entornos graficos de ventana (McIntosh Systems, Solaris, MS Windows) la ayuda se hallaen tal cantidad que el manual es casi innecesario.

60 TEMA 4. LENGUAJES Y SISTEMAS

Gestion de recursos

Los recursos de la computadora son la UCP, la memoria principal y los perifericos. En algunossistemas se permite que exista mas de un programa en ejecucion. Esto puede ocurrir porque elsistema es multiusuario o simplemente multitarea. En tales casos es necesario arbitrar laadjudicacion de los recursos entre los distintos programas y/o usuarios. El sistema de explotacionse hace cargo de esta tarea, para lo cual usa reglas encaminadas a obtener un buen rendimientodel sistema. Estas reglas deben solventar conflictos surgidos de peticiones simultaneas de unmismo servicio.

En los sistemas multitarea la simultaneidad de ejecucion se consigue dividiendo el tiempode trabajo en pequenos intervalos y asignandolos a cada programa. En rigor, solo un programausa la UCP cada instante de tiempo, puesto que (en sistemas monoprocesador) la UCP soloejecuta una instruccion cada vez, la cual pertenecera a un programa en particular. Ahora bien,al dividir el tiempo en trocitos y cambiar de programa frecuentemente se consigue el efecto deque todos avancen su tarea.

En los sistemas de tiempo compartido varios usuarios utilizan una misma computadorausando terminales remotos. El SE asigna a cada usuario una porcion 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 sensacion de que toda la maquina es para sı2. Esta es la forma de uso delas grandes computadoras centrales a partir de los anos 70.

La gestion de la memoria principal se realiza en base a tecnicas sofisticadas destinadas aproveer de recursos a los programas en ejecucion manteniendo la confidencialidad de los datos.En muchos sistemas la memoria instalada es mas pequena que la suma de espacios que ocupan losprogramas que se han de ejecutar simultaneamente, por lo que estos se han de cargar por partes;es decir, teniendo en memoria en cada instante solo el trozo que interesa en cada momento. Laforma mas comun de gestion de memoria es la memoria virtual.

Otras tareas del SE relacionadas con la gestion de recursos son la realizacion de estadısticasde uso por parte de los distintos usuarios y contabilidad.

Proteccion

En los sistemas multiusuario es deseable que unos usuarios no puedan interferir en el trabajo delos otros. El sistema de explotacion debe proporcionar mecanismos para mantener la confiden-cialidad de los datos. Se ha de evitar que ningun usuario pueda leer o modificar la informacionque pertenece a otro, este situada en la memoria principal o en el disco.

Ademas, en sistemas con posibilidad de acceso remoto3 es indispensable contar con mediospara asegurar que solo las personas autorizadas acceden al sistema. En la mayorıa de los casosesto se resuelve asignando a cada usuario un nombre identificativo y una palabra secreta. Cuandoel usuario se conecta a la maquina el sistema pregunta ambos datos y comprueba la concordancia

2En teorıa, claro. La realidad es que cuando el numero de usuarios conectados es muy alto se nota unaralentizacion desesperante.

3A traves de redes de computadoras o usando la lınea telefonica y un modem.

c© M.R. Arahal 2009 DISA. ESI. US. 61

usando su base de datos. En la historia de las redes informaticas ha habido casos celebres depersonas que han aprovechado mınimos fallos de seguridad para acceder e incluso modificarinformacion restringida.

Otro tipo de proteccion concierne al funcionamiento del sistema. Por ejemplo, no es deseableque un usuario de un sistema de tiempo compartido consiga ejecutar sus programas mas rapidoque los demas sin el conocimiento de nadie. Esto pudiera lograrse en algunos sistemas cambiandola tabla de prioridades para la ejecucion de tareas.

Configurar el sistema

Consiste en fijar las opciones por omision y otros valores que suelen ser constantes durante unasesion de trabajo. Un ejemplo puede ser elegir el idioma del usuario, de forma que el tecladoproduzca los caracteres correctos. En muchos casos el proceso de configuracion se produceautomaticamente durante el arranque de la computadora. En todo caso, el SE debe ofrecermedios para que cada usuario cambie el aspecto del sistema o las opciones por omision a voluntad.

4.5 Lenguajes de alto nivel

La programacion de computadoras serıa una tarea harto desagradable y pesada si no existiesenlos lenguajes de programacion, baste considear a modo de ejemplo el panorama mostrado alcomienzo de este capıtulo. Los codigos mnemotecnicos confieren mayor legibilidad al programay por tanto facilitan su depuracion.

Persiguiendo una mayor facilidad de la programacion se llego a la observacion de que esutil disponer de un medio de indicar a la maquina tareas complicadas con pocas sentenciasdel programa. Por ejemplo: poder realizar una raız cuadrada sin necesidad de escribir variaspaginas de programa. Esto se logra con los lenguajes de alto nivel. La correspondencia entreinstrucciones de maquina y sentencias del lenguaje queda rota. Las sentencias del programa enalto nivel son traducidas y dan lugar a muchas instrucciones.

Las ventajas de los lenguajes de alto nivel son muchas: mayor legibilidad del programa,menor tiempo de programacion, mayor facilidad para el aprendizaje por parte de personas singrandes conocimientos de informatica, y sobre todo transportabilidad. La transportabilidadse consigue gracias a la existencia de programas traductores que construyen las instruccionesde maquina necesarias a partir del programa escrito con el lenguaje de alto nivel. Para cadamaquina distinta existe un programa que realiza la traduccion adecuada.

Pero no todo son ventajas, la traduccion implica una serie de operaciones que antes no exis-tıan. Ademas, al utilizar lenguaje de alto nivel a menudo se produce el efecto de ”matar moscasa canonazos”. Ilustremos con un ejemplo esta afirmacion. Consideremos la tarea de sumar dosnumeros que en el codigo de la maquina queda resuelta con muy pocas instrucciones. Al usar unlenguaje de alto nivel se escriben sentencias que son luego traducidas. El traductor proporcionauna serie de instrucciones que realizan la suma, pero ademas incluye otras muchas instruccionespara realizar tareas como la gestion de memoria y de los distintos tipos de datos que pueden

62 TEMA 4. LENGUAJES Y SISTEMAS

#include < stdio.h >void main(void){int i;

for(i=1; i<=10; i++)printf(”\n %d %d”, i, i*i );

printf(”\n Fin”);}

Tabla 4.4: Ejemplo de programa en lenguaje C.

sumarse (enteros, reales, etc.). Esto da lugar a que aparezcan mas instrucciones que el numeromınimo necesario. Esto es debido a que el traductor no tiene la fineza del programador humanoy es incapaz de eliminar todas las operaciones redundantes.

Programar con un lenguaje de alto nivel es equivalente a construir una casa con grandesbloques de cemento frente a construir con ladrillos: es mas rapido, pero se derrocha material.Como consecuencia, los programas en codigo de maquina se ejecutan mas rapidamente que losproducidos con un lenguaje de alto nivel, pues estos contienen mas operaciones.

Existen lenguajes de programacion que contienen elementos de alto y bajo nivel. Un buenejemplo es el lenguaje de programacion C. En este lenguaje se pueden escribir expresiones que,al ser traducidas, producen pocas instrucciones, como en los lenguajes de bajo nivel, y otras degran potencia cuyo equivalente en codigo de maquina son muchas instrucciones.

Los lenguajes de bajo nivel quedan bien reflejados mediante el ensamblador explicado alprincipio del tema. Como ejemplo de lenguaje de alto nivel se muestra en la figura 4.4 unprograma en C. Puede observarse que el programa esta escrito usando palabras del idiomaingles y expresiones parecidas a las habituales en Matematicas. Con pocas lıneas este programaconsigue escribir por la pantalla los cuadrados de los diez primeros naturales de una formaordenada y presentando un mensaje al final.

Cuando se usan lenguajes de alto nivel es necesario utilizar interpretes o compiladores

para producir el codigo binario que es el que se ejecutara en la maquina. Los interpretes realizanla traduccion y ejecucion del programa sentencia a sentencia. En cambio, los compiladoresproducen un codigo intermedio que sirve para crear un archivo ejecutable el cual puede ejecutarseposteriormente tantas veces como se desee sin necesidad de volver a traducir.

4.5.1 Lenguajes compilados

La forma en la que se opera con los lenguajes compilados queda reflejada en la figura 4.10.Los bloques marcados como MF son trozos de programa escritos en el lenguaje de alto nivel yreciben el nombre de modulos de codigo fuente. Estos modulos se almacenan en archivosllamados archivos fuente. El compilador acepta varios de estos modulos para producir loscorrespondientes bloques de codigo objeto. El codigo objeto consiste en instrucciones demaquina, pero cada bloque no esta preparado para funcionar. Es preciso un proceso de montaje,donde se reunen todas las partes para formar el programa ejecutable.

c© M.R. Arahal 2009 DISA. ESI. US. 63

MF 2 MF n

Compilador

MO 1 MO 2 MO n

Montador

Ejecu- table

Biblio- teca

MF 1

Figura 4.10: Compilacion y montaje de modulos para crear un archivo ejecutable.

64 TEMA 4. LENGUAJES Y SISTEMAS

Observese que ademas del codigo fuente escrito por el programador existen partes del pro-grama que proceden de la biblioteca. Se incluyen ahı funciones de uso frecuente por ejemplopara matematicas, para el manejo de perifericos, etc. que facilitan la tarea del programador.La biblioteca se compone de muchos modulos de codigo objeto que se venden normalmente conel compilador. El programador no puede ver el codigo fuente ni tampoco puede cambiar lasrutinas incluidas en la biblioteca, pero recibe informacion del vendedor para poder usarlas.

El resultado del montaje es un programa ejecutable, consistente en instrucciones de lamaquina que se este utilizando. Este programa puede almacenarse en tarjetas perforadas, encintas magneticas o en discos hasta el momento en que se desee usar.

El proceso de creacion de programas usando lenguajes de alto nivel involucra segun estamosviendo muchas operaciones. Los pasos que el programador ha de realizar son:

1. Estudio del problema a resolver.

2. Desarrollo y verificacion de un algoritmo.

3. Estudio de la codificacion del algoritmo.

4. Escritura de los archivos fuentes.

5. Compilacion.

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 ejecucion.

8. Ejecutar programa.

9. Verificar salida proporcionada por el programa.

Se observa que, cada vez que se modifica alguna parte del codigo fuente es preciso volver acompilar y montar. Esto no sucede si se utiliza un interprete, a pesar de ello los interpretes sonpoco usados pues la ejecucion es mas lenta.

Los programadores cuentan hoy en dıa con aplicaciones que les permiten escribir codigofuente, compilar, montar e incluso ejecutar paso a paso los programas. Estas aplicaciones sonlos llamados entornos de desarrollo como Visual Basic, Visual C, Borland C++, etc. Ademasdel compilador y montador incluyen una herramienta muy util que es el depurador. Medianteel depurador es posible ejecutar paso a paso el programa dejando correr en cada paso las ins-trucciones correspondientes a cada sentencia del codigo fuente. De este modo es mas facil cazarerrores que se hallan producido en el desarrollo del programa o en la codificacion del mismo.

4.5.2 Lenguajes interpretados

El proceso de creacion de modulos objeto y del archivo ejecutable ralentiza mucho las prue-bas sucesivas que a veces es preciso realizar. Los lenguajes interpretados intentan aliviar esteproblema pues la traduccion, montaje y ejecucion se realizan de forma automatica.

c© M.R. Arahal 2009 DISA. ESI. US. 65

Al usar un lenguaje interpretado no es ni siquiera necesario crear un programa completo.El interprete puede ir traduciendo y ejecutando las sentencias una a una. De este modo elprogramador puede ver sobre la marcha el resultado obtenido con cada una de sus lıneas deprograma. No hay pues necesidad de programas depuradores pues el propio interprete es enocasiones el mejor depurador posible.

Los lenguajes interpretados tienen sin embargo ciertos inconvenientes. En primer lugar hayque senalar que el interprete ha de estar constantemente en la memoria, ocupando un espacioque puede ser valioso en equipos pequenos. Por otra parte, puesto que la traduccion ha derealizarse cada vez que se ejecuta una sentencia el tiempo que hay que esperar para ejecutarcada orden del lenguaje interpretado es bastante mayor que el que necesita el mismo programacompilado y montado.

Entre los lenguajes interpretados mas populares hay que citar el LOGO con el que se llevarona cabo variados estudios sobre la educacion en informatica, el BASIC (aunque hubo versionescompiladas) que estaba incluido en la mayor parte de los ordenadores personales y familiaresde la decada de 1980 a 1990, y Maple, Mathematica y MATLAB que son entornos pensadospara ayudar en el aprendizaje y realizacion de calculos matematicos en donde la interaccion delusuario con la maquina recomienda el uso de interpretes sobre compiladores.

4.6 El entorno MATLAB

MATLAB es un programa pensado para realizar calculo numerico, especialmente calculos conmatrices y numeros complejos. Mediante una ventana permite que el usuario escriba ordenesque son interpretadas y ejecutadas en ese momento. A la vista de los resultados el usuario puedecontinuar con otras ordenes hasta que completa la tarea que precisa realizar. Se trata pues deun lenguaje interpretado, lo cual facilita su uso aunque disminuye la velocidad a la que realizalos calculos.

Las ordenes tıpicas son sentencias como y=cos(3)+x/z que permiten al usuario obtener losresultados de calculos complejos. Los resultados pueden ser inspeccionados inmediatamentemediante observacion de los valores de las variables utilizadas o con ayuda de graficos.

Ademas el usuario puede apilar un conjunto de ordenes y enviarlas a la ventana de ordenesformando un lote. De este modo el usuario puede apartarse un rato de la pantalla y descansarmientras aparece la respuesta.

EL conjunto de ordenes disponibles en MATLAB permite realizar tares muy diversas, porlo que constituye un lenguaje de alto nivel para programar la computadora, aunque hay quedecir que MATLAB no fue creado con este proposito. Como ejemplo considerese la version enMATLAB del programa mostrado anteriormente en C. La figura 4.5 muestra que las diferenciasaparentes son mınimas.

En el tema 7 se explicaran las ordenes mas comunes y el manejo de MATLAB para que sirvade banco de pruebas con el cual realizar practicas de programacion.

66 TEMA 4. LENGUAJES Y SISTEMAS

for i=1:10,fprintf(’\n %d %d’, i, i*i );

endfprintf(’\n Fin’);

Tabla 4.5: Ejemplo de programa formado por ordenes de MATLAB

4.7 Ejercicios propuestos

Los siguientes ejercicios sirven para consolidar las ideas mas importantes de este tema.

1. Escriba un programa en lenguaje simbolico para CESIUS que calcule el cuadrado de unnumero que se introduce por teclado.

2. Traduzca a codigo de maquina el programa que se adjunta escrito en lenguaje simbolicopara la computadora CESIUS. Los codigos de operacion aparecen en la tabla 4.2. Sialguna posicion de memoria no tuviese un contenido definido indıquelo escribiendo “ND”(abreviatura de No Definido).

ORG 1

SAL INI

DATO: ESP 1

CP2: CTE 2

CN3: CTE -3

RES: ESP 1

INI: LEE DATO

CAR DATO

MUL CP2

SUM CN3

ALM RES

ALT

FIN

Direccionde memoria

CO MD D

0

1

2

3

4

5

6

7

8

9

10

11

12

3. Para el programa anterior, suponga que se traduce correctamente y se ejecuta. Supongaademas que durante la ejecucion se introduce por teclado el numero 12. Indique el conte-nido que quedan en los registros A, P, I, S, T y E cuando el programa ha finalizado.

Tema 5

Algoritmos

Una vez que se tiene una idea de cual es la estructura y funcionamiento de la computadora digitales posible preparar el camino para lograr su programacion. En primer lugar hay que dejar claroque un programa es una realizacion concreta de un algoritmo que resuelve un problema, por loque 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 programacion. En primerlugar se mostrara la forma de exponer los algoritmos usando el lenguaje natural de las personas.Estas descripciones reciben el nombre de pseudocodigo, y no estan ligadas a ninguna maquinaconcreta. Posteriormente se mostrara como crear representaciones graficas de los algoritmosllamadas diagramas de flujo. Finalmente, se tratan los problemas que aparecen al tratar demodificar programas previamente escritos. La solucion a tales problemas pasa por un conjuntode reglas que, restringiendo la libertad del programador, permiten producir programas legiblesy facilmente modificables.

5.1 Algoritmos y pseudocodigo

Un algoritmo1 es un ”conjunto ordenado y finito de operaciones que permite hallar la solucion deun problema”. No debe confundirse algoritmo con programa, este ultimo es la codificacion delalgoritmo en algun lenguaje de programacion o en instrucciones de la maquina. La resolucionde problemas mediante computadora conlleva dos pasos: hallar un algoritmo y su posteriorcodificacion, lo cual se ha ilustrado de forma grafica en la figura 5.1.

Algoritmo

resolución codificación

Problema Programa

Figura 5.1: Proceso de resolucion de problemas mediante computadora.

1La palabra procede de al-Jwarizmi o Al Juarismı, sobrenombre del celebre matematico Mohamed ben Musa(aprox. 780-850) considerado padre del Algebra.

67

68 TEMA 5. ALGORITMOS

Un algoritmo es una explicacion no ambigua de como resolver un problema. Como ejemploconsiderese una receta de cocina, en ella se indican los pasos a seguir para resolver la tareade producir cierto plato. Los algoritmos con que trataremos aquı tienen un caracter mas ma-tematico.

El pseudocodigo es un modo de especificar la solucion de un problema, es decir, es unaexpresion de un algoritmo dada en lenguaje natural. A modo de ejemplo considerese el problemaconsistente en hallar la media aritmetica de dos valores a y b.

1 Obtener el primer valor, a2 Obtener el segundo valor, b3 Obtener la media m como (a + b)/24 Fin

Cada renglon de la lista anterior contiene una sentencia que especifica una operacion arealizar con los datos para obtener los resultados. Las operaciones necesarias para resolver elproblema han sido especificadas en lenguaje natural (el lenguaje de las personas). De este modoel pseudocodigo es una receta valida para todo programador, cualquiera que sea el lenguaje deprogramacion que vaya a usar. En el ejemplo anterior las operaciones a realizar vienen dadasen secuencia; esto es, una detras de otra. Pero este no es siempre el caso, como ocurre en elsiguiente ejemplo. Considerese la tarea de hallar el valor absoluto de un numero x.

1 Si x es positivo, el resultado es x2 Si no, el resultado es −x3 Fin

Muchos algoritmos requieren la repeticion de un conjunto de operaciones cierto numero deveces. En tales casos es conveniente disponer de un modo para indicar dicha repeticion enlugar de repetir las sentencias. Por ejemplo, el algoritmo para hallar la media aritmetica de lascomponentes de un vector v de dimension 100 podrıa ser el indicado en la tabla siguiente.

1 Iniciar la suma parcial sp a cero2 Iniciar el ındice k a uno3 Hacer:

3.1 Dar a sp el valor sp + vk

3.2 Incrementar el ındice k3.3 Si k > 100 ir al punto 4, si no ir a 3

4 El resultado es sp/1005 Fin

Los tres ejemplos anteriores presentan tres situaciones muy frecuentes en programacion yque seran tratadas con detalle en este capıtulo.

Los algoritmos no sirven solo para operaciones matematicas; como ha sido el caso de losejemplos mostrados, tambien pueden emplearse en otros contextos como el ejemplo de la receta

c© M.R. Arahal 2009 DISA. ESI. US. 69

de cocina. Resulta facil imaginar que si la receta no esta bien explicada es posible que no puedallegarse con exito al objetivo. Tomemos como ejemplo una receta para freir un huevo:

1 Poner aceite en la sarten2 Colocar la sarten en el fuego3 Romper el huevo haciendo caer el contenido en

la sarten4 Tirar las cascaras a la basura5 Poner sal en la yema6 Si el huevo esta solido ir a 7, si no esperar7 Servir el huevo, fregar la sarten8 Fin

Dejando aparte la habilidad manual necesaria, es obvio que si la persona que lee la recetadesconoce el significado de alguna accion sera incapaz de preparar el huevo frito. Esta obser-vacion tambien se puede aplicar a los pseudocodigos de algoritmos matematicos, por lo que hayque poner especial cuidado en utilizar solo aquellos elementos que se suponen conocidos por eloperador (humano o maquina) que ha de realizar las operaciones.

En la literatura especializada se denomina procesador a la entidad que realiza las operacio-nes 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 usandoacciones primitivas. Sobre este tema se volvera mas adelante.

5.2 Objetos y operaciones

En la descripcion de algoritmos es preciso con frecuencia hacer referencia a objetos que hay quemanipular. Considerese el ejemplo de hallar el valor absoluto expuesto anteriormente. En elpseudocodigo hemos utilizado sentencias como ”Si x es positivo, el resultado es x”. En ella hayun objeto x que, por familiaridad con la notacion matematica, hemos identificado sin problemacomo un numero cualquiera.

Al realizar algoritmos se manejan diversos tipos de informaciones, no solo numericas. Con-siderese por ejemplo el problema de cifrar un mensaje para transmitirlo de forma secreta. Unmodo sencillo de cifrar mensajes es cambiar cada letra por la siguiente en el alfabeto. De estemodo, el mensaje: ”estamos bien” se convierte en ”ftubnpt cjfo”. El pseudocodigo siguientepermite realizar la tarea de cifrado.

70 TEMA 5. ALGORITMOS

1 Iniciar ındice k a 12 Hacer:

2.1 Tomar letra la letra de la palabra queocupa el lugar k

2.2 Reemplazar dicha letra por la siguiente enel alfabeto

2.3 Incrementar el ındice k en una unidad2.4 Si k es mayor que el numero de letras ir a

3, si no ir a 23 Fin

En este caso se ha identificado cada letra de la palabra por un sımbolo li. Ademas, se haconsiderado que al sumar uno a una letra se consigue la siguiente letra del alfabeto. Ciertamente,estos no son usos corrientes de la notacion matematica.

Para poder escribir algoritmos de forma comoda y precisa es conveniente nombrar a distintosobjetos (como numeros o letras) usando para ello identificadores o nombres. El identificadorsimboliza una cantidad que puede ser constante o que puede variar a lo largo de la tarea. Cadaidentificador hace referencia a un unico objeto que es de un tipo determinado (numero entero,letra, palabra, numero real, numero complejo, etc.)

En resumen, los objetos tienen un unico nombre que lo identifica. Poseen tambien un tipoque no varıa durante el algoritmo. El valor o cantidad representado por el nombre puedevariar 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 conceptosanteriores considerese el problema de obtener dos numeros enteros a y b y hallarles la media.

1 preguntar el valor de a y b

2 la media m es a+b2

3 Fin

La tabla siguiente muestra los atributos de los objetos que aparecen en el algoritmo anterior.

objeto nombre valor tipo

primer numero a variable numero enterosegundo numero b variable numero enteromedia m variable numero realdos 2 constante numero entero

Observese que los valores de a, b y m pasan de ser indeterminados a tener un valor concretotras los pasos 1 y 2. Por este motivo a y b son variables. La unica constante es el numero dos,que se ha representado con el identificador 2.

Los objetos son manipulados mediante operaciones como la suma, la resta, etc. o medianteotras acciones ”romper”, ”vaciar”. Los enunciados en los que se indican las manipulaciones

c© M.R. Arahal 2009 DISA. ESI. US. 71

son llamados expresiones. Las expresiones muestran la forma en que tal manipulacion serealiza, para ello se combinan los nombres de objetos con signos que simbolizan operaciones.Por ejemplo, al escribir m es a+b

2 se indica que la variable m ha de cambiar su valor tomando elresultado de sumar a y b y dividir por dos. Las operaciones involucradas son la suma aritmetica,la division aritmetica y la asignacion, operacion que necesita un comentario adicional.

No se ha de confundir la asignacion con la igualdad Matematica, aunque en muchos lenguajesde programacion se utiliza para la asignacion el signo =. Como es sabido, en Matematicasse emplea para establecer una relacion de equivalencia entre dos terminos. En lenguajes deprogramacion como C y MATLAB, el signo igual se usa para asignar valores a variables. Deeste modo x = 2 significa que la variable x toma el valor dos en ese momento, pudiendo masadelante alterarse dicho valor mediante una nueva asignacion. Con objeto de evitar confusiones,se usara el signo ←, de forma que se escribira x← 2 para indicar que el valor 2 es asignado a lavariable x.

La descripcion de un algoritmo no sera de ninguna utilidad si contiene operaciones no conoci-das por la persona (o mecanismo) que lo recibe. Los lenguajes de alto nivel ponen a disposiciondel programador muchas operaciones diferentes, por lo que escribir el programa a partir delalgoritmo resulta facil. En cambio, cuando se usa un lenguaje de bajo nivel es preciso describircada tarea en funcion de operaciones simples, por lo que la escritura es larga y tediosa.

Los lenguajes algorıtmicos tienen reglas para la escritura destinadas a obtener algoritmoslegibles. No hay espacio en esta obra introductoria para describir en detalle un lenguaje al-gorıtmico. Sin embargo podemos citar las siguientes restricciones, algunas de las cuales han sidoya comentadas.

• El lenguaje algorıtmico debe tener palabras reservadas como ”iniciar”, ”asignar”, ”incre-mentar”. Los objetos no pueden tomar como nombre ninguna de estas palabras.

• Cada objeto debe tener un identificador. Los identificadores pueden contener letras ynumeros, pero habitualmente comienzan por una letra. Ademas se evita que los identifi-cadores contengan sımbolos que indican operaciones, como +, −, etc.

• El conjunto de acciones primitivas ha de ser especificado con total claridad formando unconjunto pequeno pero suficiente.

A continuacion se indican las convenciones que se utilizan en esta obra para presentar losalgoritmos. Se ha prescindido de algunos de los aspectos formales de la algoritmia en aras deuna presentacion mas concisa e intuitiva.

5.3 Lenguaje algorıtmico

Para este curso se ha seleccionado un lenguaje algorıtmico de complejidad moderada que permiterealizar ejercicios de resolucion de problemas. Los algoritmos expresados con este lenguajeresultan de facil codificacion en la mayorıa de lenguajes de alto nivel como C, Java, MATLAB,Pascal, Basic, Fortran.

72 TEMA 5. ALGORITMOS

A continuacion se presentan las caracterısticas del lenguaje.

5.3.1 Objetos usables

Los tipos de objetos que se utilizaran son tambien los habituales de las Matematicas: numerosenteros y numeros reales. Hay que tener en cuenta que la computadora trabaja con numerosconsistentes en un numero finito de potencias de dos. Esto quiere decir que solo algunos enterosy reales pueden representarse. Para aclarar esto considere el caso se numeros con infinitosdecimales como π o numeros sin decimales que exceden la capacidad de representacion de losregistros de la maquina como por ejemplo 101010

.

Para simplificar las cosas se va a considerar que la computadora proporciona una buenaaproximacion a los enteros y reales que aparecen en la mayorıa de casos practicos.

Hay un tipo especial que es el caracter o elemento literal que viene dado por el codigo ASCIIcorrespondiente del signo en cuestion. Puesto que dicho codigo es un numero entero se tiene queel elemento literal no es mas que un caso especial de numero entero comprendido en el intervalo[0, 255].

Ademas de los tipos simples: enteros, reales y caracteres, se van a considerar sus agrupacionesformando vectores y matrices.

5.3.2 Nombres de los objetos

Los objetos se identificaran mediante un nombre. A fin de facilitar la codificacion posterior seeligiran nombres que puedan ser usados en los lenguajes de programacion. Para ello el nombreo identificador consistira en una combinacion de caracteres que cumpla los requisitos siguientes:

• El nombre comenzara por una letra

• El nombre no contendra espacios en blanco ni signos como +, -, (, etc.

• El nombre sera unico, no pudiendo coincidir con el nombre de otro objeto

• El nombre no podra coincidir con nombres de funciones o de palabras que expresen ope-raciones primitivas como incrementar, asignar, etc.

• El nombre podra contener numeros lo cual no ha de llevar a confusion con el uso desubındices

5.3.3 Operaciones primitivas

Los lenguajes de programacion de alto nivel incorporan muchas operaciones para que resultemas facil la codificacion de algoritmos. Es habitual disponer de operaciones avanzadas comosenos, cosenos, logaritmos, exponenciacion, raıces, calculos con numeros complejos, etc.

c© M.R. Arahal 2009 DISA. ESI. US. 73

Sin embargo, para aprender a programar no hace falta manejar una lista tan amplia deoperaciones. Con la idea de simplificar se van a permitir unicamente unas pocas operacionesque permitan resolver un amplio numero de problemas. La lista de operaciones primitivas quedade este modo reducida a un conjunto mınimo facil de recordar y que se indica a continuacion.

Operaciones aritmeticas . En este grupo se encuentran la suma de dos numeros enteros oreales, la resta de dos numeros enteros o reales, la multiplicacion de dos numeros enteroso reales, la division de un numero entero o real por otro distinto de cero. Ademas seconsidera la operacion cambio de signo que es equivalente a multiplicar por el entero -1.La forma de indicar estas operaciones sera la habitual mediante los sımbolos de la suma(+), resta y cambio de signo (-), division (/) y multiplicacion (·).

Asignacıon . Esta operacion sirve para llevar el resultado de una expresion a una variable. Laasignacion se indica en muchos lenguajes mediante el signo =, lo cual puede dar lugar aconfusiones. Para evitarlas se usara exclusivamente la flecha ← para indicar asignaciones.Ası una expresion como x← 3+2 indica que se ha de asignar el resultado de la operacion3 + 2 a la variable x.

Operaciones de comparacion . Sirven para comparar los valores de objetos. En este grupose incluye la operacion mayor que >, menor que <, igualdad =, distinto a 6=, y combi-naciones como mayor o igual ≥, menor o igual ≤. Estas operaciones dan como resultadoun valor 0 o 1. El valor 0 es equivalente a un resultado falso en la comparacion, mientrasque el valor 1 indica un resultado verdadero, dicho de otro modo el 1 indica que se cumplela comparacion. Por ejemplo 3 > 2 da como resultado 1 mientras que 3 = 2 da comoresultado 0.

Operaciones logicas . Sirven para relacionar varias comparaciones. En este grupo se encuen-tran las operaciones Y (o producto logico), O (o suma logica), NO (o negacion). Comoejemplo de uso considere la expresion x < 1 Y z > 2 que sirve para comprobar si x esmenor que 1 y al mismo tiempo z es mayor que 2.

Parentesis . Los parentesis se usaran con el mismo significado que en Matematicas, para forzara realizar los calculos en un determinado orden. De este modo no sera lo mismo escribir(3 + 2)∆4 que 3 + (2∆4).

Lectura . Es una operacion especial que conlleva dos acciones: en primer lugar la obtencion deun dato del exterior y en segundo lugar la asignacion de dicho dato a la variable indicada.Ası pues la expresion leer x equivale a obtener un dato (normalmente del teclado) y asignarel dato a la variable x.

Escritura . Es una operacion especial que consiste en enviar un valor a un dispositivo externo,normalmente la pantalla.

Subindexacion . A fin de poder trabajar con vectores y matrices de forma sencilla se admiteuna operacion mas consistente en el acceso a componentes individuales de vectores ymatrices mediante subındices. De este modo si v es el nombre de un vector de enteros y xun entero, entonces la expresion v2 ← x + 3 indica que se ha de asignar el valor x + 3 alsegundo elemento del vector v.

Llamadas a funciones . Ademas de las operaciones primitivas comentadas se permitira deforma ocasional el uso de funciones. Una expresion como y ← Seno(3.5) indica que seha de calcular la funcion Seno con argumento (variable independiente) igual a 3.5 y el

74 TEMA 5. ALGORITMOS

resultado se ha de asignar a la variable x. Solo se permitira el uso de funciones en dossupuestos: o bien funciones previamente realizadas por el alumno o bien funciones queexplıcitamente se hayan permitido para un problema particular. Este es el caso de lafuncion ParteEntera() de la que se hablara mas adelante.

5.3.4 Ejemplos

A fin de ilustrar el uso del lenguaje algorıtmico se desarrollan ahora las soluciones a unosproblemas simples. Tenga en cuenta que la forma final de indicar los algoritmos sera mediantediagramas de flujo por lo que estos ejercicios representan un paso intermedio.

Suma de dos numeros

Como primer ejercicio considere el problema consistente en ”leer dos numeros y escribir lasuma”. En primer lugar se ha de decidir que objetos utilizar y proporcionarles un identificador.Puesto que el enunciado no indica lo contrario conviene tomar dos objetos del tipo variables realespara los datos. A continuacion se toma la determinacion de denominar a al primer sumando yb al segundo sumando. Por otra parte la suma sera otro objeto cuyo tipo es real. Se elige comoidentificador c.

Un posible algoritmo es el siguiente:

1 Leer A2 Leer B3 C ← A + B4 Escribir C5 Fin

Conviene observar que para asignar su valor a la variable c se ha usado la notacion c← a+b,que significa introducir en c el valor a+b; esto no debe inducir a pensar que c = a+b en el sentidomatematico dado usualmente a tales ecuaciones. La interpretacion correcta es que la variable ctoma en ese instante el valor corrrespondiente a la suma a+b, pudiendo posteriormente cambiareste valor por otro en el curso del algoritmo.

Media de dos numeros

El enunciado del problema es ”calcular y escribir la media de dos numeros enteros”. Los datosa leer son dos enteros. Se elige como identificadores x e y. El resultado es un valor real que sedenominara m. Ademas sera preciso utilizar la constante 2.

Un posible algoritmo es el siguiente:

c© M.R. Arahal 2009 DISA. ESI. US. 75

1 Leer x2 Leer y3 m← (x + y)/24 Escribir m5 Fin

5.4 Diagramas de flujo

Un diagrama de flujo u organigrama es una representacion grafica de las distintas operaciones quedeben ser realizadas por un operador (humano o mecanico) para la resolucion de un problema,indicando el orden logico de las mismas, las posibles alternativas, etc.

Existen muchos tipos de representaciones graficas. En este texto se va a usar un conjunto desımbolos para representar acciones y decisiones, conectados por flechas que indican el orden enque se realizan. Hay que hacer notar que la representacion grafica de un algoritmo no es exclusivade la informatica, sino que puede usarse en cualquier entorno que requiera planificacion. Masaun, la representacion del algoritmo es independiente de la programacion en un lenguaje u otroo de la maquina en que vaya a ser ejecutado.

5.4.1 Bloques constructivos

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 modulo. Marca el comienzo del algoritmo o de un modulo del mismo.

• Proceso. Este elemento indica la realizacion de operaciones diversas. Equivale a una o massentencias del pseudocodigo.

• Bifurcacion condicional. Permite elegir una de entre dos opciones en funcion de ciertacondicion que se ha de especificar. Permite representar operaciones de decision como ”si... , entonces ... ; si no ...”, como se ha visto en el ejemplo del pseudocodigo paracalcular el valor absoluto de un numero.

• Operacion de entrada o salida. Gracias a este bloque se pueden tomar datos del exte-rior (entrada) o enviar resultados al exterior de la computadora (salida). Equivale a lasoperaciones de lectura y escritura del pseudocodigo.

• Fin de modulo. Marca el final de un modulo.

• Funcion o subprograma. Los subprogramas son bloques de codigo preparados para serincluidos en programas, de forma que se ahorre tiempo de preparacion de los mismos. Unsubprograma se hace cargo de una parte de la tarea que puede ser repetida en varias partesdel programa o en programas distintos. Por ejemplo, el calculo de la norma de un vectoro el determinante de una matriz.

76 TEMA 5. ALGORITMOS

Las funciones son subprogramas que se comportan como programas pues aceptan datos ydevuelven resultados. El nombre de funcion proviene de su semejanza con las funcionesmatematicas. Esta semejanza estriba en la toma de datos y la devolucion de resultados.

• Modulo. Este sımbolo indica que la operacion es realizada por un bloque que se detallaen otro lugar. Un modulo se diferencia de un subprograma en que este tiene siempreentidad propia en el codigo, mientras que el modulo es el resultado de una division enla representacion grafica y su existencia no afecta a la codificacion. El modulo permitedividir un diagrama en partes por cuestiones de claridad de presentacion. Las funcionesen cambio tienen mayor versatilidad, como se vera mas adelante.

• Inicio y actualizacion. Realizacion de operaciones iniciales de un modulo. Asignacion devalores iniciales y modificacion de ındices y contadores, usados sobre todo en bucles.

Inicio de módulo Proceso Bifurcación Entrada o salida

Fin de módulo Función Módulo Preparación o actualización

Figura 5.2: Bloques para la confeccion de diagramas de flujo.

A modo de ejemplo considerese el problema consistente en ”leer dos numeros y escribir lasuma”. El pseudocodigo correspondiente a este programa ya se ha comentado anteriormente yse muestra en la tabla 5.1.

1 Leer primer sumando A2 Leer segundo sumando B3 Hallar la suma de los sumandos C ← A + B4 Escribir C5 Fin

Tabla 5.1: Programa para sumar dos numeros y escribir el resultado.

La figura 5.3 muestra el diagrama de flujo correspondiente al algoritmo de la tabla 5.1. Puedeobservarse que el diagrama de flujo simplemente proporciona una forma grafica al algoritmo.

c© M.R. Arahal 2009 DISA. ESI. US. 77

leer dato A

leer dato B

calcular

C A + B

escribir C

fin

inicio

Figura 5.3: Diagrama de flujo de un programa para sumar dos numeros.

5.4.2 Tabla de objetos

Un diagrama de flujo define las operaciones que se van a realizar con ciertos objetos. No obstante,para que el algoritmo quede completamente especificado es preciso ademas indicar que objetosvan a ser utilizados.

Cuando se trabaja con computadoras es de gran importancia destacar las caracterısticasde los objetos usados por un programa. La informacion acerca de si un objeto es constanteo variable, si es de tipo entero, real o literal y otras caracterısticas se puede proporcionar pormedio de una tabla.

Por ejemplo, para el algoritmo cuyas acciones vienen explicadas en el diagrama de la figura5.3 serıa necesaria una tabla donde se declarasen los objetos que se utilizan. La tabla puedetener la forma siguiente:

Objeto Identificador Tipo Valor

Primer sumando. Dato. A real variable

Segundo sumando. Dato. B real variable

Resultado (suma de A y B) C real variable

Las declaraciones de objetos son realizadas en los lenguajes de alto nivel mediante sentenciasespeciales. Su importancia no es poca pues hay muchos errores que pueden derivarse de un usoincorrecto de objetos. Por ejemplo, si el cociente de una division se almacena en una variableque es entera, los decimales que se produzcan se pierden. Esto da lugar sin duda a fallos decalculo con repercusiones imprevisibles.

La tabla de objetos complementa al diagrama y facilita el analisis del mismo. Por este motivoel identificador dado al objeto y su explicacion han de ser lo mas claros posibles. De este modose facilita la tarea de un programador que necesite analizar un algoritmo hecho por otra persona.

78 TEMA 5. ALGORITMOS

5.4.3 Ejemplos

En este apartado se van a mostrar algunos ejemplos de diagramas de flujo que permitan concretary aclarar las ideas recien presentadas. No se pretende que el lector sea capaz de producir todavıadiagramas como los que siguen. Esa tarea se deja para capıtulos posteriores. En lugar de eso ellector debe intentar simplemente utilizar los algoritmos para, de este modo, familiarizarse conel uso de los diagramas y tablas.

Se trata de algoritmos muy simples y que sin embargo contienen la esencia de muchos de losproblemas que se propondran en capıtulos posteriores.

Ecuacion de segundo grado

El problema que se desea resolver se enuncia del siguiente modo: ”Calcular y escribir n, elnumero de soluciones reales y distintas de la ecuacion de segundo grado del tipo ax2+bx+c = 0.El algoritmo debe tomar como datos los coeficientes a, b y c. El resultado ha de ser un numeron ∈ 0, 1, 2 segun haya ninguna, una o dos soluciones reales”.

El diagrama de flujo y la tabla de objetos pertenecientes a un algoritmo que posiblementeresuelve el problema anterior se muestran en la figura 5.4

Para analizar el algoritmo es conveniente hacer algunas pruebas a mano con un conjunto dedatos controlado. Por ejemplo, si a = 1 y b = c = 0 se obtiene la ecuacion x2 = 0 que tiene comosolucion trivial x = 0, por lo que el algoritmo debiera proporcionar el valor n = 1. Se deja comoejercicio al lector seguir los pasos que el diagrama de flujo indica. El resultado proporcionadopor el diagrama ha de compararse con el resultado previamente conocido.

Hay que resaltar que este tipo de pruebas no permite validar el algoritmo completamente.Esto es ası porque un algoritmo puede dar resultados correctos en muchas situaciones y sinembargo no ser valido universalmente pues puede que contenga errores que no se han manifestadocon esos datos. A pesar de ello la prueba de algoritmos en casos previamente conocidos es unbuen ejercicio en esta etapa inicial.

El analisis de algoritmos es una disciplina compleja que, por falta de espacio, no podemosabordar de modo sistematico. En lugar de eso dejamos al lector la tarea de usar su perspicaciay sentido comun para intentar decretar la validez de los algoritmos que se propongan.

Media de alturas

El problema que se desea resolver se enuncia del siguiente modo: Se desea crear un programa decomputadora que permita obtener la media de alturas de un grupo de personas en una habitacion.Se quiere que el operador del programa (el usuario del programa) vaya midiendo a las personas yescribiendo en el teclado sus alturas en centımetros. Cuando no queden mas personas por medirel operador escribira una altura negativa. Esta sera la senal para que el programa deje de leeralturas y calcule la media de los valores previamente introducidos.

c© M.R. Arahal 2009 DISA. ESI. US. 79

Leer a, b y c

Inicio

¿ discr > 0 ?

no

Fin

Escribir n

n 0

discr b·b - 4·a·c

n 2

¿ discr = 0 ?

no

n 1

a Variable

real

Primer coeficiente de

la ecuación ax 2 + bx + c =0

0, 1 ,2

Constantes enteras

Valores que puede tomar el resultado

n Constante entera

Resultado. Número de raíces reales y distintas de la ecuación ax 2 + bx + c =0

b Variable real

Segundo coeficiente de la ecuación ax 2 + bx + c =0

c Variable real

Tercer coeficiente de la ecuación ax 2 + bx + c =0

discr Variable real

Discriminante, calculado como b 2 -4ac

Figura 5.4: Algoritmo para calcular el numero de soluciones reales y distintas de una ecuacionde segundo grado.

80 TEMA 5. ALGORITMOS

El diagrama de flujo y la tabla de objetos pertenecientes a un algoritmo que posiblementeresuelve el problema anterior se muestran en la figura 5.5

Leer altura

Inicio

¿ altura > 0 ?

no

Fin

Escribir media

suma 0

cont 0

suma suma+altura

cont cont+1

media suma/cont

Leer altura

altura Variable entera

Variable usada para leer sucesivamente las alturas de cada persona

0 Constante entera

Valor inicial

cont Variable

entera

Contador del número de

personas medidas

suma Variable entera

Variable usada para agregar las alturas leídas

media Variable real

Resultado. Media de alturas calculada dividiendo la suma por el número de personas

1 Constante entera

Valor para incrementos

Figura 5.5: Algoritmo para calcular la media de alturas.

Es posible realizar pruebas del algoritmo con uno o varios conjuntos de datos previamenteanalizados. Por ejemplo, se supone que en la habitacion hay dos personas con alturas 172cmy 178cm respectivamente. Teniendo en cuenta estos datos se han de seguir las indicacionescontenidas en el diagrama del mismo modo que se llevarıan a cabo los pasos de una receta decocina. En cada paso las variables han de modificarse de acuerdo con las operaciones marcadasen el bloque.

Es facil ver que hay que proporcionar tres alturas: 172, 178 y finalmente -1 para indicar queno hay mas personas. Durante el desarrollo del algoritmo la variable suma pasa de valer ceroa 172 y luego 172 + 178. El resultado que se obtiene viene dado por la variable media que secalcula como suma/cont que resulta valer 250/2=175. Este resultado coincide con el resultadocorrecto para estos datos concretos.

Del mismo modo puede ponerse a prueba el algoritmo con otros conjuntos de datos, porejemplo con las alturas: 172cm, 174cm y 178cm. Un caso particularmente interesante ocurrecuando el algoritmo es usado para calcular la media de alturas del conjunto vacıo, es decir,cuando se utiliza con cero personas.

c© M.R. Arahal 2009 DISA. ESI. US. 81

5.5 Fases del proceso de resolucion de problemas

Es difıcil concretar en proceso de resolucion de problemas pues cada problema plantea dificulta-des especiales. No obstante hay una serie de reglas que conviene observar a la hora de construiralgoritmos.

• Definicion del problema, de forma que quede absolutamente claro que es lo que se pretenderesolver. Ademas hay que especificar cuales son los datos y cuales los resultados buscados.

• Esbozo de la solucion. El problema debe partirse en trozos para los cuales se sospechaque puede haber soluciones conocidas. Es preciso asegurarse que al resolver los trozos seconsigue la solucion del problema total.

• Resolucion de los subproblemas y prueba de la validez de los mismos.

• Expresion en pseudocodigo 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 programacion estructurada, que seratratada mas adelante. El tipo de problemas que se resuelve para dar los primeros pasos en pro-gramacion es muy simple por lo que no es facil ver la utilidad de las recomendaciones anteriores.

5.6 Programacion estructurada

Es difıcil hacer un resumen de las ideas de la programacion estructurada a lectores que no tienencierta experiencia en programacion. Esto sucede porque la programacion estructurada pretendeevitar cierto tipo de situaciones que aparecen en programas grandes y medianos, pero que nose advierten en los ejemplos dados a principiantes. Una de estas situaciones es la siguiente: unprogramador escribe un diagrama de flujo tal y como aparece en la parte derecha de la figura 5.6.Transcurrido cierto tiempo, el mismo programador es requerido para realizar una modificacionen el mismo. Este intenta modificar el diagrama, pero la tarea le resulta ardua. Analizando losmotivos por los que el trabajo no avanza con rapidez se puede observar que:

• Es difıcil hallar el punto en el cual hay que eliminar un bloque o insertar uno nuevo, puestodo esta enmaranado.

• Incluso aunque el diagrama tuviera una mejor disposicion grafica, cuesta trabajo ver siuna modificacion de una parte dara resultados indeseables en otra, debido al gran numerode interconexiones que hay.

Y los problemas no acaban ahı. Tras realizar los cambios, el programador debera probar elnuevo programa para comprobar su correcto funcionamiento. Cada vez que se detecte un errordebera volver a repetir el tedioso proceso de modificacion. Los problemas descritos no serıantales si el programador hubiera podido escribir el diagrama de flujo de forma parecida a la de

82 TEMA 5. ALGORITMOS

Figura 5.6: Diagrama de flujo estructurado (izquierda) y no estructurado (derecha).

la figura 5.6 (izquierda), en la que se aprecia que no existen cruces de lıneas y que cada modulotiene una entrada y una salida. Sobre estos dos aspectos se insistira mas adelante, por ahora noes necesario comentar mas las ventajas que para cualquier proyecto supone el tener programaslegibles y comprensibles.

5.6.1 Flujo lineal

Los diagramas se dice que tienen flujo lineal cuando no existen conexiones de vuelta atras olaterales. El flujo lineal se puede conseguir restringiendo las uniones entre bloques constructivosa estructuras de entrada unica y salida unica. Es decir, usando para la confeccion del diagramade flujo grupos de bloques a los cuales llega solo una flecha y de los cuales parte solo una flecha.La secuencia, la seleccion entre alternativas y la iteracion forman un conjunto suficiente demodulos constructivos para describir cualquier algoritmo. Es decir, es posible siempre realizarun diagrama de flujo que contiene solo las estructuras citadas. En la figura 5.7 se tienen talesestructuras; se puede ver que son de entrada unica y salida unica.

Estas estructuras permitidas reciben los nombers que se indican a continuacion. De izquierdaa derecha en la citada figura 5.7 se tiene un par de bloques formando una secuencia, una bi-furcacion y bloques articulados en una estructura disyuntiva, una bifurcacion con conexionhacia atras formando un blucle o estructura repetitiva con salida en cola y, finalmente, unabifurcacion formando una estructura repetitiva con salida en cabeza.

En lo sucesivo se usaran estas estructuras (y ninguna otra) para realizar los diagramasde flujo, pero antes de pasar a los ejemplos es preciso comentar como se va a producir ladescomposicion del problema global en modulos.

c© M.R. Arahal 2009 DISA. ESI. US. 83

módulo 1

módulo 2 condición

cuerpo del bucle

sí no

pregunta sí no

opción 2 opción 1

pregunta

cuerpo del bucle

no

secuencia disyunción repetición con salida en cola

repetición con salida en cabeza

Figura 5.7: Construcciones o uniones de bloques permitidaspara programas estructurados.

5.6.2 Analisis descendente

En ocasiones se presenta la programacion estructurada como un conjunto de reglas a seguir. Enrealidad no hay una definicion exacta de programacion estructurada, por lo que las reglas sonsolo una aproximacion. Una idea importante de la programacion estructurada es el analisis

descendente o jerarquizado. Consiste este en identificar las funciones o tareas a cumplir porel programa desde un punto de vista global y proceder luego a descomponer estas funciones enotras menores. Estas a su vez se vuelven a descomponer en un proceso que termina cuando sealcanza el nivel del lenguaje o codigo usado. De este modo, el diseno del programa se realizapor niveles. Se comienza por el nivel mas general y se termina por lo particular o concreto.

El resultado del analisis descendente es un conjunto de diagramas que describen el algoritmocon un nivel de detalle creciente. En un primer nivel el diagrama de flujo puede tomar la formadada en la figura 5.8 en la parte superior. En un segundo nivel, cada uno de los modulos esdetallado en un diagrama aparte. El proceso continua mientras existan bloques que necesitenexplicaciones adicionales.

Es importante que antes de pasar al siguiente nivel se compruebe la validez del diagramaactual. Para ello se ha de comprobar que las construcciones utilizadas pertenecen al conjuntode las estructuras permitidas.

84 TEMA 5. ALGORITMOS

Inicio de lectura de datos

Fin de lectura de datos

...

Inicio de cálculo de resultados

Fin de cálculo de resultados

...

Inicio de escritura de resultados

Fin de escritura de resultados

...

Inicio

Fin

Lectura de datos

Cálculo de resultados

Escritura de resultados

Figura 5.8: El analisis descendente aplicado a la confeccion de diagramas de flujo.

Tema 6

Desarrollo de algoritmos basicos

Antes de comenzar a programar es preciso saber desarrollar algoritmos. Como se ha visto en eltema anterior, un algoritmo es una descripcion detallada de los pasos a seguir para resolver unatarea. Los pasos han de ser operaciones capaces de ser llevadas a cabo por el operador al cualva dirigido el algoritmo.

A fin de poder abordar problemas complejos es preciso aprender a disenar correctamentealgoritmos y sus diagramas respetando las reglas de la programacion estructurada. Para ellose presentan en este tema una serie de algoritmos basicos los cuales se han dividido en variosgrupos.

6.1 Calculos en secuencia

Los calculos en secuencia no presentan dificultad alguna desde el punto de vista algorıtmico.Los diagramas de flujo resultantes son lineales, sin bifurcaciones ni ciclos o repeticiones, y portanto de facil creacion.

Un programa evoluciona de modo lineal cuando realiza toda la secuencia de instrucciones deforma continua, sin saltos en la ejecucion. Este es el caso presentado en el ejemplo de la sumade dos numeros (ver figura 6.1). La realizacion y representacion en diagrama de flujo de estosprogramas es muy simple.

6.1.1 Ejercicios

Se propone realizar el diagrama de flujo de algoritmos que resuelvan las tareas siguientes:

• Leer dos valores reales p y q del teclado y escribir media aritmetica.

• Leer un valor real x del teclado. Calcular y escribir r = x2 − 2x3.

85

86 TEMA 6. DESARROLLO DE ALGORITMOS BASICOS

a Variable real primer dato b Variable real segundo dato

c Variable real resultado, suma de a y b

Escribir c

Leer a

Inicio

c a+b

Fin

Leer b

Figura 6.1: Diagrama de flujo de un algoritmo para sumar dos numeros.

• Leer los coeficientes de un polinomio de grado tres de la forma P (x) = x3 + ax2 + bx + c.Leer a continuacion un cierto valor para la variable independiente x y calcular y escribiry = P (x).

• Convertir a radianes un valor de angulo medido en grados sexagesimales.

• Calcular y escribir la temperatura T que corresponde a un mol de gas ideal sometidoa una presion P cuando ocupa un volumen V . Se supone que los valores de P y V seproporcionan por teclado.

6.2 Estructuras selectivas

Las disyunciones o estructuras selectivas se construyen mediante un bloque bifurcacion conectadodos modulos que despues vuelven a unirse. En el interior de cada modulo puede haber otrasestructuras permitidas: secuencias, iteraciones, etc.

Las bifurcaciones permiten tomar un camino o su alternativa, permitiendo que el programadiscurra por uno de dos caminos posibles en funcion de condiciones. Un ejemplo muy simple esel siguiente: leer un numero real por teclado y escribir el valor absoluto del mismo. Una formade resolver el programa es mediante el diagrama de flujo de la figura 6.2. La idea es hacer quela secuencia de ejecucion pase por la escritura del numero o del numero cambiado de signo enfuncion de que sea positivo o negativo.

Nota importante: en este libro la palabra positivo se ha de entender como ”mayor que cero”quiere esto decir que el numero cero no forma parte del conjunto de los numeros positivos.

Las bifurcaciones se pueden encadenar para dar solucion a situaciones mas complejas. Porejemplo considerese la funcion: NC(x, y), con (x, y) ∈ IR2 7→ c ∈ {1, 2, 3, 4}. Esta funcion calculael numero de cuadrante en que se encuentra el punto (x, y) de IR2. Se desea desarrollar unalgoritmo que lea las coordenadas x e y de un punto del plano (suponiendo que x 6= 0 y quey 6= 0) y calcule y escriba r =NC(x, y).

c© M.R. Arahal 2009 DISA. ESI. US. 87

x Variable real dato

r Variable real resultado, valor absoluto de x

Escribir r

Leer x

Inicio

Fin

¿ x < 0 ? sí no

r -x r x

Figura 6.2: Diagrama de flujo con ruptura de secuencia.

El diagrama de la figura 6.3 presenta una posible solucion mediante el uso de bifurcacionesen cascada.

y Variable real dato, coordenada y

r Variable entera

resultado, cuadrante

Escribir r

Leer x e y

Inicio

Fin

¿ x > 0 ? sí no

r 4

¿ y > 0 ? sí no

r 1 r 3

¿ y > 0 ? sí no

r 2

x Variable real dato, coordenada x

Figura 6.3: Programa que escribe el cuadrante en el cual se situa el punto del plano dado por(x, y).

6.2.1 Ejercicios

Utilizando las ideas que se han presentado en los puntos anteriores desarrolle algoritmos queden solucion a los problemas siguientes:

• Leer un numero real x y calcular y escribir r =| x |3.

• Calcular el coste de una llamada telefonica que ha durado t minutos sabiendo que si t < 1el coste es de 0.4 euros mientras que para duraciones superiores el coste es 0.4 + (t− 1)/4euros.

88 TEMA 6. DESARROLLO DE ALGORITMOS BASICOS

• Leer un numero real del teclado. Calcular el valor de p sabiendo que si x esta en elintervalo (2, 8] el resultado p toma el valor uno, en caso contrario toma el valor cero.Escribir posteriormente el valor de p.

• Leer un valor x del teclado. Calcular y escribir el valor y = f(x) siendo f una funciondefinida a trozos del siguiente modo:

x f(x)

x ∈ [−1, 3) 10− xx > 50 1resto 0

• Leer las componentes de un vector de IR2 (x e y). Calcule el valor de r que se define comor =NC(x, y) si x 6= 0, y 6= 0 y r = 0 si x = 0 o si y = 0.

6.3 Estructuras cıclicas

Muchos algoritmos requieren la repeticion de operaciones cierto numero de veces. Al conjunto deoperaciones que se repite se le llama cuerpo del proceso repetitivo. Un ciclo (o proceso repetitivoo bucle) queda completamente definido por el cuerpo y la condicion de parada o salida. Cadavez que el programa en ejecucion pasa por el cuerpo del bucle se dice que ha realizado unaiteracion.

La estructura denominada proceso repetitivo o bucle permite plasmar en diagramas de flujoeste tipo de procesos. La bifurcacion 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, de este modo sepuede salir del bucle sin haber realizado ninguna operacion. Ambos tipos de proceso iterativosse muestran en la figura 6.4.

condición

cuerpo

sí no

condición

cuerpo

no

Figura 6.4: Estructuras repetitivas con control de salida en la cola (diagrama de la izquierda) ycontrol de salida en la cabeza (diagrama de la derecha).

A modo de ejemplo considerese la tarea de construir un vector v de dimension n de forma quela componente k−esima tenga el valor vk = k2−4. Por ejemplo, para n = 2 el vector resulta serv = [−3, 0], para n = 3 se obtiene v = [−3, 0, 5]. El problema que se quiere resolver es calcularlas componentes de v para un valor concreto de la dimension n que se proporcione. Dicho deotro modo, el algoritmo tendra que requerir un valor concreto de n y calcular las componentesv1 a vn. Se supondra que n es entero y positivo.

c© M.R. Arahal 2009 DISA. ESI. US. 89

El diagrama de la figura 6.5 presenta una posible solucion al problema haciendo uso deuna estructura repetitiva con salida en la cola. Es muy conveniente dedicar unos minutos acomprobar que el algoritmo resuelve el problema. Para ello pruebe a seguir mediante calculosa mano los pasos indicados en el diagrama para n = 1, n = 2, n = 3. Una vez realizado esteejercicio no le resultara difıcil determinar que el algoritmo ha de funcionar necesariamente paratodo n > 0.

k Variable entera

Índice para recorrer v. Variable auxiliar

Leer n

Inicio

Fin

¿ k > n ?

no

v k k·k -4

n Variable entera

Dato, dimensión de v

k 1

k k+1

v k Variable entera

Componente k-ésima de v calculada mediante la expresión k 2 -4

v Variable vector de enteros

Resultado, vector v

Figura 6.5: Construccion de un vector mediante proceso iterativo con salida en la cola.

En el diagrama de la figura 6.6 se muestra otro diagrama que utiliza un bucle con salida enla cabeza. Compruebe tambien mediante pruebas a mano que este diagrama realiza la mismatarea que el del ejemplo anterior.

Debido a la sencillez de este ejemplo puede parecer que ambas maneras de realizar unaestructura cıclica son equivalentes de un modo trivial. Aunque es cierto que se puede pasarde una a otra esto no siempre se logra con facilidad. Ademas hay que tener en cuenta quealgunos lenguajes de programacion estan orientados a usar una de ellas, por ejemplo en el casode MATLAB siempre se prefiere la comprobacion de salida en cabeza.

El bloque constructivo llamado modulo puede usarse para mejorar el aspecto visual de losdiagramas de flujo. En particular si un diagrama consta de varias estructuras repetitivas puedeser interesante dedicar un modulo a cada uno de ellos. Para ilustrar esta idea considere elproblema cuyo enunciado es ”Se ha de leer una lista de n numeros reales, siendo n un enteroque ha de leerse previamente. Posteriormente se escribira la lista en orden inverso. Se supondraque n > 0”. La figura 6.7 muestra el diagrama de flujo de una posible solucion. Dicho diagramaincluye dos modulos que se detallan en diagramas separados. La tabla de objetos es unica pueslos diagramas correspondientes a los modulos se interpretan como parte del diagrama general.A todos los efectos se trata por tanto de un unico diagrama con la particularidad de que algunaspartes (los modulos) se detallan de forma separada.

Puede verse que los modulos ayudan a comprender mejor el algoritmo. Cada parte deldiagrama puede abarcarse de un golpe de vista, facilitando su comprension y el analisis de su

90 TEMA 6. DESARROLLO DE ALGORITMOS BASICOS

k Variable entera

Índice para recorrer v. Variable auxiliar

Leer n

Inicio

Fin

¿ k > n ?

no n

Variable entera

Dato, dimensión de v

k 1

v k Variable entera

Componente k-ésima de v calculada mediante la expresión k 2 -4

v Variable vector de enteros

Resultado, vector v

v k k·k -4

k k+1

Figura 6.6: Construccion de un vector mediante proceso iterativo con salida en cabeza.

validez.

6.3.1 Ejercicios

Los siguientes ejercicios se pueden resolver con ayuda de estructuras cıclicas. Utilice modulos enaquellos casos en que el diagrama resultante sea demasiado largo. Recuerde que los diagramasno pueden cortarse.

• Leer las 10 componentes de un vector de reales de dimension 10. Escribirlo luego en lapantalla.

• Leer un entero n supuesto n > 0 y un vector v ∈ IRn×1, calcular y escribir el productoescalar m = vtv, m ∈ IR, donde vt simboliza el vector transpuesto de v.

• Leer n (suponiendo que es entero y positivo). Leer a continuacion las n componentes deun vector de numeros reales dimension n. Calcular y escribir luego la media aritmetica desus componentes.

• Leer un numero real x y otro entero z. Calcular y escribir y = xz suponiendo que z ≥ 0.

• Leer n (suponiendo que es entero y positivo). Calcular y escribir f = n!.

• Leer n (suponiendo que es entero y positivo) y un vector de dimension n. Calcular yescribir la componente de mayor valor.

• Leer n (suponiendo que es entero y positivo) y un vector de dimension n. Calcular yescribir la componente de mayor valor y su ındice dentro del vector.

c© M.R. Arahal 2009 DISA. ESI. US. 91

k Variable enteraÍndice para recorrer vVariable auxiliar

n Variable enteraDato, dimensión de v

vk Variable realComponente k-ésima de v

vVariable vector de nreales

Dato, vector v

Inicio

Fin

Lectura devector v

Leer n

Escriturainversa devector v

Leer vk

Inicio de lectura devector v

Fin de lectura devector v

¿ k n ?no

k 1

k k+1

Escribir vk

Inicio de escriturainversa de vector v

Fin de escriturainversa de vector v

¿ k 1 ?

k n

k k-1

≥no

1 Constante enteraConstante para dar valorinicial y modificar k

Figura 6.7: Diagrama de flujo con modulos para el problema de la escritura inversa.

92 TEMA 6. DESARROLLO DE ALGORITMOS BASICOS

• Leer n (suponiendo que es entero y mayor que uno). Construir un vector v ∈ IRn×1 talque vk = vk−1/3 + 0.5 para k = 2, ..., n y siendo v1 = 1.

• Leer n (suponiendo que es entero y mayor que dos). Construir un vector v ∈ IRn×1 tal quesus componentes sean los terminos de la sucesion de Fibonacci1.

• Se han medido las longitudes de tornillos procedentes de un mismo lote de fabricacion. Sehan dispuesto en un vector v de dimension n > 2. Disene un algoritmo para calcular lamedia y la varianza de las longitudes. La varianza se calcula como var = 1

n

∑nk=1 (vk − µ)2,

siendo µ la media aritmetica de las componentes de v.

6.4 Ciclos dobles

El cuerpo de una estructura repetitiva no es necesariamente un modulo simple sino que puedecontener otras estructuras. En el punto anterior se han expuesto diversos ejemplos en los cualesel cuerpo contiene exclusivamente estructuras en secuencia. No existe ningun impedimento paraque el cuerpo contenga estructuras selectivas o incluso otros ciclos.

Cuando un ciclo contiene a otro se obtiene una estructura doblemente repetitiva2. En cadaiteracion del ciclo externo se realizan varias repeticiones del cuerpo del ciclo interno.

Las repeticiones dobles son especialmente apropiadas para trabajar con matrices A ∈ IRm×n.En muchas situaciones es preciso recorrer los elementos de la matriz para realizar de este modola lectura, escritura o cualquier otro calculo. Se plantea en estos casos el problema de considerartodos los posibles elementos akj de la matriz. Conviene recordar que el elemento generico akj

tiene dos subındices: k (filas) y j (columnas) que varıan en los intervalos: k = 1, 2, ..., m yj = 1, 2, ..., n.

Para trabajar con matrices se puede emplear un ciclo dentro de otro. Normalmente el cicloexterno recorre el ındice de filas y el interno el ındice de columnas. En la figura 6.8 se presentaun diagrama de flujo que puede utilizarse para recorrer la matriz. Los ejercicios que se proponena continuacion se pueden resolver con la estructura de esta figura (aunque alguno de ellos puederesolverse con estructuras mas simples).

• Lectura/escritura de una matriz m× n. Se han de leer del teclado las dimensiones m y n(suponga que son numeros enteros positivos). A continuacion se han de leer los elementosakj de una matriz A de m filas y n columnas. Finalmente se presentara en la pantalla lamatriz leıda.

• Construir una matriz A ∈ IRm×n cuyo elemento generico akj viene dado por akj = k2 − j.

• Dada una matriz (se supone ya leıda) A de dimensiones m× n, se quiere anular (poner acero) los elementos de su diagonal principal y escribir la matriz resultante.

1La sucesion de Fibonacci comienza con a1 = 1, a2 = 1 y posteriormente cada termino ak es la suma de losdos anteriores ak−1 + ak−2 para k > 2.

2Llamada frecuentemente bucles anidados por ser estas palabras la traduccion literal de nested loops.

c© M.R. Arahal 2009 DISA. ESI. US. 93

iniciar j a 1

Incrementar j

Incrementar k

iniciar k a 1

Operar con el elemento a kj

¿ k > m ? sí

no

¿ j > n ? sí

no

Figura 6.8: Diagrama de flujo que permite recorrer una matriz gracias a dos estructuras repeti-tivas.

94 TEMA 6. DESARROLLO DE ALGORITMOS BASICOS

• Traza de una matriz. Dada una matriz cuadrada A ∈ IRn×n dada siendo n > 0 un enterotambien dado se ha de disenar un algoritmo que permita obtener la traza de A (suma delos elementos de la diagonal).

• Suma de matrices. Dadas (suponga que ya han sido leıdas) dos matrices A ∈ IRm×n yB ∈ IRm×n se quiere calcular y escribir la matriz C obtenida como suma de las anterioresC = A + B.

• Matriz traspuesta. Dada una matriz A ∈ IRm×n calcular su traspuesta B = At.

• Submatriz triangular. Dada una matriz A ∈ IRm×n se desea calcular otra matriz B ∈ IRm×n

cuyos elementos son todos cero excepto los de la submatriz triangular inferior que son igua-les a los elementos de igual posicion de A. Es decir, los elementos que estan por debajode la diagonal principal de A se copian en B, el resto de elementos de B valen cero. Sesupone que tanto m como n son numeros enteros mayores que uno.

• Maximo de una matriz. Dada una matriz A ∈ IRm×n calcular el elemento mayor.

• Maximo de cada fila. Dada una matriz A ∈ IRm×n con m > 1 y n > 1 dados se deseacalcular un vector v ∈ IRm cuya componente generica vk es el mayor valor de la filak−esima de A.

6.5 Ejercicios tematicos

En este punto se presenta una serie de problemas que pueden ser resueltos con algoritmos quecombinan algunas de las estructuras explicadas en este tema.

6.5.1 Sucesiones y series

• Se quiere construir y escribir un vector v de dimension n cuyas componentes siguen la leyvk = 3 ·vk−1−k para k ≥ 2. Tanto n como v1 son cantidades que han de leerse del teclado.

• Dado n > 0 hallar la suma s =∑n

k=1 1/k.

• Se desea calcular la suma s =∑n

k=1 1/ak siendo los valores ak los elementos de la sucesiondada por ak = ak−1 + ak−2 para k > 2, con a1 = 1 y a2 = 1. El lımite n ha de leerse delteclado y se supone mayor que dos.

• Se desea calcular la suma s =∑n

k=1 1/km siendo m y n dos numeros enteros positivos quese suponen dados.

• Escriba los n primeros terminos de la sucesion dada por an = (1 + 1n)n, siendo n un numero

entero positivo dado.

6.5.2 Ordenaciones

• Dado un vector v de dimension n cuyas componentes son todas positivas o cero se deseareordenar sus componentes de mayor a menor. Por ejemplo, si

v = [2 3 8 5 4]

c© M.R. Arahal 2009 DISA. ESI. US. 95

el resultado ha de ser un nuevo vector:

w = [8 5 4 3 2]

• Repetir el ejercicio anterior pero sin usar un vector auxiliar como w. El resultado que sepretende conseguir es que el propio vector v tenga sus componentes ordenadas.

• Igual que el anterior pero suponiendo que v contiene cantidades positivas y negativas, porejemplo:

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 automoviles dispone de un modelo de vehıculo en cinco colores. Parasaber la aceptacion de cada color realiza una encuesta usando un programa en su ordenadorportatil. El programa ha de ayudarle a contar los votos de los encuestados. El encuestadortecleara el numero del color elegido (de uno a cinco) cada vez que pregunte a una personanueva. Cuando no quiera preguntar a nadie mas introducira el valor -1. En ese momentoel programa le indicara el numero de votos que cada color ha obtenido. Posteriormente sehan de ordenar los colores segun los resultados de la votacion.

• Se desea calcular la mediana de los valores contenidos en un vector T ∈ IRn. Si n es imparla mediana es el valor central del vector ordenado, en caso contrario la mediana es la mediade los dos elementos que estan mas al centro. En ambos casos el paso previo para calcularla mediana es ordenar el vector.

Un ejemplo con n par es T = [10 23 11 15]. La ordenacion produce T o = [23 15 11 10]y la mediana es (15 + 11)/2 = 13. Un ejemplo con n impar es T = [11.8 12 28 11.5 14].En este caso la ordenacion produce un nuevo vector T o = [11.5 11.8 12 14 28], de dondese obtiene la mediana que es el valor central 12.

Puede comprobar con los ejemplos anteriores que la mediana no coincide con la mediaaritmetica.

6.5.3 Calculos con enteros

Para poder disenar los algoritmos que resuelven algunos de los problemas propuestos a conti-nuacion puede necesitar una funcion que elimine los decimales de numeros reales y obtener de estemodo numeros enteros. Esta funcion recibe el nombre de parte entera y puede denotarse ma-tematicamente como ParteEntera(). De este modo x =ParteEntera(3.14) es equivalente a x = 3.En los algoritmos puede utilizarla empleando la notacion siguiente: x← ParteEntera(3.14).

• Dado un numero entero x mayor que uno se ha de escribir un uno si el numero es par yun cero en caso contrario.

• Dados dos numeros enteros positivos p y q se ha de escribir un uno si son divisibles y cerosi no lo son.

• Dado un numero entero x mayor que uno se ha de escribir la lista de sus divisores com-prendidos en el intervalo (1, x).

96 TEMA 6. DESARROLLO DE ALGORITMOS BASICOS

• Dado un numero entero x mayor que uno se ha de escribir un uno si es primo y un cero encaso contrario. Para ello ha de comprobar si x es divisible por algun entero en el intervalo(1, x).

• Dada una cantidad N > 1 calcular la raız cuadrada entera aproximada r. Se ha de cumplirque 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 ha de escribir un uno en el caso de que exista un trıo (x, y, z)de numeros enteros positivostales que x2 + y2 = z2. Limite la busqueda a x ∈ (0, 100), y ∈ (0, 100). En caso de que nose encuentre solucion se ha de escribir un cero.

• Repita el ejercicio anterior pero escribiendo todas las soluciones que encuentre en el inter-valo x ∈ (0, 1000), y ∈ (0, 1000).

• Dados dos numeros enteros positivos p y q escriba un algoritmo que permita hallar elmaximo comun divisor de los mismos.

• Como aplicacion del ejercicio anterior disene un algoritmo que permita descubrir si dosenteros positivos son primos entre sı, es decir si su maximo comun divisor es uno.

6.5.4 Matrices

• Multiplicacion de matrices. Suponga ya leıdas A ∈ IRm×n y B ∈ IRn×p, calcule C = A ·B.

• Matriz al cubo. Disene un algoritmo que permita obtener B = A3, siendo A ∈ IRn×n unamatriz cuadrada que se supone ya leıda.

• Exponenciacion de matrices. Disene un algoritmo que permita obtener B = Ap, siendoA ∈ IRm×n una matriz dada y p > 0 un entero tambien dado.

• Dados dos enteros positivos m y n se desea construir la matriz S ∈ IRm×n cuyo elementogenerico viene dado por skj =

∑kh=1 1/hj

6.5.5 Leyes

La evolucion de ciertas magnitudes del mundo real puede en ocasiones acomodarse a simplesleyes expresables de un modo similar a las sucesiones. En este apartado se proporcionan algunosejemplos que ilustran la forma en que el calculo por ordenador ayuda a la Ciencia y la Ingenierıa.

• La cantidad de un cierto isotopo radioactivo presente en una mezcla varıa con el tiempopues el isotopo se descompone emitiendo radiacion. Se denota mediante y(k) la cantidaden gramos de isotopo en el instante de tiempo t = k medido en anos. Unos cientıficos handescubierto que se cumple que y(k) = 0.99 · y(k− 1). Si un barril de desechos radioactivoscontiene 1000 gramos de isotopo, ¿cual sera la cantidad de isotopo presente al cabo de 500anos?.

c© M.R. Arahal 2009 DISA. ESI. US. 97

• La velocidad de un paracaidista en su descenso al suelo una vez que ha abierto el paracaıdasse denota mediante v(k) (m/s), siendo k el tiempo que lleva cayendo medido en segundos.Se ha especulado con la idea de que dicha velocidad sigue la ley: v(k) = v(k − 1) + 10 −0.4(v(k − 1))2. Sabiendo que una caıda tıpica puede durar 5 minutos y que el paracaıdasse suele abrir con una velocidad de 100 Km/h, ¿con que velocidad llega al suelo?

• Se sabe que la cantidad de bacterias de cierta especie en un cultivo es x(k) = 1.1x(k −1) siendo k el tiempo medido en horas. Si inicialmente se contabilizaron 100 unidades,¿cuantas habra al cabo de un dıa?

6.6 Correccion de algoritmos

La comprobacion del buen funcionamiento de un algoritmo es una tarea difıcil y para la cualno existen reglas generales. En muchos casos sin embargo el sentido comun y el razonamientologico permiten realizar pruebas que permiten asegurar la correccion.

Existen dos formas de enfrentarse a la tarea de decidir si un algoritmo dado es verdadera-mente una solucion al problema planteado: la prueba del algoritmo con un conjunto de datoscontrolado y la prueba mediante razonamiento logico-matematico.

6.6.1 Pruebas con datos controlados

La prueba del algoritmo con datos controlados consiste en preparar una serie de valores de losdatos para los cuales se conoce el resultado correcto. Posteriormente se siguen los pasos delalgoritmo y se comprueba si los resultados que el algoritmo produce coinciden con los resultadosconocidos de antemano.

Como ejemplo considere el problema de escribir un uno en caso de que cierto entero x seaprimo y cero en otro caso. Si se desea comprobar si cierto algoritmo A es correcto puede serbuena idea probar A con x = 2 y comprobar que el resultado es que se escribe un uno. Si elresultado no es este no hace falta comprobar mas, pues un solo fallo sirve para invalidar A. Siel resultado es correcto se puede pasar a probar A con x = 3 y repetir el proceso.

Es facil ver que este metodo tiene el grave inconveniente de que hacen falta tantas pruebascomo posibles valores distintos puede tomar el dato x. En muchas ocasiones se recurre al metodode probar el algoritmo solo en algunos valores elegidos. Por ejemplo con varios numeros primosy otros no primos tanto grandes como pequenos. Hay que resaltar que este tipo de pruebasno permite validar el algoritmo completamente. Esto es ası porque un algoritmo puede darresultados correctos en muchas situaciones y sin embargo no ser correcto universalmente puespuede que contenga errores que no se han manifestado con esos datos.

No existe un procedimiento general para seleccionar valores de prueba para algoritmos, sinembargo es posible dar algunos consejos como:

• probar valores particulares que puedan dar problemas como el cero (en el caso de que haya

98 TEMA 6. DESARROLLO DE ALGORITMOS BASICOS

divisiones), o los numeros negativos (si hay raıces cuadradas).

• probar los valores extremos de los datos, por ejemplo si se sabe que el dato x ∈ IR cumpleque x ∈ [5, 3] entonces merece la pena probar con los valores x = 3 y x = 5.

6.6.2 Razonamientos por induccion

En muchos casos es posible aplicar el metodo matematico de prueba inductiva. Por ejemplocuando el dato de un algoritmo puede tomar cualquier valor n ∈ IN.

El razonamiento inductivo se lleva a cabo probando (en el sentido matematico) que si elalgoritmo funciona para un valor n cualquiera entonces debe funcionar tambien para el valorsiguiente n + 1. La prueba se completa utilizando el algoritmo con n = 1 y comprobandoque el resultado es satisfactorio. Mediante induccion se obtiene que entonces el algoritmo debefuncionar correctamente para n = 2 y de aquı que tambien sea correcto para n = 3, etc.

Este tipo de razonamiento permite decidir la correccion de algoritmos que contienen estruc-turas iterativas. En estos casos los puntos que causan mayores problemas son las entradas ysalidas de los ciclos de repeticion. Por este motivo hay que prestar mucha atencion a los valoresiniciales asignados a ındices y contadores antes de entrar en el ciclo, a la actualizacion de losmismos dentro del cuerpo que se repite y finalmente a la condicion de salida del ciclo.

El principal inconveniente de este metodo de correccion es que es posible que la pruebamatematica contenga errores, proporcionando como resultado que se etiquete como correcto unalgoritmo que no lo es. Por este motivo es conveniente siempre realizar la prueba por ambosmetodos.

6.6.3 Modularidad

Si el diseno del algoritmo se ha llevado a cabo de forma adecuada el diagrama ha de consistiren una serie de modulos (o funciones) de pequeno tamano que se unen para formar modulosmayores.

El analisis de algoritmos se realiza entonces de una forma comoda pues basta con probarcada modulo de forma independiente. Cuando se han comprobado los modulos de un ciertonivel puede pasarse al nivel superior. Las comprobaciones de un nivel superior pueden llevarsea cabo sin necesidad de volver a utilizar o analizar los modulos de niveles inferiores. En lugarde ello es posible sustituir mentalmente dichos modulos por mecanismos que automaticamenteproporcionan los resultados correctos. De este modo el analisis se lleva a cabo de forma jerarquicalo cual permite avanzar con mayor rapidez y confianza.

c© M.R. Arahal 2009 DISA. ESI. US. 99

6.7 Analisis de la estructura

Es posible ahora poner un par de ejemplos para aclarar las ideas sobre la programacion estruc-turada. Considere en primer lugar el diagrama que aparece en la parte izquierda de la figura 6.9.A la vista como estan unidos los bloques ¿sabrıa decir si es un diagrama bien estructurado?.

Para responder a esta cuestion resulta conveniente agrupar los bloques que forman secuenciasen modulos, de forma que la estructura subyacente quede expuesta con mayor claridad. Estose ha realizado en el diagrama del centro. Finalmente, en el diagrama de la derecha se hansustituido las secuencias por modulos, quedando al descubierto una estructura que coincide conuna de las estructuras permitidas (vease de nuevo la figura 5.7). Esta estructura es un bucle consalida en cola y aparece aquı combinado en secuencia por arriba y abajo con otros dos modulos.

Figura 6.9: Analisis de la estructura de un diagrama.

Este sencillo analisis permite determinar que la estructura del diagrama esta de acuerdo conlas normas establecidas en este capıtulo. Observe que para discutir sobre la estructura de undiagrama no es preciso conocer las operaciones que se realizan en cada bloque. En efecto, laestructura depende exclusivamente de las uniones entre bloques y no de su contenido.

Considere ahora el diagrama que se muestra en la parte izquierda de la figura 6.10. A primeravista no parece haber nada que indique que el diagrama no sea estructurado (al menos no loparece para el principiante en esta materia). En la parte central y derecha de la figura se pone demanifiesto que esto es un error. En efecto, el recuadro a trazos intenta encerrar una estructuradel tipo repeticion o bucle con salida en cola. Sin embargo el recuadro no tiene solamente unaentrada y una salida como se requiere. De hecho, el recuadro es cortado por dos flechas deentrada y por una de salida. Si uno intenta encerrar la estructura inferior mediante un recuadro(vease parte derecha de la figura) ocurre nuevamente que no se cumple la regla de una unicaentrada y una unica salida. En este caso hay dos salidas y una sola entrada.

100 TEMA 6. DESARROLLO DE ALGORITMOS BASICOS

Figura 6.10: Analisis de la estructura de un diagrama.

Tema 7

Funciones

Las funciones son fundamentales para realizar programas de cierta envergadura. Por un ladopermiten desarrollar algoritmos y codigos modulares lo cual mejora la legibilidad, pero ademasdescargan el trabajo del programador pues cada funcion constituye un nuevo bloque constructivoen el que apoyarse.

7.1 Concepto de funcion

Una funcion es un conjunto de ordenes que lleva a cabo una tarea precisa. La funcion es utilizadadentro de un programa como si de una orden se tratara. La funcion puede calcular resultadosutilizando los datos que se le suministran explıcitamente.

Un ejemplo de funcion es sin. Observemos que cumple las condiciones que hemos impuesto:

• Es un conjunto de ordenes aunque en las modernas versiones de MATLAB no podamosverlo pues se encuentra en una forma especial.

• Realiza una tarea concreta consistente en calcular el seno del numero indicado.

• Calcula resultados a partir de datos suministrados.

Recuerde que en el entorno MATLAB la funcion sin puede utilizarse para calcular el senocomo en el ejemplo siguiente:

>> x = 1.57

x =

1.57000000000000

>> sin(x)

ans =

0.99999968293183

101

102 TEMA 7. FUNCIONES

En este ejemplo el resultado es el seno de 1.57 radianes que aproximadamente el seno de π/2y por tanto el resultado es casi 1.

Tambien es posible asignar el resultado de una funcion a una variable, como en el ejemplosiguiente:

>> x = 1.57

x =

1.57000000000000

>> y=sin(x)

y =

0.99999968293183

Finalmente es posible realizar la misma tarea pero sin que aparezca nada en la pantalla, paraello basta con colocar unos signos punto y coma.

>> x=1.57; y=sin(x);

A pesar de que la pantalla no muestra ningun mensaje las asignaciones se han realizadocorrectamente como puede comprobarse:

>> x

x =

1.57000000000000

>> y

y =

0.99999968293183

No pierda de vista estos ejemplos pues resultan muy utiles para comprender la forma en quelas funciones se usan y tambien para comprender porque las funciones se escriben de una maneraespecial que sera descrita mas adelante. Baste decir por ahora que las funciones pueden versecomo modulos con los cuales es posible construir programas. Son similares a los modulos quese han utilizado en los diagramas de flujo. Ademas poseen una caracterıstica que las hace muyutiles: las funciones pueden usarse una y otra vez con datos distintos. Desde este punto de vistala funcion es una maquina capaz de producir resultados a partir de datos que se le suministran.Este aspecto es ilustrado por el diagrama de la figura 7.1.

7.1.1 Datos y resultados

En matematicas una funcion 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

c© M.R. Arahal 2009 DISA. ESI. US. 103

Función

Argumentos

Resultados

Figura 7.1:

funciones de MATLAB ocurre otro tanto. El papel de la variable independiente es represen-tado por los datos que se le suministran a la funcion, llamados normalmente argumento. Sedice habitualmente que la funcion ”devuelve” un resultado que es el equivalente a la variabledependiente.

Para aclarar las ideas consideremos la sentencia de MATLAB y = sin(x). Hemos de recor-dar que la ejecucion de esta sentencia provoca lo siguiente:

1. El calculo mediante la funcion sin del seno del dato proporcionado, que en este caso es elvalor de x.

2. La asignacion a la variable y del valor calculado por la funcion sin (que es, logicamentesen(x)).

Es muy conveniente no perder de vista estos pasos en las explicaciones que se daran poste-riormente.

7.1.2 Variables locales

Son variables que solo pueden ser vistas y utilizadas dentro de alguna funcion. Fuera de lamisma no son visibles y por tanto no son utilizables.

Las variables locales pueden ser efımeras (volatiles, automaticas y dinamicas son otros nom-bres que reciben) o permanentes. Las variables locales efımeras son creadas por una funcion ydesaparecen al terminar la funcion. Debido a esto las variables que estan dentro de una funcionno conservan su valor de una llamada a otra de la funcion.

Existe un procedimiento para convertir las variables locales en persistentes mediante la ordenpersistent, pero no sera utilizado en este curso.

104 TEMA 7. FUNCIONES

Tambien existe la posibilidad de usar variables globales. Este tipo de variable puede servisto y utilizado en cualquier funcion, debido a ello su uso es mas simple. Sin embargo conllevanpeligros que se desea evitar a toda costa y por ello no se van a usar en este curso variablesglobales.

En resumen, las variables se clasifican segun su alcance en locales y globales y segun sutiempo de vida en efımeras y persistentes. Aunque las cuatro combinaciones son posibles eneste curso solo se van a emplear variables locales efımeras. Esta perdida voluntaria de libertadproducira programas con un codigo mas legible y estructurado.

7.2 Diagramas de flujo con funciones

En los diagramas de flujo se indicara el uso de funciones mediante el bloque llamado subpro-grama. Dentro de este bloque se va a utilizar la notacion matematica para indicar el envıo deargumentos y una asignacion para indicar la recogida de los valores de las variables resultado.

A modo de ejemplo considere la tarea consistente en calcular la media de los valores absolutosde dos cantidades a y b. El diagrama de flujo de la figura 7.2 resuelve dicha tarea utilizandodos veces la funcion VAbs(). Dicho diagrama no esta completo a menos que se incluya undiagrama de flujo adicional que explique como se calcula dicha funcion VAbs(), dicho diagramase encuentra en la figura 7.3.

Variable real resultado, media de

los valores absolutos

de a y b

Variable real variable auxiliar, valor absoluto de a

Variable real variable auxiliar, valor absoluto de b

Escribir m

Leer a y b

va VAbs(a)

vb VAbs(b)

inicio

m (va + vb)/2

fin

Devuelve un valor real

función que calcula el valor absoluto de

x

Variable real primer dato

Variable real segundo dato

m

va

vb

VAbs(x)

a

b

Figura 7.2: El diagrama de flujo para calcular la media de | a | y de | b | utiliza dos veces lafuncion VAbs().

El diagrama de flujo de una funcion ha de operar con valores formales o ficticios puesto quela funcion ha de poder ser utilizada con mas de un conjunto de datos. Estos valores formalesson los argumentos. En la figura 7.3 se muestra la forma en la que aparecen los argumentos enel diagrama de flujo.

Cabe ahora resaltar la diferencia entre un modulo y una funcion. Como ya se ha visto entemas anteriores, los modulos son trozos de diagrama que cumplen tareas concretas al igualque las funciones, sin embargo las funciones no pueden utilizar ninguna variable que no este

c© M.R. Arahal 2009 DISA. ESI. US. 105

r Variable real resultado, valor

absoluto del argumento

inicio del cálculo de r mediante VAbs(x)

¿ x < 0 ? sí no

r x r -x

fin del cálculo de r mediante VAbs(x)

x Variable real argumento

0 Constante entera valor auxiliar para comparar

Figura 7.3: Diagrama de flujo de la funcion VAbs().

en su diagrama mientras que los modulos no tienen esta restriccion. Se puede decir, utilizandolos conceptos explicados en este tema, que para los modulos todas las variables son globalesmientras que para las funciones no.

Otra diferencia que puede observar es que el diagrama de flujo de una funcion lleva supropia tabla de objetos en la cual se describen las variables y constantes propias de la funcion,incluyendo argumentos y resultados.

Una vez escrita una funcion (el diagrama de flujo o el codigo de la misma) puede ser utilizadauna y otra vez de forma comoda. Esta es otra diferencia con los modulos. Los modulos encajanbien con un programa mientras que las funciones encajan bien en todas partes. Esto es asıgracias al pase de argumentos y la devolucion de resultados. Para ilustrar este punto supongaque debe resolver el problema de leer un valor real x y calcular y escribir la cantidad y =| x |3.Una posible solucion viene dada por el diagrama de la figura 7.4 donde se ha utilizado una vezmas la funcion VAbs().

Variable real resultado |x| 3

Variable real variable auxiliar,

valor absoluto de x

Escribir y

Leer x

z VAbs(x)

inicio

y z·z·z

fin

Devuelve un valor real

función que calcula el valor absoluto de

x

Variable real dato

y

z

VAbs(x)

x

Figura 7.4: Diagrama de flujo para calcular y escribir y =| x |3.

106 TEMA 7. FUNCIONES

Escribir r

Leer z

Inicio

Fin

r 1 - z r r + 4·Pot(z,3) r r + Pot(z,6) r r - Pot(z,9)

z Variable

real

r

Dato

Resultado, valor del polinomio P(z)

Función para calcular la potencia n-ésima de x

Variable real

Pot(x,n) Devuelve un valor real

inicio del cálculo de p como Pot(x,n)

Iniciar k a 0 y p a 1

no

k k + 1

fin del cálculo de p como

Pot(x,n)

p p · x

x Variable real

n

Argumento. Base.

Argumento. Potencia.

Resultado calculado

como x elevado a n

Variable entera

p Variable real

k Contador. variable

auxiliar Variable entera

¿ k n-1 ?

Figura 7.5: Diagrama de flujo para la evaluacion de un polinomio de grado 9 haciendo uso dela funcion Pot().

7.3 Ejemplos de diagramas de flujo con funciones

A continuacion se presentan algunos problemas que son susceptibles de ser resueltos con la ayudade funciones. Observe que la eleccion de las funciones no es casual sino que obedece a criteriosde economıa y claridad. Pruebe a resolver algunos de estos problemas sin la ayuda de funcionesy comprobara esta afirmacion.

1. Evaluacion de un polinomio de grado 9. El problema que se desea resolver es elsiguiente: se ha de leer un numero real z. El polinomio P(x) = 1− x + 4x3 + x6 − x9 hade calcularse en el punto x = z y el resultado escribirse. En otras palabras, se ha decalcular y escribir la cantidad r = P(z).

La figura 7.5 se muestra una posible solucion que hace uso de una funcion para calcularlas potencias necesarias. Como puede verse la funcion es descrita someramente en la tablade objetos empleados.

2. Evaluacion de un polinomio de grado n. El problema que se desea resolver es elsiguiente: se ha de leer un numero real z y un numero natural n. El polinomio de ordenn dado por Q(x) = x + x2

2 + x3

3 + x4

4 + · · ·+ xn

nha de calcularse en el punto x = z y el

resultado escribirse. En otras palabras, se ha de calcular y escribir la cantidad Q(z).

c© M.R. Arahal 2009 DISA. ESI. US. 107

Escribir sumap

Leer z y n

inicio

fin

z Variable real

sumap

Dato (punto)

Suma parcial y

resultado, Q(z)

Función que calcula x n

Variable real

Pot(x,n) Devuelve un valor real

inicio del cálculo de p como Pot(x,n)

¿ k < n ?

Iniciar k a 0 y p a 1

no

k k + 1

fin del cálculo de p como Pot(x,n)

p p · x

x Variable

real

n

Argumento. Base.

Argumento. Exponente.

Resultado calculado como x

elevado a n

Variable entera

p Variable

real

¿ k n ?

k 1, sumap 0

no

k k + 1

k Variable entera Contador

Dato (grado) Variable entera n

sumap sumap+Pot(z,k)/k

k Variable entera

Contador

Figura 7.6: Diagrama de flujo para la evaluacion de un polinomio de grado n de la formaQ(x) = x + x2

2 + x3

3 + x4

4 + · · ·+ xn

nhaciendo uso de la funcion Pot().

La solucion presentada en la figura 7.6 hace uso de la funcion Pot() al igual que en elejercicio anterior. Notese que el diagrama de flujo correspondiente a la funcion lleva sutabla de objetos independiente.

Puede llamar la atencion el hecho de que existe una variable de nombre k en cada unode los diagramas. A continuacion se explica que esto no es un error. Se ha indicado enesta leccion que las funciones operan con argumentos precisamente para poder ser usadassin necesidad de conocer el nombre de la variable que contiene los datos. En esto residela diferencia con un modulo. Tambien se ha dicho que el argumento es una variable localy por tanto solo existe dentro de la funcion. La variable k del diagrama de la funcion espues completamente independiente de la variable k en otras funciones y por tanto puedellevar el mismo nombre.

3. Evaluaciones repetidas de un polinomio. Dado un vector v ∈ IRn (siendo n > 0,

un valor previamente leıdo) se desea evaluar el polinomio R(x) = 1 + x + x2

2! + x3

3! + x4

4! encada una de las componentes de v, creando de este modo el vector w. Dicho de otro modose desea calcular el vector w tal que wk = R(vk)∀k = 1, · · · , n.

La solucion se muestra en la figura 7.7. Puede observarse que se usa la funcion Pot() yla funcion Fact() dentro de la funcion R(). Es importante observar que, gracias al uso defunciones, cada subdiagrama tiene un tamano aceptablemente pequeno. Ademas el analisisque es necesario hacer antes de codificar se ve muy facilitado por este diseno modular.

108 TEMA 7. FUNCIONES

inicio cálculo de p como Pot(x,n)

¿ k < n ?

Iniciar k a 0 y p a 1

no

k k + 1

fin cálculo de p como Pot(x,n)

p p · x

x Variable

real

n

Argumento. Base.

Argumento. Exponente.

Resultado calculado como x

elevado a n

Variable entera

p Variable

real

inicio

fin

¿ i n ?

i 1

no

i i + 1

w i R(v i )

fin cálculo de r como R(x)

no

r r + Pot(x,m)/Fact(m)

¿ m 4 ?

m 1, r 1

inicio cálculo de r como R(x)

Contador k Variable entera

inicio cálculo de f como Fact(n)

¿ k n ?

Iniciar k a 1 y f a 1

no

k k + 1

fin del cálculo de f como Fact(n)

f f·k

n Argumento.

Resultado calculado como el

factorial de n

Variable entera

f Variable

entera

Contador k Variable entera

x Variable real

r

Argumento (punto)

Suma parcial y resultado, R(x)

Función que calcula x elevado

a m

Variable real

Pot(x,m) Devuelve un valor real

m Variable entera

contador

Función que calcula el

factorial de m Fact(m)

Devuelve un valor entero

v Vector de variables

reales

w

Vector dado

Vector resultado

Función que

calcula el polinomio R en x

vector de

variables de reales

R(x) Devuelve un valor real

i Variable

entera contador

Dato. Dimensión de v

Variable entera

n

m m + 1

Figura 7.7: Diagrama de flujo para calcular un vector (w) a partir de otro dado (v) transformando

sus componentes segun el polinomio R(x) = 1 + x + x2

2! + x3

3! + x4

4! .

c© M.R. Arahal 2009 DISA. ESI. US. 109

4. Recta entre dos puntos. Se desea realizar una funcion que permita calcular los parametrosde la recta y = ax + b que pasa por dos puntos del plano. Considere dos puntos genericosP0 = (x0, y0) y P1 = (x1, y1) de IR2 (suponga que x0 6= x1). El problema que la funcionha de resolver es el de calcular la pendiente a y la ordenada en el origen b de la recta quepasa por P0 y P1. Recuerde que dicha recta tiene como expresion y = y0 + y1−y0

x1−x0(x− x0).

La solucion se muestra en la figura 7.8. Observese que la funcion Recta() toma cuatroargumentos correspondientes a las abscisas y ordenadas de los dos puntos que definenla recta. Por otra parte esta funcion devuelve como resultado el vector formado por losvalores a y b.

Este tipo de funciones son analogas a las funciones vectoriales estudiadas en Matematicascuyos valores son vectores y que pueden depender de mas de una variable. La mayorıa delos lenguajes de programacion admiten funciones vectoriales aunque con algun que otro”truco” segun el caso. Los diagramas de flujo que se realicen con funciones vectorialesseguiran la nomenclatura matematica con independencia del lenguaje de programacionque se vaya a utilizar para codificar. Afortunadamente el programa MATLAB es bastantefiel a esta forma matematica.

inicio del cálculo de (a,b) como Recta(x0,y0,x1,y1)

fin del cálculo de (a,b) como Recta(x0,y0,x1,y1)

dx x1-x0 dy y1-y0

a dy/dx b y0-a·x0

x0 Argumento. Abscisa del

primer punto

Resultado, pendiente de la recta que pasa por

ambos puntos

Variable real

a Variable real

y0 Argumento. Ordenada del

primer punto Variable real

x1 Argumento. Abscisa del

segundo punto Variable real

y1 Argumento. Ordenada del

segundo punto Variable real

Resultado, ordenada en el origen de la recta

que pasa por P 0 y P

1

b Variable real

Diferencia de abscisas dx Variable real

Diferencia de ordenadas dy Variable real

Figura 7.8: Diagrama de flujo de una funcion que calcula la pendiente a y la ordenada en elorigen b de la recta que pasa por dos puntos genericos del plano P0 y P1.

5. Vector de pendientes Se dispone de dos vectores vx y vy de IRn que contienen respec-tivamente las componentes x e y de n puntos del plano. Es decir, (vx1, vy1) es un puntodel plano, (vx2, vy2) es otro punto, etc. Se desea calcular un nuevo vector va de IRn−1

de tal modo que ∀k = 1, · · · , n − 1 sea vak igual a la pendiente de la recta que pasa por(vxk, vyk) y por (vxk+1, vyk+1). Se supone que vx, vy y n ya han sido leıdos previamente.Se recomienda usar la funcion Recta() del ejercicio anterior.

La solucion se muestra en la figura 7.9. Puede verse la forma en que se recoge el resultadode la funcion Recta() mediante un vector res cuya primera componente es la pendiente,la otra componente no se utiliza.

110 TEMA 7. FUNCIONES

inicio del cálculo de (a,b)

como Recta(x0,y0,x1,y1)

fin del cálculo de (a,b) como Recta(x0,y0,x1,y1)

dx x1-x0 dy y1-y0 a dy/dx b y0-a·x0

inicio

fin

vx Vector de variables reales

Dato, vector de n abscisas

Función que calcula los parámetros de la recta que pasa por dos puntos dados como argumento

Recta(x0,

y0, x1,y1)

Devuelve un vector con

dos componentes

reales

¿ k n-1 ?

k 1

no

k k + 1

k Variable entera

contador

vy Vector de variables

reales

Dato, vector de n

ordenadas

n Variable entera

Dimensión de vx y vy

res Vector de variables reales

vector auxiliar de 2 componentes que recoge

el resultado de Recta() va

k res

1

res Recta(vx k ,vy

k ,vx

k+1 ,vy

k+1 )

x0 Argumento. Abscisa del

primer punto

Resultado, pendiente de la recta que pasa por

ambos puntos

Variable real

a Variable real

y0 Argumento. Ordenada del

primer punto Variable real

x1 Argumento. Abscisa del

segundo punto Variable real

y1 Argumento. Ordenada del

segundo punto Variable real

Resultado, ordenada en el origen de la recta

que pasa por P 0 y P 1

b Variable real

Diferencia de abscisas dx Variable real

Diferencia de ordenadas dy Variable real

Figura 7.9: Calculo de las pendientes de las rectas que pasan por un conjunto de puntos de IR2.

c© M.R. Arahal 2009 DISA. ESI. US. 111

7.3.1 Ejercicios

Realice los diagramas de flujo y las tablas de objetos las funciones que se indican.

• Funcion que calcule xy suponiendo que y es un valor entero positivo.

• Funcion que calcule xy sabiendo que y es un valor entero que puede ser positivo, negativoo cero.

• Funcion que calcule(mn

)siendo m y n dos enteros positivos. Puede hacer uso de las

funciones que haya realizado con anterioridad para calcular el factorial.

• Funcion que calcule la suma de las componentes de un vector.

• Funcion para calcular la media aritmetica de las componentes de un vector.

• Funcion para calcular la suma S(n) =∑n

h=1ah

hn , siendo a un vector dado como argumento,a ∈ IRn y suponiendo n > 0 entero.

• Funcion para calcular el producto escalar de dos vectores v ∈ IRn y w ∈ IRn, suponiendon > 0 entero.

• Funcion que evalue el polinomio A(x) = a1xn + · · · + anx1 + an+1x

0 dado el grado delpolinomio n, el vector de coeficientes vA = (a1, · · · , an+1) y el valor x. Puede hacer usode las funciones que haya realizado con anterioridad para calcular las potencias.

• Funcion que calcule el vector de coeficientes de un polinomio C suma de otros dos (A y B).La funcion ha de recibir los grados na, nb y los vectores de coeficientes vA = (a1, · · · , ana+1)y vB = (b1, · · · , bnb+1) de cada uno de los dos polinomios sumandos. La funcion devolverael grado y el vector de coeficientes del polinomio suma C = A + B.

Realice los diagramas de flujo de los algoritmos que resuelven los problemas planteados.Intente utilizar funciones para hacer frente a tareas que aparecen con frecuencia.

• Se ha de realizar un programa que lea dos valores enteros positivos x e y y calcule y escribala cantidad r = xy+yx

(x+y)x+y .

• Se ha de realizar un programa que lea dos vectores de IR3 y calcule y escriba el coseno delangulo que forman.

• Se ha de realizar un programa que lea dos vectores de IR3. El programa posteriormenteescribira: un cero si los vectores son paralelos, en caso contrario el programa escribira unvector perpendicular al plano que forman los vectores leıdos.

• Se ha de realizar un programa que lea los coeficientes ck de un polinomio P de grado 4.Se supondra que el polinomio es de la forma P (x) = c1x

4 + c2x3 + c3x

2 + c4x1 + c5x

0. Elprograma posteriormente leera un valor para la variable independiente x. Finalmente elprograma escribira el valor r = P (x).

112 TEMA 7. FUNCIONES

Tema 8

MATLAB

MATLAB es una herramienta informatica que surgio para realizar calculos matematicos, espe-cialmente operaciones con matrices. El usuario de MATLAB suele ser una persona que necesitaalgo mas que una calculadora pero que no quiere ”mancharse las manos” con un lenguaje deprogramacion. Por eso el entorno de trabajo es sencillo de manejar, casi tan facil como unacalculadora.

Ademas de realizar calculos, esta herramienta permite crear graficos de muchos tipos ypresenta grandes ventajas a la hora de trabajar con numeros complejos, con matrices, conpolinomios, con funciones trigonometricas, logaritmos, etc.

Con los anos la herramienta ha sido modificada pasando por varias versiones. En cadaversion se han incorporado otras funciones distintas y hoy en dıa proporciona funciones paragran cantidad de aplicaciones ingenieriles: simulacion de sistemas dinamicos, vision artificial,analisis estadıstico, analisis y diseno de controladores automaticos, etc.

Desde las primeras versiones MATLAB incorpora una caracterıstica muy interesante: lacapacidad para programar. En efecto, es posible crear archivos que contengan las operacionesque se desean realizar. Ademas es posible incorporar nuevas funciones de MATLAB realizaedaspor el propio usuario.

La programacion se lleva a cabo mediante un lenguaje que es muy parecido a lenguajes dealto nivel como BASIC o C. Esto permite que el usuario pueda agrupar sentencias que utilizafrecuentemente dentro de un programa que puede ser invocado posteriormente. De este modo seahorra tiempo y esfuerzo en sucesivas sesiones pues no es necesario escribir todas las sentenciasde nuevo como se mostrara.

Pero no todo son ventajas. Como principal inconveniente hay que senalar el hecho de queMATLAB no ha sido concebido como lenguaje de programacion por lo que carece de algunoselementos o caracterısticas necesarias para una buena practica de la programacion. Para aliviarestos defectos se van a usar metodos que eviten los peligros derivados de dichas carencias.

113

114 TEMA 8. MATLAB

8.1 El entorno

El programa MATLAB se maneja (en su mayor parte) escribiendo sentencias dentro de unaventana llamada de ordenes. Al arrancar el programa aparecen varias ventanas, pero en unaprimera toma de contacto es mejor cerrar todas excepto la principal, que es la ventana deordenes.

Las ordenes se escriben una a una (ya se vera la forma de escribir conjuntos de ordeneso programas mas adelante) pulsando la tecla de retorno al final. Por ejemplo, si se escribesqrt(16) el programa realiza la operacion indicada y responde en la pantalla con el resultado.Lo que se aprecia en la ventana de ordenes sera algo como:

>> sqrt(16)

ans =

4.0000

>>

Las operaciones se indican de forma muy intuitiva, por ejemplo para obtener el resultado de13·5

3+4·11 basta con escribir 13*5/(3 +4*11). En la ventana de ordenes se obtendra lo siguiente:

>> 13*5/(3 + 4*11)

ans =

1.3830

Observe que es necesario utilizar parentesis para que la operacion se lleve a cabo correcta-mente. Esta y otras particularidades del entorno de MATLAB seran comentadas a lo largo deltema.

8.2 Objetos

La herramienta MATLAB permite utilizar nombres simbolicos para referirse a objetos los cualesrepresentan numeros, vectores o matrices. Como es sabido, en cualquier lenguaje de progra-macion, los objetos se caracterizan por un tipo, un identificador y otras caracterısticas. Acontinuacion se describen estas caracterısticas para el entorno de MATLAB.

8.2.1 Tipos

En MATLAB todos los objetos son matrices de numeros complejos en punto flotante. Un escalarno es mas que una matriz 1× 1. Cada elemento de la matriz se almacena en la memoria comoun numero complejo a + bi siendo i =

√−1. Cuando se trabaja con numeros reales MATLAB

considera simplemente que b = 0. Finalmente, todos los numeros son tratados en formato

c© M.R. Arahal 2009 DISA. ESI. US. 115

de punto flotante. Esto quiere decir que son numeros con parte entera, parte decimal y unexponente (vease tema 2).

Estas caracterısticas hacen que MATLAB desperdicie memoria con respecto a otros lenguajesen los cuales las variables pueden ser de otros tipos mas pequenos. A pesar de que MATLABtrata a todas las variables del mismo modo se va a continuar con la sana costumbre de indicaren los diagramas de flujo y en los comentarios el tipo de las variables. De este modo se facilitala deteccion de errores.

8.2.2 Identificadores

Los objetos que se pueden utilizar en MATLAB han de tener un identificador que es un conjuntode caracteres. La palabra resultante ha de cumplir ciertos requisitos:

• No puede comenzar por un numero

• No puede coincidir con palabras reservadas como for, if, etc.

• No puede contener espacios en blanco

8.2.3 Creacion y destruccion

Los objetos pueden crearse en cualquier momento. Para ello basta con asignarles un valor en laforma que se indicara mas adelante.

Hay que tener en cuenta que los objetos ocupan un espacio en la memoria. Cada vez que secrea una nueva variable el programa MATLAB pide al SE un trozo mas de la memoria disponible.A partir de ese momento el trozo en cuestion 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 destruccion completa de la variable yla liberacion del trozo de memoria ocupado por la misma. Una vez que una variable ha sidoeliminada no es posible recuperar su valor.

8.2.4 Asignacion

La asignacion se consigue por medio del signo igual =. No hay que olvidar que asignar es unaoperacion consistente en copiar un cierto valor en la memoria ocupada por una variable. Portanto no es lo mismo asignar que igualar en el sentido matematico. Lamentablemente el uso delsigno = en ambos casos no ayuda nada a clarificar la cuestion.

Debido a que la asignacion es una operacion distinta de la igualdad matematica se ha insistidoen temas anteriores en que se utilice un signo diferente←. En los diagramas de flujo se mantendrael uso del sımbolo ← para la asignacion.

116 TEMA 8. MATLAB

8.3 Operaciones y funciones incorporadas

La mejor manera de aprender a realizar operaciones con MATLAB es probar el programa conejemplos simples y explorar su comportamiento. En este punto se van a mostrar ejemplos envarias categorıas de dificultad creciente. Es muy aconsejable no estudiar de memoria los ejemplossino probarlos en el entorno MATLAB.

8.3.1 Operaciones elementales

La forma mas simple de usar MATLAB es como una calculadora. En lugar de pulsar teclas seha de escribir la operacion a realizar y pulsar Intro para que esta se lleve a cabo.

Por ejemplo si se escribe

6+8

y se pulsa Intro se obtiene en la pantalla:

>> 6+8

ans =

14

>>

Puede verse que el resultado viene precedido de ans=. Estas letras son la abreviatura de answer(respuesta, resultado). Ademas, como ya se ha dicho, el sımbolo >> sirve para indicar al usuarioque puede escribir ahı su orden. A menudo recibe el nombre de sımbolo inductor pues induceal usuario a escribir.

El programa MATLAB admite operaciones con parentesis, como por ejemplo 2 · (5 + 3).

>> 2*(5+3)

ans =

16

>>

Notese que la multiplicacion se indica por medio del asterisco *. Tambien es posible realizaroperaciones menos elementales, como por ejemplo logaritmos en base 10

>> log10(100)

ans =

2

c© M.R. Arahal 2009 DISA. ESI. US. 117

Si uno desea dar nombres simbolicos a los numeros que ha de manejar debe crear variables.Para ello basta con asignar un valor mediante una expresion 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 hatomado el valor adecuado

>> x=22.3

x =

22.3000

Es importante saber que estas expresiones hacen dos cosas: crear la variable (tomando ciertacantidad 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 minimizarmediante una programacion cuidadosa.

Ademas de las operaciones aritmeticas de sobra conocidas existen operaciones logicas, comopor ejemplo la comprobacion de igualdad. Considere el ejemplo siguiente consistente en unaexpresion de comprobacion de igualdad:

>> x==7

ans =

0

La expresion x == 7 equivale a preguntar ¿Es el valor de x igual a 7?. La respuesta obtenidaes cero, lo cual indica que x no es igual a 7. De forma equivalente la sentencia x == 22.3 produceun valor 1 al ser evaluada.

>> x==22.3

ans =

1

De estos ejemplos se desprende que las comprobaciones que el valor logico verdadero esrepresentado en MATLAB mediante el valor numerico ”1”, mientras que el valor logico falso esrepresentado por ”0”.

Las operaciones que dan como resultado un valor logico se pueden combinar utilizando lasuma logica (operacion ”o”), el producto logico (operacion ”y”) y la negacion (operacion ”no”).

118 TEMA 8. MATLAB

Por ejemplo, para saber si x < 100 y al mismo tiempo x > 5; es decir, para comprobar si5 < x < 100 se usara la expresion 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 que100 y mayor que 5”.

Las operaciones que se han comentado se indican en la tabla siguiente de forma mas resumida.

Expresion en MATLAB Operacion+ suma aritmetica

- resta aritmetica o cambio de signo

* multiplicacion aritmetica

/ division

< relacion "menor que"

> relacion "mayor que"

<= relacion "menor o igual que"

>= relacion "mayor o igual que"

== relacion "igual que"

∼= relacion "distinto que"

& producto logico (operacion "y")

| suma logica (operacion "o")

∼ negacion (operacion "no")

No es preciso aprender ahora mismo de memoria esta tabla. El uso frecuente deberıa bastarpara aprenderla por lo que se recomienda que se practiquen los ejemplos indicados y se explorenlas posibilidades que ofrecen.

8.3.2 Funciones incorporadas

De todas las ordenes de MATLAB ninguna debiera ser mas util para el usuario aprendiz que lafuncion de ayuda. Se comentara mas adelante como usar la funcion help, de momento se va ausar 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 8.1.

La forma de uso de estas funciones es simple e intuitiva, por ejemplo a = sin(1) asigna ala variable a el valor del seno de un radian, o sea sen(1).

c© M.R. Arahal 2009 DISA. ESI. US. 119

Trigonometric.

sin Sine.sinh Hyperbolic sine.asin Inverse sine.asinh Inverse hyperbolic sine.cos Cosine.cosh Hyperbolic cosine.acos Inverse cosine.acosh Inverse hyperbolic cosine.tan Tangent.tanh Hyperbolic tangent.atan Inverse tangent.atan2 Four quadrant inverse

tangent.atanh Inverse hyperbolic tan-

gent.sec Secant.sech Hyperbolic secant.asec Inverse secant.asech Inverse hyperbolic secant.csc Cosecant.csch Hyperbolic cosecant.acsc Inverse cosecant.acsch Inverse hyperbolic cose-

cant.cot Cotangent.coth Hyperbolic cotangent.acot Inverse cotangent.acoth Inverse hyperbolic cotan-

gent.Exponential.

exp Exponential.log Natural logarithm.log10 Common (base 10) loga-

rithm.log2 Base 2 logarithm and dis-

sect floating point num-ber.

pow2 Base 2 power and scalefloating point number.

realpow Power that will error outon complex result.

reallog Natural logarithm of realnumber.

realsqrt Square root of numbergreater than or equal tozero.

sqrt Square root.nextpow2 Next higher power of 2.Complex.

abs Absolute value.angle Phase angle.complex Construct complex data

from real and imaginaryparts.

conj Complex conjugate.imag Complex imaginary part.real Complex real part.unwrap Unwrap phase angle.isreal True for real array.cplxpair Sort numbers into com-

plex conjugate pairs.

Rounding andremainder.fix Round towards zero.floor Round towards minus in-

finity.ceil Round towards plus infi-

nity.round Round towards nearest

integer.mod Modulus (signed remain-

der after division).rem Remainder after division.sign Signum.

Tabla 8.1: Funciones elementales de MATLAB

120 TEMA 8. MATLAB

>> a = sin(1)

a =

0.8415

8.3.3 Vectores

Los vectores se introducen en MATLAB como una coleccion de valores. Por ejemplo un vectorfila es

>> v=[ -1 2 -3 4 -5]

v =

-1 2 -3 4 -5

Para acceder a las componentes individuales del vector se usan parentesis indicando el ındicede 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 expresion v(k) equivale a la notacion matematica vk.

Tambien se pueden construir vectores columna. Para ello se separan las filas mediante puntoy coma como se muestra a continuacion

>> u=[0; 1; 0; 1; 0]

u =

0

1

0

1

0

Los vectores son tratados por MATLAB como matrices con la peculiaridad de tener una solafila o columna. Por este motivo no merece la pena dedicar mas espacio a los vectores y debemospasar ya a las matrices.

c© M.R. Arahal 2009 DISA. ESI. US. 121

8.3.4 Matrices

En MATLAB una matriz es una variable como otra cualquiera y no precisa mecanismos compli-cados para su creacion y uso. A modo de ilustracion considere que pretendemos sumar las dosmatrices:

A =

(0 2 41 1 1

), B =

(3 3 3−1 −1 −1

)

El primer paso es introducir las matrices en variables. Comenzando con la matriz A escribi-mos la sentencia

A = [ 0 2 4; 1 1 1]

en la pantalla se obtiene:

>> A = [ 0 2 4; 1 1 1]

A =

0 2 4

1 1 1

>>

Como puede verse, los elementos de una misma fila se separan por espacios (o comas) y unafila se separa de la siguiente mediante el punto y coma.

Se procede del mismo modo con la matriz B, obteniendose:

>> B = [ 3 3 3; -1 -1 -1]

B =

3 3 3

-1 -1 -1

8.3.5 Cadenas de caracteres

Las cadenas de caracteres son conjuntos de sımbolos tomados de la tabla ASCII. Tienen granutilidad para trabajar en problemas donde se precisa manipulacion de texto.

122 TEMA 8. MATLAB

Un ejemplo de cadena de caracteres es: clase de 3 a 5 atrasada!!. Este conjunto decaracteres incluye letras, numeros y signos como el espacio o la admiracion. Es posible introducirla cadena en una variable de MATLAB:

>> texto = ’clase de 3 a 5 atrasada!!’

texto =

clase de 3 a 5 atrasada!!

Observese que el conjunto de sımbolos ha de ir encerrado por dos apostrofes. Son lasapostrofes las que diferencian una sentencia como a=barco de a=’barco’. Vea en el ejemplo elefecto de cada una de ellas.

>> 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 interpretadoa=barco como una asignacion en la cual el termino de la derecha (la variable barco) no existe.En cambio, en la segunda expresion, ’barco’ es un valor definido que se asigna a la variable a

por lo que la expresion es tan correcta como hubiera sido x = 8.

Las cadenas de caracteres no sirven para calculos matematicos propiamente dichos y fueronintroducidas en MATLAB para facilitar la programacion, el depurado y el uso de programas.No obstante proporcionan interesantes posibilidades para desarrollar algoritmos y practicar elarte de programar.

8.3.6 Funciones para el manejo de datos

Puesto que MATLAB esta pensado para ser usado de forma interactiva es frecuente que elusuario necesite saber que variables ha creado, cuales son sus caracterısticas, cuanto espacioocupan, etc. Para ello se dispone de ciertas funciones que se van a explicar a continuacion.

Informes . Se ha comentado anteriormente que la orden who proporciona una lista de variables.Vea como ejemplo la secuencia de ordenes y respuestas siguiente:

>> x=8

c© M.R. Arahal 2009 DISA. ESI. US. 123

x =

8

>> y=x+2

y =

10

>> who

Your variables are:

x y

Existe una modalidad que proporciona los tamanos de las variables y que es de utilidadcuando se trabaja con matrices. La orden es whos como puede verse en el ejemplo.

>> A=[1 2 3; 3 4 6]

A =

1 2 3

3 4 6

>> whos

Name Size Bytes Class

A 2x3 48 double array

x 1x1 8 double array

y 1x1 8 double array

Grand total is 8 elements using 64 bytes

Dimensiones A veces es necesario conocer el tamano o dimensiones de una unica variable,por ejemplo para saber el numero de filas de una matriz y disponer de este numero paraposteriores calculos. Para estos casos se puede usar la funcion size.

>> size(A)

ans =

2 3

En el caso de manejar vectores resulta mas conveniente la funcion length que proporcionael numero de elementos.

>> v=[ -1 2 -3 4 -5]

v =

-1 2 -3 4 -5

>> length(v)

ans =

5

124 TEMA 8. MATLAB

Almacenamiento MATLAB permite almacenar en el disco variables. De este modo es posibleparar una sesion de trabajo y continuar en otro momento sin volver a repetir calculos. Laorden mas simple para guardar es save que puede usarse de varias maneras. En la tablasiguiente se presenta un resumen.

Orden Operacion realizadasave Crea el archivo de nombre matlab.mat en la carpeta

actual. Dicho archivo contiene todas las variables queexisten en ese momento en el entorno MATLAB.

save nombrearchivo Crea el archivo de nombre nombrearchivo.mat en lacarpeta actual. Dicho archivo contiene todas las va-riables que existen en ese momento en el entorno MA-TLAB.

save nombrearchivo x y z Crea el archivo de nombre nombrearchivo.mat en lacarpeta actual. Dicho archivo contiene unicamente lasvariables x, y y z.

Recuperacion Las variables almacenadas en el disco pueden ser usadas en una sesion diferente.Para ello es preciso que MATLAB las lea del disco mediante la orden load. En la tablasiguiente se muestran tres posibilidades.

Orden Operacion realizadaload Lee todas las variables del archivo de nombre mat-

lab.mat de la carpeta actual. Si alguna de las varia-bles del disco tiene nombre coincidente con otra quepreviamente existe en MATLAB se producira la des-truccion de la variable existente para dejar su sitio ala variable del disco.

save nombrearchivo Igual que en el caso anterior, pero leyendo del archivonombrearchivo de la carpeta actual.

save nombrearchivo x y z Igual que el anterior pero leyendo unicamente las va-riables x, y y z.

Resulta util la orden what pues muestra los archivos que existen en la carpeta actual yque contienen variables o programas utilizables por MATLAB.

8.4 Codificacion de nuevos programas

Una de las caracterısticas del entorno MATLAB es que permite que las ordenes puedan sertomadas 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 ordenes puede escribirlasen un archivo de texto. Posteriormente le indica a MATLAB que lea dicho archivo ejecutandolas ordenes una por una. El efecto es el mismo que si el usuario hubiese escrito las ordenes enel entorno de MATLAB. Ahora bien, puesto que el archivo de texto se puede guardar en discono es preciso volver a escribir las ordenes nunca mas. Cada vez que el usuario desee ejecutar

c© M.R. Arahal 2009 DISA. ESI. US. 125

de nuevo el conjunto de ordenes podra indicar nuevamente a MATLAB que lea el archivo. Estosupone un gran ahorro de tiempo en muchos casos.

Es costumbre dar a los archivos que contienen ordenes de MATLAB una extension prede-terminada que los diferencia de otros archivos de texto. Esta extension es .m. Por ejemplo si unarchivo contiene las ordenes para dibujar un vector se le puede llamar dibuvector.m.

Los archivos que contienen ordenes de MATLAB seran llamados desde ahora archivos M.Para escribir el archivo de texto se puede usar cualquier programa como la libreta de notas, eleditor de MS-DOS, etc. MATLAB incorpora su propio programa para redaccion llamado M fileEditor, o sea redactor de archivos M.

A modo de ejemplo considere las siguientes ordenes de MATLAB que convierten una cantidaden pesetas a euros.

pesetas=input(’Escriba la cantidad en pesetas : ’)

euros = pesetas/166.386

Supongamos que se introducen este texto dentro de un archivo al cual se le da el nombre decpe.m (el nombre viene de convertidor de pesetas a euros). La forma de indicar a MATLAB queutilice el archivo es simple: se escribe su nombre en el entorno MATLAB. Se obtiene el resultadoque se muestra a continuacion.

>> cpe

Escriba la cantidad en pesetas : 1000

pesetas =

1000

euros =

6.0101

8.4.1 Legibilidad

Frecuentemente el usuario de MATLAB escribe archivo M que le resultan de utilidad. Pasadoun tiempo sin usar un archivo es posible que uno olvide que tarea realiza exactamente. En talcaso es necesario mirar el contenido del archivo y repasar su contenido. Es en este punto cuandose agradece (o se echa en falta) una buena practica de programacion que haga que el codigo sealegible.

Los siguientes consejos ayudaran sin duda al usuario de MATLAB a conseguir programaslegibles.

• Elegir nombres de variables indicativos de lo que representan.

126 TEMA 8. MATLAB

• No usar una misma variable para representar mas que una cosa.

• Incluir comentarios en el codigo para ayudar a seguir la secuencia del programa.

• Dividir el codigo en trozos, de forma tal que sea posible abarcar cada trozo de un vistazoen una ventana mediana. La division no ha de ser arbitraria, sino que los trozos debentener cada uno cometidos claros. Normalmente los diagramas de flujo desarrollados conanterioridad a la codificacion indican como realizar esta division.

A pesar de haber dado estos consejos hemos de ser conscientes de que la buena programacionsolo se logra mediante un proceso de aprendizaje por prueba y error.

8.5 Funciones para trazado de graficas

Uno de los motivos por el que MATLAB ha sido un entorno favorecido por el publico es lafacilidad con la que se pueden realizar graficos de muy distintos tipos. En este punto se va aindicar la forma de realizar algunas representaciones graficas que pueden ser muy utiles parailustrar posteriormente otros ejercicios.

La orden de dibujo mas simple es plot. Esta funcion 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 ]

esta formado por las temperaturas (en grados Celsius) medidas cada cuatro horas en una estacionmeteorologica. 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 grafica con el aspecto que muestrala figura 8.1. Puede observarse que en el eje vertical MATLAB ha representado los valores v1,v2, etc. mientras que en el horizontal aparece el subındice correspondiente.

Continuando con el ejemplo supongamos ahora que se conoce la hora a la que se realizo cadamedida y que deseamos que aparezca en el eje horizontal. Sea t = [4812162024], la orden quenecesitamos es simplemente:

>> t= [ 4 8 12 16 20 24 ]

c© M.R. Arahal 2009 DISA. ESI. US. 127

1 2 3 4 5 614

14.5

15

15.5

16

16.5

17

17.5

18

Figura 8.1: Grafica obtenida con la orden plot

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 figura8.2. Se observa que el eje horizontal esta ahora marcado con las componentes del vector t.

0 5 10 15 20 2514

14.5

15

15.5

16

16.5

17

17.5

18

Figura 8.2: Grafica obtenida con la orden plot usando una variable para el eje horizontal y otrapara el vertical.

Puede ser interesante ahora anadir unos letreros indicativos de que es lo que se esta repre-sentando. Esto se consigue de manera simple con las ordenes siguientes:

>> xlabel(’hora’)

>> ylabel(’temperatura’)

>> title(’Datos estacion meteorologica’)

El resultado final se muestra en la figura 8.3.

128 TEMA 8. MATLAB

0 5 10 15 20 2514

14.5

15

15.5

16

16.5

17

17.5

18

horate

mpe

ratu

ra

Datos estación meteorológica

Figura 8.3: Grafica con tıtulo y letreros en los ejes.

8.6 Sentencias de control

8.6.1 La bifurcacion

Ya se ha visto en los diagramas de flujo realizados que las bifurcaciones son imprescindibles parallevar a cabo ciertas tareas. En MATLAB es posible realizar la bifurcacion basica mediante lasentencia if-else. La forma de uso se muestra en el codigo que aparece a continuacion.

if condicion

sentencias bloque S

else

sentencias bloque N

end

En esta construccion, La condicion es una expresion que da como resultado un valor logico(por ejemplo x > 2) que puede ser verdadero o falso. En caso de que la evaluacion de la expresionarroje un resultado verdadero se procede a ejecutar las sentencias del bloque S. En caso contrariose ejecutan las sentencias del bloque N. Al terminar uno u otro bloque se pasa a las sentenciasposteriores a end.

De la explicacion anterior debe resultar evidente que al usar la bifurcacion se ejecutan lassentencias S o las N pero no ambas.

El diagrama de flujo de la figura 8.4 a) corresponde a una bifurcacion generica. Dentro de losbloques S y N se puede colocar cualquier conjunto de sentencias, incluyendo nuevas bifurcacionescomo se vera mas adelante.

Como ejemplo sencillo considere el siguiente trozo de codigo:

x=input(’Introduzca valor de x ’)

if x < 0,

va = -x;

c© M.R. Arahal 2009 DISA. ESI. US. 129

inicio

¿ x < 0 ? sí no

fin

a) b)

Escribir va

Leer x

va x va -x

x Variable real Dato

va Variable real Resultado. Valor absoluto de x

condición sí no

Bloque N Bloque S

Figura 8.4: a) Diagrama de flujo correspondiente a una bifurcacion generica. b) Diagrama deflujo correspondiente al ejemplo de bifurcacion

else

va=x;

end

disp(’El valor absoluto es’)

va

Este programa serıa de utilidad en caso de que no dispusiesemos en MATLAB de otrosmedios para calcular el valor absoluto.

Un ejemplo igualmente simple es:

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 facil ver que este programa toma como datos los coeficientes a, b y c de una ecuacion desegundo grado ax2 + bx + c = 0, los analiza y escribe en la pantalla si las raıces (soluciones dela ecuacion) seran reales o complejas (con parte imaginaria).

130 TEMA 8. MATLAB

En los ejemplos anteriores la condicion de la bifurcacion depende de una unica relacionlogica. Ocurre a menudo que la condicion es mas elaborada dependiendo de varias relacioneslogicas combinadas. A modo de ejemplo considere el problema de determinar si un numero leıdopertenece o no al intervalo (2, 5). En otras palabras, se ha de determinar si el numero leıdo(llamemosle x) cumple o no cumple la condicion x > 2 y simultaneamente x < 5. El operador& permite combinar las dos desigualdades como muestra el siguiente ejemplo:

x=input(’Introduzca valor de x ’)

if x > 2 & x < 5,

disp(’x esta en el intervalo’)

else

disp(’x esta fuera del intervalo’)

end

El operador & permite pues realizar la suma logica de los resultados de las dos comparaciones.De forma similar el operador | realiza la suma logica. El ejemplo siguiente es un programa quepermite calcular si el numero leıdo x es exactamente igual a tres o a cuatro.

x=input(’Introduzca valor de x ’)

if x == 3 | x == 4,

disp(’x cumple la condicion’)

else

disp(’x no cumple la condicion’)

end

8.6.2 El bucle ”mientras”

El bucle ”hacer mientras que la condicion sea cierta” se construye en MATLAB mediante unconjunto de lıneas de codigo que tienen la forma siguiente:

while condicion

sentencias del cuerpo del bucle

end

En la figura 8.5 a) se muestra el diagrama de flujo correspondiente al bucle. La condiciones una expresion que da como resultado un valor logico, por ejemplo x > 2. El cuerpo del bucleson sentencias cualesquiera.

Examinando el diagrama de flujo de la figura 8.5 a) es facil deducir que mientras la condicionse cumpla se repetira el bucle una y otra vez. Es decir, si al evaluar la expresion logica de lacondicion se obtiene un resultado verdadero se pasa a ejecutar el cuerpo del bucle, en casocontrario se termina el bucle.

Como ejemplo sencillo considere el siguiente trozo de codigo:

c© M.R. Arahal 2009 DISA. ESI. US. 131

¿ condición ?

cuerpo

no

inicio

Escribir suma

¿ x < 10 ?

Iniciar x a 0 y suma a 0

suma suma + x

no

x x + 2

fin

a) b)

x Variable entera suma Variable entera

Contador de 0 a 10 Suma de los valores de x

Figura 8.5: a) Diagrama de flujo correspondiente a un bucle generico del tipo ”repetir mientrasla condicion sea cierta”. b) Diagrama de flujo correspondiente al ejemplo de uso del bucle”mientras”

x=0; suma=0;

while x<10,

suma = suma + x;

x = x+2;

end

suma

Es facil adivinar que ocurre al ejecutar este programa, sobre todo si se dibuja el diagramade flujo equivalente (vease figura 8.5 b).

Para mejorar la legibilidad de los programas es muy aconsejable incluir comentarios y ordenarla apariencia en la pantalla de las sentencias. De este modo el ejemplo en cuestion resulta masfacil de interpretar.

x=0; % variable contador para el bucle

suma=0; % variable suma parcial

while x<10, % condicion bucle

suma = suma + x; %

x = x+2; % actualizacion

end

suma % escritura resultado

132 TEMA 8. MATLAB

8.6.3 La sentencia for

En muchas situaciones es preciso repetir una tarea un numero conocido de veces. Para ello sepuede disponer un bucle con un contador. En cada pasada o repeticion el contador se incrementay se comprueba que no se ha sobrepasado el lımite. Estas tareas se realizan facilmente enMATLAB con el uso de la sentencia for.

Los bucles que utilizan for tienen en MATLAB el aspecto siguiente:

for contador = valorinicial:valorfinal,

sentencias del cuerpo del bucle

end

En la figura 8.6 a) se muestra el diagrama de flujo correspondiente al bucle anterior. En else observa que contador es una variable que sirve para controlar el bucle. Esta variable tomainicialmente el valor especificado por valorinicial. La variable se incrementa al final de cadapase o repeticion en una unidad. La condicion de salida del bucle consiste en que el contadorno sobrepase el lımite fijado por el valor valorfinal.

¿ contador dentro de límites?

cuerpo

no

inicio

¿ k 6 ?

Iniciar k a 1

no

k k + 1

fin

a) b)

k Variable entera Contador de 1 a 6

Asignar al contador el valor

inicial

Incrementar el contador

Escribir k

Figura 8.6: a) Diagrama de flujo correspondiente a un bucle generico 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

c© M.R. Arahal 2009 DISA. ESI. US. 133

end

En la figura 8.6 b) se presenta el diagrama de flujo correspondiente a este ejemplo. Es facilver que el bucle no realiza calculo alguno, simplemente escribe en la pantalla los valores sucesivosque va adquiriendo la variable k.

Este ejemplo revela porque se le llama bucle ”para”. Se observa que para cada valor de kentre 1 y 6 se escribe k en la pantalla, que es lo que literalmente dice la sentencia

for k = 1:6,

Los valores iniciales y finales no necesariamente son constantes, pueden ser variables comoen 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 realizaruna cuenta atras (mediante decremento del contador) o para saltar de dos en dos, etc. La formade 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

134 TEMA 8. MATLAB

8.7 Ejercicios propuestos

En estos ejercicios se debe realizar un algoritmo mediante diagrama de flujo y tabla de objetos.Antes de codificar el algoritmo debe comprobar que sea correcto.

A fin de poder resolver un mayor conjunto de problemas se permitira en los algoritmos eluso de funciones de MATLAB tal y como las trigonometricas, logarıtmicas, raız cuadrada yfunciones de dibujo.

Posteriormente ha de codificar los algoritmos en modulos de MATLAB y probarlos conconjuntos de datos controlados.

• Leer las 5 componentes de un vector v y escribirlo luego al derecho y al reves.

• Realizar un programa que permita pasar de grados Farentheit a Celsius.

• Crear un vector x de dimension 100, cuyas componentes son los valores

xk = −1.001 + 0.01 · k

Calcular a continuacion un vector y cuyas 100 componentes vienen dadas por yk = sen(xk)xk

.Finalmente se ha de representar graficamente y frente a x.

• Se ha de leer una cadena de caracteres y cifrarla para que pueda ser enviada de formasecreta. La regla de cifrado es: sumar al codigo de cada caracter la posicion que ocupadentro del texto al cuadrado. El mensaje cifrado consiste en la lista de numeros obtenidosseparados por espacios.

• Descifrar un mensaje codificado segun la regla anterior.

• Leer del teclado un par de abcisas x1 y x2. Representar graficamente la funcion y = x− sen(x)utilizando cien puntos equiespaciados entre x1 y x2.

• Utilizar el programa anterior para calcular graficamente la solucion de la ecuacion dada porsen(x) = x (calculando el paso por cero de la funcion y = x− sen(x) mediante llamadassucesivas al programa con valores de x1 y x2 que esten a izquierda y derecha de dicho pasepor cero).

• Programar un menu matematico simple. El programa ha de leer un numero x y luegoaceptar una opcion elegida por el usuario. Si la opcion es 1 se ha de escribir el valorabsoluto de x, si es 2 se ha de escribir x2, si es 3 aparecera x3, finalmente si es 4 seescribira x!.

• Codificar y probar el algoritmo que sirve para decidir si un numero es primo. Para poderobtener el resto de una division necesitara una funcion que calcule la parte entera de unnumero con decimales, esta funcion en MATLAB se llama fix().

• Codificar y probar el algoritmo que calcula la raız cuadrada aproximada entera por defecto.

• Realizar un programa que resuelva la ecuacion de segundo grado x2 + bx + c = 0 leyendolos coeficientes b y c. Considere separadamente los casos de soluciones reales y complejas.

c© M.R. Arahal 2009 DISA. ESI. US. 135

• Realizar un programa que dibuje en la pantalla un polıgono regular de n lados, siendon ∈ IN, n > 2 un numero leıdo previamente. Utilize las funciones trigonometricas paracalcular la posicion de los vertices en el plano y las funciones de dibujo para trazar elpolıgono. Suponga que el centro del polıgono esta en el origen y que el primer vertice estasobre el eje OX. La longitud del lado sera 1 en todo caso.

• Realice un programa que permita dibujar una circunferencia aproximada como un polıgonoregular de 200 lados.

• Generalice el programa anterior para dibujar elipses. Se tomara el semieje horizontal iguala uno y el vertical igual a v siendo v un numero que habra de leerse del teclado.

• Los vertices de un polıgono irregular de n lados en el plano consisten en n parejas (xi, yi)con i = 1, ..., n. Suponga que dispone de una matriz V ∈ IRn×2 cuyas componentes sonai1 = xi y ai2 = yi. Realice un programa que calcule el perımetro del polıgono dado porV .

• Se ha de escribir un uno en el caso de que exista un trıo (x, y, z) de numeros enterospositivos tales que x2 + y2 = z2. Limite la busqueda a x ∈ (0, 100), y ∈ (0, 100). En casode que no se encuentre solucion se ha de escribir un cero.

• Repita el ejercicio anterior pero escribiendo todas las soluciones que encuentre en el inter-valo x ∈ (0, 1000), y ∈ (0, 1000).

• Se desea calcular la suma s =∑n

k=1 1/ak siendo los valores ak los elementos de la sucesiondada por ak = ak−1 + ak−2 con a1 = 1 y a2 = 1. El lımite n ha de leerse del teclado y sesupone mayor que dos.

• Se desea calcular la suma s =∑n

k=1 1/km siendo m y n dos numeros enteros positivos quese suponen dados.

• Escriba los n primeros terminos de la sucesion dada por an = (1 + 1n)n, siendo n un numero

entero positivo dado.

8.8 Puesta a punto y mantenimiento de programas

El proceso de resolucion de problemas requiere realizar un algoritmo que posteriormente escodificado. Incluso si el algoritmo es correcto puede ocurrir que el programa resultante nofuncione. Esto pasa pues al realizar la codificacion pueden introducirse errores variados. En talcaso es necesario pasar a depurar el codigo.

8.8.1 Tipos de error

En primer lugar se van a clasificar los errores en varios grupos:

• Errores sintacticos. Son debidos a una mala escritura del codigo, por ejemplo al cambiarun caracter por otro (3]2 en lugar de 3 + 2 o sen(1.2) en lugar de sin(1.2)) o al escribirmal el nombre de una variable que se estaba utilizando.

136 TEMA 8. MATLAB

Estos errores suelen detectarse facilmente pues MATLAB produce mensajes orientativosen cuanto llega al primero de estos errores. Para corregirlos basta con mirar el lugar dondeMATLAB indica que se ha producido el error (la lınea del archivo del modulo en cuestion).

• Errores de codificacion. Suelen provenir de una mala transcripcion del algoritmo en codigo.Por ejemplo al colocar los valores iniciales de variables, o al crear condiciones para bifur-caciones y ciclos.

Al utilizar estructuras repetitivas hay que poner especial cuidado en no crear bucles in-finitos (que nunca terminan) o bucles vacıos (que nunca realizan ni siquiera la primeraiteracion). En ambos casos hay que vigilar la condicion de salida, los valores iniciales y lasactualizaciones de las variables que controlan los ciclos.

• Errores derivados del uso de variables. El caso mas comun es utilizar una variable a lacual no se le ha proporcionado previamente ningun valor.

En otras ocasiones el error proviene de usar una variable mas de una vez con significadosdistintos. Es posible que una parte del programa cambie esta variable siendo necesario elvalor antiguo para una parte posterior del programa.

Estos dos tipos de errores se resuelven facilmente si se ha preparado cuidadosamente latabla de objetos teniendo cada variable un unico cometido.

Otro tipo de errores surge al considerar funciones. Es frecuente confundir los argumentosy otras variables locales de las funciones con variables del programa principal. Estascuestiones se explicaran en un punto posterior.

• Errores durante la ejecucion. Incluso si el programa no contiene errores sintacticos puedeocurrir que al ejecutarlo se den circunstancias que impidan un correcto desarrollo delmismo. Las causas mas frecuentes son

– El desbordamiento. Si se realiza una operacion cuyo resultado excede la capacidadde representacion de la maquina se produce un error de desbordamiento. Esto ocurrepor ejemplo si se intenta realizar la operacion 1/0.

– Indices fuera de intervalo. Los ındices para acceso a vectores y matrices han de serenteros y mayores que cero.

– Numeros complejos. Si se realiza la raız cuadrada de un numero negativo en algunoslenguajes el resultado es un error de desbordamiento. En el caso de programar enMATLAB se obtiene como resultado un numero complejo. Esto puede dar lugar aerrores si no se tiene en cuenta que dicho numero posee parte real e imaginaria quehan de ser tenidas en cuenta.

8.8.2 Pruebas de los programas

Para detectar errores en la codificacion de los programas es preciso realizar pruebas sobre losmismos. En estas pruebas es conveniente tener en cuenta algunos consejos. Se supone que elalgoritmo que da lugar a la codificacion ha sido ya comprobado previamente, por lo que loserrores que se detecten provienen de una mala codificacion.

Conjunto de datos Ya es sabido que las pruebas se realizan con un conjunto controlado dedatos para los cuales se conoce el resultado correcto. Este conjunto debiera incluir los casos

c© M.R. Arahal 2009 DISA. ESI. US. 137

”difıciles” en los que los datos toman valores ”extremos”. Por ejemplo, en un programaque calcule el factorial puede ser interesante ver si responde adecuadamente al calculo de0! y 1!.

Mensajes de error Un programa bien disenado debiera defenderse cuando los datos que se lesuministran no son adecuados. Ası, el programa que calcula la raız cuadrada aproximadapor defecto (vease tema 6) no debiera admitir que el dato sea un numero negativo. La formamas facil es hacer que el programa escriba en la pantalla un mensaje de error y termine supropia ejecucion. Este metodo expeditivo no debe usarse en programas de envergadura,pero sı resulta muy efectivo para los pequenos programas de un curso introductorio.

Mensajes orientativos Si un programa consta de muchas partes puede ser util que en la fasede depuracion el programa vaya indicando mediante mensajes en la pantalla la parte en laque se halla. De este modo es posible cazar bucles infinitos y otras situaciones indeseables.

A pesar de estos consejos la depuracion es una tarea que se complica mucho a medida queel programa crece de tamano. Por este motivo se recomienda siempre hacer uso de modulospequenos que han de comprobarse intensivamente antes de ser incorporados a modulos mayores.

8.8.3 Documentacion

Los programas deben ir provistos de documentacion tanto para los futuros usuarios como parafacilitar su posible modificacion por parte del mismo creador o de otro programador.

La documentacion necesaria puede clasificarse en varios grupos:

Interna Es la que esta incluida en el propio codigo del programa. A su vez puede ser:

Comentarios. Solo se ven en el codigo fuente.

Mensajes en pantalla. Aparecen durante el uso del programa para guiar al usuario.

Ayuda directa. Equivale al manual del usuario pero en formato digital.

Externa Es la que consta en documentos adicionales, incluyendo:

Manual de usuario

Diagramas de flujo o pseudocodigo y tablas de objetos

Descripcion de los datos utilizables

Descripcion de modulos y funciones y de los archivos que los contienen

8.9 Funciones

En matematicas una funcion 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 lasfunciones de MATLAB ocurre otro tanto. El papel de la variable independiente es represen-tado por los datos que se le suministran a la funcion, llamados normalmente argumento. Se

138 TEMA 8. MATLAB

dice habitualmente que la funcion ”devuelve” un resultado que es el equivalente a la variabledependiente.

Para aclarar las ideas consideremos la sentencia de MATLAB y = sin(x). Hemos de recor-dar que la ejecucion de esta sentencia provoca lo siguiente:

1. El calculo mediante la funcion sin del seno del dato proporcionado, que en este caso es elvalor de x.

2. La asignacion a la variable y del valor calculado por la funcion sin (que es, logicamentesen(x)).

Es muy conveniente no perder de vista estos pasos en las explicaciones que se daran poste-riormente.

Ademas de las funciones existentes en MATLAB hay mecanismos para que el usuario escribafunciones nuevas. Para ello solo tiene que preparar en un archivo de texto las ordenes de MAT-LAB que realizan un determinado calculo y posteriormente anadir una cabecera que permita aesas ordenes trabajar como debe hacerlo una funcion.

Se va a ilustrar el procedimiento con un ejemplo. Supongamos que se necesita una funcionque calcule el factorial de un numero dado n. Escribimos en un archivo las ordenes:

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 trozode codigo debemos recordar siempre que hemos de usar la variable n para el dato. Dicho de otromodo, este trozo de codigo no sirve si se pretende calcular el factorial de x o de q. Lo que senecesita es anadir una cabecera para que el trozo de codigo se convierta en una funcion.

function [factorial] = mi_fact(n)

producto=1;

for multiplicador=2:n,

producto = producto*multiplicador;

end

factorial = producto;

c© M.R. Arahal 2009 DISA. ESI. US. 139

Se ha de guardar este texto en un archivo M cuyo nombre ha de ser mi fact. Este nombrese ha escogido para recalcar que es una funcion mıa y que calcula el factorial.

Para probar mediante ejemplos que este archivo M es una funcion escribimos en la ventanade ordenes de MATLAB lo siguiente:

>> mi_fact(5)

ans =

120

Cada vez que se utiliza una funcion se dice que se hace ”una llamada” a la misma, o que sela ”invoca”. Notese que esta invocacion, uso o llamada produce un efecto interesante: el valorque se le proporciona (el valor 5 en el ejemplo) es copiado en la variable n de la funcion, demodo que las ordenes que se habıan escrito y que calculan el factorial de n estan en realidadcalculando el factorial del dato escrito entre parentesis. A este fenomeno se le suele llamar ”pasede argumento”.

Por otra parte, el resultado que se calcula y que almacena en la variable factorial aparecetras la llamada en el entorno de MATLAB. Si esto no se entiende del todo considere este otroejemplo:

>> 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 estefenomeno se le da el nombre de ”devolucion de resultados”.

Con esta explicacion ya tiene sentido una frase habitual entre programadores como ”le pasea la funcion el valor 4 y me devolvio en y el factorial de 4”.

La sintaxis para la escritura de funciones es simple. En primer lugar debe aparecer una lıneaen la que se indica:

• el nombre de la funcion (en el ejemplo anterior es mi fact).

140 TEMA 8. MATLAB

• el nombre de la variable resultado (en el ejemplo anterior es factorial).

• el nombre de los argumentos (en el ejemplo anterior hay un unico argumento de nombren).

A continuacion se escribiran sentencias de MATLAB incluyendo todo tipo de calculos. Esobligatorio que en algun punto se le de valor a la variable resultado pues de otro modo la funcionno sabra que devolver al ser invocada y generara un error.

8.10 Variables locales y globales

Continuando con el ejemplo anterior es instructivo utilizar la orden who para ver que variablesse estan utilizando:

>> who

Your variables are:

y

el resultado obtenido quiza debiera sorprender, porque, ¿donde esta la variable producto?,¿y factorial?, ¿y multiplicador?, ¿y n?. La unica variable que parece existir (segun indicael resultado de who) es y.

La respuesta es que estas variables no son visibles desde el entorno de MATLAB pues estanocultas dentro de la funcion mi fact. Esta caracterıstica es muy util pues de este modo cadafuncion puede usar variables con el nombre que quiera sin que haya que preocuparse porque estavariable ya exista previamente en otra funcion.

Este hecho se produce con las funciones, pero no con cualquier archivo M. El siguienteejemplo puede contribuir a aclarar esta afirmacion. Considere los dos archivos M que se indicana continuacion.

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

c© M.R. Arahal 2009 DISA. ESI. US. 141

Este primer archivo M contiene una funcion. Es facil ver que la funcion calcula la ordenadasobre la recta y = 8x + 2 correspondiente a un punto de abcisa x que es el dato proporcionadoa la funcion.

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 funcion, es simplemente un conjunto de ordenes de MATLABque se han escrito y guardado en disco.

Se va a mostrar mediante ejemplos las diferencias de uso de ambos archivos.

>> a=-2

a =

-2

>> f_recta(1)

ans =

10

>> a

a =

-2

Las lıneas anteriores presentan un ejemplo en el que se hace uso de la funcion f recta en el quese observa que la variable a permanece inalterada a pesar de haber ejecutado la funcion.

>> a=-2

a =

-2

>> x=1

x =

1

>> m_recta

>> y

y =

142 TEMA 8. MATLAB

10

>> a

a =

8

Se observa en este ejemplo de uso del archivo M m recta que la variable a cambia de valor.Queda claro pues que la variable que usa el archivo M es la misma que existe en el entorno deMATLAB.

8.10.1 Clasificacion de las variables

Las variables pueden clasificarse de varias maneras. Atendiendo al campo donde pueden servistas y utilizadas se distinguen dos grupos:

Globales Estas variables pueden ser vistas y utilizadas desde cualquier archivo M y desde el entornode MATLAB.

Locales Son variables que solo pueden ser vistas y utilizadas dentro de alguna funcion. Fuera dela 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:

Persistentes Estas variables existen desde el momento en que son creadas hasta que se las destruyeexplıcitamente mediante la orden clear. Las variables globales son de este tipo. Tambiense las suele llamar variables estaticas.

Las variables estaticas o persistentes no pierden su valor por culpa de llamadas a funcionesu otros acontecimientos. Tan solo se ven afectadas por ordenes de asignacion.

Efımeras Son variables locales que son creadas por una funcion y desaparecen al terminar la funcion.Debido a esto las variables que estan dentro de una funcion no conservan su valor de unallamada a otra de la funcion. Existe un procedimiento para convertir las variables localesen 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 manifiestotodo esto es utilizando ejemplos como los que se proporcionan a continuacion.

Ejemplo 1. Las variables del entorno de MATLAB son locales.

Para poner de manifiesto esta afirmacion considere la funcion f1 cuyas ordenes se guardanen el archivo f1.m.

c© M.R. Arahal 2009 DISA. ESI. US. 143

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 funcion, por lo que intentaremoshacerlo desde el entorno. Para ello creamos la variable y le damos un valor:

>> clear all

>> b=4

b =

4

y a continuacion utilizamos la funcion 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

Aparece un mensaje de error que nos indica que la variable b no es conocida dentro de lafuncion f1. La explicacion es simple: la variable b pertenece al entorno de MATLAB. No es unavariable global. No puede ser utilizada en el interior de funciones.

Ejemplo 2. Las variables interiores de una funcion son locales y no pueden ser accedidasdesde otras funciones o desde el entorno de MATLAB. Para ilustrarlo se retoma el archivo f1 yse modifica para dar lugar a una funcion que se guardara en el archivo f recta que se reproducea continuacion.

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

144 TEMA 8. MATLAB

Haremos una llamada a la funcion y luego intentaremos averiguar desde el entorno de MA-TLAB cuanto 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 funcionf recta y no es accesible fuera de esta funcion.

Ejemplo 3. Las variables globales son accesibles desde cualquier funcion.

Para crear una variable global es preciso escribir global nombrevariable en las funcionesque la vayan a usar, incluyendo la ventana de ordenes 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. Paraponer esto de manifiesto usamos la orden whos.

>> whos

Name Size Bytes Class

b 0x0 0 double array (global)

Grand total is 0 elements using 0 bytes

La funcion que vaya a utilizar la variable global ha de contener tambien la orden global b.Creamos la funcion f2 que es una modificacion de f1 (vease ejemplos anteriores).

function [y] = f2(x)

global b

a = 8; % pendiente

y = a*x + b; %valor de la recta en x

c© M.R. Arahal 2009 DISA. ESI. US. 145

Archivo f2.m

Ahora intentamos asignar un valor a b y veamos si la funcion f2 es capaz de utilizar dichovalor.

>> b=-5

b =

-5

>> f2(1)

ans =

3

La respuesta obtenida es la deseada, con lo que queda probado que las variables globalespueden ser usadas dentro y fuera de funciones.

8.10.2 Fases de la ejecucion de una instruccion

De los ejemplos anteriores es posible sacar conclusiones generales acerca de como utiliza MA-TLAB las funciones. Para terminar de exponer estas ideas se indican a continuacion las fasesde la ejecucion de una instruccion. Conviene comprenderlas bien pues se trata de los pasos queMATLAB realiza cada vez que se invoca a una funcion. El exito o fracaso de las funciones queuno escriba estara sin duda influenciado por el buen conocimiento de estas fases.

1. Creacion de variables locales para argumentos formales.

2. Recogida del valor de los argumentos de la llamada por parte de las variables locales.

3. Calculos incluidos en el cuerpo de la funcion.

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 tienenlugar y que son necesarias para el desempeno de las tareas encomendadas a una funcion.

8.11 Ejemplos con funciones en MATLAB

A continuacion se presentan algunos ejemplos resueltos. Cada problema ha sido planteado paraser resuelto y programado en MATLAB.

146 TEMA 8. MATLAB

8.11.1 Cola de montaje

Se desean codificar dos funciones de MATLAB que sirvan para simular el comportamiento de unacola de montaje (hilera de piezas distintas que esperan a la vez). Estas funciones trabajaran conlos numeros de identificacion de las piezas (enteros positivos). Dichos numeros se almacenaranen un vector v por orden de llegada a la cola.

La primera funcion se llamara entrada y admitira como argumentos el numero de la piezaque acaba de incorporarse a la cola y el vector v. La funcion ha de introducir el numero dela pieza recien llegada al final del vector. Como resultado ha de devolver el vector de la colamodificada.

La segunda funcion se llamara salida. Su unico argumento es el vector v. La funcion sacaradel vector v el numero de la pieza que lleve mas tiempo en la cola. Como resultado ha dedevolver el nuevo vector v en el que se ha retirado la pieza que ha salido, ademas ha de apareceren la pantalla el numero de la pieza saliente.

A fin de aclarar el ejercicio considere los siguientes ejemplos de uso:

>> v = [ 12 25 3];

>> w=entrada(44, v);

>> w

w =

12 25 3 44

En este primer ejemplo puede verse que la funcion entrada ha introducido el nuevo valor(44) en la cola. El resultado devuelto por la funcion se asigna en este caso a un nuevo vector w.

>> [z,p]salida(w);

>> z

z =

25 3 44

>> p

p =

12

El segundo ejemplo ilustra la forma en que trabaja la funcion salida. Se observa que los resultadosson dos: el vector z que contiene las nuevas componentes de la cola tras la salida de una de ellasy el numero p de la pieza que ha salido.

Para la codificacion es necesario usar la funcion length que devuelve el numero de elementosde un vector. Por ejemplo si v = [ 1 2 3 4] entonces:

>> length(v)

ans =

4

c© M.R. Arahal 2009 DISA. ESI. US. 147

Solucion. La funcion entrada tiene como mision anadir el identificador de la nueva piezaal final del vector. El siguiente trozo de codigo puede ser solucion (se ha obviado el diagramade flujo por ser trivial).

function [nv]=entrada(nropieza, vector)

n = length(vector);

for k=1:n,

nv(k)=vector(k);

end

nv(n+1)=nropieza;

Para una mejor comprension de la funcion considere la tabla de objetos de la misma.

Objeto Identificador Tipo Valor

Numero que identifica la pieza que va a entraren la cola. Argumento.

nropieza. entero variable

Vector que contiene los identificadores de las pie-zas en la cola. Argumento.

vector vector deenteros

variable

Nuevo vector que incluye la pieza recien entrada.Resultado.

nv vector deenteros

variable

Numero de piezas en la cola antes de entrar lanueva. Variable auxiliar.

n entera variable

Funcion de biblioteca para calcular el numero deelementos de un vector.

length

Por otra parte, la funcion salida ha de proporcionar el elemento que ocupa el primer lugaren el vector y deshacerse de el, moviendo los otros elementos una posicion.

function [nv, pieza]=salida(vector)

n=length(vector);

for k=2:n,

nv(k-1)=vector(k);

end

pieza = vector(1)

La tabla de objetos resulta ser en este caso:

148 TEMA 8. MATLAB

Objeto Identificador Tipo Valor

Vector que contiene los identificadores de las pie-zas en la cola. Argumento.

vector vector deenteros

variable

Nuevo vector que incluye la pieza recien entrada.Resultado.

nv vector deenteros

variable

Numero que identifica la pieza que ha salido dela cola. Resultado.

pieza. entero variable

Numero de piezas en la cola antes de salir laprimera. Variable auxiliar.

n entera variable

Funcion de biblioteca para calcular el numero deelementos de un vector.

length

8.11.2 Reordenacion de matrices

Se desea codificar una funcion de MATLAB que sirva para reordenar las filas de una matriz.Dada una matriz A ∈ IRm×n la tarea consiste en colocar las filas de la matriz en un nuevo ordenindicado por un vector de ındices v. Las componentes del vector v son m numeros enteros talesque 1 ≤ vk ≤ m ∀k = 1, · · · , m.

La reordenacion tiene lugar del siguiente modo: la primera fila de A ha de colocarse en ellugar indicado por v1, la segunda fila de A ha de colocarse en el lugar indicado por v2, etc.

La funcion se llamara mezclar y admitira como unicos argumentos: la matriz A, Las di-mensiones de A, m y n y el vector v. La funcion devolvera unicamente la matriz A con sus filasdebidamente reordenadas. A fin de aclarar el ejercicio considere el siguiente ejemplo de uso:

>> A = [ 0.5 0.5 0.5; 7 7 7];

>> mezclar(A, 2,3, [2 1])

ans =

7.0000 7.0000 7.0000

0.5000 0.5000 0.5000

Se observa que el resultado obtenido al ejecutar la funcion mezclar es ans que resulta ser lamatriz A con sus filas cambiadas de lugar.

Solucion. El ejercicio se resuelve copiando las filas de la matriz A en otra matriz B teniendocuidado de colocar la fila k en el lugar indicado por vk; es decir, se ha de verificar que para todoj = 1, · · · , n se cumpla que bp,j = ak,j siendo p = vk el nuevo lugar para la fila k.

function [B] = mezclar(A, m, n, v)

for fila=1:m,

nuevolugar = v(fila);

for columna=1:n,

B(nuevolugar, columna) = A(fila, columna);

end

end

c© M.R. Arahal 2009 DISA. ESI. US. 149

8.11.3 Ejercicios propuestos

Presente mediante diagramas de flujo y tablas de objetos algoritmos que resuelvan los problemasplanteados. Posteriormente codifique la solucion en MATLAB. No utilice funciones propias deMATLAB (como seno, coseno, raız cuadrada, etc.) a menos que se indique expresamente. En sulugar realice sus propias funciones. Recuerde que debe usar unicamente el conjunto elementalde operaciones que se permite para los diagramas de flujo.

1. Dado un numero entero n y un numero real x calcule mediante una funcion la expresionxn. Preste atencion a los diferentes casos para n > 0, n = 0 y n < 0.

2. Dados dos enteros positivos m y n realice una funcion que calcule el numero combinatorio(mn

).

3. Dado un vector v ∈ IRn×1 con n > 1 entero, realice una funcion que calcule vt · v.

4. Los coeficientes de un polinomio de grado n > 1 son las componentes de un vectora = (a1, a2, ..., an, an+1)

t, teniendo el polinomio la forma:

A(x) = a1xn + a2x

n−1 + · · ·+ anx + an+1.

Realice una funcion que evalue el polinomio A en un cierto punto x siendo los argumentosel vector a, el grado n y el punto x.

5. Realice una funcion que calcule el determinante de una matriz generica A ∈ IR2×2. Elargumento de la funcion sera la matriz A.

6. Sea f : IR → IR una funcion definida en un intervalo [xinf , xsup]. Suponga que se co-nocen n + 1 puntos sobre la curva y = f(x). Sean estos puntos: P1 = (x1, y1), ...,Pn = (xn, yn). Suponga ademas que las abscisas de los puntos estan ordenadas, de formaque xinf = x1 < x2 · · · < xn = xsup. Realice una funcion que calcule la longitud de la curvaentre los puntos xinf y xsup aproximando dicha longitud por la suma de las longitudes delos segmentos dados por los puntos Pi, ∀i = 0, · · · , n. Para este ejercicio se ha de usar laraız cuadrada. Indıquela en el diagrama de flujo con el signo habitual

√.. Para codificar

en MATLAB recuerde que la funcion es sqrt().

7. Interpolacion lineal a trozos. Sea f : IR → IR una funcion definida en un intervalo[xinf , xsup]. Suponga que se conocen n + 1 puntos sobre la curva y = f(x). Sean estospuntos: P1 = (x1, y1), ..., Pn = (xn, yn). Suponga ademas que las abscisas de los puntosestan ordenadas, de forma que xinf = x1 < x2 · · · < xn = xsup.

Se necesita una funcion que calcule la aproximacion lineal o estimacion de f(x) interpo-lando mediante un segmento en el subintervalo adecuado.

8. Funcion que calcule el adjunto Adj(akj) en una matriz A ∈ IRm×n dados A, k y j.

9. Se desea realizar varias funciones en MATLAB para trabajar con parabolas del tipoy = ax2 + bx + c en un intervalo [xinf , xsup].

En primer lugar se precisa una funcion que requiera del usuario los valores a, b, c quedefinen la parabola y los puntos inicial y final del intervalo xinf y xsup.

En segundo lugar realice una funcion que dibuje en la pantalla la grafica de la parabolaen el intervalo dado. Es necesario utilizar la funcion de MATLAB plot.

150 TEMA 8. MATLAB

Finalmente escriba una funcion que calcule el menor valor tomado por la parabolaen el intervalo. Tenga en cuenta los casos posibles en funcion de a. El calculo ha de serexacto, no aproximado.

10. Funcion que realice el trazado grafico de una curva polinomica y = P (x) entre dos abscisasxi y xf con xi < xf dados el vector de coeficientes del polinomio, las abscisas inicial yfinal y el numero de segmentos ns en que se descompondra la curva para ser trazada. Esnecesario utilizar la funcion de MATLAB plot.

11. Funcion para el calculo aproximado de maximos de un polinomio P (x) en un intervalo[xi, xf ] comprobando las ordenadas de todos los puntos en el intervalo en una rejilla deancho h dado.

12. Funcion que evalue la derivada dy/dx de una funcion y = P (x), siendo P un polinomio.La derivada ha de evaluarse en en un punto z. Los argumentos son el vector de coeficientesdel polinomio y el punto en el que se obtendra la derivada.

13. Funcion que evalue en un punto z la derivada n−esima dny/dxn siendo y = P (x) unpolinomio. Los argumentos son el vector de coeficientes del polinomio y el punto en el quese obtendra la derivada.

14. Utilice las dos funciones anteriores para resolver el problema de calcular los ceros (raıces)de polinomios en un intervalo dado siguiendo el metodo de Newton.

15. Se necesita un conjunto de funciones que permitan realizar operaciones con vectores deIRn. Dichas funciones permitiran a un programa: leer las componentes de un vectorv generico, calcular el producto escalar de dos vectores, calcular el vector suma de dosvectores. Escriba el codigo MATLAB de las funciones con las siguientes condiciones:

1. LeeVect Para leer un vector de IRn del teclado.2. ProdEsc Para multiplicar escalarmente dos vectores va y vb de IRn, (e = va · vb)3. SumVect Para sumar dos vectores de IRn, (vs = va + vb)4. EscVect Para escribir en la pantalla un vector de IRn.

16. Continuando con el ejercicio anterior, escriba ademas un programa de prueba que utiliceestas funciones para leer n, dos vectores va y vb y posteriormente escribir su producto esca-lar y su suma. Este programa no tendra variables globales y debera utilizar exclusivamentelas funciones LeeVect, ProdEsc, SumVect y EscVect.

Tema 9

Algunos problemas de ingenierıa

Este ultimo tema propone diversos problemas comunmente encontrados en diversas areas de laingenierıa. Se han seleccionado por una parte porque permiten poner a prueba los conocimientosque el alumno ha debido adquirir durante el curso. Ademas ilustran ideas que el alumno manejaraa lo largo de la carrera.

En la confeccion de los algoritmos se ha supuesto que el operador dispone de medios pararealizar operaciones elementales de la Logica y la Aritmetica y ademas alguna otra como senos ylogaritmos que se encuentran en la mayorıa de lenguajes de programacion para computadoras eincluso en calculadoras de bolsillo. Gracias a eso los algoritmos que se proponen como solucionpueden ser facilmente codificados en C, en MATLAB, JAVA o cualquier otro lenguaje de altonivel.

9.1 Interpolacion con segmentos

Suponga que se conocen los valores que una funcion 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 seconoce el valor de f . De forma equivalente se denominara Y = {f(xk)} a las ordenadas dedichos puntos.

Para poder obtener aproximadamente f(x∗) mediante interpolacion es necesario que existandos valores xi y xd pertenecientes a X tales que xi ≤ x∗ ≤ xd.

En tal caso la interpolacion produce un valor aproximado f(x∗) que se calcula utilizando larecta que pasa por (xi, yi) y (xd, yd) como se muestra en la figura 9.1. La ecuacion de esta rectaes:

151

152 TEMA 9. ALGUNOS PROBLEMAS DE INGENIERIA

y − yi =yd − yi

xd − xi

(x− xi)

y en el punto x∗ toma el valor

y∗ = yi +yd − yi

xd − xi

(x∗ − xi)

En caso de que x∗ no caiga entre dos valores conocidos no es posible realizar la interpolacion.

0 0.5 1 1.50

0.2

0.4

0.6

0.8

1

1.2 (xi, yi)(xd, yd)

x*

Figura 9.1: Ilustracion de la interpolacion de funciones. La funcion desconocida a interpolar esla lınea de puntos. Los valores conocidos se indican con marcas +. Dado el valor x∗, la rectaque interpola es la lınea continua.

El problema que se pretende resolver puede enunciarse como: dado un conjunto de absci-sas X = {xk} y sus imagenes mediante f denotadas por Y = {f(xk)}, siendo f una funciondesconocida, calcular mediante interpolacion una aproximacion f para nuevos valores de x pro-porcionados por el usuario por teclado.

Es importante tener en cuenta que los valores en X no estan ordenados, es decir no se cumpleque 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 observadosde dos variables y se quiere hallar la relacion entre ambas. Por ejemplo, la relacion entre altitudy temperatura media en la estratosfera.

Mediante un globo se puede medir la temperatura en distintas epocas del ano y la alturacorrespondiente. Suponga que el resultado de tales mediciones se ha incluido en dos vectores Tde temperaturas (en grados Celsius) y A de alturas (en Kms).

c© M.R. Arahal 2009 DISA. ESI. US. 153

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 grafica que se muestra en la figura 9.2 muestra en el eje vertical (eje y) la altura y enel horizontal (eje x) la temperatura. Como puede verse, parece existir una relacion entre lasobservaciones de ambas variables. Mas aun, esta relacion es aproximadamente lineal pues seasemeja a una recta.

−60 −50 −40 −30 −20 −10 020

25

30

35

40

45

50

temperatura (oC)

altit

ud (

Km

s)

Datos observados

Figura 9.2: Mediciones realizadas con globo en la estratosfera.

Una vez hecha esta observacion es posible preguntarse si alguna recta del tipo y(x) = ax + bproporciona una relacion valida a la vista de las mediciones disponibles.

Dada una observacion consistente en el par (xk, yk) se denomina error de ajuste a la diferenciaentre el valor observado yk y el valor dado por la recta para el valor de x observado y(xk) =axk + b. La desviacion cuadratica es es cuadrado de dicho error (yk − y(xk))

2.

El metodo de los mınimos cuadrados permite obtener los valores de a y b que producen elmejor ajuste posible en cierto sentido1.

Las formulas para obtener los valores de a y de b son de sobra conocidas:

1La recta de mınimos cuadrados, como indica su nombre, es la que hace mınima la suma de las desviacionescuadraticas.

154 TEMA 9. ALGUNOS PROBLEMAS DE INGENIERIA

a =

nn∑

k=1

xkyk −n∑

k=1

xk

n∑k=1

yk

nn∑

k=1

x2k −

(n∑

k=1

xk

)2

b =

n∑k=1

yk − an∑

k=1

xk

n

siendo n el numero de observaciones. Estas formulas aplicadas a los datos de altitud ytemperatura dan como resultado los valores

a =11(−10840)− (−379)(353)

11 · 15177− 143641= 0.6242

b = (353− a · (−379))/11 = 53.6

En la figura 9.3 se muestran de nuevo los datos de temperatura y altitud incluyendo ademasla recta de ajuste obtenida con las formulas anteriores que resulta ser y = 0.624x + 53.6.

−60 −50 −40 −30 −20 −10 020

25

30

35

40

45

50

temperatura (oC)

altit

ud (

Km

s)

Datos observados y recta de ajuste

Figura 9.3: Recta de ajuste de los datos experimentales.

El problema que se pretende resolver puede enunciarse como: dado un conjunto de medidasconsistentes en pares (xi, yi) acomodadas en dos vectores x ∈ IRn e y ∈ IRn (con n > 0 entero),hallar los parametros a y b de la recta de ajuste por mınimos cuadrados. Suponga que losvectores y su dimension ya han sido leıdos.

c© M.R. Arahal 2009 DISA. ESI. US. 155

9.3 Calculo aproximado de areas

Como es sabido, la integral definida de una funcion equivale al area que queda bajo la curva dedicha funcion entre los lımites de integracion. 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:

∫ 5

11dx = (5− 1) = 4

Este resultado puede comprobarse de manera inmediata sin mas que trazar la grafica dey = 1 y observar que el area del rectangulo es igual al producto de la base por la altura 4 ·1 = 4.

Segun lo anterior, parece claro que para calcular el area de y =f(x) entre dos abscisas xi,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 metodo presenta un inconveniente, y es que existen funciones para las cuales no seconocen primitivas. Este es el caso, por ejemplo de la funcion f(x) = e−x2

.

El calculo aproximado de integrales consiste en hallar un valor numerico h(xi, xf ) que sea lomas parecido posible al area que se desea calcular g(xf )−g(xi).

Un metodo muy simple consiste en dividir el area en rectangulos como los que se muestranen la figura 9.4. Observese que se ha dividido el intervalo [xi, xf ] en n trozos iguales, resultandolos subintervalos: [x1, x2], [x2, x3], ... [xn, xn+1], siendo x1 = xi y xn+1 = xf . La altura decada rectangulo se calcula mediante el valor de la funcion. Ası, para el primer rectangulo laaltura es f(x1), para el segundo rectangulo f(x2) y para el ultimo rectangulo (el n) es f(xn).

x 1 x n+1 x i x f

f( x )

x 2 x n x k

f( x 1 )

Figura 9.4: Calculo aproximado del area bajo la curva f mediante suma de rectangulos

El area bajo la curva es aproximadamente igual a la suma de las areas de los n rectangulos.Se va a indicar mediante h(xi, xf , n) el valor de dicha suma. Puesto que la base de todos elloses igual a d = (xf − xi)/n se tiene que:

h(xi, xf , n) = dn∑

k=1

f(xk) (9.1)

156 TEMA 9. ALGUNOS PROBLEMAS DE INGENIERIA

La suma anterior puede llevarse a cabo mediante un programa de computador. Notese que laformula (9.1) solo contiene variables y funciones conocidas. Se supone que aunque no se conocela expresion analıtica de la funcion primitiva g(x) sı se conoce la de f(x) y tambien se suponeque 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 xi, xf

(xi < xf ) y una funcion f(x), hallar el area bajo la curva f de forma aproximada.

Resulta evidente que el resultado de (9.1) depende del numero de rectangulos que se utilicen.Si se toma un valor demasiado bajo para n es resultado sera poco aproximado pues la ”esca-lera” de rectangulos sera demasiado tosca. Por contra un valor demasiado alto de n produciraresultados finos a costa de un tiempo de calculo elevado. En el algoritmo se dejara que n seauna variable a elegir por el usuario.

9.4 Integracion numerica de ecuaciones diferenciales

9.4.1 Introduccion

Un problema clasico en ingenierıa es el calculo de soluciones aproximadas de ecuaciones diferen-ciales usando metodos numericos.

Una ecuacion diferencial es aquella en la que aparecen la incognita y sus derivadas. Porejemplo la ecuacion

dx

dt+ x = 0

En esta ecuacion x no representa un numero sino una funcion del tiempo x(t). La solucionde la ecuacion es una funcion tal que derivada respecto al tiempo y sumada a sı misma produzcael valor cero.

En algunos casos es posible obtener la solucion utilizando herramientas del calculo. En elejemplo mostrado es simple pasando dt al segundo miembro y tomando integral.

dx

dt+ x = 0

dx

dt= −x

− dx

xdt= 1

−dx

x= dt

−∫

dx

x=

∫dt

c© M.R. Arahal 2009 DISA. ESI. US. 157

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 mediantex(0) = x0 se tiene que:

−∫ t

0

dx

x=

∫ t

0dt

−(ln x− ln x0) = (t− 0)

−(lnx

x0) = t

(lnx

x0) = −t

x

x0= e−t

x(t) = x0e−t

Sin embargo hay ocasiones donde no se conocen maneras para calcular soluciones manipu-lando las ecuaciones como en el ejemplo anterior. Tal es el caso de ecuaciones diferenciales enlas cuales aparecen terminos que no son lineales.

Como ejemplo considere el problema de un paracaidista cayendo en la atmosfera. La caıdaesta gobernada por la accion de la fuerza de gravedad y la fuerza de rozamiento con el aire.

Fg − Fr = mdv

dt

donde Fg es la fuerza de la gravedad que atrae al paracaidista hacia el suelo, Fr es la fuerzade rozamiento que se opone a la caıda, v es la velocidad vertical hacia abajo con la que viaja elmovil y m es su masa.

Se sabe que Fg = mg siendo g = 9.8m/s2, por otra parte la resistencia aerodinamica dependede muchos factores. Simplificando mucho se puede considerar que Fr = kv2. Es decir, laresistencia es proporcional al cuadrado de la velocidad.

La ecuacion diferencial queda entonces:

mg − kv2 = mdv

dt

dividiendo por m y reagrupando terminos se obtiene:

dv

dt= g −Bv2

siendo B = k/m.

158 TEMA 9. ALGUNOS PROBLEMAS DE INGENIERIA

Esta ecuacion no puede resolverse con lapiz y papel por lo que se necesitan tecnicas deintegracion numerica las cuales se pueden programar en un ordenador usando un lenguaje dealto nivel como MATLAB.

9.4.2 El metodo de Euler

Una forma simple de obtener soluciones aproximadas a ecuaciones como la anterior es el metodode Euler.

Sea la ecuacion dxdt

= f(t) con condicion inicial x(0) = x0. En el instante de tiempo t = 0 sesabe que x(t) = x0, ademas se sabe que

x(0) = f(0) = limt−→0

x(t)− x0

t− 0≈ x(h)− x0

h

tomando un valor h suficientemente pequeno. Es decir, que el valor de x(t) en un instante t = hproximo a cero es aproximadamente x0 + hf(0) lo cual se indica mediante x(h) ≈ x0 + hf(0).Frecuentemente el valor calculado de forma aproximada se indica mediante x(h), por lo quex(h) ≈ x(h) = x0 + hf(0).

Del mismo modo, para el instante 2h se puede escribir x(2h) ≈ x(h) + hf(h), como x(h)no es conocido se puede utilizar su valor aproximado x(h), por lo que x(2h) ≈ x(h) + hf(h) ≈x(h) + hf(h) = x(2h).

Procediendo de la misma manera se puede obtener una secuencia de valores aproximados{x(kh)}, k = 1, 2, · · · . Notese que este metodo equivale a hacer una extrapolacion lineal usandola derivada en cada punto.

Para ilustrar el metodo de Euler se parte de la situacion mostrada en la figura 9.5 (a). Eleje horizontal representa la variable t, en el eje vertical se ha colocado el valor x(0) = x0. Apartir de este punto se traza una recta con pendiente f(0). Sobre esta recta se halla el puntode abcisa h y ordenada x(h) = x0 + hf(0) que constituye el primer valor aproximado. A partirde ahı se pasa a una nueva situacion, mostrada en 9.5 (b): ahora se toma x(h) como punto departida para trazar una nueva recta de pendiente f(h) y obtener sobre ella el punto de abcisa 2hy ordenada x(2h) = x(h) + hf(h) que constituye el segundo punto de la solucion aproximada.

En la figura 9.5 (c) se muestra el resultado obtenido al repetir los pasos anteriores 50 vecescon h = 0.1, siendo f(t) = cos(t) y x(0) = 0. Se observa que la solucion proporcionada porla integracion numerica es un conjunto de valores {x(kh)}, k = 1, 2, · · · 50. Estos valores sehan representado uniendo mediante segmentos los puntos (kh, x(kh)), de forma que se obtieneuna aproximacion mediante trozos rectos. En la citada figura se muestra tambien con trazopunteado la solucion exacta obtenida resolviendo dx

dt= cos(t), con x(0) = 0 que da como

resultado x(t) =sen(t). Puede observarse que la discrepancia no es muy alta.

El problema que se pretende resolver puede enunciarse como: dada una ecuacion diferencialde primer orden en la forma dx

dt= f(t) con condicion inicial x(0) = x0 calcular de forma

aproximada mediante el metodo de Euler los valores de la trayectoria x(t) para t = h, 2h, · · · , Nh

c© M.R. Arahal 2009 DISA. ESI. US. 159

0

xx(h)

ht

0

x(h) x(2h)

t2h

x

0 h

0

0 0.5 1 1.5 2 2.5 30

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

(a) (b) (c)

Figura 9.5: El metodo de Euler para integracion numerica

siendo h el paso de integracion dado y N el numero de pasos (tambien dado).

9.5 Ecuaciones trascendentes

Existen ecuaciones cuyas soluciones no pueden hallarse con lapiz y papel intentando despejar lavariable buscada. Este es el caso de ecuaciones como cos(x) = x.

El problema se puede replantear como la busqueda del punto de corte con el eje horizontalde la funcion y = cos(x) − x. Para calcular (de forma numerica) el paso por cero de y(x) sepueden aplicar diversos metodos. Uno de ellos se comenta a continuacion.

9.5.1 Metodo de la biseccion

Se quiere resolver el problema de hallar el paso por cero (o raız) de una funcion y = f(x) dentro deun cierto intervalo [xi, xf ]. Se sabe que f es continua y tambien que en los extremos del intervalotoma valores de distinto signo. Sin perdida de generalidad se puede suponer que f(xi) > 0 yf(xf ) < 0 (en caso contrario basta con buscar el paso por cero de −f(x)).

La situacion comentada aparece descrita en la figura 9.6. De la propiedad de continuidad dela funcion f se obtiene que debe existir al menos un paso por cero en el intervalo citado. Interesacalcular ese valor x∗ que cumple f(x∗) = 0 aunque sea de modo aproximado.

El metodo de la biseccion consiste en dividir el intervalo en otro mas pequeno que sigaconteniendo el punto de corte. Este procedimiento se repite varias veces hasta que el intervalosea lo bastante pequeno. Llegado este momento se puede tomar como valor aproximado del ceroel punto medio del ultimo intervalo.

Para realizar la biseccion se toma el punto medio del intervalo actual xm = (xi + xf )/2 y seevalua la funcion en dicho punto, pueden darse tres casos:

160 TEMA 9. ALGUNOS PROBLEMAS DE INGENIERIA

x i x f

f( x )

x *

Figura 9.6: Funcion con un pase por cero en el intervalo mostrado.

• a) la funcion en xm es del mismo signo que f(xi). En tal caso se toma como nuevo intervaloel [xm, xf ] y se repite el proceso.

• b) la funcion en xm es del mismo signo que f(xf ). En tal caso se toma como nuevo intervaloel [xi, xm] y se repite el proceso.

• c) f(xm) = 0 en tal caso no es preciso buscar mas, se ha hallado un pase por cero de lafuncion.

El metodo de la biseccion termina o bien cuando se halla un punto en el que la funcion valecero o cuando el intervalo es lo suficientemente pequeno. Por ejemplo, si se necesita conocerel pase por cero con dos decimales el metodo ha de aplicarse hasta que el intervalo tenga unalongitud menor o igual a 0.01.

En la figura 9.7 se muestra como actuarıa el metodo de la biseccion con la misma funcion dela figura 9.6. Se han representado tres etapas con los pasos descritos anteriormente (indicadasmediante un numero encuadrado situado en la parte superior de cada grafica). La longituddel intervalo, que se ha indicado en la parte inferior, disminuye a la mitad en cada etapa conrespecto a la anterior.

x i x i x f

f( x )

x m

2

x f

f( x )

x m

1

x i x f

f( x )

x m

3

Figura 9.7: Funcionamiento del metodo de la biseccion.

Para ilustrar el metodo se va a considerar la funcion cos x−x. El intervalo en el que existe unpase por cero se obtiene facilmente 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 esteintervalo es xm = (xi + xf )/2 = π/4. Al evaluar la funcion se obtiene que f(xm) = −0.0783 < 0,por lo que se trata del caso b). El nuevo intervalo ha de ser [0, π/4].

c© M.R. Arahal 2009 DISA. ESI. US. 161

Repitiendo el proceso varias veces se obtienen los valores que figuran en la tabla siguiente:

Intervalo Punto medio xm Valor de f(xm) Longitud intervalo

[0, π/2] π/4 -0.0783 1.5708[0, π/4] π/8 0.5312 0.7854

[π/8, π/4] 3π/16 0.2424 0.3927[3π/16, π/4] 7π/32 0.0858 0.1963[7π/32, π/4] 15π/64 0.0046 0.0982[15π/64, π/4] 31π/128 -0.0366 0.0491

[15π/64, 31π/128] 61π/256 -0.0159 0.0245[15π/64, 61π/256] 121π/512 -0.0056 0.0123[15π/64, 121π/512] 245π/1024 -0.0211 0.0061

La columna de la derecha indica la longitud del intervalo considerado; es decir xf−xi. Puedeobservarse que el valor en cada etapa es la mitad que en la anterior. Esta cantidad tiene granimportancia en el metodo. Observese que si se toma xm como valor aproximado de x∗ el errorcometido no sera nunca mayor que la longitud del intervalo. Por tanto, si se desea la solucionaproximada con un decimal exacto esta se puede tomar como 15π/64 (que se obtiene con tansolo cinco iteraciones); si se precisan dos decimales exactos entonces hay que tomar 245π/1024(son necesarias nueve iteraciones para ello).

La figura 9.8 muestra la funcion f(x) = cos x− x. Los cırculos y las lıneas verticales indicanlos valores de xm en las cuatro primeras etapas. Los numeros que figuran encima de los cırculosindican la etapa en la que han sido obtenidos. Puede comprobarse que en la primera etapa seobtiene (por casualidad) un valor muy cercano al paso por cero.

0 0.5 1 1.5−1.5

−1

−0.5

0

0.5

1

1.5

1

2

34

x

y

cos(x)−x

Figura 9.8: Ejemplo de uso del metodo de la biseccion.

Una vez presentado el metodo es posible enunciar el problema de forma sucinta como: dadauna funcion f(x) y un intervalo inicial [xi, xf ] tales que f(xi) · f(xf ) < 0 aplicar el metodo de labiseccion hasta que el intervalo resultante tenga una longitud menor que cierto valor dado d. Elalgoritmo dara como resultado xm, el punto medio del intervalo final.

162 TEMA 9. ALGUNOS PROBLEMAS DE INGENIERIA

9.6 Superficies

Una superficie z = f(x, y) definida en un rectangulo [xi, xf ]× [yi, yf ] puede representarse me-diante un conjunto discreto de alturas medidas en algunos puntos del dominio. Por ejemplo, sise toma una rejilla en el rectangulo con nx × ny puntos, las alturas de los puntos (xj , yi) seranlos valores zij = f(xj , yi) para i = 1, · · · , ny y j = 1, · · · , nx que se pueden incluir en una matrizZ ∈ IRny×nx .

A modo de ejemplo considere la funcion z = f(x, y) = x2+y2 en el rectangulo [−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}

y = {−2,−1.5,−1,−0.5, 0, 0.5, 1, 1.5, 2}

Z =

5.00 3.25 2.00 1.25 1.00 1.25 2.00 3.25 5.004.25 2.50 1.25 0.50 0.25 0.50 1.25 2.50 4.254.00 2.25 1.00 0.25 0.00 0.25 1.00 2.25 4.004.25 2.50 1.25 0.50 0.25 0.50 1.25 2.50 4.255.00 3.25 2.00 1.25 1.00 1.25 2.00 3.25 5.00

La figura 9.9 muestra la rejilla en el rectangulo considerado y la superficie z = f(x, y) calcu-lada en los puntos de la rejilla.

−2 −1 0 1 2−1.5

−1

−0.5

0

0.5

1

1.5rejilla

x

y

−2 −1 0 1 2−1

0

10

1

2

3

4

5superficie f(x,y)

xy

Figura 9.9: Ejemplo de uso del metodo de la biseccion.

Una superficie cualquiera, como por ejemplo la formada por las montanas y valles del terreno,puede ser representada aproximadamente por una matriz. Usando esta representacion es posibleresolver algunos problemas de ingenierıa.

c© M.R. Arahal 2009 DISA. ESI. US. 163

9.6.1 Busqueda de extremos

Dada una matriz de alturas como la descrita en 9.6 con ny filas y nx columnas se desea determinarlos maximos y mınimos. El problema es equivalente a buscar las cimas y depresiones de unterreno.

Para concretar mas lo expuesto considerese la superficie mostrada en la figura 9.10 y sucorrespondiente grafico de curvas de nivel. Puede observarse que existe mas de una cumbre ymas de una depresion. El objetivo no es hallar la cumbre mas alta o la sima mas profunda sinoindicar en que lugares existe alguna de estas caracterısticas del terreno.

1020

3040

5060

1020

3040

50

10

20

30

j

superficie

i10 20 30 40 50 60

5

10

15

20

25

30

35

40

45

50

55

j

i

5

10

15

20

25

Figura 9.10: Terreno con multiples 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 terrenoque sobresale de los puntos vecinos. Este hecho sera visible en la matriz de alturas pues lacumbre correspondera a algun elemento ai,j con la propiedad de ser mayor que sus vecinos.

Por ejemplo, en la matriz siguiente

0 0 1 2 2 1 0 0 00 0 2 2 2 2 1 0 00 0 2 2 2 2 1 0 00 1 1 2 3 1 1 0 00 0 1 1 2 1 1 0 00 0 1 1 2 1 1 0 00 0 1 1 2 1 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 deabajo, el de la izquierda, el de la derecha y tambien los cuatro situados en las diagonales; esdecir, arriba a la izquierda, arriba a la derecha, abajo a la izquierda y abajo a la derecha.

164 TEMA 9. ALGUNOS PROBLEMAS DE INGENIERIA

Los elementos que estan situados en los bordes de la matriz (los de las filas primera y ultimay los de las columnas primera y ultima) no pueden ser comprobados porque no tienen todos susvecinos, por ello se dejan fuera del analisis.

El algoritmo para detectar cumbres debera analizar cada uno de los elementos interiores dela matriz y comprobar si se cumple o no la condicion de ser mayor que los vecinos.

De forma breve puede enunciarse el problema como:

Dada una matriz de alturas z ∈ IRny×nx con ny filas y nx columnas y dos vectores x ∈ IRnx

e y ∈ IRny , hallar las coordenadas (x, y, z) de los extremos (cimas y depresiones) de la superficierepresentada por z.

9.7 Transporte

Se dispone de una lista de n aeropuertos y las distancias o tiempos de vuelo entre cada unode ellos y los demas. Esa informacion se ha incluido en una matriz D ∈ IRn×n siendo dkj ladistancia (o tiempo de vuelo) para ir del aeropuerto k al j siguiendo la ruta establecida en cadacaso.

No todos los trayectos posibles tienen vuelos, por lo que se dispone de otra matriz C ∈ IRn×n

tal que sus elementos indican si existe o no vuelo directo entre dos aeropuertos. Esto se lograhaciendo que ckj = 0 si no hay vuelo y que ckj = 1 en caso de que si haya vuelo.

Dado un aeropuerto origen ao con ao ∈ 1, 2, · · · , n y otro destino ad 6= ao con ad ∈ 1, 2, · · · , nse desea calcular:

• La lista de todos los trayectos posibles que parten de ao y que pasan solo una vez o ningunapor cada uno de los aeropuertos acabando en ad.

• Distancia total de cada uno de los trayectos anteriores.

• Trayecto de mınima distancia entre el aeropuerto origen y el aeropuerto de destino.

9.8 Tratamiento de textos

9.8.1 Palabras en orden inverso

El problema consiste en leer una frase del teclado y escribirla luego al reves. Por ejemplo, si selee la frase Hola amigo. se ha de escribir en la pantalla .ogima aloH que es la frase escrita dederecha a izquierda.

c© M.R. Arahal 2009 DISA. ESI. US. 165

9.8.2 Palındromo

Problema Leer una palabra y decidir si es palındromo. El final de la palabra es indicado conel punto. Para ser palındromo debe ocurrir que exista un eje de simetrıa en la palabra. Lapalabra puede tener un numero par o impar de caracteres; en este ultimo caso el eje de simetrıacontendra el caracter central.

Ejemplos: abba, abcba.

9.8.3 Mensaje oculto

Una frase puede cambiarse para que resulte irreconocible. Una forma muy simple consiste encambiar cada caracter por el siguiente del alfabeto. Por ejemplo, la palabra IBM se convierte enHAL.

El programa que se desea construir ha de codificar, mediante esta tecnica simple, una fraseque se leera del teclado. Considere que la frase leıda consiste unicamente en una palabra formadapor letras (sin numeros ni otros caracteres).

Para simplificar no tenga en cuenta el caso de letras con tilde o dieresis.

9.8.4 Mensaje oculto II

Se puede expandir el programa anterior para que opere tambien con frases que contienen carac-teres que no son letras, tales como los numeros y signos de puntuacion. Los unicos caracteresque 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 dieresis.

9.8.5 Descifrar mensaje

Se trata ahora de resolver el problema inverso: dado un mensaje codificado proporcionar la fraseoriginal.

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 dieresis.

166 TEMA 9. ALGUNOS PROBLEMAS DE INGENIERIA

9.8.6 Mensaje oculto II

En los dos problemas anteriores se ha ignorado el caso de la letra z. Esta letra plantea unproblema para ser codificada pues no existe otra letra posterior. Una forma de resolver esteproblema es ”asignar” de forma artificial la a como letra siguiente a la z. De este modo unafrase como zona 3 se codifica en apob 3.

Para simplificar no tenga en cuenta el caso de letras con tilde o dieresis.

9.8.7 Pase a mayusculas

Se desea cambiar una frase de forma que todas las letras queden en mayusculas. El programaleera una frase del teclado y escribira como resultado la misma frase pero con las letras cambiadasde forma que todas esten en mayusculas. 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.

Observese que las letras que ya estaban en mayusculas se quedan igual. Los caracteres queno son letras no se ven afectados.

Para simplificar no tenga en cuenta el caso de letras con tilde o dieresis.

9.9 Tratamiento de archivos

9.9.1 Agenda telefonica

Se desea crear una agenda telefonica. Esta agenda consiste en un archivo de texto en el queaparecen nombres, apellidos y numeros de telefono.

Esta tarea puede realizarse con la libreta de notas, pero en lugar de eso queremos desarrollarun 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 numero de telefono de unapersona. Posteriormente preguntara si desea anadir otra persona a la agenda o grabar los datos.Si escoge anadir el programa ha de volver a preguntar el nombre, apellidos y numero de telefono,en caso contrario el programa escribira los datos en un archivo de texto.

El archivo de texto ha de tener el formato siguiente: los dos primeros caracteres son unnumero de orden, a continuacion viene un espacio. Los 15 caracteres siguientes se reservan parael nombre. A continuacion debe aparecer una coma. Los 30 espacios siguientes se dejan paralos dos apellidos. Despues ha de aparecer la palabra Tel y un espacio en blanco. Finalmente seescribe el telefono y se pasa a la lınea siguiente.

En el recuadro siguiente se puede observar un ejemplo de dicho archivo de texto.

c© M.R. Arahal 2009 DISA. ESI. US. 167

01 Pedro, Perez Repitre Tel 56 90 02

02 Ana, Regues Dıaz Tel 11 32 45

03 Juan, Borda Ruiz Tel 34 43 78

04 Antonio, Garcıa Wrkczy Tel 21 32 43

9.9.2 Agenda telefonica II

Para consultar la lista de telefonos confeccionada con el programa anterior es posible usar lalibreta de notas. En lugar de eso se quiere crear un programa en MATLAB que lea el archivo ypresente en la pantalla la informacion que contiene.

El programa no recibe dato alguno. Su mision consiste en leer el archivo que contiene laagenda y mostrar en la pantalla la lista de nombres, apellidos y telefonos exactamente en lamisma forma en la que aparece en el archivo.

9.9.3 Agenda telefonica III

En una agenda es frecuente que haya que anadir nuevos telefonos o borrar alguno existente .Se ha de realizar un programa que lea el archivo (creado con el programa de 9.9.1), presente sucontenido en pantalla y pregunte al usuario si desea anadir o eliminar algo. En caso de que sedesee anadir el programa preguntara al usuario los datos del mismo modo que en el programa de9.9.1. Si se desea eliminar una entrada de la agenda (una lınea de datos) el programa preguntaraque numero de lınea se desea eliminar. El programa concluye escribiendo un nuevo archivo conlos cambios realizados.

c© M.R. Arahal 2009 DISA. ESI. US. 169

Bibliografıa

Basica

• P. Anasagasti, Fundamentos de los computadores. Paraninfo, 1990.

• M. R. Arahal, Fundamentos de informatica. Escuela Superior de Ingenieros, Universidadde Sevilla, 1999.

• T. Aranda, Notas sobre MATLAB. Universidad de Oviedo, Servicio de Publicaciones,1999.

• D. C. Lay, Algebra Lineal y sus aplicaciones. Pearson,1999.

Avanzada

• J. Mathews, Metodos numericos con MATLAB. Prentice Hall, 2000.

• C. Perez Lopez, Matematica informatizada con MATLAB, Ra-Ma, 1996.

• K. Sigmon , Introduccion a MATLAB. University of Florida, 1992. (Traduccion de Celes-tino Montes. Escuela Superior de Ingenieros, Universidad de Sevilla).

• M. J. Soto Prieto, Algebra lineal con MATLAB y MAPLE. Prentice-Hall Internacional,1995.

• G. Brassard y P. Bratley, Fundamentos de algoritmia. Prentice Hall, 1997.