Algoritmos
Algoritmos
ALGORITMOS Y PROGRAMAS
1.1. Computadora y Sistema Operativo
1.1.1. Computadora
Según la RAE (Real Academia de la lengua española), una computadora es una máquina
electrónica, analógica o digital, dotada de una memoria de gran capacidad y de métodos de
tratamiento de la información, capaz de resolver problemas matemáticos y lógicos mediante la
utilización automática de programas informáticos.
Sin duda esta máquina es la responsable de toda una revolución que está cambiando el
panorama económico, social e incluso cultural. Debido a la importancia y al difícil manejo de
estas máquinas, aparece la informática como la ciencia orientada al proceso de información
mediante el uso de computadoras.
Una computadora consta de diversos componentes entre los que sobresale el procesador, el componente
que es capaz de realizar las tareas que se requieren al ordenador o computadora.
Unidades de
almacenamientos
CPU
Periféricos (Unidad central
Periféricos
de entrada de proceso) de salida
Otros
dispositivos
1
Este desglose de los componentes del ordenador es el que interesa a los programadores. Pero desde un
punto de vista más físico, hay otros componentes a señalar:
Procesador. Núcleo digital en el que reside la CPU del ordenador. Es la parte fundamental del ordenador, la
encargada de realizar todas las tareas.
Placa base. Circuito interno al que se conectan todos los componentes del ordenador, incluido el
procesador.
Memoria RAM. Memoria interna formada por un circuito digital que está conectado mediante tarjetas
a la placa base. Su contenido se evapora cuando se desconecta al ordenador. Lo que se almacena no es
permanente.
Unidades de almacenamiento. En realidad son periféricos, pero que sirven para almacenar de forma
permanente los datos que se deseen del ordenador. Los principales son el disco duro (unidad de gran
tamaño interna al ordenador), la disquetera (unidad de baja capacidad y muy lenta, ya en desuso), el
CD-ROM y el DVD.
Hardware
Se trata de todos los componentes físicos que forman parte de un ordenador: procesador, RAM,
impresora, teclado, ratón,...
Software
Se trata de la parte conceptual del ordenador. Es decir los datos y aplicaciones que maneja y que
permiten un grado de abstracción mayor. Cualquier cosa que se pueda almacenar en una unidad
de almacenamiento es software (la propia unidad sería hardware).
1.1.3. Sistema Operativo
Se trata del software (programa) encargado de gestionar el ordenador. Es la aplicación que oculta
la física real del ordenador para mostrarnos un interfaz que permita al usuario un mejor y más fácil
manejo de la computadora.
Permitir al usuario comunicarse con el ordenador. A través de comandos o a través de una interfaz
gráfica.
Coordinar y manipular el hardware de la computadora: memoria, impresoras, unidades de disco,
el teclado.
Proporcionar herramientas para organizar los datos de manera lógica (carpetas, archivos,...)
Proporcionar herramientas para organizar las aplicaciones instaladas.
Gestionar el acceso a redes
Gestionar los errores de hardware y la pérdida de datos.
2
Servir de base para la creación de aplicaciones, proporcionando funciones que faciliten
la tare de los programadores.
Administrar la configuración de los usuarios.
Proporcionar herramientas para controlar la seguridad del sistema.
Windows. A día de hoy el Sistema Operativo más popular (instalado en el 95% de computadoras
del mundo). Es un software propiedad de Microsoft por el que hay que pagar por cada licencia de
uso.
Linux. Sistema operativo de código abierto. Posee numerosas distribuciones (muchas de ellas
gratuitas) y software adaptado para él (aunque sólo el 15% de ordenadores posee Linux).
MacOs. Sistema operativo de los ordenadores MacIntosh.
Unix. Sistema operativo muy robusto para gestionar redes de todos los tamaños. ctualmente en
desuso debido al uso de Linux (que está basado en Unix).
Solaris. Versión de Unix para sistemas Sun.
1.2.1. Introducción
Sin duda una de las informaciones que más a menudo un ordenador tiene que manipular son los
números. Pero también el ordenador necesita codificar otro tipo de información, como por
ejemplo caracteres, imágenes, sonidos,...
EL problema es que para el ordenador toda la información debe estar en formato binario
(de unos y ceros). Por ello se necesita pasar todos los datos a ese formato.
3
1.2.2. Sistemas numéricos
A lo largo de la historia han existido numerosos sistemas de numeración. Para simplificar los
dividiremos en dos tipos:
Sistemas no posicionales. En ellos se utilizan símbolos cuyo valor numérico es siempre el mismo
independientemente de donde se sitúen. Es lo que ocurre con la numeración romana. En esta
numeración el símbolo I significa siempre uno independientemente de su posición.
Sistemas posicionales. En ellos los símbolos numéricos cambian de valor en función de la posición
que ocupen. Es el caso de nuestra numeración, el símbolo 2, en la cifra 12 vale 2; mientras que en
la cifra 21 vale veinte.
La historia ha demostrado que los sistemas posicionales son mucho mejores para los cálculos
matemáticos por lo que han retirado a los no posicionales.
Todos los sistemas posicionales tienen una base, que es el número total de símbolos que utiliza el
sistema. En el caso de la numeración decimal la base es 10, en el sistema binario es 2.
El Teorema Fundamental de la Numeración permite saber el valor decimal que tiene cualquier
número en cualquier base. Lo cual se hace con la fórmula:
3 2 1 0 -1 -2
...+ X3·B + X2·B + X1·B + X0·B + X-1·B + X-2·B +...
Donde:
Xi Es el símbolo que se encuentra en la posición número i del número que se está
convirtiendo. Teniendo en cuenta que la posición de las unidades es la posición 0 (la
posición -1 sería la del primer decimal)
B Es la base del sistemas que se utiliza para representar al número
Por ejemplo si tenemos el número 153,6 utilizando e sistema octal (base ocho), el paso a decimal
se haría:
Los números binarios son los que utilizan las computadoras para almacenar información. Debido
a ello hay términos informáticos que se refieren al sistema binario y que se utilizan continuamente.
Son:
BIT (de Binary diGIT). Se trata de un dígito binario, el número binario 1001 tiene cuatro BITS.
El método más utilizado es ir haciendo divisiones sucesivas entre dos. Los restos son las cifras
binarias. Por ejemplo para pasar el 39:
39:2 = 19 resto 1
19:2 = 9 resto 1
9:2 = 4 resto 1
4:2 = 2 resto 0
2:2 = 1 resto 0
1:2 = 0 resto 1
Suma
Se efectúa igual que las sumas decimales, sólo que cuando se suma un uno y otro uno, ese dice que
tenemos un acarreo de uno y se suma a la siguiente cifra. Ejemplo (suma de 31, en binario
10011, y 28, en binario, 11100)
Acarreo 1 1
1 1 1 1 1
1 1 1 0 0
1 1 1 0 1 1
Resta
El concepto es parecido sólo que en el caso de la resta es importante tener en cuenta el signo.
No se explica en el presente manual ya que se pretende sólo una introducción a os números
binarios. En la actualidad la resta se hace sumando números en
5
complemento a 2
Operaciones lógicas
Se trata de operaciones que manipulan BITS de forma lógica, son muy utilizadas en la informática.
Se basan en una interpretación muy utilizada con los números binarios en la cual el dígito 1 se
interpreta como verdadero y el dígito 0 se interpreta como falso.
Operación AND
La operación AND (en español Y), sirve para unir expresiones lógicas, se entiende que el resultado
de la operación es verdadero si alguna de las dos expresiones es verdadero (por ejemplo la
expresión ahora llueve y hace sol sólo es verdadera si ocurren ambas cosas).
En el caso de los dígitos binarios, la operación AND opera con dos BITS de modo que el resultado
será uno si ambos bits valen uno.
AND 0 1
0 0 0
1 0 1
La tabla superior se llama tabla de la verdad y sirve para mostrar resultados de operaciones
lógicas, el resultado está en la parte blanca, en la otra parte se representan los operadores.
El resultado será 1 si ambos operadores valen 1
Operación OR
OR (O en español) devuelve verdadero si cualquiera de los operandos es verdadero (es decir, si
valen 1). La tabla es esta:
OR 0 1
0 0 1
1 1 1
Operación NOT
Esta operación actúa sobre un solo BIT y lo que hace es invertirle; es decir, si vale uno valdrá cero,
y si vale cero valdrá uno.
NOT 0 1
1 0
Texto
6
Puesto que una computadora no sólo maneja números, habrá dígitos binarios que contengan
información que no es traducible a decimal. Todo depende de cómo se interprete esa traducción.
Por ejemplo en el caso del texto, lo que se hace es codificar cada carácter en una serie de números
binarios. El código ASCII ha sido durante mucho tiempo el más utilizado. Inicialmente era un
código que utilizaba 7 bits para representar texto, lo que significaba que era capaz de codificar
127 caracteres. Por ejemplo el número 65 (1000001 en binario) se utiliza para la A mayúscula.
Poco después apareció un problema: este código es suficiente para los caracteres del inglés, pero
no para otras lenguas. Entonces se añadió el octavo bit para representar otros 128 caracteres que
son distintos según idiomas (Europa Occidental usa unos códigos que no utiliza Europa
Oriental).
Una ampliación de este método es el código Unicode que puede utilizar hasta 4 bytes (32 bits) con
lo que es capaz de codificar cualquier carácter en cualquier lengua del planeta. Poco a poco es el
código que se va extendiendo.
Otros datos
En el caso de datos más complejos (imágenes, vídeo, audio) se necesita una codificación más
compleja. Además en estos datos no hay estándares, por lo que hay decenas de formas de
codificar.
En el caso, por ejemplo, de las imágenes una forma básica es la que graba cada píxel (cada punto
distinguible en la imagen) mediante tres bytes, el primero graba el nivel de rojo, el segundo el nivel
de azul y el tercero el nivel de verde. Y así por cada píxel.
Es un sistema que se utiliza mucho para representar números binarios. Un problema (entre otros)
de los números binarios es que ocupan mucho espacio para representar información. El sistema
hexadecimal es la forma de representar números en base 16. de modo que en los dígitos del 0 al 9
se utilizan los mismos símbolos que en el sistema decimal y a partir del 10 se utiliza la letra A y así
hasta la letra F que simboliza el 15.
Así el número hexadecimal CA3 sería:
7
Como se observa pasar de hexadecimal a decimal es complejo. La razón del uso de este sistema es
porque tiene una equivalencia directa con el sistema binario. De hecho en una cifra hexadecimal
caben exactamente 4 bits. Por ello la traducción de hexadecimal a binario se basa en esta tabla:
Hexadecimal Binario Hexadecimal Binario
0 0000 2 0010
1 0001 3 0011
4 0100
Así el número hexadecimal C3D4 sería el binario 1100 0011 1101 0100. 5 0101
Y el binario 01111011 1100 0011 sería el hexadecimal 7BC3
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111
1.3. Algoritmos
1.3.1. Noción de algoritmo
Según la RAE: conjunto ordenado y finito de operaciones que permite hallar la solución de un
problema.
Los algoritmos, como indica su definición oficial, son una serie de pasos que permiten
obtener la solución a un problema. La palabra algoritmo procede del matemático Árabe
Mohamed Ibn Al Kow Rizmi, el cual escribió sobre los años 800 y 825 su obra Quitad Al Mugabala,
donde se recogía el sistema de numeración hindú y el concepto del cero. Fibonacci, tradujo la
obra al latín y la llamó: Algoritmi Dicit.
El lenguaje algorítmico es aquel que implementa una solución teórica a un problema indicando las
operaciones a realizar y el orden en el que se deben efectuarse. Por ejemplo en el caso de que nos
encontremos en casa con una bombilla fundida en una lámpara, un posible algoritmo sería:
[2] En el caso de que las haya, sustituir la bombilla anterior por la nueva
8
[3] Si no hay bombillas de repuesto, bajar a comprar una nueva a la tienda y sustituir la vieja
por la nueva.
Los algoritmos son la base de la programación de ordenadores, ya que los programas de
ordenador se puede entender que son algoritmos escritos en un código especial entendible por un
ordenador.
Lo malo del diseño de algoritmos está en que no podemos escribir lo que deseemos, el lenguaje a
utilizar no debe dejar posibilidad de duda, debe recoger todas las posibilidades. Por lo que los tres
pasos anteriores pueden ser mucho más largos:
Cómo se observa en un algoritmo las instrucciones puede ser más largas de lo que parecen, por lo
que hay que determinar qué instrucciones se pueden utilizar y qué instrucciones no se pueden
utilizar. En el caso de los algoritmos preparados para el ordenador, se pueden utilizar sólo
instrucciones muy concretas.
Un algoritmo debe resolver el problema para el que fue formulado. Lógicamente no sirve
un algoritmo que no resuelve ese problema. En el caso de los programadores, a veces
crean algoritmos que resuelven problemas diferentes al planteado.
Los algoritmos son independientes del ordenador. Los algoritmos se escriben para poder
ser utilizados en cualquier máquina.
Los algoritmos deben de ser precisos. Los resultados de los cálculos deben de ser exactos,
de manera rigurosa. No es válido un algoritmo que sólo aproxime la solución.
Los algoritmos deben de poder repetirse. Deben de permitir su ejecución las veces que
haga falta. No son válidos los que tras ejecutarse una vez ya no pueden volver a hacerlo por
la razón que sea.
9
Características aconsejables para los algoritmos
[1] Análisis. En esta se determina cuál es exactamente el problema a resolver. Qué datos
forman la entrada del algoritmo y cuáles deberán obtenerse como salida.
1.4. Aplicaciones
Aplicación. Software formado por uno o más programas, la documentación de los mismos y los
archivos necesarios para su funcionamiento, de modo que el conjunto completo de archivos
forman una herramienta de trabajo en un ordenador.
Los primeros ordenadores cumplían una única programación que estaba definida en los
componentes eléctricos que formaban el ordenador.
La idea de que el ordenador hiciera varias tareas (ordenador programable o multipropósito) hizo
que se idearan las tarjetas perforadas. En ellas se utilizaba código binario, de modo que se hacían
agujeros en ellas para indicar el código 1 o el cero. Estos “primeros programas” lógicamente servían
para hacer tareas muy concretas.
La llegada de ordenadores electrónicos más potentes hizo que los ordenadores se convirtieran en
verdaderas máquinas digitales que seguían utilizando el 1 y el 0 del código binario pero que eran
capaces de leer miles de unos y ceros. Empezaron a aparecer los primeros lenguajes de
programación que escribían código más entendible por los humanos que posteriormente era
convertido al código entendible por la máquina.
Inicialmente la creación de aplicaciones requería escribir pocas líneas de código en el ordenador,
por lo que no había una técnica especificar a la hora de crear programas. Cada programador se
defendía como podía generando el código a medida que se le ocurría.
Poco a poco las funciones que se requerían a los programas fueron aumentando produciendo miles
de líneas de código que al estar desorganizada hacían casi imposible su mantenimiento. Sólo el
programador que había escrito el código era capaz de entenderlo y eso no era en absoluto
práctico.
La llamada crisis del software ocurrió cuando se percibió que se gastaba más tiempo en hacer las
modificaciones a los programas que en volver a crear el software. La razón era que ya se habían
codificado millones de líneas de código antes de que se definiera un buen método para crear los
programas.
La solución a esta crisis ha sido la definición de la ingeniería del software como un oficio que
requería un método de trabajo similar al del resto de ingenierías. La búsqueda de una
metodología de trabajo que elimine esta crisis parece que aún no está resuelta, de hecho los
métodos de trabajo siguen redefiniéndose una y otra vez.
Una de las cosas que se han definido tras el nacimiento de la ingeniería del software ha sido el ciclo
de vida de una aplicación. El ciclo de vida define los pasos que sigue el proceso de creación de una
aplicación desde que se propone hasta que finaliza su construcción. Los pasos son:
11
Análisis. En esta fase se determinan los requisitos que tiene que
Análisis cumplir la aplicación. Se anota todo aquello que afecta al futuro
funcionamiento de la aplicación. Este paso le realiza un analista
Diseño. Se especifican los esquemas de diseño de la aplicación. Estos
Diseño esquemas forman los planos del programador, los realiza el analista y
representan todos los aspectos que requiere la creación de la
aplicación.
Codificación Codificación. En esta fase se pasa el diseño a código escrito en algún
lenguaje de programación. Esta es la primera labor que realiza el
programador
Pruebas Pruebas. Se trata de comprobar que el funcionamiento de la aplicación
es la adecuada.
Mantenimiento. Tiene lugar una vez que la aplicación ha sido ya
Mantenimiento distribuida, en esta fase se asegura que el sistema siga funcionando
aunque cambien los requisitos para el que fue diseñado el software.
1.5. Programación
1.5.1. Introducción
La programación consiste en pasar algoritmos a algún lenguaje de ordenador a fin de que pueda
ser entendido por el ordenador. La programación de ordenadores comienza en los años 50 y su
evolución a pasado por diversos pasos.
La programación se puede realizar empleando diversas técnicas o métodos. Esas técnicas definen
los distintos tipos de programaciones.
10 X=RANDOM()*100+1;
20 PRINT “escribe el número que crees que guardo”
30 INPUT N
40 IF N>X THEN PRINT “mi numero es menor” GOTO 20
50 IF N<X THEN PRINT “mi numero es mayor” GOTO 20
60 PRINT “¡Acertaste!”
El código anterior crea un pequeño juego que permite intentar adivinar un número del 1 al 100.
12
1.5.3. Programación estructurada
En esta programación se utiliza una técnica que genera programas que sólo permiten utilizar tres
estructuras de control:
La ventaja de esta programación está en que es más legible (aunque en este caso el código es casi
más sencillo en su versión desordenada). Todo programador debería escribir código de forma
estructurada.
El código de los módulos puede ser invocado en cualquier parte del código. Realmente cada
módulo se comporta como un subprograma que, partir de unas determinadas entradas obtiene
unas salidas concretas. Su funcionamiento no depende del resto del programa por lo que es más
fácil encontrar los errores y realizar el mantenimiento.
Es la más novedosa, se basa en intentar que el código de los programas se parezca lo más posible
a la forma de pensar de las personas. Las aplicaciones se representan en esta programación como
una serie de objetos independientes que se comunican entre sí.
Cada objeto posee datos y métodos propios, por lo que los programadores se concentran en
programar independientemente cada objeto y luego generar el código que inicia la comunicación
entre ellos.
13
Es la programación que ha revolucionado las técnicas últimas de programación ya que han
resultado un importante éxito gracias a la facilidad que poseen de encontrar fallos, de reutilizar el
código y de documentar fácilmente el código.
Introducción
Los lenguajes de programación permiten codificar algoritmos en el ordenador. Son una serie de
símbolos e instrucciones de acuerdo con una sintaxis que facilita su posterior traducción a código
entendible por el ordenador.
En realidad los ordenadores sólo reconocen un lenguaje formado por los unos y ceros del código
binario. Según la disposición de esos unos y ceros entenderá unas instrucciones u otras. De
esa forma hay lenguajes más próximos al lenguaje de las computadores (lenguajes de bajo nivel)
y lenguajes más próximos al lenguaje humando (lenguajes de alto nivel)
Está formado por una sucesión de unos y ceros que el procesador del ordenador reconoce
como instrucciones. Es el lenguaje que reconoce directamente el ordenador por lo tanto es el que
está a más bajo nivel.
Un detalle a tener en cuenta es que el código máquina es distinto para cada tipo de procesador. Lo
que hace que los programas en código máquina no sean portables entre distintas máquinas.
Se trata de un lenguaje que representa el código máquina pero escrito con una serie de términos
mnemotécnicos que facilitan su escritura. Después un software especial se encargará de traducir
las instrucciones a código máquina. Ejemplo2 (programa que saca el texto “Hola mundo” por
pantalla):
14
ax,datos mov ds,ax
mov dx,offset saludo
mov ah,9
int 21h mov
ax,4C00h int
21h
START ENDP
CODE ENDS
END START
Este lenguaje tiene traducción exacta al código máquina, por lo que es un lenguaje diferente para
cada procesador; es decir, no es portable.
Se aproximan más al lenguaje de los humanos. Los programas se diseñan en un lenguaje estricto
pero independiente de la máquina, lo que permite que la escritura del código cree programas
ejecutables en cualquier máquina.
Hace falta software que transforme el código en el lenguaje de alto nivel en código entendible por
el ordenador en un proceso conocido como interpretación o compilación (dependiendo del
lenguaje).
El código es menos eficiente que en el caso anterior, pero es más entendible y mucho más
fácilmente corregible. Hoy en día casi todos los lenguajes son de alto nivel (C, Basic, Cobol, Fortran,
Pascal,...).
Ejemplo (código Java):
15
for (int j=2*i;j<=nPrimos;j+=i){ primo[j]=false;
}
}
}
for (i=1;i<=nPrimos;i++) {System.out.print("
"+i);
}
}
}
A veces se habla de lenguajes de medio nivel para referirse a lenguajes que utilizan una
codificación que está entre el ensamblador y el lenguaje de alto nivel. El C se considera a menudo
un lenguaje de nivel medio ya que su codificación puede resultar tan críptica como un código en
ensamblador. De hecho las posibilidades del C son similares a las del ensamblador, pero su
estructura es la de un lenguaje de alto nivel.
Son lenguajes en los que apenas hay código y en su lugar aparecen indicaciones sobre qué es lo
que el programa debe de obtener. En estos lenguajes hay herramientas de tipo más visual
mediante las que se diseña el funcionamiento del programa.
16
Metodología de la Programación
2.1. Metodologías
2.1.1. Introducción
Se entiende por metodología el conjunto de reglas y pasos estrictos que se siguen para
desarrollar una aplicación informática completa. Hay diversas metodologías, algunas incluso
registradas (hay que pagar por utilizarlas).
Independientemente de la metodología utilizada se suele seguir los pasos del ciclo de vida de la
aplicación:
21.2. Análisis
Al programar aplicaciones siempre se debe realizar un análisis. El análisis estudia los requisitos que
ha de cumplir la aplicación. El resultado del análisis es una hoja de especificaciones en la que
aparecen los requerimientos de la aplicación. Esta hoja es redactada por el o la analista, la persona
responsable del proceso de creación de la aplicación.
En la creación de algoritmos sencillos, el análisis consistiría únicamente en:
• Determinar las entradas. Es decir, los datos que posee el algoritmo cuando comienza
su ejecución. Esos datos permiten obtener el resultado.
• Determinar las salidas. Es decir, los datos que obtiene el algoritmo como resultado. Lo
que el algoritmo devuelve al usuario.
2.1.3. Diseño
En esta fase se crean esquemas que simbolizan a la aplicación. Estos esquemas los elaboran
analistas. Gracias a estos esquemas se simboliza la aplicación. Estos esquemas en definitiva se
convierten en la documentación fundamental para plasmar en papel lo que el programador debe
hacer.
Siempre existe en el diseño la zona principal que es el programa principal que se ejecutará cuando el
programa esté codificado en un lenguaje de programación.
2.1.4. Codificación
2.1.5. Ejecución
Tras la escritura del código, mediante un software especial se traduce a código interpretable por
el ordenador (código máquina). En este proceso pueden detectarse errores en el código que
impiden su transformación. En ese caso el software encargado de la traducción (normalmente
un compilador o un intérprete) avisa de esos errores para que el programador los pueda corregir.
2.1.6. Prueba
Se trata de testear la aplicación para verificar que su funcionamiento es el correcto. Para ello se
comprueban todas las entradas posibles, comprobando que las salidas son las correspondientes.
2.1.7. Mantenimiento
18
Introducción
Es el esquema más viejo de la informática. Se trata de una notación que pretende facilitar la
escritura o la comprensión de algoritmos. Gracias a ella se esquematiza el flujo del algoritmo. Fue
muy útil al principio y todavía se usa como apoyo para explicar ciertos algoritmos. Si los
algoritmos son complejos, este tipo de esquemas no son adecuados.
Los diagramas utilizan símbolos especiales que ya están normalizados por organismos de
estandarización como ANSI e ISO.
Símbolos principales
Ejemplo:
19
Ilustración 4, Diagrama de flujo que escribe el mayor de dos números leídos.
Los diagramas de flujo son interesantes como primer acercamiento a la programación ya que son
fáciles de entender. De hecho se utilizan fuera de la programación como esquema para ilustrar el
funcionamiento de algoritmos sencillos.
2.2.2. Pseudocódigo
Introducción
Las bases de la programación estructurada fueron enunciadas por Niklaus Wirdth. Según este científico
cualquier problema algorítmico podía resolverse con el uso de estos tres tipos de
instrucciones:
• Secuenciales. Instrucciones que se ejecutan en orden normal. El flujo del programa ejecuta la
instrucción y pasa a ejecutar la siguiente.
• Iterativas. Instrucciones que se repiten continuamente hasta que se cumple una determinada
condición.
El tiempo le ha dado la razón y ha generado una programación que insta a todo programador
a utilizar sólo instrucciones de esos tres tipos. Es lo que se conoce como programación
estructurada.
Por ello se aconseja para el diseño de algoritmos estructurados el uso de un lenguaje especial llamado
pseudocódigo, que además se puede traducir a cualquier idioma.
• De Entrada /Salida. Para leer o escribir datos desde el programa hacia el usuario. De
proceso. Operaciones que realiza el algoritmo (suma, resta, cambio de valor,...) De
control de flujo. Instrucciones alternativas o iterativas (bucles y condiciones).
• De declaración. Mediante las que se crean variables y subprogramas.
Llamadas a subprogramas
• Comentarios. Notas que se escriben junto al pseudocódigo para explicar mejor su
funcionamiento.
20
Escritura en seudocódigo
Las instrucciones que resuelven el algoritmo en pseudocódigo deben de estar encabezadas por la
palabra inicio (en inglés begin) y cerradas por la palabra fin (en inglés end). Entre medias de estas palabras
se sitúan el resto de instrucciones. Opcionalmente se puede poner delante del inicio la palabra programa
seguida del nombre que queramos dar al algoritmo.
En definitiva la estructura de un algoritmo en pseudocódigo es:
programa nombreDelPrograma
inicio instrucciones....
fin
• Se aconseja que las instrucciones dejen un espacio (sangría) a la izquierda para que se vea
más claro que están entre el inicio y el fin. Esta forma de escribir algoritmos permite leerlos
mucho mejor.
Comentarios
En pseudocódigo los comentarios que se deseen poner (y esto es una práctica muy aconsejable)
se ponen con los símbolos // al principio de la línea de comentario (en algunas notaciones se escribe
**). Cada línea de comentario debe comenzar con esos símbolos:
inicio
instrucciones
//comentaro
instruccions
fin
2.3.1. Instrucciones
• Asignación
• Instrucciones de Entrada/Salida
21
• Declaraciones. Obligatorias en el pseudocódigo, opcionales en otros esquemas. Sirven para
advertir y documentar el uso de variables y subprogramas en el algoritmo.
• Control. Sirven para alterar el orden de ejecución del algoritmo. En general el algoritmo se
ejecuta secuencialmente. Gracias a estas instrucciones el flujo del algoritmo depende de ciertas
condiciones que nosotros mismos indicamos.
Sólo se utilizan en el pseudocódigo. Indican el nombre y las características de las variables que se
utilizan en el algoritmo. Las variables son nombres a los que se les asigna un determinado valor
y son la base de la programación. Al nombre de las variables se le llama identificador.
Identificadores
Los algoritmos necesitan utilizar datos. Los datos se identifican con un determinado identificador
(nombre que se le da al dato). Este nombre:
• Sólo puede contener letras, números y el carácter
• Debe comenzar por una letra
• No puede haber dos elementos del algoritmo (dos datos por ejemplo) con el mismo
identificador.
Conviene que sea aclarativo, es decir que represente lo mejor posible los datos que contiene. x no es
un nombre aclarativo, saldo_mensual sí lo es.
Los valores posibles de un identificador deben de ser siempre del mismo tipo (lo cual es lógico
puesto que un identificador almacena un dato). Es decir no puede almacenar primero texto y
luego números.
Declaración de variables
Es aconsejable al escribir pseudocódigo indicar las variables que se van a utilizar (e incluso con un
comentario indicar para qué se van a usar). En el caso de los otros esquemas (diagramas de flujo y
tablas de decisión) no se utilizan (lo que fomenta malos hábitos).
Esto se hace mediante la sección del pseudocódigo llamada var, en esta sección se colocan las
variables que se van a utilizar. Esta sección se coloca antes del inicio del algoritmo. Y se utiliza de
esta forma:
22
El tipo de datos de la variable puede ser especificado de muchas formas, pero tiene que ser un tipo
compatible con los que utilizan los lenguajes informáticos. Se suelen utilizar los siguientes tipos:
• entero. Permite almacenar valores enteros (sin decimales).
• real. Permite almacenar valores decimales.
• carácter. Almacenan un carácter alfanumérico.
• lógico (o booleano). Sólo permiten almacenar los valores verdadero o falso.
• texto. A veces indicando su tamaño (texto(20) indicaría un texto de hasta 20 caracteres) permite
almacenar texto. Normalmente en cualquier lenguaje de programación se considera un tipo
compuesto.
También se pueden utilizar datos más complejos, pero su utilización queda fuera de este tema.
Ejemplo de declaración:
var
numero_cliente: entero // código único de cada cliente valor_compra: real //lo que ha
comprado el cliente descuento: real //valor de descuento aplicable al cliente
Constantes
Hay un tipo especial de variable llamada constante. Se utiliza para valores que no van a variar en
ningún momento. Si el algoritmo utiliza valores constantes, éstos se declaran mediante una
sección (que se coloca delante de la sección var) llamada const (de constante).
Ejemplo:
programa ejemplo1
const
PI=3.141592
NOMBRE=”Jose”
var edad: entero
sueldo: real
inicio
A las constantes se las asigna un valor mediante el símbolo =. Ese valor permanece constante (pi
siempre vale 3.141592). Es conveniente (aunque en absoluto obligatorio) utilizar letras mayúsculas
para declarar variables.
23
2.3.3. Instrucciones primitivas
Son instrucciones que se ejecutan en cuanto son leídas por el ordenador. En ellas sólo puede haber:
• Asignaciones ( )
• Operaciones (+, -, * /,...)
• Identificadores (nombres de variables o constantes)
• Valores (números o texto encerrado entre comillas)
• Llamadas a subprogramas
En el pseudocódigo se escriben entre el inicio y el fin. En los diagramas de flujo y tablas de decisión
se escriben dentro de un rectángulo.
Instrucción de asignación
Permite almacenar un valor en una variable. Para asignar el valor se escribe el símbolo =,
de modo que:
identificador=valor
x=y
• Caracteres simples. Los caracteres simples (un solo carácter) se escriben entre comillas simples:
‘a’, ‘c’,etc.
• Textos. Se escriben entre comillas doble “Hola”
• Lógicos. Sólo pueden valer verdadero o falso (se escriben tal cual)
• Identificadores. En cuyo caso se almacena el valor de la variable con dicho identificador.
Ejemplo:
En las instrucciones de asignación se pueden utilizar expresiones más complejas con ayuda de los
operadores.
Ejemplo:
x=(y*3)/2
24
Es decir x vale el resultado de multiplicar el valor de y por tres y dividirlo entre dos. Los operadores
permitidos son:
+ Suma
- Resta o cambio de signo
* Producto
/ División
mod Resto. Por ejemplo 9 mod 2 da como resultado 1
div División entera. 9 div 2 da como resultado 4 (y no 4,5)
Exponente. 9 2 es 9 elevado a la 2
Hay que tener en cuenta la prioridad del operador. Por ejemplo la multiplicación y la división
tienen más prioridad que la suma o la resta. Sí 9+6/3 da como resultado 5 y no 11. Para modificar
la prioridad de la instrucción se utilizan paréntesis.
Lectura de datos
Es la instrucción que simula una lectura de datos desde el teclado. Se hace mediante la orden leer
en la que entre paréntesis se indica el identificador de la variable que almacenará lo que se lea.
Ejemplo (pseudocódigo):
leer(x)
En ambos casos x contendrá el valor leído desde el teclado. Se pueden leer varias variables a la
vez:
leer(x,y,z)
lee r x, y, z
Escritura de datos
Funciona como la anterior pero usando la palabra escribir. Simula la salida de datos del algoritmo
por pantalla.
escribir(x,y,z)
escribir x, y, z
Ejemplo de algoritmo 25
El algoritmo completo que escribe el resultado de multiplicar dos números leídos por teclado sería (en
pseudocódigo)
programa
mayorDe2
var x,y:
entero inicio
leer(x,y)
escribir(x*y)
fin
En un diagrama de flujo:
Con lo visto anteriormente sólo se pueden escribir algoritmos donde la ejecución de las
instrucciones sea secuencial. Pero la programación estructurada permite el uso de decisiones y
de iteraciones.
Estas instrucciones permiten que haya instrucciones que se pueden ejecutar o no según una
condición (instrucciones alternativas), e incluso que se ejecuten repetidamente hasta que
se cumpla una condición (instrucciones iterativas). En definitiva son instrucciones que permiten
variar el flujo normal del programa.
Expresiones lógicas
Todas las instrucciones de este apartado utilizan expresiones lógicas. Son expresiones que dan
como resultado un valor lógico (verdadero o falso). Suelen ser siempre comparaciones entre datos.
Por ejemplo x>8 da como resultado verdadero si x vale más que 8. Los operadores de relación (de
comparación) que se pueden utilizar son:
También se pueden unir expresiones utilizando los operadores Y (en inglés AND), el operador O
(en inglés OR) o el operador NO (en inglés NOT). Estos operadores permiten unir expresiones
lógicas.
Por ejemplo:
si expresión_lógica entonces
instrucciones
fin_si
27
Las instrucciones sólo se ejecutarán si la expresión evaluada es verdadera.
Instrucción de alternativa doble
Se trata de una variante de la alternativa en la que se ejecutan unas instrucciones si la expresión evaluada
es verdadera y otras si es falsa. Funcionamiento:
Hay que tener en cuenta que se puede meter una instrucción si dentro de otro si. A eso se le llama
alternativas anidadas.
Ejemplo:
si a≥5 entonces escribe(“apto”)
escribe(“sobresaliente”)
fin_si si_no escribe(“suspenso”)
fin_si
Al anidar estas instrucciones hay que tener en cuenta que hay que cerrar las instrucciones si
interiores antes que las exteriores.
Eso es una regla básica de la programación estructurada:
28
Alternativa compuesta
En muchas ocasiones se requieren condiciones que poseen más de una alternativa. En ese caso
existe una instrucción evalúa una expresión y según los diferentes valores que tome se ejecutan
unas u otras instrucciones.
Ejemplo:
Casi todos los lenguajes de programación poseen esta instrucción que suele ser un case (aunque
C, C++, Java y C# usan switch). Se evalúa la expresión y si es igual que uno de los valores interiores
se ejecutan las instrucciones de ese valor. Si no cumple ningún valor se ejecutan las instrucciones
del si_no.
29
Ejemplo: programa pruebaSelMultiple var x: entero inicio
escribe(“Escribe un número del 1 al 4 y te diré si es par o impar”)
lee(x) según_sea x hacer
1: escribe(“impar”)
2: escribe(“par”)
3: escribe(“impar”)
4: escribe(“par”)
escribe(“error eso no es un número de 1 a 4”)
si_no fin_según
fin
según_sea x hacer
1,3: escribe(“impar”) 2,4:escribe(“par”)
escribe(“error eso no es un número de 1 a 4”)
si_no fin_según
Es decir el valor en realidad puede ser una lista de valores. Para indicar esa lista se pueden utilizar
expresiones como:
1..3 De uno a tres (1,2 o 3)
>4 Mayor que 4
>5 Y <8 Mayor que 5 y menor que 8
7,9,11,12 7,9,11 y 12. Sólo esos valores (no el 10 o el 8 por ejemplo)
Sin embargo estas últimas expresiones no son válidas en todos los lenguajes (por ejemplo el C
no las admite). En el caso de los diagramas de flujo, el formato es:
Significa que las instrucciones del interior se ejecutan una y otra vez mientras la condición sea
verdadera. Si la condición es falsa, las instrucciones se dejan de
ejecutar. El diagrama de flujo equivalente es:
X1
mientras
x<=10
escribir(x)
xx+1
fin_mientras
Las instrucciones interiores a la palabra mientras podrían incluso no ejecutarse si la condición es falsa
inicialmente.
La diferencia con la anterior está en que se evalúa la condición al final (en lugar de al principio).
Consiste en una serie de instrucciones que repiten continuamente su ejecución hasta que la
condición sea verdadera (funciona por tanto al revés que el mientras ya que si la condición es
falsa, las instrucciones se siguen ejecutando. Estructura
repetir
instrucciones hasta
que condición
31
Ejemplo (escribir números del 1 al 10):
X1
repetir
escribir(
x)
xx+1
hasta que x>10
Se trata de una iteración que mezcla las dos anteriores. Ejecuta una serie de instrucciones mientras
se cumpla una condición. Esta condición se evalúa tras la ejecución de las instrucciones. Es decir es
un bucle de tipo mientras donde las instrucciones al menos se ejecutan una vez (se puede decir
que es lo mismo que un bucle repetir salvo que la condición se evalúa al revés). Estructura:
hacer
instrucciones
mientras condición
Este formato está presente en el lenguaje C y derivados (C++, Java, C#), mientras que el
formato de repetir está presente en el lenguaje Java. El diagrama de flujo equivalente es:
32
Ejemplo (escribir números del 1 al 10):
X1
hacer escribir(x)
xx+1 mientras
x≤10
Existe otro tipo de estructura iterativa. En realidad no sería necesaria ya que lo que hace esta
instrucción lo puede hacer una instrucción mientras, pero facilita el uso de bucles con contador.
Es decir son instrucciones que se repiten continuamente según los valores de un contador al que
se le pone un valor de inicio, un valor final y el incremento que realiza en cada iteración (el
incremento es opcional, si no se indica se entiende que es de uno). Estructura:
fin_para
fin_para
33
También se puede utilizar este formato de diagrama:
Otros formatos de pseudocódigo utilizan la palabra desde en lugar de la palabra para (que es la
traducción de for, nombre que se da en el original inglés a este tipo de instrucción).
Al igual que ocurría con las instrucciones si, también se puede insertar una estructura iterativa
dentro de otra; pero en las mismas condiciones que la instrucción si. Cuando una estructura
iterativa está dentro de otra se debe cerrar la iteración interior antes de cerrar la exterior (véase la
instrucción si).
Se utilizan muchísimo para representar datos que se almacenan en una base de datos. Son
imprescindibles para el diseño de las bases de datos que es una de las aplicaciones más
importantes de la informática.
Representan los módulos que utilizan un programa y la relación que hay entre ellos. Suelen utilizarse
conjuntamente con los diagramas descritos anteriormente.
Representan los estados por los que pasa una aplicación, son muy importantes para planificar la
aplicación.
Indica tiempo transcurrido en la ejecución de la aplicación. Son muy útiles para diseñar aplicaciones
donde el control del tiempo es crítico.
Representan los elementos que componen una aplicación orientada a objetos y la relación que
poseen éstos. Hoy en día el más popular es el diagrama de clases de la notación UML.
2.4.6. UML
35
[
3.1. Conceptos
Los objetos son entidades que tienen un determinado estado, comportamiento (método)
e identidad:
• El estado está compuesto de datos o informaciones, será uno o varios atributos a los que se
habrán asignado unos valores concretos (datos).
• El comportamiento está definido por los métodos o mensajes a los que sabe responder dicho
objeto, es decir, qué operaciones se pueden realizar con él.
• La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras
palabras, es su identificador (concepto análogo al de identificador de una variable o una
constante).
Un objeto contiene toda la información que permite definirlo e identificarlo frente a otros
objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase.
El mensaje normalmente un único objeto por sí solo no es muy útil. En general, un objeto aparece
como un componente más de un programa o una aplicación que contiene otros muchos objetos.
Es precisamente haciendo uso de esta interacción como los programadores consiguen una
funcionalidad de mayor orden y modelar comportamientos mucho más complejos. Una bicicleta
(a partir de ahora particularizaremos) colgada de un gancho en el garaje no es más que una
estructura de aleación de titanio y un poco de goma. Por sí sola, tu bicicleta (por poner una bicicleta
en concreto) es incapaz de desarrollar ninguna actividad. Tu bicicleta es realmente útil en tanto
que otro objeto (tú) interactúa con ella (pedalea).
Los objetos de un programa interactúan y se comunican entre ellos por medio de mensajes.
Cuando un objeto A quiere que otro objeto B ejecute una de sus funciones miembro (métodos de
B), el objeto A manda un mensaje al objeto B.
3.1.1. Origen
La programación orientada a objetos es una forma de programar que trata de encontrar una
solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos
antiguos ya conocidos. Entre ellos destacan los siguientes:
Clase: Una clase es una plantilla que define las variables y los métodos que son comunes para
todos los objetos de un cierto tipo.
Después de haber creado la clase bicicleta, podemos crear cualquier número de objetos
bicicleta a partir de la clase. Cuando creamos una instancia de una clase, el sistema reserva
suficiente memoria para el objeto con todas sus variables miembro. Cada instancia tiene
su propia copia de las variables miembro definidas en la clase.
Simula (1967) es aceptado como el primer lenguaje que posee las características principales de un
lenguaje orientado a objetos. Fue creado para hacer programas de simulación, en donde los
"objetos" son la representación de la información más importante. Smalltalk (1972 a 1980) es
posiblemente el ejemplo canónico, y con el que gran parte de la teoría de la programación
orientada a objetos se ha desarrollado.
Muchos de estos lenguajes de programación no son puramente orientados a objetos, sino que son
híbridos que combinan la POO con otros paradigmas.
Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido
creados añadiendo extensiones orientadas a objetos a un lenguaje de programación clásico.
39
3.2. Lenguajes de Programación
3.2.1. Introducción
Lenguajes de programación
Los lenguajes de programación son idimoas artificiales diseñados para expresar cálculos y procesos
que serán llevados a cabo por ordenadores. Un lenguaje de programación esta formados por un
conjunto de palabras reservadas, símbolos y reglas sintácticas y semánticas que definen su
extructura y el significado de sus elementos y expresiones. El proceso de programación consiste en
la escritura, compilación y verificación del código fuente de un programa.
Para programar de forma eficaz es necesario aprender a resolver problemas de una forma
sistemática. Solo se puede llegar a realizar un buen programa si previamente se ha diseñado un
algoritmo.
Inicios de la programación
Charles Babbage definió a mediados del siglo XIX lo que él llamó la máquina analítica. Se considera
a esta máquina el diseño del primer ordenador. La realidad es que no se pudo construir hasta el siglo
siguiente. El caso es que su colaboradora Ada Lovelace escribió en tarjetas perforadas una serie de
instrucciones que la máquina iba a ser capaz de ejecutar. Se dice que eso significó el inicio de la
ciencia de la programación de ordenadores.
Primeros lenguajes
No mucho más tarde apareció la idea de que las máquinas fueran capaces de realizar más de una
aplicación. Para lo cual se ideó el hecho de que hubiera una memoria donde se almacenaban esas
instrucciones. Esa memoria se podía rellenar con datos procedentes del exterior.
Inicialmente se utilizaron tarjetas perforadas para introducir las instrucciones.
Durante mucho tiempo esa fue la forma de programar, que teniendo en cuenta que las máquinas
ya entendían sólo código binario, consistía en introducir la programación de la máquina
mediante unos y ceros. El llamado código máquina. Todavía los ordenadores es el único código
que entienden, por lo que cualquier forma de programar debe de ser convertida a código máquina.
En los años 40 se intentó concebir un lenguaje más simbólico. Poco más tarde se ideó el lenguaje
ensamblador, que es la traducción del código máquina a una forma más textual. Cada tipo de
instrucción se asocia a una palabra nemónica (como SUM para sumar por ejemplo), de
40
forma que esas palabras tienen traducción directa en el código máquina. Después habrá que
traducir el código ensamblador a código máquina, tarea que la realiza un software especial
llamado también ensamblador.
La idea es la siguiente: si en el código máquina, el número binario 0000 significa sumar, y el número
0001 significa restar. Una instrucción máquina que sumara el número 8 (00001000 en binario) al
número 16 (00010000 en binario) sería:
Realmente no habría espacios en blanco, el ordenador entendería que los primeros cuatro
BITS representan la instrucción y los 8 siguientes el primer número y los ocho siguientes el segundo
número (suponiendo que los números ocupan 8 bits). Lógicamente trabajar de esta forma es muy
complicado. Por eso se podría utilizar la siguiente traducción en ensamblador:
SUM 8 16
Que ya se entiende mucho mejor. La cuestión es que este código (todavía de bajo nivel) se escribirá
en un editor de texto y después un software especial (que también se le llama ensamblador) lo
traducirá al código máquina equivalente. La ventaja es que la traducción es literal, tenemos toda la
potencia de la máquina ya que podemos utilizar cualquier instrucción de la misma. La desventaja es
que tenemos que conocer muy bien la máquina y que el código sólo vale para máquinas totalmente
compatibles.
El problema es que como el ensamblador es traducción absoluta del código máquina, sólo vale para
máquinas compatibles. No vale para cualquiera. Además de lo pesado y lento que es programar en
ensamblador.
Aunque el ensamblador significó una notable mejora sobre el código máquina, seguía siendo
excesivamente críptico. De hecho para hacer un programa sencillo requiere miles y miles de líneas
de código.
Para evitar los problemas del ensamblador apareció la tercera generación de lenguajes de
programación, la de los lenguajes de alto nivel. En este caso el código vale para cualquier máquina
pero deberá ser traducido mediante software especial que adaptará el código de alto nivel al código
máquina correspondiente. Esta traducción es necesaria ya que el código en un lenguaje de alto nivel
no se parece en absoluto al código máquina.
Tras varios intentos de representar lenguajes, en 1957 aparece el que se considera el primer lenguaje
de alto nivel, el FORTRAN (FORmula TRANslation), lenguaje orientado a resolver fórmulas
matemáticos. Poco a poco fueron evolucionando los lenguajes formando lenguajes cada vez
mejores.
41
Así en 1958 se crea LISP como lenguaje declarativo para expresiones matemáticas. En 1960 la
conferencia CODASYL se creó el COBOL como lenguaje de gestión en 1960. En 1963 se creó PL/I el
primer lenguaje que admitía la multitarea y la programación modular.
BASIC se creó en el año 1964 como lenguaje de programación sencillo de aprender en 1964 y ha sido,
y es, uno de los lenguajes más populares. En 1968 se crea LOGO para enseñar a programar a los niños.
Pascal se creó con la misma idea académica pero siendo ejemplo de lenguaje estructurado para
programadores avanzados. C se creó en 1991 por (Dennis M. Ritchie) en los Laboratorios Bell como
evolución del anterior lenguaje B. El creador del Pascal (Niklaus Wirdth) creo Modula en 1977
siendo un lenguaje estructurado para la programación de sistemas
(intentando sustituir al C).
En los 80 llegan los lenguajes preparados para la programación orientada a objetos todos
procedentes de Simula (1964) considerado el primer lenguaje con facilidades de uso de objetos. De
estos destacó inmediatamente C++.
A partir de C++ aparecieron numerosos lenguajes que convirtieron los lenguajes clásicos en
lenguajes orientados a objetos (y además con mejoras en el entorno de programación, son los
llamados lenguajes visuales): Visual Basic, Delphi (versión orientada a objetos de Pascal), Visual
C++,...
En 1995 aparece Java como lenguaje totalmente orientado a objetos y en el año 200 aparece C# un
lenguaje que procede de C++ y del propio Java.
Tipos de lenguajes
Lenguajes imperativos. Son lenguajes donde las instrucciones se ejecutan secuencialmente y van
modificando la memoria del ordenador para producir las salidas requeridas. La mayoría de lenguajes
(C, Pascal, Basic, Cobol, ...son de este tipo. Dentro de estos lenguajes están también los lenguajes
orientados a objetos (C++, Java, C#,...)
Lenguajes declarativos. Son lenguajes que se concentran más en el qué, que en el cómo (cómo
resolver el problema es la pregunta a realizarse cuando se usan lenguajes imperativos). Los
lenguajes que se programan usando la pregunta ¿qué queremos? son los declarativos. El más
conocido de ellos es el lenguaje de consulta de Bases de datos, SQL.
Lenguajes funcionales. Definen funciones, expresiones que nos responden a través de una serie
de argumentos. Son lenguajes que usan expresiones matemáticas, absolutamente diferentes del
lenguaje usado por las máquinas. El más conocido de ellos es el LISP.
Lenguajes lógicos. Lenguajes utilizados para resolver expresiones lógicas. Utilizan la lógica para
producir resultados. El más conocido es el PROLOG.
Intérpretes
42
A la hora de convertir un programa en código máquina, se pueden utilizar dos tipos de software:
intérpretes y compiladores.
En el caso de los intérpretes se convierte cada línea a código máquina y se ejecuta ese código
máquina antes de convertir la siguiente línea. De esa forma si las dos primeras líneas son correctas
y la tercera tiene un fallo de sintaxis, veríamos el resultado de las dos primeras líneas y al llegar
a la tercera se nos notificaría el fallo y finalizaría la ejecución.
El intérprete hace una simulación de modo que parece que la máquina entiende directamente las
instrucciones del lenguaje, pareciendo que ejecuta cada instrucción (como si fuese código máquina
directo).
El BASIC era un lenguaje interpretado, se traducía línea a línea. Hoy en día la mayoría
de los lenguajes integrados en páginas web son interpretados, la razón es que como la descarga
de Internet es lenta, es mejor que las instrucciones se vayan traduciendo según van llegando
en lugar de cargar todas en el ordenador. Por eso lenguajes como JavaScript (o incluso, en parte,
Java) son interpretados.
Proceso
Un programa que se convierte a código máquina mediante un intérprete sigue estos pasos:
Ventajas
* Se tarda menos en crear el primer código máquina. El programa se ejecuta antes.
* No hace falta cargar todas las líneas para empezar a ver resultados (lo que hace que
sea una técnica idónea para programas que se cargan desde Internet)
Desventajas
* El código máquina producido es peor ya que no se optimiza al valorar una sola línea
cada vez. El código optimizado permite estudiar varias líneas a la vez para producir el
mejor código máquina posible, por ello no es posible mediante el uso de intérpretes.
* Todos los errores son errores en tiempo de ejecución, no se pueden detectar antes
de lanzar el programa. Esto hace que la depuración de los errores sea más
compleja.
* El código máquina resultante gasta más espacio.
* Hay errores difícilmente detectables, ya que para que los errores se produzcan, las
líneas de errores hay que ejecutarlas. Si la línea es condicional hasta que no
probemos todas las posibilidades del programa, no sabremos todos los errores de
sintaxis cometidos.
43
Compiladores
Ventajas
* Se detectan errores antes de ejecutar el programa (errores de compilación)
44
* El código máquina generado
es más rápido (ya que se optimiza) [1ero BGU Polivalente Informática]
Docente: Ing. Irlanda Loján Herrera
* Es más fácil hacer procesos de
depuración de código
Desventajas
* El proceso de compilación del código es ento.
* No es útil para ejecutar programas desde Internet ya que hay que descargar todo el
programa antes de traducirle, lo que ralentiza mucho su uso.
TRABAJO EN CLASE
Escribe la diferencia entre un software intérprete y un compilador.
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
___________________________________________________________________________
3.3. Java
Java es un lenguaje de programación creado para satisfacer una necesidad de la época (así aparecen
todos los lenguajes) planteada por nuevos requerimientos hacia los lenguajes existentes.
Antes de la aparición de Java, existían otros importantes lenguajes (muchos se utilizan todavía).
Entre ellos el lenguaje C era probablemente el más popular debido a su versatilidad; contiene
posibilidades semejantes a programar en ensamblador, pero con las comodidades de los lenguajes
de alto nivel.
Uno de los principales problemas del lenguaje C (como el de otros muchos lenguajes) era que
cuando la aplicación crecía, el código era muy difícil de manejar. Las técnicas de programación
estructurada y programación modular, paliaban algo el problema. Pero fue la programación
orientada a objetos (POO u OOP) la que mejoró notablemente la situación.
La POO permite fabricar programas de forma más parecida al pensamiento humano. De hecho
simplifica el problema dividiéndolo en objetos y permitiendo centrarse en cada objeto, para de esa
forma eliminar la complejidad. Cada objeto se programa de forma autónoma y esa es la principal
virtud.
Al aparecer la programación orientada a objetos (en los ochenta), aparecieron varios lenguajes
orientados a objetos y también se realizaron versiones orientadas a objetos (o semi—orientadas a
objetos) de lenguajes clásicos.
Una de las más famosas fue el lenguaje orientado a objetos creado a partir del C tradicional. Se le
llamó C++ indicando con esa simbología que era un incremento del lenguaje C (en el lenguaje C,
como en Java, los símbolos ++ significan incrementar).
3.3.2. El nacimiento de Java
En 1991, la empresa Sun Microsystems crea el lenguaje Oak (de la mano del llamado proyecto
Green). Mediante este lenguaje se pretendía crear un sistema de televisión interactiva. Este
lenguaje sólo se llegó a utilizar de forma interna. Su propósito era crear un lenguaje independiente
de la plataforma y para uso en dispositivos electrónicos.
En 1995 pasa a llamarse Java y se da a conocer al público. Adquiere notoriedad rápidamente. Java
pasa a ser un lenguaje totalmente independiente de la plataforma y a la vez potente y orientado a
objetos. Esa filosofía y su facilidad para crear aplicaciones para redes TCP/IP ha hecho que sea uno
de los lenguajes más utilizados en la actualidad. La versión actual de Java es el llamado Java 2. Sus
ventajas sobre C++ son:
La última ventaja (quizá la más importante) se consigue ya que el código Java no se compila, sino
que se precompila, de tal forma que se crea un código intermedio que no es ejecutable. Para
ejecutarle hace falta pasarle por un intérprete que va ejecutando cada línea. Ese intérprete suele
ser la máquina virtual de Java.
Para conseguir la portabilidad de los programas Java se utiliza un entorno de ejecución para los
programas compilados. Este entorno se denomina Java Runtime Environment (JRE). Esto asegura
que el mismo programa Java puede ejecutarse en Windows, Mac OS, Linux o Solaris. Lo que podría
traducirse como “programar una sola vez y después ejecutarse los programas en cualquier sistema
operativo”, era el objetivo del equipo de desarrollo de Java.
Esta idea resume el concepto de portabilidad. Los programas Java son portables, es decir,
independientes de la plataforma, porque pueden ejecutarse en cualquier ordenador o dispositivo
móvil, independientemente del sistema operativo que tenga instalado.
{
46
Java Runtime Environment (JRE)
Applet: Son programas Java pensados para ser colocados dentro de una página web. Pueden
ser interpretados por cualquier navegador con capacidades Java. Los applets son programas
independientes, pero al estar incluidos dentro de una página web las reglas de éstas le afectan.
Normalmente un applet sólo puede actuar sobre el navegador.
Aplicaciones de consola: Son programas independientes al igual que los creados con los
lenguajes tradicionales.
Aplicaciones gráficas: Aquellas que utilizan las clases con capacidades gráficas.
Servlets: Son aplicaciones que se ejecutan en un servidor de aplicaciones web y que como
resultado de su ejecución resulta una página web.
47
3.4. Entornos de Programación
La programación de ordenadores requiere el uso de una serie de herramientas que faciliten el
trabajo al programador. Esas herramientas (software) son:
• Editor de código. Programa utilizado para escribir el código. Normalmente basta un editor
de texto (el código en los lenguajes de programación se guarda en formato de texto
normal), pero es conveniente que incorpore:
Normalmente todas esas herramientas se integran en un único software conocido como entorno
de programación o IDE (Integrate Development Environment, Entorno de desarrollo integrado),
que hace más cómodos todos los procesos relacionados con la programación. En el caso de Java
hay multitud de entornos algunos interesantes son:
48
a) Eclipse: software libre que se puede descargar en
El proceso completo de conversión del código fuente en código ejecutable sigue los siguientes
pasos (ver Ilustración 3):
[1] Edición. El código fuente se escribe en un editor de texto o en un editor de código preparado
para esta acción (IDE). El archivo se guarda con extensión .java.
[2] Compilación. Previamente el código fuente en Java se tiene que precompilar generando un
código (que no es directamente ejecutable) previo conocido como bytecode o
49
Jcode. Ese código (generado normalmente en archivos con extensión class) es el que es
ejecutado por la máquina virtual de Java que interpreta las instrucciones de los
bytecodes, ejecutando el código de la aplicación.
[5] Ejecución de las instrucciones por la CPU. Es entonces cuando el procesador accede al
código máquina del programa ya convertido y ejecuta las acciones. Será entonces cuando
veamos los resultados.
Estas tres últimas fases cubren lo que se conoce como ejecución del programa
En Java la unidad fundamental del código es la clase. Son las clases las que se distribuyen en el
formato bytecode de Java. Estas clases se cargan dinámicamente durante la ejecución
del programa Java.
TRABAJO EN CLASE
Instalar Java y el IDE NetBeans
50
[1ero BGU Poliva lente Informática]
Docente: Ing. Irlanda Loján Herrera
Fundamentos de Java
Un programa en Java consta de una o más funciones, las cuales están compuestas
de diversas sentencias o instrucciones. Una sentencia indica una acción a realizar por parte
del programa. Una función no es más que (por ahora) un nombre con el que englobamos a
las sentencias que posee a fin de poder invocarlas mediante dicho nombre.
Los símbolos { y } indican el inicio y el final de la función. Esos símbolos permiten delimitar bloques
en el código.
El nombre de la función puede ser invocado desde otras sentencias simplemente poniendo como
sentencia el nombre de la función.
En todos los lenguajes de programación, el primer programa a realizar es el famoso Hola mundo,
un programa que escribe este texto en pantalla. En Java el código de este programa es:
public class HolaMundo{
public static void main(String[] args){
System.out.println(“Hola mundo”);
}
}
En el programa anterior se puede identificar los siguientes elementos del lenguaje Java:
[1] La línea p u b l i c c l a s s H o l a M u n d o es el nombre de la clase. La definición de la clase
empieza por el carácter { y termina con el carácter }, el nombre de la clase define el
programador.
[2] La función o método main(), todos los programas de Java deben incluir el método main(). Este
método las sentencias a realizar cuando se ejecuta el programa. Las sentencias del método
quedan delimitadas por los caracteres { y } que indican el inicio y fin del método,
respectivamente.
51
[3] La instrucción System.out.println ( "Hola mundo") es la encargada de escribir el texto "Hola
mundo" por pantalla o consola. Los textos siempre se escriben entre comillas dobles. Todas
las sentencias de un programa Java deben terminar con el símbolo punto y coma (;).
Sentencias
Los programas en Java se basan en sentencias las cuales siempre se incluyen dentro de una
función. En el caso de crear un programa ejecutable, esas sentencias están dentro de la función
main. A está función le precede la palabra void.
Ahora bien al escribir sentencias hay que tener en cuenta las siguientes normas:
[1] Toda sentencia en Java termina con el símbolo "punto y coma" (;)
[2] Los bloques de sentencia empiezan y terminan delimitados con el símbolo de llave ({ y }).
Así { significa inicio y } significa fin
[3] En Java hay distinción entre mayúsculas y minúsculas. No es lo mismo main que MAIN. Casi
todas las palabras claves de Java están en minúsculas. Los nombres que pongamos
nosotros también conviene ponerles en minúsculas ya que el código es mucho más legible
así (aunque esto último no es obligatorio, deberíamos tomárnoslo como tal, debido a su
importancia).
[4] Para escribir un mensaje por la consola se utilizan los métodos System.out.print() y
System.out.println (). Para escribir un mensaje sin saltar a la línea siguiente se utiliza
System.out.print(), System.out.println ()escribe un mensaje y da un salto de línea.
TRABAJO EN CLASE
* ¿Qué hace el siguiente código Java?
System.out.print(“H
ola”);
System.out.print(“M
undo”);
_________________________________________________________________
_________________________________________________________________
*¿Qué hace el siguiente código Java?
System.out.println(“Hola”);
System.out.println(“Mundo”);
_________________________________________________________________
_________________________________________________________________
Comentarios
52
Se trata de texto que es ignorado por el compilador al traducir el código. Esas líneas se utilizan
para documentar el programa.
Esta labor de documentación es fundamental ya que sino en cuanto pasa un tiempo el código no
se comprende bien (ni siquiera por el autor del mismo). Todavía es más importante cuando el
código va a ser tratado por otras personas; de otro modo una persona que modifique el código
de otra lo tendría muy complicado. En J a v a hay dos tipos de comentarios:
53
* Comentarios e n b l oq u e : Delimitados entre los símbolos /* y */, el compilador
ignora todo el texto contenido dentro del comentario.
double a=8.0;
TRABAJO EN CLASE
* Describa los tres tipos de comentarios utilizados en Java.
_________________________________________________________________
_________________________________________________________________
_________________________________________________________________
_________________________________________________________________
_________________________________________________________________
_________________________________________________________________
_________________________________________________________________
_________________________________________________________________
Palabras reservadas
54
Se llaman así a palabras que en Java tienen un significado concreto para los compiladores.
No se pueden por tanto usar esas palabras para poner nombre a variables, constantes,
funciones o clases definidas por el programador.
REFUERZO DE APRENDIZAJE:
Investiga y escribe las palabras claves de Java
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
__________________________________________________________________________________
Identificadores
Son los nombres que damos a las variables y a las funciones de Java. Lógicamente no pueden
coincidir con las palabras reservadas. Además puesto que Java distingue entre las mayúsculas y
las minúsculas, hay que tener cuidado de usar siempre las minúsculas y mayúsculas de la misma
forma (es decir, nombre, Nombre y NOMBRE son tres identificadores distintos).
El límite de tamaño de un identificador es de 32 caracteres (aunque algunos compiladores
permiten más tamaño).
Además hay que tener en cuenta que los identificadores deben de cumplir estas reglas:
• Deben comenzar por una letra, el sigo de dólar o por el signo de subrayado (aunque
comenzar por subrayado se suele reservar para identificadores de funciones especiales del
sistema).
• Los nombres de las variables y métodos empiezan con minúsculas. Si se trata de un nombre
compuesto cada palabra debe empezar con mayúscula y no se recomienda utilizar
guion bajo para separar las palabras. Ejemplo: calcularSueldo, setNombre, total. 55
• Los nombres de las clases empiezan siempre con mayúsculas. En los nombres compuestos
cada palabra debe empezar con mayúscula y no se recomienda utilizar guion bajo para
separar las palabras. Ejemplo: Alumno, HolaMundo,
PerimetroCircunferencia, son nombres válidos.
Ejemplos
d e identificadores no válidos:
TRABAJO EN CLASE:
Escribe un identificador válido y identificador inválido para Java
VALIDOS INVALIDOS
Clases: Clases:
…………………………………………………… ……………………………………………………
Métodos: Métodos:
…………………………………………………… ……………………………………………………
Variables: Variables:
…………………………………………………… ……………………………………………………
Constantes: Constantes:
…………………………………………………… ……………………………………………………
Un programa Java utiliza variables para almacenar valores, realizar cálculos, modificar
valores almacenados, mostrar por la consola, etc. Una variable almacena un único valor. Una
variable se define por un nombre, el tipo de dato y el rango de valores que puede almacenar.
56
Las variables sirven para identificar un determinado valor. Es importante tener en cuenta,
que una variable se almacena en la memoria interna del ordenador (normalmente en la
memoria RAM) y por lo tanto ocupará una determinada posición en esa memoria.
Desde el punto de vista del programador, la memoria RAM es una sucesión de celdillas, cada
una de las cuales posee una dirección. Cada celdilla ocupa un espacio que, en general, es de
un byte. Por lo tanto un valor que ocupe cuatro bytes, ocupará cuatro celdas.
Es decir si saldo es un identificador que se refiere a un valor numérico que en este instante
vale 8; la realidad interna es que saldo realmente es una dirección a una posición de la
memoria en la que ahora se encuentra el número 8.
En Java (y en casi todos los lenguajes) hay que declarar las variables antes de poder utilizarlas.
Al declarar lo que ocurre es que se reserva en memoria el espacio necesario para almacenar
el contenido de la variable. No se puede utilizar una variable sin declarar. Para declarar una
variable se usa esta sintaxis:
tipo identificador;
Por ejemplo:
int x;
En Java se puede declarar una variable en cualquier parte del código, basta con declarar antes
de utilizarla por primera vez. Pero es muy buena práctica hacer la declaración al principio del
código. Esto facilita la comprensión del código.
También es buena práctica poner un pequeño comentario a cada variable para indicar para
que sirve. Finalmente el nombre de la variable (el identificador) conviene que sea descriptivo.
Nombres como a, b o c; no indica nada. Nombre como saldo, gatos, nota,…son mucho más
significativas.
int x, y, z;
Al declarar variables se necesita indicar cuál es el tipo de datos de las variables, los tipos básicos
permitidos en Java son:
57
Tipos enteros
Los tipos int, byte, short y long sirven para almacenar enteros. Normalmente los números se
almacenan en el tipo int.
Tipos decimales
Los números decimales se representan con los tipos float y double. La diferencia no solo está en
que en el double quepan números más altos, sino en la precisión.
Ambos tipos son de coma flotante. En este estilo de almacenar números decimales, la
precisión es limitada. Cuántos más bits se destinen a la precisión, más preciso será el número.
Por eso es más conveniente usar el tipo double aunque ocupe más memoria.
Tipos lógicos
En el lenguaje las variables lógicas que pueden ser true o false. Se escriben siempre en minúsculas.
Tipos Carácteres
Los valores de tipo carácter representan un carácter UNICODE. Se escribe siempre entre
comillas simples, por ejemplo: ‘a’, ‘B’, ‘9’. Los caracteres que tienen una
representación especial se indican en la siguiente tabla:
TRABAJO EN CLASE:
Declara una variable con cada tipo primitivo de Java, uno en cada celda.
58
int: byte: shor: long:
Además de declarar una variable. A las variables se las pueden asignar valores. El operador de
asignación en Java es el signo “=”. Ejemplo:
x=3;
Se puede declarar e inicializar valores a la vez:
int a=5;
TRABAJO EN CLASE:
Asigna un valor a cada variable según su tipo.
4.7. Literales
Cuando una variable se asigna a valores literales (17, 2.3,etc.) hay que tener en cuenta lo siguiente:
* Los números se escriben tal cual (17, 34, 39)
* El separador de decimales es el punto (18.4 se interpreta como 18 coma 4)
* Los caracteres simples van encerrados entre comillas simples, ‘a’
* Los textos (Strings) van encerrados entre comillas dobles “Hola”
Toda variable tiene un ámbito. Esto es la parte del código en la que una variable se puede utilizar.
De hecho las variables tienen un ciclo de vida:
59
[1] En la declaración se reserva el espacio necesario para que se puedan comenzar
a utilizar (digamos que se avisa de su futura existencia)
[3] Se la utiliza en diversas sentencias (no se debe leer su contenido sin haberla
asignado ese primer valor).
[4] Cuando finaliza el bloque en el que fue declarada, la variable muere. Es decir, se
libera el espacio que ocupa esa variable en memoria. No se la podrá volver a
utilizar.
Variables locales
Son variables que se crean dentro de un bloque (se entiende por bloque, el código que está
entre { y }). Con el fin del bloque la variable es eliminada. La mayoría son locales a una
determinada función, es decir sólo se pueden utilizar dentro de esa función.
Ejemplo:
void func1(){
int x;
x=5;
}
void func2(){
int y;
y=300;
}
Variables globales
Debido a que Java es un lenguaje orientado a objetos, no es muy correcto el uso de variables
globales; usarlas causa malos hábitos.
Son variables que se pueden utilizar en cualquier parte del código. Para que una variable
sea global basta con declararla fuera de cualquier bloque. Normalmente se declaran antes
de que aparezca la primera función:
En Java no se permite declarar en el mismo bloque dos variables con el mismo nombre. Pero
sí es posible tener dos variables con el mismo nombre si están en bloques distintos. Esto
plantea un problema, ya que cuando se utiliza la variable surge una duda: ¿qué variable
utilizará el programa, la más local o la más global? La respuesta es que siempre se toma la
variable declarada más localmente.
60
TRABAJO EN CLASE:
Escribe una diferencia entre una variable local y una variable global.
_______________________________________________________________
______________________________________________________________
______________________________________________________________
______________________________________________________________
En numerosos lenguajes no se pueden asignar valores entre variables que sean de distinto tipo.
Esto significaría que no podemos asignar a una variable char valores de una
variable int.
61
Los operadores de conversión (cast) se usan así:
(tipo) variable
Ejemplo:
4.10. Operadores
Se trata de uno de los puntos fuertes de este lenguaje que permite especificar expresiones
muy complejas gracias a estos operadores.
operador significado
+ Suma
- Resta
* Producto
/ División
% resto (módulo)
++ Incremento
-- Decremento
La suma, resta, multiplicación y división son las operaciones normales. Sólo hay que tener
cuidado en que el resultado de aplicar estas operaciones puede ser un número que tenga
un tipo diferente de la variable en la que se pretende almacenar el resultado.
El signo “-“ también sirve para cambiar de signo (-a es el resultado de multiplicar a la variable a por
-1).
El incremento (++), sirve para añadir uno a la variable a la que se aplica. Es decir x++ es lo mismo
que x=x+1. El decremento funciona igual pero restando uno. Se puede utilizar por delante
(preincremento) o por detrás (postincremento) de la variable a la que se aplica (x++ ó ++x).
Esto último tiene connotaciones. Por ejemplo:
[1] y1=x1
[2] x1=x1+1
[1] x2=x2+1
[2] y2=x2
Es decir en ++x2 primero se incrementó y luego se asignó el valor incremento a la variable y2.
TRABAJO EN CLASE:
Supongamos que b tiene el valor 5 y c el valor 8. ¿Cuál es el valor de a, b y c después de la ejecución
de cada una de las líneas del siguiente fragmento de programa?
Son operadores que sirven para realizar comparaciones. El resultado de estos operadores es
verdadero o falso (uno o cero). Los operadores son:
operador significado
> Mayor que
> Mayor o igual que
=< Menor que
< Menor o igual que
== Igual que
=! Distinto de
=
Un detalle importante es el hecho de que en Java el signo = sirve para asignar valores, mientras que
== sirve para comparar dos valores.
Permiten agrupar expresiones lógicas. Las expresiones lógicas son todas aquellas
expresiones que obtienen como resultado verdadero o falso. Estos operadores unen estas
expresiones devolviendo también verdadero o falso. Son:
63
operador significado
&& Y (AND)
|| O (OR)
¡ NO (NOT)
Por ejemplo: (18>6) && (20<30) devuelve verdadero (1) ya que la primera expresión (18>6) es
verdadera y la segunda (20<30) también. El operador Y (&&) devuelve verdadero cuando las dos
expresiones son verdaderas. El operador O (||) devuelve verdadero cuando cualquiera de las dos
es verdadera.
TRABAJO EN CLASE:
System.out.println(x); //Escribe 48
En Java existen estas formas abreviadas de asignación. Esto sirve como abreviaturas para escribir
código. Así la expresión:
x=x+10;
Se puede escribir como:
64
x+=10;
operador significado
+= Suma y asigna
-= Resta y asigna
*= Multiplica y asigna
/= Divide y asigna
%= Calcular el resto y asigna
En expresiones como:
x=6+9/3;
Podría haber una duda. ¿Qué vale x? Valdría 5 si primero se ejecuta la suma y 9 si primero se
ejecuta la división. La realidad es que valdría 9 porque la división tiene preferencia sobre la
suma. Es decir hay operadores con mayor y menor preferencia.
Lógicamente el orden de ejecución de los operadores se puede modificar con paréntesis.
Por ejemplo:
x=(6+9/3;
y=(x*3)/((z*2)/8);
[1] ( ) [ ]
[2] Lo forman los siguientes:
* Cambio de signo: -
* Decremento e incremento: ++ --
[3] Aritméticos prioritarios: / * %
[4] Aritméticos no prioritarios (suma y resta): + -
[5] Relacionales sin igualdad: > < >= <=
[6] Relacionales de igualdad: == !=
65
[7] ^
[9] | |
[10] = *, = /,=+
TRABAJO EN CLASE:
Resuelve los siguientes ejercicios, según el orden de los operadores:
2*5+(5-6)^2 =
………………………………………………………………………………………… (10-2) >
(5-3) = ………………………………………………………………………………………… true
&& false =
…………………………………………………………………………………………
3+5 < 5*2 || 3 > 8 && 7 > 6-2 =
………………………………………………………………………………………….
2 *(4+5)/3 + 5 =
……………………………………………………………………………………………
66
[1ero BGU Poliva lente Informática]
Docente: Ing. Irlanda Loján Herrera
Estructuras de Control
Hasta este momento nuestros programas en Java apenas pueden realizar programas que simulen,
como mucho, una calculadora. Lógicamente necesitamos poder elegir qué cosas se ejecutan
según unas determinada circunstancias.
Todas las sentencias de control de flujo se basan en evaluar una expresión lógica. Una
expresión lógica es cualquier expresión que pueda ser evaluada con verdadero o falso. En Java se
considera verdadera cualquier expresión distinta de 0 (en especial el 1, valor true) y falsa el cero
(false).
Las estructuras de control de un programa deben ejecutar determinadas instrucciones
solo cuando se cumple una condición. En otras ocasiones, debe repetir un conjunto de sentencias
un número determinado de veces. Las estructuras de control permiten condicionar el flujo de
ejecución dependiendo del estado de las variables de un programa.
5.1.2. Sentencia if
Se trata de una sentencia que, tras evaluar una expresión lógica, ejecuta una serie de sentencias en
caso de que la expresión lógica sea verdadera. Su sintaxis es:
if(expresión lógica) { 2
sentencias;
}
Si sólo se va a ejecutar una sentencia, no hace falta usar las llaves: if(expresión
lógica) sentencia;
Ejemplo:
if(nota>=7){
System.out.println(“Aprobado”);
[nota<5] incrementa nº
aprobados
Es igual que la anterior, sólo que se añade un apartado else que contiene instrucciones que se
ejecutarán si la expresión evaluada por el if es falsa. Sintaxis:
if(expresión lógica){
sentencias
} else {
sentencias
}
Las llaves son necesarias sólo si se ejecuta más de una sentencia. Ejemplo:
if(nota>=5){
System.out.println(“Aprobado”); aprobados++;
} else
{
System.out.println(“Reprobado”); suspensos++;
}
3
Ilustración 8, diagrama UML de actividad del ejemplo anterior
[1ero BGU Polivalente Informática]
Docente: Ing. Irlanda Loján Herrera
Anidación
Dentro de una sentencia if se puede colocar otra sentencia if. A esto se le llama Anidación y permite
crear programas donde se valoren expresiones complejas.
Por ejemplo en un programa donde se realice una determinada operación dependiendo de los
valores de una variable, el código podría quedar:
if (x==1) {
//sentencias
} else
{
if(x==2) {
//sentencias
} else { if(x==3) {
//sentencias
....
Pero si cada else tiene dentro sólo una instrucción if entonces se podría escribir de esta
forma (que es más legible), llamada if-else-if: 4
if (x==1) {
//instrucciones
} else if
(x==2) {
//instrucciones
} else if
(x==3) {
//instrucciones
}
Crea en Netbeans una clase denominada Calificaciones para solucionar el siguiente problema
utilizando la sentencia de control if. Mostrar la calificación de un alumno, es necesario evaluar las
Se trata de una sentencia que permite construir alternativas múltiples. Pero que en el lenguaje Java
está muy limitada. Sólo sirve para evaluar el valor de una variable entera (o de carácter, char).
5
Tras indicar la expresión entera que se evalúa, a continuación se compara con cada valor agrupado
por una sentencia case. Cuando el programa encuentra un case que encaja con el valor de la
expresión se ejecutan todos los case siguientes. Por eso se utiliza la sentencias break para hacer
que el programa abandone el bloque switch. Sintaxis:
switch(expresión
entera){ case
valor1:
sentencias;
break; /*Para que programa salte fuera del switch de otro modo atraviesa todos los demás
case */ case valor2: sentencias; default:
sentencias;
}
Ejemplo:
Sólo se pueden evaluar expresiones con valores concretos (no hay una case >3 por ejemplo).
Aunque sí se pueden agrupar varias expresiones aprovechando el hecho de que al entrar en un
case se ejecutan las expresiones de los siguientes. Ejemplo:
int diasemana=7; switch
(diasemana) {
6
5.1.4. Bucles
Sentencia while
Es una de las sentencias fundamentales para poder programar. Se trata de una serie de instrucciones
que se ejecutan continuamente mientras una expresión lógica sea cierta.
Sintaxis:
[2] Si la expresión es verdadera ejecuta las sentencias, sino el programa abandona la sentencia
while
int i=1;
while (i<=100){
System.out.println(i+" ");
i++;
}
Sentencia do...while
La única diferencia respecto a la anterior está en que la expresión lógica se evalúa después de haber
ejecutado las sentencias. Es decir el bucle al menos se ejecuta una vez. Es decir los pasos
son: 7
[1] Ejecutar sentencias
[3] Si la expresión es verdadera volver al paso 1, sino continuar fuera del while
Sintaxis:
do { sentencias;
} while (expresión lógica)
int i=0;
do {
i++;
System.out.println(i+" ");
} while (i<=1000);
Sentencia for
for(inicialización;condición;incremento){ sentencias;
}
Las sentencias se ejecutan mientras la condición sea verdadera. Además antes de entrar en el bucle
se ejecuta la instrucción de inicialización y en cada vuelta se ejecuta el incremento. Es decir el
funcionamiento es:
[4] Tras ejecutar las sentencias, se ejecuta la instrucción de incremento y se vuelve al paso
2
8
for(int i=1;i<=1000;i++){
System.out.printl(i+" ");
}
La ventaja que tiene es que el código se reduce. La desventaja es que el código es menos
comprensible. El bucle anterior es equivalente al siguiente bucle while:
En el siguiente ejemplo utiliza for anidados. ¿Cuántos veces se muestra por la consola el mensaje “Hola
mundo”?
9
Utilizando los tres bucles repetitivos imprime las tablas de multiplicar del 1 con el siguente
formato:
Sentencia break
Se trata de una sentencia que hace que el flujo del programa abandone el bloque en el que se
encuentra.
En el listado anterior el contador no llega a 1000, en cuanto llega a 300 sale del for
Sentencia continue
Es parecida a la anterior, sólo que en este caso en lugar de abandonar el bucle, lo que ocurre es que
no se ejecutan el resto de sentencias del bucle y se vuelve a la condición del mismo:
for(int i=1;i<=1000;i++){
if(i%3==0) continue;
System.out.printl(i+"
");
}
1
.1.5. Sentencias de ruptura de flujo
10
En ese listado aparecen los números del 1 al 1000, menos los múltiplos de 3 (en los múltiplos de 3
se ejecuta la instrucción continue que salta el resto de instrucciones del bucle y vuelve a la siguiente
iteración.
El uso de esta sentencia genera malos hábitos, siempre es mejor resolver los problemas sin usar
continue. El ejemplo anterior sin usar esta instrucción quedaría:
for(int i=1;i<=1000;i++){
if(i%3!=0) System.out.printl(i+" ");
}
11
[1ero BGU Polivalente Informática]
Docente: Ing. Irlanda Loján Herrera
Clases y Objetos
6.1.1. Introducción
Al realizar programas, a medida que pretendamos resolver problemas más complejos cada vez,
el tamaño de nuestro código empieza a desbordarnos. Para mitigar este problema apareció la
programación orientada a objetos. En ella el programa se divide en distintos partes, de manera que
cada parte contiene código de tamaño más manejable. Cada parte realiza una función muy
concreta y se puede programar de forma independiente.
Así una aplicación se puede entender (en la POO) como un conjunto de partes que se
comunican entre sí. Cuando este paradigma se domina, se programan partes utilizables en más de
un programa, a esto se le llama reutilizar el código.
Un programa Java utiliza clases y objetos. Las clases representan un esquema simplificado de
cláusulas de una aplicación informática. Una clase es una representación abstracta de un conjunto
de objetos que comparten los mismos atributos y comportamientos. Un objeto es una instancia de
una clase, tiene una identidad propia y un estado.
12
• Ocultación. Hay una zona oculta al definir las c l a s e s (zona privada) que sólo es utilizada
por esas clases y por alguna clase relacionada. Hay una zona pública (llamada también
interfaz de la clase) que puede ser utilizada por cualquier parte del código.
El estado marca las condiciones de existencia del objeto dentro del programa. Lógicamente este
estado puede cambiar. Un coche puede estar parado, en marcha, estropeado, funcionando, sin
gasolina, etc.
El comportamiento determina como responde el objeto ante peticiones de otros objetos. Por
ejemplo un objeto conductor puede lanzar el mensaje arrancar a un coche. El comportamiento
determina qué es lo que hará el objeto.
La identidad determina que cada objeto es único aunque tengan el mismo valor. No existen dos objetos
iguales. Lo que sí existe es dos referencias al mismo objeto.
6.1.4. Clase
Una clase se define por la palabra reservada class seguida del nombre de la clase. El nombre de la
clase debe empezar por mayúscula. Si el nombre de la clase es compuesto, entonces cada palabra
debe empezar por mayúscula. Círculo, Rectángulo, Triangulo y FigurasGeometricas son nombres
válidos de clase.
Las clases son las plantillas para hacer objetos. Una clase sirve para definir una serie de objetos
con propiedades (atributos), comportamientos (operaciones o métodos), y semántica comunes.
Hay que pensar en una clase como un molde. A través de las clases se obtienen los objetos en sí.
Es decir antes de poder utilizar un objeto se debe definir la clase a la que pertenece, esa definición
incluye:
• Sus atributos. Es decir, los datos miembros de esa clase. Los datos pueden ser públicos
(accesibles desde otra clase) o privados (sólo accesibles por código de su propia clase. También
se las llama campos.
13
• Sus métodos. Las funciones miembro de la clase. Son las acciones (u operaciones) que
puede realizar la clase.
• Código de inicialización. Para crear una clase normalmente hace falta realizar operaciones
previas (es lo que se conoce como el constructor de la clase).
Nombre de la clase
Atributos Métodos
Por ejemplo, la clase Circulo sed define con tres atributos: el radio y las coordenadas x, y que definen la
posición del centro del círculo.
6.1.5. Objetos
Se les llama instancias de clase. Son un elemento en sí de la clase (en el ejemplo del parchís, una
ficha en concreto). Un objeto se crea utilizando el llamado constructor de la clase. El constructor
es el método que permite iniciar el objeto.
Una vez que se ha declarado una clase, se pueden crear objetos a partir de ella. A la creación de un
objeto se le demonina instanciación. Es por esto que se dice que un objeto es una instancia de una
clase y el término instancia y objeto se utilizan indistintamente.
Para crear objetos, basta con declarar una variable de alguno de los tipos de figuras geométricas:
Para crear objetos y asignar un espacio de memoria es necesario realizar la instanciación con el operador
new.
14
Después de crear los objetos, circulo1, circulo2 almacenan los valores predeterminados de
la clase Círculo. A partir de este momento los objetos ya pueden ser referenciados por su nombre.
Los nombres de circulo1 y circulo2 son las referencias válidas para utilizar ambos objetos.
Se trata de una palabra que antecede a la declaración de una clase, método o propiedad de clase.
Hay tres posibilidades: public, protected y private. Una cuarta posibilidad es no utilizar ninguna de
estas tres palabras; entonces se dice que se ha utilizado el modificador por defecto (friendly).
public class Carro { public String marca;//Se puede acceder desde cualquier clase private String
color;//Sólo se puede acceder desde la clase Carro
protected int año; //Acceden a esta propiedad esta clase y sus descendientes
}
sin
private modificador protected public
zona (privado) (friendly) (protegido) (público)
Misma clase X X X X
En su cuaderno crea una clase denominada Factura y declara los atributos necesarios con
cada uno de los especificadores de acceso.
15
6.1.7. Elementos de una clase
Atributos
La información de un objeto se almacena en atributos. Los atributos pueden ser de tipos
primitivos de Java o de tipo Objeto. Por ejemplo, para el catálogo de vehículos de una empresa
de alquiler , es necesario conocer la matrícula del coche, su marca, modelo, color, la tarifa
de alquiler y su disponibilidad.
Métodos
Además de definir los atributos de un objeto, es necesario definir los métodos que
determinan su comportamiento. Los métodos se utilizan de la misma forma que los atributos,
excepto porque los métodos poseen siempre paréntesis, dentro de los cuales pueden ir valores
necesarios para la ejecución del método (parámetros):
Toda clase debe definir un método especial denominado constructor y tiene el mismo nombre de
la clase y lleva paréntesis como un método.
Cuando se definen los datos de una determinada clase, se debe indicar el tipo de propiedad
que es (String, int, double, int[][],...) y el especificador de acceso (public, private,...). El
especificador indica en qué partes del código ese dato será visible.
Ejemplo:
public class Persona { public String nombre;//Se puede acceder desde cualquier clase
private int contraseña;//Sólo se puede acceder desde la clase Persona protected String
dirección;//Acceden a esta propiedad esta clase y sus descendientes
}
Por lo general las propiedades de una clase suelen ser privadas o protegidas, a no ser que se trate de un
valor constante, en cuyo caso se declararán como públicos.
Persona
16
+nombre: String
-contraseña: String
#direccion: String
Ilustración 2, La clase persona en UML. El signo + significa public, el signo # protected y el signo
-private
Esto último se debe a que los métodos son funciones que pueden devolver un determinado
valor (un entero, un texto, un valor lógico,...) mediante el comando return. Si el método
no devuelve ningún valor, entonces se utiliza el tipo void que significa que no devuelve valores (en
ese caso el método no tendrá instrucción return).
El último detalle a tener en cuenta es que los métodos casi siempre necesitan datos para
realizar la operación, estos datos van entre paréntesis y se les llama argumentos. Al definir el
método hay que indicar que argumentos se necesitan y de qué tipo son.
Ejemplo:
public class vehiculo {
int ruedas;
private doubleelocidad=0;
String nombre;
/** Método para aumentar la velocidad*/
Vehiculo
ruedas:int
-velocidad:double=0
#direccion:String nombre:String
+acelerar(double)
+frenar(double)
+obtenerVelocidad( ):double
Un método es una llamada a una operación de un determinado objeto. Al realizar esta llamada
(también se le llama enviar un mensaje), el control del programa pasa a ese método y lo mantendrá
hasta que el método finalice o se haga uso de return.
Argumentos por valor y por referencia: Los argumentos son los datos que recibe un método y que
necesita para funcionar. Ejemplo:
En el ejemplo anterior, el valor 25 es un argumento requerido por el método factorial para que éste
devuelva el resultado (que será el factorial de 25). En el código del método factorial, este valor 25
es copiado a la variable n, que es la encargada de almacenar y utilizar este valor.
Se dice que los argumentos son por valor, si la función recibe una copia de esos datos, es decir la variable
que se pasa como argumento no estará afectada por el código. Ejemplo:
18
public class prueba {
public void metodo1(int entero){ entero=18;
...
} ...
public static void main(String args[]){
int x=24;
prueba miPrueba = new prueba(); miPrueba.metodo1(x);
System.out.println(x); //Escribe 24, no 18
}}
Este es un ejemplo de paso de parámetros por valor. La variable x se pasa como argumento
o parámetro para el método metodo1, allí la variable entero recibe una copia del valor de x en
la variable entera, y a esa copia se le asigna el valor 18. Sin embargo la variable x no está afectada
por esta asignación.
Sobrecarga de métodos
Una propiedad de la POO es el polimorfismo. Java posee esa propiedad ya que admite
sobrecargar los métodos. Esto significa crear distintas variantes del mismo método.
Ejemplo:
}
public double suma(double x, double y, double z){
return x+y+z;
}
public double suma(double[] array){
double total =0;
for(int i=0; i<array.length;i++){
total+=array[i];
}
return total;
}}
La clase matemáticas posee tres versiones del método suma () una versión que suma dos números
double, otra que suma tres y la última que suma todos los miembros de un array de doubles. Desde
el código se puede utilizar cualquiera de las tres versiones según convenga.
19
La referencia this
• this. Referencia al objeto actual. Se usa por ejemplo pasarle como parámetro a un método
cuando es llamado desde la propia clase.
• €this.atributo. Para acceder a una propiedad del objeto actual.
• this.método (parámetros). Permite llamar a un método del objeto actual con los parámetros
indicados.
• this (parámetros). Permite llamar a un constructor del objeto actual. Esta llamada sólo
puede ser empleada en la primera línea de un constructor.
Creación de constructores
20
La instancia de un objeto se realiza ejecutando el método constructor de la clase, como se muestra a
continuación.
En este ejemplo se instancia el objeto vehiculo1. El método constructor crea el objeto vehículo con
la matricula “4050 ABJ”, marca “VW”, modelo “GTI”, color “Blanco” y tarifa 100.0 euros.
En este ejemplo se instancia el objeto vehiculo2. El método constructor crea el objeto vehículo
con la matricula “2345 JVM”, marca “SEAT”, modelo “León”, color “Negro” y tarifa 80.0 euros.
21
6.1.8 El método main ()
Existe un método especial, llamado main (). Este método se invoca cuando se ejecuta un
programa Java. Todo programa en Java debeb tener una clase con el método main (). Este
método se debe declarar public static void. Es un método estatico, público y n devuelve un valor
de retorno. Los parámetros String[] args se refieren a la línea de comandos de la aplicación.
Cuando la máquina virtual de Java (JVM) ejecuta un programa Java invoca al método main (). Este
método quien a us vez ejecuta los métodos de la aplicación.
6.1.10. Objetos
22
6.1.11. Extensión de clases
Para que una clase herede las características de otra hay que utilizar la palabra clave extends
tras el nombre de la clase. A esta palabra le sigue el nombre de la clase cuyas características se
heredarán. Sólo se puede tener herencia de una clase (a la clase de la que se hereda se la llama
superclase y a la clase heredada se la llama subclase).
Ejemplo:
Por defecto se heredan todos los métodos y propiedades protected y public (no se heredan los
private). Además si se define un método o propiedad en la subclase con el mismo nombre
que en la superclase, entonces se dice que se está redefiniendo el método, con lo
cual no se hereda éste, sino que se reemplaza por el nuevo.
23
Ejemplo:
Superclase
public class vehiculo { public int
velocidad, ruedas; public
void parar() {
velocidad = 0;
}
public void acelerar(int kmh) {
velocidad += kmh;
}
}
Figuras
#base: double
#altura: double
+calcularArea():double
Crear la clase subclase.
Rectangulo
-area: double=0
-calcularPerimetro():double
EjecutableFiguras
81
Subclase
public class coche extends
vehiculo{ public int ruedas=4;
public int gasolina;
public void repostar(int litros) {
gasolina+=litros;
}
}
6.1.12. Paquetes
Los paquetes son grupos de clases, interfaces y otros paquetes que están relacionados entre
sí. Los paquetes aportan una forma de encapsulamiento de un nivel superior al de las clases.
Permiten unificar un conjunto de clases e interfaces que se relacionan funcionalmente. Por
ejemplo, el paquete java.
25
Un paquete se declara con la siguiente sintaxis: package
nombre-del-paquete;
Por ejemplo, se podría definir el paquete vehículos para la aplicación de la empresa de alquiler
de vehículos:
package vehiculos;
El nombre del paquete debe ser representativo a su contenido. El nombre puede contener
la aclaración de subpaquetes.
Una característica importante de Java es que aporta gran cantidad de clases predefinidas.
Estas clases están especializadas en comunicaciones, web, interfaz de usuario, matemáticas y
muchas otras aplicaciones.
A continuación se describen las clases asociadas a los tipos primitivos de Java, la clase Math y la
clase String.
Los tipos predefinidos boolean, char, int, long, float y double son tipos simples, no son clases.
Para faciliatar la programación en Java se han creado clases asociadas a los tipos predefinidos.
Estas clases proporcionan métodos útiles para convertir cadenas de texto a otros tipos, para
imprimir los números con diversos formatos y para describir los tipos simples.
La clase Math contiene constantes y métodos de uso común en matemáticas. Todas las
operaciones que se realizan en esta clase utilizan el tipo double. Contiene la constante pi
(Math.PI) y el número Euler (Math.E). En las funciones trigonométricas, los ángulos se
expresan en radianes y los métodos devuelven valores de tipo doublé. La clase Math incluye
funciones como potenciación, redondeo, cuadrado, raíz cuadrada y muchas más.
Para más información sobre los métodos de la clase Math, consulte el API de Java.
http://docs.oracol.com/javas/1.5.0/docs/api/java/lang/Math.html 26
Investiga y presenta un informe de los atributos y métodos de la clase
Math.
Un objeto String se puede crear a partir de una secuencia de caracteres delimitados por comillas
dobles.
La clase String tiene un tratamiento particular en Java. Además de la construcción de objetos a partir de
literales entre comillas, se pueden aplicar los operadores + y
+= para concatenar objetos de tipo String.
Para conocer la longitud de un objeto String se utiliza el método length (). Por jemplo, el objeto
holaMundo tiene una longitud de 10 caracteres.
Para comparar cada letra de dos objetos de tipo String se utiliza el método contentEquals().
27
Para más información sobre los métodos de la clase Math, consulte el API de Java.
http://docs.oracol.com/javas/1.5.0/docs/api/java/lang/String.html
28
[1ero BGU Polivalente Informática]
Docente: Ing. Irlanda Loján Herrera
• Arrays. También llamadas listas estáticas, matrices y arreglos (aunque quizá lo más apropiado
es no traducir la palabra array). Son una colección de datos del mismo tipo.
Imaginemos que deseamos leer las notas de una clase de 25 alumnos. Desearemos por tanto
almacenarlas y para ello, utilizando variables clásicas no nos quedará más remedio que
declarar 25 variables. Eso es tremendamente pesado de programar. Manejar las notas significaría
manejar continuamente 25 variables. Este tipo de problemas es el que se encargan de solucionar
los arrays.
Los arrays son una colección de datos del mismo tipo al que se le pone un nombre (por ejemplo
nota). Para acceder a un dato de la colección hay que utilizar su índice (por ejemplo nota[4] leerá
la cuarta nota).
Tras leer las 25 notas, el resultado se almacena en la variable nota y se podrá acceder a cada valor
individual usando nota[i], donde i es el elemento al que queremos acceder. Hay que tener en
cuenta que en los arrays el primer elemento es el 0; es decir nota[4] en realidad es el quinto
elemento.
Una array ocupa un determinado espacio fijo en memoria. Para que el ordenador asigne la
cantidad exacta de memoria que necesita el array, hay que declararle. En la declaración se
indica el tipo de datos que contendrá el array y la cantidad de elementos. Por ejemplo:
Ejemplos:
String array[]; //donde array es un arreglo que guardara variables tipo Strings double array2[]; //donde array2 es
un arreglo que guardara variabels tipo doublé int [] array3; //donde array3 es un arreglo que guardara variables
tipo int(numericas)
30
Declara un arreglo por cada tipo primitivo de datos y uno de tipo String (9 arreglos).
Ejemplo:
String a[];
a = new String[7]; //el arreglo array guardara un máximo de 10 variables de tipo String
Para realizar una declaración de un arreglo y definir su tamaño en una misma línea se puede usar la
siguiente estructura:
String a[] = new String[7]; //se declara un arreglo y se asigna su tamaño en una misma línea
Esa instrucción declara un arre llamado a de siete elementos. Lo que significa que en memoria se
reserva el espacio de siete enteros (normalmente 2 o 4 bytes por cada entero). Los elementos del
array irán de a[0] a a[6] (hay que recordar que en Java el primer elemento de un array es el
cero).
Hay que tener en cuenta que los arrays contienen una serie finita de elementos, es decir, de
antemano debemos conocer el tamaño que tendrá el array. El valor inicial de los elementos
del array será indeterminado (dependerá de lo que contenga la memoria que se ha asignado
al array, ese valor no tiene ningún sentido).
31
Ahora define el tamaño de los arregl os que declaraste en el taller anterior
(Asígnale el tamaño que usted crea conveniente)
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
Asignación de valores
El acceso a cada uno de los valores se realiza utilizando un índice que permite indicar qué elemento
del array estamos utilizando.
Por ejemplo:
int numeros = new int[4]; numeros[0]=2; numeros[1]=-4; numeros[2]=15;
numeros[3]=-25;
numeros[i]=i*i+4;
}
No necesitamos recordar el número de elementos del array, su miembro dato length nos
proporciona la dimensión del array. Escribimos de forma equivalente
Los arrays se pueden declarar, crear e inicializar en una misma línea, del siguiente
modo
32
int[] numeros={2, -4, 15, -25};
String[] nombres={"Juan", "José", "Miguel", "Antonio"};
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
Búsqueda en arrays
En muchas ocasiones se necesita comprobar si un valor está en un array. Para ello se utilizan
funciones que indican si el valor está o no en el array. Algunas devuelven verdadero o falso, depe
En algunos casos las funciones trabajan sobre arrays que deben de estar ordenados.
Búsqueda lineal
Trabajan dependiendo de si el valor está o no; y otras (mejores aún) devuelven la posición del
elemento buscado en el array (o un valor clave si no se encuentra, por ejemplo el valor -1). 33
Con arrays desordenados. La función de búsqueda busca un valor por cada elemento del array. Si le
encuentra devuelve la posición del mismo y si no devuelve -1.
Ejercicio:
Escribe un programa que lea las notas de los alumnos de tu curso y reporte lo siguiente:
La nota promedio.
La lista de alumnos con nota mayor o igual al promedio, indicando cuantos son.
Sintaxis
tipo nombre_array[][]=new tipo[nº][nº];
Ejemplo:
Características: 34
• Todos los valores se inicializan con cero
• Se crea 5 filas y 6 columnas
• Todos los datos son enteros
i nt[ ][ ] n = int [ 5 ][ 4 ];
Crea una arreglo bidimensional por cada tipo de datos primitivo a asígnale un tamaño que
creas conveniente.
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
________________________________________________________________________
35
Hay que recordar que los elementos empiezan a numerarse por 0. Así, la esquina superior izquierda
de la matriz será el elemento [0][0] y la esquina inferior derecha será el [2][1]. Hay que prestar
atención a esto porque en otros lenguajes de programación la numeración puede empezar por 1
en vez de por 0.
Donde {1,2} corresponde a la fila 1, {3,4} a la fila 2 y {5,6} a la fila 3, y los números separados por
coma dentro de cada fila, corresponden a las columnas. En este caso, los números (1, 3, 5) de cada
una de las filas corresponden a la primera columna y los números (2, 4, 6) atañen a la segunda
columna.
Para obtener el número de filas de la matriz, podemos recurrir a la propiedad “length” de los
arrays, de la siguiente manera:
EJERCICIO
Vamos a plantear y resolver un ejercicio: queremos almacenar en una matriz el número de alumnos con
el que cuenta una academia, ordenados en función del nivel y del idioma que se estudia. Tendremos 3
filas que representarán al Nivel básico, medio y de perfeccionamiento y 4 columnas en las que figurarán
los idiomas (0 = Inglés, 1 = Francés, 2= Alemán y 3 = Ruso). Se pide realizar la declaración de la matriz y
asignarle unos valores de ejemplo a cada elemento.
SOLUCIÓN
La declaración de la matriz sería:
alumnosfxniveleidioma[0][0] = 7 alumnosfxniveleidioma[0][1] = 14
alumnosfxniveleidioma[0][2]= 8 alumnosfxniveleidioma[0][3] = 3
alumnosfxniveleidioma[1][0] = 6 alumnosfxniveleidioma[1][1]= 19
alumnosfxniveleidioma[1][2] = 7 alumnosfxniveleidioma[1][3] = 2
36
alumnosfxniveleidioma[2][0] = 3 alumnosfxniveleidioma[2][1]= 13
alumnosfxniveleidioma[2][2] = 4 alumnosfxniveleidioma[2][3] = 1
La representación gráfica que podríamos asociar a esta asignación de datos sería esta matriz:
Para terminar en cuanto a multidimensionalidad, veamos casos de declaraciones con más de dos
dimensiones. Para ello supongamos que estamos realizando un “conteo de coches”, es decir, que
estamos contando los coches que pasan por un determinado lugar en un periodo de tiempo que
puede ser un día, varios días, varios meses, etc. La forma de declarar esos arrays podría ser la
siguiente:
37
Duración del Declaración con Java
conteo Tipo de array (nc es Número de coches)
Array de una dimensión
Un día (hora) int[] nc = new int[24];
Array de dos dimensiones
Varios días (hora y día) int[][] nc = new int[24][31];
Array de tres dimensiones
Varios meses (hora, día y mes) int[][][] nc = new int[24][31][12];
Array de cuatro dimensiones
Varios años (hora, día, mes y año) Int[][][][] nc = new int[24][31][12][2999];
Array de cinco dimensiones
Varios siglos Int[][][][][] nc = new int[24][31][12][2999][21];
(hora, día, mes, año y siglo)
Veamos lo que sería un ejemplo de programa con array multidimensional, usando un tipoString.
El resultado del programa es la aparición del mensaje “El alumno número 24 del curso tercero se llama
Pedro Hernández González.
En este ejemplo, [5] representa a los cursos. Hablamos de 5 cursos que son identificados con 0,
1, 2, 3, 4, por lo que [2] hace mención al tercer curso;lo mismo podemos decir de [23], que
corresponde al alumno número 24. Hay que recordar que siempre en Java tenemos que contar
el cero, ya que si no lo hacemos podemos cometer errores.
38