Ruth Carballo Página 1 14/11/2015 EL LENGUAJE JAVA El lenguaje Java fue creado por la empresa Sun Microsystems y en un corto período de tiempo se convirtió en uno de los lenguajes de programación líderes. Principales propiedades del lenguaje Java: Lenguaje diseñado para Internet, permite crear programas (applets) que se integran en las páginas Web. Puede ser usado como un lenguaje de programación tradicional para crear lo que se conoce como aplicaciones Es un lenguaje multiplataforma (portable) Tiene prestaciones multimedia (texto, imágenes, sonido, animaciones, etc) Resulta un lenguaje familiar al tener una estructura similar a C++ Elimina dos de los problemas más comunes con los que se encuentran los programadores en C++: el uso de punteros, la gestión de memoria, y el control de acceso a los elementos de una matriz Es un lenguaje orientado a objetos Es un lenguaje interpretado que integra el poder de los lenguajes compilados y la flexibilidad de los interpretados Se estima que es entre 10 y 20 veces más lento que C++ Admite programación concurrente Es simple, robusto y seguro Es un lenguaje accesible: a través de Internet puede obtenerse de forma gratuita el Kit de Desarrollo Java (JDK) de la empresa Sun Microsystems A través de Internet se puede acceder también a: Cursos interactivos, multitud de ejemplos, herramientas para el desarrollo de applets, etc. Ruth Carballo Página 2 14/11/2015 Bibliografía: Java 2. Manual de Programación. L. Joyanes Aguilar, M. Fernández Azuela. Mc Graw-Hill 2001. ISBN 84-481-3193-2 Manual Avanzado de Java. F. Lima Díaz. Anaya Multimedia. 1998. ISBN 84-415-0517-9 Ruth Carballo Página 3 14/11/2015 Lección 1: Instalación del SetUp Developer Kit de Java Ficheros de interés: j2sdk-1_3_1-win.exe j2sdk-1_3_1_doc.zip el programa la documentación (o ayuda) Pulsando dos veces sobre el icono j2sdk-1_3_1-win se comienza la instalación. Automáticamente se creará un directorio C:\ jdk1.3.1 con los subdirectorios \bin \lib \demo etc Al directorio C:\jdk1.3.1 es a lo que se le llama Java Home El programa queda instalado en C:\jdk1.3.1 y las instrucciones javac (compilación) y java (ejecución) funcionarán únicamente en C:\jdk1.3.1\bin En línea de comandos se podrá comprobar si el programa está bien instalado en la forma siguiente: Ejecutando >javac en C: obtendremos como respuesta que el comando es desconocido. Pero ejecutando >javac en C:\jdk1.3.1\bin obtendremos como respuesta Usage: javac <options> <source files> etc . Los mensajes exactos dependen de si se usa Windows 98 o 2000. La ventana de línea de comandos es la ventana de MS-DOS. En Windows 2000 se accede a ella en la forma PROGRAMAS->ACCESORIOS->SIMBOLO DEL SISTEMA Hasta ahora los comandos javac y java sólo funcionan en la dirección C:\jdk1.3.1\bin Si queremos que funcionen desde cualquier dirección , la dirección C:\jdk1.3.1\bin debe estar incluida en el parámetro PATH. “Path” se traduce al castellano como “camino” o “senda”. Cuando WINDOWS tiene que realizar una aplicación busca el programa en las direcciones dadas en PATH. Ampliación del PATH para una sesión en MS-DOS C:>PATH (me enseña lo que hay en el path) C:>set PATH=”%PATH%;C:\jdk1.3.1\bin” (añade al PATH anterior el directorio C:\jdk1.3.1\bin en Windows2000 sin comillas) C:>PATH (confirmamos que C:\jdk1.3.1\bin está en el PATH) Ruth Carballo Página 4 14/11/2015 C:> javac (confirmamos que se produce la respuesta Usage: javac <options> >source files> etc) Si salimos de la sesión MS-DOS (con exit) y abrimos una nueva, veremos que lo que habíamos añadido ha desaparecido, el PATH vuelve a ser el inicial. Ampliación permanente del PATH (Windows98) Para que la ampliación del PATH sea permanente la dirección a añadir debe escribirse en el fichero de Windows Autoexec.bat - accedemos al fichero con INICIO->EJECUTAR->SYSEDIT - nos aparecerá delante de todo la ventana Autoexec.bat - en la instrucción PATH=... añadimos la dirección que nos interesa - escribimos la instrucción > set classpath = . (Al escribir > javac filename.java se creará filename.class, que es el fichero pseudocompilado. En el paso de ejecución: >java filename se hace la llamada a filename.class. La instrucción set classpath=. hace que el filename.class se busque en el directorio dónde ejecutamos java.) - reiniciamos el ordenador Ahora abriendo una ventana en MS_DOS, en cualquier momento, veremos que javac funciona desde todas las direcciones. Instalación de la ayuda de Java Se abre j2sdk-1_3_1-doc.zip con Winzip, y se extrae en el directorio jdk1.3.1 Automáticamente aparecerá en jdk1.3.1 el subdirectorio /docs con la documentación y un índice (fichero index.html) Ruth Carballo Página 5 14/11/2015 Lección 2: Instalación JCreator JCreator es un editor de Java desde el cual podemos, además de editar el filename.java, tener un acceso cómodo a la ayuda y realizar la compilación y ejecución del programa. Carpetas de interés: JcreatorLE2.0 JcreatorPro2.0 Little Editor Professional Es simple y licencia gratuita Es más potente y tiene licencia gratuita para 30 días Abre la carpeta JcreatorPro2.0 . Pulsando dos veces sobre Setup.exe se instala el editor. A continuación se ejecuta el editor automáticamente, apareciendo dos preguntas para saber cual es el Java Home y donde está la documentación. Una vez introducida esta información podremos utilizar el editor JCreator desde cualquier carpeta, que nos permitirá escribir el programa java, compilarlo y ejecutarlo. Si en la instalación no nos ha aparecido información sobre el Java Home o el directorio de la documentación, habrá que que darle estos datos “manualmente” a JCreator. Al finalizar la instalación nos aparece un icono JcreatorPro en el escritorio. Pulsando dos veces sobre él y se abrirá el editor. Seleccionamos CONFIGURE->OPTIONS>jdkprofiles - Si ahí aparece “ JDK version 1.3.1” es que está bien - Si no aparece seleccionamos NEW y en el Select path que me ofrece escojo el directorio C:\jdk1.3.1 En NEW tenemos dos pestañas, una para Classpath y otra de Documentacion. En la de documentación hay que añadir C:\jdk1.3.1\docs Una vez metida esta información siempre que ejecute JCreator funcionará. No habrá que dársela cada vez. Ruth Carballo Página 6 14/11/2015 Lección 3: Primera aplicación 1. Edición, compilación y ejecución de un programa Java 1. Crear el fichero fuente filename.java. El fichero fuente contiene texto, escrito en Java, que tu y otros programadores podéis entender. Se puede utilizar cualquier editor de texto para crear y editar los ficheros fuente. Por ejemplo en Windows se puede utilizar Notepad.exe (Bloc de Notas). 2. Compilar el fichero fuente en un fichero bytecode. El compilador toma el fichero fuente y convierte el texto en instrucciones que la Máquina Virtual Java (Java VM) puede entender. > javac filename.java Si el programa no tiene errores, volveremos a obtener el prompt. El fichero bytecode aparece en el directorio como filename.class 3. Ejecutar el programa contenido en el fichero bytecode. El intérprete Java instalado en tu ordenador lee las instrucciones en bytecode y las traduce de forma que el ordendador las entienda y pueda ejecutarlas (código binario). > java filename 2. Las clases en Java El lenguaje Java se construye en bloques que son clases. Las clases tienen a su vez variables ( también llamados campos o componentes) y métodos, recordando a las clases de objetos reales. Por ejemplo en una cámara de fotos podríamos considerar como variables de estado: variable encendido variable encendido del flash variable de cargada o descargada variable de número de foto variable de niebla, etc que puede tener el valor on o off que puede ser on o off on o off de 1 a 36 y como métodos: encender (la variable de encendido pasa de off a on) apagar (la variable de encendido pasa de off a on) disparar (sólo funciona si la variable encencido está en on, la variable número de foto se incrementa en uno) rebobinar , etc Ruth Carballo Página 7 14/11/2015 El software de Java se escribe a base de la creación de clases, con sus variables y métodos. Los objetos en Java no son más que ejemplos (también llamados instancias o ejemplares) de las clases. Existen clases de las que no se pueden crear objetos, como por ejemplo la clase System que veremos más adelante. Toda aplicación Java tiene que tener al menos una clase con un tipo de método denominado método main. Todas las “acciones” que se realizan en una aplicación se escriben en el método main. Un ejemplo de acción, una vez construida la clase CamaraFotografica, con sus variables y sus métodos, sería la de “construir” una cámara concreta y en un estado concreto (por ejemplo, apagada y en número foto 4), encenderla, disparar tres veces y apagarla. Se llaman constructores de una clase a los métodos que permiten definir (instanciar) un objeto concreto de una clase. La sintaxis de los constructores suele ser así: Clase miclase = new Clase() Cada clase se crea con sus constructores, que pueden ser más de uno. En el paréntesis se incluyen los argumentos que usa el constructor, separados por comas. Pueden existir constructores que no usen ningún argumento. En Java tendremos clases ya construidas y clases que construiremos nosotros. 3. Ejemplo 1: Estructura de un programa aplicación en Java class HolaMundo{ public static void main(String[] args){ System.out.println(“Hola”);} } En este ejemplo vemos la plantilla de una clase con método main. Lo que podría variar se ha escrito en cursiva. Visto de otra forma, la plantilla de una clase que incluya método main es: class *****{ public static void main(String[] *****){ instrucción1; instruccion2; } } - El filename.java deberá ser HolaMundo.java, pués la clase que lleva el método main debe coincidir con el nombre del filename.java Los nombres de las clases siempre se empiezan por mayúsculas (en azul débil en JCreator) String[] args son los argumentos de entrada. String[] args define (o declara o instancia) args como un objeto que es un array (lista) de cadenas de caracteres. El objeto es cadena de caracteres por la clase String y es array por el símbolo []. Args[0] es el primer elemento de la lista, args[1] el segundo, y así sucesivamente. args es un objeto que se lee (o no se lee) en línea de comandos . Ruth Carballo - Página 8 14/11/2015 System.out.println() es una forma típica de escribir una línea de salida por pantalla. Entre paréntesis escribimos lo que queremos que se vea por pantalla. System.out es el flujo de salida estándar. System es el nombre de una clase, out el de una variable o componente de la clase, que es la salida, y println() es un método que actúa sobre el componente de la clase. Los métodos son llamados en general con la sintaxis: nombreObjeto.método, nombreObjeto.nombreComponente.método, nombreClase.método o nombreClase.nombreComponente.método, según actúen sobre el propio objeto, sobre alguna de sus componentes o sobre la clase o alguna de sus componentes. Ejecutando: javac HolaMundo.java java HolaMundo Hola veremos que por pantalla se escribe 4. Datos en la línea de comandos class HolaPersona{ public static void main(String[] args){ System.out.println(“Hola ” + args[0]);} } javac HolaMundo.java java HolaMundo Pedro veremos que por pantalla escribe Hola Pedro Si ejecutamos > Java HolaMundo el programa dará error en ejecución, puesto que la aplicación tiene que escribir por pantalla args[0] y no le hemos dado ningún argumento de entrada. Si ejecutamos > Java HolaMundo Pedro Fernandez dará como salida por pantalla Hola Pedro Aunque ha recibido dos argumentos de entrada, sólo tiene que escribir por pantalla el primero. 5. ¿Como dar (no dar) la opción de incluir argumentos de línea de comando en JCreato? Configure Options JDK Tools Run Application Seleccionar Default Ruth Carballo Página 9 14/11/2015 Edit Parameters Activar (desactivar) la casilla de verificación “Prompt for main function arguments” 6. Incluir comentarios en el programa // una línea /* varias lineas */ 7. Ejemplo de construcción de objetos: objetos de la clase String class Hola1{ public static void main(String[] args){ // construye una cadena vacía String str=new String(); /* asigna contenido a la cadena. El contenido de una cadena siempre debe estar entre comillas dobles*/ str="Hola"; System.out.println(str);} } class Hola2{ public static void main(String[] args){ // construye una cadena y le asigna contenido String str=new String(“Hola”); System.out.println(str);} } class Hola3{ public static void main(String[] args){ /* String es una clase muy utilizada, por lo que el lenguaje Java permite instanciarla sin utilizar new ni constructor String(....) */ String str=”Hola”; System.out.println(str);} } Ruth Carballo Lección 4. básicas. Página 10 14/11/2015 Variables numéricas. Operaciones aritméticas Variables de tipo numérico entero int real float, double El compilador asigna espacio de memoria para almacenar cada variable con arreglo a su tipo. Todas las variables deben ser declaradas. No podemos escribir hacerlo como: float c=2; float c; c=2 (declaración y asignación) c=2; debemos o (declaración) (asignación) Siempre que sea posible, es conveniente declarar una variable y asignarle su valor inicial en un solo paso, ya que esta acción facilita la interpretación del programa. Las operaciones entre números de dos tipos producen como resultados números del tipo superior (el orden entre los anteriores es int < float < double). Así int a=2; int b=3; float c; c=a/b; c es cociente de dos enteros y será por tanto un entero. 2/3 valdrá 0. Aunque c esté declarada y almacenada cómo float el valor que le asigno es entero, porque a/b será entero. En este caso se está haciendo internamente una conversión automática de tipos, puesto que el entero 2/3=0 pasa a float como 0.0000000. Al pasar una variable numérica de un nivel inferior a superior nunca perdemos información, ni la ganamos, sólo añadimos ceros. Se puede realizar una conversión de tipos explícita mediante el operador “cast” o molde, cambiando la categoría de un tipo de nivel inferior a superior. Si hacemos c= (float)a / b; c es el cociente entre el float a y el entero b, y el resultado será float. c valdrá 0.6666667 Los números decimales se escriben como +-**.*** . Estos números son considerados por Java como de tipo double, y deben declararse como double. Si queremos que un número decimal se considere como float, debemos escribirlo como +-**.****f Ruth Carballo Página 11 14/11/2015 Haciendo float a1=2.4; obtendremos error en la compilación, porque al número 2.40000000000000 se le estaría haciendo pasar a 2.400000 También daría error de compilación esta serie de instrucciones: double a1=2.4; double a2=1.6; float a3; a3=a1/a2; porque a1/a2 va a tener la precisión de double, y al convertirlo a float voy a perder la precisión que tenía. A continuación vemos un ejemplo de programa con las operaciones aritméticas básicas de suma, resta, multiplicación y división. public class Operaciones{ public static void main(String[] args){ int a=2; int b=3; int c1,c2,c3; float c4; double c5; c1=a+b; c2=a-b; c3=a*b; c4=((float)a)/b; c5=((double)a)/b; System.out.println("la suma es " + c1); System.out.println("la resta es " + c2); System.out.println("el producto es " + c3); System.out.println("el cociente es " + c4); System.out.println("el cociente es " + c5); } } Ruth Carballo Página 12 14/11/2015 Lección 5. La clase Number Java permite utilizar los tipos simples int, float, double por razones de rendimiento, pero Java tiene la clase Number y subclases de ésta como Integer, Float y Double, que son las clases de respectivamente números enteros, números reales con precisión sencilla, y números reales con doble precisión. Veremos un programa donde los números son tratados como objetos de una clase. Recordemos como las “strings” o cadenas de caracteres sólo existen en Java como objetos, y no como variables de tipo simple. Sin embargo, vimos también que la declaración y asignación puede realizarse similarmente a la que se realiza para las variables de tipo simple, sin necesidad de utilizar el operador new y el constructor . Esto es así por la misma razón de rendimiento: la clase String es muy utilizada y define un tipo de datos. Para construir objetos de las clases Integer, Float, Double, etc, subclases de Number lo debemos hacer con el operador new y sus constructores. class ClaseNumero{ public static void main(String[] args){ Integer i = new Integer(2); Integer j = new Integer("33"); Double d1 = new Double(2.16); Double d2 = new Double("-2.4316"); System.out.println(i + " "+ j ); System.out.println(d1 + " " + d2); } } La clase Integer proporciona un método muy utilizado para convertir una cadena en un número, que es el método parseInt. Puede actuar sobre un objeto de la clase Integer o directamente sobre la clase. Podemos escribir el método con uno o dos argumentos, el primero es una cadena de caracteres y el segundo un entero. parseInt( cadena de caracteres, entero) o parseInt(cadena de caracteres) int k1 = Integer.parseInt("101"); int k2 = Integer.parseInt("101",2); System.out.println(k1 + " " + k2); k1 vale 101 y k2 vale 5, que es el valor de 101 en base 2 Otro método es el de devolverme el valor del número: Integer i = new Integer(2); int k1 = i.intValue(); double k2 = i.doubleValue(); Ruth Carballo k1 vale 2 Página 13 y k2 vale 2. Double x = new Double(2.15); double y1= x.doubleValue(); int y2 =x.intValue(); y1 vale 2.15 e y2 vale 2 14/11/2015 Ruth Carballo Página 14 14/11/2015 Lección 6: El programa pide datos por pantalla import java.io.*; public class OperacionesTeclado{ public static void main(String[] args) throws IOException{ int a=0,b=0; double c; BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in)); System.out.print("a=?:"); a=Integer.parseInt(teclado.readLine()); System.out.print("b=?:"); b=Integer.parseInt(teclado.readLine()); c=(double)a/b; System.out.println("el cociente es " + c); } } - InputStreamReader es una clase que se encarga de convertir bytes en caracteres (“Input Stream Reader” significa “Lector del flujo de entrada”). InputStreamReader(System.in) se encarga de convertir en caracteres los bytes leídos desde el teclado, ya que System.in es el teclado. - BufferedReader es una clase que produce un “texto” o “palabra” o “cadena de caracteres” (String) a partir de la secuencia de caracteres. A mi lector de datos de entrada, que los convierte en texto, lo llamo “teclado”, y es un objeto definido así: BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in)); Siempre que tenga que meter datos utilizando el teclado tendré que incluir la instrucción anterior. Puedo variar el nombre “teclado”, pero lo demás es fijo. - Integer.parseInt(teclado.readLine()); convierte el “texto” leído por teclado hasta un retorno de carro, en un número entero. - import java.io.*; Para leer datos tenemos que importar todas las clases del paquete io (input-output) . Si no incluimos esta sentencia tendremos un error en compilación. - throws IOException Al leer datos por teclado estamos obligados a considerar el posible error por no disponibilidad del teclado. En efecto, si el teclado no está disponible la operación de entrada readLine daría error. El manejo del error que se suele implementar en el código consiste en enviar un mensaje por pantalla si el teclado no está disponible. Ruth Carballo Página 15 14/11/2015 Por ahora no hemos estudiado el manejo de errores o Exceptions. Si no queremos tratar el posible error debemos incluir el operador throws IOException en el método main. Se puede comprobar que quitando ese operador del código el programa produce error en compilación, avisándonos de la IOException. Ruth Carballo Página 16 14/11/2015 Lección 7: La clase Math La clase java.lang.Math proporciona una serie de constantes y funciones de uso muy común en expresiones aritméticas. En la tabla damos algunos ejemplos. Math.E Math.Pi Math.abs() Math.acos() Math.asin() Math.atan() Math.cos() Math.sin() Math.tan() Math.exp() Math.log() Math.pow(a,b) Math.toDegrees Math.toRadians el número E el valor de Pi valor absoluto arcocoseno de un ángulo en radianes arcoseno arcotangente coseno seno tangente e elevado al número logaritmo neperiano de un número a elevado a b convierte un ángulo de radianes a grados convierte un ángulo de grados a radianes class Clasemath{ public static void main(String[] args){ double a=100; double b=2; double c=Math.PI/2; double d=Math.PI/4; double e=Math.toDegrees(d); double raiz=Math.sqrt(a); double log=Math.log(a); double log10=Math.log(a)/Math.log(10); double exp=Math.exp(a); double elevar=Math.pow(a,b); double coseno1=Math.cos(c); double coseno2=Math.cos(d); System.out.println(raiz); System.out.println(log); System.out.println(log10); System.out.println(exp); System.out.println(elevar); System.out.println(coseno1); System.out.println(coseno2); System.out.println(e); } } Ruth Carballo Página 17 14/11/2015 Lección 8: Operadores relacionales 1. Operadores relacionales En programación son importantísimas no sólo las variables numéricas sino también las variables lógicas. En cuanto a variables numéricas hemos estudiado las de tipos int, float y double. Por ejemplo int a=2; valor 2. declara a como variable de tipo entero y le asigna el Los operadores relacionales o de comparación permiten comparar valores para determinar su igualdad, desigualdad u ordenación, y el resultado de las expresiones en las que intervienen es de tipo lógico. Las expresiones lógicas sólo pueden tomar dos valores: true o false == != > < >= <= igual Distinto Mayor que Menor que Mayor o igual Menor o igual 1==2 1!=2 1>1 1<2 2>=0.2 2<=0.2 False True False True True False La comparación de cadenas en Java mediante el operador “= =” no funciona en todos los casos, por tanto para evitar la posibilidad de error se ha de utilizar el método equals(). class Compara{ public static void main(String[] args){ double a=3; double b=4; System.out.println(a>b);} } Por pantalla veremos false Ruth Carballo Página 18 14/11/2015 2. Operadores lógicos Los operadores lógicos o booleanos actúan sobre operandos de tipo lógico para devolver un resultado también de tipo lógico. Los dos más inportantes son el operador “y” y el operador “o” & y True & true = true True & false = false Flase & true = false False & false = false | o True | true = true True | false = true False | true = true False | false = false class Compara{ public static void main(String[] args){ double a=3; double b=4; double c=5; System.out.println(a<b & b<c ); System.out.println(a<b & c<b ); System.out.println(a==4.2 | b==4.2 | c==4.2 ); System.out.println(a==4 | b==4 | c==4 ); } } import java.io.*; class CarnetJoven{ public static void main(String[] args) throws IOException{ BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in)); System.out.print("nacimiento=?:"); int nacimiento=Integer.parseInt(teclado.readLine()); int n1=1978; int n2=1988; System.out.print(nacimiento>n1 & nacimiento<n2); } } 3. Las sentencias if e if-else En todos los lenguajes de programación existen construcciones que permiten tomar decisiones basadas en una condición. Para efectuar esta tarea Java dispone de las sentencias if e if-else Sintaxis de if para una sentencia o un bloque de sentencias Ruth Carballo Página 19 14/11/2015 if (condición) sentencia; if (condición) { sentencia1; sentencia2;.....} if (nacimiento>n1 & nacimiento<n2) System.out.println("carnet joven"); System.out.println("fin del programa"); if (nacimiento>n1 & nacimiento<n2) {System.out.println("carnet joven"); System.out.println("enhorabuena");} System.out.println("fin del programa"); Sintaxis de if-else para una sentencia o un bloque de sentencias if (condición) {sentencia1; sentencia2;} else { sentencia3; sentencia4;.....} if (nacimiento>n1 & nacimiento<n2) {System.out.println("autorizado");} else {System.out.println("no autorizado");} 4. Ejercicios Escribir una aplicación que tome como datos un par de puntos P(x,y) y que determine el ángulo en grados que forma el vector OP con la parte positiva del eje x. Escribir una aplicación que lea por pantalla un nombre y escriba por pantalla “Hola” sólo si el nombre es Pedro y “Hello” sólo si el nombre es Peter. Ruth Carballo Página 20 14/11/2015 Soluciones: import java.io.*; public class angulos{ public static void main(String[] args) throws IOException{ BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in)); double a = Double.parseDouble(teclado.readLine()); double b = Double.parseDouble(teclado.readLine()); double d; double rad=Math.atan(b/a); if (a>0 && b>0) System.out.println(a + " " + b + " " + Math.toDegrees(rad)); if (a<0 && b>0) {d = 180.+Math.toDegrees(rad); System.out.println(a + " " + b + " " + d );} if (a<0 && b<0) {d = 180.+Math.toDegrees(rad); System.out.println(a + " " + b + " " + d );} if (a>0 && b<0) {d = 360.+Math.toDegrees(rad); System.out.println(a + " " + b + " " + d );} } } import java.io.*; public class bilingue{ public static void main(String[] args) throws IOException{ BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in)); String str=teclado.readLine(); String str1="Peter"; String str2="Pedro"; if (str.equals(str1)) System.out.println("Hello"); if (str.equals(str2)) System.out.println("Hola"); } } Ruth Carballo Página 21 14/11/2015 Lección 9: Bucles 1. Operadores de incremento (decremento) y asignación ++a a++ --a a-- a=a+1 a=a+1 a=a-1 a=a-1 antes de ejecutarse la instrucción después de ejecutarse la instrucción antes de ejecutarse la instrucción después de ejecutarse la instrucción int a = 5; System.out.print( 2 + a) ; por pantalla escribe 7 System.out.println(2 + ++a); por pantalla escribe 8 antes de ejecutarse la sentencia System.out.println(a) por pantalla escribe 6 System.out.println(a++) por pantalla escribe 6 después de ejecutarse la sentencia System.out.print(a) ++a hace que a valga a+1 a++ hace que a valga a+1 por pantalla escribe 7 class Incremento{ public static void main(String[] args){ double a=5; System.out.println(2 + a ); System.out.println(2 + ++a); System.out.println(a); System.out.println(a++); System.out.println(a); } } 2. La sentencia for El bucle for está diseñado para ejecutar una secuencia de sentencias un número fijo de veces. La sintaxis de la sentencia for es: for (inicialización ; condición de terminación ; incremento) sentencias; // puede ser ninguna, una sola sentencia o un bloque delimitado por {} // y serán lo que se repita durante el proceso del bucle Inicialización: se inicializan la(s) variable(s) de control Ruth Carballo Página 22 14/11/2015 Condición de terminación: se comprueba antes de cada iteración del bucle y éste se repite mientras que la condición se evalúe como verdadera El incremento se ejecuta después de que se ejecuten las sentencias y antes de que se realice la siguiente prueba de la condición de terminación. Esta parte se utiliza para incrementar o decrementar las variables de control. En resumen, el bucle for comprueba si la condición de terminación es verdadera. Si la condición es verdadera se ejecutan las sentencias del interior del bucle, y si la condición es falsa, se saltan todas las sentencias del interior del bucle, es decir, no se ejecutan. Cuando la condición es verdadera, después de ejecutarse todas las sentencias la variable de control se incrementa. Observaciones: - Cada parte del bucle for es opcional, aunque los dos “;” deben escribirse - Es frecuente que la(s) variable(s) de control de un for sólo se necesiten en el bucle, en cuyo caso pueden declararse en la zona de inicialización. Ejemplos: class Clasefor1{ public static void main(String[] args){ for (int i=0; i<=10 ; i++) {System.out.println(i);} } } class Clasefor2{ public static void main(String[] args){ /* si queremos usar la variable i fuera del bloque for tenemos que declararla fuera del bloque for */ int i; for (i=0; i<=10 ; i++) {System.out.println(i);} System.out.println("hemos terminado, e i vale " + i); } } Ejercicios 1. Crear una aplicación que calcule la tabla del 4, desde 1 hasta 20. 2. Crear una aplicación que calcule el factorial de un número natural. 3. Crear una aplicación que calcule el área de 10 círculos de radios 1,2,3,4,5,6,7,8,9,10 Ruth Carballo Página 23 SOLUCIONES: Bloque para calcular el factorial de un número utilizando el operador while long k; long pp=1; int j=1; while (j<=k) {pp=j*pp; j=j+1;} System.out.prinln(pp); 14/11/2015 Ruth Carballo Página 24 14/11/2015 Lección 10: Secuencia de Fibonacci F(n+2) = F(n+1) + F(n) , donde F(1) = F(2) = 1 Los primeros 20 términos de esta sucesión son: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765 Mostramos un bloque de instrucciones de Java para calcular F(k) siendo k un entero positivo mayor o igual a 3. long k; long nmenos1=1; long nmenos2=1; long pp=0; int j=3; while (j<=k) {pp=nmenos1+nmenos2; nmenos2=nmenos1; nmenos1=pp; j=j+1;} System.out.println(pp); Queremos calcular F(k) El primer valor de j es 3. Desde j=3 hasta j=k, con incrementos +1, se calcula F(j). El último valor calculado es pués F(k) A continuación vamos a convertir el bloque anterior en una función. La función que denominaremos fibo( ) tendrá como argumento la variable long k, y como salida, un entero tipo long que es fibo(k)= F(k) La función se escribe en Java como un método. No es void ya que devuelve un valor. El valor que se devuelve es lo que aparece dentro del paréntesis de la última instrucción, que es return(). static long fibo(long k){ long nmenos1=1; long nmenos2=1; long pp=0; int j=3; while (j<=k) {pp=nmenos1+nmenos2; nmenos2=nmenos1; nmenos1=pp; j=j+1;}; return(pp);} El primer long es para indicar que la salida es de este tipo. La salida fibo(k) es pp Podemos fijarnos en la similitud con el único otro método que hemos visto, que es el método main. Escribíamos public static void main( String[] args) { } Ruth Carballo y ahora Página 25 14/11/2015 long fibo( long k ) { } Mientras que el argumento de entrada del primer método es un vector formado por cadenas de caracteres, en el segundo caso es un entero largo Mientras que el primer método es void (no devuelve nada) el segundo devuelve (return) un dato de tipo long. Vamos a escribir una aplicación que nos calcule y devuelva por pantalla F(k) utilizando la función o método fibo(long k) import java.io.*; class Fibonacci{ // método main public static void main(String[] args) throws IOException{ long a,fa; BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in)); System.out.print("a=?:"); a=Long.parseLong(teclado.readLine()); fa=fibo(a); System.out.println(fa);} // función para calcular la secuencia de Fibonacci static long fibo(long k){ long nmenos1=1; long nmenos2=1; long pp=0; int j=3; while (j<=k) {pp=nmenos1+nmenos2; nmenos2=nmenos1; nmenos1=pp; j=j+1;}; return(pp); } } EJERCICIOS 1. Escribe una aplicación que incluya la función de Fibonacci y que permita comprobar las siguientes relaciones: F(n+1)*F(n-1) - F(n)2 = (-1)n F(2n+1) = F(n+1)2 + F(n)2 F(2n) = F(n+1)2 - F(n-1)2 F(n+p+1) = F(n)*F(p) + F(n+1)*F(p+1) Ruth Carballo Página 26 14/11/2015 2. Escribe una aplicación que calcule el factorial de un número, introduciendo el bloque que calcula el factorial como una función. Ruth Carballo Página 27 14/11/2015 Lección 11: Vectores Se declara el tipo de datos del vector int[] datos; significa que los datos son enteros Se crea el vector, fijando su tamaño datos = new int[3] ; significa que el número de entradas es 3 Se puede declarar el tipo de datos del vector y crearlo en una sola instrucción int[] datos1 = new datos1[4]; Todas las entradas valdrán cero. Si queremos asignarles valores tendremos que hacerlo entrada por entrada datos[0]=50; datos[1]=51; datos[2]=52; Podemos en una sola instrucción declarar, crear y asignar valor. int[] impares = {9,5,1,13,3,11,7}; Para visualizar por pantalla el contenido del vector for (int i=0; i<impares.length;i++) {System.out.print(impares[i]+ " ");} Ordenación por selección de un vector int menor; for (int i=0; i<impares.length-1;i++) { menor=i; for (int j=i+1 ; j<impares.length;j++) { if (impares[j] < impares[menor]) menor=j;}; Algoritmo El vector tiene N elementos, que ordenamos con el índice i. Tomamos i=1 y buscamos el mínimo de i=1 aN Intercambiamos para llevar el mínimo a la posición i=1 y el valor de i=1 a donde estaba el mínimo Tomamos i=2, buscamos el mínimo de i=2 a N e intercambiamos para llevar el mínimo a la posición i=2 y el valor de i=2 a donde estaba el mínimo int auxi= impares[i]; impares[i]=impares[menor]; impares[menor]=auxi; //para ver como se va modificando la ordenación System.out.println(""); for (int pp=0; pp<impares.length;pp++) {System.out.print(impares[pp]+" "); } // } Repetimos el proceso hasta i=N-1 Ruth Carballo Página 28 14/11/2015