Está en la página 1de 61

INSTITUTO SUPERIOR TECNOLÓGICO

“DAVID AUSUBEL”

SEMIPRESENCIAL

TECNOLOGÍA EN INFORMÁTICA

GUÍA DIDÁCTICA

ALGORITMOS

COMPILACIÓN: NIVEL

FRANCISCO PUA BENAVIDES, Ing. PRIMERO

QUITO - ECUADOR
ÍNDICE

UNIDAD 1: INTRODUCCIÓN

1.1 Visión histórica.


1.2 Planteamientos de problemas.
1.3 ¿Qué es un algoritmo?
1.4 Pensamiento algorítmico.
1.5 Representación de algoritmos.
1.6 Simbología de los diagramas de flujo.

UNIDAD 2: FUNDAMENTOS DE PROGRAMACIÓN

2.1 Comentarios.
2.2 Identificadores.
2.3 Variables.
2.4 Constantes.
2.5 Contadores.
2.6 Acumuladores.
2.7 Palabras reservadas (primitivas).
2.8 Funciones matemáticas.
2.9 Tipos de datos.
2.10 Operadores.
2.11 Expresiones.
2.12 Procesos.
2.13 Interactividad.
2.14 Procedimientos.

UNIDAD 3: ESTRUCTURAS BÁSICAS

3.1 Estructura secuencial.


3.2 Estructura iterativa (repetición).
3.3 Estructura condicional.

UNIDAD 4: JAVA

4.1 Historia del Lenguaje.


4.2 ¿Qué es Java?.
4.3 ¿Qué lo hace distinto de los demás lenguajes?.
4.4 La máquina Virtual Java (JVM).
4.5 El Entorno de Desarrollo (JDK).
4.6 Visión general y elementos básicos del lenguaje.

i
4.7 Comentarios.
4.8 Tipos de datos.
4.9 Identificadores.
4.10 Declaración de variables.
4.11 Operadores.
4.12 Constantes.
4.13 Secuencias de Escape.
4.14 Entrada/Salida.
4.15 Esructuras de Control.
4.16 Vectores.
4.17 Ejercicios.

ii
UNIDAD 1

INTRODUCCIÓN
1.1 VISIÓN HISTÓRICA

La palabra algoritmo se deriva de la traducción al latín de la palabra árabe alkhowarizmi,


nombre de un matemático y astrónomo árabe que escribió un tratado sobre manipulación de
números y ecuaciones en el siglo IX.

1.2 PLANTEAMIENTOS DE PROBLEMAS

Lo que pretende un algoritmo es sintetizar de alguna forma una tarea, cálculo o


mecanismo.
Luego de analizar detalladamente un problema hasta entenderlo completamente, se procede
a diseñar un algoritmo (trazar un plan) que lo resuelva por medio de pasos sucesivos y
organizados en secuencia lógica. El concepto intuitivo de algoritmo (procedimientos y
reglas) se puede encontrar en procesos naturales de los cuales muchas veces no se es
consciente. Por ejemplo, el proceso digestivo es un concepto intuitivo de algoritmo con el
que se convive a diario sin que haga falta una definición “matemática” del mismo. La
familiaridad de lo cotidiano impide a las personas ver muchos algoritmos que se suceden a
su alrededor.

La rama del saber que mayor utilización ha hecho del enfoque algorítmico es la
matemática. Durante miles de años el ser humano se ha esforzado por abstraer la estructura
de la solución de problemas con el fin de determinar claramente cuál es el camino seguro,
preciso y rápido que lleva a esas soluciones.
Son abundantes los ejemplos: máximo común divisor, teorema de Pitágoras, áreas de
figuras geométricas, división, suma de números fraccionarios, etc. Todos estos algoritmos
matemáticos independizan los datos iniciales del problema de la estructura de su solución,
lo que permite su aplicación con diferentes conjuntos de datos iniciales (variables).

1.3 ¿QUÉ ES UN ALGORITMO?

En el ámbito de la computación, los Algoritmos son una herramienta que permite describir
claramente un conjunto finito de instrucciones, ordenadas secuencialmente y libres de
ambigüedad, que debe llevar a cabo un computador para lograr un resultado previsible.
Vale la pena recordar que un programa de computador consiste de una serie de
instrucciones muy precisas y escritas en un lenguaje de programación que el computador
entiende (Java, C, C++, etc.).

En resumen, un Algoritmo es una secuencia ordenada de instrucciones, pasos o procesos


que llevan a la solución de un determinado problema. Los hay tan sencillos y cotidianos
como seguir la receta del médico, abrir una puerta, lavarse las manos, etc.; hasta los que
conducen a la solución de problemas muy complejos.

1
Ejemplo 1.1: Un procedimiento que se realiza varias veces al día consiste en lavarse los
dientes. La siguiente sería la forma de expresar este procedimiento como un algoritmo:

1. Tomar la crema dental.


2. Destapar la crema dental.
3. Tomar el cepillo de dientes.
4. Aplicar crema dental al cepillo.
5. Tapar la crema dental.
6. Abrir la llave del lavamanos.
7. Remojar el cepillo con la crema dental.
8. Cerrar la llave del lavamanos.
9. Frotar los dientes con el cepillo.
10. Abrir la llave del lavamanos.
11. Enjuagarse la boca.
12. Enjuagar el cepillo.
13. Cerrar la llave del lavamanos.
14. Secarse la cara y las manos con una toalla.
15. Fin.

Ejemplo 1.2: El ejemplo de cambiar una bombilla (foco) fundida es uno de los más
utilizados por su sencillez para mostrar los pasos de un algoritmo:
1. Ubicar una escalera debajo de la bombilla fundida.
2. Tomar una bombilla nueva.
3. Subir por la escalera.
4. Girar la bombilla fundida hacia la izquierda hasta soltarla.
5. Enroscar la bombilla nueva en el plafón hasta apretarla.
6. Bajar de la escalera.
7. Fin.

En términos generales, un Algoritmo debe ser:

 Realizable: El proceso algorítmico debe terminar después de una cantidad finita de


pasos. Se dice que un algoritmo es inaplicable cuando se ejecuta con un conjunto de
datos iniciales y el proceso resulta infinito o durante la ejecución se encuentra con
un obstáculo insuperable sin arrojar un resultado.

 Comprensible: Debe ser claro lo que hace, de forma que quien ejecute los pasos
(ser humano o máquina) sepa qué, cómo y cuándo hacerlo. Debe existir un
procedimiento que determine el proceso de ejecución.

 Preciso: El orden de ejecución de las instrucciones debe estar perfectamente


indicado. Cuando se ejecuta varias veces, con los mismos datos iniciales, el
resultado debe ser el mismo siempre. La precisión implica determinismo.

Un aspecto muy importante sobre el cual las personas deben reflexionar es la ambigüedad
del lenguaje natural que se utiliza para comunicarse diariamente con sus semejantes. Los
algoritmos no admiten ningún tipo de ambigüedad ya que los lenguajes de programación
tienen un vocabulario restringido y preciso. Esto exige la utilización de un conjunto
determinado de palabras, mandos o primitivas en cualquiera de los procedimientos que se
elaboren.

2
Actividad 1.1: Discutir en grupo el ejemplo de la bombilla y proponer algunas mejoras.
Luego, un voluntario debe pasar al tablero para escribir el algoritmo con participación de
toda la clase.

1.4 PENSAMIENTO ALGORÍTMICO

El pensamiento Algorítmico incluye elementos tales como:


“descomposición funcional, repetición (iteración y/o recursión), organización de datos
(registro, campo, arreglo, lista, etc.), generalización y parametrización, diseño por
descomposición de un problema en partes más pequeñas y manejables (top-down) y
refinamiento”.1

Una diferencia notoria entre un algoritmo y un programa es que el algoritmo incorpora las
características estructurales básicas de la computación, independientemente de los detalles
de su implementación; mientras que un programa tiene un conjunto específico de detalles
para resolver un problema. Se puede observar que una técnica de solución (correspondiente
al algoritmo) se puede utilizar en diferentes situaciones problemáticas (correspondiente a
los programas).

1.5 REPRESENTACIÓN DE ALGORITMOS

Los Algoritmos se pueden expresar de muchas maneras, pero se puede decir que las dos
formas más importantes son: Seudocódigo y Diagrama de Flujo.
En Seudocódigo, la secuencia de instrucciones se representa por medio de frases o
proposiciones, mientras que en un Diagrama de Flujo, se representa por medio de
gráficos.

Ejemplo 1.3: Elaborar un Algoritmo para calcular el área de cualquier triángulo rectángulo
y presentar el resultado en pantalla.

Seudocódigo:

1. Inicio
2. Asignar el número 2 a la constante "Div"
3. Conocer la base del triángulo y guardarla en la variable "Base"
4. Conocer la altura del triángulo y guardarla en la variable "Altura"
5. Guardar en la variable "Area" el valor de multiplicar "Base" por "Altura"
6. Guardar en la variable "Area" el valor de dividir "Area" entre "Div"
7. Reportar el valor de la variable "Area"
8. Final

Diagrama de flujo

National Research Council (NRC). “Being Fluent with Information Technology”, 2004.
1

3
Inicio

DIV=2 Almacena el valor 2 en la constante DIV

Pide al usuario que digite el valor de la BASE


BASE

Pide al usuario que digite el valor de la ALTURA


ALTURA

AREA = BASE * ALTURA Almacena en AREA el valor de multiplicar BASE por ALTURA

Almacena en AREA el valor que ya había


AREA = AREA / DIV
almacenado en esta variable dividido por DIV

AREA Muestra en pantalla el valor de la variable AREA

Final

Fig. 1.1 Algoritmo para calcular el área de cualquier triángulo rectángulo.

El seudocódigo está compuesto por proposiciones informales (en este caso en español) que
permiten expresar detalladamente las instrucciones que llevan desde un estado inicial
(problema) hasta un resultado deseado (solución). Por lo regular, los algoritmos se escriben
por refinamiento: se escribe una primera versión que luego se descompone en varios
subproblemas (el número depende de la complejidad del problema) independientes entre sí.
Si es necesario se va refinando cada vez las instrucciones hasta que las proposiciones
generales en español como las del ejemplo anterior se puedan codificar en el lenguaje
seleccionado para hacer la programación.

Utilizar Diagramas de Flujo para representar un algoritmo tiene claras ventajas. Numerosas
investigaciones han mostrado que el Aprendizaje Visual es uno de los mejores métodos
para enseñar habilidades del pensamiento.

La utilización de Diagramas ayuda a:

 Clarificar el pensamiento: Se puede ver cómo se conectan los procesos y se puede


dar cuenta de cómo estos se pueden organizar o agrupar para darles el orden lógico
correcto.

 Identificar pasos erróneos: Sobre un diagrama es más fácil identificar los cambios
que se requieren para el correcto funcionamiento de un programa de computador
que hacerlo sobre el código.

4
Los Diagramas de Flujo son una de las técnicas más utilizadas para representar
gráficamente la secuencia de instrucciones de un Algoritmo. Estas instrucciones están
compuestas por operaciones, decisiones lógicas y ciclos repetitivos, entre otros. La solución
de un problema puede contener varios conjuntos de instrucciones (procedimientos o
métodos) que tienen como finalidad ejecutar cada uno de los procesos necesarios para
llegar a la solución de un problema a partir de los datos disponibles (estado inicial).

“Las ventajas de diseñar un Diagrama de Flujo antes de empezar a generar el código de un


programa” 2 son, entre otras:



Forzar la identificación de todos los pasos de una solución de forma clara y lógica.


Establecer una visión amplia y objetiva de la solución.


Verificar si se han tenido en cuenta todas las posibilidades.


Comprobar si hay procedimientos duplicados.
Representar gráficamente una solución (es más simple hacerlo con gráficas que


mediante palabras).
Facilitar a otras personas la comprensión de la secuencia lógica de la solución


planteada.
Posibilitar acuerdos con base en la aproximación común a una solución de un


problema, resolver ambigüedades o realizar mejoras.
Establecer posibles modificaciones (resulta más fácil depurar un programa con el


diagrama que con el listado del código).


Agilizar la codificación (traducción) del algoritmo en un lenguaje de programación.
Servir como elemento de documentación de la solución del problema.

Actividad 1.2: Elaborar un algoritmo en seudocódigo para cada uno de los siguientes
problemas.

1. Hallar el perímetro y área de un cuadrado.


2. Hallar uno de los lados de un rectángulo cuya área es de 15 cm 2 y uno de sus lados
mide 3 cm.
3. Hallar el área y el perímetro de un círculo cuyo radio mide 2 cm.

1.6 SIMBOLOGÍA DE LOS DIAGRAMAS DE FLUJO

La estandarización de los símbolos para la elaboración de Diagramas de Flujo tardó varios


años. Con el fin de evitar la utilización de símbolos diferentes para representar procesos
iguales, la Organización Internacional para la Estandarización (ISO, por su sigla en inglés)
y el Instituto Nacional Americano de Estandarización (ANSI, por su sigla en inglés),
estandarizaron los símbolos que mayor aceptación tenían en 1985. Los siguientes son los
principales símbolos para elaborar Diagramas de Flujo:

2
Rojas & Ñacato. 1980.

5
Inicio/Final
Se utiliza para indicar el inicio y el final de un diagrama; del Inicio sólo
puede salir una línea de flujo y al Final sólo debe llegar una línea.

Decisión
Indica la comparación de dos datos y dependiendo del resultado lógico
(falso o verdadero) se toma la decisión de seguir un camino del diagrama
u otro.

Entrada General
Entrada/Salida de datos en General.

Iteración
Indica que una instrucción o grupo de instrucciones deben ejecutarse
varias veces.

Entrada por teclado


Instrucción de entrada de datos por teclado. Indica que el computador
debe esperar a que el usuario teclee un dato que se guardará en una
variable o constante.

Salida Impresa
Indica la presentación de uno o varios resultados en forma impresa.

Llamada a subrutina
Indica la llamada a una subrutina o procedimiento determinado.

Salida en Pantalla
Instrucción de presentación de mensajes o resultados en pantalla.

Acción/Proceso General
Indica una acción o instrucción general que debe realizar el computador
(cambios de valores de variables, asignaciones, operaciones aritméticas,
etc.).

Conector
Indica el enlace de dos partes de un diagrama dentro de la misma página.

Flujo
Indica el seguimiento lógico del diagrama. También indica el sentido de
ejecución de las operaciones.

Conector
Indica el enlace de dos partes de un diagrama en páginas diferentes.

6
El Diagrama de Flujo es una herramienta gráfica valiosa para la representación esquemática
de la secuencia de instrucciones de un algoritmo o de los pasos de un proceso.

Reglas para la elaboración de diagramas de flujo

Cuando el algoritmo se desea expresar en forma de diagrama de flujo, se deben tener en


cuenta algunas “reglas o principios básicos para su elaboración”.3

 Poner un encabezado que incluya un título que identifique la función del algoritmo;


el nombre del autor; y la fecha de elaboración.


Sólo se pueden utilizar símbolos estándar (ISO 5807).


Los diagramas se deben dibujar de arriba hacia abajo y de izquierda a derecha.


La ejecución del programa siempre empieza en la parte superior del diagrama.
Los símbolos de “Inicio” y “Final” deben aparecer solo una vez.


La dirección del flujo se debe representar por medio de flechas (líneas de flujo).


Todas las líneas de flujo deben llegar a un símbolo o a otra línea.


Una línea de flujo recta nunca debe cruzar a otra.
Cuando dos líneas de flujo se crucen, una de ellas debe incluir una línea arqueada en


el sitio donde cruza a la otra (Figura 1.2).
Se deben inicializar las variables que se utilicen o permitir la asignación de valores


mediante consulta al usuario.


Las bifurcaciones y ciclos se deben dibujar procurando una cierta simetría.
Cada rombo de decisión debe tener al menos dos líneas de salida (una para SI y otra


para NO).
Las acciones y decisiones se deben describir utilizando el menor número de


palabras posible; sin que resulten confusas o poco claras.
Si el Diagrama se vuelve complejo y confuso, es mejor utilizar símbolos conectores


para reducir las líneas de flujo.


Todo el Diagrama debe ser claro, ordenado y fácil de recorrer.
El Diagrama se debe probar recorriéndolo con datos iniciales simples (prueba de
escritorio).

Fig. 1.2 Cruce de líneas de flujo4

Actividad 1.3: Basándose en la actividad anterior, convertir los algoritmos elaborados en


seudocódigo en diagramas de flujo:

3
Rojas & Ñacato. 1980.
4
Lopez García, Juan Carlos. Algoritmos y programación, 2009.

7
UNIDAD 2

FUNDAMENTOS DE PROGRAMACIÓN

2.1 COMENTARIOS

Los comentarios no tienen ningún efecto en la ejecución del algoritmo. Se utilizan para
aclarar instrucciones que puedan prestarse a confusión o como ayuda a otras personas que
deben leerlo y entenderlo. La mayoría de los lenguajes de programación ofrecen la
posibilidad de comentar el código de los programas.

2.2 IDENTIFICADORES

Los identificadores son nombres que se dan a los elementos utilizados para resolver un
problema y poder diferenciar unos de otros. Al asignar nombres (identificadores) a
variables, constantes y procedimientos se deben tener en cuenta algunas reglas:

 Los nombres pueden estar formados por una combinación de letras y números


(saldoMes, salario, fecha2, baseTriangulo, etc.).


El primer carácter de un nombre debe ser una letra.
La mayoría de los lenguajes de programación diferencian las mayúsculas de las


minúsculas.
Los nombres deben ser nemotécnicos, con solo leerlos se puede entender lo que
contienen. Deben ser muy descriptivos; no utilizar abreviaturas, a menos que se


justifique plenamente.
Es conveniente utilizar una sola palabra para nombrar páginas, controles, variables,


etc.


No utilizar caracteres reservados (%, +, /, >, etc.).
Se debe tener en cuenta que algunos lenguajes de programación no admiten las


tildes.


No utilizar palabras reservadas por los lenguajes de programación.
Para cumplir con convenciones ampliamente utilizadas, los nombres de
procedimientos, variables y constantes deben empezar con minúscula. Ejemplo,
fecha, suma, etc. Si es un nombre compuesto por varias palabras, cada una de las
palabras (con excepción de la primera) deben empezar con mayúscula. Ejemplo:
fechaInicial, baseTriangulo, etc.

2.3 VARIABLES

Para poder utilizar algoritmos con diferentes conjuntos de datos iniciales, se debe establecer
una independencia clara entre los datos iniciales de un problema y la estructura de su
solución. Esto se logra mediante la utilización de Variables.
En programación, las Variables son espacios de trabajo (contenedores) reservados para
guardar datos (valores).

8
El valor de una Variable puede cambiar en algún paso del Algoritmo o permanecer
invariable; por lo tanto, el valor que contiene una variable es el del último dato asignado a
esta. En la mayoría de los lenguajes de programación se utiliza la forma:

nombreVariable=valor

2.4 CONSTANTES

Las Constantes se crean de la misma forma que las variables y consisten en datos que,
luego de ser asignados, no cambian en ninguna instrucción del Algoritmo. Pueden contener
constantes matemáticas (pi) o generadas para guardar valores fijos (3.8, "Jorge", etc.).

2.5 CONTADORES

Los contadores se implementan como una estructura de programación que consistente en


almacenar en una variable el valor de ella misma más un valor constante. Es muy útil para
controlar el número de veces que debe ejecutarse un grupo de instrucciones.

2.6 ACUMULADORES

Estructura muy utilizada en programación y que consiste en almacenar en una variable el


valor de ella misma más otro valor variable. Es muy útil para calcular sumatorias.

2.7 PALABRAS RESERVADAS (PRIMITIVAS)

Todos los lenguajes de programación definen unas palabras para nombrar sus comandos,
instrucciones y funciones. Un identificador definido por el usuario no puede tener el
nombre de una palabra reservada.

2.8 FUNCIONES MATEMÁTICAS

Cada lenguaje de programación tiene su conjunto de funciones matemáticas predefinidas.


Estas se ejecutan haciendo referencia a su nombre. Algunas necesitan, para arrojar un
resultado, que se suministre información adicional (parámetros o argumentos).

Actividad 2.1: Investigar cuales son las funciones matemáticas que proporciona el lenguaje
de programación Java.

2.9 TIPOS DE DATOS

9
La mayoría de los lenguajes de programación disponen de una amplia variedad de tipos de
datos.

Números: se utilizan como entradas en las operaciones matemáticas. Cuando se utilizan los
signos positivo (+) o negativo (-), estos deben estar pegados al número.

Palabras: Las palabras están formadas por letras y/o números. Una palabra está delimitada
por espacios en blanco; sin embargo, si se quiere tener un texto conformado por dos o más
palabras, algunos lenguajes de programación permiten encerrar el texto entre comillas o
barras.

2.10 OPERADORES

Son símbolos que sirven para manipular datos. Los operadores y las operaciones que se
pueden realizar con ellos se clasifican en:

 Aritméticos: Posibilitan las operaciones entre datos de tipo numérico y dan como
resultado otro valor de tipo numérico. Ejemplo: potencia; producto; división; suma;
resta.

 Alfanuméricos: Permiten operar con datos de tipo carácter o cadenas. La mayoría


de los lenguajes de programación admiten el operador + para realizar la
concatenación (unión) de caracteres o cadenas.

 Relaciónales: Permiten la comparación entre datos del mismo tipo y dan como
resultado dos valores posibles: Verdadero o Falso. Ejemplo: igual a; menor que;
mayor que.

 Lógicos: Posibilitan la evaluación lógica de dos expresiones de tipo lógico. Dan


como resultado uno de dos valores posibles: Verdadero o Falso. Ejemplo: negación
(no); conjunción (y); disyunción (o).

Orden de evaluación de los operadores

Los computadores ejecutan los operadores en un orden predeterminado. El siguiente es el


orden (jerarquía) para ejecutar operadores:

1. Paréntesis (se ejecutan primero los más internos)


2. Potencias y Raíces.
3. Productos y Divisiones.
4. Sumas y Restas.
5. Concatenación.
6. Relacionales.
7. Negación.
8. Conjunción.
9. Disyunción.

10
2.11 EXPRESIONES

Una Expresión está compuesta por valores, funciones, primitivas, constantes y/o variables,
o por una combinación de los anteriores mediante operadores.

Son Expresiones:

 Un valor (ejemplos: 1.3, “Jorge”)




Una Constante o una Variable (ejemplos: divide, base, área)


Una función (ejemplos: cos 60, arctan 1)
Una combinación de valores, constantes, variables, funciones y operadores que
siguen reglas de construcción y orden de evaluación de los operadores.

Las Expresiones pueden ser:

 Aritméticas: Dan como resultado un valor numérico. Contienen únicamente


operadores aritméticos y datos numéricos (ejemplo: pi * 20)


Alfanuméricas: Dan como resultado una serie de cadena de caracteres.
Lógicas: Dan como resultado un valor "Verdadero" o "Falso". Contienen variables


y/o constantes enlazadas con operadores lógicos (ejemplo: A>0 y B<=5).
De Asignación: Estas Expresiones asignan el resultado de una Expresión a una
Variable o a una Constante.

2.12 PROCESOS

Se llama procesos a todas las instrucciones contenidas en un algoritmo para:



Asignar valores iniciales a variables y constantes


Leer datos que suministra el usuario por medio del teclado o del ratón (mouse).


Realizar operaciones matemáticas (aplicar fórmulas).


Reportar o mostrar contenidos de variables y constantes.
Mostrar en pantalla resultados de procedimientos activados por el programa.

2.13 INTERACTIVIDAD

La interactividad entre el usuario y el programa es un recurso muy valioso en programación


y se logra permitiendo la comunicación con el programa mediante la utilización del teclado
y/o el ratón (mouse).

2.14 PROCEDIMIENTOS
Los procedimientos son módulos con instrucciones que el computador ejecuta
automáticamente, una tras otra, hasta encontrar el final. Todo procedimiento debe tener un
nombre que lo identifique y que sirve para ejecutarlo cuando se ejecuta dicho nombre.

11
Todo procedimiento debe tener una línea de título que incluye un nombre; el cual, al
invocarlo, ejecuta en orden, una a una, las líneas de instrucciones que contiene hasta que
llega al final.

Para escribir procedimientos se deben tener en cuenta las siguientes recomendaciones:

 El título está compuesto por: el nombre del procedimiento y los parámetros


(opcional).
El nombre del procedimiento debe ser una palabra. Cuando se deben utilizar varias
palabras para nombrar un procedimiento, se escriben sin dejar espacio entre ellas y
con mayúscula la primera letra de la segunda palabra y de las subsiguientes palabras


(ejemplo: valorMasAlto).


Cada instrucción completa debe ocupar una línea de código.


Puede contener líneas en blanco.
Desde un procedimiento se pueden invocar otros procedimientos.

Ejemplo 2.1: Escribir y diseñar un procedimiento que se llame triangulo para hallar el área
de un triángulo rectángulo cuya Base mide 3 cm, la Altura 4 cm y la Hipotenusa 5 cm.

Análisis del problema


Formular el problema: Ya se encuentra claramente planteado.
Resultados esperados: El área de un triángulo rectángulo.
Datos disponibles: Base, Altura, Hipotenusa, tipo de triángulo. La incógnita es el área y todos los valores son
constantes. El valor de la hipotenusa se puede omitir.
Restricciones: Utilizar las medidas dadas.
Procesos necesarios: Guardar en dos variables (BASE y ALTURA) los valores de Base y Altura; Guardar en
una constante (DIV) el divisor 2; aplicar la fórmula BASE*ALTURA/DIV y guardar el resultado en la
variable AREA; comunicar el resultado (AREA).

Diseño del algoritmo

Inicio

DIV=2
BASE=3 Almacena valores a las constantes DIV, BASE y ALTURA
ALTURA=4

AREA = BASE * ALTURA /DIV Calcula el área y la almacena en la variable AREA

AREA
Imprime el valor almacenado en la variable AREA

Final

12
UNIDAD 3

ESTRUCTURAS BÁSICAS
Un Algoritmo está compuesto por instrucciones de diferentes tipos, organizadas
secuencialmente, en forma de estructuras de control. De estas estructuras, las más comunes
son las siguientes:



Secuencial.


Iterativa (repetición).
Condicional (decisión, selección).

Una estructura de control se define como “un esquema que permite representar ideas de
manera simplificada y que bajo condiciones normales, es constante”.5
“El uso del diseño descendente en los programas, la ejecución de operaciones secuenciales,
la utilización de ciclos repetitivos y, la toma de decisiones y alternativas de proceso,
ofrecen amplias posibilidades para resolver problemas mediante la construcción de
procedimientos”.6

Actualmente, la programación orientada a objetos (POO) busca reducir al máximo la


cantidad de estructuras de control mediante el uso de polimorfismo; pero aun así, todavía se
vale de estas estructuras para construir métodos.

Es fundamental que se preste atención especial a las estructuras que se utilizan para
resolver problemas y reconocerlas para lograr mayor control sobre la solución planteada.
De esta manera, la programación de computadores ayuda a planear conscientemente las
secuencias de acciones que resuelven un problema planteado y las estructuras involucradas
en una solución dada.

3.1 ESTRUCTURA SECUENCIAL

La estructura de control secuencial es la más sencilla. También se la conoce como


estructura lineal. Se compone de instrucciones que deben ejecutarse en forma consecutiva,
una tras otra, siguiendo una línea de flujo. Solamente los problemas muy sencillos pueden
resolverse haciendo uso únicamente de esta estructura. Normalmente, la estructura
secuencial hace parte de soluciones a problemas complejos en las que se la utiliza mezclada
con estructuras iterativas (repetir varias veces un conjunto de instrucciones) y condicionales
(tomar decisiones).

5
Trejos. 1999.
6
Castellanos & Ferreyra. 2000.

13
Inicio

Leer datos

Procesos

Reportar
resultados

Final

Fig 3.1. Modelo de estructura secuencial.

Una estructura de control secuencial puede contener cualquiera de las siguientes


instrucciones:



Declaración de variables.


Asignación de valores.


Entrada de datos.


Procesamiento de datos (operaciones).
Reporte de resultados.

Ejemplo 3.1: Escribir un procedimiento para calcular el área de cualquier triángulo


rectángulo. En él se debe pedir al usuario que ingrese los valores de la Altura y la Base del
triángulo.

Análisis del problema


Formular el problema: Ya está claramente planteado.
Resultados esperados: Un procedimiento que permita calcular el área de cualquier triángulo rectángulo.
Datos disponibles: Base y Altura del triángulo (se deben solicitar al usuario).
Restricciones: Los valores de base y altura son variables y se deben solicitar al usuario.
Procesos necesarios: definir variables; asignar el valor 2 a la constante div; solicitar al usuario el valor de la
altura del triángulo; solicitar al usuario el valor de la base; aplicar la fórmula de área; mostrar el resultado.

Diseño del algoritmo

14
Inicio

declarar div, base,


altura y area

div = 2

altura, base

area = base * altura / div

area

Final

Ejemplo 3.2: Escribir un procedimiento que muestre 3 veces en pantalla la frase “David
Ausubel”.

Análisis del problema


Formular el problema: Ya se encuentra claramente formulado.
Resultados esperados: Que aparezca tres veces en pantalla la frase “David Ausubel”.
Datos disponibles: La frase dada.
Restricciones: Ninguna.
Procesos necesarios: Ninguno.

Diseño del algoritmo

Inicio

“David Ausubel”

“David Ausubel”

“David Ausubel”

Final

Actividad 3.1: Diseñar un algoritmo que permita calcular el valor a pagar por la compra de
un producto sobre cuyo precio se oferta el 5% de descuento. Se debe pedir al usuario que
ingrese el precio del producto después de lo cual se debe calcular el descuento y el IVA
para obtener el total a pagar.

15
3.2 ESTRUCTURA ITERATIVA (REPETICIÓN)

La estructura iterativa o de repetición permite ejecutar una o varias instrucciones, un


número determinado de veces o, indefinidamente, mientras se cumpla una condición. Esta
estructura ayuda a simplificar los algoritmos, ahorrando tiempo valioso a quien resuelve
problemas con ayuda del computador.
En programación existen al menos dos tipos de estructuras repetitivas, las cuales a su vez
tienen variantes en los diferentes lenguajes de programación.
La característica común es que ambos tipos permiten ejecutar una o varias instrucciones:



Un número determinado de veces.
Mientras se cumpla una condición.

Fig. 3.2 Modelo de estructura iterativa.7

Ejemplo 3.3: Escribir un procedimiento que muestre 100 veces en pantalla la frase “David
Ausubel”.

Análisis del problema


Formular el problema: Ya se encuentra claramente formulado.
Resultados esperados: Que aparezca 100 veces en pantalla la frase “David Ausubel”.
Datos disponibles: La frase dada.
Restricciones: Ninguna.
Procesos necesarios: Mostrar la frase mencionada 100 veces.

Diseño del algoritmo

Inicio

repite 1, 100

“David Ausubel”

Final

7
Lopez García, Juan Carlos. Algoritmos y programación, 2009.

16
Ejemplo 3.4: Calcular el valor de la sumatoria: 1 + 2 + 3 + 4 +5 + … + 100.

Análisis del problema


Formular el problema: Ya se encuentra claramente formulado.
Resultados esperados: El resultado de la suma de los números entre 1 y 100.
Datos disponibles: El rango de números dado.
Restricciones: Ninguna.
Procesos necesarios: guardar el número 0 en una variable e incrementarla en 1 cada vez que se ejecute el
ciclo repetitivo.
Guardar 0 en otra variable e ir acumulando en ella su propio valor más el valor de la primera variable.

Diseño del algoritmo

Inicio
Suma100

contador = 0
sumatoria = 0

repite 1, 100

contador = contador + 1

sumatoria = sumatoria + contador

contador
sumatoria

[El valor de la suma 1


+ 2 + 3 + … + 100 es]
sumatoria

Final

Este algoritmo utiliza una operación muy útil en programación:


sumatoria = sumatoria + contador

Consiste en almacenar en una variable sumatoria el valor de ella misma (sumatoria) más
otro valor variable (contador). Es muy utilizada para acumular valores.

17
Ejemplo 3.5: Elaborar un procedimiento para calcular las tablas de multiplicar. El usuario
debe ingresar qué tabla de multiplicar desea.

Análisis del problema


Formular el problema: Ya se encuentra claramente formulado.
Resultados esperados: La tabla de multiplicar que el usuario indique.
Datos disponibles: El número de la tabla (indicada por el usuario).
Restricciones: Ninguna.
Procesos necesarios: Pedir al usuario que ingrese la tabla de multiplicar que desea. Guardar ese valor en una
variable (tabla).
Multiplicar cada uno de los valores entre 1 y 9 por la variable tabla.
Mostrar el resultado de cada multiplicación.

Diseño del algoritmo

Inicio
tablaMultiplicar

tabla

cumpleveces
[multiplicando 10]

rsultado = multiplicando * tabla

tabla “x”
multiplicando “=”
resultado

Final

3.3 ESTRUCTURA CONDICIONAL

La estructura condicional se utiliza para indicarle al computador que debe evaluar una
condición y, a partir del resultado, ejecutar el bloque de instrucciones correspondiente. La
forma más común está compuesta por una proposición (condición) que se evalúa y dos
bloques de instrucciones que se ejecutan, uno cuando la condición es verdadera (selección
simple y doble) y otro cuando ésta es falsa (únicamente en la selección doble).

Para que una proposición (frase declarativa) sea válida, debe poder afirmarse que es
verdadera o falsa.

18
En programación, se utilizan operadores relacionales (<, =, >) para establecer la relación
que existe entre dos elementos de la proposición.

Adicionalmente, las proposiciones pueden ser sencillas o compuestas. Las proposiciones


compuestas se forman con dos o más proposiciones sencillas unidas por operadores lógicos
(y, o, no). Cuando se unen dos proposiciones por medio del operador lógico “y”, significa
que ambas proposiciones deben ser verdaderas (conjunción). Cuando se unen dos
proposiciones por medio del operador lógico “o”, significa que por lo menos una de las dos
proposiciones debe ser verdadera (disyunción).
Por su parte, un bloque de instrucciones puede contener una o varias instrucciones que se
ejecutan una detrás de otra. La estructura condicional tiene tres variantes:



Selección simple.


Selección doble.
Selección múltiple.

Las estructuras condicionales simple y doble evalúan una proposición (condición) que
devuelve como resultado únicamente dos valores posibles y excluyentes: verdadero o falso.
En cambio, la estructura condicional de selección múltiple permite que la condición
devuelva más de un valor posible y que para cada uno de esos valores se ejecute el bloque
de instrucciones correspondiente.

Selección simple

La estructura condicional de selección simple ejecuta un bloque de instrucciones cuando la


proposición (condición) es verdadera; si esta es falsa, no hace nada.

Fig 3.3 Modelo de estructura condicional simple. 8

Selección doble

La estructura condicional de selección doble ejecuta un bloque de instrucciones (A) cuando


la proposición (condición) es verdadera y un bloque diferente (B) cuando esta es falsa.

8
Lopez García, Juan Carlos. Algoritmos y programación, 2009.

19
Fig 3.4 Modelo de estructura condicional doble.9

Ejemplo 3.6: Un estudiante aprueba un examen cuando obtiene una calificación mayor o
igual a siete. Elaborar un procedimiento que pida al usuario una calificación, aplique el
criterio de aprobación e imprima “Aprobado” o “Reprobado”, según sea el caso.

Análisis del problema


Formular el problema: Es un problema sencillo de selección doble.
Resultados esperados: Un aviso que reporte si el estudiante “Aprobó” o “Reprobó” el examen.
Datos disponibles: La calificación ingresada por el usuario. Para aprobar, la nota debe ser mayor o igual a 7.0.
Restricciones: Aplicar el criterio de aprobación.
Procesos necesarios: Solicitar al usuario que ingrese la calificación.
Evaluar si la calificación es igual o superior a 7.0; en caso de ser verdadero, reportar “Aprobado”; en caso
contrario, reportar “Reprobado”.

Diseño del algoritmo

Inicio

calificacion

VERDAD calificacion FALSO


>= 7.0

Aprobado Reprobado

Final

Ejemplo 3.7: Una profesora necesita calcular la nota definitiva para cada uno de los 22
alumnos que asisten a su curso de geometría, con el fin de saber quiénes aprobaron y
quiénes reprobaron (para aprobar hay que obtener una nota igual o superior a 6.5), la
profesora realizó a todos sus estudiantes, en el primer periodo del año lectivo, dos
exámenes y asignó un trabajo de investigación. ¿Cómo se le puede ayudar?

9
Lopez García, Juan Carlos. Algoritmos y programación, 2009.

20
Análisis del problema
Formular el problema: Se requiere calcular un promedio de tres notas para cada uno de los 22 alumnos.
Resultados esperados: La nota definitiva de cada uno de los 22 alumnos y un aviso que indique si aprobó o
no.
Datos disponibles: El número de alumnos: 22. Las notas de cada alumno las debe digitar la profesora.
Restricciones: Cada una de las tres notas tiene el mismo porcentaje en la nota definitiva. Tres notas por
alumno y 22 alumnos.
Todas las notas deben ser mayores o iguales a 1 y menores o iguales a 10. Para aprobar hay que tener un
promedio igual o superior a 6.5.
Procesos necesarios: Para cada uno de los 22 alumnos: Leer las tres notas, verificar que estén en el rango
permitido (entre 1 y 10), sumarlas, calcular el promedio, verificar si aprobó o no. Mostrar el promedio y un
aviso que informe si aprobó o no.

Diseño del algoritmo

Inicio
notas

Cumpleveces
[estudiante 22]

examenUno, examenDos,
trabajo

examenUno < 0
ó examenUno > 10
Verdad ó examenDos < 0 Falso
ó examenDos > 10
ó trabajo <0
ó trabajo > 10

sumatoria = examenUno + examenDos + trabajo

datos no válidos

promedio = sumatoria / 3

Verdad Falso
promedio < 6.5

aprobar = “NO” aprobar = “SI”

promedio,
aprobar

Final

21
Ejemplo 3.8: Escribir un procedimiento para leer tres números diferentes y determinar cuál
es el mayor de ellos.

Análisis del problema


Formular el problema: Se requiere determinar el mayor de tres números.
Resultados esperados: Un aviso que indique cuál es el mayor de tres.
Datos disponibles: Tres números. Estos deben ser ingresados por el usuario.
Restricciones: Ninguna.
Procesos necesarios: Leer los tres números diferentes. Compararlos entre sí para determinar cuál es el mayor.
Mostrar un aviso que informe el resultado.

Diseño del algoritmo

Inicio

NUM1,
NUM2,
NUM3

Verdad Falso
NUM1 > NUM2 y NUM1 > NUM3

Mayor = NUM1

Verdad
NUM2 > NUM1 y NUM2 > NUM3

Mayor = NUM2

Falso

Mayor = NUM3

Mayor

Final

Actividad 3.2: Tomando como base el ejemplo anterior, realizar las modificaciones
necesarias para que adicionalmente, el programa muestre en pantalla el menor de los tres
números.

Estructuras condicionales anidadas

Hay situaciones que requieren el uso de estructuras condicionales anidadas. En estas, el


resultado de la primera proposición implica evaluar a continuación una segunda

22
proposición y esta a su vez requiere que se evalúe una tercera proposición, y así
sucesivamente, hasta agotar todas las condiciones.
Plantear estructuras algorítmicas anidables (iterativa y condicional) requiere procesos de
pensamiento asociados con el sistema operatorio de clasificación o inclusión.

El siguiente caso ilustra muy bien este punto: "Se requiere elaborar un procedimiento que
permita determinar para un grupo de 10 personas si tienen derecho o no a jubilarse a partir
de los datos género, edad y años de aportes; y las siguientes condiciones: si es hombre debe
tener más de 65 años de edad y más de 60 años si es mujer, pero en todo caso se deben
haber realizado aportes por más de 20 años".

Actividad 3.3: Escribir un procedimiento para dar solución al problema planteado en el


párrafo anterior.

23
UNIDAD 4

JAVA

4.1 HISTORIA DEL LENGUAJE

El lenguaje Java™ fue creado por Sun Microsystems Inc. en un proceso por etapas que
arranca en 1990, año en el que Sun creó un grupo de trabajo, liderado por James Gosling,
para desarrollar un sistema para controlar electrodomésticos e incluso PDAs o Asistentes
Personales (pequeños ordenadores) que, además, permitiera la conexión a redes de
ordenadores. Se pretendía crear un hardware polivalente, con un Sistema Operativo
eficiente (SunOS) y un lenguaje de desarrollo denominado Oak (roble), el precursor de
Java. El proyecto finalizó en 1992 y resultó un completo fracaso debido al excesivo coste
del producto, con relación a alternativas similares, tras lo cual el grupo se disolvió.

Después de la disolución del grupo de trabajo, únicamente quedaba del proyecto el lenguaje
Oak. Gracias a una acertada decisión de distribuir libremente el lenguaje por la Red de
Redes y al auge y la facilidad de acceso a Internet, propiciado por la WWW, el lenguaje se
popularizó y se consiguió que una gran cantidad de programadores lo depurasen y
terminasen de perfilar la forma y usos del mismo. A partir de este momento, el lenguaje se
difunde a una velocidad vertiginosa, añadiéndosele numerosas clases y funcionalidad para
TCP/IP. El nombre del lenguaje tuvo que ser cambiado ya que existía otro llamado Oak. El
nombre “Java” surgió en una de las sesiones de “brainstorming” celebradas por el equipo
de desarrollo del lenguaje. Buscaban un nombre que evocara la esencia de la tecnología
(viveza, animación, rapidez, interactividad…). Java fue elegido de entre muchísimas
propuestas. No es un acrónimo, sino únicamente algo humeante, caliente y que a muchos
programadores les gusta beber en grandes cantidades: una taza de café (Java en argot Inglés
americano10). De esta forma, Sun lanzó las primeras versiones de Java a principios de
1995.

4.2 ¿QUÉ ES JAVA?

Java es un lenguaje de desarrollo de propósito general, y como tal es válido para realizar
todo tipo de aplicaciones profesionales. Incluye una combinación de características que lo
hacen único.

4.3 ¿QUÉ LO HACE DISTINTO DE LOS DEMÁS LENGUAJES?

Una de las características más importantes es que los programas “ejecutables”, creados por
el compilador de Java, son independientes de la arquitectura. Se ejecutan indistintamente
en una gran variedad de equipos con diferentes microprocesadores y sistemas operativos.

Casualmente, la pronunciación en inglés de este término es “yava”, que puede entenderse fuera de contexto como “¡ya
10

va!”.

24
 Es público. Puede conseguirse un JDK (Java Developer's Kit) o Kit de desarrollo de


aplicaciones Java gratis.
Permite escribir Applets (pequeños programas que se insertan en una página


HTML) y se ejecutan en el ordenador local.
Se pueden escribir aplicaciones para intrarredes, aplicaciones cliente/servidor,


aplicaciones distribuidas en redes locales y en Internet.


Es fácil de aprender y está bien estructurado.
Las aplicaciones son fiables. Puede controlarse su seguridad frente al acceso a
recursos del sistema y es capaz de gestionar permisos y criptografía.

4.3.1 ¿Qué se puede programar con Java?

Java es un lenguaje de propósito general, puede programarse en él cualquier cosa:

 Aplicaciones independientes. Como con cualquier otro lenguaje de propósito


general.
Applets. Pequeñas aplicaciones que se ejecutan en un documento HTML, siempre y
cuando el navegador soporte Java.

4.3.2 Características del lenguaje



Es intrínsecamente orientado a objetos.


Funciona perfectamente en red.
Aprovecha características de la mayoría de los lenguajes modernos evitando sus


inconvenientes.


Tiene una gran funcionalidad gracias a sus librerías (clases).
NO tiene punteros manejables por el programador, aunque los maneja interna y


transparentemente.
El manejo de la memoria no es un problema, la gestiona el propio lenguaje y no el


programador.


Genera aplicaciones con pocos errores posibles.
Incorpora Multi-Threading (para permitir la ejecución de tareas concurrentes dentro
de un mismo programa).

El lenguaje Java fue diseñado “partiendo de cero” y gracias a esto, ha conseguido


convertirse en un lenguaje orientado a objetos puro, limpio y práctico.

¿El lenguaje es Compilado o Interpretado? Ni una cosa ni la otra. Aunque estrictamente


hablando es interpretado, necesita de un proceso previo de compilación. Una vez
“compilado” el programa, se crea un fichero que almacena lo que se denomina bytecodes o
j_code (pseudocódigo prácticamente al nivel de código máquina). Para ejecutarlo, es
necesario un “intérprete”, la JVM (Java Virtual Machine) máquina virtual Java. De esta
forma, es posible compilar el programa en una estación UNIX y ejecutarlo en otra con
Windows utilizando la máquina virtual Java para Windows. Esta JVM se encarga de leer
los bytecodes y traducirlos a instrucciones ejecutables directamente en un determinado
microprocesador, de una forma bastante eficiente.

25
Que el programa deba ser “interpretado” no hace que sea poco eficiente en cuanto a
velocidad, ya que la interpretación se hace prácticamente al nivel de código máquina.

Fig. 4.1 Creación y ejecución de programas Java.11

El lenguaje Java es robusto. Las aplicaciones creadas en este lenguaje son susceptibles de
contener pocos errores, principalmente porque la gestión de memoria y punteros es
realizada por el propio lenguaje y no por el programador.

Bien es sabido que la mayoría de los errores en las aplicaciones vienen producidos por
fallos en la gestión de punteros o la asignación y liberación de memoria. Además, el
lenguaje contiene estructuras para la detección de excepciones (errores de ejecución
previstos) y permite obligar al programador a escribir código fiable mediante la declaración
de excepciones posibles para una determinada clase reutilizable.

4.4 LA MÁQUINA VIRTUAL JAVA (JVM)

La máquina virtual Java es la idea revolucionaria del lenguaje. Es la entidad que


proporciona la independencia de plataforma para los programas Java “compilados” en byte-
code.

11
Sun Microsystems Inc.

26
Fig. 4.2 Máquina virtual Java.12

Un mismo programa fuente compilado en distintas plataformas o sistemas operativos,


genera el mismo fichero en byte-code. Esto es lógico, ya que se supone que el compilador
de Java traduce el fichero fuente a código ejecutable por una máquina que únicamente
existe en forma virtual.

Evidentemente, si un mismo programa en byte-code puede ser ejecutado en distintas


plataformas es porque existe un traductor de ese byte-code a código nativo de la máquina
sobre la que se ejecuta. Esta tarea es realizada por la JVM.

Existe una versión distinta de esta JVM para cada plataforma. Esta JVM se carga en
memoria y va traduciendo “al vuelo”, los byte-codes a código máquina. La JVM no ocupa
mucho espacio en memoria, piénsese que fue diseñada para poder ejecutarse sobre
pequeños electrodomésticos como teléfonos, televisores, etc.

4.5 EL ENTORNO DE DESARROLLO (JDK)

La herramienta básica para empezar a desarrollar aplicaciones o applets en Java es el JDK


(Java Developer’s Kit) o Kit de Desarrollo Java, que consiste, básicamente, en un
compilador y un intérprete (JVM) para la línea de comandos.

No dispone de un entorno de desarrollo integrado (IDE), pero es suficiente para aprender el


lenguaje y desarrollar pequeñas aplicaciones.

12
Sun Microsystems Inc.

27
4.6 VISIÓN GENERAL Y ELEMENTOS BÁSICOS DEL LENGUAJE

En Java, prácticamente todo son clases (objetos). Por esta razón, un programa estará
formado por uno o varios ficheros fuente y en cada uno de ellos habrá definida una o varias
clases.

En un fichero fuente puede declararse una o más clases y tendrá un aspecto similar al que
sigue:

class Clase1 {

}

class Clase2 {

}

class ClaseN {

}

Una clase está formada por una parte correspondiente a la declaración, y otra
correspondiente al cuerpo de la misma:

DeclaracioDeClase {
cuerpo de clase
}

En la plantilla anterior se ha simplificado el aspecto de la Declaración de clase, pero sí que


puede asegurarse que la misma contendrá, como mínimo, la palabra reservada class y el
nombre que recibe la clase.

El cuerpo de las clases comienza con una llave abierta ( { ) y termina con una llave cerrada
( } ).

Dentro del cuerpo de la clase se declaran los atributos y los métodos de la clase.

Para que un programa se pueda ejecutar, debe contener una clase que tenga un método
main con la siguiente declaración:

public static void main(String[] args)

El lenguaje Java, al igual que algunos otros, distingue entre mayúsculas y minúsculas, por
lo que es importante transcribirlo literalmente.

28
También hay que comentar que en el nombre del fichero fuente también se hace distinción
entre mayúsculas y minúsculas a la hora de compilarlo, aunque el sistema operativo
empleado no haga esta distinción. La extensión del mismo debe ser .java.

4.7 COMENTARIOS

Los comentarios en los programas fuente son muy importantes en cualquier lenguaje.
Sirven para aumentar la facilidad de comprensión del código y para recordar ciertas cosas
sobre el mismo. Son porciones del programa fuente que no serán compiladas, y, por tanto,
no ocuparán espacio en el fichero “ejecutable”. Únicamente sirven para documentar.

 Si el comentario que se desea escribir es de una sola línea, basta con poner dos
barras inclinadas: //

Ejemplo:
// Este es un ejemplo de comentario

No puede ponerse código después de un comentario introducido por // en la misma


línea, ya que desde la aparición de las dos barras inclinadas // hasta el final de la
línea es considerado como comentario e ignorado por el compilador.

 Si un comentario debe ocupar más de una línea, hay que anteponerle /* y al final */.

Ejemplo:
/* Esto es un
comentario que
ocupa tres líneas */

 Existe otro tipo de comentario que sirve para generar documentación


automáticamente en formato HTML mediante la herramienta javadoc). Puede
ocupar varias líneas y se inicia con /** para terminar con */.

4.8 TIPOS DE DATOS

En Java existen dos tipos principales de datos:

1. Tipos de datos simples.


2. Referencias a objetos.

Los tipos de datos simples soportados por Java son los siguientes:

29
Tabla 4.1 Tipos de datos simples13.

No existen más datos simples en Java. Incluso éstos que se enumeran son envueltos por
clases equivalentes (java.lang.Integer, java.lang.Double, java.lang.Byte, etc.), que pueden
tratarlos como si fueran objetos en lugar de datos simples.

A diferencia de otros lenguajes de programación, en Java los tipos de datos simples no


dependen de la plataforma ni del sistema operativo. Un entero de tipo int siempre tendrá 4
bytes, por lo que no habrá inconvenientes al migrar un programa de un sistema operativo a
otro. Es más, ni siquiera hay que volverlo a compilar.

Nota: A diferencia de otros lenguajes de programación, los String en Java no son un tipo
simple de datos sino un. Los valores de tipo String van entre comillas dobles (“Hola”),
mientras que los de tipo char van entre comillas simples (‘K’).

El resto de tipos de datos que no son simples, son considerados referenciales. Estos tipos
son básicamente las clases, en las que se basa la programación orientada a objetos.

Dentro de estos tipos pueden considerarse las interfaces, los Strings y los vectores, que son
unas clases un tanto especiales.

Existe un tipo referencial especial nominado por la palabra reservada null que puede ser
asignado a cualquier variable de cualquier clase y que indica que el puntero no tiene
referencia a ninguna zona de memoria (el objeto no está inicializado).

Además, todos los tipos de datos simples vistos en el punto anterior pueden ser declarados
como referenciales (objetos), ya que existen clases que los engloban.

Estas clases son:

13
Sun Microsystems Inc.

30
Tabla 4.2 Clases equivalentes para tipos de datos simples14.

4.9 IDENTIFICADORES

Los identificadores son los nombres que se les da a las variables, clases, interfaces,
atributos y métodos de un programa.

Reglas para la creación de identificadores:

1. Java hace distinción entre mayúsculas y minúsculas, por lo tanto, nombres o


identificadores como var1, Var1 y VAR1 son distintos.

2. Pueden estar formados por cualquiera de los caracteres del código Unicode, aunque
eso sí, el primer carácter no puede ser un dígito numérico y no pueden utilizarse
espacios en blanco ni símbolos coincidentes con operadores.

3. La longitud máxima de los identificadores es prácticamente ilimitada.

4. No puede ser una palabra reservada del lenguaje ni los valores lógicos true o false.

5. No pueden ser iguales a otro identificador declarado en el mismo ámbito.

6. Por convenio, los nombres de las variables y los métodos deberían empezar por una
letra minúscula y los de las clases por mayúscula.
Además, si el identificador está formado por varias palabras la primera se escribe en
minúsculas (excepto para las clases) y el resto de palabras se hace empezar por
mayúscula (por ejemplo: añoDeCreación). Estas reglas no son obligatorias, pero son
convenientes ya que ayudan al proceso de codificación de un programa, así como a
su legibilidad. Es más sencillo distinguir entre clases y métodos o variables.

14
Sun Microsystems Inc.

31
Tabla 4.3 Ejemplos de identificadores válidos15.

Tabla 4.4 Ejemplos de identificadores no válidos16.

Ya que el lenguaje permite identificadores todo lo largos que se desee, es aconsejable


crearlos de forma que tengan sentido y faciliten su interpretación. El nombre ideal para un
identificador es aquel que no se excede en longitud (lo más corto posible) siempre que
califique claramente el concepto que intenta representar. Siempre dentro de unos límites;
por ejemplo, no sería muy adecuado utilizar un identificador de un índice de un bucle como
indiceDeTalBucle en lugar de simplemente i.

Hay que evitar identificadores como a1, a2, a3, a4, va1, xc32, xc21, xsda, … y en general
todos aquellos identificadores que no “signifiquen” nada.

4.10 DECLARACIÓN DE VARIABLES

La declaración de una variable siempre contiene el nombre (identificador de la variable) y


el tipo de dato al que pertenece. El ámbito de la variable depende de la localización en el
programa donde es declarada.

Ejemplo:

int x;

Las variables pueden ser inicializadas en el momento de su declaración, siempre que el


valor que se les asigne coincida con el tipo de dato de la variable.

Ejemplo:

int x = 0;

15
Sun Microsystems Inc.
16
Sun Microsystems Inc.

32
4.10.1 ÁMBITO DE UNA VARIABLE

El ámbito de una variable es la porción de programa donde dicha variable es visible para el
código del programa y, por tanto, referenciable.
El ámbito de una variable depende del lugar del programa donde es declarada, pudiendo
pertenecer a cuatro categorías distintas.



Variable local.


Atributo.


Parámetro de un método.
Parámetro de un tratador de excepciones.

Como puede observarse, NO existen las variables globales. Esto no es un “defecto” del
lenguaje sino todo lo contrario. La utilización de variables globales resulta peligrosa, ya
que puede ser modificada en cualquier parte del programa y por cualquier procedimiento.
Además, a la hora de utilizarlas hay que buscar dónde están declaradas para conocerlas y
dónde son modificadas para evitar sorpresas en los valores que pueden contener.

Los ámbitos de las variables u objetos en Java siguen los criterios “clásicos”, al igual que
en la mayoría de los lenguajes de programación.

Si una variable no ha sido inicializada, tiene un valor asignado por defecto. Este valor es,
para las variables de tipo referencial (objetos), el valor null. Para las variables de tipo
numérico, el valor por defecto es cero (0), las variables de tipo char, el valor ‘\u0000’ y las
variables de tipo boolean, el valor false.

Variables locales

Una variable local se declara dentro del cuerpo de un método de una clase y es visible
únicamente dentro de dicho método.

Se puede declarar en cualquier lugar del cuerpo, incluso después de instrucciones


ejecutables, aunque es una buena costumbre declararlas justo al principio.

NOTA: También pueden declararse variables dentro de un bloque delimitado por llaves {
… }. En ese caso, sólo serán “visibles” dentro de dicho bloque.

Ejemplo:

class Caracter {
char ch;
public Caracter(char c) {
ch=c;
}

public void repetir(int num) {


int i;
for (i=0;i<num;i++) {

33
System.out.println(ch);
}
}
}

En este ejemplo existe una variable local: int i; definida en el método repetir de la clase
Caracter, por lo tanto, únicamente es visible dentro del método repetir.

Ejemplo:
int x,y,z;

 Declara tres variables x, y, z de tipo entero.

 Podrían haberse inicializado en su declaración de la forma:


int x=0,y=0,z=3;

No es necesario que se declaren al principio del método. Puede hacerse en cualquier lugar
del mismo, incluso de la siguiente forma:

public void repetir(int num) {


for (int i=0;i<num;i++) {
System.out.println(ch);
}
}

En el caso de las variables locales, éstas no se inicializan con un valor por defecto, como se
ha comentado en el punto anterior, sino que es necesario asignarles algún valor antes de
poder utilizarlas en cualquier instrucción, de lo contrario el compilador genera un error, de
tal forma que es imposible hacer uso de una variable local no inicializada sin que se percate
de ello el compilador.

4.10.2 Parámetros de un método.

Los parámetros se declaran en la cabecera del método de la siguiente forma:

[Modificadores_de_metodo] Tipo_devuelto Nombre_de_metodo


(lista_de_parámetros)
{

}

Nota: En el ejemplo de declaración anterior, lo que se encuentra entre corchetes ( [ ] ) es


opcional.

La lista_de_parámetros consiste en una serie de variables, separadas por comas y


declarando el tipo al que pertenecen.

Ejemplo:

34
public static void miMetodo(int v1, int v2, float v3, String v4,
ClaseObjeto v5);

Nótese que aunque existan varios parámetros pertenecientes al mismo tipo o clase, no
pueden declararse abreviadamente, como ocurre con las variables locales y los atributos,
indicando el tipo y a continuación la lista de parámetros separados por comas. Así, no es
correcta la siguiente declaración del método anterior:

public static void miMétodo(int v1, v2, float v3, String v4,
ClaseObjeto v5); (INCORRECTO)

La declaración de un parámetro puede ir antecedida, como ocurre con las variables locales,
por la palabra reservada final. En ese caso, el valor de dicho parámetro no podrá ser
modificado en el cuerpo del método.

Los parámetros de un método pueden ser de dos tipos:

 Variables de tipo simple de datos: En este caso, el paso de parámetros se realiza


siempre por valor. Es decir, el valor del parámetro de llamada no puede ser
modificado en el cuerpo del método (El método trabaja con una copia del valor
utilizado en la llamada).

 Variables de tipo objeto (referencias): En este caso, lo que realmente se pasa al


método es un puntero al objeto y, por lo tanto, el valor del parámetro de llamada sí
que puede ser modificado dentro del método (El método trabaja directamente con el
valor utilizado en la llamada), a no ser que se anteponga la palabra reservada final.

Tabla 4.5 Tipos de parámetros para métodos17.

4.11 OPERADORES

Los operadores son partes indispensables en la construcción de expresiones.

Existen muchas definiciones técnicas para el término expresión. Puede decirse que una
expresión es una combinación de operandos ligados mediante operadores.

Los operandos pueden ser variables, constantes, funciones, literales, etc. y los operadores
todos los enumerados en este punto.
17
Sun Microsystems Inc.

35
4.11.1 Operadores aritméticos

Tabla 4.6 Operadores aritméticos18.

Los operadores unarios ++ y -- realizan un incremento y un decremento respectivamente.


Estos operadores admiten notación prefija y postfija.

 ++op1: En primer lugar realiza un incremento (en una unidad) de op1 y después
ejecuta la instrucción en la cual está inmerso.

 op1++: En primer lugar ejecuta la instrucción en la cual está inmerso y después


realiza un incremento (en una unidad) de op1.

 --op1: En primer lugar realiza un decremento (en una unidad) de op1 y después
ejecuta la instrucción en la cual está inmerso.

 op1--: En primer lugar ejecuta la instrucción en la cual está inmerso y después


realiza un decremento (en una unidad) de op1.

4.11.2 Operadores relacionales

Los operadores relacionales actúan sobre valores enteros, reales y caracteres (char); y
devuelven un valor del tipo boolean (true o false).

18
Sun Microsystems Inc.

36
Tabla 4.7 Operadores relacionales19.

Ejemplo:

class Relacional {
public static void main(String[] args]) {
double op1,op2;
op1=1.34;
op2=1.35;
System.out.println("op1="+op1+" op2="+op2);
System.out.println("op1>op2 = "+(op1>op2));
System.out.println("op1<op2 = "+(op1<op2));
System.out.println("op1==op2 = "+(op1==op2));
System.out.println("op1!=op2 = "+(op1!=op2));
char op3,op4;
op3='a'; op4='b';
System.out.println("'a'>'b' = "+(op3>op4));
}
}

Salida por pantalla:

op1=1.34 op2=1.35
op1>op2 = false
op1<op2 = true
op1==op2 = false
op1!=op2 = true
'a'>'b' = false

Nota: Los operadores == y != actúan también sobre valores lógicos (boolean).

19
Sun Microsystems Inc.

37
4.11.3 Operadores lógicos

Tabla 4.8 Operadores lógicos20.

Estos operadores actúan sobre operadores o expresiones lógicas, es decir, aquellos que se
evalúan a cierto o falso (true / false).

Ejemplo:

class Bool {
public static void main (String[] args) {
boolean a=true;
boolean b=true;
boolean c=false;
boolean d=false;
System.out.println("true Y true = " + (a && b));
System.out.println("true Y false = " + (a && c));
System.out.println("false Y false = " + (c && d));
System.out.println("true O true = " + (a || b));
System.out.println("true O false = " + (a || c));
System.out.println("false O false = " + (c || d));
System.out.println("NO true = " + !a);
System.out.println("NO false = " + !c);
System.out.println("(3 > 4) Y true = " + ((3 >4) && a));
}
}

Produciría la siguiente salida por pantalla:

true Y true = true


true Y false = false
false Y false = false
true O true = true
true O false = true
false O false = false
NO true = false
NO false = true
(3 > 4) Y true = false

20
Sun Microsystems Inc.

38
4.11.4 Operadores de asignación

El operador de asignación es el símbolo igual ( = ).

op1 = Expresión

Asigna el resultado de evaluar la expresión de la derecha a op1.

Además del operador de asignación existen unas abreviaturas cuando el operando que
aparece a la izquierda del símbolo de asignación también aparece a la derecha del mismo:

Tabla 4.9 Abreviaturas de operadores21.

4.11.5 Precedencia de operadores en Java

Operadores postfijos [] . (paréntesis)


Operadores unarios ++expr --expr -expr ~ !
Creación o conversión de tipo new (tipo)expr
Multiplicación y división * / %
Suma y resta + -
Relacionales < > <= >=
Igualdad y desigualdad == !=
AND lógico &&
OR lógico ||
Condicional ?:

Asignación = += -= *= /= %= ^=
&= |= >>= <<=

21
Sun Microsystems Inc.

39
4.12 CONSTANTES

Las constantes en Java son declaradas como atributos de tipo final. En ese caso, sólo
permiten que se les asigne un valor una única vez.

Ejemplo:
final int x=0;

No permitirá que a x se le asigne ningún otro valor. Siempre contendrá 0.

No es necesario que el valor se le asigne en el momento de la declaración, podría haberse


inicializado en cualquier otro lugar, pero una sola vez:

Ejemplo:
final int x;

x=y+2;

Después de la asignación x=y+2, no se permitirá asignar ningún otro valor a x.

4.13 SECUENCIAS DE ESCAPE

Las secuencias de escape son combinaciones del símbolo contrabarra \ seguido de una letra,
y sirven para representar caracteres que no tienen una equivalencia en forma de símbolo.

Las posibles secuencias de escape son:

Tabla 4.10 Secuencias de escape22.

4.14 ENTRADA/SALIDA

4.14.1 Streams

Los streams son flujos secuenciales de bytes.

22
Sun Microsystems Inc.

40
Para que un programa pueda leer datos de alguna fuente, debe crear un stream de entrada
conectado a ésta; una fuente típica puede ser el teclado o un fichero. Y para escribir datos
hacia un destino, debe crear un stream de salida conectado a éste; un destino típico puede
ser la pantalla o un fichero.

Java proporciona distintas clases para el manejo de estos flujos de información, todas ellas
contenidas en el paquete java.io.

4.14.2 Clases importantes para la Entrada/Salida estándar

Las clases InputStream, OutputStream y PrintStream no son únicamente importantes para la


E/S estándar sino en general. Sobre todo las dos primeras, que son las clases de la que
parten todas las demás que tratan con streams de entrada y salida de bytes.

4.14.3 Entrada/Salida estándar

En la clase System hay definido un objeto out de la clase java.io.PrintStream, que gestiona
la salida estándar y que contiene los métodos print(), println() y write().

En la clase System existen tres atributos estáticos (atributos de clase):

 out (objeto de la clase PrintStream): Es un stream de salida que dirige el flujo de


bytes hacia la salida estándar (la pantalla).

 in (objeto de la clase InputStream): Es un stream de entrada que acepta un flujo de


bytes de la entrada estándar (el teclado).

 err (objeto de la clase PrintStream): Es un stream de salida que dirige el flujo de


bytes hacia la salida de error (la pantalla).

Estos tres atributos son estáticos y, por lo tanto, no necesita instanciarse ningún objeto de la
clase System para poder utilizarlos. Además, son streams que ya se encuentran abiertos y
listos para ser utilizados.

4.14.4 Entrada por teclado y salida por pantalla

Para la salida por pantalla debería utilizarse la clase PrintWriter y para la entrada por
teclado, BufferdReader (aunque a veces, por razones de comodidad y prisa, se utilicen
directamente System.out y System.in).

Ejemplo:

import java.io.*;

class E_S_1 {
public static void main(String arg[]) {
String línea=null;

41
BufferedReader entrada = new BufferedReader(
new InputStreamReader(System.in));
PrintWriter salida = new PrintWriter(System.out,true);
salida.println("\nEscribe el texto: ");
try {
linea = entrada.readLine();
}
catch (Exception e) {
System.err.println(e);
}
salida.println("\nLa línea escrita es: ");
salida.println(línea);
}
}

Atención: es importante llamar al constructor de la clase PrintWriter con el segundo


parámetro a true (autoflush), para que se visualice en pantalla la línea al realizar la llamada
al método println(). Si no se pusiera este parámetro a true, no se visualizaría la línea hasta
llamar al método flush() que realiza un volcado del buffer.

El esquema de declaración de objetos sería el siguiente:

Fig. 4.3 Esquema de declaración de objetos para la Entrada/Salida en Java.

4.14.5 Clase Scanner

La clase Scanner permite analizar la información ingresada, ya sea desde la entrada


estándar, archivo etc., mediante la utilización de patrones (delimitadores) obteniendo
tokens de los diferentes tipos de datos primitivos. Se la utiliza para algunas situaciones,
entre ellas, leer datos desde la entrada estándar, lo cual representa un mecanismo más
rápido como se puede apreciar a continuación.

42
public String leerLineaScanner(){
String linea = null;
Scanner lectorScanner = new Scanner(System.in)
linea = lectorScanner.nextLine();
return linea;
}

4.15 ESTRUCTURAS DE CONTROL

Las estructuras de control son construcciones hechas a partir de palabras reservadas del
lenguaje que permiten modificar el flujo de ejecución de un programa. De este modo,
pueden crearse construcciones de alternativas y bucles de repetición de bloques de
instrucciones.

Hay que señalar que un bloque de instrucciones se encontrará encerrado mediante llaves
{……..} si existe más de una instrucción.

4.15.1 Estructuras alternativas

Las estructuras alternativas son construcciones que permiten alterar el flujo secuencial de
un programa, de forma que en función de una condición o el valor de una expresión, el
mismo pueda ser desviado en una u otra alternativa de código.

Las estructuras alternativas disponibles en Java son:



if-else
switch

if-else

Forma simple:

if (expresión){
Bloque de instrucciones
}

El bloque de instrucciones se ejecuta si, y sólo si, la expresión (que debe ser lógica) se
evalúa a true, es decir, se cumple una determinada condición.

Ejemplo:

if (cont == 0){
System.out.println he llegado a cero ;
}

43
La instrucción System.out.println he llegado a cero ; sólo se ejecuta en el caso de
que cont contenga el valor cero.

Con cláusula else:

if (expresión) {
Bloque de instrucciones 1
}else{
Bloque de instrucciones 2
}

El bloque de instrucciones 1 se ejecuta si, y sólo si, la expresión se evalúa a true.


Y en caso contrario, si la expresión se evalúa a false, se ejecuta el bloque de instrucciones
2.

Ejemplo:

if (cont == 0) {
System.out.println he llegado a cero ;
}else{
System.out.println no he llegado a cero ;
}

Si cont vale cero, se mostrará en el mensaje “he llegado a cero”. Si cont contiene cualquier
otro valor distinto de cero, se mostrará el mensaje “no he llegado a cero”.

if-else anidados

En muchas ocasiones, se anidan estructuras alternativas if-else, de forma que se pregunte


por una condición si anteriormente no se ha cumplido otra sucesivamente. Por ejemplo:
suponga que realiza un programa que muestra la nota de un alumno en la forma
(insuficiente, suficiente, bien, notable o sobresaliente) en función de su nota numérica.

Podría codificarse de la siguiente forma:

class Nota {
public static void main (String[] args) {
int nota;
if (argumentos.length<1) {
// argumentos.length contiene el número de Elementos del
// array argumentos, que contiene los Parámetros
//suministrados en la línea de comandos.
System.out.println("Nota num");
System.out.println("Donde num = nº entre 0 y 10");
}else{
nota=Integer.valueOf(argumentos[0]).intValue( );
// la instrucción anterior convierte un String a entero.
if (nota<5){
System.out.println("Insuficiente");
}else{

44
if (nota<6){
System.out.println("Suficiente");
}else{
if (nota<7){
System.out.println("Bien");
}else{
if (nota<9){
System.out.println("Notable");
}else{
System.out.println("Sobresaliente");
}
}
}
}
}
}
}

En Java, como en C y a diferencia de otros lenguajes de programación, en el caso de que el


bloque de instrucciones conste de una sola instrucción (no necesita ser parentizado), se
pone un punto y coma ( ; ) justo antes de la cláusula else.

switch

Forma simple:

switch (expresión) {
case valor1: instrucciones1;
break;
case valor2: instrucciones2;
break;

case valorN: instruccionesN;
}

En este caso, a diferencia del anterior, si instrucciones1 o instrucciones2 o instruccionesN


están formados por un bloque de instrucciones sencillas, no es necesario parentizarlas
mediante las llaves ( { … } ).

En primer lugar se evalúa la expresión cuyo resultado puede ser un valor de cualquier tipo.
El programa comprueba el primer valor (valor1). En el caso de que el valor resultado de la
expresión coincida con valor1, se ejecutaran las instrucciones1 hasta encontrarse con la
palabra reservada break. Si el resultado de la expresión no coincide con valor1,
evidentemente no se ejecutarían instrucciones1, se comprobaría la coincidencia con valor2
y así sucesivamente hasta encontrar un valor que coincida o llegar al final de la
construcción switch.

En caso de que no exista ningún valor que coincida con el de la expresión, no se ejecuta
ninguna acción.

45
Ejemplo:

class DiaSemana {
public static void main(String[] args) {
int dia;
if (argumentos.length<1) {
System.out.println("Uso: DiaSemana num");
System.out.println("Donde num = nº entre 1 y 7");
}else{
dia=Integer.valueOf(argumentos[0]).intValue();
switch (dia){
case 1: System.out.println("Lunes");
break;
case 2: System.out.println("Martes");
break;
case 3: System.out.println("Miércoles");
break;
case 4: System.out.println("Jueves");
break;
case 5: System.out.println("Viernes");
break;
case 6: System.out.println("Sábado");
break;
case 7: System.out.println("Domingo");
}
}
}
}

Nótese que en el caso de que se introduzca un valor no comprendido entre 1 y 7, no se


realizará ninguna acción. Esto puede corregirse utilizando el siguiente formato:

Con cláusula por defecto:

switch (expresión) {
case valor1: instrucciones1;
case valor2: instrucciones2;

case valorN: instruccionesN;
default: instruccionesPorDefecto;
}

En este caso, instruccionesPorDefecto se ejecutarán en el caso de que ningún valor case


coincida con el valor de expresión. O en caso de ejecutar algunas instrucciones en alguno
de los case, que no haya ninguna instrucción break desde ese punto hasta la cláusula
default.

Ejemplo:

class DiasMes{
public static void main(String[] args) {
int mes;

46
if (argumentos.length<1) {
System.out.println("Uso: DiasMes num");
System.out.println("Donde num = nº del mes");
}else{
mes=Integer.valueOf(argumentos[0]).intValue();
switch (mes) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: System.out.println("El mes "+ mes + "
Tiene 31 días");
break;
case 4:
case 6:
case 9:
case 11: System.out.println("El mes "+mes + "
Tiene 30 días");
break;
case 2: System.out.println("El mes "+mes + "
Tiene 28 ó 29 días");
break;
default: System.out.println("El mes "+mes + "
no existe");
}
}
}
}

En este ejemplo, únicamente se ejecutará la cláusula default en el caso en que el valor de


mes sea distinto a un número comprendido entre 1 y 12, ya que todas estas posibilidades se
encuentran contempladas en las respectivas cláusulas case y, además, existe un break justo
antes de la cláusula default, por lo que en ningún otro caso se ejecutará la misma.

4.15.2 Bucles

Los bucles son estructuras de repetición. Bloques de instrucciones que se repiten un número
de veces mientras se cumpla una condición o hasta que se cumpla una condición.

Existen tres construcciones para estas estructuras de repetición:



for


do-while
while

Como regla general puede decirse que se utilizará el bucle for cuando se conozca de
antemano el número exacto de veces que ha de repetirse un determinado bloque de
instrucciones. Se utilizará el bucle do-while cuando no se conoce exactamente el número de

47
veces que se ejecutará el bucle pero se sabe que por lo menos se ha de ejecutar una. Se
utilizará el bucle while-do cuando es posible que no deba ejecutarse ninguna vez.

Estas reglas son generales y algunos programadores se sienten más cómodos utilizando
principalmente una de ellas. Con mayor o menor esfuerzo, puede utilizarse cualquiera de
ellas indistintamente.

for

for (inicialización ; condición ; incremento){


bloque instrucciones
}

 La cláusula inicialización es una instrucción que se ejecuta una sola vez al inicio del
bucle, normalmente para inicializar un contador.

 La cláusula condición es una expresión lógica, que se evalúa al inicio de cada nueva
iteración del bucle. En el momento en que dicha expresión se evalúe a false, se
dejará de ejecutar el bucle y el control del programa pasará a la siguiente instrucción
(a continuación del bucle for).

 La cláusula incremento es una instrucción que se ejecuta en cada iteración del bucle
como si fuera la última instrucción dentro del bloque de instrucciones.
Generalmente se trata de una instrucción de incremento o decremento de alguna
variable.

Cualquiera de estas tres cláusulas puede estar vacía, aunque SIEMPRE hay que poner los
puntos y coma ( ; ).

El siguiente programa muestra en pantalla la serie la tabla de multiplicar de un número


ingresado por teclado.

Ejemplo:

import java.util.Scanner;

public class TablaMultiplicar {

public static void main(String[] args) {


Scanner lectorScanner = new Scanner(System.in);

int tabla = 0, resultado = 0;

System.out.print("Tabla del? ");


tabla = lectorScanner.nextInt();

for (int i = 0; i <= 10; i++) {


resultado = tabla * i;

48
System.out.println(tabla + " * " + i + " = " + resultado);
}

}
}

do-while

do{
bloque instrucciones
}while (expresión);

En este tipo de bucle, bloque instrucciones se ejecuta siempre una vez por lo menos, y ese
bloque de instrucciones se ejecutará mientras Expresión se evalúe a true. Por lo tanto, entre
las instrucciones que se repiten deberá existir alguna que, en algún momento, haga que la
expresión se evalúe a false, de lo contrario el bucle sería infinito.

Ejemplo:

public class Menu {

public static void main(String[] args) {


Scanner lectorScanner = new Scanner(System.in);

int opcion;

do {
System.out.println("MENÚ DE OPCIONES");
System.out.println("1.- Comenzar");
System.out.println("2.- Abrir");
System.out.println("3.- Grabar");
System.out.println("4.- Salir");
System.out.print("\n Opción? ");
opcion = lectorScanner.nextInt();

switch (opcion) {
case 1:
System.out.println("Listo para iniciar");
break;
case 2:
System.out.println("Abriendo archivo");
break;
case 3:
System.out.println("Información guardada con éxito");
}

} while (opcion != 4);

System.out.println("Fin");
}

49
while

while (expresión){
bloque instrucciones
}

Al igual que en el bucle do-while del apartado anterior, el bloque de instrucciones se


ejecuta mientras se cumple una condición (mientras expresión se evalúe a true), pero en
este caso, la condición se comprueba ANTES de empezar a ejecutar por primera vez el
bucle, por lo que si expresión se evalúa a false en la primera iteración, entonces el bloque
de instrucciones no se ejecutará ninguna vez.

Ejemplo:

public class CuadradoDeUnNumero {

public static void main(String[] args) {


Scanner lectorScanner = new Scanner(System.in);

double cuadrado = 0;

System.out.print("ingrese un número [0 = Finalizar]? ");


int numero = lectorScanner.nextInt();

while(numero > 0)
{
cuadrado = Math.pow(numero, 2);
System.out.println( "Cuadrado: " + cuadrado);

System.out.print("ingrese un número [0 = Finalizar]? ");


numero = lectorScanner.nextInt();
}

System.out.println("Fin");

}
}

Como puede comprobarse, las tres construcciones de bucle (for, do-while y while) pueden
utilizarse indistintamente realizando unas pequeñas variaciones en el programa.

4.15.3 Saltos

En Java existen dos formas de realizar un salto incondicional en el flujo “normal” de un


programa. A saber, las instrucciones break y continue.

50
break

La instrucción break sirve para abandonar una estructura de control, tanto de las
alternativas (if-else y switch) como de las repetitivas o bucles (for, dowhile y while). En el
momento que se ejecuta la instrucción break, el control del programa sale de la estructura
en la que se encuentra.

Ejemplo:

class Break {
public static void main(String[] args) {
int i;

for (i=1; i<=4; i++) {


if (i==3) break;
System.out.println("Itereación: "+i);
}
}
}

Este ejemplo produciría la siguiente salida por pantalla:

Iteración: 1
Iteración: 2

Aunque el bucle, en principio indica que se ejecute 4 veces, en la tercera iteración, i


contiene el valor 3, se cumple la condición del if (i==3) y por lo tanto se ejecuta el break y
se sale del bucle for.

continue

La instrucción continue sirve para transferir el control del programa desde la instrucción
continue directamente a la cabecera del bucle (for, do-while o while) donde se encuentra.

Ejemplo:

class Continue {
public static void main(String[] args) {
int i;
for (i=1; i<=4; i++) {
if (i==3) continue;
System.out.println("Itereación: "+i);
}
}
}

Este programa es muy similar al anterior, pero en lugar de utilizar la instrucción break, se
ha utilizado continue. El resultado es el siguiente:

51
Iteración: 1
Iteración: 2
Iteración: 4

Puede comprobarse la diferencia con respecto al resultado del ejemplo del apartado
anterior. En este caso no se abandona el bucle, sino que se transfiere el control a la cabecera
del bucle donde se continúa con la siguiente iteración.
Tanto el salto break como en el salto continue, pueden ser evitados mediante distintas
construcciones pero en ocasiones esto puede empeorar la legibilidad del código.

4.16 VECTORES

Para manejar colecciones de objetos del mismo tipo estructurados en una sola variable se
utilizan los vectores. En Java, los vectores son en realidad objetos y por lo tanto se puede
llamar a sus métodos.

Existen dos formas equivalentes de declarar vectores en Java:

1. tipo nombreDelVector[];
2. tipo[] nombreDelVector;

Ejemplo:
int vector1[], vector2;
int[] otroVector;

También pueden utilizarse vectores de más de una dimensión:

Ejemplo:
int matriz[][];
int[][] otraMatriz;

Los vectores, al igual que las demás variables pueden ser inicializados en el momento de su
declaración. En este caso, no es necesario especificar el número de elementos máximo
reservado. Se reserva el espacio justo para almacenar los elementos añadidos en la
declaración.

Ejemplo:

String Dias[]={ Lunes , Martes , Miércoles , Jueves , Viernes ,


Sábado , Domingo };

Una simple declaración de un vector no reserva espacio en memoria, a excepción del caso
anterior, en el que sus elementos obtienen la memoria necesaria para ser almacenados. Para
reservar la memoria hay que llamar explícitamente a un constructor new de la siguiente
forma:

new tipoElemento[numElementos];

52
Ejemplo:
int matriz[][];
matriz = new int[4][7];

También se puede indicar el número de elementos durante su declaración:

Ejemplo:

int vector[] = new int[5];

Para hacer referencia a los elementos particulares del vector, se utiliza el identificador del
vector junto con el índice del elemento entre corchetes. El índice del primer elemento es el
cero (0) y el del último, el número de elementos menos uno.

Ejemplos:
j = vector[0];
vector[4] = matriz[2][3];

El intento de acceder a un elemento fuera del rango de la matriz, provoca una excepción
(error) que, de no ser manejado por el programa, será el compilador quien aborte la
operación.

Para obtener el número de elementos de un vector en tiempo de ejecución se accede al


atributo de la clase vector length. No hay que olvidar que los vectores en Java son tratados
como un objeto.

Ejemplo

class Array1 {
public static void main (String[] args) {
String colores[] = {"Rojo","Verde","Azul","Amarillo",
"Negro"};
int i;
for (i=0;i<colores.length;i++){
System.out.println(colores[i]);
}
}
}

El ejemplo anterior produce la siguiente salida por pantalla:

Rojo
Verde
Azul
Amarillo
Negro

NOTA: Los Strings o cadenas de caracteres en Java son objetos pertenecientes a las clases
String o StringBuffer y no vectores de tipo char.

53
4.17 EJERCICIOS

Para la implementación y prueba de los ejemplos desarrollados en esta guía se utilizó el


Eclipse IDE (Entorno de Desarrollo Integrado) para Java, sin embargo cabe mencionar que
bien podría utilizarse cualquier otro que sea de preferencia para el estudiante.

Ejercicio 4.1 Traducción al lenguaje Java del ejemplo 2.1.


public class Ejercicio4_1 {

public static void main(String[] args) {


final int div = 2;
final float base = 3;
final float altura = 4;
float area = base * altura / div;

System.out.print("El Área del triángulo es: " + area);


}
}

Ejercicio 4.2 Traducción al lenguaje Java del ejemplo 3.1.

import java.util.Scanner;

public class Ejercicio4_2 {

public static void main(String[] args) {


Scanner lectorScanner = new Scanner(System.in);

final int div = 2;


float base=0, altura=0, area=0;

System.out.print("Ingrese la Base del triángulo? ");


base = lectorScanner.nextFloat();

System.out.print("Ingrese la Altura del triángulo? ");


altura = lectorScanner.nextFloat();

area= (base * altura) / div;

System.out.println("El Area del triángulo es: " + area);


}
}

Ejercicio 4.3 Traducción al lenguaje Java del ejemplo 3.2.


public class Ejercicio4_3 {

public static void main(String[] args) {

54
System.out.println("David Ausubel");
System.out.println("David Ausubel");
System.out.println("David Ausubel");

}
}

Ejercicio 4.4 Traducción al lenguaje Java del ejemplo 3.3.

public class Ejercicio4_4 {

public static void main(String[] args) {


int contador;

for(contador = 1; contador <=100; contador++){


System.out.println("David Ausubel");
}

Ejercicio 4.5 Traducción al lenguaje Java del ejemplo 3.4.

public class Ejercicio4_5 {

public static void main(String[] args) {


int contador=0;
int sumatoria=0;

while (contador < 100){


contador += 1;
sumatoria += contador;

System.out.print(contador);
System.out.println("\t" + sumatoria);
}

System.out.println("[El valor de la suma 1+2+3+...+100 es]: " +


sumatoria);
}
}

Ejercicio 4.6 Traducción al lenguaje Java del ejemplo 3.5.

import java.util.Scanner;

public class Ejercicio4_6 {


public static void main(String[] args) {
Scanner lectorScanner = new Scanner(System.in);

55
int tabla=0, multiplicando=0, resultado=0;

System.out.print("Tabla de multiplicar del? ");


tabla = lectorScanner.nextInt();

for (multiplicando = 1; multiplicando<=10; multiplicando++){


resultado = multiplicando * tabla;
System.out.println(tabla + " * " + multiplicando + " = " +
resultado);
}

}
}

Ejercicio 4.7 Traducción al lenguaje Java del ejemplo 3.6.


import java.util.Scanner;

public class Ejercicio4_7 {

public static void main(String[] args) {


Scanner lectorScanner = new Scanner(System.in);

float calificacion=0;

System.out.print("Ingrese calificación? ");


calificacion = lectorScanner.nextFloat();

if(calificacion >= 7){


System.out.println("Aprobado");
}else{
System.out.println("Reprobado");
}
}
}

Ejercicio 4.8 Traducción al lenguaje Java del ejemplo 3.7.


import java.util.Scanner;

public class Ejercicio4_8 {

public static void main(String[] args) {


Scanner lectorScanner = new Scanner(System.in);

int estudiante=0, aprobar=0;


float examenUno=0, examenDos=0, trabajo=0, sumatoria=0, promedio=0;

for (estudiante = 1; estudiante <=22; estudiante++){


System.out.print("Ingrese la nota de examen uno? ");
examenUno = lectorScanner.nextFloat();
System.out.print("Ingrese la nota de examen dos? ");

56
examenDos = lectorScanner.nextFloat();
System.out.print("Ingrese la nota de trabajo? ");
trabajo = lectorScanner.nextFloat();

if(examenUno < 0 || examenUno > 10 || examenDos < 0 || examenDos


> 10 || trabajo < 0 || trabajo > 10){
System.out.println("Datos no válidos\n");
}else{
sumatoria=examenUno+examenDos+trabajo;
promedio=sumatoria/3;
if(promedio < 6.5){
aprobar=0; //"NO"
}else{
aprobar=1; //"SI"
}

System.out.println("Promedio: " + promedio);


System.out.print("Aprueba? ");

if(aprobar == 1){
System.out.println("SI");
}else{
System.out.println("NO");
}
}
}
}
}

Ejercicio 4.9 Traducción al lenguaje Java del ejemplo 3.8.

import java.util.Scanner;

public class Ejercicio4_9 {

public static void main(String[] args) {


Scanner lectorScanner = new Scanner(System.in);

int num1=0, num2 =0, num3 = 0;


int mayor=0;

System.out.print("Ingrese primer número? ");


num1 = lectorScanner.nextInt();
System.out.print("Ingrese segundo número? ");
num2 = lectorScanner.nextInt();
System.out.print("Ingrese tercer número? ");
num3 = lectorScanner.nextInt();

if(num1 > num2 && num1 > num3){


mayor = num1;
}else{
if(num2 > num1 && num2 > num3){
mayor = num2;

57
}else{
mayor = num3;
}
}

System.out.print("El mayor es: " + mayor);


}

Actividad 4.1 Traducir al lenguaje Java el algoritmo realizado en la actividad 3.1.

Actividad 4.2 Traducir al lenguaje Java el algoritmo realizado en la actividad 3.2.

Actividad 4.3 Traducir al lenguaje Java el algoritmo realizado en la actividad 3.3.

BIBLIOGRAFÍA

Hernandez Martinez, Ma. de Lourdes. Diseño estructurado de algoritmos, 1998.


Lopez García, Juan Carlos. Algoritmos y programación, 2009.
Pacho, Sergio. Curso de programación en C, 2001.

58

También podría gustarte