CFDP Chapter 2
CFDP Chapter 2
Lectura Fundamental
Contenido
2 Estructuras de decisión 1
3 Estructuras de repetitivos 9
6 División de cadenas 23
7 Problemas propuestos 25
8 Extras 30
Palabras Claves: Programación, lenguajes de programación, imperativo, orientado a objetos, java, ciclos, for,
while, if, else.
En este escenario se muestran las principales sentencias de control de flujo de programa presentes en muchos
lenguajes de programación, particularmente en los de tercera generación; lenguajes de alto nivel como Java. Para un
máximo aprovechamiento y apropiación de los conceptos explicados en este escenario se requiere de cada estudiante
una gran dedicación en cuanto a la práctica en la solución de problemas usando estas estructuras de control y al
análisis y seguimiento paso a paso de los ejemplos de código mostrados.
Tal vez uno de los aspectos que habla más de un programador al ver sus creaciones, es que tanto respeta las
buenas prácticas de programación que son conocidas y aprobadas por la comunidad de programadores. Aunque las
prácticas de codificación dependen un poco de cada lenguaje de programación usado y de las convenciones que se
tengan en cada equipo de trabajo, hay algunas que son universales, un ejemplo de ello es el correcto espaciado
en los códigos fuentes. Aunque hay numerosas variaciones de indentado consideradas como buenas prácticas por
diferentes equipos y comunidades, en este módulo intentaremos respetar pocas variaciones, ejemplos de los cuales
se pueden ver en la sección 8.
Los estándares sobre la forma de documentar correctamente generalmente está dada por las compañı́as o personas
que crean las herramientas o que coordinan los equipos de desarrollo. En el caso de java, Oracle tiene bien detallado
como hacerlo: Oracle, 1999b. Documentar bien es de suma importancia por varias razones, entre ellas que una buena
documentación del código respetando estándares; puede, con ayuda de algunas herramientas generar documentación
de manera pseudoautomática como en el caso de java.
Otro objetivo al documentar correctamente es para facilitar proceso de lectura de código, esto ayudará al propio
autor, su equipo de trabajo y a futuros colaboradores a entender el código y llegado al caso modificarlo o
extenderlo fácil y correctamente. Por otro lado, las buenas prácticas de programación como el correcto espaciado (o
indentado), nombramiento de variables/clases/métodos, etc. depende tanto del equipo de desarrollo, como de la
empresa o entidad creadora del lenguaje de programación o comunidades o empresas influyentes creadas o que
funcionen alrededor de él. En el caso de Java, dos grandes referentes son las recomendaciones de dos reconocidas
multinacionales: Oracle Oracle, 1999a y Google Google, 2018. Para propósitos de este módulo, una correcta
codificación y nombramiento de variables/clases/métodos en inglés junto con uno de varios ejemplos de buena
indentación y buena documentación, son suficientes. Para más detalles, se sugiere ver las fuentes mencionadas.
2. Estructuras de decisión
En cuanto a estructuras de control de programa, las más comunes en los lenguajes de programación son las
estructuras que evaluan una condición; una expresión, y dependiendo su valor de verdad el flujo de programa se va
por un camino u otro. En las estructuras de control que tienen algunos lenguajes de propósito general incluido Java,
es válido omitir el uso de llaves { y } en el caso de que haya una sola instrucción dentro del bloque en cuestión.
POLITÉCNICO GRANCOLOMBIANO 1
2.1. if
Es importante recordar que durante todo el módulo se fomenta el uso del inglés en el nombramiento de variables,
mensajes a la salida estándar y en general en todo el proceso de codificación. Esto porque vivimos y trabajamos
en un ambiente globalizado, y en general cuando necesitemos apoyo o tengamos la posibilidad de trabajar con
o para equipos internacionales, es muy bueno tener como costumbre la programación usando el inglés para el
nombramiento de elementos en el código e incluso para la documentación. Iniciamos los ejemplos de código en este
escenario con un ejemplo de la estructura de control de flujo de programa: if .
2.1.1. Ejemplo 1
En el ejemplo de código 1 podemos ver un ejemplo de uso del condicional hecho primero con llaves, y luego
omitiendo las llaves ya que hay una sola instrucción dentro del if . Se aclara que cuando hay más de una instrucción
dentro del bloque del if , no se pueden omitir las llaves, ya que a pesar de que el programa compilará correctamente,
no hará lo deseado que es ejecutar las instrucciones que creemos están dentro del bloque.
public class IFExample
{
public static void main(String[] args)
{
int n = 3;
if( n > 0 && n % 2 == 1)
{
System.out.println(n+" is positive and odd .");
}
System.out.println("This message is always printed.");
2.2. if-else
Aunque es válido usar la estructura de control if sola, con una serie de acciones a realizar si una condición es
verdadera, esta estructura también puede ser usada cuando la condición es falsa, recordemos que dentro de la
estructura if la expresión debe dar como resultado un valor de únicamente dos posibles: falso y verdadero. Por lo
tanto, cuando la expresión es evaluada y da verdadero, se ejecuta lo que está dentro de las llaves del if y si da
falso, se ejecuta lo que está dentro de las llaves del bloque else.
POLITÉCNICO GRANCOLOMBIANO 2
2.2.1. Ejemplo 2
En el código 2 el cual es similar al código 1 se puede ver un ejemplo de uso de la estructura de control if − else. Se
puede apreciar en el código 2 el uso de if − else con y sin llaves, tanto en la parte if como en la parte del else. Lo
que nunca se puede pasar por alto es que solo se pueden omitir las llaves cuando hay una sola instrucción en ese
bloque de código.
POLITÉCNICO GRANCOLOMBIANO 3
import java.util.Scanner;
public class IfElseExample
{
public static void main(String[] args){
sn.close();
}
}
POLITÉCNICO GRANCOLOMBIANO 4
2.3. if-else if-else
En algunas situaciones el programador se puede enfrentar a la tarea de hacer una de varias cosas en función de
más de una condición. Cuando esto pasa, la estructura de control if-else se puede usar varias veces en una misma
construcción. En este caso se puede omitir la última condición en caso de que no se necesite.
2.3.1. Ejemplo 3
En el código 3 podemos ver un ejemplo del uso del condicional if varias veces con varias condiciones. En este código
se podrı́a haber puesto una condición adicional en el último else para verificar que el número leı́do es cero. El
código 3 muestra un programa que toma como entrada un número entero de la entrada estándar y despliega uno de
los siguientes mensajes (en inglés) según sea el caso:
Adicional a lo anterior, el programa siempre despiega el mensaje Este mensaje se imprime siempre (en inglés:
This message is always printed.).
POLITÉCNICO GRANCOLOMBIANO 5
import java.util.Scanner;
public class IfElseIfExample{
public static void main(String[] args){
Scanner sn = new Scanner( System.in );
System.out.print("Type an integer: ");
int n = sn.nextInt();
if( n > 0 && n % 2 == 1){
System.out.println(n+" is positive and odd.");
}
else if( n > 0 && n % 2 == 0){
System.out.println(n+" is positive and even.");
}
else if( n < 0 && n % 2 == 1){
System.out.println(n+" is negative and odd.");
}
else if( n < 0 && n % 2 == 0){
System.out.println(n+" is negative and even.");
}
else{
System.out.println("n is "+n+".");
}
System.out.println("This message is always printed.");
2.4. Switch
En algunas ocasiones se necesita tomar una decisión de una serie de posibles opciones deacuerdo a un valor dado
entero, caracter o cadena. En estas situaciones podrı́amos usar sentencias if anidadas o consecutivas, o sentencias
if-else-if-else. Otra opción, es usar la estructura switch, la cual permite hacer una opción de un conjunto de
posibilidades deacuerdo al valor que tiene una variable tipo entero, caracter o cadena.
POLITÉCNICO GRANCOLOMBIANO 6
2.4.1. Ejemplo 4
En el código 4 se puede ver el uso del switch y un código que produce el mismo resultado, pero usando if-else. Se
recomienda su análisis detallado y seguimiento paso a paso para un mayor entendimiento.
import java.util.Scanner;
public class SwitchExample1{
public static void main( String args[]){
Scanner sn = new Scanner( System.in );
System.out.print("Type an integer number between 1 and 5: ");
int option = sn.nextInt();
switch ( option) {
case 1:
System.out.println("You typed 1");
break;
case 2:
System.out.println("You typed 2");
break;
case 3:
System.out.println("You typed 3");
break;
case 4:
System.out.println("You typed 4");
break;
case 5:
System.out.println("You typed 5");
break;
default:
System.out.println("You did not type a number beetween 1 and 5");
break;
}
if( option == 1 )
System.out.println("You typed 1");
else if( option == 2 )
System.out.println("You typed 2");
else if( option == 3 )
System.out.println("You typed 3");
else if( option == 4 )
System.out.println("You typed 4");
else if( option == 5 )
System.out.println("You typed 5");
else
System.out.println("You did not type a number beetween 1 and 5");
sn.close();
}
}
POLITÉCNICO GRANCOLOMBIANO 7
En un switch, después de que se encuentra una coincidencia en el valor de la variable del switch, se empieza a
ejecutar el código dentro del switch hasta que se encuentre la instrucción break. Después de encontrar la instrucción
break, el flujo de programa sigue después del switch. Estas instrucciones break, no son obligatorias en cada opción,
se pueden omitir algunas. En el código 5 se puede ver el uso del switch omitiendo algunas instrucciones break y un
código que produce el mismo resultado pero hecho usando if-else.
import java.util.Scanner;
public class BooleanExample{
public static void main( String args[]){
Scanner sn = new Scanner( System.in );
System.out.print("Type an integer number between 1 and 5: ");
int option = sn.nextInt();
switch ( option) {
case 1:
System.out.println("You typed 1");
case 2:
System.out.println("You typed 2 or 1");
case 3:
System.out.println("You typed 3 or 2 or 1");
case 4:
System.out.println("You typed 4 or 3 or 2 or 1");
case 5:
System.out.println("You typed 5 or 4 or 3 or 2 or 1");
break;
default:
System.out.println("You did not type a number beetween 1 and 5");
break;
}
if( option == 1 )
System.out.println("You typed 1");
if( option == 1 || option == 2 )
System.out.println("You typed 2 or 1");
if( option == 1 || option == 2 || option == 3 )
System.out.println("You typed 3 or 2 or 1");
if( option == 1 || option == 2 || option == 3 || option == 4 )
System.out.println("You typed 4 or 3 or 2 or 1");
if( option == 1 || option == 2 || option == 3 || option == 4 || option == 5 )
System.out.println("You typed 5 or 4 or 3 or 2 or 1");
if(!( option == 1 || option == 2 || option == 3 || option == 4 || option == 5 ))
System.out.println("You did not type a number beetween 1 and 5");
sn.close();
}
}
POLITÉCNICO GRANCOLOMBIANO 8
3. Estructuras de repetitivos
Una de las principales ventajas de saber programar, es que podemos crear software que haga de una manera rápida
y eficiente cálculos y operaciones que a las personas les tomarı́a mucho tiempo. En muchas de estas tareas es
necesario hacer procesos similares una y otra y otra vez hasta que algo ocurra (o algún número predeterminado de
veces, o mientras algo siga pasando). Es por esto que prácticamente todos los lenguajes de programación tienen
estructuras de control para hacer de una manera u otra repeticiones. Las más comunes son los ciclos for, while y
do–while.
Los ciclos for son una instrucción muy usada en programación. Es recomendada para cuando se quiere repetir un
bloque de instrucciones en el código un número determinado de veces. Consta fundamentalmente de seis partes,
cada una señalada entre comentarios /* y */ en el código 6.
1. /*1*/: La primera parte la componen las instrucciones que están antes del ciclo, y se ejecuta una sola vez.
En el ejemplo del código 6 es sólo la instrucción: int max = 10;.
2. /*2*/: La segunda parte está dentro de la estructura; for(aquı́ está;;) y se ejecuta una sola vez al inicio del
ciclo for. En el ejemplo del código 6 es sólo la instrucción: int i = 0.
3. /*3*/: La tercera parte es una operación que debe dar como resultado un valor de verdad (falso o verdadero)
y es la que controla hasta que momento se deben hacer las instrucciones del ciclo: for( ; aquı́ está ; ). En el
ejemplo del código 6 es la expresion i <max.
4. /*4*/: La cuarta parte es el cuerpo del ciclo for, es decir, lo que está dentro; las instrucciones que quere-
mos repetir cierto número de veces. Estas instrucciones empiezan su ejecusión cada vez que la expresión
en la parte 3 es evaluada como verdadera. En el ejemplo del código 6 es la instrucción de impresión
System.out.println(i);.
5. /*5*/: La quinta parte es la instrucción que se ejecuta después de cada repetición (ejecusión) del bloque
de código dentro del ciclo. Es decir, se ejecuta siempre después de la cuarta parte: for(;; aquı́ está). En el
ejemplo del código 6 es ++i.
6. /*6*/: Finalmente la sexta parte es sencillamente lo que está después del ciclo. En el código 6 esto es el
mismo ciclo, pero sin los comentarios resaltando las 6 partes.
El orden de instrucciones en el ciclo for viene dado por: Primero la parte 1 que se ejecuta una única vez, luego la
parte 2 que también se ejecuta una única vez. Luego la parte 3 que es una evaluación de una expresión booleana, y
de ser esta cierta se ejecutan las partes 4 y 5. Después de ejecutar las partes 4 y 5, vuelve a evaluarse la expresión
de la parte 3 y si sigue siendo cierta se vuelven a ejecutar las partes 4 y 5, y ası́ sucesivamente hasta que la parte 3
de falso al ser evaluada, en cuyo caso la siguiente parte a ejecutarse será la parte 6, que es la instrucción después
del ciclo for. La secuencia de ejecusión de partes si pudieramos escribirla, serı́a algo como: 1,2,3,4,5, 3,4,5 3,4,5
3,4,5 3,4,5,...,3,6.
El ciclo for es entonces recomendado para ser usado en situaciones en donde necesitamos hacer cierto número de
iteraciones (otro nombre para las repeticiones) un número determinado de veces, este número determinado de veces
puede ser fijo, o producto de alguna operación o lectura de datos. También se recomienda usar el ciclo for para
iterar sobre secuencias de números enteros con separaciones homogéneas, en especial si es para iterar sobre arreglos
POLITÉCNICO GRANCOLOMBIANO 9
o colecciones de elementos como se mostrará en la siguiente unidad.
3.1.1. Ejemplo 5
En el ejemplo del código 6 se muestra un for que iterades de 0 hasta max − 1. Es común que la lectura de estos
ciclos a la hora de explicarlos o leerlos sea: Para i variando desde 0 hasta menor que max, incrementado en 1,
haga.... Poder leer código es también una habilidad que todo programador debe tener. Por esto se invita a todos los
estudiantes y tutores a revisar de manera ordenada los códigos de aportes de compañeros en foros y actividades
propuestas por el tutor del módulo.
3.1.2. Ejemplo 6
En muchos algoritmos y situaciones conviene usar ciclos anidados para resolver problemas. En el código 7 podemos
ver un ejemplo de ello. Este código muestra un programa para imprimir las primeras m tablas de multiplicar, cada
una con n términos.
POLITÉCNICO GRANCOLOMBIANO 10
public class ForExample{
public static void main( String args[]){
int m = 10;
int n = 5;
En la descripción del funcionamiento del ciclo for en la sección 3.1 se mostraron 6 partes en el ciclo for. Los usos
más comunes de las partes 2, 3 y 5 son declaraciones e inicializaciones para la parte 2, una comparación para la
parte 3 y un incremento para la parte 5. Aunque mantener esas tradiciones es una buena práctica de programación,
la estructura del ciclo for da libertades al programador para idearse soluciones o aproximaciones a soluciones de
problemas de manera creativa y corta, aunque muchas veces muy poco legibles como vemos en el código 8 en el que
en el primer for se usan tres contadores, y en el segundo for se muestra una manera muy poco legible de pasar
números de decimal a binario. Aunque en general una buena práctica de programación es hacer el código escrito
lo más legible posible (algo que no está presente en el código 8), un buen ejercicio para repasar fundamentos de
operadores, operaciones y ciclo for, es hacer un seguimiento paso a paso de este código y entender que hace cada
instrucción y como contribuye a que al final del programa en la variable binary quede almacenado un valor entero
que se ve como la representación binaria de la variable x.
POLITÉCNICO GRANCOLOMBIANO 11
public class ForExample{
public static void main( String args[]){
int n = 15;
int a = 99;
int b = 999;
System.out.println("i\tj\tk");
for( int i = a,j = b, k = 0; k < n; ++i, --j, ++k)
System.out.println(i+"\t"+j+"\t"+k);
Una de las tantas maneras de usar los ciclos, es usarlos para iterar sobre subconjuntos de un posible conjunto
representado usando un solo integer como se mostró en el escenario 1. En el código 9 Se muestra como iterar sobre
todos los subconjuntos del conjunto {a, b, c, d, e, f }
POLITÉCNICO GRANCOLOMBIANO 12
import java.util.Arrays;
public class StringBitsAndSetsExample
{
public static void main(String[] args)
{
String s = "abcdef";
int n = s.length();
int limit = 1<<n;
String arr[] = s.split("");
System.out.println("Print all subsets of: "+Arrays.toString(arr));
for( int mask = 0; mask < limit; ++ mask )
{
System.out.print("{ ");
for (int bit = 0; bit < n; bit++)
{
boolean isBitOn = (mask & (1<<bit) ) > 0;
if( isBitOn )
{
System.out.print(s.charAt(bit)+" ");
}
}
System.out.println("}");
}
}
}
El ciclo while es fundamentalmente una estructura que debemos usar para hacer repeticiones de un bloque de
código mientras que alguna condición se cumpla; es decir, mientras que alguna expresión al ser evaluada, de
verdadero. Un ejemplo común puede ser leer datos mientras haya datos para leer o hasta que se ingrese cierto valor.
El ciclo while, consta de 4 partes, las cuales se ven en el código 10 resaltadas con comentarios como se hizo con el
ciclo for, y luego sin los comentarios para mayor claridad.
1. /*1*/: La primera parte la componen las instrucciones que están antes del ciclo, y se ejecuta una sola vez.
En el ejemplo del código 10 es un mensaje y una instrucción..
2. /*2*/: La segunda parte está dentro de la estructura. Y es una expresión que al ser evaluada debe dar un
valor de verdad, cuando este valor es true, se ejecuta el bloque que está dentro del ciclo (parte 3) y vuelve
a evaluarse. En el código 10 es (n = sn.nextInt()) >0, que es básicamente una lectura, seguida de una
asignación y después una comparación de que lo que se leyó sea mayor a 0.
3. /*3*/: La tercera parte es el bloque del ciclo, en el ejemplo en el código 10 es una impresión a la salida
estándar: System.out.println(n);.
4. /*4*/: La cuarta parte es finalmente lo que está después del ciclo que en el ejemplo de código mencionado es
un mensaje.
POLITÉCNICO GRANCOLOMBIANO 13
La secuencia de instrucciones si la pudieramos enumerar como se hizo para explicar el ciclo for, se verı́a algo como:
1,2,3, 2,3, 2,3, 2,3, 2,3, ... ,2, 4.
3.2.1. Ejemplo 9
En el código 10 se puede ver un programa que lee números enteros mientras estos sean enteros positivos y los
imprime a la salida estándar. Cuando se le ingresa un número negativo o 0, la condición del while es falsa y el flujo
de programa sigue con las instrucciones después del while.
import java.util.Scanner;
public class WhileExample{
public static void main( String args[]){
Scanner sn = new Scanner(System.in);
int n;
System.out.println("Before the while");
/*1*/
while( /*2*/ (n = sn.nextInt()) > 0 )
{
/*3*/
System.out.println(n);
}
/*4*/
System.out.println("After the while");
El ciclo do-while es fundamentalmente una estructura que debemos usar para hacer repeticiones de un bloque de
código hasta que alguna condición deje de cumplirse. O visto de otra manera, hacer repeticiones (al menos una)
mientras cierta condición se cumpla; es decir, mientras que alguna expresión al ser evaluada, de verdadero. Un
ejemplo común puede ser leer datos hasta haya datos para leer (sabiendo que habrá al menos un dato), o hasta
que se ingrese cierto valor. El ciclo do-while, consta de 4 partes al igual que el ciclo while, las cuales se ven en el
POLITÉCNICO GRANCOLOMBIANO 14
código 11 resaltadas con comentarios como se hizo con el ciclo for, y luego sin los comentarios para mayor claridad.
1. /*1*/: La primera parte la componen las instrucciones que están antes del ciclo, y se ejecuta una sola vez.
En el ejemplo del código 11 es un mensaje y una instrucción..
2. /*2*/:La segunda parte es el bloque del ciclo, en el ejemplo en el código 10 es una lectura de dato y una
impresión a la salida estándar: n = sn.nextInt(); y System.out.println(n);. Es importante notar que en
el caso del do-while a diferencia del while, la parte del bloque del ciclo se ejecuta al menos una vez, puesto
que la expresión booleana; la condición del ciclo se ejecuta después de la primera vez de ejecución del bloque.
3. /*3*/: La tercera parte está dentro de la estructura. Y es una expresión que al ser evaluada debe dar un
valor de verdad, cuando este valor es true, se ejecuta el bloque que está dentro del ciclo (parte 2) y vuelve a
evaluarse. En el código 11 es n >0, que es básicamente una lectura, seguida de una asignación y después una
comparación de que lo que se leyó sea mayor a 0.
4. /*4*/: La cuarta parte es finalmente lo que está después del ciclo que en el ejemplo de código mencionado es
un mensaje.
La secuencia de instrucciones si la pudieramos enumerar como se hizo para explicar el ciclo for, se verı́a algo como:
1,2, 3,2, 3,2, 3,2, 3,2, ... ,3, 4.
POLITÉCNICO GRANCOLOMBIANO 15
3.3.1. Ejemplo 10
import java.util.Scanner;
public class DoWhileExample{
public static void main( String args[]){
Scanner sn = new Scanner(System.in);
int n;
System.out.println("Before the while");
/*1*/
do
{
/*2*/
n = sn.nextInt();
System.out.println(n);
}while( /*3*/ n > 0 );
/*4*/
System.out.println("After the while");
Aunque cada ciclo tiene sus particularidades y usos recomendados, hay que entender y tener en cuenta que lo
que se pueda hacer con uno, se puede hacer, con los otros con relativa facilidad y el uso en algunos casos de un
condicional y una o dos lı́neas de código adicionales, como se verá en el ejemplo siguiente.
3.4.1. Ejemplo 11
En el código 12 se puede ver como con los tres ciclos se puede hacer una misma tarea, y además como cada uno se
puede adaptar para hacer tareas del tipo que son recomendadas para alguno de los otros ciclos. En este ejemplo se
omiten bastantes llaves para que se pudiera apreciar todo en una sola página.
POLITÉCNICO GRANCOLOMBIANO 16
public class AllLoopsExample{
public static void main( String args[]){
java.util.Scanner sn = new java.util.Scanner( System.in );
System.out.println("For loop common use:");
for( int i = 0; i < 5 ; ++ i)
System.out.println(i);
System.out.println("While loop as a for loop:");
int i = 0;
while( i < 5 )
System.out.println(i++);
System.out.println("Do-while loop like a for loop:");
i = 0;
do{
if( i < 5 )System.out.println(i);
++i;
}while(i < 5);
System.out.println("While loop common use:");
int x;
while((x = sn.nextInt()) > 0)
System.out.println(x);
System.out.println("For loop as a while loop:");
for(int x2;(x2 = sn.nextInt()) > 0;)
System.out.println(x2);
System.out.println("Do-while loop as a while loop:");
int x4;
do{
x4 = sn.nextInt();
if( x4 > 0 )System.out.println(x4);
}while(x4 > 0);
System.out.println("Do-while loop common use:");
do{
System.out.println(x4 = sn.nextInt());
}while( x4 > 0 );
System.out.println("For loop as a do-while loop:");
int x5 = sn.nextInt();
System.out.println(x5);
for (; x5 > 0 ;)
System.out.println(x5 = sn.nextInt());
System.out.println("While loop as a do-while loop:");
int x6 = sn.nextInt();
System.out.println(x6);
while ( x6 > 0 )
System.out.println(x6 = sn.nextInt());
sn.close();
}
}
POLITÉCNICO GRANCOLOMBIANO 17
4. Sentencias de interrupción de ciclos
Adicional a las estructuras repetición (ciclos) y posibilidad de poner dentro de ellos estructuras de control como el
condicional if, en algunos lenguajes hay sentencias para interrumpir la ejecución de un ciclo, la sentencia break, y
la sentencia continue son dos de ellas presentes en java.
La sentencia break al ser encontrada en el flujo de programa dentro de un ciclo, hace que el flujo de programa siga
en la primera instrucción después del ciclo en que se encuentra, por esto se entiende como un rompa el ciclo.
4.1.1. Ejemplo 12
En el código 13 se pueden ver dos ejemplos de uso de break para interrumpir la ejecución de ciclos. En el primero,
el cual es un solo ciclo for, al evaluarse cierta la condición del if; cuando i es igual a tres, se ejecuta la instrucción
break, y el ciclo se acaba.
En el segundo ejemplo donde se muestran dos ciclos anidados, la sentencia break se ejecuta varias veces en el ciclo
for interno, y una vez en el ciclo while externo. Se invita al estudiante a hacer un seguimiento paso a paso de este
programa para un mejor entendimiento de las posibilidades de uso e la sentencia break.
POLITÉCNICO GRANCOLOMBIANO 18
public class BreakExample{
public static void main( String args[]){
System.out.println("Break example:");
for( int i = 0; i < 1000; i ++ ){
if( i == 3 ){
break;
}
System.out.println("In the loop: i = "+i);
}
System.out.println("After the for loop.");
int whileIteration = 0;
System.out.println("Break example with nested loops:");
while(true){
whileIteration++;
for( int i = 0; i < 10; i ++ ){
if( i == 3 ){
break;
}
System.out.println("In the loop: i = "+i);
}
System.out.println("After the for loop, inside the while loop.");
if( whileIteration == 3 )
break;
}
System.out.println("At the end of the program.");
}
}
La sentencia continue al ser encontrada en el flujo de programa dentro de un ciclo, hace que el flujo de programa
siga en la siguiente iteración, por esto se entiende como un continúe en la siguiente iteración.
4.2.1. Ejemplo 13
En el código 14 se pueden ver dos ejemplos de uso de continue para interrumpir la ejecución de ciclos. En el primero,
el cual es un solo ciclo for, al evaluarse cierta la condición del if; cuando i es igual a tres, se ejecuta la instrucción
continue, y el ciclo pasa inmediatamente a la iteración siguiente, si ejecutar lo que queda del bloque del for que es
una impresión cuando i vale 3.
En el segundo ejemplo donde se muestran dos ciclos anidados, la sentencia continue se ejecuta varias veces en el
ciclo for interno, y una vez en el ciclo for externo. Se invita al estudiante a hacer un seguimiento paso a paso de
este programa para un mejor entendimiento de las posibilidades de uso e la sentencia continue.
POLITÉCNICO GRANCOLOMBIANO 19
public class ContinueExample{
public static void main( String args[]){
System.out.println("Continue example:");
for( int i = 0; i <= 5; i ++ ){
if( i == 3 ){
continue;
}
System.out.println("In the loop: i = "+i);
}
System.out.println("After the for loop.");
System.out.println("Continue example with nested loops:");
for( int k = 0; k <= 5; ++k ){
if( k == 3 )
continue;
for( int i = 0; i < 10; i ++ ){
if( i == 3 ){
continue;
}
System.out.println("In the loop: i = "+i);
}
System.out.println("After the for loop, inside the while loop.");
}
System.out.println("At the end of the program.");
}
}
En esta sección se expondrán tres usos muy comunes de variables en programas. Estos tres usos son tan comunes,
que se han clasificado ampliamente por la comunidad de programadores de lenguajes como claramente distinguibles
de otros usos que se le den a variables. Los usos principales de variables son: para contar, para acumular, y para
detectar eventos o condiciones.
Las variables tipo contador, sirven fundamentalmente para contar cosas, o iterar en un ciclo (comunmente for). Es
muy común usar las variables i, j y k en ciclos como el contador del ciclo, se les da este nombre porque van
contando las iteraciones del ciclo. Una variable tipo contador es entonces una variable de tipo entero, que sirve
para contar de uno en uno (o disminuyendo de uno en uno) o aumentando en cierta cantidad fija hasta que se
cumpla una condición. Nombres comunes y buenos para tener en cuenta en prácticas de programación, son cnt,
POLITÉCNICO GRANCOLOMBIANO 20
count, counter, errorCounter, errorCnt, errorCounter, entre otros.
5.1.1. Ejemplo 14
En el código 15 se puede ver un ejemplo de uso de contadores. En este ejemplo, se cuentan cuantas posibles
combinaciones de valores de tres variables entre 0 y 9, al sumarlos, el resultado da un múltiplo de 7.
El segundo uso común de variables son las variables usadas como acumuladores. A diferencia de las de uso como
contadores, estas se pueden encontrar en tipos enteros, reales, y booleanos incluso. Se usan variables de esta
manera cuando se desean acumular sumas de magnitudes, o productorias o secuencias de conjunciones booleanas
o disyunciones booleanas. Nombres comunes y buenos para tener en cuenta en prácticas de programación, son
accum, accumulator, areaAccum, moneyAccum, entre otros.
5.1.3. Ejemplo 15
En el código 16 Se puede ver un ejemplo de código muy similar al mostrado en 15 pero en lugar de contar los
múltiplos que se encuentra, el programa suma todos sus valores para mostrar el resultado al final.
POLITÉCNICO GRANCOLOMBIANO 21
public class AccumExample{
public static void main( String args[]){
int n = 10;
int accum = 0;
for( int i = 0; i < n; ++ i ){
for (int j = 0; j < n; j++){
for (int k = 0; k < n; k++){
if( (i + j + k)%7 == 0 ){
accum += i+j+k;
}
}
}
}
System.out.println("accum = "+accum);
}
}
En algunas ocasiones es de interes detectar si una condición se cumple, o si algún valor ocurre en una serie de
iteraciones u operaciones. Cuando necesitamos recorrer o analizar un conjunto de posibilidades y decir al final si
ocurrió o no ocurrió alguna posibilidad o conjunto pequeño de posibilidades, usamos variables como banderas.
Estas variables son generalmente de tipo booleano y se tienden a declarar falsas antes de analizar el conjunto de
posiblidades, y en el caso de detectar algo, se les cambia su valor a true, para proceder a tomar acciones respecto
a lo que se detectó. También pueden ser de tipo entero cuando las posibilidades no son solo de que existe o no
una situación, si no que son una de varias en un conjunto pequeño de posibilidades. Ası́ por ejemplo se podrı́a
inicializar una variable bandera en -1, y durante el análisis del conjunto de posiblidades, darle valores 0, o 1, o 2,
etc. según se necesite para después tomar acciones para cada detección.
5.2.1. Ejemplo 16
En el código 17 se ve un ejemplo de uso de una variable como bandera para detectar algo. En este caso se desea
detectar si alguna combinación de valores de i, j y k entre 0 y 9, tiene como suma un número que es a la vez
múltiplo de 7, 5 y 3.
POLITÉCNICO GRANCOLOMBIANO 22
public class Flags{
public static void main( String args[]){
int n = 10;
boolean flag = false;
for( int i = 0; i < n && !flag; ++ i ){
for (int j = 0; j < n && !flag; j++){
for (int k = 0; k < n && !flag; k++){
if( ( i + j + k ) % 7 == 0 &&
( i + j + k ) % 5 == 0 &&
( i + j + k ) % 3 == 0){
flag = true;
}
}
}
}
System.out.println("Flag = "+flag);
}
}
6. División de cadenas
Para finalizar este escenario, veremos el uso de ciclos en conjunción con otra tarea muy común en el diseño de
programas y algoritmos. Esta tarea consiste en partir cadenas. Los lenguajes de programación generalmente tienen
al menos una manera de hacer esta tarea. En el caso de Java hay varias, a continuación se mostrarán dos.
Una de las herramientas disponibles en java para dividir cadenas de caracteres, es la clase StringTokenizer, a
esta clase se le puede pasar un valor tipo String que sirva de separador, en el caso de que nada se pase en su
instanciación, la separación se hará por espacios en blanco: Espacios, tabulaciones, saltos de lı́nea y retornos de
carro. Para más detalle, se debe siempre recordar la revisión de la documentación relacionada (ver Oracle, 1995b).
En el código 18 se puede ver un ejemplo de uso de StringTokenizer para dividir cadenas. Hay varios aspectos
adicionales a mencionar en este ejemplo. El primero es que toda la lectura se hace lı́nea a lı́nea, inclusive la del
entero que se lee al inicio del programa (se podrı́a haber hecho con nextInt). Esto porque en general para evitar
posibles errores sencillos de programacion, una buena recomendación es seguir el principio de Si en la lectura se
leerán algunas lı́neas completas, entonces leer lı́neas completas en toda la lectura.
Otro aspecto a tener en cuenta es el uso de la clase StringBuilder. La clase StringBuilder es una clase en java que
permite operar cadenas de manera eficiente, mucho más eficiente que usar concatenaciones y operaciones con la
clase String. Para más detalles de uso de la clase StringBuilder, revisar la documentación de java Oracle, 1995a.
POLITÉCNICO GRANCOLOMBIANO 23
Lo que hace el código 18 es básicamente leer una serie de lı́neas, y usando StringTokenizer y StringBuilder, construir
una cadena de lo leı́do sin espacios y con todo lo leı́do en minúsculas. Se recomienda como siempre en todos los
ejemplos de código de este módulo, hacer un seguimiento paso a paso al programa y entender cada instrucción.
import java.util.Scanner;
import java.util.StringTokenizer;
public class StringTokenizerExample{
public static void main( String args[]){
Scanner sn = new Scanner( System.in );
String line;
StringBuilder sb = new StringBuilder();
System.out.print("How many lines should the program read: ");
int n = Integer.parseInt( sn.nextLine());
System.out.println("Type "+n+" lines: ");
for( int i = 1; i <= n; ++i ){
System.out.print("Type line "+i+" : ");
line = sn.nextLine();
System.out.println("Line we just read: _"+line+"_");
StringTokenizer st = new StringTokenizer(line);
while( st.hasMoreTokens() ){
sb.append( st.nextToken().toLowerCase() );
}
}
System.out.println("All the input in lower case, and without spaces or tabs.");
System.out.println(sb.toString());
sn.close();
}
}
Otra forma de separar cadenas, es el uso del método split de la clase String. Este método se usa de manera similar
a como se instancia la clase StringTokenizer. En el ejemplo mostrado en el código 19 se muestra un programa muy
similar al mostrado para el ejemplo de StringTokenizer, pero en lugar de usar StringTokenizer, se usa el método
split para dividir las cadenas. En este ejemplo de uso de split se puede ver adicionalmente un uso de for que no se
ha expuesto hasta el momento. Este for es conocido como foreach y sirve para iterar con una variable temporal a
través de los elementos de un arreglo o colección. Se verán más detalles de esto en la siguiente unidad.
POLITÉCNICO GRANCOLOMBIANO 24
import java.util.Scanner;
import java.util.StringTokenizer;
public class StringSplitExample{
public static void main( String args[]){
Scanner sn = new Scanner( System.in );
String line;
StringBuilder sb = new StringBuilder();
System.out.print("How many lines should the program read: ");
int n = Integer.parseInt( sn.nextLine());
System.out.println("Type "+n+" lines: ");
for( int i = 1; i <= n; ++i ){
System.out.print("Type line "+i+" : ");
line = sn.nextLine();
System.out.println("Line we just read: _"+line+"_");
7. Problemas propuestos
Todos los programas de esta sección constan de un enunciado en el que se solicita el diseño e implementación de
un programa en java que tome como entrada ciertos datos leı́dos desde la entrada estándar de java y produzca
como única salida los datos solicitados, que pueden ser cálculos o transformaciones hechas con los datos de entrada.
En todos los problemas propuestos se debe asumir que las entradas cumplirán con lo estipulado en la sección
Descripción de entrada de cada problema. Dicho esto se debe entonces diseñar e implementar un programa que
cumpla con lo estipulado en la sección Descripción de salida, y que sea únicamente lo solicitado allı́, nada más.
POLITÉCNICO GRANCOLOMBIANO 25
• Ejemplo de salida 2:
6
• Ejemplo de entrada 3:
-98746
• Ejemplo de salida 3:
5
• Ejemplo de entrada 4:
2999999999
• Ejemplo de salida 4:
10
2. Búsqueda del mayor. Hacer un programa que tome como entrada un número entero positivo N seguido de N
números y como salida muestre el mayor de los números.
• Descripción de entrada: Un número positivo entero N seguido de N números enteros.
• Descripción de Salida: El mayor de los N números leı́dos. Asumir que N no va a ser mayor a 100 y los N
números todos estarán entre -3000000000 y 3000000000.
• Ejemplo de entrada:
5 200 100 3000 656 98
• Ejemplo de salida:
3000
• Ejemplo de entrada:
5 -9 -8 -6333333 -9 -2
• Ejemplo de salida:
-2
• Ejemplo de entrada:
1 -3000000000
• Ejemplo de salida:
-3000000000
3. Búsqueda del menor. Hacer un programa que tome como entrada un número entero positivo N seguido de N
números y como salida muestre el menor de los números.
• Descripción de entrada: Un número positivo entero N seguido de N números enteros.
• Descripción de Salida: El menor de los N números leı́dos. Asumir que N no va a ser mayor a 100 y los N
números todos estarán entre -3000000000 y 3000000000.
• Ejemplo de entrada:
5 200 100 3000 656 98
• Ejemplo de salida:
98
• Ejemplo de entrada 2:
5 -9 -8 -6333333 -9 -2
• Ejemplo de salida 2:
-6333333
• Ejemplo de entrada 3:
1 3000000000
• Ejemplo de salida 3:
3000000000
4. Analisis de coordenadas. Diseñar un programa que lea una secuencia de parejas de números (no se sabe
cuantas) hasta que le ingresen la pareja 0 0. El programa debe asumir que son coordenadas en el plano
cartesiano (coordenadas enteras, sólo leerá enteros). Después de la lectura, el programa debe imprimir el par
ordenado más cercano al origen, el más lejano al origen y el promedio de las distancias al origen de todos los
puntos. Además el programa debe mostrar un mensaje indicando si se ingresaron puntos sobre los ejes o no
POLITÉCNICO GRANCOLOMBIANO 26
(coordenada x=0 o y=0). Se puede asumir que en la entrada de datos no hay parejas ordenadas con la misma
distancia al origen. Se deben ignorar los puntos que están en el tercer cuadrante (x¡0 y y¡0)
• Descripción de entrada: Parejas de números enteros hasta que se lea la pareja 0 0.
• Descripción de Salida: XXXXX.
• Ejemplo de entrada:
5
63 65
11
55
23
20 20
• Ejemplo de salida:
Closest to origin: 1 1
Furthest to origin: 63 65
Average Distance to origin: 26.179163951646263
5. Contar dı́gitos en intervalo. Dados dos números A y B, diseñar e implementar un programa que cuente la
cantidad de veces que se escribirı́a cada dı́gito si se escribieran todos los números entre A y B.
• Descripción de entrada: two integers A and B. Both between -1000 y 1000.
• Descripción de Salida: Un mensaje por cada dı́gito entre 0 y 9 indicando cuantas veces se imprimirı́a.
• Ejemplo de entrada:
-1 1
• Ejemplo de salida:
Digit 0 is printed 1 times.
Digit 1 is printed 2 times.
Digit 2 is printed 0 times.
Digit 3 is printed 0 times.
Digit 4 is printed 0 times.
Digit 5 is printed 0 times.
Digit 6 is printed 0 times.
Digit 7 is printed 0 times.
Digit 8 is printed 0 times.
Digit 9 is printed 0 times.
• Ejemplo de entrada 2:
654 123
• Ejemplo de salida 2:
Digit 0 is printed 103 times.
Digit 1 is printed 180 times.
Digit 2 is printed 210 times.
Digit 3 is printed 214 times.
Digit 4 is printed 214 times.
Digit 5 is printed 208 times.
Digit 6 is printed 158 times.
Digit 7 is printed 103 times.
Digit 8 is printed 103 times.
Digit 9 is printed 103 times.
6. Seno de ángulo. Diseñe un método que calcule el seno de un ángulo usando series de taylor. Nota: No
usar métodos de la clase Math de java. Para este problema vale la pena calcular términos mientras sean
significativos según alguna tolerancia preestablecida, por ejemplo una tolerancia de 0.0000000001.
• Descripción de entrada: Un valor real, representando un ángulo en radianes para calcular el seno.
POLITÉCNICO GRANCOLOMBIANO 27
• Descripción de Salida: El seno del ángulo en radianes leı́do.
• Ejemplo de entrada:
2
• Ejemplo de salida:
0.9092974268256817
• Ejemplo de entrada 2:
1.57
• Ejemplo de salida 2:
0.9999996829318346
7. Coseno de ángulo. Diseñe un método que calcule el coseno de un ángulo usando series de taylor. Nota: No
usar métodos de la clase Math de java. Para este problema vale la pena calcular términos mientras sean
significativos según alguna tolerancia preestablecida, por ejemplo una tolerancia de 0.0000000001.
• Descripción de entrada: Un valor real, representando un ángulo en radianes para calcular el seno.
• Descripción de Salida: El seno del ángulo en radianes leı́do.
• Ejemplo de entrada:
2
• Ejemplo de salida
0.4161468365471424
• Ejemplo de entrada 2:
1.57
• Ejemplo de salida 2:
0.0007963267107332633
8. Número primo. Diseñar un programa que tome como entrada un número entero positivo y diga si es primo o
no.
• Descripción de entrada: Un número entero positivo mayor o igual a 2 y menor o igual a 2000000.
• Descripción de Salida: prime o not prime según el caso.
• Ejemplo de entrada:
7
• Ejemplo de salida:
prime
• Ejemplo de entrada 2:
2113
• Ejemplo de salida 2:
prime
• Ejemplo de entrada:
70
• Ejemplo de salida:
not prime
• Ejemplo de entrada 2:
21135
• Ejemplo de salida 2:
not prime
9. Números primos en intervalo. Diseñar e implementar un programa que tome como entrada dos números
enteros positivos mayores o iguales que 2 y menores o iguales que 20000 y muestre a la salida estándar cuantos
números primos hay en ese intervalo.
• Descripción de entrada: Una pareja de números enteros positivos.
• Descripción de Salida: Un número entero no negativo indicando la cantidad de números primos en el
intervalo dado.
• Ejemplo de entrada:
POLITÉCNICO GRANCOLOMBIANO 28
8 10
• Ejemplo de salida:
0
• Ejemplo de entrada 2:
10 20
• Ejemplo de salida 2:
4
• Ejemplo de entrada 3:
11 19
• Ejemplo de salida 3:
4
10. Subconjuntos de tamaño fijo. Modificar el ejemplo del código 9 Para que en lugar de tener fija la cadena, la
lea usando la entrada estándar. En el caso de que la cadena leı́da sea de tamaño mayor que 15 o que tenga
elementos repetidos, debe mostrar un mensaje de error. En otro caso, debe leer un número entero k y seguido
a esto mostrar todos los subconjuntos del conjunto representado que tengan tamaño k.
• Descripción de entrada: Una cadena y posiblemente un número entero k, dependiendo de si la cadena
tiene solo elementos diferentes.
• Descripción de Salida: Todos los subconjuntos de tamaño k que tiene el conjunto representado por la
cadena leı́da.
• Ejemplo de entrada:
xyzwab 3
• Ejemplo de salida:
{x,y,z}
{x,y,w}
{x,z,w}
{y,z,w}
{x,y,a}
{x,z,a}
{y,z,a}
{x,w,a}
{y,w,a}
{z,w,a}
{x,y,b}
{x,z,b}
{y,z,b}
{x,w,b}
{y,w,b}
{z,w,b}
{x,a,b}
{y,a,b}
{z,a,b}
{w,a,b}
11. Hacer un seguimiento paso a paso al siguiente programa, asumiendo que se lee el código estudiantil o número
de cédula. Recomendación: Usar una hoja de cálculo o papel y lápiz. Después de hacer el seguimiento paso a
paso, correr el programa con la entrada que se hizo el seguimiento y verificar que todas las salidas correspondan
a las detectadas durante el seguimiento.
POLITÉCNICO GRANCOLOMBIANO 29
import java.util.Scanner;
public class MainLoops{
public static void main (String[] args) {
Scanner sn = new Scanner(System.in);
int cc = sn.nextInt() % 10;
int from = cc-6;
int to = cc;
boolean parity = true;
boolean positive = true;
int iterCounter = 0;
int accum = 0;
for( int i = from; i <= to; ++i ){
if( i % 2 == 0 ){
continue;
}
int cnt = 0;
for( int j = from; j <= to; ++j ){
if( cnt == 2 ){
break;
}
++iterCounter;
System.out.println(iterCounter+" -> "+i+","+j);
accum = accum + (i+j);
positive = positive && ((i+j) > 0);
parity = parity && ((i+j) % 2==0);
++cnt;
}
}
System.out.println("iterCounter ="+iterCounter);
System.out.println("accum ="+accum);
System.out.println("positive ="+positive);
System.out.println("parity ="+parity);
sn.close();
}
}
Código 20: Seguimiento a programa paso a paso.
8. Extras
Para propósitos de este módulo, mostramos aquı́ ejemplos de lo que se considera buena indentación de código. Vale
la pena analizar con el tutor las ventajas y desventajas de cada manera de editar. En particular se puede notar
POLITÉCNICO GRANCOLOMBIANO 30
las manera de indentar en los ejemplos 21, 22, 23 y 24, los cuales son variaciones del ejemplo 9, son variaciones
de los estilos dados por stroustrup y kernigham los cuales según el equipo de tutores y autores de módulos
de la Institución Universitaria Politécnico Grancolombiano son una muy buena aproximación a como debe ser el
indentado de códigos fuente en este y otros módulos relacionados.
import java.util.Arrays;
public class StringBitsAndSetsExample
{
public static void main(String[] args)
{
String s = "abcdef";
int n = s.length();
int limit = 1<<n;
String arr[] = s.split("");
System.out.println("Print all subsets of: "+Arrays.toString(arr));
for( int mask = 0; mask < limit; ++ mask )
{
System.out.print("{ ");
for (int bit = 0; bit < n; bit++)
{
boolean isIn = (mask & (1<<bit) ) > 0;
if( isIn )
{
System.out.print(s.charAt(bit)+" ");
}
}
System.out.println("}");
}
}
}
POLITÉCNICO GRANCOLOMBIANO 31
import java.util.Arrays;
public class StringBitsAndSetsExample2{
public static void main(String[] args) {
String s = "abcdef";
int n = s.length();
int limit = 1<<n;
String arr[] = s.split("");
System.out.println("Print all subsets of: "+Arrays.toString(arr));
for( int mask = 0; mask < limit; ++ mask ){
System.out.print("{ ");
for (int bit = 0; bit < n; bit++){
boolean isIn = (mask & (1<<bit) ) > 0;
if( isIn ){
System.out.print(s.charAt(bit)+" ");
}
}
System.out.println("}");
}
}
}
import java.util.Arrays;
public class StringBitsAndSetsExample3{
public static void main(String[] args) {
String s = "abcdef";
int n = s.length();
int limit = 1<<n;
String arr[] = s.split("");
System.out.println("Print all subsets of: "+Arrays.toString(arr));
for( int mask = 0; mask < limit; ++ mask ){
System.out.print("{ ");
for (int bit = 0; bit < n; bit++)
if( (mask & (1<<bit) ) > 0 )
System.out.print(s.charAt(bit)+" ");
System.out.println("}");
}
}
}
POLITÉCNICO GRANCOLOMBIANO 32
import java.util.Arrays;
public class StringBitsAndSetsExample4
{
public static void main(String[] args)
{
String s = "abcdef";
int n = s.length();
int limit = 1<<n;
String arr[] = s.split("");
System.out.println("Print all subsets of: "+Arrays.toString(arr));
for( int mask = 0; mask < limit; ++ mask )
{
System.out.print("{ ");
for (int bit = 0; bit < n; bit++)
if( (mask & (1<<bit) ) > 0 )
System.out.print(s.charAt(bit)+" ");
System.out.println("}");
}
}
}
POLITÉCNICO GRANCOLOMBIANO 33
Referencias
Google, C. (2018). Google Java Style Guide. Recuperado el 30 de abril de 2018, desde https://google.github.io/
styleguide/javaguide.html
Oracle, C. (1995a). StringBuilder class, Java doc. Recuperado el 30 de abril de 2018, desde https://docs.oracle.
com/javase/7/docs/api/java/lang/StringBuilder.html
Oracle, C. (1995b). StringTokenizer class, Java doc. Recuperado el 30 de abril de 2018, desde https://docs.oracle.
com/javase/7/docs/api/java/util/StringTokenizer.html
Oracle, C. (1999a). Code Conventions for the Java TM Programming Language. Recuperado el 30 de abril de 2018,
desde http://www.oracle.com/technetwork/java/codeconvtoc-136057.html
Oracle, C. (1999b). How to Write Doc Comments for the Javadoc Tool. Recuperado el 30 de abril de 2018, desde
http://www.oracle.com/technetwork/articles/java/index-137868.html
POLITÉCNICO GRANCOLOMBIANO 34
INFORMACIÓN TÉCNICA
POLITÉCNICO GRANCOLOMBIANO 35