You are on page 1of 20

Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12

Fundamentos de programacin y Java


Editar un programa que compruebe si 3 nmeros enteros, da, mes y ao, que se
introducen en la lnea de llamada del programa, constituyen o no una fecha vlida.
Se ha de comprobar que se introducen 3 datos de entrada, y que el rango para el
ao ha de estar comprendido entre !"" y #!!, ambos inclusive. En el caso de que
la fecha no se considere vlida, se ha de indicar cul es el problema.
Diseamos un algoritmo inicial en forma de pseudocdigo, que indicar, en lneas
generales, los pasos para la resolucin del problema.
1. !nicio " !ntroduccin de damesao
#. $omprobar que se %an introducido & datos.
&. 'alidar el ao.
(. 'alidar el mes.
). 'alidar el da.
Al realizar las validaciones
conviene comprobar, en primer
lugar, si el ao es correcto no
tiene sentido validar mes ! d"a si
luego el ao da incorrecto#
*n la siguiente fase se reali+a un algoritmo ms detallado, en nuestro caso en forma de
diagrama de flu,o u ordinograma, para resolver el problema
$n los diagramas de %lu&o se
utilizan unos s"mbolos
estandarizados iniciadores !
terminadores, rombos para las
condiciones, rect'ngulo con
un e(tremo en )punta* para
simbolizar la salida por
pantalla, etc#
+odos los programas tienen un
punto de inicio !, aun,ue lo
m's %recuente sea tener un
solo punto %inal, puede -aber
varios#
*l siguiente paso consiste en editar el programa, para lo que utili+aremos el bloc de
notas, creando un arc%ivo de nombre ValidarFecha.java-
Programaci.n /undamentos de programaci.n ! 0ava P'gina 1
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
. continuacin compilamos el arc%ivo ValidarFecha.java. /i la compilacin se
reali+a satisfactoriamente, se genera el arc%ivo ValidarFecha.class.
*,ecutamos el arc%ivo reci0n compilado, probndolo con diversos datos de entrada,
como se puede apreciar en la siguiente figura.
1arece que, de momento, el programa act2a seg2n los requerimientos planteados.
$ontinuamos con la parte del algoritmo en forma de diagrama de flu,o que permite
validar el da, viendo para ello varias versiones. *n esta primera prescindimos de la
parte correspondiente a la validacin del mes # 3febrero4, por tener una comple,idad
mayor que los dems meses.
Programaci.n /undamentos de programaci.n ! 0ava P'gina 2
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
Diagrama de %lu&o ,ue comprueba si el d"a de la %ec-a es v'lido 1a e(cepci.n de %ebrero2
5odificamos el programa ValidarFecha.java aadiendo las sentencias
correspondientes a esta parte del algoritmo-
Programaci.n /undamentos de programaci.n ! 0ava P'gina 3
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
class ValidarFecha {
public static void main(String[] args) {
// Comprobar si hay 3 datos de entrada
i (args!length "# 3) {
System!out!println($%o hay 3 datos de entrada$)&
return&
'
// Si el programa llega a(ui es (ue hay 3 datos de entrada
int dia # )nteger!parse)nt(args[*])&
int mes # )nteger!parse)nt(args[+])&
int anno # )nteger!parse)nt(args[,])&
// Comprobar si el anno es valido
i ((anno - +.**) // (anno 0 ,+..)) {
System!out!println($1nno no valido2 $ 3 anno)&
return&
'
// Comprobar si el mes es valido
i ((mes - +) // (mes 0 +,)) {
System!out!println($4es no valido2 $ 3 mes)&
return&
'
// Comprobar si el dia es valido
i (dia - +) {
System!out!println($5ia no valido2 $ 3dia)&
return&
'
i (mes ## +) {
i (dia -# 3+)
System!out!println(dia 3 $ de enero de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
'
i (mes ## ,) {
System!out!println($6esolucion de ebrero mas adelante$)&
return&
'
i (mes ## 3) {
i (dia -# 3+)
System!out!println(dia 3 $ de mar7o de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
'
i (mes ## 8) {
i (dia -# 3*)
System!out!println(dia 3 $ de abril de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
Programaci.n /undamentos de programaci.n ! 0ava P'gina 4
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
'
i (mes ## 9) {
i (dia -# 3+)
System!out!println(dia 3 $ de mayo de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
'
i (mes ## :) {
i (dia -# 3*)
System!out!println(dia 3 $ de ;unio de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
'
i (mes ## <) {
i (dia -# 3+)
System!out!println(dia 3 $ de ;ulio de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
'
i (mes ## =) {
i (dia -# 3+)
System!out!println(dia 3 $ de agosto de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
'
i (mes ## .) {
i (dia -# 3*)
System!out!println(dia 3 $ de septiembre de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
'
i (mes ## +*) {
i (dia -# 3+)
System!out!println(dia 3 $ de octubre de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
'
i (mes ## ++) {
i (dia -# 3*)
System!out!println(dia 3 $ de noviembre de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
'
i (dia -# 3+)
Programaci.n /undamentos de programaci.n ! 0ava P'gina 5
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
System!out!println(dia 3 $ de diciembre de $ 3 anno)&
else
System!out!println($5ia no valido2 $ 3 dia)&
return&
'
'
6ras la compilacin del programa y %abiendo corregido los posibles errores surgidos en
esta fase, e,ecutamos ValidarFecha con distintos datos de entrada.
6esultados de la e&ecuci.n del programa a %alta de validar el d"a de %ebrero
1arece que el programa funciona correctamente a falta de reali+ar la comprobacin para
el caso de tratarse de una fec%a del mes de febrero.
7a fec%a corresponde al mes de febrero.
/e trata de un mes especial pues puede tener distinto n2mero de das dependiendo del
ao. *8isten # posibilidades-
9ue el ao sea bisiesto, por lo que febrero tiene 27 das.
9ue el ao no sea bisiesto, por lo que febrero tiene 28 das.
/e consideran bisiestos los aos que siendo m2ltiplos de (, no lo son de 1::, a
e8cepcin de los m2ltiplos de (::, que si son bisiestos. /ignifica que, por e,emplo, 1;::
no fue bisiesto, #::: s lo fue, y #1:: no lo ser.
*laboramos un diagrama de flu,o que resuelva esta parte del problema-
Programaci.n /undamentos de programaci.n ! 0ava P'gina 9
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
Diagrama de %lu&o correspondiente a la validaci.n de d"a del mes de %ebrero
*ditamos el programa ValidarFecha!;ava aadiendo el cdigo correspondiente al
diagrama de flu,o de validacin de da del mes de febrero.
C.digo correspondiente a la validaci.n de d"a del mes de %ebrero
$ompilamos a continuacin el programa, y si se %alla libre de errores lo e,ecutamos con
una serie de valores de prueba.
Programaci.n /undamentos de programaci.n ! 0ava P'gina :
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
6esultados de la e&ecuci.n del programa completo
<na forma ms reducida y, en este caso posiblemente ms clara de reali+ar la validacin
del da correspondiente al mes de febrero puede ser la siguiente-
Diagrama de %lu&o correspondiente a una me&ora de validaci.n del d"a del mes de %ebrero
*l cdigo correspondiente a este diagrama de flu,o es el siguiente-
Programaci.n /undamentos de programaci.n ! 0ava P'gina 8
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
C.digo correspondiente a la validaci.n de d"a del mes de %ebrero
<na ve+ compilado el programa, y si se %alla libre de errores de compilacin, lo
e,ecutamos con la batera de datos de prueba antes utili+ada. /i el resultado es positivo,
y consideramos que esta parte del cdigo es ms clara y legible que la anteriormente
utili+ada, no dudaremos en adoptarla.
/iguiendo con nuestras operaciones de simplificar en lo posible el algoritmo de
validacin de fec%a, modificamos el general de todos los meses-
Diagrama de %lu&o con condiciones m;ltiples
Programaci.n /undamentos de programaci.n ! 0ava P'gina 7
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
= nos queda un diagrama de flu,o muc%o ms ligero que el inicialmente planteado,
aunque con una carencia- en lugar de preguntar por cada mes en concreto, lo %ace en
grupo para los de &1 das por una parte y para los de &: das por otra, por lo que no ser
capa+ de discriminar, por lo menos a%, el mes de que se trata 3a e8cepcin de febrero,
que no pertenece a ninguno de esos dos grandes grupos4.
*l cdigo correspondiente a la parte novedosa de este diagrama de flu,o ser-
C.digo correspondiente al diagrama de %lu&o con condiciones m;ltiples
$omo en anteriores ocasiones, tras la compilacin del programa y depuracin de
posibles errores, se pasar a su e,ecucin con la batera de datos de prueba.
7a sentencia s$itch%case
1ara escribir el cdigo de diferenciacin de los meses se %an utili+ado numerosas if
que, en ocasiones, pueden ser sustituidas por sendas sentencias switch/case. 7a
sentencia switch se puede utili+ar cuando el valor a comparar, en nuestro caso el
n2mero del mes, se encuentra entre una serie de valores conocidos, en nuestro caso entre
1 y 1#.
*n primer lugar se %a de indicar cul es la variable que mane,a la sentencia
s>itc%, y esto se declara en switch (mes) {
. continuacin se enumeran los distintos casos que pueden producirse en la
forma-
case 1: if (dia <= 31) nombrees = !enero!" brea#"
7a sentencia break; finali+a la e,ecucin del bloque de instrucciones en que se
%alla, por lo que cuando se e,ecute alg2n break; la siguiente sentencia a
e,ecutar ser if (nombreMes == "") /i no se escribiera la sentencia
Programaci.n /undamentos de programaci.n ! 0ava P'gina 10
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
break; el programa seguira e,ecutando cada uno de los 1# casos, aun cuando
se encontrara que el caso es el 1.
1or 2ltimo %a de figurar una sentencia default: que en nuestro caso adopta la
forma-
defa$lt: %&stem.o$t.'rintln(!es no valido: ! ( mes)"
ret$rn"
7a default: indica lo que %a de reali+ar el programa si el valor que tiene la
variable que mane,a el s>itc%, mes en nuestro caso, no est comprendido
entre los casos enumerados, del 1 al 1# en nuestro programa 3que mes tuviera un
valor : o 1&, por e,emplo4.
.l igual que en la versin con if, el caso del mes de febrero es ms comple,o que los
dems, por los distintos valores que puede tomar dependiendo del ao al que
corresponda.
6ras compilar el programa y depurarlo de posibles errores lo e,ecutamos con una tabla
de valores de prueba.
Programaci.n /undamentos de programaci.n ! 0ava P'gina 11
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
Programaci.n /undamentos de programaci.n ! 0ava P'gina 12
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
1. $rea una clase de nombre &illetesEuro con un 2nico m0todo, que permita imprimir
el mnimo n2mero de billetes para cubrir una cantidad mayor a : que se introduce en la
lnea de llamada del programa. ?o %an de mostrarse lneas con : billetes o monedas.
6esultado de la e&ecuci.n del programa para un valor de entrada de 8314 <
#. $rea una clase de nombre 'oras(inutosSegundos con un 2nico m0todo, que
permita imprimir las %oras, minutos y segundos que corresponden a un tiempo
e8presado en segundos que se introduce en la lnea de llamada del programa. ?o %an de
mostrarse lneas que contengan : unidades, aunque si el dato de entrada es :, el
resultado de salida ser : segundos.
6esultados de la e&ecuci.n del programa para los valores :214 ! 0
Programaci.n /undamentos de programaci.n ! 0ava P'gina 13
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
6raba,ando con arra!s o matrices
*l problema de la validacin de fec%a que venimos tratando %a pasado por varias fases y
me,oras. 'emos, a continuacin, una nueva forma, basada en los arra!s, que supone
una me,ora considerable.
Diagrama de %lu&o de validaci.n de %ec-a mediante arra!
*ste diagrama de flu,o resuelve, por una parte, el problema de validacin de una fec%a
y, adems, cuando es vlida la imprime en su forma larga, es decir, con el nombre del
mes.
7a primera parte del diagrama de flu,o nos resulta ya conocida. 7o novedoso comien+a con-
Programaci.n /undamentos de programaci.n ! 0ava P'gina 14
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
/e define aqu un arra! de 1# elementos, donde cada uno va a contener el n2mero de
das del mes correspondiente. *l primer elemento corresponde a los das de @eneroA, el
segundo a los de @febreroA y as sucesivamente.
3+ ,= 3+ 3* 3+ 3* 3+ 3+ 3* 3+ 3* 3+
dMe
s
[0] [1] [] [!] ["] [#] [$] [%] [&] ['] [10
]
[11
]
<na ve+ validado el mes, basta con mirar en el elemento correspondiente de d=es para
ver el n2mero de das del mes.
*n forma seme,ante se act2a con el nombre del mes- se crea otro arra!,
sealado en este caso por n=es, tambi0n de 1# elementos, donde cada celda contiene,
en su orden, el nombre de uno de los meses del ao.
>enero? >ebrero? @ @ >noviembre? >diciembre?
nMes [0] [1] [10] [11]
*ditamos el programa en una clase de nombre ValidarFecha)rra& que contendr
un m0todo 2nico.
C.digo para el diagrama de %lu&o de validaci.n de %ec-a mediante arra!
Programaci.n /undamentos de programaci.n ! 0ava P'gina 15
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
6ras compilar el programa y depurar los posibles errores lo e,ecutamos con la tabla de
valores de prueba.
Declaracin de arrays
<n array en Java se puede declarar de varias formas-
1. *n dos sentencias, indicando en la primera el tipo de datos que va a contener el array
y el nombre de referencia del mismo, y estableciendo en la segunda sentencia el tamao
o n2mero de celdas del array 3int[] a; y int a[]; son equivalentes4
int*+ a"
a = new int*1,+"
/e crea un array referenciado por a, de tipo int y 10 elementos, desde el : %asta el ;.
#. Becogiendo en una sola sentencia lo que en la forma anterior requera dos-
float*+ b = new float*-,+"
/e crea un array referenciado por b, de tipo %loat y 20 elementos, desde el : %asta el 1;.
&. *s posible que el tamao del array en el momento de la definicin no sea conocido
en tiempo de compilacin, sino que se establece en tiempo de e,ecucin-
int tama.o = (int) (ath.random()/1,,)"
do$ble c*+ = new do$ble*tama.o+"
/e crea un array referenciado por c, de tipo double cuyo tamao es un n2mero
aleatorio entre : y ;; que se obtiene por el m0todo random de la clase =at-.
(. *s posible iniciali+ar un array en el momento de la creacin, como la reali+ada en el
programa para d=es y n=es.
int des*+ = {310-103103,03103,03103103,03103,0312"
/e crea un array referenciado por d=es, de tipo intC el tamao del array lo indica
el n2mero de elementos recogidos entre las llaves D y E.
6amao del array
*l tamao de un array se establece en el momento de su definicin y no se puede
modificar posteriormente. *s posible conocer el n2mero de elementos de un array
utili+ando la propiedad lengt-.
%&stem.o$t.'rintln(des.len3th)" //)mprimirA +,
Diferencias entre variables y arrays
7os arrays se mane,an utili+ando referencias, por lo que si se asigna un array a otro, no
se copian los valores de uno en otro, sino que las dos referencias apuntan al mismo
array. 'emos las diferencias entre las variables y los arrays-
7as variables-
int e = 11"
int f = -4"
f = e"
6ras e,ecutar estas sentencias, e8isten dos variables, e y %, de tipo int, y cada una
de ellas contiene el valor 1F.
7os arrays-
int 3*+ = {10-032"
Programaci.n /undamentos de programaci.n ! 0ava P'gina 19
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
int h*+ = {405062"
h = 3"
6ras e,ecutar estas sentencias, e8iste un solo array, (1))!*, que viene
referenciado tanto por g como por -. *l array (")#)$*, al que anteriormente
apuntaba -, se pierde.
.rrays multidimensionales
Gasta el momento %emos traba,ado con arrays de una dimensin o listasC pero pueden
tener el n2mero de dimensiones que deseemos.
.rrays bidimensionales
1ara definir un array o matri+ bidimensional o tabla utili+amos la siguiente
sinta8is-
int*+*+ tabla"
tabla = new int*-+*3+"
con lo que se declara un array de # filas y & columnas, o lo que es equivalente,
un array de # elementos donde cada uno de ellos es un array de & elementos de
tipo int. *l acceso a cada uno de los elementos del array es similar al acceso en
una dimensin- %&stem.o$t.'rintln(tabla*,+*,+)"
[0]
[1]
tabla [0] [1] []
.rrays de ms de # dimensiones
1ara definir arrays o matrices de ms de # dimensiones utili+amos la siguiente
sinta8is-
do$ble*+*+*+ datos"
datos = new do$ble*5+*3+*-+"
/e crea un array referenciado por datos, de tipo double, de ) filas, & columnas y
# unidades de profundidad. *l aspecto que este array tiene para nosotros es el
siguiente-
.l construir un array multidimensional solamente es obligatorio declarar el tamao de la
primera dimensin, que es lo que permite crear nuestro array en la memoria principal
del ordenadorC despu0s, se puede reservar memoria para cada uno de los componentes
de forma independiente.
int*+*+ escalera = new int*5+*+" // 9 ilas
escalera*,+ = new int*1+"
Programaci.n /undamentos de programaci.n ! 0ava P'gina 1:
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
escalera*1+ = new int*-+"
escalera*-+ = new int*3+"
escalera*3+ = new int*4+"
escalera*4+ = new int*5+"
7a estructura creada de esta manera tiene el siguiente aspecto-
[0]
[1]
[]
[!]
["]
escalera [0] [1] [] [!] ["]
*s posible iniciali+ar un array multidimensional en el momento de la declaracinC as,
por e,emplo, si deseramos colocar los primeros n2meros naturales en el array
escalera, podramos %acerlo del siguiente modo-
int*+*+ escalera = {{120{-0320{4050620{7010801,20{1101-01301401522"
.unque para nosotros es conveniente @verA el aspecto fsico que presenta un array, en
realidad en la memoria del ordenador se almacena de otra manera, colocando un
elemento a continuacin del otro, siendo el sistema gestor de arrays el responsable de
actuar adecuadamente seleccionando los elementos de acuerdo a los ndices que le
vamos enviando.
Programaci.n /undamentos de programaci.n ! 0ava P'gina 18
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
*,ercicios
1. $rea una clase de nombre &illetesEuro)rray con un 2nico m0todo, y utili+ando
arra!s, que permita imprimir el mnimo n2mero de billetes para cubrir una cantidad
mayor a : que se introduce en la lnea de llamada del programa. ?o %an de mostrarse
lneas con : billetes o monedas.
6esultado de la e&ecuci.n del programa para un valor de entrada de 5923 <
#. *n tu traba,o como programador en una empresa de ,uegos on-line tu ,efe, que est
pensando en lan+ar un nuevo ,uego basado en lan+amiento de dados, te pide que
prepares un programa que compruebe la @bondadA del generador de n2meros aleatorios
de Java. 1ara ello-
Define una clase de nombre 9ados con un 2nico m0todo.
*l generador de n2meros aleatorios de Java %a de simular un lan+amiento de
dados %asta que un resultado se repita H veces consecutivas, debiendo mostrarse el
resultado de la tirada en pantalla 3en la imagen, la tirada finali+a cuando se obtienen seis
I)J consecutivos4.
.l finali+ar la tirada %an de mostrarse-
*l n2mero total de dados lan+ados.
*l n2mero de veces que sale cada dado, y el porcenta,e que supone sobre el
total de los lan+amientos.
Programaci.n /undamentos de programaci.n ! 0ava P'gina 17
Instituto Plaiaundi Desarrollo de aplicaciones web Curso 2011-12
&. /iguiendo con tu traba,o de programador de ,uegos on-line tu ,efe te pide en esta
ocasin que simules un lan+amiento de dados seme,ante a la anterior pero @cargandoA el
H de manera que su probabilidad de salir sea apro8imadamente el doble que la de los
dems.
1ara ello-
Define una clase de nombre 9ado:ar3ado con un 2nico m0todo.
*l generador de n2meros aleatorios de Java %a de simular un lan+amiento de
#::: dados.
.l finali+ar el lan+amiento %an de mostrarse-
*l n2mero total de dados lan+ados.
*l n2mero de veces que sale cada dado, y el porcenta,e que supone sobre el
total de los lan+amientos.
Programaci.n /undamentos de programaci.n ! 0ava P'gina 20

You might also like