Programación Estructurada con Java (Parte 1 de 2)

Introducción

Aunque es posible rastrear los orígenes de la Programación Estructurada hasta los años 1940s, hay un hito que se suele considerar su origen: la publicación del artículo de Edsger W. Dijkstra “Letters to the editor: go to statement considered harmful”.

La propuesta central de la Programación Estructurada es la siguiente: es mucho más fácil entender un algoritmo si la secuencia de pasos está organizada de manera tal que no incluya saltos a otras partes del algoritmo; no es muy complicado demostrar la validez de esta propuesta con un ejemplo. ¿Qué es más fácil de entender?:

  1. Una serie de instrucciones para resolver un problema con 50 pasos donde después del paso 10 hay una instrucción que diga «vaya al paso 30, continúe hasta el 35 y luego retorne al paso 12 para continuar » y continúe con este tipo de saltos hasta finalmente terminar la tarea.
  2. Una serie de instrucciones para resolver un problema con 50 pasos donde todos los pasos estén en secuencia uno detrás de otro hasta finalmente terminar la tarea

La gran mayoría reconoce la opción 2) como la forma más entendible de organizar los pasos de un algoritmo; una conclusión aún más interesante es que la claridad con la que se describe un algoritmo o procedimiento es un atributo muy importante.

La Programación Estructurada plantea que es posible evitar saltos incondicionales empleando las siguientes estructuras de control:

  • Secuencia: el bloque secuencial de instrucciones, instrucciones ejecutadas sucesivamente, una detrás de otra.
  • Selección: la instrucción condicional con una o dos alternativa, de la forma «if condición then instrucción-1 else instrucción-2″.
  • Iteración: el bucle condicional «while condición do instrucción», que ejecuta la instrucción repetidamente mientras la condición se cumpla.

Los programas que utilizan sólo estas tres instrucciones de control básicas o sus variantes (como los bucles for, repeat o la instrucción condicional switch-case), pero no la instrucción goto (salto incondicional), se llaman estructurados.

Un programa estructurado se compone de funciones, segmentos, módulos y/o subrutinas, cada una con una sola entrada y una sola salida. Cada uno de estos módulos (aún en el mismo programa completo), se denomina programa apropiado cuando, además de estar compuesto solamente por las tres estructuras básicas:

  • tiene sólo una entrada y una salida,
  • no tiene secciones que nunca se ejecutan,
  • no tiene ciclos infinitos.

Mecanismos de la Programación Estructurada en Java

El lenguaje de programación Java incluye todos los mecanismos necesarios para desarrollar programas estructurados: uso de variables y operadores, sentencias condicionales, sentencias de repetición, tipos de datos definidos por el usuario así como la definición y llamada a funciones y procedimientos (llamados métodos en el contexto de la Programación Orientada a Objetos). En el siguiente video se describen de manera general estos mecanismos:

Variables: declaración, tipo de dato y ámbito

Una variable es una ubicación en la memoria de la computadora que tiene asociado un nombre único (identificador), un tipo de dato y un contenido. Antes de utilizar una variable en Java, ésta debe ser declarada  de la siguiente forma:

nombreTipo nombreVariable;

nombreTipo nombreVariable = valor;

Los elementos de la declaración de una variable:

  • nombreTipo, es el tipo de datos que almacenará la variable (texto, número, carácter, etc…).
  • nombreVariable, es el nombre o identificador con el que se conocerá la variable. Es altamente recomendable definirlo considerando las reglas y las convenciones[1] que establece Java para los identificadores de las variables.
  • valor, es el contenido o dato que almacena la variable.

Ejemplos:

String saludo = ”Buenos días”; //Declara e inicializa una variable de tipo cadena

int ancho = 10; //Declara una variable de tipo entero e inicializa su valor en 10

int ancho, alto; //Declara dos variables de tipo entero

int alto = ”10 cm”; //Error!, el tipo int no puede almacenar un tipo String

Las variables deben declararse y tener un valor antes de poder emplearse en alguna expresión. Una expresión es una combinación de variables, constantes, funciones y operadores que retorna un valor; por ejemplo, asumiendo que edad es una variable de numérica con valor 20:

edad + 10  // es una expresión que retorna el valor 30
edad > 20 // es una expresión que retorna el valor false

Un tipo de dato determina los valores que una variable puede asumir y el tipo de operaciones que se puede hacer con estos valores.  Por ejemplo, los números se puede sumar y las cadenas (String) se pueden concatenar.

Mayor información sobre los tipos de primitivos en Java puede encontrarse aquí.

Tipos de Dato Primitivos

Son tipos de dato incluidos en el lenguaje Java y se consideran atómicos en el sentido de que no están compuestos por partes ni contienen elementos como una cadena o un arreglo.  Java incluye los siguientes tipos de datos primitivos:

Tipo Tamaño en bits Valor Máximo Valor Mínimo
boolean true o false
char 16 bits Unicode 0 Unicode 216-1
byte 8 bits -128 +127
short 16 bits -215 +215-1
int 32 bits -231 +231-1
long 64 bits -263 +263-1
float 32 bits Estándar IEEE754 Estándar IEEE754
double 64 bits Estándar IEEE754 Estándar IEEE754

 

Cadenas

Las cadenas son secuencias de caracteres y  es posible crear cadenas directamente en el código fuente:

String saludo = “Buenos días!”;

Arreglos (array)

Un arreglo es una secuencia de tamaño fijo de valores de mismo tipo. El tamaño del arreglo se establece al momento de crearlo. Después de su creación, el tamaño de un arreglo no puede cambiar (este uso poco flexible de memoria es quizá su mayor limitación).  Cada elemento del arreglo se accede vía un índice entero; el índice del primer elemento del array es 0 (cero) y como índice superior el tamaño del array menos 1.

A continuación se muestran ejemplos de declaración, creación, asignación y acceso de arrays:

int[] numeros;          //Declaración de un array de números de tipo ‘int’
numeros = new int[5];  //declaración y creación de tamaño 5
numeros[0] = 10;        //Asignación de un valor al primer elemento

Es importante tener en cuenta que la declaración del arreglo NO incluye ninguna referencia a la cantidad de elementos y este dato es necesario únicamente al momento de crear el arreglo con el operador new.

Alternativamente, Java incluye una sintaxis que permite combinar los pasos de declaración, creación y asignación de valores iniciales de un arreglo:

//Declaración, creación e inicialización combinadas
int[] numeros = {
    100, 200, 300,
    400, 500, 600,
    700, 800, 900, 1000
};

En este caso el tamaño del arreglo está dado por el número de elementos entre {}.

En el siguiente video se presenta el concepto de ámbito o alcance de una variable:

Operadores, expresiones y compatibilidad de tipos

En esta sección se describen los diversos operadores que provee Java así como las reglas de conversión de tipo que hay que tomar en cuenta al realizar una operación de asignación de valor de una expresión a un variable:

Operadores aritméticos

Operación Operador Reglas de precedencia de operadores
Multiplicación * Se evalúan primero. Si hay varios operadores de este tipo, se evalúan de izquierda a derecha
División /
Residuo(conocido también como módulo) %
Suma + Se evalúan después. Si hay varios operadores de este tipo, se evalúan de izquierda a derecha
Resta

Operadores relacionales y operadores booleanos

En Java los operadores relacionales sirven para comparar valores. El resultado de una expresión con operadores relacionales en siempre de tipo boolean (true/false)

 Operador  Significado Tipo
== Igual Operadores de igualdad
!= Distinto
> Mayor Operadores relacionales
< Menor
>= Mayor o igual
<= Menor o igual
! No lógico (NOT) Operadores lógicos
&& “Y” lógico (AND)
|| “O” lógico (OR)

Operadores de asignación compuestos

Java cuenta con varios operadores de asignación compuestos para abreviar las expresiones de asignación. Cualquier instrucción de la forma: variable = variable operador expresión; Ejemplo: c = c + 3; Puede ser escrita de la siguiente manera empleando un operador de asignación de suma compuesto (+=), de la siguiente manera: c += 3; Por ejemplo, dadas las siguientes sentencias: int c = 3, d = 5, e = 4, f = 6, g = 12; En el siguiente cuadro se muestra el resultado de los operadores de asignación aritméticos compuestos

Operador deasignación Expresión deEjemplo Explicación Asigna
+= c += 7 c = c + 7 10 a c
-= d -= 4 d = d – 4 1 a d
*= e *= 5 e = e * 5 20 a e
/= f /= 3 f = f / 3 2 a f
%= g %= 9 g = g % 9 3 a g

Operadores de incremento y decremento

Java proporciona dos operadores unarios para sumar o restar 1 al valor de una variable numérica. Estos operadores son el operador de incremento unario (++) y el operador de decremento unario (–):

Operador OperadorLlamado Expresiónde ejemplo Explicación
++ Preincremento ++A Incrementar A en 1 antes de usar el valor de la variable
++ Postincremento A++ Incrementar A en 1 después de usar el valor de la variable
Predecremento –B Decrementar B en 1 antes de usar el valor de la variable
Postdecremento B– Decrementar B en 1 después de usar el valor de la variable

Más información sobre los operadores en Java puede encontrase aquí:   [1]Cuando el identificador de una variable está formado por más de una palabra se recomienda usar el formato lowerCamelCase y nombres cortos y significativos.

Comments are closed.