Está en la página 1de 62

Fundamentos de informtica

1 de Grado en Ingenieras
Julio Garraln Ruiz
Departamento de Lenguajes y Ciencias de la Computacin
Escuela Politcnica Superior
Universidad de Mlaga
jgarralon@uma.es
3 de octubre de 2011
Esta obra est bajo una licencia Reconocimiento-NoComercial-CompartirIgual 3.0 Un-
ported de Creative Commons: No se permite un uso comercial de la obra original ni
de las posibles obras derivadas, la distribucin de las cuales se debe hacer con una li-
cencia igual a la que regula la obra original. Para ver una copia de esta licencia, visi-
te http://creativecommons.org/licenses/by-nc-sa/3.0/deed.es_ES o envie una carta a
Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA. a. inclu-
ye
Usted es libre de:
Copiar, distribuir y comunicar pblicamente la obra.
Hacer obras derivadas.
Bajo las siguientes condiciones:
Reconocimiento (Attribution) Debe reconocer los crditos de la obra de la manera
especicada por el autor o el licenciador (pero no de una manera que sugiera que tiene
su apoyo o apoyan el uso que hace de su obra).
No comercial (Non commercial) No puede utilizar esta obra para nes comerciales.
Compartir bajo la misma licencia (Share alike) Si altera o transforma esta obra,
o genera una obra derivada, slo puede distribuir la obra generada bajo una licencia
idntica a sta.
Entendiendo que:
Renuncia Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del
titular de los derechos de autor
Dominio Pblico Cuando la obra o alguno de sus elementos se halle en el dominio
pblico segn la ley vigente aplicable, esta situacin no quedar afectada por la licencia.
Otros derechos Los derechos siguientes no quedan afectados por la licencia de ninguna
manera:
Los derechos derivados de usos legtimos u otras limitaciones reconocidas por ley
no se ven afectados por lo anterior.
Los derechos morales del autor
Derechos que pueden ostentar otras personas sobre la propia obra o su uso, como
por ejemplo derechos de imagen o de privacidad.
Aviso Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la
licencia de esta obra.
ndice general
1. El ordenador y la informacin 5
1.1. El ordenador como sistema de informacin . . . . . . . . . . . . . . . . . . . . . . . 5
1.2. Sistemas de numeracin posicionales . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.1. Concepto de sistema de numeracin posicional . . . . . . . . . . . . . . . . 5
1.2.2. Sistemas de numeracin habituales en informtica . . . . . . . . . . . . . . 6
1.2.3. Conversiones entre distintas bases . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.4. Operaciones lgicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3. Codicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.3.1. Codicaciones de texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3.2. Codicaciones numricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.4. La componente fsica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.1. La arquitectura von Neumann . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.4.2. La unidad central de procesamiento . . . . . . . . . . . . . . . . . . . . . . 16
1.4.3. Los Buses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1.4.4. La memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.4.5. El subsistema de entrada/salida . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4.6. El ciclo mquina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.4.7. Clasicacin de ordenadores . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.5. La componente lgica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.5.1. El sistema operativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.5.2. Lenguajes de programacin y traductores . . . . . . . . . . . . . . . . . . . 23
1.5.3. Las bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2. Algoritmos 29
2.1. Concepto de algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.2. Notaciones algortmicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2.1. Notaciones grcas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2.2. Notaciones textuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.2.3. Notaciones ejecutables en mquina . . . . . . . . . . . . . . . . . . . . . . . 34
2.3. Lenguajes de programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.3.1. Lenguajes vs. traductores . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
2.3.2. Categoras de los lenguajes de programacin . . . . . . . . . . . . . . . . . . 35
2.3.3. Algunos hitos histricos de los lenguajes de programacin . . . . . . . . . . 36
2.4. El ciclo de vida software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
2.4.1. Fase de denicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.4.2. Fase de desarollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.4.3. Fase de mantenimiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3. Introduccin a C/C++ 41
3.1. El preprocesador de C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.2. Palabras reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.3. Literales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.4. Identicadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3
4 ndice general
3.5. Expresiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.6. Tipos predenidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.7. Denicin de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.8. La asignacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
3.9. Bloque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.10. Sentencias de seleccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.11. Sentencias de repeticin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.12. Subprogramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.12.1. Procedimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.12.2. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.12.3. Parmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.13. Tipos denidos por el programador . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
3.13.1. Registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.13.2. Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
3.13.3. Anidamientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
A. Bibliotecas estndares de C/C++ 59
A.1. Bibliotecas de C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
A.1.1. Entrada/salida: <iostream> . . . . . . . . . . . . . . . . . . . . . . . . . . 59
A.1.2. Manejo de cheros: <fstream> . . . . . . . . . . . . . . . . . . . . . . . . 59
A.1.3. Manejo de cadenas de caracteres: <string> . . . . . . . . . . . . . . . . . 60
A.2. Bibliotecas de C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
A.2.1. E/S bsica: <cstdio> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
A.2.2. Manejo de caracteres: <cctype> . . . . . . . . . . . . . . . . . . . . . . . . 61
A.2.3. Manejo de cadenas de caracteres: <cstring> . . . . . . . . . . . . . . . . 61
A.2.4. Utilera estndar: <cstdlib> . . . . . . . . . . . . . . . . . . . . . . . . . 62
A.2.5. Matemtica: <cmath> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Captulo 1
El ordenador y la informacin
1.1. El ordenador como sistema de informacin
Segn la Real Academia Espaola de la Lengua, los conceptos de informtica y ordenador se
denen como:
Informtica. Conjunto de conocimientos cientcos y tcnicos que posibilitan el tratamiento au-
tomtico de la informacin.
Ordenador. Mquina capaz de tratar informacin de forma automtica bajo el control de un
programa.
De hecho, el trmino informtica deriva de la contraccin de la parte inicial de la palabra
inform-acin y la parte nal de la palabra autom-tica.
Desde el punto de vista de un ingeniero, un ordenador puede verse como un sistema abierto
de informacin automtico. Es decir, es un conjunto de elementos interrelacionados (por eso es un
sistema) que interacta con el exterior a travs de una entrada y una salida (por eso es abierto)
cuyo elemento principal es la informacin, y dentro del cual no interviene el ser humano (por eso
es automtico). La entrada a este sistema va a ser informacin en crudo, sin procesar, y la salida
informacin elaborada, ya procesada.
Por otro lado, la informacin dentro de la mquina necesita almacenarse de alguna manera en
una memoria para poder operar con ella.
Los primeros ordenadores, que surgieron en la primera mitad del siglo XX, eran de natura-
leza continua o analgicos, ya que almacenaban y procesaban la informacin mediante circuitos
electrnicos analgicos. Estos circuitos tenan sus limitaciones y no eran muy precisos.
Durante la segunda mitad del siglo XX empezaron a desarrollarse los ordenadores digitales, los
cuales almacenaban y procesaban la informacin mediante circuitos electrnicos discretos. Pronto
se constat que eran ms verstiles y podan alcanzar mayor precisin. No obstante, para que
un ordenador digital sea capaz de tratar la informacin de forma automtica es fundamental
representarla internamente de forma discreta. Para ello se necesita un proceso de codicacin que
convierta la informacin con la que habitualmente trabaja el ser humano en informacin discreta
que pueda ser procesada por la mquina. En los ordenadores actuales, este proceso de codicacin
se basa en el sistema binario, que es el sistema de numeracin que vamos a estudiar.
1.2. Sistemas de numeracin posicionales
1.2.1. Concepto de sistema de numeracin posicional
Sean las siguienes deniciones:
Sistema de numeracin. Sistema de smbolos o cifras que representan cantidades y permite rea-
lizar fcilmente operaciones aritmticas con ellas.
5
6 Sistemas de numeracin posicionales
Nmero. Concatenacin de cifras o dgitos que representan de forma nica una cantidad.
Sistema de numeracin posicional. Sistema de numeracin en el que el valor representado por un
nmero depende de
a) el conjunto de cifras utilizado, y
b) las posiciones de las cifras dentro del nmero.
Hay sistemas de numeracin posicionales como el arbico, en el que las diez cifras que utiliza,
que son los dgitos del 0 al 9, cambian de valor segn la posicin donde se encuentren dentro de
un nmero; y sistemas de numeracin no posicionales como el romano, donde sus cifras I, V, X, L,
C, D y M no cambian de valor, independientemente de la posicin que ocupen dentro del nmero.
Cada sistema de numeracin posicional se caracteriza por un vector de pesos,
. . . p
3
p
2
p
1
p
0
p
1
p
2
p
3
. . .
el cual asocia un factor multiplicativo a cada cifra segn su posicin, siendo la posicin 0 la de
las unidades, las posiciones positivas las de las cifras enteras, y las posiciones negativas las de las
cifras fraccionarias, que estn a la derecha del punto decimal. As, si representamos un nmero
como la cadena de smbolos ...d
3
d
2
d
1
d
0
.d
1
d
2
d
3
..., donde cada d
i
es una cifra o dgito del
nmero, el valor total del nmero es la suma:
. . . p
3
d
3
+ p
2
d
2
+ p
1
d
1
+ p
0
d
0
+ p
1
d
1
+ p
2
d
2
+ p
3
d
3
. . .
Por supuesto, cada dgito d
i
puede ser cualquiera del conjunto de cifras posible y repetirse
dentro del nmero. Y los pesos no aparecen escritos en el nmero.
Para facilitar la realizacin de las operaciones aritmticas con nmeros, es conveniente esta-
blecer vectores de pesos como funcin de una base, un nmero natural cualquiera, de forma cada
peso sea la base elevada a un nmero entero que coincida con su posicin:
. . . b
3
b
2
b
1
b
0
b
1
b
2
b
3
. . .
As, el valor del nmero ser:
. . . b
3
d
3
+ b
2
d
2
+ b
1
d
1
+ b
0
d
0
+ b
1
d
1
+ b
2
d
2
+ b
3
d
3
. . .
Por ejemplo, el nmero 1234.56 en base 10 o decimal, que es la base natural con la aprendemos
aritmtica, se interpreta como:
10
3
1 + 10
2
2 + 10
1
3 + 10
0
4 + 10
1
5 + 10
2
6 = 1000 + 200 + 30 + 4 + 0.5 + 0.06
El nmero de posibles cifras distintas que utiliza cada sistema debe coincidir exactamente con
la base, empleando los dgitos necesarios entre el 0 y el 9. Por ejemplo, en base 4 slo se emplean
las cifras 0, 1, 2 y 3. Si la base es mayor que 10, se emplean tambin las letras necesarias de nuestro
alfabeto, maysculas o minsculas indistintamente. En base 16, por ejemplo, se emplean los 10
dgitos conocidos y las 6 primeras letras del abecedario: a, b, c, d, e y f, tal como muestra
la tabla 1.
Una misma cantidad se podr representar con nmeros distintos en bases distintas. Por ejemplo,
la cantidad 35.5 se puede representar como 35.5 en base 10, como 120.2222... en base 5, o como
100011.1 en base 2. En lo que sigue indicaremos las bases de representacin de un nmero como
un subndice precedido por un parntesis, pudiendo omitirse en el caso del sistema decimal al que
estamos habituados: 35.5
(10
o 35.5, 120.2222
(5
, 100011.1
(2
.
1.2.2. Sistemas de numeracin habituales en informtica
El sistema de numeracin posicional natural utiliza la base 10, por eso se le llama tambin
decimal, pero en informtica es ms habitual el sistema posicional en base 2 o binario
1
, dado que
1
Al dgito binario se le llama bit, procedente de la contraccin del comienzo y nal de su nombre en ingls Binary
digIT.
Captulo 1. El ordenador y la informacin 7
los circuitos electrnicos de los ordenadores digitales utilizan combinaciones de 2 posibles valores
de magnitudes fsicas como voltajes, corrientes o cargas electrnicas. Tambin se utiliza bases que
son potencias exactas de 2, como base 8 u octal, o base 16 o hexadecimal. En las tablas 1 y 2 se
muestran los conjuntos de cifras de estas bases y sus vectores peso.
Base Conjunto de cifras
binaria { 0, 1 }
octal { 0, 1, 2, 3, 4, 5, 6, 7 }
hexadecimal { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f}
Tabla 1: Sistemas de numeracin ms habituales en los ordenadores digitales.
Base Vector de pesos
binaria . . . 2
3
2
2
2
1
2
0
2
1
2
2
2
3
. . .
. . . 8 4 2 1 0.5 0.25 0.125 . . .
octal . . . 8
2
8
1
8
0
8
1
8
2
. . .
. . . 64 8 1 0.125 0.015625 . . .
hexadecimal . . . 16
2
16
1
16
0
16
1
16
2
. . .
. . . 256 16 1 0.0625 0.003900625 . . .
Tabla 2: Vectores de peso basados en el sistema binario.
En la tabla 3 se muestra la representacin de los 17 primeros nmeros en los sistemas de
numeracin posicionales mencionados. Puede observarse que cuanto ms pequea es la base, ms
cifras se necesitan para representar un mismo valor.
Decimal Binario Octal Hexadecimal
0 0000 00 0
1 0001 01 1
2 0010 02 2
3 0011 03 3
4 0100 04 4
5 0101 05 5
6 0110 06 6
7 0111 07 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10
Tabla 3: Representacin de los 17 primeros nmeros naturales en distintas bases.
8 Sistemas de numeracin posicionales
1.2.3. Conversiones entre distintas bases
Conversiones a decimal
Las conversiones de nmeros de cualquier base a base decimal se consigue simplemente apli-
cando la frmula del clculo del valor total vista anteriormente:
V alor =

i=
b
i
d
i
Por ejemplo:
10100.001
(2
= 1 2
4
+0 2
3
+1 2
2
+0 2
1
+0 2
0
+0 2
1
+0 2
2
+1 2
3
= 20.125
C8A7.F
(16
= C 16
3
+ 8 16
2
+ A 16
1
+ 7 16
0
+ F 16
1
= 51367.9375
Conversiones desde decimal
Para convertir un nmero decimal a una base determinada que no sea decimal, se opera de
forma distinta para la parte entera y para la parte fraccionaria. Para la parte entera se realizan
divisiones sucesivas por la base. Partiendo del nmero a convertir como primer dividendo, en cada
iteracin el nuevo dividendo es el cociente de la divisin anterior, el divisor siempre es la base, y
los sucesivos restos que se van obteniendo son los dgitos de derecha a izquierda del nuevo nmero
empezando por las unidades. Por ejemplo, para convertir a base binaria el nmero 74.423 operamos
de la siguiente forma:
74 2
14 37 2
0 17 18 2
1 0 9 2
1 4 2
0 2 2
0 1 2
1 0
1001010
El proceso termina cuando se obtiene el cociente 0, que correspondera a un cero a la izquierda,
lo que, como ocurre en decimal, ya sabemos no hace falta escribir.
La parte fraccionaria se obtiene con multiplicaciones sucesivas por la base. Comenzando por
la parte fraccionaria completa del nmero original, en cada iteracin se multiplica la base por
el resultado de la multiplicacin anterior al cual se le resta la parte entera obtenida, que es la
siguiente cifra fraccionaria de izquierda a derecha del nuevo nmero. Se procede as hasta la
precisin deseada. Por ejemplo, la parte fraccionaria del nmero anterior se obtendra:
0.423 0.846 0.692 0.384 0.768 0.536
x2 x2 x2 x2 x2 x2 . . . .011011
0.846 1.692 1.384 0.768 1.536 1.072
Concatenando las partes entera y fraccionaria obtenemos la representacin del nmero completo
en la nueva base:
1001010.011011...
Como vemos, aunque la parte fraccionaria en una base tenga un nmero nito de dgitos, no
siempre obtenemos el nmero equivalente con una parte fraccionaria nita al pasarla a otra base.
Adems, puede haber una parte peridica o no. Por ejemplo, el nmero 0.2
(10
en binario es el
0.00110011
(2
; y el nmero 0.48
(10
en base 6 es el 0.25140
(6
.
Otras veces, una parte fraccionaria peridica en una determinada base puede producir un
nmero nito de dgitos en otra base, como 1/3, que en base 6 es 0.2
(6
, y sin embargo, en decimal
es 0.3 y en base 4 es 0.1
(4
.
Cuando aparecen nmeros peridicos durante el proceso de conversin, hay que tener en cuenta
equivalencias como 0.9 1, 0.5
(6
1
(6
o 1.5
(6
2
(6
para poder proseguir.
Captulo 1. El ordenador y la informacin 9
Conversiones entre bases no decimales
En general, la conversin entre 2 bases cualesquiera requiere primero la conversin a decimal
utilizando la frmula del valor total. Posteriormente se convierte el nmero decimal obtenido a la
base deseada por el mtodo de las divisiones y multiplicaciones sucesivas explicado. Por ejemplo,
para pasar el nmero 11010.0011
(2
a base 7, se obtendra primero valor decimal 26.1875 y despus
se convertira a 35.12
(7
.
No obstante, existe un mtodo que no necesita prcticamente operaciones aritmticas si se
cumple la condicin de que la base de partida, b
1
, es una potencia exacta de la de destino b
2
, o
viceversa, es decir, si b
1
= b
k
2
o b
2
= b
k
1
, siendo k un nmero natural distinto de cero. En estos
casos, si la base de partida es ms pequea, basta con hacer grupos de k dgitos del nmero
original, por orden y empezando por los ms prximos al punto decimal, para formar en el mismo
orden cada uno de los dgitos del nmero destino. Hay que tener en cuenta que los grupos hay
que completarlos con ceros a la izquierda para la parte entera y con ceros a la derecha para la
fraccionaria.
Si la base de partida es ms grande, se expande cada uno de los dgitos del nmero original
al grupo de k dgitos correspondiente en la base destino. La condicin mencionada anteriormente
garantiza una conversin biunvoca.
Esto ocurre con las bases octal y hexadecimal que son potencias exactas de la binaria, ya
que 8 = 2
3
y 16 = 2
4
. Con lo cual, cada dgito octal se corresponde exactamente con 3 dgitos
binarios, y cada dgito hexadecimal se corresponde exactamente con 4 dgitos binarios. Por ejemplo,
el nmero 2746.16
(8
se puede pasar sin hacer operaciones a base hexadecimal a travs de la
binaria sin ms que expandir cada dgito octal a sus 3 dgitos binarios, lo que nos produce el
nmero 010111100110.001110
2
, y despus agrupar los binarios de 4 en 4 para obtener el nmero
hexadecimal 3E5.38
(16
.
1.2.4. Operaciones lgicas
En informtica tambin son habituales las llamadas operaciones booleanas
2
de la lgica binaria,
las cuales operan con operandos que slo toman 2 posibles valores: falso (0) o verdadero (1).
Una de estas operaciones opera con un solo valor, y el resultado es el complemento del operando,
tal como muestra la tabla 4. Los dems operadores trabajan con 2 operandos. La tabla 5 muestra
sus resultados en funcin de las 4 posibles combinaciones de operandos a la entrada. Obsrvese
que el operador NAND es la negacin del operador AND, y el operador NOR, es la negacin del
operador OR.
Operando NOT
0 1
1 0
Tabla 4: Operador lgico de negacin.
Operando 1 Operando 2 AND OR XOR NAND NOR
0 0 0 0 0 1 1
0 1 0 1 1 1 0
1 0 0 1 1 1 0
1 1 1 1 0 0 0
Tabla 5: Operadores lgicos binarios.
2
En honor al matemtico ingls George Boole, que desarroll la teora de la lgica binaria en el siglo XIX, mucho
antes de emplearse en los ordenadores digitales.
10 Codicacin
1.3. Codicacin
Una codicacin es una correspondencia que representa de forma nica los elementos de un
conjunto mediante los de otro. Por supuesto, debe existir una decodicacin que permita recuperar
los elementos originales a partir de los codicados sin ambigedad. En informtica se necesita
codicar la informacin con la que trabaja el ser humano, bsicamente texto y nmeros, a los
elementos con los que trabaja un ordenador digital, que son los bits.
Puesto que slo existen 2 bits, para codicar n elementos de un conjunto se necesita el siguiente
nmero de bits, m:
m = log
2
|.
Obsrvese que se redondea al entero ms cercano por exceso. Y si tenemos m bits, podemos
codicar hasta el siguiente nmero de elementos:
n = 2
m
.
Por ejemplo, si queremos codicar en binario las vocales, tanto maysculas como minsculas,
necesitamos 4 bits porque son 10 elementos. Una posible codicacin se muestra en la tabla 6.
Vocal cdigo
a 0000
e 0001
i 0010
o 0011
u 0100
A 0101
E 0110
I 0111
O 1000
U 1001
Tabla 6: Ejemplo de codicacin binaria.
Hoy da los ordenadores tienen una gran capacidad de memoria, y adems operan a una gran
velocidad, por lo que suele utilizarse nmeros muy grandes. Para que el uso sea menos engorroso
se emplean conocidos prejos de origen griego. Sin embargo, estos prejos binarios, que deben
representar potencias exactas de 2, tienen un valor ligeramente distinto a los prejos homnimos
convencionales del Sistema Internacional que se han usado tradicionalmente, mostrados en la
tabla 7. Debido a la aproximacin de ambos valores y por abuso del lenguaje, un kilobyte puede
hacer referencia tanto a 1000 bytes como a 1024 bytes.
Prejo Valor binario Valor SI
kilo- 2
10
10
3
mega- 2
20
10
6
giga- 2
30
10
9
tera- 2
40
10
12
peta- 2
50
10
15
exa- 2
60
10
18
Tabla 7: Prejos tradicionales del SI.
Para evitar esta confusin, la norma ISO/IEC 80000 sobre Cantidades y Unidades de 2008,
incorpora los prejos binarios con los nombres que public en 1998 la IEC (International Elec-
trotechnical Commission), y que vemos en la tabla 8. Esta norma recomienda usar estos nuevos
prejos en informtica, segn la cual un kibibyte es un kilobinary byte y equivale a 1024 bytes.
Captulo 1. El ordenador y la informacin 11
Puesto que con la informacin numrica el ordenador debe hacer operaciones y con la textual
no, la codicacin de texto es esencialmente diferente de la codicacin de nmeros. En los epgrafes
siguientes se explican brevemente ambas codicaciones.
Prejo Valor IEC
kibi- 2
10
= 1 024
mebi- 2
20
= 1 048 576
gibi- 2
30
= 1 073 741 824
tebi- 2
40
= 1 099 511 627 776
pebi- 2
50
= 1 125 899 906 842 624
exbi- 2
60
= 1 152 921 504 606 846 976
Tabla 8: Prejos binarios de la IEC.
1.3.1. Codicaciones de texto
El grasmo mnimo que representa informacin legible al ser humano es el carcter. Con los
caracteres se representa toda la informacin textual.
El signicado original de un byte es el nmero de bits necesarios para codicar 1 solo carcter,
si bien, por abuso del lenguaje, se entiende que son 8 bits. Un octeto s son exactamente 8 bits.
En general, un carcter se codica con 1 solo byte, pero con el advenimiento de internet y el
intercambio de informacin entre distintas lenguas, existen codicaciones que utilizan ms de 1
byte para cada carcter para posibilitar la inclusin de un mayor nmero de caracteres.
Existe un problema de portabilidad cuando se desea intercambiar informacin entre ordenadores
de distintos fabricantes si no emplean las mismas codicaciones, ya que una misma serie de bits
se interpretar de forma distinta en los ordenadores de uno u otro fabricante. Para ello, distintas
organizaciones, en las que pueden colaborar diversas instituciones pblicas y privadas nacionales o
internacionales, se encargan de crear estndares que evitan incompatibilidades tanto en el mbito
de la informtica como en otros mbitos totalmente distintos. En Espaa tenemos la AENOR,
Agencia Espaola de NORmalizacin y certicacin, que se encarga de normalizar en distintos
mbitos industriales, incluyendo la informtica. En Estados Unidos est el IEEE, Institute of
Electrical and Electronics Engineers, en el campo de la electricidad y electrnica, y el ANSI,
American National Standards Institute, en mbitos de todo tipo. Y a nivel internacional est la
ISO, International Standard Organization. Cuando una agencia nacional adopta un estndar, si
es de inters internacional, la ISO lo adopta tambin.
Estas organizaciones se han encargado de estandarizar los conjuntos de caracteres que emplean
los ordenadores, y aunque el ideal es tener un solo conjunto de caracteres para todos los ordena-
dores, la realidad es que los distintos estndares que han ido surgiendo han ido amplindose para
incorporar los caracteres de lenguas de todo el mundo. A continuacin mencionamos los conjuntos
estndares que podemos encontrar hoy da.
El conjunto de caracteres ASCII
Norma ISO 646
En 1963 fue estandarizado en Estados Unidos el ASCII, American Standard Code for Informa-
tion Interchange, conjunto de caracteres de 7 bits con 128 caracteres. Es el ms antiguo y el factor
comn de todos los conjuntos que hoy da se utilizan. Lo ms destacado de l es que los dgitos
estn ordenados por su valor nu merico y son consecutivos, al igual que las letras, lo que permite
una fcil ordenacin alfabtica. Se distinguen los siguientes tipos de caracteres:
Alfabticos. Son las 26 letras del alfabeto latino internacional moderno, que no incluye la letra ee
del alfabeto espaol. Son en total 52 caracteres porque contiene tanto las letras maysculas
como las minsculas.
12 Codicacin
Numricos. Son los 10 dgitos arbicos del 0 al 9.
Alfanumricos. Son todos los caracteres alfabticos y numricos.
Especiales. Son 34 caracteres bsicos de puntuacin, aritmticos, monetarios y acentuacin.
De control. Son los 31 primeros caracteres ms el ltimo, no imprimibles, que pueden utilizarse
como comandos.
La tabla 9 muestra el conjunto completo. En dicha tabla, el cdigo numrico en hexadecimal
de cada carcter se obtiene concatenando el dgito de la cabecera de su columna con el dgito de
su la en ese orden. Por ejemplo, el cdigo de la t es 74
(16
, que en binario es el 1110100 y en
decimal el 116.
0 1 2 3 4 5 6 7
0 <NUL> <DLE> <SP> 0 @ P ` p
1 <SOH> <DC1> ! 1 A Q a q
2 <STX> <DC2> " 2 B R b r
3 <ETX> <DC3> # 3 C S c s
4 <EOT> <DC4> $ 4 D T d t
5 <ENQ> <NAK> % 5 E U e u
6 <ACK> <SYN> & 6 F V f v
7 <BEL> <ETB> ' 7 G W g w
8 <BS> <CAN> ( 8 H X h x
9 <HT> <EM> ) 9 I Y i y
A <LF> <SUB>
*
: J Z j z
B <VT> <ESC> + ; K [ k {
C <FF> <FS> , < L \ l |
D <CR> <GS> - = M ] m }
E <SO> <RS> . > N ^ n ~
F <SI> <US> / ? O _ o <DEL>
Tabla 9: Tabla ASCII.
El cdigo numrico de los dgitos se obtiene sumando 48 al valor numrico de cada uno, de
forma que el cdigo 48 es el del carcter 0, y el 57 el del 9.
Adems del carcter escape, cuyo cdigo es el 27 en decimal, entre los caracteres de control
destacan los indicados en la tabla 10, los cuales se representan por las llamadas secuencias de
escape en algunos lenguajes de programacin como C/C++.
Hex. Dec. Secuencia escape Nombre
07 7 \a alarma (alarm, bell )
08 8 \b retroceso (backspace)
09 9 \t tabulador (tabulator)
0A 10 \n avance de lnea (line feed)
0B 11 \v tabulador vertical (vertical tabulator)
0C 12 \f avance de pgina (form feed)
0D 13 \r retorno de carro (carriage return)
Tabla 10: Secuencias de escape de C/C++.
Para el idioma espaol presenta la deciencia de que no dispone de vocales acentuadas ni de
la letra ee, carencia que resuelven los conjuntos ASCII extendidos.
Captulo 1. El ordenador y la informacin 13
Los conjuntos de caracteres ASCII extendidos
Normas ISO-8859-n
3
Los conjuntos ASCII extendidos amplan en un bit la representacin de los caracteres, por lo que
hay espacio para un total de 256 caracteres, correspondiendo los 128 primeros a su representacin
ASCII original.
En Espaa y otros pases de Europa Occidental utilizamos el llamado conjunto latino-1, que
corresponde al estndar ISO-8859-1. Contiene todas las letras acentuadas del espaol y francs, as
como la letra ee, tanto mayscula como minscula. Tambin incluye smbolos del gallego, cataln,
italiano, noruego, ns, portugus, sueco, irlands, holands, ingls, dans, islands y albans. No
obstante, faltan algunos caracteres para algunos idiomas como el islands.
Tambin destacamos el latino-9 o estndar ISO-8895-15, que incluye el smbolo del euro y
algunos del francs y ns no presentes en el latino-1.
Existen hasta 16 conjuntos extendidos, la mayora de lenguas habladas en Europa.
El Conjunto de Caracteres Universal: UCS y UTF
Norma ISO-10646
Con el advenimiento de Internet y el intercambio de informacin con pases remotos se hizo
necesario ampliar estos conjuntos de caracteres para incluir los extenssimos alfabetos orientales
como el chino o el japons. Por ello, el consorcio Unicode, formado por grandes empresas y otras
instituciones acadmicas, trabaj con la ISO para ampliar el nmero de bits a 16, dando lugar
a los 65356 caracteres del UCS-2 (Universal Character Set). Los 256 primeros coinciden con el
latino-1 y todos los caracteres se codican por tanto en 2 bytes.
No obstante, algunas secuencias de 2 bytes, como la secuencia \0, tienen un signicado especial
en algunos sistemas operativos como Unix o lenguajes como C, por lo que el UCS-2 no es apropiado
para codicar nombres de cheros, variables de entorno o cheros de texto. Por ello, dentro de la
misma norma, Unicode junto con la ISO han ideado varias formas distintas de codicacin que
evita estos problemas empleando un nmero variable de bytes. Son los conjuntos UTF (Unicode
Transformation Format):
UTF-8. Es multibyte de 1 a 4 caracteres. Se emplea para el correo electrnico y para las pginas
web. Sus 256 primeros cdigos coinciden con el ASCII y el latino-1.
UTF-16. Es mutipalabra de 1 o 2 palabras de 16 bits, de forma que cada carcter ocupa 2 o 4
bytes.
UTF-32. Utiliza siempre 4 bytes para cada carcter. Es el ms sencillo, aunque el que ocupa ms
espacio.
1.3.2. Codicaciones numricas
Los ordenadores codican los nmeros de una forma ms eciente y adecuada para la realizacin
de operaciones aritmticas. Por supuesto, cuanto mayor es el nmero de bits utilizado para codicar
un nmero, mayor es la precisin. Este nmero de bits suele ser un mltiplo de 8. Todas ellas se
basan en el sistema de numeracin binario.
Tngase en cuenta, no obstante, que al operar nmeros con un nmero jo de bits, siempre se
pueden producir desbordes, por ejemplo, cuando el resultado es mayor que el que puede almacenar
ese nmero de bits, o cuando se produce un resultado negativo al operar con nmeros naturales.
Nmeros naturales
Los nmeros naturales son fciles de operar en circuitos porque no tienen signo, y por eso se
codican simplemente en binario puro. En un octeto se codican 256 valores positivos.
3
Cada norma sustituye la n por su nmero correspondiente.
14 Codicacin
Nmeros enteros
Debido a la necesidad de almacenar y operar con el signo, los nmeros enteros se pueden
codicar de varias formas:
Signo-magnitud. Se reserva un bit para el signo que tiene que operarse por separado. El cero tiene
entonces una doble representacin y en un octeto se codican 255 valores enteros.
Complemento restringido a la base o complemento a 1. Este formato s permite operar el signo
conjuntamente con la magnitud, aunque el cero tambin tiene una doble representacin y en
un octeto se codican tambin 255 valores enteros.
Complemento a la base o complemento a 2. Este formato tambin permite operar signo y magnitud
conjuntamente y adems no tiene una doble representacin del 0, por lo que es el ms
utilizado para nmeros enteros. En un octeto se codican 256 valores enteros.
Exceso a 2
n1
. Esta codicacin suma el exceso a la representacin binaria de los nmeros. Es
adecuada para almacenar exponentes enteros de nmeros reales en coma otante. En exceso
a 127, que ocupa un octeto, se codican 256 valores enteros.
En la tabla 11 vemos cmo se codica enteros con 4 bits en las representaciones mencionadads.
Decimal Binario Sig-Magn. Comp. a 1 Comp. a 2 Exceso a 7
+8 1000 n.a. n.a. n.a. 1111
+7 0111 0111 0111 0111 1110
+6 0110 0110 0110 0110 1101
+5 0101 0101 0101 0101 1100
+4 0100 0100 0100 0100 1011
+3 0011 0011 0011 0011 1010
+2 0010 0010 0010 0010 1001
+1 0001 0001 0001 0001 1000
0 0000 0000 0000 0000 0111
1000 1111
-1 n.a. 1001 1110 1111 0110
-2 n.a. 1010 1101 1110 0101
-3 n.a. 1011 1100 1101 0100
-4 n.a. 1100 1011 1100 0011
-5 n.a. 1101 1010 1011 0010
-6 n.a. 1110 1001 1010 0001
-7 n.a. 1111 1000 1001 0000
-8 n.a. n.a. n.a. 1000 n.a.
Tabla 11: Diversas codicaciones de enteros con 4 bits.
Nmeros reales
Los nmeros reales se pueden almacenar de 2 formas bsicas:
Coma Fija. Almacenan la parte entera y fraccionaria como nmeros enteros separados con un
nmero jo de bits. El signo va en otro bit. La precisin es ja, por lo que es limitada para
nmeros muy grandes o nmeros muy pequeos. Por ejemplo, si disponemos de 8 cifras para
cada parte, los nmeros decimales 1286000.0 y -0.0000034455 (en binario sera algo similar)
se almacenaran:
Captulo 1. El ordenador y la informacin 15
s parte entera parte fraccionaria
0 0 1 2 8 6 0 0 0 . 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 . 0 0 0 0 0 3 4 4
En el segundo caso se pierde precisin y adems se desaprovechan bits.
Coma Flotante. Almacena los bits ms signicativos
4
en la mantisa, y un exponente almacena
la posicin de esos bits dentro del nmero con respecto al punto decimal, de forma que la
parte signicativa puede otar, permitiendo una precisin variable sin desaprovechar los bits
disponibles. En otros 2 bits se almacenan los signos de la magnitud y el exponente. El signo
de la exponente indica si las cifras otan a la izquierda o a la derecha. Este formato se
normaliza para que, despus de otar, la primera cifra signicativa quede a la derecha del
punto decimal, sin parte entera.
Por ejemplo, los mismos nmeros anteriores se pueden escribir como 0.1286 10
7
y 0.34455
10
5
y se almacenaran:
s mantisa s exponente
0 1 2 8 6 0 0 0 0 0 0 0 7
1 3 4 4 5 5 0 0 0 1 0 0 5
En este formato no hace falta almacenar la parte entera, que siempre ser 0, ni la base del
exponente, que en estos ejemplos siempre es 10. En binario el exponente sera 2, la mantisa
y su signo se almacenan en complemento a 1 o complemente a 2, y el exponente y su signo
en exceso de un nmero.
1.4. La componente fsica
Un ordenador consta bsicamente de una componente fsica o hardware, y una componente
lgica o software, y necesita ambas para poder funcionar. El hardware son los elementos tangibles
del ordenador: la placa base, los cables, las tarjetas... Y el software son las instrucciones y datos
que hacen funcionar el ordenador.
Hoy da, en mayor o menor medida, la componente fsica de la mayora de los ordenadores
digitales tiene un diseo basado en la llamada arquitectura von Neumann
5
, la cual describimos en
los epgrafes siguientes.
1.4.1. La arquitectura von Neumann
La arquitectura von Neumann surgi en 1945 a raz del trabajo de John von Neumann y su
equipo tras la experiencia de la construccin de la ENIAC, que fue el primer computador de
propsito general totalmente electrnico. John von Neumann plasm su aportacin en su famoso
y controvertido borrador First Draft of a Report on the EDVAC
6
.
Una de las caractersticas que segua la arquitectura von Neumann era la divisin de la com-
ponente fsica de la mquina en las siguientes unidades funcionales:
La unidad de procesamiento, que constaba de una unidad de control que diriga el procesamiento,
y una unidad aritmtico-lgica que realizaba los clculos.
4
Los primeros que son distintos de 0 por la izquierda.
5
John von Neumann ha sido uno de los mayores matemticos del siglo XX. De origen hngaro-estadounidense,
realiz importantes aportaciones en fsica cuntica, diversos campos de las matemticas, en informtica e incluso
en economa.
6
Al parecer no incluy al resto de su equipo entre los autores porque no manejaban el lenguaje de la lgica formal
que von Neumann s dominaba, y adems, su publicacin prematura impidi patentar el diseo de la EDVAC que
pretenda ser la primera mquina construida con este diseo. Fue la mquina EDSAC de Maurice Wilkes, de la
Universidad inglesa de Cambridge, la primera construida con esta arquitectura.
16 La componente fsica
La memoria, donde se almacena la informacin.
Las unidades de entrada/salida, que posibilitan la comunicacin de la unidad de procesamiento
con el exterior.
No obstante, ya en 1835 el diseo de la mquina analtica del ingls Charles Babbage
7
ya segua
esta divisin funcional, con dispositivos de entrada basados en tarjetas perforadas, un procesador
aritmtico, una unidad de control que determinaba la tarea que deba ser realizada, un mecanismo
de salida y una memoria para almacenar los nmeros.
Otra de las caractersticas de la arquitectura von Neumann fue la utilizacin de la lgica binaria,
cuya teora fue desarrollada durante el siglo pasado por el matemtico ingls George Boole. Hasta
ese momento, todos los ordenadores de la poca utilizaban todava el sistema decimal.
La principal aportacin de la arquitectura von Neumann fue el concepto de programa alma-
cenado, por el cual tanto las instrucciones como los datos se almacenan en la misma memoria
8
Hasta ese momento, en la memoria de los ordenadores slo se guardaban los datos, mientras que
las instrucciones formaban parte de otra unidad estructural de la mquina, la cual estaba funda-
mentalmente cableada. El nuevo diseo permita al ordenador cambiar fcilmente de programa sin
tener que recablearlo fsicamente.
1.4.2. La unidad central de procesamiento
Hoy da los ordenadores disponen de una unidad central de procesamiento o CPU (Central
Processing Unit) o simplemente procesador con las siguientes partes:
La unidad de control es la circuitera encargada de decodicar la instruccin que viene de memoria
y sincronizar todas las operaciones de la mquina. Esta sincronizacin se apoya en los pulsos
de un reloj, enviando las seales electrnicas en los instantes adecuados para que el resto de
las unidades funcionen correctamente de forma conjunta.
La unidad aritmtico-lgica o ALU (Arithmetic-Logic Unit) son los circuitos electrnicos que
realizan en binario tanto las operaciones bsicas aritmticas como las lgicas. Las primeras
permiten sumar, restar, multiplicar y dividir nmeros, tanto enteros como reales, y produ-
cirn resultados numricos. Las segundas permiten comparar valores y producen siempre
como resultado el valor lgico verdadero o el valor lgico falso.
Los registros son almacenes temporales muy rpidos de datos e instrucciones, algunos de los cuales
son crticos para que el procesador funcione a altas velocidades. Cada registro contiene un
solo dato. Uno de ellos es el contador de programa, que contiene la posicin en memoria de
la siguiente instruccin a ejecutarse. Otro es el acumulador, que contiene el resultado de la
ltima operacin efectuada por la unidad aritmtico-lgica. El ltimo registro a destacar es
el registro de estado, que indica diversas condiciones que se dan despus de las operaciones
realizadas por la ALU: desbordes, divisin por cero, resultado cero, resultado negativo...
Cada una de estas condiciones se indica activando el correspondiente bit o indicador de este
registro o palabra de estado.
Cuando las tres partes de la CPU se construyen en un solo circuito integrado o chip, tenemos
un microprocesador, que es el diseo habitual de los ordenadores personales. El rendimiento de un
microprocesador viene determinado por:
a) la velocidad del reloj,
7
Charles Babbage fue un matemtico y cientco ingls del siglo XIX adelantado a su tiempo que ide la primera
computadora programable totalmente mecnica, la Mquina Analtica, y que no pudo construir por las deciencias
tecnolgicas de su poca.
8
Curiosamente, en 1936 la hipottica mquina universal de Turing. inclua una memoria ideal donde se alma-
ceban conjuntamente datos e instrucciones. Alan M. Turing fue un matemtico, informtico terico y lsfo ingls
de mediados del siglo XX. Se le considera el padre de la informtica moderna y en su honor se entrega cada ao
el Premio Turing, equivalente al Premio Nobel en el mundo de la informtica.
Captulo 1. El ordenador y la informacin 17
b) el repertorio de instrucciones, y
c) la longitud de palabra bsica de los datos que procesa.
No obstante, diseos ms avanzados como el paralelismo inuyen notablemente en el rendi-
miento de los procesadores.
En cuanto al repertorio de instrucciones de un procesador, podemos distinguir 3 categoras de
instrucciones:
Instrucciones de tratamiento de la informacin. Pueden ser lgicas, que siempre producen como
resultado uno de los valores lgicos verdadero o falso; o aritmticas, que producen como
resultado un valor del mismo tipo que sus operandos. Las instrucciones lgicas son las de
comparacin del orden de valores: <, >, , , e igualdad: = y ,=; y las de combinacin
binaria: AND, OR y NOT. Las aritmticas son las bsicas que operan con nmeros enteros
y reales: suma, resta, multiplicacin y divisin.
Instrucciones de transferencia de datos. Son las que se encargan de transferir datos entre la CPU
y la memoria principal, o entre distintas posiciones de la memoria principal.
Instrucciones de ujo de control o de salto. Son las encargadas de alterar el ujo secuencial
natural de las instrucciones que ejecuta el procesador. Mientras no se ejecute ningn salto,
simplemente se ejecuta la siguiente instruccin en memoria. Esta capacidad de decidir qu se
hace a continuacin de forma automtica es la que diferencia un ordenador de una calculadora
convencional no programable. A nivel de hardware, se basa en los indicadores de la palabra
de estado del procesador, los cuales, al valer 1 o 0, verdadero o falso, permiten decidir si se
ejecuta un determinado bloque de instrucciones o no.
1.4.3. Los Buses
Las seales que se envan entre la CPU y el resto de la mquina viajan fsicamente por conjuntos
de cables llamados buses. En general, los buses pueden ser de dos tipos segn viaje la informacin
en el tiempo:
Seriales, de un solo cable o canal, donde los bits viajan secuencialmente uno tras otro. Los
dispositivos USB
9
se conectan a un ordenador a travs de un bus serie.
Paralelos, de una cierta anchura compatible con la longitud de palabra del ordenador, y donde
los bits viajan en paralelo en grupos de bytes o mltiplos de stos. Por esta razn son buses
ms rpidos que los seriales. Los controladores de disco duro se conectan al sistema a travs
de un bus paralelo.
Por otro lado, el bus principal, llamado bus del sistema, es paralelo y conecta la CPU con el
resto de unidades funcionales del sistema. Se divide en 3 sub-buses segn la informacin que viaja
por ellos:
Bus de control. Transmite las seales que emite la unidad de control para dirigir al resto de
unidades funcionales. Es unidireccional porque slo la CPU pone informacin en l.
Bus de datos. En este sub-bus la CPU pone los datos que se llevan al exterior de la unidad. Se
dice que se escriben. Y a travs de l la CPU tambin recibe los datos desde el exterior.
Se dice entonces que se leen. Es un bus bidireccional porque la CPU acta como emisor o
receptor del dato con respecto al resto de unidades funcionales del sistema.
Bus de direcciones. En este sub-bus es de nuevo la CPU la que pone las posiciones de memoria
adecuadas para leer o escribir datos o instrucciones en la memoria principal. Es unidireccio-
nal, siempre es la CPU la que pone las direcciones.
9
Universal Serial Bus.
18 La componente fsica
1.4.4. La memoria
Desde el punto de vista funcional, los ordenadores actuales tienen 2 tipos de memorias:
La memoria principal, de tecnologa electrnica, es la memoria que se conecta a la CPU y con la
que trabaja directamente por ser lo sucientemente rpida. Pero es costosa y en general es
voltil, por lo que se pierde su contenido cuando falta la alimentacin elctrica, salvo algunos
tipos de memorias de solo-lectura (ver ms adelante).
El acceso al contenido de la memoria principal es aleatorio, por lo que tambin se le llama
RAM (Random Access Memory), lo que signica que se puede acceder a cualquiera de sus
posiciones directamente a la misma velocidad.
La memoria secundaria tiene las dos grandes ventajas de tener una gran capacidad de almace-
namiento
10
a bajo coste, y ser permanente, por lo que sus datos no se pierden, aunque se
corte la alimentacin elctrica. Pero tiene el problema de la baja velocidad a la que funciona
comparada con la velocidad de funcionamiento de la CPU, ya que suelen construirse con tec-
nologas ms lentas y diferentes a la de sta. Por esta misma razn, la memoria secundaria
necesariamente se conecta a la CPU a travs de una circuitera adicional que sirve de interfaz
entre la tecnologa de la memoria y la tecnologa electrnica de la CPU. A esta circuitera se
le llama controlador. Por esta limitacin, a la memoria secundaria se la considera ms bien
un dispositivo de entrada/salida.
Organizacin funcional de la memoria principal
La visin funcional que la CPU tiene de la memoria principal es una simple sucesin de posi-
ciones consecutivas. En cada posicin se guarda un dato o palabra y todas las palabras son de la
misma anchura, es decir, tienen el mismo nmero de bits. A este nmero de bits se le conoce como
palabra de datos y debe coincidir con la anchura bsica de datos con la que trabaja la CPU, que
a su vez, debe coincidir con la anchura en bits del sub-bus de datos del sistema.
Cada posicin se identica por una direccin de memoria, que bsicamente es el nmero de
orden que ocupa. Al conjunto de todas las direcciones se le llama mapa de memoria. Puesto que
la direccin de memoria es un nmero natural con una longitud ja de bits, este nmero de bits
determina la capacidad de la memoria, de forma que una direccin de n bits podrn direccionar
2
n
posiciones de memoria. Por ejemplo, una memoria de 32 mega-palabras necesita direcciones
de 4 bytes (32 bits). Por esta razn, la anchura del sub-bus de direcciones de la CPU determina
la capacidad de la memoria que se puede conectar a ella. Un bus de direcciones de 32 bits, por
ejemplo, determina que el nmero mximo de palabras que puede direccionar la CPU sea 2
32
.
Obviamente, la longitud de palabra de la memoria y la anchura de las direcciones de memoria
pueden ser distintas, ya que una cosa es la anchura en bits de una posicin, y otra distinta es el
nmero total de posiciones de la memoria. Esto es equivalente a decir que la anchura del sub-bus
de datos no tiene que coincidir con la anchura del sub-bus de direcciones del bus del sistema.
En los procesadores actuales una parte de la memoria principal se copia repetida en una
memoria fsicamente ms rpida, ms prxima a la CPU, que se llama memoria cach. Aunque los
bloques de memoria que va a necesitar la CPU durante ejecucin de un programa a priori no se
conocen porque dependen de la evolucin de los clculos, los bloques de datos que se copian en la
cach se eligen de forma que sean los ms probables, evitando as los accesos lentos a la memoria
convencional. Si se modica los datos de la cach, tambin debe actualizarse la copia que hay en la
memoria convencional. Cuando los datos que necesita la CPU no estn en la cach, sencillamente
se accede a la memoria convencional, que por supuesto contiene todos los datos, y se actualiza la
memoria cach con nuevos contenidos.
Hoy da todos los microprocesadores tienen memorias cach de diferentes tamaos, incluso a
varios niveles de velocidad, de forma que una memoria cach de nivel superior funciona como
memoria cach de otra de nivel inferior.
10
Por eso tambin se le llama memoria masiva.
Captulo 1. El ordenador y la informacin 19
Tipos de memorias
Desde el punto de vista fsico, el mapa de memoria lgico del procesador puede repartirse entre
distintos tipos de memorias fsicas siempre y cuando las direcciones lgicas de cada bloque de
memoria fsica no se solapen con las de los dems bloques. Incluso parte del mapa de memoria
lgico podra quedarse inutilizado, de forma que la mquina tuviera menos memoria real que la
que puede direccionar el procesador.
Las memorias que se pueden conectar al bus del sistema, y que por tanto pueden funcionar
como memoria principal, pueden clasicarse segn varios criterios. La divisin ms importante es:
Memorias de solo-lectura o ROM (Read Only Memory). Son memorias cuyo contenido no se puede
borrar, ni siquiera cuando se corta la alimentacin elctrica, por lo que no son voltiles. Suelen
utilizarse para almacenar programas crticos de inicializacin del ordenador, la BIOS (Basic
Input-Output System), y su contenido viene preestablecido de fbrica
11
. A su vez las hay de
distintos tipos segn sus caractersticas tecnolgicas, algunas de las cuales pueden borrarse
en fbrica y reutilizarse.
Memorias de escritura/lectura. Sobre ellas la CPU puede sobreescribir datos, borrando los an-
teriores. Tambin las hay de diversas tecnologas, con coste y velocidades distintas unas de
otras. Por abuso del lenguaje, tambin se les conoce como memorias RAM, aunque hay que
saber que las memorias ROM tambin son de acceso aleatorio.
1.4.5. El subsistema de entrada/salida
Este subsistema est formado por todos los dispositivos externos al procesador, formando parte
de la llamada periferia
12
, los cuales suelen ser de tecnologas muy diferentes entre s. Por esta razn,
todos necesitan circuitera ms o menos compleja que sirva de interfaz entre estas tecnologas y
la naturaleza electrnica propia del procesador. Esta circuitera es el controlador de dispositivo y
siempre se conecta al bus del sistema. Cada controlador puede manejar varios dispositivos, pero
todos ellos deben ser del mismo tipo.
Al procesador se puede conectar multitud de dispositivos, algunos imprescindibles, como el
teclado o el disco duro, otros habituales como el ratn o la impresora, y otros menos habituales
como sensores de calor o robots. Algunos dispositivos incluyen el controlador como parte de l,
como los discos duros, y otros no, como los monitores, que necesitan las conocidas tarjetas grcas.
Hay incluso otros en los que el dispositivo es el propio controlador, como las unidades de CDs o
DVDs. A pesar de su variedad, los dispositivos pueden clasicarse en 3 grandes grupos:
De entrada. La informacin viaja desde el exterior a la CPU. Ejemplos son el teclado, el ratn,
el micrfono, el joystick, la cmara, los lectores de cdigo de barras, los lpices pticos, los
escneres 2D y 3D...
De salida. La informacin viaja desde la CPU al exterior. Ejemplos son el monitor, los caones
de proyeccin, la impresora, los gracadores o plotters, los altavoces...
De entrada-salida. La informacin puede viajar de la CPU al exterior o al revs. Ejemplos son los
discos duros, las unidades de discos pticos, los dispositivos de memoria USB, los modems,
los routers...
1.4.6. El ciclo mquina
El ciclo mquina es la sucesin de todas las operaciones electrnicas necesarias para ejecutar
una instruccin del procesador, todo ello sincronizado por los pulsos del reloj del sistema. En
cada pulso la unidad de control de la CPU activa o desactiva las lneas pertinentes del sub-bus de
control del sistema, cada una de las cuales se corresponde con una seal de control.
11
Razn por la cual tambin se las conoce como rmware (en ingls rm es una empresa).
12
Por eso tambin se les llama perifricos.
20 La componente fsica
Cada tipo de instruccin tiene un ciclo mquina distinto, de manera que unas tardan ms que
otras. Todas las instrucciones constan de varias fases, algunas de ellas son comunes a todas. Una
instruccin tpica de tratamiento suele tener las siguientes fases:
Fase de bsqueda de la instruccin o fetching. Es la fase en la que se trae de la memoria a la CPU
la siguiente instruccin a ejecutar. La direccin de sta la conoce la CPU porque est en el
contador de programa, y la pone en el sub-bus de direcciones. La instruccin, que incluye
un cdigo de operacin propio de cada tipo de instruccin, entonces viaja por el sub-bus de
datos hasta la unidad de control.
Fase de decodicacin. Una vez en la unidad de control del procesador, se decodica el cdigo
de operacin de la instruccin para saber qu operacin hay que realizar. Es una fase muy
rpida porque se desarrolla totalmente dentro de la CPU, sin accesos a memoria.
Fase de bsqueda de operandos. Los operandos de la instruccin no suelen incluirse en la misma
posicin de memoria que el cdigo de operacin, por lo que cuando se necesitan, se realizan
nuevos accesos a memoria para traerlos a la CPU. La CPU, tras decodicar la instruccin,
ya sabe dnde buscarlos y pone las direcciones de memoria en el sub-bus correspondiente,
y los operandos son puestos despus por los circuitos de la memoria en el sub-bus de datos.
Suele ser una fase lenta en comparacin con las fases que no acceden al exterior de la CPU.
Fase de ejecucin. Una vez colocados los operandos en los registros adecuados de la CPU, la
instruccin se ejecuta dentro de sta, interviniendo la unidad aritmtico-lgica y activndose
despus los bits pertinentes del registro de estado, como por ejemplo, el de desborde o el de
resultado negativo.
Fase de almacenamiento de resultados. Despus de que la ALU deje el resultado en el acumulador,
y activados los indicadores del registro de estado, se puede necesitar nuevos accesos a memoria
para guardar los resultados.
Despus de ejecutarse cada instruccin vuelve a ejecutarse repetitivamente el fetching de la
siguiente instruccin.
Las instrucciones de control de ujo no incluyen tantos accesos a memoria y lo fundamental
que hacen es cambiar el contenido del contador de programa, alterando as la direccin de memoria
donde se buscar la siguiente instruccin a ejecutar.
1.4.7. Clasicacin de ordenadores
Hoy da existen muchos tipos de ordenadores y se pueden clasicar segn muchos criterios. Un
primer criterio puede ser segn su propsito:
Ordenadores de propsito general. Pueden ejecutar distintos programas de muy diversa ndole. De
este tipo son los ordenadores personales o los grandes ordenadores. Cuando un ordenador
de propsito general se dedica a una sola funcin tenemos los llamados servidores, muy
utilizados en internet.
Ordenadores de propsito especco. Suelen ir empotrados en otros aparatos y siempre ejecutan
el mismo programa. Ejemplos son los ordenadores que incluyen hoy da los coches o diversos
electrodomsticos.
Otro criterio ms habitual es la potencia, la cual viene determinada por la longitud de la
palabra, el repertorio de instrucciones del procesador, la velocidad del reloj, la cantidad de memoria
que puede direccionar el procesador, o el grado de paralelismo que incluye su arquitectura. Este
criterio suele estar ligado a su coste comercial. A nivel de fabricacin tambin est ligado al nmero
de transistores que incluye el procesador. Nosotros vamos a distinguir:
Dispositivos mviles. Son los ms baratos y de menor potencia, y el usario suele llevarlo encima.
Originalmente se usaban slo para telefona, pero actualmente incluyen acceso a internet,
correo-e, videojuegos, agendas... y se pueden considerar ordenadores como tales.
Captulo 1. El ordenador y la informacin 21
Ordenadores personales. Pueden ser muy potentes, segn el procesador o la cantidad de memoria
de que disponga. Aunque los tradicionales son de sobremesa, hoy da proliferan los porttiles.
Estaciones de trabajo. Son ordenadores con procesadores ms avanzados, ms rpidos, ms me-
moria o con varios procesadores que funcionan en paralelo.
Supercomputadores. Son los ms caros, con procesadores muy rpidos y complejos, con alto grado
de paralelismo, mucha memoria, y longitudes de palabra ms grandes.
Esta ltima clasicacin es muy variable por la continua y rpida evolucin de la ingenie-
ra informtica y el descenso continuo de los costes de fabricacin. De hecho, en 1965 un fsico
americano, Gordon E. Moore, enunci su famosa Ley de Moore:
Cada 18 meses aproximadamente, la potencia (nmero de transistores) de los ordena-
dores se duplicar.
Y as ha sido hasta nuestros das, en los albores del siglo XXI.
1.5. La componente lgica
Es imposible que un ordenador sirva de algo si no est ejecutando algn programa. Tan im-
portante como la componente fsica de un ordenador es su componente lgica. La componente
lgica son los programas y datos que procesa un ordenador, algo intangible y difcil de organi-
zar. No obstante, el software de un ordenador se organiza en capas, de forma similar a las capas
concntricas de una cebolla. A nivel del software de un ordenador, esto puede interpretarse como
que el software de una capa utiliza solamente las capas interiores, dando servicio a las capas ms
externas. Esto evita tener que reprogramar tareas que se necesitan una y otra vez, y se aumenta
as la abilidad del sistema disminuyendo las probabilidades de fallo.
La capa ms interna lgicamente no puede utilizar otras capas y debe tratar directamente con
el hardware. Esta capa de software, prcticamente imprescindible, es el sistema operativo, y es
independiente de cualquier otro tipo de software.
Por encima del sistema operativo, se sita lo que se llama el software de sistemas, que son
programas habituales en todos los ordenadores y ayudan al usuario, junto con el sistema operativo,
a realizar tareas engorrosas y difciles, pero habituales al utilizar un ordenador. Ejemplos son los
siguientes:
Traductores, necesarios para codicar los programas en instrucciones binarias del procesador.
Bibliotecas de programacin estndares.
Programas de comunicaciones.
Programas de seguridad como antivirus o cortafuegos.
Finalmente, tenemos el software de usuario o de aplicacin, que es el que realmente hace el
trabajo que el usuario desea. Obviamente, el software de aplicacin puede hacer uso del software
de sistemas, pero no al revs. Existe una gran diversidad de software de aplicacin, como por
ejemplo:
Software de gestin, que resuelve problemas de contabilidad, facturacin, reservas, nminas...
Software matemtico, tanto numrico como simblico.
Software de ingeniera, til en el diseo (CAD), en la fabricacin (CAE), en la robtica...
Sistemas expertos, habituales en medicina.
Sofware de visualizacin cientca, utilizado para interpretar cantidades masivas de datos
de todo tipo.
Software domstico como los navegadores, la omtica o el correo electrnico.
22 La componente lgica
1.5.1. El sistema operativo
Necesidad del sistema operativo
El sistema operativo es el software de sistemas principal. Sin l tendramos que programarnos
cada mnima tarea que necesitramos para operar con el hardware, como por ejemplo leer un
bloque de datos de un sector del disco duro para llevarlo a la memoria principal, enviar cada
carcter que tecleemos a la pantalla, o cambiar el contador de programa para cambiar de un
programa a otro. Estas tareas para el usuario habitual, adems de resultar complejas, requieren
una gran abilidad. Adems son tareas que se necesita realizar continuamente. Por eso nacieron
en los aos 50 y 60 los primeros sistemas operativos.
Los primeros sistemas operativos simplemente lanzaban la ejecucin de un programa una vez
que terminaba el anterior. Los programas se encolaban secuencialmente y se procesaban por lotes.
Ms tarde, a nales de los aos 60, se aprovechaban los tiempos de espera de la entrada/salida
de algunos programas para que la CPU, que era mucho ms rpida, ejecutara otros programas
durante esa espera. Eran los sistemas operativos con multiprogramacin. A continuacin, la multi-
programacin deriv en los sistemas operativos multitarea, con los cuales la CPU poda fcilmente
cambiar la ejecucin de programa a otro sin necesidad de esperar a ninguna operacin de entra-
da/salida.
El diseo de los sistemas operativos no ha parado de evolucionar, surgiendo conceptos avan-
zados como el tiempo compartido, el tiempo real, la paginacin y segmentacin de la memoria, los
sistemas operativos en red o los sistemas operativos distribuidos.
Hoy da, los sistemas operativos son grandes y complejos, por lo que no residen completamente
en la memoria principal, sino que se componen de distintas partes o mdulos que estn en disco
y se cargan en memoria segn se necesitan. No obstante, hay una parte que se carga al arrancar
el ordenador y siempre reside en memoria principal: el ncleo o kernel.
Funciones del sistema operativo
La funcin principal de un sistema operativo es hacer eciente el uso de los recursos del
ordenador. Estos recursos fundamentalmente son:
a) El tiempo de CPU. Existe una sola unidad de procesamiento (vamos a obviar los sistemas
multiprocesador), pero son muchos los programas que compiten por su uso para ejecutarse,
tanto programas de usuario, como del sistema, incluido el propio sistema operativo que no
deja de ser un programa que tambin se ejecuta en la CPU.
b) El espacio de memoria. La memoria es un recurso limitado y no basta con dividirla en
zonas de tamao jo y asignrselas por separado a cada posible programa, sino que hay que
organizarla para que la ejecucin sea lo ms rpida posible y se minimice el espacio que
ocupa en la memoria. Una vez cargado un programa en memoria, ste se convierte en un
proceso, y segn avanza su ejecucin, puede necesitar ms o menos memoria.
c) El subsistema de entrada/salida. Se necesitan programas o drivers que permitan la comuni-
cacin entre la CPU y los dispositivos de entrada/salida. Por ejemplo, la memoria principal
se organiza simplemente en palabras de memoria de longitud ja ordenadas secuencialmente,
pero un disco duro, por diversas cuestiones tecnolgicas, organiza su informacin en caras,
pistas, bloques y sectores, y se necesita un software que traduzca una organizacin a otra.
Tambin se necesita reservar una serie de posiciones de memoria principal o puertos de e/s
para que los controladores de dispositivos y la CPU intercambien informacin. Dentro de
estas funciones vamos a destacar tambin la gestin del sistema de archivos, que es todo lo
concerniente a la organizacin lgica del disco duro de cara al usuario en unidades, directorios
o carpetas, caminos, etc.
El sistema operativo puede facilitar la gestin de estos recursos desde 2 puntos de vista:
Captulo 1. El ordenador y la informacin 23
Desde el punto de vista del usuario. A travs de un interfaz grco de ventanas
13
, o textual
con una lnea de comandos, el usuario puede utilizar interactivamente los distintos recursos
del sistema.
Desde el punto de vista del programador. El programador puede incluir en sus programas
l lamadas al sistema o a bibliotecas estndares para realizar tareas que ya estn programadas
y probadas.
Principales sistemas operativos
Aunque a lo largo de la historia, los fabricantes de ordenadores han creado distintos sistemas
operativos adaptados a sus mquinas, cada uno con sus puntos fuertes y sus debilidades, hoy da
son slo tres los que han terminado por extenderse ampliamente:
Unix y Linux. El primero es habitual en los grandes ordenadores y supercomputadores. Su
gran ventaja, adems de un diseo interno ms limpio por no depender originalmente de
restricciones comerciales, es que es software libre y por tanto no se necesita pagar licencias
comerciales por su uso. Linux es la adaptacin que un estudiante nlands, Linus Torvalds,
hizo de Unix para los ordenadores personales
14
.
Windows. Es el ms extendido en el mundo de los ordenadores personales, a pesar de requerir
una licencia comercial para su uso.
MacOS. Es el sistema operativo de los ordenadores Apple , los ordenadores personales que
siempre han rivalizado con los de MicroSoft . Aunque ahora tiene como ncleo una
variante de Unix, tambin es un sistema operativo que requiere licencia comercial.
Hoy da se estn desarrollando sistemas operativos para la computacin domstica de disposi-
tivos mviles, algunos nuevos y otros basados en Linux o MacOS. Actualmente, los ms usados son
PalmOS, Symbian, Windows Mobile, BlackBerry OS, iPhoneOS, Android y el propio
Linux.
1.5.2. Lenguajes de programacin y traductores
Sean las siguientes deniciones:
Lenguaje de programacin. Conjunto de smbolos y reglas de combinacin de esos smbolos para
construir programas.
Cdigo objeto. Instrucciones codicadas en bits que puede ejecutar directamente un ordenador.
Cdigo fuente. Comandos o sentencias escritas en algn lenguaje de programacin, no ejecutable
directamente por un ordenador.
El cdigo objeto suele decirse que es cdigo de bajo nivel o cdigo binario porque es prximo
al hardware de la mquina y depende del repertorio de instrucciones del procesador, es decir, no
es portable de una mquina a otra directamente. Sin embargo, el cdigo fuente se dice que es de
alto nivel porque es ms prximo al ser humano, ms fcil de leer, razn por la que los programas
de ordenador se suelen escribir en este tipo de lenguajes. Adems, tienen la ventaja de que no
dependen de las instrucciones que puede ejecutar un procesador en particular, sino que se escriben
de forma que a posteriori puedan ejecutarse en cualquier mquina.
No obstante, para poder ejecutar un programa escrito en un lenguaje de alto nivel se necesita
otros programas que lo codiquen en las instrucciones de bajo nivel de un procesador concreto.
Estos programas son los traductores, que como entrada aceptan programas escritos en un len-
guaje de alto nivel y como salida generan cdigo binario equivalente ejecutable en un procesador
13
Son los llamados Graphical User Interfaces o GUI s.
14
Concretamente, parti con la versin simplicada de Unix, llamada Minix, que Andrew S. Tannenbaum public
en su famsoso libro Operating Systems: Design and Implementation.
24 La componente lgica
determinado. Ntese la diferencia entre un lenguaje de programacin, que no es ms que una espe-
cicacin, es decir, un documento, y un traductor, que es una implementacin de un determinado
lenguaje para una mquina en particular.
Actualmente existen lenguajes de programacin estndares como C++, Java, Fortran, PHP...
que disponen de traductores para la mayora de los ordenadores existentes hoy en da, lo que hace
que los programas escritos en estos lenguajes sean fcilmente portables de una mquina a otra.
Por otro lado, hay traductores que como entrada aceptan cdigo intermedio prximo a la m-
quina pero an no ejecutable, y como salida generan el cdigo binario equivalente ejecutable. Este
cdigo intermedio suele tratarse de instrucciones legibles al ser humano, pero que se corresponden
una a una con las instrucciones a nivel de bits de los procesadores. Son simplemente abreviaturas
mnemnicas y nmeros en decimal de las engorrosas cadenas de bits que representan las instruccio-
nes del procesador. Son los llamados ensambladores
15
. Tambin existen los desensambladores, los
cuales aceptan como entrada cdigo binario ejecutable y, como salida, generan el cdigo ensambla-
dor equivalente. Los traductores de alto nivel tambin pueden generar el ensamblador equivalente
al cdigo fuente de un programa.
Existen dos tipos de traductores, a saber:
Compiladores. Leen totalmente el programa fuente y generan de una sola vez el cdigo objeto
equivalente. Ntese que el programa no es ejecutado, sino que el usuario tendr que ejecutarlo
despus.
Intrpretes. Leen el programa fuente sentencia a sentencia y las ejecutan una a una, de forma que
una sentencia no se traduce hasta que no se haya traducido y ejecutado la anterior. Suelen
ser lenguajes ms simples.
En cualquier caso, se dice que mientras estamos escribiendo el cdigo fuente estamos en tiempo
de compilacin. Y mientras ejecutamos el programa traducido estamos en tiempo de ejecucin.
Los programas escritos en lenguajes de programacin de alto nivel pueden tanto traducirse
con compiladores como con intrpretes, aunque, algunos se preeren compilados, como C/C++,
Pascal o Fortran, y otros interpretados, como PHP, Perl o JavaScript. Los hay incluso que primero
se compilan a un cdigo intermedio, que no es ensamblador, y ms tarde se compilan al cdigo
ejecutable. Tal es el caso de Java.
1.5.3. Las bases de datos
Almacenamiento de datos
Adems del software y el hardware, no cabe duda que otra parte fundamental de un ordenador
es la informacin del usuario o simplemente datos. El almacenamiento de datos convencional
simplemente los organizaba en archivos planos sin relacin entre ellos. El acceso era relativamente
sencillo, bien manual o con pequeos programas, pero adoleca de una serie de inconvenientes:
Redundancia e inconsistencia de datos. Dentro de un archivo puede haber mucha informacin
repetida. Esta repeticin puede existir tambin entre varios archivos, con el agravante de que
puede ser inconsistente.
Dicultad de acceso. Cuando los archivos son grandes, los accesos pueden ser lentos. Y el
problema es peor cuando se necesita acceder a informacin que est repartida entre varios
archivos.
Problemas de seguridad. No existen mecanismos de permisos ni controles de la integridad de
los datos, por lo que son muy vulnerables a la prdida o corrupcin de la informacin.
Dicultad de acceso concurrente. Al no existir mecanismos especiales para controlar el acceso,
cuando se realizan accesos simultneos, se puede producir inconsistencia o corrupcin en los
datos.
15
Tambin se llama ensamblador al propio lenguaje de cdigo intermedio.
Captulo 1. El ordenador y la informacin 25
Falta de relacin entre los datos. Al ser archivos independientes, el usuario debe tener en
cuenta de forma manual la posible relacin de la informacin entre distintos archivos.
Sistemas de bases de datos
Estos problemas ya se pusieron de maniesto en los aos 60, por lo que empezaron a desarro-
llarse programas especialmente dedicados a manejar estas situaciones. Surgen as los sistemas de
bases de datos, que podemos denir como:
Sistemas de denicin, administracin y manipulacin de datos relacionados entre s,
organizados de manera que puedan accederse de forma controlada y eciente.
La base de datos propiamente dicha puede considerarse como la coleccin de datos interrelacio-
nados entre s, mientras que el gestor de la base de datos sera coleccin de programas que permite
el acceso controlado a esos datos.
Tenemos 3 tipos de personas involucradas en la vida de una base de datos:
Los programadores de aplicaciones, los cuales escriben programas que utilizan la base de datos,
tanto para recuperar informacin, como para crearla o modicarla. Suelen utilizar sentencias
de lenguajes especializados llamadas desde dentro de otros lenguajes antriones de propsito
general como C++, Java o PHP.
Los usuarios nales, que acceden a la informacin de forma fcil y controlada a travs de consultas
o peticiones a la base de datos.
Y los administradores, que son los encargados de mantener la seguridad e integridad de la base
de datos a lo largo de toda su vida. Tienen todo el control de la base de datos y deciden qu
informacin se almacena y es visible para cada usuario.
Entre las caractersticas que debe incluir el sistema de base de datos estn:
Interfaz de usuario fcil e intuitivo.
Consistencia y no redundancia de la informacin.
Requisitos de seguridad que garanticen una mnima integridad de los datos.
Copias de seguridad frente a fal los del sistema.
Control del acceso concurrente.
Existen en el mercado sistemas de bases de datos con licencia libre como MySQL, SQLite,
PostgreSQL, y tambin comerciales como dBase, Oracle, Paradox, Access, SyBase.
Normalizacin de la informacin
Cuando se almacena informacin sobre una determinada entidad, primero se debe seleccionar
qu caractersticas suyas o atributos realmente hay que almacenar. Veamos un ejemplo de una
base de datos sobre la docencia en un centro de enseanza que almacena informacin sobre las
entidades profesor, asignatura y alumno:
De la entidad profesor se almacenan los atributos DNI, nombre, apellidos, domicilio,
fecha de nacimiento y fecha de ingreso.
De la entidad asignatura se almacenan los atributos cdigo nico que la identica, nombre,
curso al que pertenece y DNI del profesor que la imparte.
De la entidad alumno se almacenan los atributos DNI, nombre, apellidos, domicilio,
curso y lista de cdigos de asignatura en las que se matricula.
26 La componente lgica
cdigo asignatura curso DNI profesor
... ... ... ...
132 algebra 1 87654321
162 fsica 1 12345678
276 mecnica 2 12345678
345 economa 3 33333333
... ... ... ...
Tabla 12: Registros de la entidad asignatura.
A cada ocurrencia de cada entidad se le suele llamar registro. Se puede ver un ejemplo en la
tabla 12.
Con esta estructura se evita la redundancia informacin. Por ejemplo, si un profesor imparte
varias asignaturas, sus datos se almacenan una sola vez, repitindose tan solo su DNI en todas las
asignaturas que imparte. Igualmente, la informacin de cada asignatura slo se almacena una vez,
a pesar de que pueden ser muchos los alumnos que se matriculan en ella. Se dice que la informacin
que evita esta redundancia est normalizada.
Para poder normalizar informacin debe existir un atributo o clave que identique de forma
nica a cada ocurrencia de una entidad. En nuestro ejemplo, las claves son el DNI para las entidades
profesor y alumno, y el cdigo para la asignatura. Estas claves posibilitan que una ocurrencia
de una determinada entidad pueda referenciar de forma precisa ocurrencias de otras entidades,
establecindose as las relaciones entre ellas.
Lenguajes de denicin y manipulacin de datos
Para evitar la redundancia de la informacin y a su vez establecer fcilmente relaciones entre
ellos, la estructura de las bases de datos y los posibles accesos a ellas se describen mediante
los llamados lenguajes de denicin de datos. Son lenguajes utilizados por los programadores de
aplicaciones y por los administradores de la base de datos.
Por otro lado, para facilitar su uso las bases de datos tambin disponen de un lenguaje de
manipulacin de datos que permiten consultar, insertar, modicar y eliminar informacin. Son
lenguajes utilizados sobre todo por los usuarios de la base de datos, aunque por supuesto tambin
lo utilizan sus administradores.
El lenguaje por excelencia que se utiliza hoy da para denir, administrar y manipular bases
de datos es el SQL
16
, cuya primera versin se lanz en 1987. Adems, puede hacerse llamadas a
SQL desde otro lenguaje antrin como C++, Java o PHP, o desde un interfaz de usuario grco
o textual
17
.
Bases de datos relacionales
Un qumico y matemtico ingls, Edgar F. Codd, en los aos 60 formaliz estos conceptos para
dar lugar a las llamadas bses de datos relacionales. Ms concretamente, estableci 12 reglas que
determinaban si un sistema gestor de bases de datos era o no relacional. De ellas solo vamos a
destacar las 3 reglas siguientes:
Regla 1. Cada entidad se representa mediante una tabla donde cada la representa el registro de
una ocurrencia, y cada columna se corresponde con un atributo de todas las ocurrencias.
Regla 2. Una de las columnas debe representar la clave primaria, de forma que la terna (tabla,
clave, columnas) sea suciente para acceder a las columnas indicadas de un determinado
registro de una tabla.
Regla 5. El lenguaje de datos de la base de datos debe ser completo en el sentido de que debe
permitir su denicin y su manipulacin.
16
Del ingls, Structured Query Language.
17
MySQL es un SGBD ampliamente extendido que se puede utilizar tanto en modo usuario como programado.
Captulo 1. El ordenador y la informacin 27
A modo de ejemplo, una sentencia SQL que dene una tabla podra ser:
CREATE TABLE profesores (
dni INT PRIMARY KEY,
nombre VARCHAR(80),
apellidos VARCHAR(80),
domicilio VARCHAR(128),
fecha_nacim DATE,
fecha_ingreso DATE)
otra que inserta datos en la tabla sera:
INSERT INTO profesores
(dni, nombre, apellidos,
domicilio, fecha_nacim, fecha_ingreso)
VALUES
(123456789, "Yoni", "Cogio Sufusil",
"Calle Pelis Raras, 1119", 22/06/1983, 22/08/1985)
y la siguiente realizara una consulta:
SELECT dni, nombre, fecha_nacim FROM profesores
WHERE dni>9999999
28 La componente lgica
Captulo 2
Algoritmos
2.1. Concepto de algoritmo
Solucionar un problema en la vida real implica realizar una serie de acciones hasta completar
un trabajo que elimine el problema. En general, un algoritmo
1
, es algo parecido, aunque con alguna
particularidad. Podemos denirlo as:
(Sub)Algoritmo Serie ordenada, nita y secuencial de acciones no ambiguas que resuelven una
(sub)tarea en un tiempo nito.
De esta denicin hay que resaltar que las acciones se realizan secuencialmente y de forma
ordenada, es decir, paso a paso, no se empieza la siguiente accin hasta que no termina la anterior.
Dado un estado inicial y una entrada, siguiendo los pasos en el orden preescrito se llega a un estado
nal que resuelve la tarea o problema. Aunque un algoritmo admite la ejecucin de acciones en
paralelo, las acciones de un algoritmo se establecen en bloques de acciones secuenciales.
Por otro lado, el algoritmo debe poder expresarse en un nmero nito de acciones y terminar
en un tiempo nito. De no ser as, el algoritmo sera intil.
Tambin hay que destacar que las acciones deben ser no ambiguas, es decir, deben estar bien
denidas para no generar dudas durante su aplicacin. Para ello va a hacer falta una serie de
convenciones que deben seguirse para expresar el algoritmo.
En informtica, un programa es algo muy similar a un algoritmo, pero el elemento central va
a ser la informacin y el computador. Podramos denir programa como:
(Sub)Programa Serie ordenada, nita y secuencial de instrucciones o sentencias bien denidas
que resuelven una (sub)tarea en un ordenador.
Vemos que la diferencia entre programa y algoritmo es la posibilidad de ser resuelto de forma
automtica por un ordenador, y por lo tanto, el problema debe involucrar informacin.
En general, en un algoritmo hay que tener en cuenta los siguientes elementos que intervienen
en la resolucin del problema:
El procesador. Es quien ejecuta las acciones bsicas o primitivas que puede utilizar un algoritmo.
La representacin de la informacin. Establece la forma en que se van almacenar y utilizar los
datos del problema.
El lenguaje. Es el conjunto de smbolos y reglas de combinacin que se necesita para expresar un
algoritmo. Debe poder expresar todas las primitivas bsicas que el procesador puede realizar.
Como ejemplo, veamos dos algoritmos distintos que resuelven el mismo problema, la multipli-
cacin de dos nmeros, pero con procesador y representacin de la informacin diferentes, aunque
el lenguaje va a ser el mismo, el lenguaje natural. El primero es:
1
La palabra algoritmo deriva del nombre de un matemtico y astrnomo rabe del siglo IX, Al-Khwarizmi, quien
dio a conocer al mundo europeo el sistema de numeracin indoarbigo, muy similar al nuestro actual.
29
30 Concepto de algoritmo
Problema: multiplicacin de 2 nmeros naturales.
Procesador: ser humano.
Primitivas: saber sumar y restar.
Representacin: cifras escritas en papel.
Algoritmo:
Escribir X en la hoja 1.
Escribir Y en la hoja 2.
Escribir 0 en la hoja 3.
REPETIR
Sumar valores hojas 1 y 3 ->resultado hoja 3.
Restar 1 a valor hoja 2 ->resultado hoja 2.
HASTA QUE valor hoja 2 sea 0.
Resultado: valor escrito en hoja 3.
PARAR.
Si ejecutamos paso a paso este algoritmo con los datos de entrada 2 y 3, obtendremos el
resultado 6 escrito en la hoja 3. Como vemos en este algoritmo, se suministra informacin como
entrada, y el resultado es una salida. Esto que hace que se pueda ejecutar para entradas distintas
sin necesidad de cambiar las acciones. Al igual que sucede en un ordenador, un algoritmo se puede
considerar como un sistema que acepta una entrada, la procesa, y responde con una salida.
El segundo algoritmo utiliza un instrumento muy antiguo chino, el baco, que es una especie
de bastidor con varios hilos paralelos rgidos donde se ensartan bolas. Las bolas se pueden mover
de izquierda a derecha sin salirse de su hilo, y con espacio suciente para diferenciar claramente
las que estn a la izquierda de las que estn a la derecha. Imaginemos una versin simplicada del
baco con solo 3 hilos con bolas rojas, azules y verdes respectivamente. Y pensemos que cada hilo
representa un dato numrico que coincide con el nmero de bolas que en un momento dado tenga
a su izquierda. El algoritmo puede leerse as:
Problema: multiplicacin de 2 nmeros naturales.
Procesador: ser humano y un baco.
Primitivas: saber contar.
Representacin: bolas del baco a la izquierda.
Algoritmo:
Mover todas las bolas a la derecha.
Desplazar X bolas rojas a la izquierda.
Desplazar Y bolas azules a la izquierda.
MIENTRAS haya bolas azules a la izquierda,
Desplazar X bolas verdes a la izquierda.
Desplazar 1 bola azul a la derecha.
FINMIENTRAS
Resultado: nmero de bolas verdes a la izquierda.
PARAR.
Tras la ejecucin de este algoritmo con datos de entrada 2 y 3, obtendremos 6 bolas verdes a
la izquierda, que es el resultado buscado. Ntese que el procesador del primer algoritmo es ms
inteligente porque sus primitivas son ms sosticadas. Se espera entonces que sea ms rpido
para resolver el mismo problema.
Vemos que, dependiendo de estos elementos, la solucin a un problema va a ser no nica.
Incluso teniendo el mismo procesador y la misma representacin podremos llegar a la solucin con
algoritmos muy diferentes. No obstante, siempre deberemos buscar la solucin menos costosa. En
el mbito de los computadores, debemos disear algoritmos que utilicen menos memoria y tiempo.
Los dos siguientes algoritmos utilizan el mismo procesador, pero resuelven el mismo problema
de forma diferente. Pensemos ahora que la representacin de datos son posiciones de memoria que
se pueden modicar, y que se pierde el contenido anterior cuando se guarda un valor nuevo. El
primero de los algoritmos utiliza la primitiva especial saltar a otra accin, que permite repetir
Captulo 2. Algoritmos 31
una o ms acciones si se salta hacia atrs, o bien, si se salta hacia adelante, evita la ejecucin de
acciones segn una determinada condicin.
Problema: sumar los nmeros pares menores que 100.
Procesador: ser humano.
Primitivas: +, , , /, =, y saltar a otra accin.
Representacin: datos s y n.
Algoritmo:
1. Poner un 0 en dato s.
2. Poner un 2 en dato n.
3. Poner n+s en dato s.
4. Poner n+2 en dato n.
5. SI n<=100 ENTONCES Saltar a paso 3.
6. Leer resultado del dato s.
7. Parar.
El segundo algoritmo no necesita la primitiva saltar y realiza el clculo de una forma ms
eciente sin tener que repetir algunas de las acciones.
Problema: sumar los nmeros pares menores que 100.
Procesador: ser humano.
Primitivas: +, , , /, =, y saltar a otra accin.
Representacin: datos s y n.
Algoritmo:
1. Sumar 2+100 y guardarlo en dato s.
2. Multiplicar s por 100 y guardarlo en dato s.
3. Dividir s por 4 y guardarlo en dato s.
4. Leer resultado del dato s.
5. Parar.
El siguiente es otro ejemplo de algoritmo con el mismo procesador y representacin de datos
anteriores.
Problema: determinar si un nmero es primo.
Procesador: ser humano.
Primitivas: +, , , /, =, y saltar a otra accin.
Representacin: datos numero y divisor.
Algoritmo:
1. Obtener numero.
2. divisor <- 2.
3. Dividir numero por divisor.
4. SI el resto es 0 ENTONCES
4.1.El resultado es NO PRIMO.
4.2.Saltar a 7.
5. divisor <- divisor+1.
6. SI divisor=numero ENTONCES
6.1.El resultado es PRIMO.
SI NO
6.2.Saltar a 3.
7. Parar.
El ltimo ejemplo que vamos a ver muestra que el concepto de algoritmo no tiene por qu
limitarse a la resolucin de problemas relacionados con la informacin, sino que puede aplicarse a
muchos problemas de la vida real para resolverlos de una manera precisa, eciente y sistemtica.
32 Concepto de algoritmo
Problema: elaboracin de una tortilla espaola.
Procesador: ser humano y utensilios de cocina.
Primitivas: saber leer y manejar los utensilios.
Representacin: receta escrita en papel.
Algoritmo (nivel de renamiento 1):
1. Pelar y cortar <patatas>.
2. Pelar y cortar <cebollas>.
3. SI se desean <pimientos>ENTONCES
Pelar y cortar <pimientos>.
4. Calentar aceite.
5. Echar ingredientes a la sartn.
6. Frer ingredientes.
7. Batir huevos.
8. Mezclar huevos con ingredientes fritos.
9. Frer todo junto hasta cuajar parte inferior.
10.Dar la vuelta a la tortilla.
11.Frer todo junto hasta cuajarlo.
12.Retirar del fuego.
En este algoritmo podemos introducir paralelismo porque el procesador puede realizar simul-
tneamente las acciones 3 y 4 por un lado, y las acciones 6 y 7 por otro. No es fcil introducir ms
parelelismo en este algoritmo porque comenzar una accin exige estar acabada la anterior. En los
programas de informtica se da una situacin parecida por la dependencia de datos, donde una
instruccin necesita datos que deben generar instrucciones anteriores.
A veces es conveniente especicar el algoritmo con primitivas menos detalladas para entender
mejor la resolucin global del problema, o al revs, se necesita detallar ms el algoritmo porque
el procesador es incapaz de entender las primitivas utilizadas. En estos casos se puede utilizar
varios niveles de renamiento, siendo el primer nivel el menos detallado, y en niveles sucesivos se
va detallando distintas partes del algoritmo hasta que el procesador sea capaz de ejecutarlo. Por
ejemplo, el ltimo algoritmo mostrado podra considerarse un primer nivel de renamiento, til
para un ser humano con cierta experiencia. Sin embargo, un ser humano con menos experiencia
podra necesitar ms detalles de algunas acciones en un segundo nivel de renamiento. Por ejemplo,
la accin pelar y cortar <ingrediente> podra detallarse ms:
Problema: pelar y cortar un ingrediente.
Procesador: ser humano y utensilios de cocina.
Primitivas: saber manejar el cuchillo.
Representacin: receta escrita en papel.
SubAlgoritmo (nivel de renamiento 2):
Coger cuchillo.
REPETIR
Pelar unidad de <pimientos>.
Lavar <ingrediente>.
Cortar ingrediente en trocitos.
SI aceite muy caliente ENTONCES
Retirar sartn de foco de calor.
HASTA tener <ingrediente>listo para frer.
Lavar cuchillo.
Obsrvese que este subalgoritmo admite la posibilidad de realizar en paralelo la accin externa
calentar aceite.
Finalmente, destaquemos en un algoritmo la posibilidad de elegir las acciones segn ciertas
condiciones. Esta capacidad de decisin es lo que otorga a los algoritmos inteligencia.
Captulo 2. Algoritmos 33
2.2. Notaciones algortmicas
Como hemos visto, los algoritmos necesitan expresarse de una forma precisa y no ambigua.
Para ello se necesita una notacin algortmica, que podemos denir como:
Notacin algortmica Conjunto de convenios para expresar de forma no ambigua la resolucin
paso a paso de un problema.
Existen bsicamente tres categoras de notaciones algortmicas:
Grcas. Se basan en smbolos grcos simples muy intuitivos que se pueden combinar
fcilmente.
Textuales. Utilizan un subconjunto del lenguaje natural que se aplica con ciertas reglas ms
o menos rigurosas, pero que evitan la ambigedad. A veces se les llama pseudolenguajes.
Ejecutables en mquina. Son lenguajes basados en los smbolos del lenguaje natural lo su-
cientemente rigurosos como para poder ser traducidos a programas ejecutables en ordenador.
Son los lenguajes de programacin.
2.2.1. Notaciones grcas
Las ms sencillas son los tradicionales diagramas de ujo, que utilizan un conjunto pequeo
de smbolos sencillos y se combinan para facilitar el seguimiento del ujo de las operaciones de un
algoritmo. En la gura 2.1) podemos ver los smbolos bsicos y en la 2.2 un ejemplo sencillo.
Figura 2.1: Smbolos usuales de los diagramas de ujo.
Existen notaciones ms sosticadas que permiten representar grcamente otros aspectos del
desarrollo de programas como el Lenguaje de Modelado Unicado o UML. En la gura 2.3 se puede
ver un ejemplo con las relaciones entre distintos grupos de datos.
2.2.2. Notaciones textuales
El lenguaje natural simplicado suele usarse cuando no se necesita expresar muchos detalles
del algoritmo. Son los llamados pseudolenguajes, ya que no se pretende ejecutarlos en mquina.
A veces, al algoritmo escrito en pseudolenguaje se llama pseudocdigo. En la gura 2.4 podemos
ver las sentencias bsicas de un pseudolenguaje, y en la gura 2.5 el ejemplo del algoritmo que
determina si un nmero es primo que hemos visto antes escrito en pseudocdigo.
34 Lenguajes de programacin
Figura 2.2: Ejemplo de un diagrama de ujo.
Figura 2.3: Ejemplo de un diagrama UML.
2.2.3. Notaciones ejecutables en mquina
Son los conocidos lenguajes de programacin, cuya caracterstica principal reside en la ausencia
total de ambigedad, lo que permite que los algoritmos expresados con ellos, que son los programas,
puedan ser traducidos y ejecutados en un ordenador.
Existen muchos tipos de lenguajes de programacin y en la siguiente seccin se dar una sucinta
clasicacin de los que hay.
2.3. Lenguajes de programacin
2.3.1. Lenguajes vs. traductores
Un lenguaje de programacin puede denirse como:
Lenguaje de programacin Conjunto de smbolos y reglas para combinar esos smbolos que
permiten construir programas ejecutables en un ordenador.
Hay que tener clara la diferencia entre un lenguaje de programacin, que no es ms que una
especicacin, y un traductor, que es el software que traduce programas expresados con ese len-
Captulo 2. Algoritmos 35
Figura 2.4: Sentencias de un pseudolenguaje.
ALGORITMO EsPrimo
VARIABLES
N numero, divisor, resto
INICIO
Pedir y leer numero
divisor 2
REPETIR
resto numero MOD divisor
divisor divisor + 1
HASTA QUE resto=0 O divisor=numero
SI divisor=numero ENTONCES
ESCRIBIR "Es primo"
SI NO
ESCRIBIR "No es primo"
FIN SI
FIN
Figura 2.5: Sentencias de un pseudolenguaje.
guaje a un lenguaje mquina particular. En la especicacin de un lenguaje estn involucradas
muchas personas, instituciones y empresas que deben ponerse de acuerdo y nalmente lo publican
en un documento a travs de organizaciones internacionales de estndares. A partir de ese momen-
to, los fabricantes de ordenadores o de software pueden utilizar esa especicacin para construir
traductores para determinadas mquinas. La gran ventaja de estandarizar los lenguajes de pro-
gramacin es que un programa escrito en ese lenguaje puede ser traducido a cualquier mquina,
ya que la mayora de los fabricantes de ordenadores disponen de traductores para sus mquinas
de los lenguajes ms utilizados. Esta caracterstica de los lenguajes de programacin es lo que se
conoce como portabilidad.
2.3.2. Categoras de los lenguajes de programacin
En general, podemos distinguir las siguientes categoras de lenguajes:
Imperativos o procedurales. En estos lenguajes la solucin al problema se detalla mucho y se
debe incluir el orden especco de ejecucin de las instrucciones o sentencias. Son los ms
extendidos porque se adaptan muy bien a las caractersticas secuenciales de la mquina
de von Neumann. Ejemplos destacados son Fortran, Cobol, C, Ada o Pascal. Estos
36 Lenguajes de programacin
lenguajes permiten estructuras de datos complejas, por lo que se preere compilarlos en vez
de interpretarse. Existen no obstante otros lenguajes ms sencillos de utilizar que suelen
interpretarse, como los llamados lenguajes de guiones o comandos o tipo script. Entre ellos
podemos destacar la shel l de Unix, PHP, JavaScript y Perl.
Orientados al objeto. Estos lenguajes nacen a partir de los imperativos, pero si bien los imperativos
estn orientados a las operaciones, los orientados al objeto se extienden para integrar datos
y operaciones en lo que se conoce como objeto. El ejemplo por excelencia ms antiguo es el
Smalltalk, si bien, hoy da se utiliza ms Java y C++.
Declarativos. En estos lenguajes no se detalla el orden de ejecucin de las sentencias, sino el obje-
tivo nal que quiere conseguirse. Es el sistema el que, basndose en una serie de deniciones
o reglas, determina la evolucin de la especicacin inicial hasta la solucin nal si la hay.
En esta categora existen a su vez dos tipos de lenguajes:
Funcionales. Son lenguajes ms matemticos y se basan en deniciones de funciones.
Un lenguaje de este tipo muy conocido es el Lisp, y otro ms moderno el Haskell.
Lgicos. Estos lenguajes estn basados en las reglas de deduccin de la lgica. El ejemplo
por excelencia es el Prolog y se utiliza en inteligencia articial.
Lenguajes de propsito especco. Los tres tipos de lenguajes descritos anteriormente son de
propsito general, pero tambin existen lenguajes de propsito especco pensados para de-
terminados mbitos. La mayora de estos son parecidos a los imperativos, pero algunos tienen
particularidades propias. Ejemplos de ellos se utilizan en los siguientes mbitos:
En internet: HTML y XML. Son lenguajes apropiados para presentar informacin en
las pginas web y facilitar visualmente la conectividad con documentos en mquinas
remotas.
En robtica: VAL. Estn pensados para la manipulacin de robots desde un ordenador.
En bases de datos: SQL. Es el lenguaje por excelencia para la denicin, administracin
y consultas a bases de datos.
Hardware: Step-5. Es uno de los muchos lenguajes de descripcin de circuitos electr-
nicos.
2.3.3. Algunos hitos histricos de los lenguajes de programacin
Durante los aos 50 y 60 no existan lenguajes de alto nivel y se programaba directamente en
lenguaje mquina. Se necesitaba una gran formacin en la arquitectura del ordenador concreto
que se programaba. Era la primera generacin de los lenguajes de programacin.
Los primeros lenguajes de programacin de alto nivel empezaron a desarrollarse en los aos 50,
siendo Fortran de John Bakus el primero. An tenan caractersticas muy ligadas a la mquina
como los saltos, pero ya tenan las construcciones bsicas de secuencia, decisin y repeticin. Junto
al ensamblador constituan la segunda generacin.
En los aos 60 fue cuando se hicieron grandes avances en la programacin imperativa, dando
lugar a los lenguajes de tercera generacin. En esta generacin destac el lenguaje Algol, que
aunque no se us mucho comercialmente, inuy notablemente en los lenguajes modernos. Este
lenguaje ya poda considerarse un lenguaje estructurado, en los cuales los saltos son innecesarios,
y adems facilitan mucho la organizacin en subprogramas o modularizacin.
Los lenguajes orientados al objeto, considerados de cuarta generacin, aparecen en los aos 70
con Smalltalk, pero no fue hasta los aos 80 con C++ y los 90 con Java cuando se empezaron a
utilizar ampliamente.
Fue tambin en los aos 90 cuando empiezan a usarse los lenguajes orientados a Internet, entre
los que destacan PHP y Perl.
En la gura 2.6 puede verse un breve esquema de la evolucin histrica de los lenguajes de
programacin mencionados y algunos ms.
Captulo 2. Algoritmos 37
Figura 2.6: Evolucin de los lenguajes de programacin ms conocidos.
2.4. El ciclo de vida software
Nota. Esta seccin es un resumen del captulo 1 del libro Ingeniera
del software: Un enfoque prctico, 3ra. edicin, 1993, McGraw-Hill, de
Roger S. Pressman.
Desde los aos 80, el software ya superaba al hardware como factor determinante en el xito
de muchos sistemas informticos. Hasta entonces, el objetivo era mejorar y abaratar el diseo de
los componentes fsicos de un ordenador. Hoy da, sin embargo, los costes del software son mucho
mayores y el desafo es mejorar su calidad.
El software es la componente lgica del ordenador, por tanto, sus caractersticas son muy
distintas a las hardware. Podemos destacar las siguientes:
El software se desarrol la, no se fabrica.
El software no se estropea, pero se queda obsoleto.
Es muy difcil ensamblar componentes de software ya existentes.
El software es intangible, y por tanto difcil de medir, de corregir, de ampliar, de valorar.
La calidad del software no se conoce hasta que lleva un tiempo usndose.
Tanto la planicacin y desarrollo, como el mantenimiento del software adolecen de una serie
de problemas que ya empezaban a ponerse de maniesto desde los aos 60:
La planicacin y estimacin de costes suele ser imprecisa. La no aplicacin de metodologas,
la rpida evolucin de las herramientas software y falta de experiencia, entre otros factores,
pueden hacer que el desarrollador no sepa estimar costes y plazos de tiempo correctos.
La productividad de los desarrolladores de software no se corresponde con la demanda de sus
servicios. Normalmente, el cliente no sabe calibrar la cantidad de trabajo que est deman-
dando.
La calidad del producto nal deja que desear. Los plazos ajustados, la dicultad inherente
de la naturaleza lgica del software, o falta de experiencia de los programadores son posibles
causas de ello.
La comunicacin entre el desarrollador del software y el cliente es escasa y los requisitos
del usuario suelen cambiar con frecuencia. Adems, el gestor de un proyecto puede ser un
ejecutivo de medio o alto nivel sin conocimientos de la problemtica del software.
38 El ciclo de vida software
Figura 2.7: Pasos del ciclo de vida clsico.
Antes de la entrega del producto nal, las pruebas son escasas y decientes, con lo que los
fallos aparecern despus de la fase de desarrollo, aumentando as los costes de manteni-
miento.
El mantenimiento suele ser muy costoso porque los errores y las limitaciones del producto
son difciles de ver al inicio, y slo se ponen de maniesto con su uso. Adems, arreglarlos
puede implicar rehacer gran parte del software, no hay piezas de repuesto.
La solucin a estos problemas pasa por darle un enfoque de ingeniera al desarrollo del softwa-
re. Y no existe un enfoque nico para solucionar el mal del software. Sin embargo, mediante la
combinacin de mtodos sistemticos en todas las fases de desarrollo del software, mejores herra-
mientas para automatizar estos mtodos, mejores tcnicas para la garanta de calidad del software
y una mejor coordinacin, control y gestin en el proyecto del producto, se puede conseguir una
disciplina para el desarrollo del software: la ingeniera del software.
El proceso de desarrollo del software contiene 3 fases genricas, independientemente del enfoque
o paradigma elegido. Las fases de denicin, desarrol lo y mantenimiento se encuentran en todos los
desarollos de software sea cual sea el rea de aplicacin, el tamao del proyecto o su complejidad.
El desarrollador de software podr aplicar estas fases de forma disciplinada secuencialmente, de
forma repetitiva para diversas partes del software, o de forma totalmente desorganizada, pero las
tres fases deben aplicarse. Adems, cuanto ms tiempo se emplee en las primeras fases, menor ser
el coste de la fase de mantenimiento, lo que en muchos casos es el ms determinante.
En los siguientes epgrafes vamos a describir las tres fases mencionadas, tpicas del conocido
ciclo de vida clsico, cuyo esquema puede verse en la gura 2.7.
2.4.1. Fase de denicin
Esta fase se centra en el qu. Esto es, hay que identicar qu informacin tiene que ser pro-
cesada, qu funcin y rendimiento se desean, qu interfaces han de establecerse, qu restricciones
de diseo existen y qu criterios de validacin se necesitan para denir un sistema correcto. Esta
fase, a su vez, suele constar de los tres siguientes pasos:
Anlisis del sistema. El software no es ms que una parte de un sistema informtico que puede
involucrar el hardware, personas, o bases de datos y con los cuales va a interrelacionarse.
Este paso debe asignar al software el papel que va a desempear dentro del conjunto del
sistema.
Captulo 2. Algoritmos 39
Planicacin del proyecto software. Una vez establecido el mbito del software, se analizan los
riesgos, se asignan los recursos, se estiman los costes, se denen las tareas y se planica el
trabajo.
Anlisis de requisitos. Antes de empezar el desarrollo del producto, se necesita conocer con ms
detalle las funciones que el cliente desea para el software.
2.4.2. Fase de desarollo
Esta fase se centra en el cmo. Hay que descubrir cmo han de disearse las estructuras de
datos y la arquitectura del software, cmo han de implementarse los detalles procedimentales,
cmo ha de traducirse el diseo a un lenguaje de programacin y cmo ha de realizarse la prueba.
Aunque los mtodos pueden cambiar mucho en esta fase, es habitual que contenga tres pasos
concretos:
Diseo. Se traduce los requisitos del software a un conjunto de representaciones (grcas, tabu-
lares o textuales) que describen la estructura de datos, la arquitectura y los algoritmos.
Codicacin. Las representaciones de diseo deben ser traducidas a un lenguaje de programacin
para despus poder traducirse en ltima instancia a lenguaje mquina.
Prueba. Durante la implementacin del software y a la nalizacin del desarrollo del producto,
el software debe ser probado para descubrir los defectos de todo tipo que pueda contener.
En esta fase es habitual el llamado diseo descendente, en el cual las distintas partes de la
solucin se empiezan especicando con poco detalle, y en pasos posteriores se van renando y se
va aportando ms detalles. En ltima instancia, lo ideal es que la traduccin de la especicacin
confeccionada en la fase de diseo para la fase de codicacin sea lo ms automtica posible.
2.4.3. Fase de mantenimiento
Esta fase se centra en el cambio que necesariamente sufrir el software durante toda su vida
despus de ser entregado al cliente. Es posible que haya que volver a fases anteriores, aunque en
el contexto de un software ya existente. Estos cambios se deben sobre todo a tres causas:
Correcccin. Incluso aunque durante el desarollo se hayan seguido las mejores pautas de garanta
de calidad, lo ms probable es que el cliente descubra defectos en el software entregado.
Adaptacin. Con el paso del tiempo es posible que cambie el entorno del software: sistema ope-
rativo, perifricos, procesadores... Esto puede implicar cambios en el software.
Mejora. Conforme se utilice el software, el cliente puede descubrir funciones adicionales que le
pueden interesar.
40 El ciclo de vida software
Captulo 3
Introduccin a C/C++
3.1. El preprocesador de C/C++
El preprocesador de C/C++ examina el cdigo fuente y lo modica antes de ser compilado.
Busca lneas o directivas que empiezan con el carcter # en la primera columna. La mayora de
estas directivas sirve para compilar (o no) selectivamente trozos del cdigo fuente.
Una de las ms utilizadas es la directiva de inclusin de cheros, include y se utiliza para
incluir cheros, bien ubicados en directorios estndares poniendo entre <> el nombre del chero:
#include <fichero>
o bien ubicados en directorios no estndares, poniendo entre comillas dobles el nombre de chero
y empezando el camino en el directorio actual:
#include "fichero"
Otra de las directivas del preprocesador ms utilizadas es define, la cual sustituye todas las
ocurrencias de una cadena abreviada en el cdigo fuente por otra ms compleja de escribir.
#define cadena_abreviada cadena_compilada
El uso de define es ms general y admite incluso argumentos en la cadena abreviada para
utilizarla a modo de funcin o macro.
3.2. Palabras reservadas
Son las palabras clave que permiten construir la estructura sintctica de C y C++ y no
necesitan denirse porque el compilador ya conoce su signicado:
auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while
Posteriormente se aadieron las palabras reservadas que se incorporaron a la sintaxis de C++:
41
42 Literales
asm
bool
catch
class
const_cast
delete
dynamic_cast
explicit
false
friend
inline
mutable
namespace
new
operator
private
protected
public
reinterpret_cast
static_cast
template
this
throw
true
try
typeid
typename
using
virtual
wchar_t
3.3. Literales
Son las constantes sin nombre, tanto numricas como textuales, que no necesitan ser denidas.
Los caracteres van entre comillas y los nmeros no. Adems, los nmeros pueden llevar sujos
para indicar el tipo de dato que es:
Nmeros naturales: 1452, 12345u, 123456789ul.
Nmeros enteros: 1452, -325, 123456789l.
Nmeros en base octal: 0166, 0777.
Nmeros en base hexadecimal: 0x1a, 0X1A.
Nmeros reales en coma ja de simple precisin: -4.2, 3.25f.
Nmeros reales en coma ja de doble precisin: 12.456789l.
Nmeros reales en coma otante: -4e2, 3e-5, 12e-9l.
Caracteres simples imprimibles: 'a', '+', '&'.
Caracteres ascii especicados con su cdigo en octal: '\017'.
Caracteres ascii especicados con su cdigo en hexadecimal: '\x2c'.
Cadenas de caracteres: "Si es una cadena, las comillas son dobles.".
La tabla 1 muestra algunos caracteres no imprimibles que en C/C++ se pueden escribir como
secuencias de escape.
Secuencia de escape Nombre del carcter
'\a' campana (alarm)
'\b' retroceso (backspace)
'\f' avance de pgina (form feed)
'\n' avance de lnea (new line)
'\r' retorno de carro (carriage return)
'\t' tabulador (tabulator)
'\v' tabulador vertical (vertical tabulator)
'\\' diagonal invertida (backslash)
'\?' interrogacin (question mark)
'\'' apstrofe (apostrophe)
'\"' comillas (quotation mark)
Tabla 1: Secuencias de escape de C/C++.
Captulo 3. Introduccin a C/C++ 43
3.4. Identicadores
Un identicador es una palabra que no es reservada, tiene un mximo de 32 caracteres, comien-
za por una letra y va seguida de letras, dgitos o el carcter subguin _. As son identicadores:
dato, dato1, dato2000, Pi_Al_Cuadrado, Pi_doble,
pero no son identicadores:
50_Al_Cuadrado, 5por15, variable.entera, constante K (con el espacio en
blanco), while.
3.5. Expresiones
C y C++ admiten distintos tipos de expresiones combinadas con distintos tipos de operadores.
Pueden ser textuales, numricas y lgicas. En general, las expresiones de distinto tipo no pueden
mezclarse para no violar las llamadas reglas de compatibilidad de tipos, las cuales, por ejemplo, no
permiten mezclar caracteres con nmeros o nmeros con expresiones lgicas.
Expresiones de caracteres
Los operandos bsicos son literales, constantes simblicas o variables de tipo carcter. Las
llamadas a funciones que devuelven caracteres tambin son expresiones de caracteres. Con los
caracteres simples en general no se opera, pero en C++ (no en C) podemos comparar las cadenas
de caracteres con los operadores relacionales <, >, <=, >=, == y !=, y tambin podemos unirlas con
el operador de concatenacin +, es decir, la expresin "Hola, " + "que tal!" nos produce
"Hola, que tal!".
Expresiones numricas
Los operandos bsicos son literales, constantes simblicas o variables de tipo numrico. Estas
expresiones se forman combinando operandos numricos con los operadores aritmticos +, -,
*
,
/, % y los parntesis (). Pueden contener llamadas a funciones que devuelvan valores numricos
como sqrt(), sin(), floor()... denidas en la biblioteca matemtica estndar de C (vase la
seccin A.2).
Expresiones lgicas
Son expresiones que devuelven true o false, llamadas de tipo lgico. Pueden ser variables,
constantes simblicas o llamadas a funciones que devuelvan valores de tipo lgico. Las compara-
ciones formadas con los operadores relacionales <, >, <=, >=, == y != tambin son expresiones de
tipo lgico, aunque sus operandos pueden ser de cualquier tipo cuyos dominios estn ordenados,
como los nmeros o los caracteres.
Las expresiones lgicas pueden agrupar subexpresiones lgicas con los operadores lgicos de
conjuncin, &&, disyuncin, ||, o negacin, !, y los parntesis.
Precedencia de operadores
Siempre que no se violen las reglas de compatibilidad de tipos, en una expresin pueden aparecer
distintos tipos de operadores, los cuales se operan en el orden que indiquen los parntesis escritos
en la expresin y segn el orden que les corresponda por su precedencia. La tabla 2 muestra la
precedencia de operadores de mayor a menor prioridad.
44 Tipos predenidos
Tipo Operadores Asociatividad
De agrupacin () izquierda a derecha
De acceso . [] -> izquierda a derecha
Unarios ++ -- + - ! derecha a izquierda
Multiplicativos
*
/% izquierda a derecha
Aditivos + - izquierda a derecha
Entrada/salida << >> izquierda a derecha
Relacional < > <= >= izquierda a derecha
Igualdad == != izquierda a derecha
AND lgico && izquierda a derecha
OR lgico || izquierda a derecha
Condicional ?: derecha a izquierda
Asignacin = += -=
*
= /= %= derecha a izquierda
Secuencia , izquierda a derecha
Tabla 2: Precedencia de operadores.
Compatibilidad de tipos
C/C++ realiza las siguientes conversiones de tipos implcitas:
Cuando se mezclan operandos numricos enteros y/o reales en una expresin, el tipo de la
expresin se promociona al ms preciso y/o al de mayor tamao.
Cuando una expresin de tipo numrico se asigna a una variable del mismo tipo pero de
menor precisin, la expresin se convierte al tipo de la variable destino, perdindose la
precisin.
Los caracteres en realidad se almacenan con su cdigo ascii, por lo que C/C++ los admiten
en expresiones de tipo entero, pero no es recomendable mezclar caracteres con nmeros.
Aunque las expresiones enteras utilizadas como expresiones lgicas es un concepto herededa-
do de C, tanto en C como en C++ pueden emplearse expresiones enteras en las condiciones,
considerndose falso el valor 0, y verdadero cualquier valor distinto de 0.
Por otro lado, son posibles las conversiones de tipo explcitas que tengan sentido. Para ello, en
las expresiones se puede utilizar el llamado cast con el nombre de tipo destino entre parntesis al
estilo C:
(tipo) expresion
o bien al estilo C++, llamando al tipo como si fuera una funcin:
tipo (expresion)
3.6. Tipos predenidos
Los tipos predenidos son los tipos carcter o numricos simples, tambin llamados escalares.
Aunque no se considera escalar, en C++ se puede utilizar tambin como predenido el tipo cadena,
string, si se incluye la biblioteca estndar de cadenas de caracteres <string>
1
. Sus dominios
estn ordenados, por lo que puede utilizarse los operadores relacionales con cualquiera de ellos.
Por otro lado, el tipo lgico es un tipo simple y predenido en C++, pero no en C.
Todos los tipos predenidos, a excepcin de los numricos de tipo real, son ordinales porque
cada valor tiene un sucesor y un predecesor nicos (excepto el primer y ltimo valor, lgicamente).
Las cadenas, al no ser escalares, tampoco se consideran ordinales.
1
No confundir con la biblioteca estndar <cstring> de C.
Captulo 3. Introduccin a C/C++ 45
La tabla 3 muestra los tipos predenidos indicando si almacenan signo y sus variantes segn
su tamao.
Caracteres char
(ordinales) unsigned char
Cadenas de caracteres string
(no escalares) (Slo en C++)
Nmeros naturales unsigned short [int]
(ordinales) unsigned int
unsigned long [int]
unsigned long long [int]
Nmeros enteros short [int]
(ordinales) int
long [int]
long long [int]
Nmeros reales: float
(no ordinales) double
long double
Valores lgicos: bool
(ordinales: false<true) (Slo en C++)
Tabla 3: Tipos predenidos en C/C++.
3.7. Denicin de datos
Variables
Todas las variables deben denirse antes de ser usadas. Tienen alcance de bloque (block sco-
pe), por lo que slo pueden utilizarse dentro del bloque donde se denen (vase seccin 3.9 ms
adelante). Pueden denirse sin inicializar:
tipo identificador;
o con un valor inicial:
tipo identificador = constante;
La constante puede ser un literal o bien una constante simblica previamente denida que
sea de tipo compatible con el tipo de la variable.
Constantes simblicas
En C++ se preere utilizar la palabra reservada const para su denicin:
const tipo identificador = constante;
donde la constante puede ser un literal o bien otra constante simblica previamente denida
que sea de tipo compatible. Pero en C se preere utilizar la directiva define del preprocesador,
la cual no asigna ningn tipo a la constante:
#define identificador constante
3.8. La asignacin
Es la sentencia de transferencia de datos por excelencia en C/C++. Su sintaxis es la siguiente:
46 Bloque
valorL = valorR;
Simplemente transere el resultado obtenido despus de evaluar valorR a la posicin de
memoria indicada por valorL
2
. Ntese que el sentido de la transferencia es de derecha a izquierda
y que el operador = no tiene nada que ver con la comparacin de igualdad.
El valorR puede ser cualquier expresin, pero el valorL debe ser una variable o cualquier otra
referencia vlida a una posicin de memoria, tal como muestran los siguientes ejemplos:
float a, b, c;
// ejemplos validos
a = 4.0;
a = c;
a = b + c;
b = 2
*
sin(a) + c;
// en los ejemplos siguientes el valorL no es valido
a + b = 3.0; // 3.0 se guarda en a o en b?
sin(a) = a; // sin(a) no es una posicion de memoria
4 = a; // 4 tampoco es una posicion de memoria
Cuando el valorL es una expresin que no referencia una posicin de memoria, es tpico el
siguiente mensaje con el que responden los compiladores o alguno similar:
error: lvalue required as left operand of assignment
E/S bsica
En C++ se utiliza la biblioteca estndar moderna <iostream>:
#include <iostream>
using namespace std;
...
cout << expresion << expresion << ...; // salida
cin >> variable >> variable >> ...; // entrada
Los tipos de las expresiones y variables pueden ser cualesquiera de los predenidos, incluyendo
cadenas de caracteres. En el caso de la lectura de cadenas, slo se lee hasta el primer blanco
(espacio, tabulador o carcter de n de lnea).
3
En C slo podemos utilizar la biblioteca tradicional <stdio.h>:
4
#include <stdio.h>
...
printf("formato", expresion, expresion, ...); // salida
scanf("formato", variable, variable, ...); // entrada
Ntese en ambos casos que la entrada debe producirse siempre sobre variables o valoresL que
hagan referencia a una posicin de memoria donde se pueda guardar el valor que entra. El valor
de salida en cambio puede ser cualquier expresin o valorR.
3.9. Bloque
Agrupacin de sentencias entre llaves {} que pueden incluso anidar otros bloques. Suelen
formar parte de las sentencias de control de ujo.
2
La L y la R vienen del ingls, left y right, por estar a la izquierda y a la derecha del operador = respectivamente.
3
Para leer una lnea completa, utilcese la funcin getline de la biblioteca (ver seccin A.1).
4
Vase algn libro de programacin en C para ms informacin.
Captulo 3. Introduccin a C/C++ 47
{
sentencias
{ // bloque anidado
sentencias
}
sentencias
{ // otro bloque anidado
sentencias
}
}
3.10. Sentencias de seleccin
Son sentencias de control de ujo que permiten seleccionar qu sentencias se ejecutan a conti-
nuacin en funcin del valor verdadero o falso que toma una condicin. Todas las condiciones son
expresiones de tipo lgico.
Seleccin genrica
if (condicion) {
sentencias
}
else if (condicion) { // opcional
sentencias
}
else if (condicion) { // opcional
sentencias
}
...
else { // opcional
sentencias
}
48 Sentencias de repeticin
Seleccin basada en una expresin comn
La expresin switch permite seleccionar sentencias en funcin del valor que toma una ex-
presin. Se ejecutan las sentencias del caso coincidente con el valor que toma la expresin. La
expresin debe ser de tipo ordinal, es decir, escalar pero no de tipo real.
switch (expresion) {
case valor11: case valor12: ...
sentencias;
break;
case valor21: case valor22: ...
sentencias;
break;
...
default:
sentencias;
}
Aunque la sentencia break es opcional, su ausencia provoca la ejecucin de las sentencias de
todos los casos por debajo del caso coincidente hasta el siguiente break o hasta el nal de la
sentencia switch.
3.11. Sentencias de repeticin
Son sentencias de control de ujo que permiten ejecutar un bloque de sentencias mientras sea
verdadero la condicin de control del bucle. Esta condicin se evala despus o antes de cada
repeticin o iteracin. Los bucles pre-test evalan la condicin antes de cada iteracin, mientras
que los post-test la evalan despus de cada iteracin.
Bucles pre-test
while (condicion) {
sentencias
}
for (expresion; condicion; expresion) {
sentencias
}
La primera expresion del for slo se ejecuta una vez antes de empezar el bucle. La condicin
antes de cada iteracin. Y la ltima expresin se ejecuta despus de cada iteracin completa, justo
antes de la siguiente evaluacin de la condicin de control.
Captulo 3. Introduccin a C/C++ 49
Bucle post-test
do {
sentencias
} while (condicion);
3.12. Subprogramas
Permiten ejecutar bloques de sentencias que se denen una sola vez en el programa, pero que
pueden l lamarse mltiples veces con diferentes datos o parmetros. Estos parmetros pueden ser
de entrada, cuando suministran informacin al subprograma llamado para realizar sus clculos, o
pueden ser de salida si devuelven informacin que ha calculado el subprograma. Tambin pueden
ser de entrada-salida.
Los parmetros que aparecen dentro del subprograma se llaman formales, o cticeos
5
, mientras
que los que aparecen en las llamadas son los parmetros reales. Esto es as porque los parmetros
de los subprogramas no cobran vida mientras no sean llamados y sustituidos por un dato real,
que ya existe en memoria. Al terminar el subprograma, los parmetros cticeos desaparecen de la
memoria del proceso.
Cada parmetro formal denido en la cabecera del subprograma especica el tipo del corres-
pondiente parmetro real que aparece en la llamada en el mismo orden, de tal manera que el tipo
del parmetro real debe ser compatible con el que indica el parmetro formal.
3.12.1. Procedimientos
Los procedimientos no devuelven nada como valor de funcin por lo que no actan como las
tpicas funciones matemticas, y la informacin de salida la devuelven siempre en parmetros de
salida o por algn dispositivo de salida como la pantalla. Antes de realizarse llamadas, hay que
denir el procedimiento:
void Identificador(definicion param_formal1,
definicion param_formal2, ...)
{
sentencias
}
La llamada a un procedimiento es una sentencia por s sola:
Identificador(param_real1, param_real2, ...);
3.12.2. Funciones
Las funciones son subprogramas que pueden simular las llamadas a las tpicas funciones ma-
temticas, ya que devuelven el valor que toma la propia funcin a travs de la sentencia return,
la cual debe aparecer al menos una vez dentro del subprograma, y preferentemente una sola vez
al nal. En la denicin debe especicarse el tipo del valor devuelto:
5
En ingls dummy arguments.
50 Tipos denidos por el programador
tipo Identificador(definicion param_formal1,
definicion param_formal2, ...)
{
sentencias
return expresion; // del tipo de la funcion
}
La llamada a una funcin en realidad no es una sentencia, sino un valor que normalmente
estar dentro de una expresin compatible con el tipo del valor que toma la funcin.
... Identificador(param_real1, param_real2, ... ) ...
Por supuesto, la funcin se evala antes que la expresin donde aparece la llamada.
3.12.3. Parmetros
Ya hemos dicho que los parmetros puede ser de entrada o salida segn la direccin hacia donde
uya la informacin. Los parmetros de entrada deben estar inicializados antes de la llamada, ya
que es informacin de entrada al subprograma. Los parmetros de salida deben modicarse al
menos una vez dentro del cuerpo del subprograma, ya que es la informacin que generar el
subprograma. Los parmetros de salida no necesitan ser inicializados antes de realizar la llamada,
pero los de entrada-salida s.
Puesto que los parmetros de salida y de entrada-salida van a contener la informacin generada
por el subprograma despus de la llamada, el parmetro real de la llamada debe ser una variable
o valorL que haga referencia a una posicin de memoria donde se guardar el resultado. Se dice
que se pasan por referencia. La denicin del parmetro formal utiliza el carcter & detrs del
tipo:
tipo Subprograma( ..., tipo & param_formal, ...)
Sin embargo, los parmetros reales de entrada pueden ser cualquier expresin compatible con
el correspondiente parmetro formal. En realidad, se crea una copia nueva del parmetro real, ya
que el original no es necesario modicarlo. Se dice que se pasa por valor. Aunque no es obligatorio,
es conveniente poner el calicador const delante del tipo en la denicin del parmetro formal
para que el compilador avise cuando se modique un parmetro de entrada, lo que normalmente
no es necesario:
tipo Subprograma( ..., const tipo param_formal, ...)
Una tercera posibilidad, habitual en el paso de variables de tipo compuesto de entrada, es
pasarlos por referencia constante. Esto evita la sobrecarga de la copia innecesaria de registros que
podran ocupar mucho espacio de memoria y, aunque hagan referencia directa al parmetro real,
se protegen para que dentro del subprograma no se modique accidentalmente. En este caso se
debe poner tanto la palabra const como el carcter & en la denicin del parmetro formal (ver
seccin 3.13.1).
3.13. Tipos denidos por el programador
Son tipos no predenidos por el lenguaje, pero que puede denir el programador basndose
en los tipos predenidos elementales o en otros tipos denidos anteriormente por el programador.
En general, los tipos compuestos o estructurados debe denirlos el programador para especicar
el tamao y tipo de cada uno de sus componentes.
La denicin de un tipo compuesto puede hacerse de forma explcita, dndole un nombre con
la sentencia typedef. En una sentencia posterior se utilizar ese nombre para denir las variables
Captulo 3. Introduccin a C/C++ 51
de ese tipo compuesto como un tipo predenido. Pero C/C++ admiten la denicin de arrays de
forma implcita, sin nombre, en la misma sentencia que se dene la variable, como veremos en la
seccin 3.13.2.
3.13.1. Registros
Un registro es una coleccin heterognea (de tipos distintos) de variables o campos que se
acceden con el nombre comn de todo el registro y un nombre nico que identica el campo
dentro del registro. El tipo de cada campo puede ser cualquiera.
La denicin de un tipo registro se hace con la sentencia typedef utilizando adems la palabra
reservada struct propia de los registros. A continuacin y entre llaves {} se dene cada campo
con su tipo como si fueran variables locales al registro.
// definicion del tipo registro
typedef struct {
int dni;
string nombre;
string domicilio;
float estatura;
float peso;
} TPersona; // nombre del tipo nuevo
Una vez denido el tipo registro, la denicin de variables registro es similar a la habitual,
pudindose inicializar incluyendo entre { } los valores de cada campo separados por comas:
// definicion de 3 registros
TPersona empleado, directivo, becario;
// los campos se pueden inicializar por orden de definicion
TPersona maquinista = {
12345678,
"Pepito Grillo",
"C/La que sea, 3, Villarriba de Abajo",
1.83, // metros
95.3 // kilos
};
Y la denicin de registros constantes es muy parecida a la de los registros variables, pero con
la palabra reservada const que evita su posterior modicacin:
const TPersona DomenicoEscarlati = {
31283130,
"Domenico Escarlati Perolo",
"C/ Brieva del Verano, 31, Messina",
1.70,
72.2,
};
Los campos de los registros se pueden utilizar exactamente igual que las variables del mismo
tipo. Se acceden con el nombre comn del registro, el operador de acceso . y el nombre del campo
sin dejar espacios en blanco entre ellos:
maquinista.dni = 87654321;
maquinista.nombre = "Juanito Cigarra";
if (empleado.peso < 100) ...
return maquinista.estatura;
52 Tipos denidos por el programador
La alternativa tradicional de C para denir registros no utiliza la palabra reservada typedef
y el nombre del tipo registro cambia de posicin:
// definicion del tipo registro
struct DatosPersona { // nombre del tipo nuevo
int dni;
string nombre;
string domicilio;
float estatura;
float peso;
};
// definicion de 3 registros
struct DatosPersona empleado, directivo, becario;
Los registros completos se pueden:
Inicializar total o parcialmente en la denicin.
Pasar como parmetros a subprogramas.
Asignar con una sola sentencia =.
Devolver como valor de una funcin con la sentencia return.
Pero no se puede:
Enviarlos al ujo cout. Hay que hacerlo campo a campo.
Aceptarlos del ujo cin. Hay que leerlos campo a campo.
Registros como parmetros a subprogramas
La denicin de un registro como parmetro formal de un subprograma es similar a las de tipo
predenido. La nica salvedad es cuando los registros son parmetros de entrada de gran tamao.
Entonces se utiliza el paso por referencia constante para evitar la copia de muchos datos:
// registros como parametros de entrada
void Subprograma(const TPersona persona) // por valor
void Subprograma(TPersona persona) // por valor
void Subprograma(struct DatosPersona persona) // por valor
void Subprograma(const TPersona & persona) // por ref. cte.
// registros como parametros de salida o entrada/salida
void Subprograma(TPersona & persona) // por ref.
void Subprograma(struct DatosPersona & persona) // por ref.
3.13.2. Arrays
Un array es una coleccin homognea de datos o componentes de un mismo tipo base con un
nombre comn, y colocadas consecutivamente en memoria ordenadas por un ndice, de tal forma
que cada posicin del array se identica de forma nica con un valor del ndice, el cual en ltima
instancia es un nmero natural. En C/C++ la primera posicin es siempre la 0.
El tipo base de cada componente puede ser cualquiera, incluso otro tipo compuesto denido
anteriormente.
El siguiente ejemplo dene un tipo compuesto con nombre utilizando la sentencia typedef:
Captulo 3. Introduccin a C/C++ 53
const int Longitud = 12;
// definicion del tipo array
typedef int TArrayZ[Longitud]; // indice de 0 a Longitud-1
// definicion de 3 arrays de enteros
TArrayZ a, b, c; //sin inicializar
TArrayZ r = {234, -86, -978, 312}; // inicializado parcialmente
// constante array
const TArrayZ s =
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Es posible la denicin de arrays sin especicar el nombre del tipo:
int a[Longitud]; // indice de 0 a Longitud-1
El acceso con el operador [] permite utilizar las componentes exactamente igual que si fueran
variables del tipo base, teniendo mucho cuidado de que el ndice utilizado no produzca un error
de rango:
// asigna la 2da. componente de b a la 1ra. de a
a[0] = b[1];
// error de rango, la ultima es [Longitud-1]
... a[Longitud] ...
// las componentes deben ser de tipo simple
if (a[0] < c[b]) ...
// devolucion de la ultima componente de c
return c[Longitud-1];
Con los arrays completos slo se permiten algunas operaciones:
Inicializarlos total o parcialmente en la denicin.
Pasarlos como parmetros a subprogramas.
No se permite en cambio:
La asignacin de arrays completos con una sola sentencia =.
La asignacin de valores individuales entre llaves {} con una sola sentencia =, salvo en la
inicializacin.
La devolucin como valor de una funcin con la sentencia return.
El envo de un array completo al ujo cout, salvo que sea un array de caracteres.
La aceptacin de un array completo del ujo cin, salvo que sea un array de caracteres.
Arrays como parmetros a subprogramas
En C/C++ no se puede pasar por valor un array, siempre se pasan por referencia, por lo que el
uso de & es meramente orientativo, ponindose slo en la cabecera del subprograma para indicar
que es un array de salida. Si el array es de entrada, no se pondr el &, pero slo poniendo el
calicador const en la denicin del parmetro formal nos aseguraremos de que no se modicar
accidentalmente el contenido del array que se pase en la llamada. Los siguientes ejemplos muestran
la denicin de arrays como parmetros formales en subprogramas:
54 Tipos denidos por el programador
typedef float TVector[4];
float MirarVector(const TVector v) // paso por ref. constante
// v es un parametro de entrada y no se va a modificar
{
...
}
void ModificarVector(TVector &v) // paso por ref.
// v es un parametro de salida y seguramente se va a modificar
{
...
}
float ProcesarVector(TVector v) // paso por ref.
// puede que v se modifique o puede que no
{
...
}
Los ejemplos anteriores se pueden reescribir sin utilizar el nombre de tipo TVector. Sin em-
bargo, hay que especicar el tamao en cada funcin aumentado la posibilidad de error:
float MirarVector(const float v[4]) // paso por ref. constante
{
...
}
void ModificarVector(float (&v)[4]) // paso por ref.
{
...
}
float ProcesarVector(float v[4]) // paso por ref.
{
...
}
Una tercera posibilidad es no especicar el tamao de un un array en la cabecera de un funcin,
dando lugar a los llamados arrays abiertos que dejan abierta su longitud, la cual se espera se pase
en otro parmetro:
Captulo 3. Introduccin a C/C++ 55
float MirarVector(const float v[], const int n)
{
...
}
void ModificarVector(float (&v)[], const int n)
// error de compilacion:
// no es posible utilizar el & con los arrays abiertos
{
...
}
float ProcesarVector(float v[], const int n)
{
...
}
Cuando se pasa un array en las llamadas, simplemente se pone el nombre sin los corchetes, a
no ser que quiera pasarse slo algn componente individual:
TVector v;
float a, b;
...
ModificarVector(v); // se pasa el array completo
...
a = b + sin(v[0])
*
cos(v[1]); // se pasa un solo float
Arrays multidimensionales
Es posible la denicin de arrays multidimensionales especicando varios ndices. Por supuesto,
ahora para acceder a una posicin individual se necesita tantos ndices como haya en la denicin:
typedef float TMatriz3D[3][8][10]; // definicion del tipo
TMatriz3D m1, m2; // definicion de 2 matrices 3D
// asigna un valor a la primera posicion
m1[0][0][0] = ...
// acceso al valor de la ultima posicion
... = ... m2[2][7][9] ...
// acceso invalido, error de rango.
... = ... m2[0][8][0] ...
Si se pasa un array multidimensional como array abierto, en la denicin del parmetro formal
debe suministrarse los tamaos de todas las dimensiones excepto la ms signicativa:
int MirarVector3D(const int v[][8][10], const int n)
{
// se supone que n es la dimension mas significativa
...
}
Tambin es posible la denicin del tipo matriz especicando como tipo base otro tipo array
denido previamente con la sentencia typedef. Esto posibilita utilizar esos tipos de forma inde-
pendiente, por ejemplo para pasar como parmetro parte de una matriz:
56 Tipos denidos por el programador
...
const int NE =10;
const int NF = 8;
const int NC = 3;
typedef float TFila[NE]; // 10 elementos float en una fila
typedef TFila TCapa[NF]; // 8 filas en una capa
typedef TCapa TMatriz3D[NC]; // 3 capas en la matriz 3D
TMatriz3D m1, m2; // definicion de 2 matrices 3D
float SumarFila(const TFila fila)
{
float suma=0;
for (i=0; i<NE; i++)
suma += fila[i];
}
return suma;
}
int main()
{
TMatriz3D m;
float suma2filas;
...
// no hace falta pasar toda la matriz
suma2filas = SumarFila(m[0][0]) + SumarFila[0][NF-1]);
cout << "Suma de la primera y ultima filas de la primera capa: "
<< suma2filas;
...
}
Cadenas
En C++ existe la clase string que se puede utilizar como tipo de datos para almacenar
cadenas de caracteres. Para ello se incluye la biblioteca estndar <string> que adems dispone
de muchas funciones para realizar operaciones con cadenas sin tener que programarlas. En este
caso las cadenas son objetos y la sintaxis para las llamadas utilizan el operador . como si el
objeto (la cadena) fuese un registro (vase pgina 60).
Las cadenas de tipo string pueden tambin devolverse como valor de una funcin, a diferencia
de los arrays de caracteres que veremos a continuacin.
Las cadenas de caracteres tambin puede ser simplemente arrays cuyo tipo base es char, al
estilo de C tradicional. Pero ahora hay que tener en cuenta la longitud mxima del array que
contiene la cadena, la cual es ja y siempre ser mayor o igual que su longitud efectiva, que puede
variar a lo largo de la vida del programa. En estas cadenas, el ltimo carcter efectivo lo lo indica
el carcter ascii 0: '\0'.
Captulo 3. Introduccin a C/C++ 57
const int Longitud = 32;
// definicion del tipo cadena
typedef char TCadena[Longitud]; // indice de 0 a Longitud-1
// definicion de cadenas
TCadena s0, s1;
TCadena s2 = { H, o, l, a, \0 };
TCadena s3 = "Hola" ; // ya tiene el \0;
// se permite la entrada/salida de cadenas completas
cin >> s0;
cout << "Hola, que tal\n";
Las cadenas completas, salvo la entrada/salida, tienen las mismas restricciones de uso que el
resto de arrays.
La biblioteca de cadenas estndar de C <string.h> tiene programadas las operaciones ms
habituales de cadenas, las cuales son simplemente arrays de caracteres. En este caso son funciones
normales y la mayora presuponen que existe el terminador al nal de la cadena antes del nal
fsico del array (vase pgina 61).
3.13.3. Anidamientos
Tanto el tipo base de un array, como el de los campos de un registro pueden ser otro tipo com-
puesto, posibilitando la denicin y uso de muchos tipos de estructuras de datos. A continuacin
se muestran ejemplos.
Anidamientos dentro de registros. En estos casos el tipo de uno de los campos es otro tipo
compuesto previamente denido.
typedef struct {
dia, mes, anio;
} TFecha; // definicion del tipo TFecha
typedef struct {
int dni;
string nombre;
string domicilio;
TFecha f_nacim;
float estatura;
float peso;
} TJugador; // definicion del tipo TJugador
TJugador delantero; // definicion del registro delantero
// accesos posibles
... delantero.nombre ... // nombre del delantero
... delantero.f_nacim ... // registro con fecha de nacimiento
... delantero.f_nacim.dia ... // dia de nacimiento del delantero
... delantero.f_nacim.mes ... // mes de nacimiento del delantero
Anidamientos dentro de arrays. Aqu simplemente se pone como tipo base del array otro
tipo compuesto previamente denido.
58 Tipos denidos por el programador
// definicion del tipo array para un maximo de 20 jugadores
typedef TJugador TEquipo[20];
// definicion de 2 arrays de 20 jugadores como maximo
TEquipo visitante, locales;
// accesos posibles
... visitante[0].nombre ... // nombre primer jugador visitante
... visitante[0].f_nacim ... // fecha de nacimiento completa
... visitante[i].f_nacim.anio ... // nacimiento del jugador i
...
Apndice A
Bibliotecas estndares de C/C++
A.1. Bibliotecas de C++
A.1.1. Entrada/salida: <iostream>
En C++ la escritura en pantalla y lectura de teclado se realiza con los ujos estndares de
entrada/salida, que son objetos, y como tales, las llamadas a sus operaciones (o mtodos) se realizan
con el operador de acceso ..
El ujo estndar de entrada es cin y, por defecto es el teclado, aunque desde el sistema
operativo (sin modicar el programa) puede redirigirse a un chero o a otro dispositivo. Los ujos
de salida son cout, que es la salida estndar, y cerr, que es la salida de errores. Al igual que
el ujo de entrada, ambos pueden redirigirse desde el sistema operativo de forma separada. La
siguiente tabla muestra tan slo una parte de sus posibilidades.
Entrada de nmeros o caracteres saltando espacios precedentes:
cin >> variable >> variable >> ...
Salto de los espacios pendientes de leer:
cin >> ws
Lectura de un carcter sin saltar espacios:
char c = cin.get()
Lectura de una lnea completa de texto:
getline(cin, s) //tipo string
Salida de nmeros o caracteres:
cout << expresion << expresion << ...
cerr << expresion << expresion << ...
Vaciado de la salida pendiente:
cout << flush
cerr << flush
Envo a la salida de un salto de lnea:
cout << endl
cerr << endl
A.1.2. Manejo de cheros: <fstream>
En C++ los cheros se consideran ujos (stream) como los ujos estndares cin, cout y
cerr, por lo que su manejo es muy similar a stos. Las operaciones bsicas con ujos de e/s son:
59
60 Bibliotecas de C++
Denicin de ujos
ifstream fi chero de entrada
ofstream fo chero de salida
fstream f chero de entrada/salida
Apertura y cierre de ujos
fi.open("nombre.dat") modo de entrada
fo.open("nombre.dat") modo de salida
f.open("nombre.dat", ios::in) modo de entrada
f.open("nombre.dat", ios::out) modo de salida
f.open("nombre.dat", ios::binary) modo binario
fo.open("nombre.dat", ios::app) modo salida para aadir al nal
f.open("nombre.dat", ios::in|ios::out) modo de entrada/salida
f.close() cierre del ujo f
Lectura y escritura en ujos
f >> variable >> variable >> ... lectura del ujo f
f.get(c) lectura de un carcter
f.getline(cadena, tam) lectura de una lnea f
(mximo tam caracteres)
f << expresion << expresion << ... escritura en el ujo f
A.1.3. Manejo de cadenas de caracteres: <string>
En C++ las cadenas se manejan como si fueran objetos de la clase string. Las siguiente
relacin de funciones da una idea de la potencia de la clase string de C++:
Denicin
string s, s1, s2 Dene las cadenas s, s1 y s2.
string s2="vinicial" Dene la cadena s2 y la inicializa.
string s(s2) Dene la cadena s y la inicializa con s2.
Entrada/salida
getline(cin,s) Lee una lnea de teclado en s.
Longitud y acceso individual
s.length() Devuelve la longitud efectiva (tipo int) de s.
c = s[0] Pone en la variable c (char) el primer carcter de s.
c = s[s.length()-1] Pone en c el ltimo carcter de s.
Asignacin
s = "valor" Asigna la cadena valor a s.
s[i] = c Modica s[i] con el carcter c.
s = s2 Asigna la cadena s2 a s.
s += s2 Concatena la cadena s2 al nal de s.
s = s1 + s2 Asigna a s la concatenacin de s1 y s2.
s.append(s1+s2) Aade a s la concatenacin de s1 y s2.
Comparaciones
s == s2 Devuelve true si s y s2 son iguales.
s < s2 Devuelve true si s es menor que s2 por orden ascii.
r = s.compare(5,3,s2) Pone en r (int) el valor 0 si s==s2, -1 si s<s2, y +1 si
s>s2.
Bsqueda y sustitucin
pos = s.find(s2) Posicin (int) donde empieza la subcadena s2 dentro de
s.
s2 = s.substr(5,3) Devuelve en s2 la subcadena de 3 caracteres de s que em-
pieza en la posicin 5.
s.replace(5,3,s2) Reemplaza los 3 caracteres de s que empiezan en la posicin
5 por la cadena s2.
s.insert(5,s2) Inserta en s a partir de la posicin 5 la cadena s2.
Captulo A. Bibliotecas estndares de C/C++ 61
A.2. Bibliotecas de C
En C++ se pueden declarar sus cabeceras (headers) bien al estilo original de C:
#include <biblioteca.h>
o bien al estilo propio de C++, con una letra c delante, y formando parte del espacio de nombres
estndar:
#include <cbiblioteca>
using namespace std;
En las siguientes secciones podemos ver algunas de las funciones ms habituales de las biblio-
tecas estndares de C.
A.2.1. E/S bsica: <cstdio>
La e/s al estilo de C se basa en una cadena de caracteres, el formato del primer argumento,
que especica el tipo y orden de los siguientes argumentos que se quieren leer o escribir. En los
libros de programacin de C se podr encontrar ms informacin.
scanf(formato, &arg1, &arg2, ...) Entrada de teclado.
printf(formato, arg1, arg2, ...) Salida en pantalla.
A.2.2. Manejo de caracteres: <cctype>
La biblioteca de C tambin dispone de funciones que realizan ciertas preguntas a nivel de
caracteres simples:
isalnum(caracter) Devuelve verdadero si es alfanumrico.
isalpha(caracter) Devuelve verdadero si es alfabtico.
iscntrl(caracter) Devuelve verdadero si es dgito de control.
isdigit(caracter) Devuelve verdadero si es dgito.
isgraph(caracter) Devuelve verdadero si es carcter.
islower(caracter) Devuelve verdadero si es minscula.
isupper(caracter) Devuelve verdadero si es mayscula.
isspace(caracter) Devuelve verdadero si es , \f, \n, \r, \t o \v.
isprint(caracter) Devuelve verdadero si es imprimible.
ispunct(caracter) Devuelve verdadero si es especial.
isxdigit(caracter) Devuelve verdadero si es dgito hexadecimal.
tolower(caracter) Devuelve el carcter en minsculas.
toupper(caracter) Devuelve el carcter en maysculas.
A.2.3. Manejo de cadenas de caracteres: <cstring>
Como C maneja las cadenas de caracteres como si fueran arrays, la biblioteca <cstring>
pone a disposicin del programador funciones espec

ficas para los arrays con tipo base carcter:


strcpy(destino, fuente) Copia la cadena fuente en la cadena destino.
strcat(destino, fuente) Concatena la cadena fuente al nal de la cadena destino.
strcmp(cad1, cad2) Compara las cadenas cadena1 y cadena2 y
devuelve un entero negativo si cadena1<cadena1,
0 si cadena1==cadena1, y positivo si
cadena1>cadena1.
strlen(cadena) Devuelve la longitud de cadena.
62 Bibliotecas de C
A.2.4. Utilera estndar: <cstdlib>
Esta biblioteca ofrece funciones de ndole diversa que facilitan el trabajo al programador. La
siguiente relacin muestra tan solo algunas de ellas:
atoi(cadena) Convierte la cadena a un nmero entero.
atof(cadena) Convierte la cadena a un nmero real.
rand() Devuelve un nmero aleatorio entre 0 y RAND_MAX.
srand(semilla) Inicializa la secuencia de nmeros aleatorios (semilla de tipo int).
exit(status) Termina el programa devolviendo status de tipo int.
system(cadena) Ejecuta cadena en la lnea de comandos del sistema.
abs(x) Devuelve [x[ Z.
A.2.5. Matemtica: <cmath>
Esta biblioteca contiene las funciones matemticas ms habituales. Todas ellas las indicadas
trabajan con nmeros reales de tipo double. Hay que tener en cuenta que las trigonomtricas
trabajan con ngulos en radianes.
sqrt(x) Devuelve

x.
exp(x) Devuelve e
x
.
log(x) Devuelve log
e
(x).
log10(x) Devuelve log
10
(x).
pow(base, expo) Devuelve base
expo
.
fabs(x) Devuelve [x[ .
floor(x) Devuelve x|.
ceil(x) Devuelve x|.
sin(alfa) Devuelve sin(alpha).
cos(alfa) Devuelve cos(alpha).
tan(alfa) Devuelve tan(alpha).
asin(x) Devuelve sin
1
(x) en el rango [/2, /2].
acos(x) Devuelve cos
1
(x) en el rango [0, ].
atan(x) Devuelve tan
1
(x) en el rango [/2, /2].
atan(y,x) Devuelve tan
1
(y/x) en el rango [, ].

También podría gustarte